Compare commits
214 Commits
v3.15.2
...
harmony-v2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
35bae3fcd0 | ||
|
|
4614b5b46e | ||
|
|
2f93058c6e | ||
|
|
a729c43e87 | ||
|
|
66e9039350 | ||
|
|
d717bf9ce8 | ||
|
|
5dea52266b | ||
|
|
fccefbeaca | ||
|
|
1e2b0aaa04 | ||
|
|
6a54de79b5 | ||
|
|
9e2290b29c | ||
|
|
97d0fc271d | ||
|
|
7906033e82 | ||
|
|
4bf21ce5c1 | ||
|
|
44d6b47bdc | ||
|
|
129e449c8e | ||
|
|
75c3c8963f | ||
|
|
d26b7522d9 | ||
|
|
2fd86d3cb0 | ||
|
|
8f7ab602e2 | ||
|
|
1dd339f95e | ||
|
|
c7063c1f38 | ||
|
|
f4a12b34f2 | ||
|
|
5d5c7934a5 | ||
|
|
8f4b45f4f8 | ||
|
|
952e2656eb | ||
|
|
240383a314 | ||
|
|
250b782b1e | ||
|
|
3c2b3aeddb | ||
|
|
aa605495f8 | ||
|
|
33a26d456b | ||
|
|
49d9ac1c43 | ||
|
|
c8e61448cb | ||
|
|
f704e9b65c | ||
|
|
0b77d861a8 | ||
|
|
e27dab7e7c | ||
|
|
80f3ad3ce0 | ||
|
|
22f7af205d | ||
|
|
8a7a4749c7 | ||
|
|
514fc68f4f | ||
|
|
478aaab469 | ||
|
|
ab217539e9 | ||
|
|
a942dc07c4 | ||
|
|
a0eaff750d | ||
|
|
57777b6cfa | ||
|
|
8d205f7f39 | ||
|
|
bc9bfd15a2 | ||
|
|
9fc1c4b3b5 | ||
|
|
c59bf5e8d8 | ||
|
|
d2d3a6e065 | ||
|
|
7755733716 | ||
|
|
b3a987b0df | ||
|
|
88a338f29e | ||
|
|
07734b000a | ||
|
|
85c1cba760 | ||
|
|
4bd31607f6 | ||
|
|
4728bc73ad | ||
|
|
52ce9a333c | ||
|
|
abbeb266b5 | ||
|
|
b11c5151bc | ||
|
|
962b1f3d40 | ||
|
|
3ee46e91e8 | ||
|
|
ee26e7f11b | ||
|
|
937f534392 | ||
|
|
1b2c02c944 | ||
|
|
0aa526e72c | ||
|
|
c2112d5886 | ||
|
|
5f6825f9ec | ||
|
|
7e80a979a7 | ||
|
|
b7bb706150 | ||
|
|
32c2cc33bb | ||
|
|
947b8750e8 | ||
|
|
88f6ff38d1 | ||
|
|
4198095a9c | ||
|
|
13ed445607 | ||
|
|
1db50c3b16 | ||
|
|
7f6b5d662b | ||
|
|
1c15d0db45 | ||
|
|
67461666dc | ||
|
|
45d81f881b | ||
|
|
8c7d23dfb1 | ||
|
|
7fa0dbdeb9 | ||
|
|
c644c1292d | ||
|
|
d224d71b8d | ||
|
|
27d3669800 | ||
|
|
110a1ac885 | ||
|
|
3f8fc3a316 | ||
|
|
88384cf351 | ||
|
|
72a9d799b6 | ||
|
|
766fafda8b | ||
|
|
842ac27efb | ||
|
|
0af42d1831 | ||
|
|
ff7f6139ba | ||
|
|
0db7caf13b | ||
|
|
d9bc6f303c | ||
|
|
6fd9b338dd | ||
|
|
d8d4e71b9e | ||
|
|
fb2f8d1a51 | ||
|
|
54a783ba84 | ||
|
|
63c432f4fa | ||
|
|
07785d0003 | ||
|
|
6eaeb19a4a | ||
|
|
2246c79318 | ||
|
|
dda58244b6 | ||
|
|
ca04508cd1 | ||
|
|
6b03b800b3 | ||
|
|
f9cab7ad61 | ||
|
|
0a3d780327 | ||
|
|
b0555a123a | ||
|
|
fa29344781 | ||
|
|
dcfc514c38 | ||
|
|
8ad8d7b717 | ||
|
|
0357e5923f | ||
|
|
f63803e3e3 | ||
|
|
63be1f3a4d | ||
|
|
e36e07fa77 | ||
|
|
d1b4f61f93 | ||
|
|
5b893c8ec3 | ||
|
|
8571a08a93 | ||
|
|
68cc14f846 | ||
|
|
f94497d1d6 | ||
|
|
eaf3911c31 | ||
|
|
91cdb93e57 | ||
|
|
634f231b78 | ||
|
|
6702cae918 | ||
|
|
6d2f77c180 | ||
|
|
accca2445f | ||
|
|
0bc4f6edb4 | ||
|
|
ce84a706a3 | ||
|
|
86b5248837 | ||
|
|
59e1601fb8 | ||
|
|
d35a9e7839 | ||
|
|
0465bd270d | ||
|
|
6780d0906c | ||
|
|
0b303379c0 | ||
|
|
d7ec2ecc12 | ||
|
|
2827fa8699 | ||
|
|
c80ec625ec | ||
|
|
5e78f20f1c | ||
|
|
1f75232062 | ||
|
|
028ff64e9a | ||
|
|
7a8cffd631 | ||
|
|
5b553aafe2 | ||
|
|
084437bc6d | ||
|
|
1cd9a2df9a | ||
|
|
7f3dbb6df7 | ||
|
|
e4d73d8b7c | ||
|
|
8220dbbea0 | ||
|
|
59e999597e | ||
|
|
cbcb3ac44e | ||
|
|
f07ab4666f | ||
|
|
a800356ad0 | ||
|
|
e076abdbf2 | ||
|
|
425613b0d2 | ||
|
|
69da8e53e0 | ||
|
|
bb6b3a773a | ||
|
|
364d20f8fb | ||
|
|
392ac4ff31 | ||
|
|
9ffed2bea6 | ||
|
|
5f7cb6939c | ||
|
|
64e7a00399 | ||
|
|
c99eaae360 | ||
|
|
34213ea2f8 | ||
|
|
da8c428a07 | ||
|
|
0d8dea9538 | ||
|
|
2babe737e0 | ||
|
|
2cce61c564 | ||
|
|
246ec416c0 | ||
|
|
6be9c752d5 | ||
|
|
76ed083e47 | ||
|
|
b31918bbf0 | ||
|
|
b14496c742 | ||
|
|
991fa99655 | ||
|
|
3d7f73114d | ||
|
|
dde9e293df | ||
|
|
34685a6f55 | ||
|
|
9812c826e0 | ||
|
|
2fac2bbfe4 | ||
|
|
242c61be94 | ||
|
|
e1cb1a0e3c | ||
|
|
af22b9c657 | ||
|
|
adee5023c0 | ||
|
|
7ee8f3512e | ||
|
|
dc5db9b6ca | ||
|
|
079aaa0d48 | ||
|
|
d4f17f29ae | ||
|
|
e99bc914ca | ||
|
|
025d34bfa2 | ||
|
|
c44c2d6c21 | ||
|
|
824ecfb8a2 | ||
|
|
ceebc466b9 | ||
|
|
35b31bdd4e | ||
|
|
c8b82583d2 | ||
|
|
9f9179ba1a | ||
|
|
872231a0ca | ||
|
|
36420183fd | ||
|
|
a8f8aa518b | ||
|
|
4c12cccff9 | ||
|
|
dcce4e5c66 | ||
|
|
56c0b834d6 | ||
|
|
6f864402d3 | ||
|
|
8909e9e1cb | ||
|
|
e80ed38772 | ||
|
|
9863f0efa3 | ||
|
|
e8664e63ef | ||
|
|
ddd30eeaaa | ||
|
|
a68953c491 | ||
|
|
fa5c4f2d03 | ||
|
|
9d7d365c2b | ||
|
|
ad344c5be3 | ||
|
|
96b89e34a3 | ||
|
|
4644becb9b | ||
|
|
f7460166dd | ||
|
|
32f76f7ff8 |
9
.github/ISSUE_TEMPLATE.md
vendored
Normal file
9
.github/ISSUE_TEMPLATE.md
vendored
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
- Bug report or feature request? <!-- Note: sub-optimal but correct code is not a bug -->
|
||||||
|
- `uglify-js` version (`uglifyjs -V`)
|
||||||
|
- JavaScript input - ideally as small as possible.
|
||||||
|
- The `uglifyjs` CLI command executed or `minify()` options used.
|
||||||
|
- An example of JavaScript output produced and/or the error or warning.
|
||||||
|
<!--
|
||||||
|
Note: the release version of uglify-js only supports ES5. Those wishing
|
||||||
|
to minify ES6 should use the experimental harmony branch.
|
||||||
|
-->
|
||||||
51
.github/ISSUE_TEMPLATE/bug_report.md
vendored
51
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -1,51 +0,0 @@
|
|||||||
---
|
|
||||||
name: Bug report
|
|
||||||
about: Create a report to help us improve
|
|
||||||
title: ''
|
|
||||||
labels: ''
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
<!-- Note: sub-optimal but correct code is not a bug -->
|
|
||||||
|
|
||||||
**Uglify version (`uglifyjs -V`)**
|
|
||||||
|
|
||||||
**JavaScript input**
|
|
||||||
|
|
||||||
<!--
|
|
||||||
A complete parsable JS program exhibiting the issue with UglifyJS alone
|
|
||||||
- without third party tools or libraries.
|
|
||||||
|
|
||||||
Ideally the input should be as small as possible, but may be large if isolating
|
|
||||||
the problem proves to be difficult. The most important thing is that the
|
|
||||||
standalone program reliably exhibits the bug when minified. Provide a link to a
|
|
||||||
gist if necessary.
|
|
||||||
|
|
||||||
Solely providing minified output without the original uglify JS input is not
|
|
||||||
useful in determining the cause of the problem. Issues without a reproducible
|
|
||||||
test case will be closed.
|
|
||||||
-->
|
|
||||||
|
|
||||||
**The `uglifyjs` CLI command executed or `minify()` options used.**
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Command-line or API call to UglifyJS without third party tools or libraries.
|
|
||||||
|
|
||||||
For users using bundlers or transpilers, you may be able to gather the required
|
|
||||||
information through setting the `UGLIFY_BUG_REPORT` environment variable:
|
|
||||||
|
|
||||||
export UGLIFY_BUG_REPORT=1 (bash)
|
|
||||||
set UGLIFY_BUG_REPORT=1 (Command Prompt)
|
|
||||||
$Env:UGLIFY_BUG_REPORT=1 (PowerShell)
|
|
||||||
|
|
||||||
before running your usual build process. The resulting "minified" output should
|
|
||||||
contain the necessary details for this report.
|
|
||||||
-->
|
|
||||||
|
|
||||||
**JavaScript output or error produced.**
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Only minified code that produces different output (or error) from the original
|
|
||||||
upon execution would be considered a bug.
|
|
||||||
-->
|
|
||||||
58
.github/workflows/build.yml
vendored
58
.github/workflows/build.yml
vendored
@@ -1,58 +0,0 @@
|
|||||||
name: Build testing
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
push:
|
|
||||||
branches: [ master ]
|
|
||||||
jobs:
|
|
||||||
ufuzz:
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
options:
|
|
||||||
- '-mb braces'
|
|
||||||
- '--ie -c'
|
|
||||||
- '-mc'
|
|
||||||
- '-p acorn --toplevel -mco spidermonkey'
|
|
||||||
- '--toplevel -mc passes=3,pure_getters,unsafe'
|
|
||||||
script:
|
|
||||||
- acorn.sh
|
|
||||||
- bootstrap.sh
|
|
||||||
- buble.sh
|
|
||||||
- butternut.sh
|
|
||||||
- mathjs.sh
|
|
||||||
- rollup-es.sh
|
|
||||||
- rollup-ts.sh
|
|
||||||
- sucrase.sh
|
|
||||||
- web-tooling-benchmark.sh
|
|
||||||
include:
|
|
||||||
- node: '14'
|
|
||||||
script: acorn.sh
|
|
||||||
- node: '14'
|
|
||||||
script: bootstrap.sh
|
|
||||||
- node: '14'
|
|
||||||
script: buble.sh
|
|
||||||
- node: '14'
|
|
||||||
script: butternut.sh
|
|
||||||
- node: '14'
|
|
||||||
script: mathjs.sh
|
|
||||||
- node: '8'
|
|
||||||
script: rollup-es.sh
|
|
||||||
- node: '14'
|
|
||||||
script: rollup-ts.sh
|
|
||||||
- node: '14'
|
|
||||||
script: sucrase.sh
|
|
||||||
- node: '14'
|
|
||||||
script: web-tooling-benchmark.sh
|
|
||||||
name: ${{ matrix.script }} ${{ matrix.options }}
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
env:
|
|
||||||
NODE: ${{ matrix.node }}
|
|
||||||
OPTIONS: ${{ matrix.options }}
|
|
||||||
SCRIPT: ${{ matrix.script }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
- name: Perform uglify, build & test
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
. ./test/release/install.sh
|
|
||||||
./test/release/$SCRIPT $OPTIONS
|
|
||||||
28
.github/workflows/ci.yml
vendored
28
.github/workflows/ci.yml
vendored
@@ -1,28 +0,0 @@
|
|||||||
name: CI
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
push:
|
|
||||||
branches: [ master ]
|
|
||||||
jobs:
|
|
||||||
test:
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
node: [ '0.10', '0.12', '4', '6', '8', '10', '12', '14', '16', latest ]
|
|
||||||
os: [ ubuntu-latest, windows-latest ]
|
|
||||||
script: [ compress, mocha, release/benchmark, release/jetstream ]
|
|
||||||
name: ${{ matrix.node }} ${{ matrix.os }} ${{ matrix.script }}
|
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
env:
|
|
||||||
NODE: ${{ matrix.node }}
|
|
||||||
TYPE: ${{ matrix.script }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
- uses: actions/cache@v2
|
|
||||||
with:
|
|
||||||
path: tmp
|
|
||||||
key: tmp ${{ matrix.script }}
|
|
||||||
- name: Perform tests
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
. ./test/release/install.sh
|
|
||||||
node test/$TYPE
|
|
||||||
44
.github/workflows/ufuzz.yml
vendored
44
.github/workflows/ufuzz.yml
vendored
@@ -1,44 +0,0 @@
|
|||||||
name: Fuzzing
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
schedule:
|
|
||||||
- cron: '*/15 * * * *'
|
|
||||||
workflow_dispatch:
|
|
||||||
workflow_run:
|
|
||||||
branches: [ master ]
|
|
||||||
types: [ completed ]
|
|
||||||
workflows: [ 'Build testing', CI ]
|
|
||||||
env:
|
|
||||||
BASE_URL: https://api.github.com/repos/${{ github.repository }}
|
|
||||||
TOKEN: ${{ github.token }}
|
|
||||||
jobs:
|
|
||||||
ufuzz:
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- node: latest
|
|
||||||
os: macos-latest
|
|
||||||
- node: '8'
|
|
||||||
os: ubuntu-latest
|
|
||||||
- node: '8'
|
|
||||||
os: ubuntu-latest
|
|
||||||
- node: '8'
|
|
||||||
os: windows-latest
|
|
||||||
- node: '8'
|
|
||||||
os: windows-latest
|
|
||||||
name: ${{ matrix.node }} ${{ matrix.os }}
|
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
env:
|
|
||||||
NODE: ${{ matrix.node }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
- name: Perform fuzzing
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
. ./test/release/install.sh
|
|
||||||
if [[ $GITHUB_EVENT_NAME == "pull_request" ]]; then
|
|
||||||
node test/ufuzz/job 5000
|
|
||||||
else
|
|
||||||
node test/ufuzz/job $BASE_URL $TOKEN $GITHUB_RUN_NUMBER
|
|
||||||
fi
|
|
||||||
12
.travis.yml
Normal file
12
.travis.yml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
language: node_js
|
||||||
|
before_install: "npm install -g npm"
|
||||||
|
node_js:
|
||||||
|
- "0.10"
|
||||||
|
- "0.12"
|
||||||
|
- "4"
|
||||||
|
- "6"
|
||||||
|
env:
|
||||||
|
- UGLIFYJS_TEST_ALL=1
|
||||||
|
matrix:
|
||||||
|
fast_finish: true
|
||||||
|
sudo: false
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
Contributing
|
|
||||||
============
|
|
||||||
|
|
||||||
## Documentation
|
|
||||||
|
|
||||||
Every new feature and API change should be accompanied by a README additon.
|
|
||||||
|
|
||||||
## Testing
|
|
||||||
|
|
||||||
All features and bugs should have tests that verify the fix. You can run all
|
|
||||||
tests using `npm test`.
|
|
||||||
|
|
||||||
The most common type of test are tests that verify input and output of the
|
|
||||||
Uglify transforms. These tests exist in `test/compress`. New tests can be added
|
|
||||||
either to an existing file or in a new file `issue-xxx.js`.
|
|
||||||
|
|
||||||
Tests that cannot be expressed as a simple AST can be found in `test/mocha`.
|
|
||||||
|
|
||||||
## Code style
|
|
||||||
|
|
||||||
- File encoding must be `UTF-8`.
|
|
||||||
- `LF` is always used as a line ending.
|
|
||||||
- Statements end with semicolons.
|
|
||||||
- Indentation uses 4 spaces, switch `case` 2 spaces.
|
|
||||||
- Identifiers use `snake_case`.
|
|
||||||
- Strings use double quotes (`"`).
|
|
||||||
- Use a trailing comma for multiline array and object literals to minimize diffs.
|
|
||||||
- The Uglify code only uses ES5, even in the `harmony` branch.
|
|
||||||
- Line length should be at most 80 cols, except when it is easier to read a
|
|
||||||
longer line.
|
|
||||||
- If both sides of a comparison are of the same type, `==` and `!=` are used.
|
|
||||||
- Multiline conditions place `&&` and `||` first on the line.
|
|
||||||
|
|
||||||
**Example feature**
|
|
||||||
|
|
||||||
```js
|
|
||||||
OPT(AST_Debugger, function(self, compressor) {
|
|
||||||
if (compressor.option("drop_debugger"))
|
|
||||||
return make_node(AST_EmptyStatement, self);
|
|
||||||
return self;
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
**Example test case**
|
|
||||||
|
|
||||||
```js
|
|
||||||
drop_debugger: {
|
|
||||||
options = {
|
|
||||||
drop_debugger: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
debugger;
|
|
||||||
if (foo) debugger;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
if (foo);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
2
LICENSE
2
LICENSE
@@ -1,6 +1,6 @@
|
|||||||
UglifyJS is released under the BSD license:
|
UglifyJS is released under the BSD license:
|
||||||
|
|
||||||
Copyright 2012-2019 (c) Mihai Bazon <mihai.bazon@gmail.com>
|
Copyright 2012-2013 (c) Mihai Bazon <mihai.bazon@gmail.com>
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
Redistribution and use in source and binary forms, with or without
|
||||||
modification, are permitted provided that the following conditions
|
modification, are permitted provided that the following conditions
|
||||||
|
|||||||
24
appveyor.yml
Normal file
24
appveyor.yml
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
environment:
|
||||||
|
matrix:
|
||||||
|
- nodejs_version: "0.10"
|
||||||
|
- nodejs_version: "0.12"
|
||||||
|
- nodejs_version: "4.0"
|
||||||
|
- nodejs_version: "6.0"
|
||||||
|
|
||||||
|
matrix:
|
||||||
|
fast_finish: true
|
||||||
|
|
||||||
|
platform:
|
||||||
|
- x86
|
||||||
|
- x64
|
||||||
|
|
||||||
|
install:
|
||||||
|
- ps: Install-Product node $env:nodejs_version $env:platform
|
||||||
|
- npm install
|
||||||
|
|
||||||
|
test_script:
|
||||||
|
- node --version
|
||||||
|
- npm --version
|
||||||
|
- npm test
|
||||||
|
|
||||||
|
build: off
|
||||||
77
bin/extract-props.js
Executable file
77
bin/extract-props.js
Executable file
@@ -0,0 +1,77 @@
|
|||||||
|
#! /usr/bin/env node
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var U2 = require("../tools/node");
|
||||||
|
var fs = require("fs");
|
||||||
|
var yargs = require("yargs");
|
||||||
|
var ARGS = yargs
|
||||||
|
.describe("o", "Output file")
|
||||||
|
.argv;
|
||||||
|
var files = ARGS._.slice();
|
||||||
|
var output = {
|
||||||
|
vars: {},
|
||||||
|
props: {}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (ARGS.o) try {
|
||||||
|
output = JSON.parse(fs.readFileSync(ARGS.o, "utf8"));
|
||||||
|
} catch(ex) {}
|
||||||
|
|
||||||
|
files.forEach(getProps);
|
||||||
|
|
||||||
|
if (ARGS.o) {
|
||||||
|
fs.writeFileSync(ARGS.o, JSON.stringify(output, null, 2), "utf8");
|
||||||
|
} else {
|
||||||
|
console.log("%s", JSON.stringify(output, null, 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
function getProps(filename) {
|
||||||
|
var code = fs.readFileSync(filename, "utf8");
|
||||||
|
var ast = U2.parse(code);
|
||||||
|
|
||||||
|
ast.walk(new U2.TreeWalker(function(node){
|
||||||
|
if (node instanceof U2.AST_ObjectKeyVal) {
|
||||||
|
add(node.key);
|
||||||
|
}
|
||||||
|
else if (node instanceof U2.AST_ObjectProperty) {
|
||||||
|
add(node.key.name);
|
||||||
|
}
|
||||||
|
else if (node instanceof U2.AST_Dot) {
|
||||||
|
add(node.property);
|
||||||
|
}
|
||||||
|
else if (node instanceof U2.AST_Sub) {
|
||||||
|
addStrings(node.property);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
function addStrings(node) {
|
||||||
|
var out = {};
|
||||||
|
try {
|
||||||
|
(function walk(node){
|
||||||
|
node.walk(new U2.TreeWalker(function(node){
|
||||||
|
if (node instanceof U2.AST_Seq) {
|
||||||
|
walk(node.cdr);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (node instanceof U2.AST_String) {
|
||||||
|
add(node.value);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (node instanceof U2.AST_Conditional) {
|
||||||
|
walk(node.consequent);
|
||||||
|
walk(node.alternative);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
throw out;
|
||||||
|
}));
|
||||||
|
})(node);
|
||||||
|
} catch(ex) {
|
||||||
|
if (ex !== out) throw ex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function add(name) {
|
||||||
|
output.props[name] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
1118
bin/uglifyjs
1118
bin/uglifyjs
File diff suppressed because it is too large
Load Diff
2260
lib/ast.js
2260
lib/ast.js
File diff suppressed because it is too large
Load Diff
14880
lib/compress.js
14880
lib/compress.js
File diff suppressed because it is too large
Load Diff
275
lib/minify.js
275
lib/minify.js
@@ -1,275 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
|
|
||||||
var to_ascii, to_base64;
|
|
||||||
if (typeof Buffer == "undefined") {
|
|
||||||
to_ascii = atob;
|
|
||||||
to_base64 = btoa;
|
|
||||||
} else if (typeof Buffer.alloc == "undefined") {
|
|
||||||
to_ascii = function(b64) {
|
|
||||||
return new Buffer(b64, "base64").toString();
|
|
||||||
};
|
|
||||||
to_base64 = function(str) {
|
|
||||||
return new Buffer(str).toString("base64");
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
to_ascii = function(b64) {
|
|
||||||
return Buffer.from(b64, "base64").toString();
|
|
||||||
};
|
|
||||||
to_base64 = function(str) {
|
|
||||||
return Buffer.from(str).toString("base64");
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function read_source_map(name, toplevel) {
|
|
||||||
var comments = toplevel.end.comments_after;
|
|
||||||
for (var i = comments.length; --i >= 0;) {
|
|
||||||
var comment = comments[i];
|
|
||||||
if (comment.type != "comment1") break;
|
|
||||||
var match = /^# ([^\s=]+)=(\S+)\s*$/.exec(comment.value);
|
|
||||||
if (!match) break;
|
|
||||||
if (match[1] == "sourceMappingURL") {
|
|
||||||
match = /^data:application\/json(;.*?)?;base64,([^,]+)$/.exec(match[2]);
|
|
||||||
if (!match) break;
|
|
||||||
return to_ascii(match[2]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
AST_Node.warn("inline source map not found: {name}", {
|
|
||||||
name: name,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function parse_source_map(content) {
|
|
||||||
try {
|
|
||||||
return JSON.parse(content);
|
|
||||||
} catch (ex) {
|
|
||||||
throw new Error("invalid input source map: " + content);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function set_shorthand(name, options, keys) {
|
|
||||||
keys.forEach(function(key) {
|
|
||||||
if (options[key]) {
|
|
||||||
if (typeof options[key] != "object") options[key] = {};
|
|
||||||
if (!(name in options[key])) options[key][name] = options[name];
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function init_cache(cache) {
|
|
||||||
if (!cache) return;
|
|
||||||
if (!("props" in cache)) {
|
|
||||||
cache.props = new Dictionary();
|
|
||||||
} else if (!(cache.props instanceof Dictionary)) {
|
|
||||||
cache.props = Dictionary.fromObject(cache.props);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function to_json(cache) {
|
|
||||||
return {
|
|
||||||
props: cache.props.toObject()
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function minify(files, options) {
|
|
||||||
try {
|
|
||||||
options = defaults(options, {
|
|
||||||
annotations: undefined,
|
|
||||||
compress: {},
|
|
||||||
enclose: false,
|
|
||||||
ie: false,
|
|
||||||
ie8: false,
|
|
||||||
keep_fargs: false,
|
|
||||||
keep_fnames: false,
|
|
||||||
mangle: {},
|
|
||||||
nameCache: null,
|
|
||||||
output: {},
|
|
||||||
parse: {},
|
|
||||||
rename: undefined,
|
|
||||||
sourceMap: false,
|
|
||||||
timings: false,
|
|
||||||
toplevel: false,
|
|
||||||
v8: false,
|
|
||||||
validate: false,
|
|
||||||
warnings: false,
|
|
||||||
webkit: false,
|
|
||||||
wrap: false,
|
|
||||||
}, true);
|
|
||||||
if (options.validate) AST_Node.enable_validation();
|
|
||||||
var timings = options.timings && { start: Date.now() };
|
|
||||||
if (options.rename === undefined) options.rename = options.compress && options.mangle;
|
|
||||||
if (options.annotations !== undefined) set_shorthand("annotations", options, [ "compress", "output" ]);
|
|
||||||
if (options.ie8) options.ie = options.ie || options.ie8;
|
|
||||||
if (options.ie) set_shorthand("ie", options, [ "compress", "mangle", "output" ]);
|
|
||||||
if (options.keep_fargs) set_shorthand("keep_fargs", options, [ "compress", "mangle" ]);
|
|
||||||
if (options.keep_fnames) set_shorthand("keep_fnames", options, [ "compress", "mangle" ]);
|
|
||||||
if (options.toplevel) set_shorthand("toplevel", options, [ "compress", "mangle" ]);
|
|
||||||
if (options.v8) set_shorthand("v8", options, [ "mangle", "output" ]);
|
|
||||||
if (options.webkit) set_shorthand("webkit", options, [ "compress", "mangle", "output" ]);
|
|
||||||
var quoted_props;
|
|
||||||
if (options.mangle) {
|
|
||||||
options.mangle = defaults(options.mangle, {
|
|
||||||
cache: options.nameCache && (options.nameCache.vars || {}),
|
|
||||||
eval: false,
|
|
||||||
ie: false,
|
|
||||||
keep_fargs: false,
|
|
||||||
keep_fnames: false,
|
|
||||||
properties: false,
|
|
||||||
reserved: [],
|
|
||||||
toplevel: false,
|
|
||||||
v8: false,
|
|
||||||
webkit: false,
|
|
||||||
}, true);
|
|
||||||
if (options.mangle.properties) {
|
|
||||||
if (typeof options.mangle.properties != "object") {
|
|
||||||
options.mangle.properties = {};
|
|
||||||
}
|
|
||||||
if (options.mangle.properties.keep_quoted) {
|
|
||||||
quoted_props = options.mangle.properties.reserved;
|
|
||||||
if (!Array.isArray(quoted_props)) quoted_props = [];
|
|
||||||
options.mangle.properties.reserved = quoted_props;
|
|
||||||
}
|
|
||||||
if (options.nameCache && !("cache" in options.mangle.properties)) {
|
|
||||||
options.mangle.properties.cache = options.nameCache.props || {};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
init_cache(options.mangle.cache);
|
|
||||||
init_cache(options.mangle.properties.cache);
|
|
||||||
}
|
|
||||||
if (options.sourceMap) {
|
|
||||||
options.sourceMap = defaults(options.sourceMap, {
|
|
||||||
content: null,
|
|
||||||
filename: null,
|
|
||||||
includeSources: false,
|
|
||||||
names: true,
|
|
||||||
root: null,
|
|
||||||
url: null,
|
|
||||||
}, true);
|
|
||||||
}
|
|
||||||
var warnings = [];
|
|
||||||
if (options.warnings) AST_Node.log_function(function(warning) {
|
|
||||||
warnings.push(warning);
|
|
||||||
}, options.warnings == "verbose");
|
|
||||||
if (timings) timings.parse = Date.now();
|
|
||||||
var toplevel;
|
|
||||||
if (files instanceof AST_Toplevel) {
|
|
||||||
toplevel = files;
|
|
||||||
} else {
|
|
||||||
if (typeof files == "string") {
|
|
||||||
files = [ files ];
|
|
||||||
}
|
|
||||||
options.parse = options.parse || {};
|
|
||||||
options.parse.toplevel = null;
|
|
||||||
var source_map_content = options.sourceMap && options.sourceMap.content;
|
|
||||||
if (typeof source_map_content == "string" && source_map_content != "inline") {
|
|
||||||
source_map_content = parse_source_map(source_map_content);
|
|
||||||
}
|
|
||||||
if (source_map_content) options.sourceMap.orig = Object.create(null);
|
|
||||||
for (var name in files) if (HOP(files, name)) {
|
|
||||||
options.parse.filename = name;
|
|
||||||
options.parse.toplevel = toplevel = parse(files[name], options.parse);
|
|
||||||
if (source_map_content == "inline") {
|
|
||||||
var inlined_content = read_source_map(name, toplevel);
|
|
||||||
if (inlined_content) {
|
|
||||||
options.sourceMap.orig[name] = parse_source_map(inlined_content);
|
|
||||||
}
|
|
||||||
} else if (source_map_content) {
|
|
||||||
options.sourceMap.orig[name] = source_map_content;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (quoted_props) {
|
|
||||||
reserve_quoted_keys(toplevel, quoted_props);
|
|
||||||
}
|
|
||||||
[ "enclose", "wrap" ].forEach(function(action) {
|
|
||||||
var option = options[action];
|
|
||||||
if (!option) return;
|
|
||||||
var orig = toplevel.print_to_string().slice(0, -1);
|
|
||||||
toplevel = toplevel[action](option);
|
|
||||||
files[toplevel.start.file] = toplevel.print_to_string().replace(orig, "");
|
|
||||||
});
|
|
||||||
if (options.validate) toplevel.validate_ast();
|
|
||||||
if (timings) timings.rename = Date.now();
|
|
||||||
if (options.rename) {
|
|
||||||
toplevel.figure_out_scope(options.mangle);
|
|
||||||
toplevel.expand_names(options.mangle);
|
|
||||||
}
|
|
||||||
if (timings) timings.compress = Date.now();
|
|
||||||
if (options.compress) {
|
|
||||||
toplevel = new Compressor(options.compress).compress(toplevel);
|
|
||||||
if (options.validate) toplevel.validate_ast();
|
|
||||||
}
|
|
||||||
if (timings) timings.scope = Date.now();
|
|
||||||
if (options.mangle) toplevel.figure_out_scope(options.mangle);
|
|
||||||
if (timings) timings.mangle = Date.now();
|
|
||||||
if (options.mangle) {
|
|
||||||
toplevel.compute_char_frequency(options.mangle);
|
|
||||||
toplevel.mangle_names(options.mangle);
|
|
||||||
}
|
|
||||||
if (timings) timings.properties = Date.now();
|
|
||||||
if (options.mangle && options.mangle.properties) mangle_properties(toplevel, options.mangle.properties);
|
|
||||||
if (timings) timings.output = Date.now();
|
|
||||||
var result = {};
|
|
||||||
var output = defaults(options.output, {
|
|
||||||
ast: false,
|
|
||||||
code: true,
|
|
||||||
});
|
|
||||||
if (output.ast) result.ast = toplevel;
|
|
||||||
if (output.code) {
|
|
||||||
if (options.sourceMap) {
|
|
||||||
output.source_map = SourceMap(options.sourceMap);
|
|
||||||
if (options.sourceMap.includeSources) {
|
|
||||||
if (files instanceof AST_Toplevel) {
|
|
||||||
throw new Error("original source content unavailable");
|
|
||||||
} else for (var name in files) if (HOP(files, name)) {
|
|
||||||
output.source_map.setSourceContent(name, files[name]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
delete output.ast;
|
|
||||||
delete output.code;
|
|
||||||
var stream = OutputStream(output);
|
|
||||||
toplevel.print(stream);
|
|
||||||
result.code = stream.get();
|
|
||||||
if (options.sourceMap) {
|
|
||||||
result.map = output.source_map.toString();
|
|
||||||
var url = options.sourceMap.url;
|
|
||||||
if (url) {
|
|
||||||
result.code = result.code.replace(/\n\/\/# sourceMappingURL=\S+\s*$/, "");
|
|
||||||
if (url == "inline") {
|
|
||||||
result.code += "\n//# sourceMappingURL=data:application/json;charset=utf-8;base64," + to_base64(result.map);
|
|
||||||
} else {
|
|
||||||
result.code += "\n//# sourceMappingURL=" + url;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (options.nameCache && options.mangle) {
|
|
||||||
if (options.mangle.cache) options.nameCache.vars = to_json(options.mangle.cache);
|
|
||||||
if (options.mangle.properties && options.mangle.properties.cache) {
|
|
||||||
options.nameCache.props = to_json(options.mangle.properties.cache);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (timings) {
|
|
||||||
timings.end = Date.now();
|
|
||||||
result.timings = {
|
|
||||||
parse: 1e-3 * (timings.rename - timings.parse),
|
|
||||||
rename: 1e-3 * (timings.compress - timings.rename),
|
|
||||||
compress: 1e-3 * (timings.scope - timings.compress),
|
|
||||||
scope: 1e-3 * (timings.mangle - timings.scope),
|
|
||||||
mangle: 1e-3 * (timings.properties - timings.mangle),
|
|
||||||
properties: 1e-3 * (timings.output - timings.properties),
|
|
||||||
output: 1e-3 * (timings.end - timings.output),
|
|
||||||
total: 1e-3 * (timings.end - timings.start)
|
|
||||||
};
|
|
||||||
}
|
|
||||||
if (warnings.length) {
|
|
||||||
result.warnings = warnings;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
} catch (ex) {
|
|
||||||
return { error: ex };
|
|
||||||
} finally {
|
|
||||||
AST_Node.log_function();
|
|
||||||
AST_Node.disable_validation();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
1103
lib/mozilla-ast.js
1103
lib/mozilla-ast.js
File diff suppressed because it is too large
Load Diff
2406
lib/output.js
2406
lib/output.js
File diff suppressed because it is too large
Load Diff
3217
lib/parse.js
3217
lib/parse.js
File diff suppressed because one or more lines are too long
@@ -1,7 +1,7 @@
|
|||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
|
||||||
A JavaScript tokenizer / parser / beautifier / compressor.
|
A JavaScript tokenizer / parser / beautifier / compressor.
|
||||||
https://github.com/mishoo/UglifyJS
|
https://github.com/mishoo/UglifyJS2
|
||||||
|
|
||||||
-------------------------------- (C) ---------------------------------
|
-------------------------------- (C) ---------------------------------
|
||||||
|
|
||||||
@@ -43,217 +43,240 @@
|
|||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
var builtins = function() {
|
function find_builtins() {
|
||||||
var names = new Dictionary();
|
|
||||||
// NaN will be included due to Number.NaN
|
// Compatibility fix for some standard defined globals not defined on every js environment
|
||||||
[
|
var new_globals = ["Symbol", "Map", "Promise", "Proxy", "Reflect", "Set", "WeakMap", "WeakSet"];
|
||||||
"null",
|
var objects = {};
|
||||||
"true",
|
|
||||||
"false",
|
new_globals.forEach(function (new_global) {
|
||||||
"Infinity",
|
objects[new_global] = global[new_global] || new Function();
|
||||||
"-Infinity",
|
});
|
||||||
"undefined",
|
|
||||||
].forEach(add);
|
var a = [];
|
||||||
[
|
[ Object, Array, Function, Number,
|
||||||
Array,
|
String, Boolean, Error, Math,
|
||||||
Boolean,
|
Date, RegExp, objects.Symbol, ArrayBuffer,
|
||||||
Date,
|
DataView, decodeURI, decodeURIComponent,
|
||||||
Error,
|
encodeURI, encodeURIComponent, eval, EvalError,
|
||||||
Function,
|
Float32Array, Float64Array, Int8Array, Int16Array,
|
||||||
Math,
|
Int32Array, isFinite, isNaN, JSON, objects.Map, parseFloat,
|
||||||
Number,
|
parseInt, objects.Promise, objects.Proxy, RangeError, ReferenceError,
|
||||||
Object,
|
objects.Reflect, objects.Set, SyntaxError, TypeError, Uint8Array,
|
||||||
RegExp,
|
Uint8ClampedArray, Uint16Array, Uint32Array, URIError,
|
||||||
String,
|
objects.WeakMap, objects.WeakSet
|
||||||
].forEach(function(ctor) {
|
].forEach(function(ctor){
|
||||||
Object.getOwnPropertyNames(ctor).map(add);
|
Object.getOwnPropertyNames(ctor).map(add);
|
||||||
if (ctor.prototype) {
|
if (ctor.prototype) {
|
||||||
Object.getOwnPropertyNames(new ctor()).map(add);
|
|
||||||
Object.getOwnPropertyNames(ctor.prototype).map(add);
|
Object.getOwnPropertyNames(ctor.prototype).map(add);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return names;
|
|
||||||
|
|
||||||
function add(name) {
|
function add(name) {
|
||||||
names.set(name, true);
|
push_uniq(a, name);
|
||||||
}
|
|
||||||
}();
|
|
||||||
|
|
||||||
function reserve_quoted_keys(ast, reserved) {
|
|
||||||
ast.walk(new TreeWalker(function(node) {
|
|
||||||
if (node instanceof AST_ClassProperty) {
|
|
||||||
if (node.start && node.start.quote) add(node.key);
|
|
||||||
} else if (node instanceof AST_ObjectProperty) {
|
|
||||||
if (node.start && node.start.quote) add(node.key);
|
|
||||||
} else if (node instanceof AST_Sub) {
|
|
||||||
addStrings(node.property, add);
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
function add(name) {
|
|
||||||
push_uniq(reserved, name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function addStrings(node, add) {
|
|
||||||
if (node instanceof AST_Conditional) {
|
|
||||||
addStrings(node.consequent, add);
|
|
||||||
addStrings(node.alternative, add);
|
|
||||||
} else if (node instanceof AST_Sequence) {
|
|
||||||
addStrings(node.tail_node(), add);
|
|
||||||
} else if (node instanceof AST_String) {
|
|
||||||
add(node.value);
|
|
||||||
}
|
}
|
||||||
|
return a;
|
||||||
}
|
}
|
||||||
|
|
||||||
function mangle_properties(ast, options) {
|
function mangle_properties(ast, options) {
|
||||||
options = defaults(options, {
|
options = defaults(options, {
|
||||||
builtins: false,
|
|
||||||
cache: null,
|
cache: null,
|
||||||
debug: false,
|
debug: false,
|
||||||
keep_quoted: false,
|
ignore_quoted: false,
|
||||||
|
only_cache: false,
|
||||||
regex: null,
|
regex: null,
|
||||||
reserved: null,
|
reserved: null,
|
||||||
}, true);
|
|
||||||
|
|
||||||
var reserved = options.builtins ? new Dictionary() : builtins.clone();
|
|
||||||
if (Array.isArray(options.reserved)) options.reserved.forEach(function(name) {
|
|
||||||
reserved.set(name, true);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
var cname = -1;
|
var reserved = options.reserved;
|
||||||
var cache;
|
if (reserved == null)
|
||||||
if (options.cache) {
|
reserved = find_builtins();
|
||||||
cache = options.cache.props;
|
|
||||||
cache.each(function(name) {
|
var cache = options.cache;
|
||||||
reserved.set(name, true);
|
if (cache == null) {
|
||||||
});
|
cache = {
|
||||||
} else {
|
cname: -1,
|
||||||
cache = new Dictionary();
|
props: new Dictionary()
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
var regex = options.regex;
|
var regex = options.regex;
|
||||||
|
var ignore_quoted = options.ignore_quoted;
|
||||||
|
|
||||||
// note debug is either false (disabled), or a string of the debug suffix to use (enabled).
|
// note debug is either false (disabled), or a string of the debug suffix to use (enabled).
|
||||||
// note debug may be enabled as an empty string, which is falsey. Also treat passing 'true'
|
// note debug may be enabled as an empty string, which is falsey. Also treat passing 'true'
|
||||||
// the same as passing an empty string.
|
// the same as passing an empty string.
|
||||||
var debug = options.debug !== false;
|
var debug = (options.debug !== false);
|
||||||
var debug_suffix;
|
var debug_name_suffix;
|
||||||
if (debug) debug_suffix = options.debug === true ? "" : options.debug;
|
if (debug) {
|
||||||
|
debug_name_suffix = (options.debug === true ? "" : options.debug);
|
||||||
|
}
|
||||||
|
|
||||||
var names_to_mangle = new Dictionary();
|
var names_to_mangle = [];
|
||||||
var unmangleable = reserved.clone();
|
var unmangleable = [];
|
||||||
|
var ignored = {};
|
||||||
|
|
||||||
// step 1: find candidates to mangle
|
// step 1: find candidates to mangle
|
||||||
ast.walk(new TreeWalker(function(node) {
|
ast.walk(new TreeWalker(function(node){
|
||||||
if (node instanceof AST_Binary) {
|
if (node instanceof AST_ObjectKeyVal) {
|
||||||
if (node.operator == "in") addStrings(node.left, add);
|
add(node.key, ignore_quoted && node.quote);
|
||||||
} else if (node.TYPE == "Call") {
|
|
||||||
var exp = node.expression;
|
|
||||||
if (exp instanceof AST_Dot) switch (exp.property) {
|
|
||||||
case "defineProperty":
|
|
||||||
case "getOwnPropertyDescriptor":
|
|
||||||
if (node.args.length < 2) break;
|
|
||||||
exp = exp.expression;
|
|
||||||
if (!(exp instanceof AST_SymbolRef)) break;
|
|
||||||
if (exp.name != "Object") break;
|
|
||||||
if (!exp.definition().undeclared) break;
|
|
||||||
addStrings(node.args[1], add);
|
|
||||||
break;
|
|
||||||
case "hasOwnProperty":
|
|
||||||
if (node.args.length < 1) break;
|
|
||||||
addStrings(node.args[0], add);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
} else if (node instanceof AST_ClassProperty) {
|
else if (node instanceof AST_ObjectProperty) {
|
||||||
if (typeof node.key == "string") add(node.key);
|
// setter or getter, since KeyVal is handled above
|
||||||
} else if (node instanceof AST_Dot) {
|
add(node.key.name);
|
||||||
|
}
|
||||||
|
else if (node instanceof AST_Dot) {
|
||||||
add(node.property);
|
add(node.property);
|
||||||
} else if (node instanceof AST_ObjectProperty) {
|
}
|
||||||
if (typeof node.key == "string") add(node.key);
|
else if (node instanceof AST_Sub) {
|
||||||
} else if (node instanceof AST_Sub) {
|
addStrings(node.property, ignore_quoted);
|
||||||
addStrings(node.property, add);
|
}
|
||||||
|
else if (node instanceof AST_ConciseMethod) {
|
||||||
|
add(node.name.name);
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
|
||||||
// step 2: renaming properties
|
// step 2: transform the tree, renaming properties
|
||||||
ast.walk(new TreeWalker(function(node) {
|
return ast.transform(new TreeTransformer(function(node){
|
||||||
if (node instanceof AST_Binary) {
|
if (node instanceof AST_ObjectKeyVal) {
|
||||||
if (node.operator == "in") mangleStrings(node.left);
|
if (!(ignore_quoted && node.quote))
|
||||||
} else if (node.TYPE == "Call") {
|
node.key = mangle(node.key);
|
||||||
var exp = node.expression;
|
|
||||||
if (exp instanceof AST_Dot) switch (exp.property) {
|
|
||||||
case "defineProperty":
|
|
||||||
case "getOwnPropertyDescriptor":
|
|
||||||
if (node.args.length < 2) break;
|
|
||||||
exp = exp.expression;
|
|
||||||
if (!(exp instanceof AST_SymbolRef)) break;
|
|
||||||
if (exp.name != "Object") break;
|
|
||||||
if (!exp.definition().undeclared) break;
|
|
||||||
mangleStrings(node.args[1]);
|
|
||||||
break;
|
|
||||||
case "hasOwnProperty":
|
|
||||||
if (node.args.length < 1) break;
|
|
||||||
mangleStrings(node.args[0]);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
} else if (node instanceof AST_ClassProperty) {
|
else if (node instanceof AST_ObjectProperty) {
|
||||||
if (typeof node.key == "string") node.key = mangle(node.key);
|
// setter or getter
|
||||||
} else if (node instanceof AST_Dot) {
|
node.key.name = mangle(node.key.name);
|
||||||
|
}
|
||||||
|
else if (node instanceof AST_Dot) {
|
||||||
node.property = mangle(node.property);
|
node.property = mangle(node.property);
|
||||||
} else if (node instanceof AST_ObjectProperty) {
|
|
||||||
if (typeof node.key == "string") node.key = mangle(node.key);
|
|
||||||
} else if (node instanceof AST_Sub) {
|
|
||||||
if (!options.keep_quoted) mangleStrings(node.property);
|
|
||||||
}
|
}
|
||||||
|
else if (node instanceof AST_Sub) {
|
||||||
|
if (!ignore_quoted)
|
||||||
|
node.property = mangleStrings(node.property);
|
||||||
|
}
|
||||||
|
else if (node instanceof AST_ConciseMethod) {
|
||||||
|
if (should_mangle(node.name.name)) {
|
||||||
|
node.name.name = mangle(node.name.name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// else if (node instanceof AST_String) {
|
||||||
|
// if (should_mangle(node.value)) {
|
||||||
|
// AST_Node.warn(
|
||||||
|
// "Found \"{prop}\" property candidate for mangling in an arbitrary string [{file}:{line},{col}]", {
|
||||||
|
// file : node.start.file,
|
||||||
|
// line : node.start.line,
|
||||||
|
// col : node.start.col,
|
||||||
|
// prop : node.value
|
||||||
|
// }
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
// }
|
||||||
}));
|
}));
|
||||||
|
|
||||||
// only function declarations after this line
|
// only function declarations after this line
|
||||||
|
|
||||||
function can_mangle(name) {
|
function can_mangle(name) {
|
||||||
if (unmangleable.has(name)) return false;
|
if (!is_identifier(name)) return false;
|
||||||
if (/^-?[0-9]+(\.[0-9]+)?(e[+-][0-9]+)?$/.test(name)) return false;
|
if (unmangleable.indexOf(name) >= 0) return false;
|
||||||
|
if (reserved.indexOf(name) >= 0) return false;
|
||||||
|
if (options.only_cache) {
|
||||||
|
return cache.props.has(name);
|
||||||
|
}
|
||||||
|
if (/^[0-9.]+$/.test(name)) return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
function should_mangle(name) {
|
function should_mangle(name) {
|
||||||
if (reserved.has(name)) return false;
|
if (ignore_quoted && name in ignored) return false;
|
||||||
if (regex && !regex.test(name)) return false;
|
if (regex && !regex.test(name)) return false;
|
||||||
return cache.has(name) || names_to_mangle.has(name);
|
if (reserved.indexOf(name) >= 0) return false;
|
||||||
|
return cache.props.has(name)
|
||||||
|
|| names_to_mangle.indexOf(name) >= 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
function add(name) {
|
function add(name, ignore) {
|
||||||
if (can_mangle(name)) names_to_mangle.set(name, true);
|
if (ignore) {
|
||||||
if (!should_mangle(name)) unmangleable.set(name, true);
|
ignored[name] = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (can_mangle(name))
|
||||||
|
push_uniq(names_to_mangle, name);
|
||||||
|
|
||||||
|
if (!should_mangle(name)) {
|
||||||
|
push_uniq(unmangleable, name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function mangle(name) {
|
function mangle(name) {
|
||||||
if (!should_mangle(name)) return name;
|
if (!should_mangle(name)) {
|
||||||
var mangled = cache.get(name);
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
var mangled = cache.props.get(name);
|
||||||
if (!mangled) {
|
if (!mangled) {
|
||||||
if (debug) {
|
if (debug) {
|
||||||
// debug mode: use a prefix and suffix to preserve readability, e.g. o.foo ---> o._$foo$NNN_.
|
// debug mode: use a prefix and suffix to preserve readability, e.g. o.foo -> o._$foo$NNN_.
|
||||||
var debug_mangled = "_$" + name + "$" + debug_suffix + "_";
|
var debug_mangled = "_$" + name + "$" + debug_name_suffix + "_";
|
||||||
if (can_mangle(debug_mangled)) mangled = debug_mangled;
|
|
||||||
|
if (can_mangle(debug_mangled) && !(ignore_quoted && debug_mangled in ignored)) {
|
||||||
|
mangled = debug_mangled;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// either debug mode is off, or it is on and we could not use the mangled name
|
// either debug mode is off, or it is on and we could not use the mangled name
|
||||||
if (!mangled) do {
|
if (!mangled) {
|
||||||
mangled = base54(++cname);
|
// note can_mangle() does not check if the name collides with the 'ignored' set
|
||||||
} while (!can_mangle(mangled));
|
// (filled with quoted properties when ignore_quoted set). Make sure we add this
|
||||||
if (/^#/.test(name)) mangled = "#" + mangled;
|
// check so we don't collide with a quoted name.
|
||||||
cache.set(name, mangled);
|
do {
|
||||||
|
mangled = base54(++cache.cname);
|
||||||
|
} while (!can_mangle(mangled) || (ignore_quoted && mangled in ignored));
|
||||||
|
}
|
||||||
|
|
||||||
|
cache.props.set(name, mangled);
|
||||||
}
|
}
|
||||||
return mangled;
|
return mangled;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function addStrings(node, ignore) {
|
||||||
|
var out = {};
|
||||||
|
try {
|
||||||
|
(function walk(node){
|
||||||
|
node.walk(new TreeWalker(function(node){
|
||||||
|
if (node instanceof AST_Seq) {
|
||||||
|
walk(node.cdr);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (node instanceof AST_String) {
|
||||||
|
add(node.value, ignore);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (node instanceof AST_Conditional) {
|
||||||
|
walk(node.consequent);
|
||||||
|
walk(node.alternative);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
throw out;
|
||||||
|
}));
|
||||||
|
})(node);
|
||||||
|
} catch(ex) {
|
||||||
|
if (ex !== out) throw ex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function mangleStrings(node) {
|
function mangleStrings(node) {
|
||||||
if (node instanceof AST_Sequence) {
|
return node.transform(new TreeTransformer(function(node){
|
||||||
mangleStrings(node.expressions.tail_node());
|
if (node instanceof AST_Seq) {
|
||||||
} else if (node instanceof AST_String) {
|
node.cdr = mangleStrings(node.cdr);
|
||||||
|
}
|
||||||
|
else if (node instanceof AST_String) {
|
||||||
node.value = mangle(node.value);
|
node.value = mangle(node.value);
|
||||||
} else if (node instanceof AST_Conditional) {
|
|
||||||
mangleStrings(node.consequent);
|
|
||||||
mangleStrings(node.alternative);
|
|
||||||
}
|
}
|
||||||
|
else if (node instanceof AST_Conditional) {
|
||||||
|
node.consequent = mangleStrings(node.consequent);
|
||||||
|
node.alternative = mangleStrings(node.alternative);
|
||||||
}
|
}
|
||||||
|
return node;
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
1175
lib/scope.js
1175
lib/scope.js
File diff suppressed because it is too large
Load Diff
186
lib/sourcemap.js
186
lib/sourcemap.js
@@ -1,7 +1,7 @@
|
|||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
|
||||||
A JavaScript tokenizer / parser / beautifier / compressor.
|
A JavaScript tokenizer / parser / beautifier / compressor.
|
||||||
https://github.com/mishoo/UglifyJS
|
https://github.com/mishoo/UglifyJS2
|
||||||
|
|
||||||
-------------------------------- (C) ---------------------------------
|
-------------------------------- (C) ---------------------------------
|
||||||
|
|
||||||
@@ -43,153 +43,55 @@
|
|||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
var vlq_char = characters("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");
|
// a small wrapper around fitzgen's source-map library
|
||||||
var vlq_bits = vlq_char.reduce(function(map, ch, bits) {
|
|
||||||
map[ch] = bits;
|
|
||||||
return map;
|
|
||||||
}, Object.create(null));
|
|
||||||
|
|
||||||
function vlq_decode(indices, str) {
|
|
||||||
var value = 0;
|
|
||||||
var shift = 0;
|
|
||||||
for (var i = 0, j = 0; i < str.length; i++) {
|
|
||||||
var bits = vlq_bits[str[i]];
|
|
||||||
value += (bits & 31) << shift;
|
|
||||||
if (bits & 32) {
|
|
||||||
shift += 5;
|
|
||||||
} else {
|
|
||||||
indices[j++] += value & 1 ? 0x80000000 | -(value >> 1) : value >> 1;
|
|
||||||
value = shift = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return j;
|
|
||||||
}
|
|
||||||
|
|
||||||
function vlq_encode(num) {
|
|
||||||
var result = "";
|
|
||||||
num = Math.abs(num) << 1 | num >>> 31;
|
|
||||||
do {
|
|
||||||
var bits = num & 31;
|
|
||||||
if (num >>>= 5) bits |= 32;
|
|
||||||
result += vlq_char[bits];
|
|
||||||
} while (num);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
function create_array_map() {
|
|
||||||
var map = new Dictionary();
|
|
||||||
var array = [];
|
|
||||||
array.index = function(name) {
|
|
||||||
var index = map.get(name);
|
|
||||||
if (!(index >= 0)) {
|
|
||||||
index = array.length;
|
|
||||||
array.push(name);
|
|
||||||
map.set(name, index);
|
|
||||||
}
|
|
||||||
return index;
|
|
||||||
};
|
|
||||||
return array;
|
|
||||||
}
|
|
||||||
|
|
||||||
function SourceMap(options) {
|
function SourceMap(options) {
|
||||||
var sources = create_array_map();
|
options = defaults(options, {
|
||||||
var sources_content = options.includeSources && new Dictionary();
|
file : null,
|
||||||
var names = create_array_map();
|
root : null,
|
||||||
var mappings = "";
|
orig : null,
|
||||||
if (options.orig) Object.keys(options.orig).forEach(function(name) {
|
|
||||||
var map = options.orig[name];
|
orig_line_diff : 0,
|
||||||
var indices = [ 0, 0, 1, 0, 0 ];
|
dest_line_diff : 0,
|
||||||
options.orig[name] = {
|
|
||||||
names: map.names,
|
|
||||||
mappings: map.mappings.split(/;/).map(function(line) {
|
|
||||||
indices[0] = 0;
|
|
||||||
return line.split(/,/).map(function(segment) {
|
|
||||||
return indices.slice(0, vlq_decode(indices, segment));
|
|
||||||
});
|
});
|
||||||
}),
|
var generator = new MOZ_SourceMap.SourceMapGenerator({
|
||||||
sources: map.sources,
|
file : options.file,
|
||||||
};
|
sourceRoot : options.root
|
||||||
if (!sources_content || !map.sourcesContent) return;
|
});
|
||||||
for (var i = 0; i < map.sources.length; i++) {
|
var orig_map = options.orig && new MOZ_SourceMap.SourceMapConsumer(options.orig);
|
||||||
var content = map.sourcesContent[i];
|
|
||||||
if (content) sources_content.set(map.sources[i], content);
|
if (orig_map && Array.isArray(options.orig.sources)) {
|
||||||
|
orig_map._sources.toArray().forEach(function(source) {
|
||||||
|
var sourceContent = orig_map.sourceContentFor(source, true);
|
||||||
|
if (sourceContent) {
|
||||||
|
generator.setSourceContent(source, sourceContent);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
var prev_source;
|
|
||||||
var generated_line = 1;
|
|
||||||
var generated_column = 0;
|
|
||||||
var source_index = 0;
|
|
||||||
var original_line = 1;
|
|
||||||
var original_column = 0;
|
|
||||||
var name_index = 0;
|
|
||||||
return {
|
|
||||||
add: options.orig ? function(source, gen_line, gen_col, orig_line, orig_col, name) {
|
|
||||||
var map = options.orig[source];
|
|
||||||
if (map) {
|
|
||||||
var segments = map.mappings[orig_line - 1];
|
|
||||||
if (!segments) return;
|
|
||||||
var indices;
|
|
||||||
for (var i = 0; i < segments.length; i++) {
|
|
||||||
var col = segments[i][0];
|
|
||||||
if (orig_col >= col) indices = segments[i];
|
|
||||||
if (orig_col <= col) break;
|
|
||||||
}
|
}
|
||||||
if (!indices || indices.length < 4) {
|
|
||||||
source = null;
|
|
||||||
} else {
|
|
||||||
source = map.sources[indices[1]];
|
|
||||||
orig_line = indices[2];
|
|
||||||
orig_col = indices[3];
|
|
||||||
if (indices.length > 4) name = map.names[indices[4]];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
add(source, gen_line, gen_col, orig_line, orig_col, name);
|
|
||||||
} : add,
|
|
||||||
setSourceContent: sources_content ? function(source, content) {
|
|
||||||
if (!sources_content.has(source)) {
|
|
||||||
sources_content.set(source, content);
|
|
||||||
}
|
|
||||||
} : noop,
|
|
||||||
toString: function() {
|
|
||||||
return JSON.stringify({
|
|
||||||
version: 3,
|
|
||||||
file: options.filename || undefined,
|
|
||||||
sourceRoot: options.root || undefined,
|
|
||||||
sources: sources,
|
|
||||||
sourcesContent: sources_content ? sources.map(function(source) {
|
|
||||||
return sources_content.get(source) || null;
|
|
||||||
}) : undefined,
|
|
||||||
names: names,
|
|
||||||
mappings: mappings,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
function add(source, gen_line, gen_col, orig_line, orig_col, name) {
|
function add(source, gen_line, gen_col, orig_line, orig_col, name) {
|
||||||
if (prev_source == null && source == null) return;
|
if (orig_map) {
|
||||||
prev_source = source;
|
var info = orig_map.originalPositionFor({
|
||||||
if (generated_line < gen_line) {
|
line: orig_line,
|
||||||
generated_column = 0;
|
column: orig_col
|
||||||
do {
|
});
|
||||||
mappings += ";";
|
if (info.source === null) {
|
||||||
} while (++generated_line < gen_line);
|
return;
|
||||||
} else if (mappings) {
|
|
||||||
mappings += ",";
|
|
||||||
}
|
}
|
||||||
mappings += vlq_encode(gen_col - generated_column);
|
source = info.source;
|
||||||
generated_column = gen_col;
|
orig_line = info.line;
|
||||||
if (source == null) return;
|
orig_col = info.column;
|
||||||
var src_idx = sources.index(source);
|
name = info.name || name;
|
||||||
mappings += vlq_encode(src_idx - source_index);
|
|
||||||
source_index = src_idx;
|
|
||||||
mappings += vlq_encode(orig_line - original_line);
|
|
||||||
original_line = orig_line;
|
|
||||||
mappings += vlq_encode(orig_col - original_column);
|
|
||||||
original_column = orig_col;
|
|
||||||
if (options.names && name != null) {
|
|
||||||
var name_idx = names.index(name);
|
|
||||||
mappings += vlq_encode(name_idx - name_index);
|
|
||||||
name_index = name_idx;
|
|
||||||
}
|
}
|
||||||
}
|
generator.addMapping({
|
||||||
}
|
generated : { line: gen_line + options.dest_line_diff, column: gen_col },
|
||||||
|
original : { line: orig_line + options.orig_line_diff, column: orig_col },
|
||||||
|
source : source,
|
||||||
|
name : name
|
||||||
|
});
|
||||||
|
};
|
||||||
|
return {
|
||||||
|
add : add,
|
||||||
|
get : function() { return generator },
|
||||||
|
toString : function() { return JSON.stringify(generator.toJSON()); }
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|||||||
229
lib/transform.js
229
lib/transform.js
@@ -1,7 +1,7 @@
|
|||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
|
||||||
A JavaScript tokenizer / parser / beautifier / compressor.
|
A JavaScript tokenizer / parser / beautifier / compressor.
|
||||||
https://github.com/mishoo/UglifyJS
|
https://github.com/mishoo/UglifyJS2
|
||||||
|
|
||||||
-------------------------------- (C) ---------------------------------
|
-------------------------------- (C) ---------------------------------
|
||||||
|
|
||||||
@@ -43,6 +43,8 @@
|
|||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
// Tree transformer helpers.
|
||||||
|
|
||||||
function TreeTransformer(before, after) {
|
function TreeTransformer(before, after) {
|
||||||
TreeWalker.call(this);
|
TreeWalker.call(this);
|
||||||
this.before = before;
|
this.before = before;
|
||||||
@@ -50,201 +52,204 @@ function TreeTransformer(before, after) {
|
|||||||
}
|
}
|
||||||
TreeTransformer.prototype = new TreeWalker;
|
TreeTransformer.prototype = new TreeWalker;
|
||||||
|
|
||||||
(function(DEF) {
|
(function(undefined){
|
||||||
|
|
||||||
|
function _(node, descend) {
|
||||||
|
node.DEFMETHOD("transform", function(tw, in_list){
|
||||||
|
var x, y;
|
||||||
|
tw.push(this);
|
||||||
|
if (tw.before) x = tw.before(this, descend, in_list);
|
||||||
|
if (x === undefined) {
|
||||||
|
if (!tw.after) {
|
||||||
|
x = this;
|
||||||
|
descend(x, tw);
|
||||||
|
} else {
|
||||||
|
tw.stack[tw.stack.length - 1] = x = this;
|
||||||
|
descend(x, tw);
|
||||||
|
y = tw.after(x, in_list);
|
||||||
|
if (y !== undefined) x = y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tw.pop(this);
|
||||||
|
return x;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
function do_list(list, tw) {
|
function do_list(list, tw) {
|
||||||
return List(list, function(node) {
|
return MAP(list, function(node){
|
||||||
return node.transform(tw, true);
|
return node.transform(tw, true);
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
DEF(AST_Node, noop);
|
_(AST_Node, noop);
|
||||||
DEF(AST_LabeledStatement, function(self, tw) {
|
|
||||||
|
_(AST_LabeledStatement, function(self, tw){
|
||||||
self.label = self.label.transform(tw);
|
self.label = self.label.transform(tw);
|
||||||
self.body = self.body.transform(tw);
|
self.body = self.body.transform(tw);
|
||||||
});
|
});
|
||||||
DEF(AST_SimpleStatement, function(self, tw) {
|
|
||||||
|
_(AST_SimpleStatement, function(self, tw){
|
||||||
self.body = self.body.transform(tw);
|
self.body = self.body.transform(tw);
|
||||||
});
|
});
|
||||||
DEF(AST_Block, function(self, tw) {
|
|
||||||
|
_(AST_Block, function(self, tw){
|
||||||
self.body = do_list(self.body, tw);
|
self.body = do_list(self.body, tw);
|
||||||
});
|
});
|
||||||
DEF(AST_Do, function(self, tw) {
|
|
||||||
self.body = self.body.transform(tw);
|
_(AST_DWLoop, function(self, tw){
|
||||||
self.condition = self.condition.transform(tw);
|
|
||||||
});
|
|
||||||
DEF(AST_While, function(self, tw) {
|
|
||||||
self.condition = self.condition.transform(tw);
|
self.condition = self.condition.transform(tw);
|
||||||
self.body = self.body.transform(tw);
|
self.body = self.body.transform(tw);
|
||||||
});
|
});
|
||||||
DEF(AST_For, function(self, tw) {
|
|
||||||
|
_(AST_For, function(self, tw){
|
||||||
if (self.init) self.init = self.init.transform(tw);
|
if (self.init) self.init = self.init.transform(tw);
|
||||||
if (self.condition) self.condition = self.condition.transform(tw);
|
if (self.condition) self.condition = self.condition.transform(tw);
|
||||||
if (self.step) self.step = self.step.transform(tw);
|
if (self.step) self.step = self.step.transform(tw);
|
||||||
self.body = self.body.transform(tw);
|
self.body = self.body.transform(tw);
|
||||||
});
|
});
|
||||||
DEF(AST_ForEnumeration, function(self, tw) {
|
|
||||||
|
_(AST_ForIn, function(self, tw){
|
||||||
self.init = self.init.transform(tw);
|
self.init = self.init.transform(tw);
|
||||||
self.object = self.object.transform(tw);
|
self.object = self.object.transform(tw);
|
||||||
self.body = self.body.transform(tw);
|
self.body = self.body.transform(tw);
|
||||||
});
|
});
|
||||||
DEF(AST_With, function(self, tw) {
|
|
||||||
|
_(AST_With, function(self, tw){
|
||||||
self.expression = self.expression.transform(tw);
|
self.expression = self.expression.transform(tw);
|
||||||
self.body = self.body.transform(tw);
|
self.body = self.body.transform(tw);
|
||||||
});
|
});
|
||||||
DEF(AST_Exit, function(self, tw) {
|
|
||||||
|
_(AST_Exit, function(self, tw){
|
||||||
if (self.value) self.value = self.value.transform(tw);
|
if (self.value) self.value = self.value.transform(tw);
|
||||||
});
|
});
|
||||||
DEF(AST_LoopControl, function(self, tw) {
|
|
||||||
|
_(AST_LoopControl, function(self, tw){
|
||||||
if (self.label) self.label = self.label.transform(tw);
|
if (self.label) self.label = self.label.transform(tw);
|
||||||
});
|
});
|
||||||
DEF(AST_If, function(self, tw) {
|
|
||||||
|
_(AST_If, function(self, tw){
|
||||||
self.condition = self.condition.transform(tw);
|
self.condition = self.condition.transform(tw);
|
||||||
self.body = self.body.transform(tw);
|
self.body = self.body.transform(tw);
|
||||||
if (self.alternative) self.alternative = self.alternative.transform(tw);
|
if (self.alternative) self.alternative = self.alternative.transform(tw);
|
||||||
});
|
});
|
||||||
DEF(AST_Switch, function(self, tw) {
|
|
||||||
|
_(AST_Switch, function(self, tw){
|
||||||
self.expression = self.expression.transform(tw);
|
self.expression = self.expression.transform(tw);
|
||||||
self.body = do_list(self.body, tw);
|
self.body = do_list(self.body, tw);
|
||||||
});
|
});
|
||||||
DEF(AST_Case, function(self, tw) {
|
|
||||||
|
_(AST_Case, function(self, tw){
|
||||||
self.expression = self.expression.transform(tw);
|
self.expression = self.expression.transform(tw);
|
||||||
self.body = do_list(self.body, tw);
|
self.body = do_list(self.body, tw);
|
||||||
});
|
});
|
||||||
DEF(AST_Try, function(self, tw) {
|
|
||||||
|
_(AST_Try, function(self, tw){
|
||||||
self.body = do_list(self.body, tw);
|
self.body = do_list(self.body, tw);
|
||||||
if (self.bcatch) self.bcatch = self.bcatch.transform(tw);
|
if (self.bcatch) self.bcatch = self.bcatch.transform(tw);
|
||||||
if (self.bfinally) self.bfinally = self.bfinally.transform(tw);
|
if (self.bfinally) self.bfinally = self.bfinally.transform(tw);
|
||||||
});
|
});
|
||||||
DEF(AST_Catch, function(self, tw) {
|
|
||||||
if (self.argname) self.argname = self.argname.transform(tw);
|
_(AST_Catch, function(self, tw){
|
||||||
|
self.argname = self.argname.transform(tw);
|
||||||
self.body = do_list(self.body, tw);
|
self.body = do_list(self.body, tw);
|
||||||
});
|
});
|
||||||
DEF(AST_Definitions, function(self, tw) {
|
|
||||||
|
_(AST_Definitions, function(self, tw){
|
||||||
self.definitions = do_list(self.definitions, tw);
|
self.definitions = do_list(self.definitions, tw);
|
||||||
});
|
});
|
||||||
DEF(AST_VarDef, function(self, tw) {
|
|
||||||
|
_(AST_VarDef, function(self, tw){
|
||||||
self.name = self.name.transform(tw);
|
self.name = self.name.transform(tw);
|
||||||
if (self.value) self.value = self.value.transform(tw);
|
if (self.value) self.value = self.value.transform(tw);
|
||||||
});
|
});
|
||||||
DEF(AST_DefaultValue, function(self, tw) {
|
|
||||||
self.name = self.name.transform(tw);
|
_(AST_Destructuring, function(self, tw) {
|
||||||
self.value = self.value.transform(tw);
|
self.names = do_list(self.names, tw);
|
||||||
});
|
});
|
||||||
DEF(AST_Lambda, function(self, tw) {
|
|
||||||
|
_(AST_Lambda, function(self, tw){
|
||||||
if (self.name) self.name = self.name.transform(tw);
|
if (self.name) self.name = self.name.transform(tw);
|
||||||
self.argnames = do_list(self.argnames, tw);
|
self.argnames = do_list(self.argnames, tw);
|
||||||
if (self.rest) self.rest = self.rest.transform(tw);
|
if (self.body instanceof AST_Node) {
|
||||||
self.body = do_list(self.body, tw);
|
self.body = self.body.transform(tw);
|
||||||
});
|
|
||||||
function transform_arrow(self, tw) {
|
|
||||||
self.argnames = do_list(self.argnames, tw);
|
|
||||||
if (self.rest) self.rest = self.rest.transform(tw);
|
|
||||||
if (self.value) {
|
|
||||||
self.value = self.value.transform(tw);
|
|
||||||
} else {
|
} else {
|
||||||
self.body = do_list(self.body, tw);
|
self.body = do_list(self.body, tw);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
DEF(AST_Arrow, transform_arrow);
|
|
||||||
DEF(AST_AsyncArrow, transform_arrow);
|
|
||||||
DEF(AST_Class, function(self, tw) {
|
|
||||||
if (self.name) self.name = self.name.transform(tw);
|
|
||||||
if (self.extends) self.extends = self.extends.transform(tw);
|
|
||||||
self.properties = do_list(self.properties, tw);
|
|
||||||
});
|
});
|
||||||
DEF(AST_ClassProperty, function(self, tw) {
|
|
||||||
if (self.key instanceof AST_Node) self.key = self.key.transform(tw);
|
_(AST_Call, function(self, tw){
|
||||||
if (self.value) self.value = self.value.transform(tw);
|
|
||||||
});
|
|
||||||
DEF(AST_Call, function(self, tw) {
|
|
||||||
self.expression = self.expression.transform(tw);
|
self.expression = self.expression.transform(tw);
|
||||||
self.args = do_list(self.args, tw);
|
self.args = do_list(self.args, tw);
|
||||||
});
|
});
|
||||||
DEF(AST_Sequence, function(self, tw) {
|
|
||||||
self.expressions = do_list(self.expressions, tw);
|
_(AST_Seq, function(self, tw){
|
||||||
|
self.car = self.car.transform(tw);
|
||||||
|
self.cdr = self.cdr.transform(tw);
|
||||||
});
|
});
|
||||||
DEF(AST_Await, function(self, tw) {
|
|
||||||
|
_(AST_Dot, function(self, tw){
|
||||||
self.expression = self.expression.transform(tw);
|
self.expression = self.expression.transform(tw);
|
||||||
});
|
});
|
||||||
DEF(AST_Yield, function(self, tw) {
|
|
||||||
if (self.expression) self.expression = self.expression.transform(tw);
|
_(AST_Sub, function(self, tw){
|
||||||
});
|
|
||||||
DEF(AST_Dot, function(self, tw) {
|
|
||||||
self.expression = self.expression.transform(tw);
|
|
||||||
});
|
|
||||||
DEF(AST_Sub, function(self, tw) {
|
|
||||||
self.expression = self.expression.transform(tw);
|
self.expression = self.expression.transform(tw);
|
||||||
self.property = self.property.transform(tw);
|
self.property = self.property.transform(tw);
|
||||||
});
|
});
|
||||||
DEF(AST_Spread, function(self, tw) {
|
|
||||||
|
_(AST_Yield, function(self, tw){
|
||||||
|
if (self.expression) self.expression = self.expression.transform(tw);
|
||||||
|
});
|
||||||
|
|
||||||
|
_(AST_Unary, function(self, tw){
|
||||||
self.expression = self.expression.transform(tw);
|
self.expression = self.expression.transform(tw);
|
||||||
});
|
});
|
||||||
DEF(AST_Unary, function(self, tw) {
|
|
||||||
self.expression = self.expression.transform(tw);
|
_(AST_Binary, function(self, tw){
|
||||||
});
|
|
||||||
DEF(AST_Binary, function(self, tw) {
|
|
||||||
self.left = self.left.transform(tw);
|
self.left = self.left.transform(tw);
|
||||||
self.right = self.right.transform(tw);
|
self.right = self.right.transform(tw);
|
||||||
});
|
});
|
||||||
DEF(AST_Conditional, function(self, tw) {
|
|
||||||
|
_(AST_Conditional, function(self, tw){
|
||||||
self.condition = self.condition.transform(tw);
|
self.condition = self.condition.transform(tw);
|
||||||
self.consequent = self.consequent.transform(tw);
|
self.consequent = self.consequent.transform(tw);
|
||||||
self.alternative = self.alternative.transform(tw);
|
self.alternative = self.alternative.transform(tw);
|
||||||
});
|
});
|
||||||
DEF(AST_Array, function(self, tw) {
|
|
||||||
|
_(AST_Array, function(self, tw){
|
||||||
self.elements = do_list(self.elements, tw);
|
self.elements = do_list(self.elements, tw);
|
||||||
});
|
});
|
||||||
DEF(AST_DestructuredArray, function(self, tw) {
|
|
||||||
self.elements = do_list(self.elements, tw);
|
_(AST_Object, function(self, tw){
|
||||||
if (self.rest) self.rest = self.rest.transform(tw);
|
self.properties = do_list(self.properties, tw);
|
||||||
});
|
});
|
||||||
DEF(AST_DestructuredKeyVal, function(self, tw) {
|
|
||||||
if (self.key instanceof AST_Node) self.key = self.key.transform(tw);
|
_(AST_ObjectProperty, function(self, tw){
|
||||||
|
if (self.key instanceof AST_Node) {
|
||||||
|
self.key = self.key.transform(tw);
|
||||||
|
}
|
||||||
self.value = self.value.transform(tw);
|
self.value = self.value.transform(tw);
|
||||||
});
|
});
|
||||||
DEF(AST_DestructuredObject, function(self, tw) {
|
|
||||||
self.properties = do_list(self.properties, tw);
|
_(AST_Class, function(self, tw){
|
||||||
if (self.rest) self.rest = self.rest.transform(tw);
|
if (self.name) self.name = self.name.transform(tw);
|
||||||
});
|
if (self.extends) self.extends = self.extends.transform(tw);
|
||||||
DEF(AST_Object, function(self, tw) {
|
|
||||||
self.properties = do_list(self.properties, tw);
|
self.properties = do_list(self.properties, tw);
|
||||||
});
|
});
|
||||||
DEF(AST_ObjectProperty, function(self, tw) {
|
|
||||||
if (self.key instanceof AST_Node) self.key = self.key.transform(tw);
|
_(AST_Expansion, function(self, tw){
|
||||||
self.value = self.value.transform(tw);
|
self.expression = self.expression.transform(tw);
|
||||||
});
|
});
|
||||||
DEF(AST_ExportDeclaration, function(self, tw) {
|
|
||||||
self.body = self.body.transform(tw);
|
_(AST_TemplateString, function(self, tw) {
|
||||||
});
|
for (var i = 0; i < self.segments.length; i++) {
|
||||||
DEF(AST_ExportDefault, function(self, tw) {
|
if (!(self.segments[i] instanceof AST_TemplateSegment)) {
|
||||||
self.body = self.body.transform(tw);
|
self.segments[i] = self.segments[i].transform(tw);
|
||||||
});
|
|
||||||
DEF(AST_ExportReferences, function(self, tw) {
|
|
||||||
self.properties = do_list(self.properties, tw);
|
|
||||||
});
|
|
||||||
DEF(AST_Import, function(self, tw) {
|
|
||||||
if (self.all) self.all = self.all.transform(tw);
|
|
||||||
if (self.default) self.default = self.default.transform(tw);
|
|
||||||
if (self.properties) self.properties = do_list(self.properties, tw);
|
|
||||||
});
|
|
||||||
DEF(AST_Template, function(self, tw) {
|
|
||||||
if (self.tag) self.tag = self.tag.transform(tw);
|
|
||||||
self.expressions = do_list(self.expressions, tw);
|
|
||||||
});
|
|
||||||
})(function(node, descend) {
|
|
||||||
node.DEFMETHOD("transform", function(tw, in_list) {
|
|
||||||
var x, y;
|
|
||||||
tw.push(this);
|
|
||||||
if (tw.before) x = tw.before(this, descend, in_list);
|
|
||||||
if (typeof x === "undefined") {
|
|
||||||
x = this;
|
|
||||||
descend(x, tw);
|
|
||||||
if (tw.after) {
|
|
||||||
y = tw.after(x, in_list);
|
|
||||||
if (typeof y !== "undefined") x = y;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tw.pop();
|
|
||||||
return x;
|
|
||||||
});
|
});
|
||||||
});
|
|
||||||
|
_(AST_PrefixedTemplateString, function(self, tw) {
|
||||||
|
self.template_string = self.template_string.transform(tw);
|
||||||
|
});
|
||||||
|
|
||||||
|
})();
|
||||||
|
|||||||
351
lib/utils.js
351
lib/utils.js
@@ -1,7 +1,7 @@
|
|||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
|
||||||
A JavaScript tokenizer / parser / beautifier / compressor.
|
A JavaScript tokenizer / parser / beautifier / compressor.
|
||||||
https://github.com/mishoo/UglifyJS
|
https://github.com/mishoo/UglifyJS2
|
||||||
|
|
||||||
-------------------------------- (C) ---------------------------------
|
-------------------------------- (C) ---------------------------------
|
||||||
|
|
||||||
@@ -43,17 +43,40 @@
|
|||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
function array_to_hash(a) {
|
||||||
|
var ret = Object.create(null);
|
||||||
|
for (var i = 0; i < a.length; ++i)
|
||||||
|
ret[a[i]] = true;
|
||||||
|
return ret;
|
||||||
|
};
|
||||||
|
|
||||||
|
function slice(a, start) {
|
||||||
|
return Array.prototype.slice.call(a, start || 0);
|
||||||
|
};
|
||||||
|
|
||||||
function characters(str) {
|
function characters(str) {
|
||||||
return str.split("");
|
return str.split("");
|
||||||
}
|
};
|
||||||
|
|
||||||
function member(name, array) {
|
function member(name, array) {
|
||||||
return array.indexOf(name) >= 0;
|
return array.indexOf(name) >= 0;
|
||||||
}
|
};
|
||||||
|
|
||||||
function find_if(func, array) {
|
function find_if(func, array) {
|
||||||
for (var i = array.length; --i >= 0;) if (func(array[i])) return array[i];
|
for (var i = 0, n = array.length; i < n; ++i) {
|
||||||
}
|
if (func(array[i]))
|
||||||
|
return array[i];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function repeat_string(str, i) {
|
||||||
|
if (i <= 0) return "";
|
||||||
|
if (i == 1) return str;
|
||||||
|
var d = repeat_string(str, i >> 1);
|
||||||
|
d += d;
|
||||||
|
if (i & 1) d += str;
|
||||||
|
return d;
|
||||||
|
};
|
||||||
|
|
||||||
function configure_error_stack(fn) {
|
function configure_error_stack(fn) {
|
||||||
Object.defineProperty(fn.prototype, "stack", {
|
Object.defineProperty(fn.prototype, "stack", {
|
||||||
@@ -62,7 +85,7 @@ function configure_error_stack(fn) {
|
|||||||
err.name = this.name;
|
err.name = this.name;
|
||||||
try {
|
try {
|
||||||
throw err;
|
throw err;
|
||||||
} catch (e) {
|
} catch(e) {
|
||||||
return e.stack;
|
return e.stack;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -72,21 +95,36 @@ function configure_error_stack(fn) {
|
|||||||
function DefaultsError(msg, defs) {
|
function DefaultsError(msg, defs) {
|
||||||
this.message = msg;
|
this.message = msg;
|
||||||
this.defs = defs;
|
this.defs = defs;
|
||||||
}
|
};
|
||||||
DefaultsError.prototype = Object.create(Error.prototype);
|
DefaultsError.prototype = Object.create(Error.prototype);
|
||||||
DefaultsError.prototype.constructor = DefaultsError;
|
DefaultsError.prototype.constructor = DefaultsError;
|
||||||
DefaultsError.prototype.name = "DefaultsError";
|
DefaultsError.prototype.name = "DefaultsError";
|
||||||
configure_error_stack(DefaultsError);
|
configure_error_stack(DefaultsError);
|
||||||
|
|
||||||
|
DefaultsError.croak = function(msg, defs) {
|
||||||
|
throw new DefaultsError(msg, defs);
|
||||||
|
};
|
||||||
|
|
||||||
function defaults(args, defs, croak) {
|
function defaults(args, defs, croak) {
|
||||||
if (croak) for (var i in args) {
|
if (args === true)
|
||||||
if (HOP(args, i) && !HOP(defs, i)) throw new DefaultsError("`" + i + "` is not a supported option", defs);
|
args = {};
|
||||||
|
var ret = args || {};
|
||||||
|
if (croak) for (var i in ret) if (HOP(ret, i) && !HOP(defs, i))
|
||||||
|
DefaultsError.croak("`" + i + "` is not a supported option", defs);
|
||||||
|
for (var i in defs) if (HOP(defs, i)) {
|
||||||
|
ret[i] = (args && HOP(args, i)) ? args[i] : defs[i];
|
||||||
}
|
}
|
||||||
for (var i in args) {
|
return ret;
|
||||||
if (HOP(args, i)) defs[i] = args[i];
|
};
|
||||||
|
|
||||||
|
function merge(obj, ext) {
|
||||||
|
var count = 0;
|
||||||
|
for (var i in ext) if (HOP(ext, i)) {
|
||||||
|
obj[i] = ext[i];
|
||||||
|
count++;
|
||||||
}
|
}
|
||||||
return defs;
|
return count;
|
||||||
}
|
};
|
||||||
|
|
||||||
function noop() {}
|
function noop() {}
|
||||||
function return_false() { return false; }
|
function return_false() { return false; }
|
||||||
@@ -94,140 +132,205 @@ function return_true() { return true; }
|
|||||||
function return_this() { return this; }
|
function return_this() { return this; }
|
||||||
function return_null() { return null; }
|
function return_null() { return null; }
|
||||||
|
|
||||||
var List = (function() {
|
var MAP = (function(){
|
||||||
function List(a, f) {
|
function MAP(a, f, backwards) {
|
||||||
var ret = [];
|
var ret = [], top = [], i;
|
||||||
for (var i = 0; i < a.length; i++) {
|
function doit() {
|
||||||
var val = f(a[i], i);
|
var val = f(a[i], i);
|
||||||
if (val === skip) continue;
|
var is_last = val instanceof Last;
|
||||||
|
if (is_last) val = val.v;
|
||||||
|
if (val instanceof AtTop) {
|
||||||
|
val = val.v;
|
||||||
if (val instanceof Splice) {
|
if (val instanceof Splice) {
|
||||||
ret.push.apply(ret, val.v);
|
top.push.apply(top, backwards ? val.v.slice().reverse() : val.v);
|
||||||
|
} else {
|
||||||
|
top.push(val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (val !== skip) {
|
||||||
|
if (val instanceof Splice) {
|
||||||
|
ret.push.apply(ret, backwards ? val.v.slice().reverse() : val.v);
|
||||||
} else {
|
} else {
|
||||||
ret.push(val);
|
ret.push(val);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ret;
|
return is_last;
|
||||||
}
|
|
||||||
List.is_op = function(val) {
|
|
||||||
return val === skip || val instanceof Splice;
|
|
||||||
};
|
};
|
||||||
List.splice = function(val) {
|
if (a instanceof Array) {
|
||||||
return new Splice(val);
|
if (backwards) {
|
||||||
};
|
for (i = a.length; --i >= 0;) if (doit()) break;
|
||||||
var skip = List.skip = {};
|
ret.reverse();
|
||||||
function Splice(val) {
|
top.reverse();
|
||||||
this.v = val;
|
} else {
|
||||||
|
for (i = 0; i < a.length; ++i) if (doit()) break;
|
||||||
}
|
}
|
||||||
return List;
|
}
|
||||||
|
else {
|
||||||
|
for (i in a) if (HOP(a, i)) if (doit()) break;
|
||||||
|
}
|
||||||
|
return top.concat(ret);
|
||||||
|
};
|
||||||
|
MAP.at_top = function(val) { return new AtTop(val) };
|
||||||
|
MAP.splice = function(val) { return new Splice(val) };
|
||||||
|
MAP.last = function(val) { return new Last(val) };
|
||||||
|
var skip = MAP.skip = {};
|
||||||
|
function AtTop(val) { this.v = val };
|
||||||
|
function Splice(val) { this.v = val };
|
||||||
|
function Last(val) { this.v = val };
|
||||||
|
return MAP;
|
||||||
})();
|
})();
|
||||||
|
|
||||||
function push_uniq(array, el) {
|
function push_uniq(array, el) {
|
||||||
if (array.indexOf(el) < 0) return array.push(el);
|
if (array.indexOf(el) < 0)
|
||||||
}
|
array.push(el);
|
||||||
|
};
|
||||||
|
|
||||||
function string_template(text, props) {
|
function string_template(text, props) {
|
||||||
return text.replace(/\{([^{}]+)\}/g, function(str, p) {
|
return text.replace(/\{(.+?)\}/g, function(str, p){
|
||||||
var value = props[p];
|
return props && props[p];
|
||||||
return value instanceof AST_Node ? value.print_to_string() : value;
|
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
function remove(array, el) {
|
function remove(array, el) {
|
||||||
var index = array.indexOf(el);
|
for (var i = array.length; --i >= 0;) {
|
||||||
if (index >= 0) array.splice(index, 1);
|
if (array[i] === el) array.splice(i, 1);
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
function makePredicate(words) {
|
function mergeSort(array, cmp) {
|
||||||
if (!Array.isArray(words)) words = words.split(" ");
|
if (array.length < 2) return array.slice();
|
||||||
var map = Object.create(null);
|
function merge(a, b) {
|
||||||
words.forEach(function(word) {
|
var r = [], ai = 0, bi = 0, i = 0;
|
||||||
map[word] = true;
|
while (ai < a.length && bi < b.length) {
|
||||||
|
cmp(a[ai], b[bi]) <= 0
|
||||||
|
? r[i++] = a[ai++]
|
||||||
|
: r[i++] = b[bi++];
|
||||||
|
}
|
||||||
|
if (ai < a.length) r.push.apply(r, a.slice(ai));
|
||||||
|
if (bi < b.length) r.push.apply(r, b.slice(bi));
|
||||||
|
return r;
|
||||||
|
};
|
||||||
|
function _ms(a) {
|
||||||
|
if (a.length <= 1)
|
||||||
|
return a;
|
||||||
|
var m = Math.floor(a.length / 2), left = a.slice(0, m), right = a.slice(m);
|
||||||
|
left = _ms(left);
|
||||||
|
right = _ms(right);
|
||||||
|
return merge(left, right);
|
||||||
|
};
|
||||||
|
return _ms(array);
|
||||||
|
};
|
||||||
|
|
||||||
|
function set_difference(a, b) {
|
||||||
|
return a.filter(function(el){
|
||||||
|
return b.indexOf(el) < 0;
|
||||||
});
|
});
|
||||||
return map;
|
};
|
||||||
}
|
|
||||||
|
function set_intersection(a, b) {
|
||||||
|
return a.filter(function(el){
|
||||||
|
return b.indexOf(el) >= 0;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
// this function is taken from Acorn [1], written by Marijn Haverbeke
|
||||||
|
// [1] https://github.com/marijnh/acorn
|
||||||
|
function makePredicate(words) {
|
||||||
|
if (!(words instanceof Array)) words = words.split(" ");
|
||||||
|
var f = "", cats = [];
|
||||||
|
out: for (var i = 0; i < words.length; ++i) {
|
||||||
|
for (var j = 0; j < cats.length; ++j)
|
||||||
|
if (cats[j][0].length == words[i].length) {
|
||||||
|
cats[j].push(words[i]);
|
||||||
|
continue out;
|
||||||
|
}
|
||||||
|
cats.push([words[i]]);
|
||||||
|
}
|
||||||
|
function quote(word) {
|
||||||
|
return JSON.stringify(word).replace(/[\u2028\u2029]/g, function(s) {
|
||||||
|
switch (s) {
|
||||||
|
case "\u2028": return "\\u2028";
|
||||||
|
case "\u2029": return "\\u2029";
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
function compareTo(arr) {
|
||||||
|
if (arr.length == 1) return f += "return str === " + quote(arr[0]) + ";";
|
||||||
|
f += "switch(str){";
|
||||||
|
for (var i = 0; i < arr.length; ++i) f += "case " + quote(arr[i]) + ":";
|
||||||
|
f += "return true}return false;";
|
||||||
|
}
|
||||||
|
// When there are more than three length categories, an outer
|
||||||
|
// switch first dispatches on the lengths, to save on comparisons.
|
||||||
|
if (cats.length > 3) {
|
||||||
|
cats.sort(function(a, b) {return b.length - a.length;});
|
||||||
|
f += "switch(str.length){";
|
||||||
|
for (var i = 0; i < cats.length; ++i) {
|
||||||
|
var cat = cats[i];
|
||||||
|
f += "case " + cat[0].length + ":";
|
||||||
|
compareTo(cat);
|
||||||
|
}
|
||||||
|
f += "}";
|
||||||
|
// Otherwise, simply generate a flat `switch` statement.
|
||||||
|
} else {
|
||||||
|
compareTo(words);
|
||||||
|
}
|
||||||
|
return new Function("str", f);
|
||||||
|
};
|
||||||
|
|
||||||
function all(array, predicate) {
|
function all(array, predicate) {
|
||||||
for (var i = array.length; --i >= 0;)
|
for (var i = array.length; --i >= 0;)
|
||||||
if (!predicate(array[i], i))
|
if (!predicate(array[i]))
|
||||||
return false;
|
return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
};
|
||||||
|
|
||||||
function Dictionary() {
|
function Dictionary() {
|
||||||
this.values = Object.create(null);
|
this._values = Object.create(null);
|
||||||
}
|
this._size = 0;
|
||||||
|
};
|
||||||
Dictionary.prototype = {
|
Dictionary.prototype = {
|
||||||
set: function(key, val) {
|
set: function(key, val) {
|
||||||
if (key == "__proto__") {
|
if (!this.has(key)) ++this._size;
|
||||||
this.proto_value = val;
|
this._values["$" + key] = val;
|
||||||
} else {
|
|
||||||
this.values[key] = val;
|
|
||||||
}
|
|
||||||
return this;
|
return this;
|
||||||
},
|
},
|
||||||
add: function(key, val) {
|
add: function(key, val) {
|
||||||
var list = this.get(key);
|
if (this.has(key)) {
|
||||||
if (list) {
|
this.get(key).push(val);
|
||||||
list.push(val);
|
|
||||||
} else {
|
} else {
|
||||||
this.set(key, [ val ]);
|
this.set(key, [ val ]);
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
},
|
},
|
||||||
get: function(key) {
|
get: function(key) { return this._values["$" + key] },
|
||||||
return key == "__proto__" ? this.proto_value : this.values[key];
|
|
||||||
},
|
|
||||||
del: function(key) {
|
del: function(key) {
|
||||||
if (key == "__proto__") {
|
if (this.has(key)) {
|
||||||
delete this.proto_value;
|
--this._size;
|
||||||
} else {
|
delete this._values["$" + key];
|
||||||
delete this.values[key];
|
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
},
|
},
|
||||||
has: function(key) {
|
has: function(key) { return ("$" + key) in this._values },
|
||||||
return key == "__proto__" ? "proto_value" in this : key in this.values;
|
|
||||||
},
|
|
||||||
all: function(predicate) {
|
|
||||||
for (var i in this.values)
|
|
||||||
if (!predicate(this.values[i], i)) return false;
|
|
||||||
if ("proto_value" in this && !predicate(this.proto_value, "__proto__")) return false;
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
each: function(f) {
|
each: function(f) {
|
||||||
for (var i in this.values)
|
for (var i in this._values)
|
||||||
f(this.values[i], i);
|
f(this._values[i], i.substr(1));
|
||||||
if ("proto_value" in this) f(this.proto_value, "__proto__");
|
|
||||||
},
|
},
|
||||||
size: function() {
|
size: function() {
|
||||||
return Object.keys(this.values).length + ("proto_value" in this);
|
return this._size;
|
||||||
},
|
},
|
||||||
map: function(f) {
|
map: function(f) {
|
||||||
var ret = [];
|
var ret = [];
|
||||||
for (var i in this.values)
|
for (var i in this._values)
|
||||||
ret.push(f(this.values[i], i));
|
ret.push(f(this._values[i], i.substr(1)));
|
||||||
if ("proto_value" in this) ret.push(f(this.proto_value, "__proto__"));
|
|
||||||
return ret;
|
return ret;
|
||||||
},
|
},
|
||||||
clone: function() {
|
toObject: function() { return this._values }
|
||||||
var ret = new Dictionary();
|
|
||||||
this.each(function(value, i) {
|
|
||||||
ret.set(i, value);
|
|
||||||
});
|
|
||||||
return ret;
|
|
||||||
},
|
|
||||||
toObject: function() {
|
|
||||||
var obj = {};
|
|
||||||
this.each(function(value, i) {
|
|
||||||
obj["$" + i] = value;
|
|
||||||
});
|
|
||||||
return obj;
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
Dictionary.fromObject = function(obj) {
|
Dictionary.fromObject = function(obj) {
|
||||||
var dict = new Dictionary();
|
var dict = new Dictionary();
|
||||||
for (var i in obj)
|
dict._size = merge(dict._values, obj);
|
||||||
if (HOP(obj, i)) dict.set(i.slice(1), obj[i]);
|
|
||||||
return dict;
|
return dict;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -238,48 +341,22 @@ function HOP(obj, prop) {
|
|||||||
// return true if the node at the top of the stack (that means the
|
// return true if the node at the top of the stack (that means the
|
||||||
// innermost node in the current output) is lexically the first in
|
// innermost node in the current output) is lexically the first in
|
||||||
// a statement.
|
// a statement.
|
||||||
function first_in_statement(stack, arrow, export_default) {
|
function first_in_statement(stack) {
|
||||||
var node = stack.parent(-1);
|
var node = stack.parent(-1);
|
||||||
for (var i = 0, p; p = stack.parent(i++); node = p) {
|
for (var i = 0, p; p = stack.parent(i); i++) {
|
||||||
if (is_arrow(p)) {
|
if (p instanceof AST_Statement && p.body === node)
|
||||||
return arrow && p.value === node;
|
|
||||||
} else if (p instanceof AST_Binary) {
|
|
||||||
if (p.left === node) continue;
|
|
||||||
} else if (p.TYPE == "Call") {
|
|
||||||
if (p.expression === node) continue;
|
|
||||||
} else if (p instanceof AST_Conditional) {
|
|
||||||
if (p.condition === node) continue;
|
|
||||||
} else if (p instanceof AST_ExportDefault) {
|
|
||||||
return export_default;
|
|
||||||
} else if (p instanceof AST_PropAccess) {
|
|
||||||
if (p.expression === node) continue;
|
|
||||||
} else if (p instanceof AST_Sequence) {
|
|
||||||
if (p.expressions[0] === node) continue;
|
|
||||||
} else if (p instanceof AST_SimpleStatement) {
|
|
||||||
return true;
|
return true;
|
||||||
} else if (p instanceof AST_Template) {
|
if ((p instanceof AST_Seq && p.car === node ) ||
|
||||||
if (p.tag === node) continue;
|
(p instanceof AST_Call && p.expression === node && !(p instanceof AST_New) ) ||
|
||||||
} else if (p instanceof AST_UnaryPostfix) {
|
(p instanceof AST_Dot && p.expression === node ) ||
|
||||||
if (p.expression === node) continue;
|
(p instanceof AST_Sub && p.expression === node ) ||
|
||||||
}
|
(p instanceof AST_Conditional && p.condition === node ) ||
|
||||||
|
(p instanceof AST_Binary && p.left === node ) ||
|
||||||
|
(p instanceof AST_UnaryPostfix && p.expression === node ))
|
||||||
|
{
|
||||||
|
node = p;
|
||||||
|
} else {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function DEF_BITPROPS(ctor, props) {
|
|
||||||
if (props.length > 31) throw new Error("Too many properties: " + props.length + "\n" + props.join(", "));
|
|
||||||
props.forEach(function(name, pos) {
|
|
||||||
var mask = 1 << pos;
|
|
||||||
Object.defineProperty(ctor.prototype, name, {
|
|
||||||
get: function() {
|
|
||||||
return !!(this._bits & mask);
|
|
||||||
},
|
|
||||||
set: function(val) {
|
|
||||||
if (val)
|
|
||||||
this._bits |= mask;
|
|
||||||
else
|
|
||||||
this._bits &= ~mask;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|||||||
58
package.json
58
package.json
@@ -1,17 +1,23 @@
|
|||||||
{
|
{
|
||||||
"name": "uglify-js",
|
"name": "uglify-js",
|
||||||
"description": "JavaScript parser, mangler/compressor and beautifier toolkit",
|
"description": "JavaScript parser, mangler/compressor and beautifier toolkit",
|
||||||
|
"homepage": "http://lisperator.net/uglifyjs",
|
||||||
"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.15.2",
|
"version": "2.8.21",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.8.0"
|
"node": ">=0.8.0"
|
||||||
},
|
},
|
||||||
"maintainers": [
|
"maintainers": [
|
||||||
"Alex Lam <alexlamsl@gmail.com>",
|
|
||||||
"Mihai Bazon <mihai.bazon@gmail.com> (http://lisperator.net/)"
|
"Mihai Bazon <mihai.bazon@gmail.com> (http://lisperator.net/)"
|
||||||
],
|
],
|
||||||
"repository": "mishoo/UglifyJS",
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/mishoo/UglifyJS2.git"
|
||||||
|
},
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/mishoo/UglifyJS2/issues"
|
||||||
|
},
|
||||||
"main": "tools/node.js",
|
"main": "tools/node.js",
|
||||||
"bin": {
|
"bin": {
|
||||||
"uglifyjs": "bin/uglifyjs"
|
"uglifyjs": "bin/uglifyjs"
|
||||||
@@ -22,35 +28,27 @@
|
|||||||
"tools",
|
"tools",
|
||||||
"LICENSE"
|
"LICENSE"
|
||||||
],
|
],
|
||||||
|
"dependencies": {
|
||||||
|
"source-map": "~0.5.1",
|
||||||
|
"yargs": "~3.10.0"
|
||||||
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"acorn": "~8.2.1",
|
"acorn": "~0.6.0",
|
||||||
"semver": "~6.3.0"
|
"escodegen": "~1.3.3",
|
||||||
|
"esfuzz": "~0.3.1",
|
||||||
|
"estraverse": "~1.5.1",
|
||||||
|
"mocha": "~2.3.4"
|
||||||
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"uglify-to-browserify": "~1.0.0"
|
||||||
|
},
|
||||||
|
"browserify": {
|
||||||
|
"transform": [
|
||||||
|
"uglify-to-browserify"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "node test/compress.js && node test/mocha.js"
|
"test": "node test/run-tests.js"
|
||||||
},
|
},
|
||||||
"keywords": [
|
"keywords": ["uglify", "uglify-js", "minify", "minifier"]
|
||||||
"cli",
|
|
||||||
"compress",
|
|
||||||
"compressor",
|
|
||||||
"ecma",
|
|
||||||
"ecmascript",
|
|
||||||
"es",
|
|
||||||
"es5",
|
|
||||||
"javascript",
|
|
||||||
"js",
|
|
||||||
"jsmin",
|
|
||||||
"min",
|
|
||||||
"minification",
|
|
||||||
"minifier",
|
|
||||||
"minify",
|
|
||||||
"optimize",
|
|
||||||
"optimizer",
|
|
||||||
"pack",
|
|
||||||
"packer",
|
|
||||||
"parse",
|
|
||||||
"parser",
|
|
||||||
"uglifier",
|
|
||||||
"uglify"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,46 +4,43 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
var createHash = require("crypto").createHash;
|
var createHash = require("crypto").createHash;
|
||||||
var fetch = require("./fetch");
|
var fork = require("child_process").fork;
|
||||||
var spawn = require("child_process").spawn;
|
|
||||||
var zlib = require("zlib");
|
|
||||||
var args = process.argv.slice(2);
|
var args = process.argv.slice(2);
|
||||||
if (!args.length) args.push("-mc");
|
if (!args.length) {
|
||||||
args.unshift("bin/uglifyjs");
|
args.push("-mc", "warnings=false");
|
||||||
args.push("--timings");
|
}
|
||||||
|
args.push("--stats");
|
||||||
var urls = [
|
var urls = [
|
||||||
"https://code.jquery.com/jquery-3.4.1.js",
|
"https://code.jquery.com/jquery-3.1.1.js",
|
||||||
"https://code.angularjs.org/1.7.8/angular.js",
|
"https://code.angularjs.org/1.6.1/angular.js",
|
||||||
"https://unpkg.com/mathjs@6.2.3/dist/math.js",
|
"https://cdnjs.cloudflare.com/ajax/libs/mathjs/3.9.0/math.js",
|
||||||
"https://unpkg.com/react@15.3.2/dist/react.js",
|
|
||||||
"https://cdnjs.cloudflare.com/ajax/libs/d3/6.7.0/d3.js",
|
|
||||||
"https://cdnjs.cloudflare.com/ajax/libs/antd/4.18.7/antd.js",
|
|
||||||
"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.js",
|
"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.js",
|
||||||
"https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js",
|
"https://unpkg.com/react@15.3.2/dist/react.js",
|
||||||
"https://cdnjs.cloudflare.com/ajax/libs/ember.js/2.12.2/ember.prod.js",
|
"http://builds.emberjs.com/tags/v2.11.0/ember.prod.js",
|
||||||
"https://raw.githubusercontent.com/kangax/html-minifier/v4.0.0/dist/htmlminifier.js",
|
"https://cdn.jsdelivr.net/lodash/4.17.4/lodash.js",
|
||||||
|
"https://cdnjs.cloudflare.com/ajax/libs/d3/4.5.0/d3.js",
|
||||||
];
|
];
|
||||||
var results = {};
|
var results = {};
|
||||||
var remaining = 2 * urls.length;
|
var remaining = 2 * urls.length;
|
||||||
function done() {
|
function done() {
|
||||||
if (!--remaining) {
|
if (!--remaining) {
|
||||||
var failures = [];
|
var failures = [];
|
||||||
var sum = { input: 0, output: 0, gzip: 0 };
|
|
||||||
urls.forEach(function(url) {
|
urls.forEach(function(url) {
|
||||||
var info = results[url];
|
var info = results[url];
|
||||||
console.log();
|
console.log();
|
||||||
console.log(url);
|
console.log(url);
|
||||||
console.log(info.log);
|
console.log(info.log);
|
||||||
|
var elapsed = 0;
|
||||||
|
info.log.replace(/: ([0-9]+\.[0-9]{3})s/g, function(match, time) {
|
||||||
|
elapsed += parseFloat(time);
|
||||||
|
});
|
||||||
|
console.log("Run-time:", elapsed.toFixed(3), "s");
|
||||||
console.log("Original:", info.input, "bytes");
|
console.log("Original:", info.input, "bytes");
|
||||||
console.log("Uglified:", info.output, "bytes");
|
console.log("Uglified:", info.output, "bytes");
|
||||||
console.log("GZipped: ", info.gzip, "bytes");
|
|
||||||
console.log("SHA1 sum:", info.sha1);
|
console.log("SHA1 sum:", info.sha1);
|
||||||
if (info.code) {
|
if (info.code) {
|
||||||
failures.push(url);
|
failures.push(url);
|
||||||
}
|
}
|
||||||
sum.input += info.input;
|
|
||||||
sum.output += info.output;
|
|
||||||
sum.gzip += info.gzip;
|
|
||||||
});
|
});
|
||||||
if (failures.length) {
|
if (failures.length) {
|
||||||
console.error("Benchmark failed:");
|
console.error("Benchmark failed:");
|
||||||
@@ -51,13 +48,6 @@ function done() {
|
|||||||
console.error(url);
|
console.error(url);
|
||||||
});
|
});
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
} else {
|
|
||||||
console.log();
|
|
||||||
console.log("Subtotal");
|
|
||||||
console.log();
|
|
||||||
console.log("Original:", sum.input, "bytes");
|
|
||||||
console.log("Uglified:", sum.output, "bytes");
|
|
||||||
console.log("GZipped: ", sum.gzip, "bytes");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -65,25 +55,17 @@ urls.forEach(function(url) {
|
|||||||
results[url] = {
|
results[url] = {
|
||||||
input: 0,
|
input: 0,
|
||||||
output: 0,
|
output: 0,
|
||||||
gzip: 0,
|
|
||||||
log: ""
|
log: ""
|
||||||
};
|
};
|
||||||
fetch(url, function(err, res) {
|
require(url.slice(0, url.indexOf(":"))).get(url, function(res) {
|
||||||
if (err) throw err;
|
var uglifyjs = fork("bin/uglifyjs", args, { silent: true });
|
||||||
var uglifyjs = spawn(process.argv[0], args, { silent: true });
|
|
||||||
res.on("data", function(data) {
|
res.on("data", function(data) {
|
||||||
results[url].input += data.length;
|
results[url].input += data.length;
|
||||||
}).pipe(uglifyjs.stdin);
|
}).pipe(uglifyjs.stdin);
|
||||||
var sha1 = createHash("sha1");
|
|
||||||
uglifyjs.stdout.on("data", function(data) {
|
uglifyjs.stdout.on("data", function(data) {
|
||||||
results[url].output += data.length;
|
results[url].output += data.length;
|
||||||
}).pipe(zlib.createGzip({
|
}).pipe(createHash("sha1")).on("data", function(data) {
|
||||||
level: zlib.Z_BEST_COMPRESSION
|
results[url].sha1 = data.toString("hex");
|
||||||
})).on("data", function(data) {
|
|
||||||
results[url].gzip += data.length;
|
|
||||||
sha1.update(data);
|
|
||||||
}).on("end", function() {
|
|
||||||
results[url].sha1 = sha1.digest("hex");
|
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
uglifyjs.stderr.setEncoding("utf8");
|
uglifyjs.stderr.setEncoding("utf8");
|
||||||
|
|||||||
461
test/compress.js
461
test/compress.js
@@ -1,461 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
|
|
||||||
require("../tools/tty");
|
|
||||||
|
|
||||||
var assert = require("assert");
|
|
||||||
var child_process = require("child_process");
|
|
||||||
var fs = require("fs");
|
|
||||||
var path = require("path");
|
|
||||||
var sandbox = require("./sandbox");
|
|
||||||
var semver = require("semver");
|
|
||||||
var U = require("./node");
|
|
||||||
|
|
||||||
var batch = 50;
|
|
||||||
var dir = path.resolve(path.dirname(module.filename), "compress");
|
|
||||||
if (process.argv.length > 3) {
|
|
||||||
var file = process.argv[2];
|
|
||||||
var start = process.argv[3] | 0;
|
|
||||||
var minify_options = require("./ufuzz/options.json").map(JSON.stringify);
|
|
||||||
var tests = parse_test(path.resolve(dir, file));
|
|
||||||
process.exit(Object.keys(tests).slice(start, start + batch).filter(function(name) {
|
|
||||||
return !test_case(tests[name]);
|
|
||||||
}).length);
|
|
||||||
} else {
|
|
||||||
var files = process.argv.length == 3 ? [ process.argv[2] ] : fs.readdirSync(dir).filter(function(name) {
|
|
||||||
return /\.js$/i.test(name);
|
|
||||||
});
|
|
||||||
var failures = 0;
|
|
||||||
var failed_files = Object.create(null);
|
|
||||||
(function next(file, start, length) {
|
|
||||||
if (start < length) {
|
|
||||||
child_process.spawn(process.argv[0], [ process.argv[1], file, start, batch ], {
|
|
||||||
stdio: [ "ignore", 1, 2 ]
|
|
||||||
}).on("exit", function(code) {
|
|
||||||
if (code) {
|
|
||||||
failures += code;
|
|
||||||
failed_files[file] = true;
|
|
||||||
}
|
|
||||||
next(file, start + batch, length);
|
|
||||||
});
|
|
||||||
} else if (file = files.shift()) {
|
|
||||||
log("--- {file}", { file: file });
|
|
||||||
start = 0;
|
|
||||||
length = Object.keys(parse_test(path.resolve(dir, file))).length;
|
|
||||||
next(file, start, length);
|
|
||||||
} else if (failures) {
|
|
||||||
console.error();
|
|
||||||
console.error("!!! Failed " + failures + " test case(s).");
|
|
||||||
console.error("!!! " + Object.keys(failed_files).join(", "));
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
|
|
||||||
function evaluate(code) {
|
|
||||||
if (code instanceof U.AST_Node) code = make_code(code, { beautify: true });
|
|
||||||
return new Function("return(" + code + ")")();
|
|
||||||
}
|
|
||||||
|
|
||||||
function log() {
|
|
||||||
console.log("%s", tmpl.apply(null, arguments));
|
|
||||||
}
|
|
||||||
|
|
||||||
function make_code(ast, options) {
|
|
||||||
var stream = U.OutputStream(options);
|
|
||||||
ast.print(stream);
|
|
||||||
return stream.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
function parse_test(file) {
|
|
||||||
var script = fs.readFileSync(file, "utf8");
|
|
||||||
try {
|
|
||||||
var ast = U.parse(script, {
|
|
||||||
filename: file
|
|
||||||
});
|
|
||||||
} catch (e) {
|
|
||||||
console.error("Caught error while parsing tests in " + file);
|
|
||||||
console.error(e);
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
var tests = Object.create(null);
|
|
||||||
var tw = new U.TreeWalker(function(node, descend) {
|
|
||||||
if (node instanceof U.AST_LabeledStatement
|
|
||||||
&& tw.parent() instanceof U.AST_Toplevel) {
|
|
||||||
var name = node.label.name;
|
|
||||||
if (name in tests) {
|
|
||||||
throw new Error('Duplicated test name "' + name + '" in ' + file);
|
|
||||||
}
|
|
||||||
tests[name] = get_one_test(name, node.body);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (!(node instanceof U.AST_Toplevel)) croak(node);
|
|
||||||
});
|
|
||||||
ast.walk(tw);
|
|
||||||
return tests;
|
|
||||||
|
|
||||||
function croak(node) {
|
|
||||||
throw new Error(tmpl("Can't understand test file {file} [{line},{col}]\n{code}", {
|
|
||||||
file: file,
|
|
||||||
line: node.start.line,
|
|
||||||
col: node.start.col,
|
|
||||||
code: make_code(node, { beautify: false })
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
function read_string(stat) {
|
|
||||||
if (stat.TYPE == "SimpleStatement") {
|
|
||||||
var body = stat.body;
|
|
||||||
switch(body.TYPE) {
|
|
||||||
case "String":
|
|
||||||
return body.value;
|
|
||||||
case "Array":
|
|
||||||
return body.elements.map(function(element) {
|
|
||||||
if (element.TYPE !== "String")
|
|
||||||
throw new Error("Should be array of strings");
|
|
||||||
return element.value;
|
|
||||||
}).join("\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
throw new Error("Should be string or array of strings");
|
|
||||||
}
|
|
||||||
|
|
||||||
function get_one_test(name, block) {
|
|
||||||
var test = { name: name, options: {} };
|
|
||||||
var tw = new U.TreeWalker(function(node, descend) {
|
|
||||||
if (node instanceof U.AST_Assign) {
|
|
||||||
if (!(node.left instanceof U.AST_SymbolRef)) {
|
|
||||||
croak(node);
|
|
||||||
}
|
|
||||||
var name = node.left.name;
|
|
||||||
test[name] = evaluate(node.right);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (node instanceof U.AST_LabeledStatement) {
|
|
||||||
var label = node.label;
|
|
||||||
assert.ok([
|
|
||||||
"input",
|
|
||||||
"expect",
|
|
||||||
"expect_exact",
|
|
||||||
"expect_warnings",
|
|
||||||
"expect_stdout",
|
|
||||||
"node_version",
|
|
||||||
].indexOf(label.name) >= 0, tmpl("Unsupported label {name} [{line},{col}]", {
|
|
||||||
name: label.name,
|
|
||||||
line: label.start.line,
|
|
||||||
col: label.start.col
|
|
||||||
}));
|
|
||||||
var stat = node.body;
|
|
||||||
if (label.name == "expect_exact" || label.name == "node_version") {
|
|
||||||
test[label.name] = read_string(stat);
|
|
||||||
} else if (label.name == "expect_stdout") {
|
|
||||||
var body = stat.body;
|
|
||||||
if (body instanceof U.AST_Boolean) {
|
|
||||||
test[label.name] = body.value;
|
|
||||||
} else if (body instanceof U.AST_Call) {
|
|
||||||
var ctor = global[body.expression.name];
|
|
||||||
assert.ok(ctor === Error || ctor.prototype instanceof Error, tmpl("Unsupported expect_stdout format [{line},{col}]", {
|
|
||||||
line: label.start.line,
|
|
||||||
col: label.start.col
|
|
||||||
}));
|
|
||||||
test[label.name] = ctor.apply(null, body.args.map(function(node) {
|
|
||||||
assert.ok(node instanceof U.AST_Constant, tmpl("Unsupported expect_stdout format [{line},{col}]", {
|
|
||||||
line: label.start.line,
|
|
||||||
col: label.start.col
|
|
||||||
}));
|
|
||||||
return node.value;
|
|
||||||
}));
|
|
||||||
} else {
|
|
||||||
test[label.name] = read_string(stat) + "\n";
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
test[label.name] = stat;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
block.walk(tw);
|
|
||||||
return test;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Try to reminify original input with standard options
|
|
||||||
// to see if it matches expect_stdout.
|
|
||||||
function reminify(orig_options, input_code, input_formatted, stdout) {
|
|
||||||
for (var i = 0; i < minify_options.length; i++) {
|
|
||||||
var options = JSON.parse(minify_options[i]);
|
|
||||||
if (options.compress) [
|
|
||||||
"keep_fargs",
|
|
||||||
"keep_fnames",
|
|
||||||
].forEach(function(name) {
|
|
||||||
if (name in orig_options) {
|
|
||||||
options.compress[name] = orig_options[name];
|
|
||||||
}
|
|
||||||
});
|
|
||||||
var options_formatted = JSON.stringify(options, null, 4);
|
|
||||||
options.validate = true;
|
|
||||||
var result = U.minify(input_code, options);
|
|
||||||
if (result.error) {
|
|
||||||
log([
|
|
||||||
"!!! failed input reminify",
|
|
||||||
"---INPUT---",
|
|
||||||
"{input}",
|
|
||||||
"---OPTIONS---",
|
|
||||||
"{options}",
|
|
||||||
"--ERROR---",
|
|
||||||
"{error}",
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
].join("\n"), {
|
|
||||||
input: input_formatted,
|
|
||||||
options: options_formatted,
|
|
||||||
error: result.error,
|
|
||||||
});
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
var toplevel = sandbox.has_toplevel(options);
|
|
||||||
var expected = stdout[toplevel ? 1 : 0];
|
|
||||||
var actual = sandbox.run_code(result.code, toplevel);
|
|
||||||
if (typeof expected != "string" && typeof actual != "string" && expected.name == actual.name) {
|
|
||||||
actual = expected;
|
|
||||||
}
|
|
||||||
if (!sandbox.same_stdout(expected, actual)) {
|
|
||||||
log([
|
|
||||||
"!!! failed running reminified input",
|
|
||||||
"---INPUT---",
|
|
||||||
"{input}",
|
|
||||||
"---OPTIONS---",
|
|
||||||
"{options}",
|
|
||||||
"---OUTPUT---",
|
|
||||||
"{output}",
|
|
||||||
"---EXPECTED {expected_type}---",
|
|
||||||
"{expected}",
|
|
||||||
"---ACTUAL {actual_type}---",
|
|
||||||
"{actual}",
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
].join("\n"), {
|
|
||||||
input: input_formatted,
|
|
||||||
options: options_formatted,
|
|
||||||
output: result.code,
|
|
||||||
expected_type: typeof expected == "string" ? "STDOUT" : "ERROR",
|
|
||||||
expected: expected,
|
|
||||||
actual_type: typeof actual == "string" ? "STDOUT" : "ERROR",
|
|
||||||
actual: actual,
|
|
||||||
});
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function test_case(test) {
|
|
||||||
log(" Running test [{name}]", { name: test.name });
|
|
||||||
U.AST_Node.enable_validation();
|
|
||||||
var output_options = test.beautify || {};
|
|
||||||
var expect;
|
|
||||||
if (test.expect) {
|
|
||||||
expect = make_code(to_toplevel(test.expect, test.mangle), output_options);
|
|
||||||
} else {
|
|
||||||
expect = test.expect_exact;
|
|
||||||
}
|
|
||||||
var input = to_toplevel(test.input, test.mangle);
|
|
||||||
var input_code = make_code(input);
|
|
||||||
var input_formatted = make_code(test.input, {
|
|
||||||
annotations: true,
|
|
||||||
beautify: true,
|
|
||||||
comments: "all",
|
|
||||||
keep_quoted_props: true,
|
|
||||||
quote_style: 3,
|
|
||||||
});
|
|
||||||
try {
|
|
||||||
input.validate_ast();
|
|
||||||
U.parse(input_code);
|
|
||||||
} catch (ex) {
|
|
||||||
log([
|
|
||||||
"!!! Cannot parse input",
|
|
||||||
"---INPUT---",
|
|
||||||
"{input}",
|
|
||||||
"--PARSE ERROR--",
|
|
||||||
"{error}",
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
].join("\n"), {
|
|
||||||
input: input_formatted,
|
|
||||||
error: ex,
|
|
||||||
});
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
var warnings_emitted = [];
|
|
||||||
if (test.expect_warnings) {
|
|
||||||
var expected_warnings = make_code(test.expect_warnings, {
|
|
||||||
beautify: false,
|
|
||||||
quote_style: 2, // force double quote to match JSON
|
|
||||||
});
|
|
||||||
U.AST_Node.log_function(function(text) {
|
|
||||||
warnings_emitted.push(text);
|
|
||||||
}, /"INFO: /.test(expected_warnings));
|
|
||||||
}
|
|
||||||
if (test.mangle && test.mangle.properties && test.mangle.properties.keep_quoted) {
|
|
||||||
var quoted_props = test.mangle.properties.reserved;
|
|
||||||
if (!Array.isArray(quoted_props)) quoted_props = [];
|
|
||||||
test.mangle.properties.reserved = 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(test.options, true);
|
|
||||||
var output = cmp.compress(input);
|
|
||||||
output.figure_out_scope(test.mangle);
|
|
||||||
if (test.mangle) {
|
|
||||||
output.compute_char_frequency(test.mangle);
|
|
||||||
output.mangle_names(test.mangle);
|
|
||||||
if (test.mangle.properties) U.mangle_properties(output, test.mangle.properties);
|
|
||||||
}
|
|
||||||
var output_code = make_code(output, output_options);
|
|
||||||
U.AST_Node.log_function();
|
|
||||||
if (expect != output_code) {
|
|
||||||
log([
|
|
||||||
"!!! failed",
|
|
||||||
"---INPUT---",
|
|
||||||
"{input}",
|
|
||||||
"---OUTPUT---",
|
|
||||||
"{output}",
|
|
||||||
"---EXPECTED---",
|
|
||||||
"{expected}",
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
].join("\n"), {
|
|
||||||
input: input_formatted,
|
|
||||||
output: output_code,
|
|
||||||
expected: expect
|
|
||||||
});
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
// expect == output
|
|
||||||
try {
|
|
||||||
output.validate_ast();
|
|
||||||
U.parse(output_code);
|
|
||||||
} catch (ex) {
|
|
||||||
log([
|
|
||||||
"!!! Test matched expected result but cannot parse output",
|
|
||||||
"---INPUT---",
|
|
||||||
"{input}",
|
|
||||||
"---OUTPUT---",
|
|
||||||
"{output}",
|
|
||||||
"--REPARSE ERROR--",
|
|
||||||
"{error}",
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
].join("\n"), {
|
|
||||||
input: input_formatted,
|
|
||||||
output: output_code,
|
|
||||||
error: ex,
|
|
||||||
});
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (test.expect_warnings) {
|
|
||||||
warnings_emitted = warnings_emitted.map(function(input) {
|
|
||||||
return input.split(process.cwd() + path.sep).join("").split(path.sep).join("/");
|
|
||||||
});
|
|
||||||
var actual_warnings = JSON.stringify(warnings_emitted);
|
|
||||||
if (expected_warnings != actual_warnings) {
|
|
||||||
log([
|
|
||||||
"!!! failed",
|
|
||||||
"---INPUT---",
|
|
||||||
"{input}",
|
|
||||||
"---EXPECTED WARNINGS---",
|
|
||||||
"{expected_warnings}",
|
|
||||||
"---ACTUAL WARNINGS---",
|
|
||||||
"{actual_warnings}",
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
].join("\n"), {
|
|
||||||
input: input_formatted,
|
|
||||||
expected_warnings: expected_warnings,
|
|
||||||
actual_warnings: actual_warnings,
|
|
||||||
});
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (test.expect_stdout && (!test.node_version || semver.satisfies(process.version, test.node_version))) {
|
|
||||||
var stdout = [ sandbox.run_code(input_code), sandbox.run_code(input_code, true) ];
|
|
||||||
var toplevel = sandbox.has_toplevel({
|
|
||||||
compress: test.options,
|
|
||||||
mangle: test.mangle
|
|
||||||
});
|
|
||||||
var actual = stdout[toplevel ? 1 : 0];
|
|
||||||
if (test.expect_stdout === true || test.expect_stdout instanceof Error && test.expect_stdout.name === actual.name) {
|
|
||||||
test.expect_stdout = actual;
|
|
||||||
}
|
|
||||||
if (!sandbox.same_stdout(test.expect_stdout, actual)) {
|
|
||||||
log([
|
|
||||||
"!!! Invalid input or expected stdout",
|
|
||||||
"---INPUT---",
|
|
||||||
"{input}",
|
|
||||||
"---EXPECTED {expected_type}---",
|
|
||||||
"{expected}",
|
|
||||||
"---ACTUAL {actual_type}---",
|
|
||||||
"{actual}",
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
].join("\n"), {
|
|
||||||
input: input_formatted,
|
|
||||||
expected_type: typeof test.expect_stdout == "string" ? "STDOUT" : "ERROR",
|
|
||||||
expected: test.expect_stdout,
|
|
||||||
actual_type: typeof actual == "string" ? "STDOUT" : "ERROR",
|
|
||||||
actual: actual,
|
|
||||||
});
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
actual = sandbox.run_code(output_code, toplevel);
|
|
||||||
if (!sandbox.same_stdout(test.expect_stdout, actual)) {
|
|
||||||
log([
|
|
||||||
"!!! failed",
|
|
||||||
"---INPUT---",
|
|
||||||
"{input}",
|
|
||||||
"---EXPECTED {expected_type}---",
|
|
||||||
"{expected}",
|
|
||||||
"---ACTUAL {actual_type}---",
|
|
||||||
"{actual}",
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
].join("\n"), {
|
|
||||||
input: input_formatted,
|
|
||||||
expected_type: typeof test.expect_stdout == "string" ? "STDOUT" : "ERROR",
|
|
||||||
expected: test.expect_stdout,
|
|
||||||
actual_type: typeof actual == "string" ? "STDOUT" : "ERROR",
|
|
||||||
actual: actual,
|
|
||||||
});
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!reminify(test.options, input_code, input_formatted, stdout)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function tmpl() {
|
|
||||||
return U.string_template.apply(null, arguments);
|
|
||||||
}
|
|
||||||
|
|
||||||
function to_toplevel(input, mangle_options) {
|
|
||||||
if (!(input instanceof U.AST_BlockStatement)) throw new Error("Unsupported input syntax");
|
|
||||||
var directive = true;
|
|
||||||
var offset = input.start.line;
|
|
||||||
var tokens = [];
|
|
||||||
var toplevel = new U.AST_Toplevel(input.transform(new U.TreeTransformer(function(node) {
|
|
||||||
if (U.push_uniq(tokens, node.start)) node.start.line -= offset;
|
|
||||||
if (!directive || node === input) return;
|
|
||||||
if (node instanceof U.AST_SimpleStatement && node.body instanceof U.AST_String) {
|
|
||||||
return new U.AST_Directive(node.body);
|
|
||||||
} else {
|
|
||||||
directive = false;
|
|
||||||
}
|
|
||||||
})));
|
|
||||||
toplevel.figure_out_scope(mangle_options);
|
|
||||||
return toplevel;
|
|
||||||
}
|
|
||||||
67
test/compress/angular-inject.js
vendored
Normal file
67
test/compress/angular-inject.js
vendored
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
ng_inject_defun: {
|
||||||
|
options = {
|
||||||
|
angular: true
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
/*@ngInject*/
|
||||||
|
function Controller(dependency) {
|
||||||
|
return dependency;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function Controller(dependency) {
|
||||||
|
return dependency;
|
||||||
|
}
|
||||||
|
Controller.$inject=['dependency']
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ng_inject_assignment: {
|
||||||
|
options = {
|
||||||
|
angular: true
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
/*@ngInject*/
|
||||||
|
var Controller = function(dependency) {
|
||||||
|
return dependency;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var Controller = function(dependency) {
|
||||||
|
return dependency;
|
||||||
|
}
|
||||||
|
Controller.$inject=['dependency']
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ng_inject_inline: {
|
||||||
|
options = {
|
||||||
|
angular: true
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
angular.module('a').
|
||||||
|
factory('b',
|
||||||
|
/*@ngInject*/
|
||||||
|
function(dependency) {
|
||||||
|
return dependency;
|
||||||
|
}).
|
||||||
|
directive('c',
|
||||||
|
/*@ngInject*/
|
||||||
|
function(anotherDependency) {
|
||||||
|
return anotherDependency;
|
||||||
|
})
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
angular.module('a').
|
||||||
|
factory('b',[
|
||||||
|
'dependency',
|
||||||
|
function(dependency) {
|
||||||
|
return dependency;
|
||||||
|
}]).
|
||||||
|
directive('c',[
|
||||||
|
'anotherDependency',
|
||||||
|
function(anotherDependency) {
|
||||||
|
return anotherDependency;
|
||||||
|
}])
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,474 +0,0 @@
|
|||||||
issue_2629_1: {
|
|
||||||
options = {
|
|
||||||
annotations: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
comments: "all",
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
/*@__PURE__*/ a();
|
|
||||||
/*@__PURE__*/ (b());
|
|
||||||
(/*@__PURE__*/ c)();
|
|
||||||
(/*@__PURE__*/ d());
|
|
||||||
}
|
|
||||||
expect_exact: "c();"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2629_2: {
|
|
||||||
options = {
|
|
||||||
annotations: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
comments: "all",
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
/*@__PURE__*/ a(1)(2)(3);
|
|
||||||
/*@__PURE__*/ (b(1))(2)(3);
|
|
||||||
/*@__PURE__*/ (c(1)(2))(3);
|
|
||||||
/*@__PURE__*/ (d(1)(2)(3));
|
|
||||||
(/*@__PURE__*/ e)(1)(2)(3);
|
|
||||||
(/*@__PURE__*/ f(1))(2)(3);
|
|
||||||
(/*@__PURE__*/ g(1)(2))(3);
|
|
||||||
(/*@__PURE__*/ h(1)(2)(3));
|
|
||||||
}
|
|
||||||
expect_exact: [
|
|
||||||
"e(1)(2)(3);",
|
|
||||||
"f(1)(2)(3);",
|
|
||||||
"g(1)(2)(3);",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2629_3: {
|
|
||||||
options = {
|
|
||||||
annotations: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
comments: "all",
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
/*@__PURE__*/ a.x(1).y(2).z(3);
|
|
||||||
/*@__PURE__*/ (b.x)(1).y(2).z(3);
|
|
||||||
/*@__PURE__*/ (c.x(1)).y(2).z(3);
|
|
||||||
/*@__PURE__*/ (d.x(1).y)(2).z(3);
|
|
||||||
/*@__PURE__*/ (e.x(1).y(2)).z(3);
|
|
||||||
/*@__PURE__*/ (f.x(1).y(2).z)(3);
|
|
||||||
/*@__PURE__*/ (g.x(1).y(2).z(3));
|
|
||||||
(/*@__PURE__*/ h).x(1).y(2).z(3);
|
|
||||||
(/*@__PURE__*/ i.x)(1).y(2).z(3);
|
|
||||||
(/*@__PURE__*/ j.x(1)).y(2).z(3);
|
|
||||||
(/*@__PURE__*/ k.x(1).y)(2).z(3);
|
|
||||||
(/*@__PURE__*/ l.x(1).y(2)).z(3);
|
|
||||||
(/*@__PURE__*/ m.x(1).y(2).z)(3);
|
|
||||||
(/*@__PURE__*/ n.x(1).y(2).z(3));
|
|
||||||
}
|
|
||||||
expect_exact: [
|
|
||||||
"h.x(1).y(2).z(3);",
|
|
||||||
"i.x(1).y(2).z(3);",
|
|
||||||
"j.x(1).y(2).z(3);",
|
|
||||||
"k.x(1).y(2).z(3);",
|
|
||||||
"l.x(1).y(2).z(3);",
|
|
||||||
"m.x(1).y(2).z(3);",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2629_4: {
|
|
||||||
options = {
|
|
||||||
annotations: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(/*@__PURE__*/ x(), y());
|
|
||||||
(w(), /*@__PURE__*/ x(), y());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
y();
|
|
||||||
w(), y();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2629_5: {
|
|
||||||
options = {
|
|
||||||
annotations: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
[ /*@__PURE__*/ x() ];
|
|
||||||
[ /*@__PURE__*/ x(), y() ];
|
|
||||||
[ w(), /*@__PURE__*/ x(), y() ];
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
y();
|
|
||||||
w(), y();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2638: {
|
|
||||||
options = {
|
|
||||||
annotations: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
comments: "all",
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
/*@__PURE__*/(g() || h())(x(), y());
|
|
||||||
(/*@__PURE__*/ (a() || b()))(c(), d());
|
|
||||||
}
|
|
||||||
expect_exact: [
|
|
||||||
"x(),y();",
|
|
||||||
"(a()||b())(c(),d());",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2705_1: {
|
|
||||||
options = {
|
|
||||||
annotations: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
comments: "all",
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
/*@__PURE__*/ new a();
|
|
||||||
/*@__PURE__*/ (new b());
|
|
||||||
new (/*@__PURE__*/ c)();
|
|
||||||
(/*@__PURE__*/ new d());
|
|
||||||
}
|
|
||||||
expect_exact: [
|
|
||||||
"new c;",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2705_2: {
|
|
||||||
options = {
|
|
||||||
annotations: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
comments: "all",
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
/*@__PURE__*/ new a(1)(2)(3);
|
|
||||||
/*@__PURE__*/ new (b(1))(2)(3);
|
|
||||||
/*@__PURE__*/ new (c(1)(2))(3);
|
|
||||||
/*@__PURE__*/ new (d(1)(2)(3));
|
|
||||||
new (/*@__PURE__*/ e)(1)(2)(3);
|
|
||||||
(/*@__PURE__*/ new f(1))(2)(3);
|
|
||||||
(/*@__PURE__*/ new g(1)(2))(3);
|
|
||||||
(/*@__PURE__*/ new h(1)(2)(3));
|
|
||||||
}
|
|
||||||
expect_exact: [
|
|
||||||
"new e(1)(2)(3);",
|
|
||||||
"new f(1)(2)(3);",
|
|
||||||
"new g(1)(2)(3);",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2705_3: {
|
|
||||||
options = {
|
|
||||||
annotations: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
comments: "all",
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
/*@__PURE__*/ new a.x(1).y(2).z(3);
|
|
||||||
/*@__PURE__*/ new (b.x)(1).y(2).z(3);
|
|
||||||
/*@__PURE__*/ new (c.x(1)).y(2).z(3);
|
|
||||||
/*@__PURE__*/ new (d.x(1).y)(2).z(3);
|
|
||||||
/*@__PURE__*/ new (e.x(1).y(2)).z(3);
|
|
||||||
/*@__PURE__*/ new (f.x(1).y(2).z)(3);
|
|
||||||
/*@__PURE__*/ new (g.x(1).y(2).z(3));
|
|
||||||
new (/*@__PURE__*/ h).x(1).y(2).z(3);
|
|
||||||
/* */ new (/*@__PURE__*/ i.x)(1).y(2).z(3);
|
|
||||||
(/*@__PURE__*/ new j.x(1)).y(2).z(3);
|
|
||||||
(/*@__PURE__*/ new k.x(1).y)(2).z(3);
|
|
||||||
(/*@__PURE__*/ new l.x(1).y(2)).z(3);
|
|
||||||
(/*@__PURE__*/ new m.x(1).y(2).z)(3);
|
|
||||||
(/*@__PURE__*/ new n.x(1).y(2).z(3));
|
|
||||||
}
|
|
||||||
expect_exact: [
|
|
||||||
"new h.x(1).y(2).z(3);",
|
|
||||||
"/* */new i.x(1).y(2).z(3);",
|
|
||||||
"new j.x(1).y(2).z(3);",
|
|
||||||
"new k.x(1).y(2).z(3);",
|
|
||||||
"new l.x(1).y(2).z(3);",
|
|
||||||
"new m.x(1).y(2).z(3);",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2705_4: {
|
|
||||||
options = {
|
|
||||||
annotations: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(/*@__PURE__*/ new x(), y());
|
|
||||||
(w(), /*@__PURE__*/ new x(), y());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
y();
|
|
||||||
w(), y();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2705_5: {
|
|
||||||
options = {
|
|
||||||
annotations: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
[ /*@__PURE__*/ new x() ];
|
|
||||||
[ /*@__PURE__*/ new x(), y() ];
|
|
||||||
[ w(), /*@__PURE__*/ new x(), y() ];
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
y();
|
|
||||||
w(), y();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2705_6: {
|
|
||||||
options = {
|
|
||||||
annotations: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
comments: "all",
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
/*@__PURE__*/new (g() || h())(x(), y());
|
|
||||||
/* */ new (/*@__PURE__*/ (a() || b()))(c(), d());
|
|
||||||
}
|
|
||||||
expect_exact: [
|
|
||||||
"x(),y();",
|
|
||||||
"/* */new(a()||b())(c(),d());",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_3858: {
|
|
||||||
options = {
|
|
||||||
annotations: true,
|
|
||||||
collapse_vars: true,
|
|
||||||
inline: true,
|
|
||||||
keep_fargs: false,
|
|
||||||
unsafe: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var f = function(a) {
|
|
||||||
return /*@__PURE__*/ function(b) {
|
|
||||||
console.log(b);
|
|
||||||
}(a);
|
|
||||||
};
|
|
||||||
f("PASS");
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var f = function(a) {
|
|
||||||
return function() {
|
|
||||||
console.log(a);
|
|
||||||
}();
|
|
||||||
};
|
|
||||||
f("PASS");
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
inline_pure_call_1: {
|
|
||||||
options = {
|
|
||||||
annotations: true,
|
|
||||||
collapse_vars: true,
|
|
||||||
inline: true,
|
|
||||||
keep_fargs: false,
|
|
||||||
reduce_vars: true,
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var f = function(a) {
|
|
||||||
return /*@__PURE__*/ function(b) {
|
|
||||||
console.log(b);
|
|
||||||
}(a);
|
|
||||||
};
|
|
||||||
f("PASS");
|
|
||||||
}
|
|
||||||
expect: {}
|
|
||||||
}
|
|
||||||
|
|
||||||
inline_pure_call_2: {
|
|
||||||
options = {
|
|
||||||
annotations: true,
|
|
||||||
collapse_vars: true,
|
|
||||||
inline: true,
|
|
||||||
keep_fargs: false,
|
|
||||||
reduce_vars: true,
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var f = function(a) {
|
|
||||||
return /*@__PURE__*/ function(b) {
|
|
||||||
console.log(b);
|
|
||||||
}(a);
|
|
||||||
};
|
|
||||||
var a = f("PASS");
|
|
||||||
}
|
|
||||||
expect: {}
|
|
||||||
}
|
|
||||||
|
|
||||||
inline_pure_call_3: {
|
|
||||||
options = {
|
|
||||||
annotations: true,
|
|
||||||
collapse_vars: true,
|
|
||||||
evaluate: true,
|
|
||||||
inline: true,
|
|
||||||
keep_fargs: false,
|
|
||||||
passes: 2,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var f = function(a) {
|
|
||||||
return /*@__PURE__*/ function(b) {
|
|
||||||
console.log(b);
|
|
||||||
}(a);
|
|
||||||
};
|
|
||||||
var a = f("PASS");
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = function() {
|
|
||||||
console.log("PASS");
|
|
||||||
}();
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"PASS",
|
|
||||||
"undefined",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
inline_pure_call_4: {
|
|
||||||
options = {
|
|
||||||
annotations: true,
|
|
||||||
evaluate: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = /*@__PURE__*/ function() {
|
|
||||||
return console.log("PASS"), 42;
|
|
||||||
}();
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = function() {
|
|
||||||
return console.log("PASS"), 42;
|
|
||||||
}();
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"PASS",
|
|
||||||
"42",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
compress_and_output_annotations_enabled: {
|
|
||||||
options = {
|
|
||||||
annotations: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
annotations: true,
|
|
||||||
beautify: true,
|
|
||||||
comments: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var top = /*@__PURE__*/ foo();
|
|
||||||
/*@__PURE__*/ a(1)(2)(3);
|
|
||||||
/*@__PURE__*/ (b(1))(2)(3);
|
|
||||||
/*@__PURE__*/ (c(1)(2))(3);
|
|
||||||
/*@__PURE__*/ (d(1)(2)(3));
|
|
||||||
(/*@__PURE__*/ e)(1)(2)(3);
|
|
||||||
(/*@__PURE__*/ f(1))(2)(3);
|
|
||||||
(/*@__PURE__*/ g(1)(2))(3);
|
|
||||||
(/*@__PURE__*/ h(1)(2)(3));
|
|
||||||
/*@__PURE__*/ l(1).p(2);
|
|
||||||
(/*@__PURE__*/ m(1)).p(2);
|
|
||||||
(/*@__PURE__*/ n(1).p)(2);
|
|
||||||
(/*@__PURE__*/ o(1).p(2));
|
|
||||||
}
|
|
||||||
expect_exact: [
|
|
||||||
"var top = /*@__PURE__*/foo();",
|
|
||||||
"",
|
|
||||||
"e(1)(2)(3);",
|
|
||||||
"",
|
|
||||||
"f(1)(2)(3);",
|
|
||||||
"",
|
|
||||||
"g(1)(2)(3);",
|
|
||||||
"",
|
|
||||||
"m(1).p(2);",
|
|
||||||
"",
|
|
||||||
"n(1).p(2);",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
compress_annotations_disabled_output_annotations_enabled: {
|
|
||||||
options = {
|
|
||||||
annotations: false,
|
|
||||||
evaluate: true,
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
annotations: true,
|
|
||||||
comments: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
/*@__PURE__*/ a(1+2);
|
|
||||||
/*#__PURE__*/ (b(2+3));
|
|
||||||
(/*@__PURE__*/ c)(side_effect);
|
|
||||||
(/*#__PURE__*/ d(effect()));
|
|
||||||
}
|
|
||||||
expect_exact: [
|
|
||||||
"/*@__PURE__*/a(3),",
|
|
||||||
"/*@__PURE__*/b(5),",
|
|
||||||
"c(side_effect),",
|
|
||||||
"/*@__PURE__*/d(effect());",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
compress_and_output_annotations_disabled: {
|
|
||||||
options = {
|
|
||||||
annotations: false,
|
|
||||||
evaluate: true,
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
annotations: false,
|
|
||||||
comments: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
/*@__PURE__*/ a(1+2);
|
|
||||||
/*@__PURE__*/ (b(2+3));
|
|
||||||
(/*@__PURE__*/ c)(side_effect);
|
|
||||||
(/*@__PURE__*/ d(effect()));
|
|
||||||
}
|
|
||||||
expect_exact: [
|
|
||||||
"a(3),",
|
|
||||||
"b(5),",
|
|
||||||
"c(side_effect),",
|
|
||||||
"d(effect());",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,3 +1,5 @@
|
|||||||
|
// NOTE trailing comma doesn't contribute to length of an array
|
||||||
|
// That also means the array changes length if previous element is a hole too and got cut off
|
||||||
holes_and_undefined: {
|
holes_and_undefined: {
|
||||||
input: {
|
input: {
|
||||||
w = [1,,];
|
w = [1,,];
|
||||||
@@ -13,13 +15,11 @@ holes_and_undefined: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
constant_join_1: {
|
constant_join: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
unsafe : true,
|
||||||
side_effects: true,
|
evaluate : true
|
||||||
strings: true,
|
};
|
||||||
unsafe: true,
|
|
||||||
}
|
|
||||||
input: {
|
input: {
|
||||||
var a = [ "foo", "bar", "baz" ].join("");
|
var a = [ "foo", "bar", "baz" ].join("");
|
||||||
var a1 = [ "foo", "bar", "baz" ].join();
|
var a1 = [ "foo", "bar", "baz" ].join();
|
||||||
@@ -58,7 +58,7 @@ constant_join_1: {
|
|||||||
var c5 = [ boo() + bar() + "foo", 1, 2, 3, "bar", bar() + "foo" ].join();
|
var c5 = [ boo() + bar() + "foo", 1, 2, 3, "bar", bar() + "foo" ].join();
|
||||||
var c6 = [ "1,2,,,foo,bar", baz() ].join();
|
var c6 = [ "1,2,,,foo,bar", baz() ].join();
|
||||||
var d = "foo-3bar-baz";
|
var d = "foo-3bar-baz";
|
||||||
var e = (foo, bar, "");
|
var e = [].join(foo + bar);
|
||||||
var f = "";
|
var f = "";
|
||||||
var g = "";
|
var g = "";
|
||||||
}
|
}
|
||||||
@@ -66,10 +66,9 @@ constant_join_1: {
|
|||||||
|
|
||||||
constant_join_2: {
|
constant_join_2: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
unsafe : true,
|
||||||
strings: true,
|
evaluate : true
|
||||||
unsafe: true,
|
};
|
||||||
}
|
|
||||||
input: {
|
input: {
|
||||||
var a = [ "foo", "bar", boo(), "baz", "x", "y" ].join("");
|
var a = [ "foo", "bar", boo(), "baz", "x", "y" ].join("");
|
||||||
var b = [ "foo", "bar", boo(), "baz", "x", "y" ].join("-");
|
var b = [ "foo", "bar", boo(), "baz", "x", "y" ].join("-");
|
||||||
@@ -94,14 +93,85 @@ constant_join_2: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
spread_with_variable_as_last_element: {
|
||||||
|
input: {
|
||||||
|
var values = [4, 5, 6];
|
||||||
|
var a = [1, 2, 3, ...values];
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var values = [4, 5, 6];
|
||||||
|
var a = [1, 2, 3, ...values];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
spread_with_variable_in_middle: {
|
||||||
|
input: {
|
||||||
|
var values = [4, 5, 6];
|
||||||
|
var a = [1, 2, 3, ...values, 7,,,];
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var values = [4, 5, 6];
|
||||||
|
var a = [1, 2, 3, ...values, 7,,,];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
spread_with_variable_at_front: {
|
||||||
|
input: {
|
||||||
|
var values = [1, 2, 3];
|
||||||
|
var a = [...values, 4, 5, 6];
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var values = [1, 2, 3];
|
||||||
|
var a = [...values, 4, 5, 6];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
spread_with_variable_at_front_after_elisions: {
|
||||||
|
input: {
|
||||||
|
var values = [1, 2, 3];
|
||||||
|
var a = [,,,...values, 4, 5, 6];
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var values = [1, 2, 3];
|
||||||
|
var a = [,,,...values, 4, 5, 6];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
spread_with_array_at_end: {
|
||||||
|
input: {
|
||||||
|
var a = [1, 2, ...[4, 5, 6]];
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = [1, 2, ...[4, 5, 6]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
spread_with_logical_expression_at_end: {
|
||||||
|
options = { evaluate: true }
|
||||||
|
input: {
|
||||||
|
var a = [1, 2, 3, ...[2+2]]
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = [1, 2, 3, ...[4]]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
spread_with_logical_expression_at_middle: {
|
||||||
|
options = { evaluate: true }
|
||||||
|
input: {
|
||||||
|
var a = [1, 1, ...[1+1, 1+2, 2+3], 8]
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = [1, 1, ...[2, 3, 5], 8]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
constant_join_3: {
|
constant_join_3: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
|
||||||
strings: true,
|
|
||||||
unsafe: true,
|
unsafe: true,
|
||||||
}
|
evaluate: true,
|
||||||
|
};
|
||||||
input: {
|
input: {
|
||||||
var foo, bar, baz;
|
|
||||||
var a = [ null ].join();
|
var a = [ null ].join();
|
||||||
var b = [ , ].join();
|
var b = [ , ].join();
|
||||||
var c = [ , 1, , 3 ].join();
|
var c = [ , 1, , 3 ].join();
|
||||||
@@ -116,7 +186,6 @@ constant_join_3: {
|
|||||||
var l = [ foo, bar + "baz" ].join("");
|
var l = [ foo, bar + "baz" ].join("");
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var foo, bar, baz;
|
|
||||||
var a = "";
|
var a = "";
|
||||||
var b = "";
|
var b = "";
|
||||||
var c = ",1,,3";
|
var c = ",1,,3";
|
||||||
@@ -134,293 +203,50 @@ constant_join_3: {
|
|||||||
|
|
||||||
for_loop: {
|
for_loop: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
unsafe : true,
|
||||||
reduce_funcs: true,
|
unused : true,
|
||||||
reduce_vars: true,
|
evaluate : true,
|
||||||
unsafe: true,
|
reduce_vars : true
|
||||||
unused: true,
|
};
|
||||||
}
|
|
||||||
input: {
|
input: {
|
||||||
function f0() {
|
function f0() {
|
||||||
var a = [1, 2, 3];
|
var a = [1, 2, 3];
|
||||||
var b = 0;
|
for (var i = 0; i < a.length; i++) {
|
||||||
for (var i = 0; i < a.length; i++)
|
console.log(a[i]);
|
||||||
b += a[i];
|
|
||||||
return b;
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function f1() {
|
function f1() {
|
||||||
var a = [1, 2, 3];
|
var a = [1, 2, 3];
|
||||||
var b = 0;
|
for (var i = 0, len = a.length; i < len; i++) {
|
||||||
for (var i = 0, len = a.length; i < len; i++)
|
console.log(a[i]);
|
||||||
b += a[i];
|
|
||||||
return b;
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
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: {
|
expect: {
|
||||||
function f0() {
|
function f0() {
|
||||||
var a = [1, 2, 3];
|
var a = [1, 2, 3];
|
||||||
var b = 0;
|
|
||||||
for (var i = 0; i < 3; i++)
|
for (var i = 0; i < 3; i++)
|
||||||
b += a[i];
|
console.log(a[i]);
|
||||||
return b;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function f1() {
|
function f1() {
|
||||||
var a = [1, 2, 3];
|
var a = [1, 2, 3];
|
||||||
var b = 0;
|
|
||||||
for (var i = 0; i < 3; i++)
|
for (var i = 0; i < 3; i++)
|
||||||
b += a[i];
|
console.log(a[i]);
|
||||||
return b;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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_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"
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor_bad: {
|
|
||||||
options = {
|
|
||||||
unsafe: true
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
try {
|
|
||||||
Array(NaN);
|
|
||||||
console.log("FAIL1");
|
|
||||||
} catch (ex) {
|
|
||||||
try {
|
|
||||||
new Array(NaN);
|
|
||||||
console.log("FAIL2");
|
|
||||||
} catch (ex) {
|
|
||||||
console.log("PASS");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
Array(3.14);
|
|
||||||
console.log("FAIL1");
|
|
||||||
} catch (ex) {
|
|
||||||
try {
|
|
||||||
new Array(3.14);
|
|
||||||
console.log("FAIL2");
|
|
||||||
} catch (ex) {
|
|
||||||
console.log("PASS");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
try {
|
|
||||||
Array(NaN);
|
|
||||||
console.log("FAIL1");
|
|
||||||
} catch (ex) {
|
|
||||||
try {
|
|
||||||
Array(NaN);
|
|
||||||
console.log("FAIL2");
|
|
||||||
} catch (ex) {
|
|
||||||
console.log("PASS");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
Array(3.14);
|
|
||||||
console.log("FAIL1");
|
|
||||||
} catch (ex) {
|
|
||||||
try {
|
|
||||||
Array(3.14);
|
|
||||||
console.log("FAIL2");
|
|
||||||
} catch (ex) {
|
|
||||||
console.log("PASS");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"PASS",
|
|
||||||
"PASS",
|
|
||||||
]
|
|
||||||
expect_warnings: [
|
|
||||||
"WARN: Invalid array length: 3.14 [test/compress/arrays.js:13,12]",
|
|
||||||
"WARN: Invalid array length: 3.14 [test/compress/arrays.js:17,16]",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor_good: {
|
|
||||||
options = {
|
|
||||||
unsafe: true
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(Array());
|
|
||||||
console.log(Array(0));
|
|
||||||
console.log(Array(1));
|
|
||||||
console.log(Array(6));
|
|
||||||
console.log(Array(7));
|
|
||||||
console.log(Array(1, 2));
|
|
||||||
console.log(Array(false));
|
|
||||||
console.log(Array("foo"));
|
|
||||||
console.log(Array(Array));
|
|
||||||
console.log(new Array());
|
|
||||||
console.log(new Array(0));
|
|
||||||
console.log(new Array(1));
|
|
||||||
console.log(new Array(6));
|
|
||||||
console.log(new Array(7));
|
|
||||||
console.log(new Array(1, 2));
|
|
||||||
console.log(new Array(false));
|
|
||||||
console.log(new Array("foo"));
|
|
||||||
console.log(new Array(Array));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log([]);
|
|
||||||
console.log([]);
|
|
||||||
console.log([,]);
|
|
||||||
console.log([,,,,,,]);
|
|
||||||
console.log(Array(7));
|
|
||||||
console.log([ 1, 2 ]);
|
|
||||||
console.log([ false ]);
|
|
||||||
console.log([ "foo" ]);
|
|
||||||
console.log(Array(Array));
|
|
||||||
console.log([]);
|
|
||||||
console.log([]);
|
|
||||||
console.log([,]);
|
|
||||||
console.log([,,,,,,]);
|
|
||||||
console.log(Array(7));
|
|
||||||
console.log([ 1, 2 ]);
|
|
||||||
console.log([ false ]);
|
|
||||||
console.log([ "foo" ]);
|
|
||||||
console.log(Array(Array));
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
expect_warnings: []
|
|
||||||
}
|
|
||||||
|
|
||||||
unsafe_evaluate_modified_binary: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
unsafe: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function(a) {
|
|
||||||
(console && a).push(1);
|
|
||||||
if (a.length)
|
|
||||||
console.log("PASS");
|
|
||||||
})([]);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(function(a) {
|
|
||||||
(console && a).push(1);
|
|
||||||
if (a.length)
|
|
||||||
console.log("PASS");
|
|
||||||
})([]);
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
unsafe_evaluate_modified_conditional: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
unsafe: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function(a) {
|
|
||||||
(console ? a : []).push(1);
|
|
||||||
if (a.length)
|
|
||||||
console.log("PASS");
|
|
||||||
})([]);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(function(a) {
|
|
||||||
(console ? a : []).push(1);
|
|
||||||
if (a.length)
|
|
||||||
console.log("PASS");
|
|
||||||
})([]);
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
unsafe_evaluate_modified_sequence: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
unsafe: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function(a) {
|
|
||||||
(0, a).push(1);
|
|
||||||
if (a.length)
|
|
||||||
console.log("PASS");
|
|
||||||
})([]);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(function(a) {
|
|
||||||
(0, a).push(1);
|
|
||||||
if (a.length)
|
|
||||||
console.log("PASS");
|
|
||||||
})([]);
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
}
|
||||||
|
|||||||
137
test/compress/arrow.js
Normal file
137
test/compress/arrow.js
Normal file
@@ -0,0 +1,137 @@
|
|||||||
|
arrow_functions_without_body: {
|
||||||
|
input: {
|
||||||
|
var a1 = () => 42;
|
||||||
|
var a2 = (p) => p;
|
||||||
|
var a3 = p => p;
|
||||||
|
var a4 = (...p) => p;
|
||||||
|
var a5 = (b, c) => b + c;
|
||||||
|
var a6 = (b, ...c) => b + c[0];
|
||||||
|
var a7 = (...b) => b.join();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a1 = () => 42;
|
||||||
|
var a2 = (p) => p;
|
||||||
|
var a3 = p => p;
|
||||||
|
var a4 = (...p) => p;
|
||||||
|
var a5 = (b, c) => b + c;
|
||||||
|
var a6 = (b, ...c) => b + c[0];
|
||||||
|
var a7 = (...b) => b.join();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
arrow_functions_with_body: {
|
||||||
|
input: {
|
||||||
|
var a1 = () => {
|
||||||
|
var a = 42 * Math.random();
|
||||||
|
return a;
|
||||||
|
};
|
||||||
|
var a2 = (p) => {
|
||||||
|
var a = Math.random() * p;
|
||||||
|
return a;
|
||||||
|
};
|
||||||
|
var a3 = p => {
|
||||||
|
var a = Math.random() * p;
|
||||||
|
return a;
|
||||||
|
};
|
||||||
|
var a4 = (...p) => {
|
||||||
|
var a = Math.random() * p;
|
||||||
|
return a;
|
||||||
|
};
|
||||||
|
var a5 = (b, c) => {
|
||||||
|
var result = b * c + b / c;
|
||||||
|
return result
|
||||||
|
};
|
||||||
|
var a6 = (b, ...c) => {
|
||||||
|
var result = b;
|
||||||
|
for (var i = 0; i < c.length; i++)
|
||||||
|
result += c[i];
|
||||||
|
return result
|
||||||
|
};
|
||||||
|
var a7 = (...b) => {
|
||||||
|
b.join();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a1 = () => {
|
||||||
|
var a = 42 * Math.random();
|
||||||
|
return a;
|
||||||
|
};
|
||||||
|
var a2 = (p) => {
|
||||||
|
var a = Math.random() * p;
|
||||||
|
return a;
|
||||||
|
};
|
||||||
|
var a3 = p => {
|
||||||
|
var a = Math.random() * p;
|
||||||
|
return a;
|
||||||
|
};
|
||||||
|
var a4 = (...p) => {
|
||||||
|
var a = Math.random() * p;
|
||||||
|
return a;
|
||||||
|
};
|
||||||
|
var a5 = (b, c) => {
|
||||||
|
var result = b * c + b / c;
|
||||||
|
return result
|
||||||
|
};
|
||||||
|
var a6 = (b, ...c) => {
|
||||||
|
var result = b;
|
||||||
|
for (var i = 0; i < c.length; i++)
|
||||||
|
result += c[i];
|
||||||
|
return result
|
||||||
|
};
|
||||||
|
var a7 = (...b) => {
|
||||||
|
b.join();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
arrow_function_with_single_parameter_with_default: {
|
||||||
|
input: {
|
||||||
|
var foo = (a = 0) => doSomething(a);
|
||||||
|
}
|
||||||
|
expect_exact: "var foo=(a=0)=>doSomething(a);"
|
||||||
|
}
|
||||||
|
|
||||||
|
arrow_binding_pattern: {
|
||||||
|
input: {
|
||||||
|
var foo = ([]) => "foo";
|
||||||
|
var bar = ({}) => "bar";
|
||||||
|
var with_default = (foo = "default") => foo;
|
||||||
|
var object_with_default = ({foo = "default", bar: baz = "default"}) => foo;
|
||||||
|
var array_after_spread = (...[foo]) => foo;
|
||||||
|
var array_after_spread = (...{foo}) => foo;
|
||||||
|
var computed = ({ [compute()]: x }) => {};
|
||||||
|
var array_hole = ([, , ...x] = [1, 2]) => {};
|
||||||
|
var object_trailing_elision = ({foo,}) => {};
|
||||||
|
var spread_empty_array = (...[]) => "foo";
|
||||||
|
var spread_empty_object = (...{}) => "foo";
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var foo = ([]) => "foo";
|
||||||
|
var bar = ({}) => "bar";
|
||||||
|
var with_default = (foo = "default") => foo;
|
||||||
|
var object_with_default = ({foo = "default", bar: baz = "default"}) => foo;
|
||||||
|
var array_after_spread = (...[foo]) => foo;
|
||||||
|
var array_after_spread = (...{foo}) => foo;
|
||||||
|
var computed = ({ [compute()]: x }) => {};
|
||||||
|
var array_hole = ([, , ...x] = [1, 2]) => {};
|
||||||
|
var object_trailing_elision = ({foo,}) => {};
|
||||||
|
var spread_empty_array = (...[]) => "foo";
|
||||||
|
var spread_empty_object = (...{}) => "foo";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
arrow_binding_pattern_strict: {
|
||||||
|
input: {
|
||||||
|
var foo = ([,]) => "foo";
|
||||||
|
}
|
||||||
|
expect_exact: 'var foo=([,])=>"foo";'
|
||||||
|
}
|
||||||
|
|
||||||
|
arrow_with_regexp: {
|
||||||
|
input: {
|
||||||
|
num => /\d{11,14}/.test( num )
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
num => /\d{11,14}/.test( num )
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
36
test/compress/ascii.js
Normal file
36
test/compress/ascii.js
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
ascii_only_true: {
|
||||||
|
options = {}
|
||||||
|
beautify = {
|
||||||
|
ascii_only : true,
|
||||||
|
screw_ie8 : true,
|
||||||
|
beautify : false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
return "\x000\x001\x007\x008\x00" +
|
||||||
|
"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" +
|
||||||
|
"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" +
|
||||||
|
"\x20\x21\x22\x23 ... \x7d\x7e\x7f\x80\x81 ... \xfe\xff\u0fff\uffff";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: 'function f(){return"\\x000\\x001\\x007\\08\\0"+"\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\b\\t\\n\\v\\f\\r\\x0e\\x0f"+"\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f"+\' !"# ... }~\\x7f\\x80\\x81 ... \\xfe\\xff\\u0fff\\uffff\'}'
|
||||||
|
}
|
||||||
|
|
||||||
|
ascii_only_false: {
|
||||||
|
options = {}
|
||||||
|
beautify = {
|
||||||
|
ascii_only : false,
|
||||||
|
screw_ie8 : true,
|
||||||
|
beautify : false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
return "\x000\x001\x007\x008\x00" +
|
||||||
|
"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" +
|
||||||
|
"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" +
|
||||||
|
"\x20\x21\x22\x23 ... \x7d\x7e\x7f\x80\x81 ... \xfe\xff\u0fff\uffff";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: 'function f(){return"\\x000\\x001\\x007\\08\\0"+"\\0\x01\x02\x03\x04\x05\x06\x07\\b\\t\\n\\v\\f\\r\x0e\x0f"+"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"+\' !"# ... }~\x7f\x80\x81 ... \xfe\xff\u0fff\uffff\'}'
|
||||||
|
}
|
||||||
|
|
||||||
@@ -1,25 +1,25 @@
|
|||||||
asm_mixed: {
|
asm_mixed: {
|
||||||
options = {
|
options = {
|
||||||
assignments: true,
|
sequences : true,
|
||||||
booleans: true,
|
properties : true,
|
||||||
comparisons: true,
|
dead_code : true,
|
||||||
conditionals: true,
|
drop_debugger : true,
|
||||||
dead_code: true,
|
conditionals : true,
|
||||||
drop_debugger: true,
|
comparisons : true,
|
||||||
evaluate: true,
|
evaluate : true,
|
||||||
hoist_funs: true,
|
booleans : true,
|
||||||
hoist_vars: true,
|
loops : true,
|
||||||
if_return: true,
|
unused : true,
|
||||||
join_vars: true,
|
hoist_funs : true,
|
||||||
keep_fargs: true,
|
keep_fargs : true,
|
||||||
keep_fnames: false,
|
keep_fnames : false,
|
||||||
loops: true,
|
hoist_vars : true,
|
||||||
negate_iife: true,
|
if_return : true,
|
||||||
properties: true,
|
join_vars : true,
|
||||||
sequences: true,
|
cascade : true,
|
||||||
side_effects: true,
|
side_effects : true,
|
||||||
unused: true,
|
negate_iife : true
|
||||||
}
|
};
|
||||||
input: {
|
input: {
|
||||||
// adapted from http://asmjs.org/spec/latest/
|
// adapted from http://asmjs.org/spec/latest/
|
||||||
function asm_GeometricMean(stdlib, foreign, buffer) {
|
function asm_GeometricMean(stdlib, foreign, buffer) {
|
||||||
@@ -76,8 +76,9 @@ asm_mixed: {
|
|||||||
start = start | 0;
|
start = start | 0;
|
||||||
end = end | 0;
|
end = end | 0;
|
||||||
var sum = 0.0, p = 0, q = 0;
|
var sum = 0.0, p = 0, q = 0;
|
||||||
for (p = start << 3, q = end << 3; (p | 0) < (q | 0); p = p + 8 | 0)
|
for (p = start << 3, q = end << 3; (p | 0) < (q | 0); p = p + 8 | 0) {
|
||||||
sum = sum + +log(values[p >> 3]);
|
sum = sum + +log(values[p >> 3]);
|
||||||
|
}
|
||||||
return +sum;
|
return +sum;
|
||||||
}
|
}
|
||||||
function geometricMean(start, end) {
|
function geometricMean(start, end) {
|
||||||
@@ -90,12 +91,12 @@ asm_mixed: {
|
|||||||
function no_asm_GeometricMean(stdlib, foreign, buffer) {
|
function no_asm_GeometricMean(stdlib, foreign, buffer) {
|
||||||
function logSum(start, end) {
|
function logSum(start, end) {
|
||||||
start |= 0, end |= 0;
|
start |= 0, end |= 0;
|
||||||
for (var sum = 0, p = 0, q = 0, p = start << 3, q = end << 3; (0 | p) < (0 | q); p = p + 8 | 0)
|
var sum = 0, p = 0, q = 0;
|
||||||
sum += +log(values[p >> 3]);
|
for (p = start << 3, q = end << 3; (0 | p) < (0 | q); p = p + 8 | 0) sum += +log(values[p >> 3]);
|
||||||
return +sum;
|
return +sum;
|
||||||
}
|
}
|
||||||
function geometricMean(start, end) {
|
function geometricMean(start, end) {
|
||||||
return start |= 0, end |= 0, +exp(+logSum(start, end) / (end - start | 0));
|
return start |= 0, end |= 0, +exp(+logSum(start, end) / +(end - start | 0));
|
||||||
}
|
}
|
||||||
var exp = stdlib.Math.exp, log = stdlib.Math.log, values = new stdlib.Float64Array(buffer);
|
var exp = stdlib.Math.exp, log = stdlib.Math.log, values = new stdlib.Float64Array(buffer);
|
||||||
return { geometricMean: geometricMean };
|
return { geometricMean: geometricMean };
|
||||||
@@ -103,131 +104,3 @@ asm_mixed: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
asm_toplevel: {
|
|
||||||
options = {}
|
|
||||||
input: {
|
|
||||||
"use asm";
|
|
||||||
0.0;
|
|
||||||
function f() {
|
|
||||||
0.0;
|
|
||||||
(function(){
|
|
||||||
0.0;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
0.0;
|
|
||||||
}
|
|
||||||
expect_exact: '"use asm";0.0;function f(){0.0;(function(){0.0})}0.0;'
|
|
||||||
}
|
|
||||||
|
|
||||||
asm_function_expression: {
|
|
||||||
options = {}
|
|
||||||
input: {
|
|
||||||
0.0;
|
|
||||||
var a = function() {
|
|
||||||
"use asm";
|
|
||||||
0.0;
|
|
||||||
}
|
|
||||||
function f() {
|
|
||||||
0.0;
|
|
||||||
return function(){
|
|
||||||
"use asm";
|
|
||||||
0.0;
|
|
||||||
}
|
|
||||||
0.0;
|
|
||||||
}
|
|
||||||
0.0;
|
|
||||||
}
|
|
||||||
expect_exact: '0;var a=function(){"use asm";0.0};function f(){0;return function(){"use asm";0.0};0}0;'
|
|
||||||
}
|
|
||||||
|
|
||||||
asm_nested_functions: {
|
|
||||||
options = {}
|
|
||||||
input: {
|
|
||||||
0.0;
|
|
||||||
function a() {
|
|
||||||
"use asm";
|
|
||||||
0.0;
|
|
||||||
}
|
|
||||||
0.0;
|
|
||||||
function b() {
|
|
||||||
0.0;
|
|
||||||
function c(){
|
|
||||||
"use asm";
|
|
||||||
0.0;
|
|
||||||
}
|
|
||||||
0.0;
|
|
||||||
function d(){
|
|
||||||
0.0;
|
|
||||||
}
|
|
||||||
0.0;
|
|
||||||
}
|
|
||||||
0.0;
|
|
||||||
}
|
|
||||||
expect_exact: '0;function a(){"use asm";0.0}0;function b(){0;function c(){"use asm";0.0}0;function d(){0}0}0;'
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_3636_1: {
|
|
||||||
mangle = {}
|
|
||||||
input: {
|
|
||||||
function n(stdlib, foreign, buffer) {
|
|
||||||
"use asm";
|
|
||||||
function add(x, y) {
|
|
||||||
x = x | 0;
|
|
||||||
y = y | 0;
|
|
||||||
return x + y | 0;
|
|
||||||
}
|
|
||||||
return {
|
|
||||||
add: add
|
|
||||||
};
|
|
||||||
}
|
|
||||||
console.log(new n().add("foo", 42));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function n(o, e, u) {
|
|
||||||
"use asm";
|
|
||||||
function d(n, o) {
|
|
||||||
n = n | 0;
|
|
||||||
o = o | 0;
|
|
||||||
return n + o | 0;
|
|
||||||
}
|
|
||||||
return {
|
|
||||||
add: d
|
|
||||||
};
|
|
||||||
}
|
|
||||||
console.log(new n().add("foo", 42));
|
|
||||||
}
|
|
||||||
expect_stdout: "42"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_3636_2: {
|
|
||||||
mangle = {}
|
|
||||||
input: {
|
|
||||||
var n = function(stdlib, foreign, buffer) {
|
|
||||||
"use asm";
|
|
||||||
function add(x, y) {
|
|
||||||
x = x | 0;
|
|
||||||
y = y | 0;
|
|
||||||
return x + y | 0;
|
|
||||||
}
|
|
||||||
return {
|
|
||||||
add: add
|
|
||||||
};
|
|
||||||
};
|
|
||||||
console.log(new n().add("foo", 42));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var n = function(n, o, e) {
|
|
||||||
"use asm";
|
|
||||||
function r(n, o) {
|
|
||||||
n = n | 0;
|
|
||||||
o = o | 0;
|
|
||||||
return n + o | 0;
|
|
||||||
}
|
|
||||||
return {
|
|
||||||
add: r
|
|
||||||
};
|
|
||||||
};
|
|
||||||
console.log(new n().add("foo", 42));
|
|
||||||
}
|
|
||||||
expect_stdout: "42"
|
|
||||||
}
|
|
||||||
|
|||||||
238
test/compress/assignment.js
Normal file
238
test/compress/assignment.js
Normal file
@@ -0,0 +1,238 @@
|
|||||||
|
op_equals_left_local_var: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var x;
|
||||||
|
|
||||||
|
x = x + 3;
|
||||||
|
x = x - 3;
|
||||||
|
x = x / 3;
|
||||||
|
x = x * 3;
|
||||||
|
x = x >> 3;
|
||||||
|
x = x << 3;
|
||||||
|
x = x >>> 3;
|
||||||
|
x = x | 3;
|
||||||
|
x = x ^ 3;
|
||||||
|
x = x % 3;
|
||||||
|
x = x & 3;
|
||||||
|
|
||||||
|
x = x + g();
|
||||||
|
x = x - g();
|
||||||
|
x = x / g();
|
||||||
|
x = x * g();
|
||||||
|
x = x >> g();
|
||||||
|
x = x << g();
|
||||||
|
x = x >>> g();
|
||||||
|
x = x | g();
|
||||||
|
x = x ^ g();
|
||||||
|
x = x % g();
|
||||||
|
x = x & g();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var x;
|
||||||
|
|
||||||
|
x += 3;
|
||||||
|
x -= 3;
|
||||||
|
x /= 3;
|
||||||
|
x *= 3;
|
||||||
|
x >>= 3;
|
||||||
|
x <<= 3;
|
||||||
|
x >>>= 3;
|
||||||
|
x |= 3;
|
||||||
|
x ^= 3;
|
||||||
|
x %= 3;
|
||||||
|
x &= 3;
|
||||||
|
|
||||||
|
x += g();
|
||||||
|
x -= g();
|
||||||
|
x /= g();
|
||||||
|
x *= g();
|
||||||
|
x >>= g();
|
||||||
|
x <<= g();
|
||||||
|
x >>>= g();
|
||||||
|
x |= g();
|
||||||
|
x ^= g();
|
||||||
|
x %= g();
|
||||||
|
x &= g();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
op_equals_right_local_var: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var x;
|
||||||
|
|
||||||
|
x = (x -= 2) ^ x;
|
||||||
|
|
||||||
|
x = 3 + x;
|
||||||
|
x = 3 - x;
|
||||||
|
x = 3 / x;
|
||||||
|
x = 3 * x;
|
||||||
|
x = 3 >> x;
|
||||||
|
x = 3 << x;
|
||||||
|
x = 3 >>> x;
|
||||||
|
x = 3 | x;
|
||||||
|
x = 3 ^ x;
|
||||||
|
x = 3 % x;
|
||||||
|
x = 3 & x;
|
||||||
|
|
||||||
|
x = g() + x;
|
||||||
|
x = g() - x;
|
||||||
|
x = g() / x;
|
||||||
|
x = g() * x;
|
||||||
|
x = g() >> x;
|
||||||
|
x = g() << x;
|
||||||
|
x = g() >>> x;
|
||||||
|
x = g() | x;
|
||||||
|
x = g() ^ x;
|
||||||
|
x = g() % x;
|
||||||
|
x = g() & x;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var x;
|
||||||
|
|
||||||
|
x = (x -= 2) ^ x;
|
||||||
|
|
||||||
|
x = 3 + x;
|
||||||
|
x = 3 - x;
|
||||||
|
x = 3 / x;
|
||||||
|
x *= 3;
|
||||||
|
x = 3 >> x;
|
||||||
|
x = 3 << x;
|
||||||
|
x = 3 >>> x;
|
||||||
|
x |= 3;
|
||||||
|
x ^= 3;
|
||||||
|
x = 3 % x;
|
||||||
|
x &= 3;
|
||||||
|
|
||||||
|
x = g() + x;
|
||||||
|
x = g() - x;
|
||||||
|
x = g() / x;
|
||||||
|
x = g() * x;
|
||||||
|
x = g() >> x;
|
||||||
|
x = g() << x;
|
||||||
|
x = g() >>> x;
|
||||||
|
x = g() | x;
|
||||||
|
x = g() ^ x;
|
||||||
|
x = g() % x;
|
||||||
|
x = g() & x;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
op_equals_left_global_var: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
x = x + 3;
|
||||||
|
x = x - 3;
|
||||||
|
x = x / 3;
|
||||||
|
x = x * 3;
|
||||||
|
x = x >> 3;
|
||||||
|
x = x << 3;
|
||||||
|
x = x >>> 3;
|
||||||
|
x = x | 3;
|
||||||
|
x = x ^ 3;
|
||||||
|
x = x % 3;
|
||||||
|
x = x & 3;
|
||||||
|
|
||||||
|
x = x + g();
|
||||||
|
x = x - g();
|
||||||
|
x = x / g();
|
||||||
|
x = x * g();
|
||||||
|
x = x >> g();
|
||||||
|
x = x << g();
|
||||||
|
x = x >>> g();
|
||||||
|
x = x | g();
|
||||||
|
x = x ^ g();
|
||||||
|
x = x % g();
|
||||||
|
x = x & g();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
x += 3;
|
||||||
|
x -= 3;
|
||||||
|
x /= 3;
|
||||||
|
x *= 3;
|
||||||
|
x >>= 3;
|
||||||
|
x <<= 3;
|
||||||
|
x >>>= 3;
|
||||||
|
x |= 3;
|
||||||
|
x ^= 3;
|
||||||
|
x %= 3;
|
||||||
|
x &= 3;
|
||||||
|
|
||||||
|
x += g();
|
||||||
|
x -= g();
|
||||||
|
x /= g();
|
||||||
|
x *= g();
|
||||||
|
x >>= g();
|
||||||
|
x <<= g();
|
||||||
|
x >>>= g();
|
||||||
|
x |= g();
|
||||||
|
x ^= g();
|
||||||
|
x %= g();
|
||||||
|
x &= g();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
op_equals_right_global_var: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
x = (x -= 2) ^ x;
|
||||||
|
|
||||||
|
x = 3 + x;
|
||||||
|
x = 3 - x;
|
||||||
|
x = 3 / x;
|
||||||
|
x = 3 * x;
|
||||||
|
x = 3 >> x;
|
||||||
|
x = 3 << x;
|
||||||
|
x = 3 >>> x;
|
||||||
|
x = 3 | x;
|
||||||
|
x = 3 ^ x;
|
||||||
|
x = 3 % x;
|
||||||
|
x = 3 & x;
|
||||||
|
|
||||||
|
x = g() + x;
|
||||||
|
x = g() - x;
|
||||||
|
x = g() / x;
|
||||||
|
x = g() * x;
|
||||||
|
x = g() >> x;
|
||||||
|
x = g() << x;
|
||||||
|
x = g() >>> x;
|
||||||
|
x = g() | x;
|
||||||
|
x = g() ^ x;
|
||||||
|
x = g() % x;
|
||||||
|
x = g() & x;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
x = (x -= 2) ^ x;
|
||||||
|
|
||||||
|
x = 3 + x;
|
||||||
|
x = 3 - x;
|
||||||
|
x = 3 / x;
|
||||||
|
x *= 3;
|
||||||
|
x = 3 >> x;
|
||||||
|
x = 3 << x;
|
||||||
|
x = 3 >>> x;
|
||||||
|
x |= 3;
|
||||||
|
x ^= 3;
|
||||||
|
x = 3 % x;
|
||||||
|
x &= 3;
|
||||||
|
|
||||||
|
x = g() + x;
|
||||||
|
x = g() - x;
|
||||||
|
x = g() / x;
|
||||||
|
x = g() * x;
|
||||||
|
x = g() >> x;
|
||||||
|
x = g() << x;
|
||||||
|
x = g() >>> x;
|
||||||
|
x = g() | x;
|
||||||
|
x = g() ^ x;
|
||||||
|
x = g() % x;
|
||||||
|
x = g() & x;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,805 +0,0 @@
|
|||||||
op_equals_left_local_var: {
|
|
||||||
options = {
|
|
||||||
assignments: true,
|
|
||||||
evaluate: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var x;
|
|
||||||
|
|
||||||
x = x + 3;
|
|
||||||
x = x - 3;
|
|
||||||
x = x / 3;
|
|
||||||
x = x * 3;
|
|
||||||
x = x >> 3;
|
|
||||||
x = x << 3;
|
|
||||||
x = x >>> 3;
|
|
||||||
x = x | 3;
|
|
||||||
x = x ^ 3;
|
|
||||||
x = x % 3;
|
|
||||||
x = x & 3;
|
|
||||||
|
|
||||||
x = x + g();
|
|
||||||
x = x - g();
|
|
||||||
x = x / g();
|
|
||||||
x = x * g();
|
|
||||||
x = x >> g();
|
|
||||||
x = x << g();
|
|
||||||
x = x >>> g();
|
|
||||||
x = x | g();
|
|
||||||
x = x ^ g();
|
|
||||||
x = x % g();
|
|
||||||
x = x & g();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var x;
|
|
||||||
|
|
||||||
x += 3;
|
|
||||||
x -= 3;
|
|
||||||
x /= 3;
|
|
||||||
x *= 3;
|
|
||||||
x >>= 3;
|
|
||||||
x <<= 3;
|
|
||||||
x >>>= 3;
|
|
||||||
x |= 3;
|
|
||||||
x ^= 3;
|
|
||||||
x %= 3;
|
|
||||||
x &= 3;
|
|
||||||
|
|
||||||
x += g();
|
|
||||||
x -= g();
|
|
||||||
x /= g();
|
|
||||||
x *= g();
|
|
||||||
x >>= g();
|
|
||||||
x <<= g();
|
|
||||||
x >>>= g();
|
|
||||||
x |= g();
|
|
||||||
x ^= g();
|
|
||||||
x %= g();
|
|
||||||
x &= g();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
op_equals_right_local_var: {
|
|
||||||
options = {
|
|
||||||
assignments: true,
|
|
||||||
evaluate: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var x;
|
|
||||||
|
|
||||||
x = (x -= 2) ^ x;
|
|
||||||
|
|
||||||
x = 3 + x;
|
|
||||||
x = 3 - x;
|
|
||||||
x = 3 / x;
|
|
||||||
x = 3 * x;
|
|
||||||
x = 3 >> x;
|
|
||||||
x = 3 << x;
|
|
||||||
x = 3 >>> x;
|
|
||||||
x = 3 | x;
|
|
||||||
x = 3 ^ x;
|
|
||||||
x = 3 % x;
|
|
||||||
x = 3 & x;
|
|
||||||
|
|
||||||
x = g() + x;
|
|
||||||
x = g() - x;
|
|
||||||
x = g() / x;
|
|
||||||
x = g() * x;
|
|
||||||
x = g() >> x;
|
|
||||||
x = g() << x;
|
|
||||||
x = g() >>> x;
|
|
||||||
x = g() | x;
|
|
||||||
x = g() ^ x;
|
|
||||||
x = g() % x;
|
|
||||||
x = g() & x;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var x;
|
|
||||||
|
|
||||||
x = (x -= 2) ^ x;
|
|
||||||
|
|
||||||
x = 3 + x;
|
|
||||||
x = 3 - x;
|
|
||||||
x = 3 / x;
|
|
||||||
x *= 3;
|
|
||||||
x = 3 >> x;
|
|
||||||
x = 3 << x;
|
|
||||||
x = 3 >>> x;
|
|
||||||
x |= 3;
|
|
||||||
x ^= 3;
|
|
||||||
x = 3 % x;
|
|
||||||
x &= 3;
|
|
||||||
|
|
||||||
x = g() + x;
|
|
||||||
x = g() - x;
|
|
||||||
x = g() / x;
|
|
||||||
x = g() * x;
|
|
||||||
x = g() >> x;
|
|
||||||
x = g() << x;
|
|
||||||
x = g() >>> x;
|
|
||||||
x = g() | x;
|
|
||||||
x = g() ^ x;
|
|
||||||
x = g() % x;
|
|
||||||
x = g() & x;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
op_equals_left_global_var: {
|
|
||||||
options = {
|
|
||||||
assignments: true,
|
|
||||||
evaluate: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
x = x + 3;
|
|
||||||
x = x - 3;
|
|
||||||
x = x / 3;
|
|
||||||
x = x * 3;
|
|
||||||
x = x >> 3;
|
|
||||||
x = x << 3;
|
|
||||||
x = x >>> 3;
|
|
||||||
x = x | 3;
|
|
||||||
x = x ^ 3;
|
|
||||||
x = x % 3;
|
|
||||||
x = x & 3;
|
|
||||||
|
|
||||||
x = x + g();
|
|
||||||
x = x - g();
|
|
||||||
x = x / g();
|
|
||||||
x = x * g();
|
|
||||||
x = x >> g();
|
|
||||||
x = x << g();
|
|
||||||
x = x >>> g();
|
|
||||||
x = x | g();
|
|
||||||
x = x ^ g();
|
|
||||||
x = x % g();
|
|
||||||
x = x & g();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
x += 3;
|
|
||||||
x -= 3;
|
|
||||||
x /= 3;
|
|
||||||
x *= 3;
|
|
||||||
x >>= 3;
|
|
||||||
x <<= 3;
|
|
||||||
x >>>= 3;
|
|
||||||
x |= 3;
|
|
||||||
x ^= 3;
|
|
||||||
x %= 3;
|
|
||||||
x &= 3;
|
|
||||||
|
|
||||||
x += g();
|
|
||||||
x -= g();
|
|
||||||
x /= g();
|
|
||||||
x *= g();
|
|
||||||
x >>= g();
|
|
||||||
x <<= g();
|
|
||||||
x >>>= g();
|
|
||||||
x |= g();
|
|
||||||
x ^= g();
|
|
||||||
x %= g();
|
|
||||||
x &= g();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
op_equals_right_global_var: {
|
|
||||||
options = {
|
|
||||||
assignments: true,
|
|
||||||
evaluate: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
x = (x -= 2) ^ x;
|
|
||||||
|
|
||||||
x = 3 + x;
|
|
||||||
x = 3 - x;
|
|
||||||
x = 3 / x;
|
|
||||||
x = 3 * x;
|
|
||||||
x = 3 >> x;
|
|
||||||
x = 3 << x;
|
|
||||||
x = 3 >>> x;
|
|
||||||
x = 3 | x;
|
|
||||||
x = 3 ^ x;
|
|
||||||
x = 3 % x;
|
|
||||||
x = 3 & x;
|
|
||||||
|
|
||||||
x = g() + x;
|
|
||||||
x = g() - x;
|
|
||||||
x = g() / x;
|
|
||||||
x = g() * x;
|
|
||||||
x = g() >> x;
|
|
||||||
x = g() << x;
|
|
||||||
x = g() >>> x;
|
|
||||||
x = g() | x;
|
|
||||||
x = g() ^ x;
|
|
||||||
x = g() % x;
|
|
||||||
x = g() & x;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
x = (x -= 2) ^ x;
|
|
||||||
|
|
||||||
x = 3 + x;
|
|
||||||
x = 3 - x;
|
|
||||||
x = 3 / x;
|
|
||||||
x *= 3;
|
|
||||||
x = 3 >> x;
|
|
||||||
x = 3 << x;
|
|
||||||
x = 3 >>> x;
|
|
||||||
x |= 3;
|
|
||||||
x ^= 3;
|
|
||||||
x = 3 % x;
|
|
||||||
x &= 3;
|
|
||||||
|
|
||||||
x = g() + x;
|
|
||||||
x = g() - x;
|
|
||||||
x = g() / x;
|
|
||||||
x = g() * x;
|
|
||||||
x = g() >> x;
|
|
||||||
x = g() << x;
|
|
||||||
x = g() >>> x;
|
|
||||||
x = g() | x;
|
|
||||||
x = g() ^ x;
|
|
||||||
x = g() % x;
|
|
||||||
x = g() & x;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
increment_decrement_1: {
|
|
||||||
options = {
|
|
||||||
assignments: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(function(a) {
|
|
||||||
a += 1;
|
|
||||||
a -= 1;
|
|
||||||
return a;
|
|
||||||
}(42));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(function(a){
|
|
||||||
++a;
|
|
||||||
--a;
|
|
||||||
return a;
|
|
||||||
}(42));
|
|
||||||
}
|
|
||||||
expect_stdout: "42"
|
|
||||||
}
|
|
||||||
|
|
||||||
increment_decrement_2: {
|
|
||||||
options = {
|
|
||||||
assignments: true,
|
|
||||||
passes: 2,
|
|
||||||
reduce_vars: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(function(a) {
|
|
||||||
a = a + 1;
|
|
||||||
a = a - 1;
|
|
||||||
a += 1;
|
|
||||||
a -= 1;
|
|
||||||
return a;
|
|
||||||
}(42));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(function(a){
|
|
||||||
++a;
|
|
||||||
--a;
|
|
||||||
++a;
|
|
||||||
--a;
|
|
||||||
return a;
|
|
||||||
}(42));
|
|
||||||
}
|
|
||||||
expect_stdout: "42"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_3375_1: {
|
|
||||||
options = {
|
|
||||||
assignments: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function p(o) {
|
|
||||||
console.log(typeof o, o);
|
|
||||||
}
|
|
||||||
p(function(b) {
|
|
||||||
var a = b += 1;
|
|
||||||
--b;
|
|
||||||
return a;
|
|
||||||
}("object"));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function p(o) {
|
|
||||||
console.log(typeof o, o);
|
|
||||||
}
|
|
||||||
p(function(b) {
|
|
||||||
var a = b += 1;
|
|
||||||
--b;
|
|
||||||
return a;
|
|
||||||
}("object"));
|
|
||||||
}
|
|
||||||
expect_stdout: "string object1"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_3375_2: {
|
|
||||||
options = {
|
|
||||||
assignments: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function p(o) {
|
|
||||||
console.log(typeof o, o);
|
|
||||||
}
|
|
||||||
p(function(b) {
|
|
||||||
var a = b -= 1;
|
|
||||||
--b;
|
|
||||||
return a;
|
|
||||||
}("object"));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function p(o) {
|
|
||||||
console.log(typeof o, o);
|
|
||||||
}
|
|
||||||
p(function(b) {
|
|
||||||
var a = --b;
|
|
||||||
--b;
|
|
||||||
return a;
|
|
||||||
}("object"));
|
|
||||||
}
|
|
||||||
expect_stdout: "number NaN"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_3427: {
|
|
||||||
options = {
|
|
||||||
assignments: true,
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function() {
|
|
||||||
var a;
|
|
||||||
a || (a = {});
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect: {}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_3429_1: {
|
|
||||||
options = {
|
|
||||||
assignments: true,
|
|
||||||
side_effects: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = "PASS";
|
|
||||||
(function(b) {
|
|
||||||
b && (b = a = "FAIL");
|
|
||||||
})();
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = "PASS";
|
|
||||||
(function(b) {
|
|
||||||
b = b && (a = "FAIL");
|
|
||||||
})();
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_3429_2: {
|
|
||||||
options = {
|
|
||||||
assignments: true,
|
|
||||||
side_effects: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a;
|
|
||||||
(function(b) {
|
|
||||||
b || (b = a = "FAIL");
|
|
||||||
})(42);
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a;
|
|
||||||
(function(b) {
|
|
||||||
b = b || (a = "FAIL");
|
|
||||||
})(42);
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_stdout: "undefined"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_3949_1: {
|
|
||||||
options = {
|
|
||||||
assignments: true,
|
|
||||||
evaluate: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 42;
|
|
||||||
function f() {
|
|
||||||
var b = a;
|
|
||||||
b = b >> 2;
|
|
||||||
return 100 + b;
|
|
||||||
}
|
|
||||||
console.log(f());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 42;
|
|
||||||
function f() {
|
|
||||||
var b = a;
|
|
||||||
b >>= 2;
|
|
||||||
return 100 + b;
|
|
||||||
}
|
|
||||||
console.log(f());
|
|
||||||
}
|
|
||||||
expect_stdout: "110"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_3949_2: {
|
|
||||||
options = {
|
|
||||||
assignments: true,
|
|
||||||
evaluate: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 42;
|
|
||||||
function f() {
|
|
||||||
var b = a;
|
|
||||||
b = 5 & b;
|
|
||||||
return 100 + b;
|
|
||||||
}
|
|
||||||
console.log(f());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 42;
|
|
||||||
function f() {
|
|
||||||
var b = a;
|
|
||||||
b &= 5;
|
|
||||||
return 100 + b;
|
|
||||||
}
|
|
||||||
console.log(f());
|
|
||||||
}
|
|
||||||
expect_stdout: "100"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_4521: {
|
|
||||||
options = {
|
|
||||||
assignments: true,
|
|
||||||
dead_code: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = (a = 42 | a) ? console.log(a) : 0;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = (a |= 42) ? console.log(a) : 0;
|
|
||||||
}
|
|
||||||
expect_stdout: "42"
|
|
||||||
}
|
|
||||||
|
|
||||||
logical_assignments: {
|
|
||||||
input: {
|
|
||||||
var a = 42, b = null, c;
|
|
||||||
a &&= "foo";
|
|
||||||
b ||= "bar";
|
|
||||||
c ??= "baz";
|
|
||||||
console.log(a, b, c);
|
|
||||||
}
|
|
||||||
expect_exact: 'var a=42,b=null,c;a&&="foo";b||="bar";c??="baz";console.log(a,b,c);'
|
|
||||||
expect_stdout: "foo bar baz"
|
|
||||||
node_version: ">=15"
|
|
||||||
}
|
|
||||||
|
|
||||||
logical_collapse_vars_1: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = "FAIL", b = false;
|
|
||||||
a = "PASS";
|
|
||||||
b ??= a;
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = "FAIL", b = false;
|
|
||||||
a = "PASS";
|
|
||||||
b ??= a;
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
node_version: ">=15"
|
|
||||||
}
|
|
||||||
|
|
||||||
logical_collapse_vars_2: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = "PASS";
|
|
||||||
(function(b) {
|
|
||||||
b ||= (a = "FAIL", {});
|
|
||||||
return b;
|
|
||||||
})(console).log(a);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = "PASS";
|
|
||||||
(function(b) {
|
|
||||||
return b ||= (a = "FAIL", {});
|
|
||||||
})(console).log(a);
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
node_version: ">=15"
|
|
||||||
}
|
|
||||||
|
|
||||||
logical_collapse_vars_3: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 6;
|
|
||||||
a *= 7;
|
|
||||||
a ??= "FAIL";
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 6;
|
|
||||||
a = a * 7 ?? "FAIL";
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_stdout: "42"
|
|
||||||
node_version: ">=15"
|
|
||||||
}
|
|
||||||
|
|
||||||
logical_reduce_vars: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = "PASS", b = 42;
|
|
||||||
b ??= a = "FAIL";
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = "PASS", b = 42;
|
|
||||||
b ??= a = "FAIL";
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
node_version: ">=15"
|
|
||||||
}
|
|
||||||
|
|
||||||
logical_side_effects: {
|
|
||||||
options = {
|
|
||||||
side_effects: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = "PASS", b = 42;
|
|
||||||
b ??= a = "FAIL";
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = "PASS", b = 42;
|
|
||||||
b ??= a = "FAIL";
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
node_version: ">=15"
|
|
||||||
}
|
|
||||||
|
|
||||||
evaluate_lazy_assignment: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 42;
|
|
||||||
console.log(a &&= "PASS");
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log("PASS");
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
node_version: ">=15"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_4815_1: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = "PASS";
|
|
||||||
42..p &&= a = "FAIL";
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = "PASS";
|
|
||||||
42..p &&= a = "FAIL";
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
node_version: ">=15"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_4815_2: {
|
|
||||||
options = {
|
|
||||||
pure_getters: "strict",
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = "PASS";
|
|
||||||
42..p &&= a = "FAIL";
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = "PASS";
|
|
||||||
42..p &&= a = "FAIL";
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
node_version: ">=15"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_4819: {
|
|
||||||
options = {
|
|
||||||
comparisons: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(void 0 === ([].p &&= 42));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(void 0 === ([].p &&= 42));
|
|
||||||
}
|
|
||||||
expect_stdout: "true"
|
|
||||||
node_version: ">=15"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_4827_1: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
A = "FAIL";
|
|
||||||
var a = A, b = "PASS", c;
|
|
||||||
c &&= b = a, console.log(b);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = A = "FAIL", b = "PASS", c;
|
|
||||||
c &&= b = a, console.log(b);
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
node_version: ">=15"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_4827_2: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
inline: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 0, b = "PASS";
|
|
||||||
function f(c) {
|
|
||||||
a++,
|
|
||||||
c &&= b = a;
|
|
||||||
}
|
|
||||||
f();
|
|
||||||
console.log(b);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 0, b = "PASS";
|
|
||||||
a++,
|
|
||||||
c &&= b = a;
|
|
||||||
var c;
|
|
||||||
console.log(b);
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
node_version: ">=15"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_4827_3: {
|
|
||||||
options = {
|
|
||||||
merge_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 0, b, c;
|
|
||||||
a++;
|
|
||||||
c &&= b = a;
|
|
||||||
console.log(b);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 0, b, c;
|
|
||||||
a++;
|
|
||||||
c &&= b = a;
|
|
||||||
console.log(b);
|
|
||||||
}
|
|
||||||
expect_stdout: "undefined"
|
|
||||||
node_version: ">=15"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_4876: {
|
|
||||||
options = {
|
|
||||||
pure_getters: "strict",
|
|
||||||
reduce_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
try {
|
|
||||||
var a = null;
|
|
||||||
var b = a &&= 42;
|
|
||||||
b.p;
|
|
||||||
} catch (e) {
|
|
||||||
console.log("PASS");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
try {
|
|
||||||
var a = null;
|
|
||||||
var b = a &&= 42;
|
|
||||||
b.p;
|
|
||||||
} catch (e) {
|
|
||||||
console.log("PASS");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
node_version: ">=15"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_4924_1: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a, b;
|
|
||||||
console.log("PASS");
|
|
||||||
a = function() {};
|
|
||||||
b = function() {}(b ||= a);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var b;
|
|
||||||
console.log("PASS");
|
|
||||||
b = void (b ||= function() {});
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
node_version: ">=15"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_4924_2: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
dead_code: true,
|
|
||||||
passes: 2,
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a, b;
|
|
||||||
console.log("PASS");
|
|
||||||
a = function() {};
|
|
||||||
b = function() {}(b ||= a);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log("PASS");
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
node_version: ">=15"
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,92 +0,0 @@
|
|||||||
arithmetic: {
|
|
||||||
input: {
|
|
||||||
console.log(((1n + 0x2n) * (0o3n - -4n)) >> (5n - 6n));
|
|
||||||
}
|
|
||||||
expect_exact: "console.log((1n+0x2n)*(0o3n- -4n)>>5n-6n);"
|
|
||||||
expect_stdout: "42n"
|
|
||||||
node_version: ">=10.4.0"
|
|
||||||
}
|
|
||||||
|
|
||||||
minus_dot: {
|
|
||||||
input: {
|
|
||||||
console.log(typeof -42n.toString(), typeof (-42n).toString());
|
|
||||||
}
|
|
||||||
expect_exact: "console.log(typeof-42n.toString(),typeof(-42n).toString());"
|
|
||||||
expect_stdout: "number string"
|
|
||||||
node_version: ">=10.4.0"
|
|
||||||
}
|
|
||||||
|
|
||||||
evaluate: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
unsafe: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log((0xDEAD_BEEFn).toString(16));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(0xdeadbeefn.toString(16));
|
|
||||||
}
|
|
||||||
expect_stdout: "deadbeef"
|
|
||||||
node_version: ">=10.4.0"
|
|
||||||
}
|
|
||||||
|
|
||||||
Number: {
|
|
||||||
options = {
|
|
||||||
unsafe: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(Number(-0xfeed_dead_beef_badn));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(+("" + -0xfeed_dead_beef_badn));
|
|
||||||
}
|
|
||||||
expect_stdout: "-1148098955808013200"
|
|
||||||
node_version: ">=10.4.0"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_4590: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
A = 1;
|
|
||||||
0n || console.log("PASS");
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
A = 1;
|
|
||||||
0n || console.log("PASS");
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
node_version: ">=10.4.0"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_4801: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
collapse_vars: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
try {
|
|
||||||
(function(a) {
|
|
||||||
A = 42;
|
|
||||||
a || A;
|
|
||||||
})(!(0 == 42 >> 0o644n));
|
|
||||||
} catch (e) {
|
|
||||||
console.log("PASS");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
try {
|
|
||||||
(function(a) {
|
|
||||||
0 != (A = 42) >> 0o644n || A;
|
|
||||||
})();
|
|
||||||
} catch (e) {
|
|
||||||
console.log("PASS");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
node_version: ">=10.4.0"
|
|
||||||
}
|
|
||||||
177
test/compress/block-scope.js
Normal file
177
test/compress/block-scope.js
Normal file
@@ -0,0 +1,177 @@
|
|||||||
|
|
||||||
|
let_statement: {
|
||||||
|
input: {
|
||||||
|
let x = 6;
|
||||||
|
}
|
||||||
|
expect_exact: "let x=6;"
|
||||||
|
}
|
||||||
|
|
||||||
|
do_not_hoist_let: {
|
||||||
|
options = {
|
||||||
|
hoist_vars: true,
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
function x() {
|
||||||
|
if (FOO) {
|
||||||
|
let let1;
|
||||||
|
let let2;
|
||||||
|
var var1;
|
||||||
|
var var2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function x() {
|
||||||
|
var var1, var2;
|
||||||
|
if (FOO) {
|
||||||
|
let let1;
|
||||||
|
let let2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
do_not_remove_anon_blocks_if_they_have_decls: {
|
||||||
|
input: {
|
||||||
|
function x() {
|
||||||
|
{
|
||||||
|
let x;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
var x;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
const y;
|
||||||
|
class Zee {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
let y;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
var y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function x(){
|
||||||
|
{
|
||||||
|
let x
|
||||||
|
}
|
||||||
|
var x;
|
||||||
|
{
|
||||||
|
const y;
|
||||||
|
class Zee {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
let y
|
||||||
|
}
|
||||||
|
var y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
remove_unused_in_global_block: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
{
|
||||||
|
let x;
|
||||||
|
const y;
|
||||||
|
class Zee {};
|
||||||
|
var w;
|
||||||
|
}
|
||||||
|
let ex;
|
||||||
|
const why;
|
||||||
|
class Zed {};
|
||||||
|
var wut;
|
||||||
|
console.log(x, y, Zee);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var w;
|
||||||
|
let ex;
|
||||||
|
const why;
|
||||||
|
class Zed {};
|
||||||
|
var wut;
|
||||||
|
console.log(x, y, Zee);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
regression_block_scope_resolves: {
|
||||||
|
mangle = { };
|
||||||
|
options = {
|
||||||
|
dead_code: false
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
(function () {
|
||||||
|
if(1) {
|
||||||
|
let x;
|
||||||
|
const y;
|
||||||
|
class Zee {};
|
||||||
|
}
|
||||||
|
if(1) {
|
||||||
|
let ex;
|
||||||
|
const why;
|
||||||
|
class Zi {};
|
||||||
|
}
|
||||||
|
console.log(x, y, Zee, ex, why, Zi);
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function () {
|
||||||
|
if (1) {
|
||||||
|
let o;
|
||||||
|
const n;
|
||||||
|
class c {};
|
||||||
|
}
|
||||||
|
if (1) {
|
||||||
|
let o;
|
||||||
|
const n;
|
||||||
|
class c {};
|
||||||
|
}
|
||||||
|
console.log(x, y, Zee, ex, why, Zi);
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
switch_block_scope_mangler: {
|
||||||
|
mangle = {}
|
||||||
|
input: {
|
||||||
|
var fn = function(code) {
|
||||||
|
switch (code) {
|
||||||
|
case 1:
|
||||||
|
let apple = code + 1;
|
||||||
|
let dog = code + 4;
|
||||||
|
console.log(apple, dog);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
let banana = code + 2;
|
||||||
|
console.log(banana);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
let cat = code + 3;
|
||||||
|
console.log(cat);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var fn = function(o) {
|
||||||
|
switch (o) {
|
||||||
|
case 1:
|
||||||
|
let e = o + 1
|
||||||
|
let c = o + 4;
|
||||||
|
console.log(e, c);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
let l = o + 2;
|
||||||
|
console.log(l);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
let a = o + 3;
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,764 +0,0 @@
|
|||||||
iife_boolean_context: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
evaluate: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(function() {
|
|
||||||
return Object(1) || false;
|
|
||||||
}() ? "PASS" : "FAIL");
|
|
||||||
console.log(function() {
|
|
||||||
return [].length || true;
|
|
||||||
}() ? "PASS" : "FAIL");
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(function() {
|
|
||||||
return Object(1);
|
|
||||||
}() ? "PASS" : "FAIL");
|
|
||||||
console.log(function() {
|
|
||||||
return [].length, 1;
|
|
||||||
}() ? "PASS" : "FAIL");
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"PASS",
|
|
||||||
"PASS",
|
|
||||||
]
|
|
||||||
expect_warnings: [
|
|
||||||
"WARN: Dropping side-effect-free || [test/compress/booleans.js:2,19]",
|
|
||||||
"WARN: Boolean || always true [test/compress/booleans.js:5,19]",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
de_morgan_1a: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(a) {
|
|
||||||
return a || a;
|
|
||||||
}
|
|
||||||
console.log(f(null), f(42));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(a) {
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
console.log(f(null), f(42));
|
|
||||||
}
|
|
||||||
expect_stdout: "null 42"
|
|
||||||
}
|
|
||||||
|
|
||||||
de_morgan_1b: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(a) {
|
|
||||||
return a && a;
|
|
||||||
}
|
|
||||||
console.log(f(null), f(42));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(a) {
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
console.log(f(null), f(42));
|
|
||||||
}
|
|
||||||
expect_stdout: "null 42"
|
|
||||||
}
|
|
||||||
|
|
||||||
de_morgan_1c: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(delete (NaN && NaN));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(delete (0, NaN));
|
|
||||||
}
|
|
||||||
expect_stdout: "true"
|
|
||||||
}
|
|
||||||
|
|
||||||
de_morgan_2a: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
conditionals: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(a, b) {
|
|
||||||
return a || (a || b);
|
|
||||||
}
|
|
||||||
console.log(f(null), f(null, {}));
|
|
||||||
console.log(f(42), f(42, {}));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(a, b) {
|
|
||||||
return a || b;
|
|
||||||
}
|
|
||||||
console.log(f(null), f(null, {}));
|
|
||||||
console.log(f(42), f(42, {}));
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"undefined {}",
|
|
||||||
"42 42",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
de_morgan_2b: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
evaluate: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(a, b) {
|
|
||||||
return a || (a && b);
|
|
||||||
}
|
|
||||||
console.log(f(null), f(null, {}));
|
|
||||||
console.log(f(42), f(42, {}));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(a, b) {
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
console.log(f(null), f(null, {}));
|
|
||||||
console.log(f(42), f(42, {}));
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"null null",
|
|
||||||
"42 42",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
de_morgan_2c: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
evaluate: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(a, b) {
|
|
||||||
return a && (a || b);
|
|
||||||
}
|
|
||||||
console.log(f(null), f(null, {}));
|
|
||||||
console.log(f(42), f(42, {}));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(a, b) {
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
console.log(f(null), f(null, {}));
|
|
||||||
console.log(f(42), f(42, {}));
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"null null",
|
|
||||||
"42 42",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
de_morgan_2d: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
evaluate: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(a, b) {
|
|
||||||
return a && (a && b);
|
|
||||||
}
|
|
||||||
console.log(f(null), f(null, {}));
|
|
||||||
console.log(f(42), f(42, {}));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(a, b) {
|
|
||||||
return a && b;
|
|
||||||
}
|
|
||||||
console.log(f(null), f(null, {}));
|
|
||||||
console.log(f(42), f(42, {}));
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"null null",
|
|
||||||
"undefined {}",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
de_morgan_3a: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
conditionals: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(a, b, c) {
|
|
||||||
return a || ((a || b) || c);
|
|
||||||
}
|
|
||||||
console.log(f(null, false), f(null, false, {}), f(null, true), f(null, true, {}));
|
|
||||||
console.log(f(42, false), f(42, false, {}), f(42, true), f(42, true, {}));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(a, b, c) {
|
|
||||||
return a || b || c;
|
|
||||||
}
|
|
||||||
console.log(f(null, !1), f(null, !1, {}), f(null, !0), f(null, !0, {}));
|
|
||||||
console.log(f(42, !1), f(42, !1, {}), f(42, !0), f(42, !0, {}));
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"undefined {} true true",
|
|
||||||
"42 42 42 42",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
de_morgan_3b: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
evaluate: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(a, b, c) {
|
|
||||||
return a || ((a || b) && c);
|
|
||||||
}
|
|
||||||
console.log(f(null, false), f(null, false, {}), f(null, true), f(null, true, {}));
|
|
||||||
console.log(f(42, false), f(42, false, {}), f(42, true), f(42, true, {}));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(a, b, c) {
|
|
||||||
return a || b && c;
|
|
||||||
}
|
|
||||||
console.log(f(null, !1), f(null, !1, {}), f(null, !0), f(null, !0, {}));
|
|
||||||
console.log(f(42, !1), f(42, !1, {}), f(42, !0), f(42, !0, {}));
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"false false undefined {}",
|
|
||||||
"42 42 42 42",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
de_morgan_3c: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
evaluate: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(a, b, c) {
|
|
||||||
return a || ((a && b) || c);
|
|
||||||
}
|
|
||||||
console.log(f(null, false), f(null, false, {}), f(null, true), f(null, true, {}));
|
|
||||||
console.log(f(42, false), f(42, false, {}), f(42, true), f(42, true, {}));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(a, b, c) {
|
|
||||||
return a || c;
|
|
||||||
}
|
|
||||||
console.log(f(null, !1), f(null, !1, {}), f(null, !0), f(null, !0, {}));
|
|
||||||
console.log(f(42, !1), f(42, !1, {}), f(42, !0), f(42, !0, {}));
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"undefined {} undefined {}",
|
|
||||||
"42 42 42 42",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
de_morgan_3d: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
evaluate: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(a, b, c) {
|
|
||||||
return a || ((a && b) && c);
|
|
||||||
}
|
|
||||||
console.log(f(null, false), f(null, false, {}), f(null, true), f(null, true, {}));
|
|
||||||
console.log(f(42, false), f(42, false, {}), f(42, true), f(42, true, {}));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(a, b, c) {
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
console.log(f(null, !1), f(null, !1, {}), f(null, !0), f(null, !0, {}));
|
|
||||||
console.log(f(42, !1), f(42, !1, {}), f(42, !0), f(42, !0, {}));
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"null null null null",
|
|
||||||
"42 42 42 42",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
de_morgan_3e: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
evaluate: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(a, b, c) {
|
|
||||||
return a && ((a || b) || c);
|
|
||||||
}
|
|
||||||
console.log(f(null, false), f(null, false, {}), f(null, true), f(null, true, {}));
|
|
||||||
console.log(f(42, false), f(42, false, {}), f(42, true), f(42, true, {}));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(a, b, c) {
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
console.log(f(null, !1), f(null, !1, {}), f(null, !0), f(null, !0, {}));
|
|
||||||
console.log(f(42, !1), f(42, !1, {}), f(42, !0), f(42, !0, {}));
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"null null null null",
|
|
||||||
"42 42 42 42",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
de_morgan_3f: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
evaluate: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(a, b, c) {
|
|
||||||
return a && ((a || b) && c);
|
|
||||||
}
|
|
||||||
console.log(f(null, false), f(null, false, {}), f(null, true), f(null, true, {}));
|
|
||||||
console.log(f(42, false), f(42, false, {}), f(42, true), f(42, true, {}));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(a, b, c) {
|
|
||||||
return a && c;
|
|
||||||
}
|
|
||||||
console.log(f(null, !1), f(null, !1, {}), f(null, !0), f(null, !0, {}));
|
|
||||||
console.log(f(42, !1), f(42, !1, {}), f(42, !0), f(42, !0, {}));
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"null null null null",
|
|
||||||
"undefined {} undefined {}",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
de_morgan_3g: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
evaluate: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(a, b, c) {
|
|
||||||
return a && ((a && b) || c);
|
|
||||||
}
|
|
||||||
console.log(f(null, false), f(null, false, {}), f(null, true), f(null, true, {}));
|
|
||||||
console.log(f(42, false), f(42, false, {}), f(42, true), f(42, true, {}));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(a, b, c) {
|
|
||||||
return a && (b || c);
|
|
||||||
}
|
|
||||||
console.log(f(null, !1), f(null, !1, {}), f(null, !0), f(null, !0, {}));
|
|
||||||
console.log(f(42, !1), f(42, !1, {}), f(42, !0), f(42, !0, {}));
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"null null null null",
|
|
||||||
"undefined {} true true",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
de_morgan_3h: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
conditionals: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(a, b, c) {
|
|
||||||
return a && ((a && b) && c);
|
|
||||||
}
|
|
||||||
console.log(f(null, false), f(null, false, {}), f(null, true), f(null, true, {}));
|
|
||||||
console.log(f(42, false), f(42, false, {}), f(42, true), f(42, true, {}));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(a, b, c) {
|
|
||||||
return a && b && c;
|
|
||||||
}
|
|
||||||
console.log(f(null, !1), f(null, !1, {}), f(null, !0), f(null, !0, {}));
|
|
||||||
console.log(f(42, !1), f(42, !1, {}), f(42, !0), f(42, !0, {}));
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"null null null null",
|
|
||||||
"false false undefined {}",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
conditional_chain: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
conditionals: true,
|
|
||||||
evaluate: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(a, b) {
|
|
||||||
return a ? a : b ? b : 42;
|
|
||||||
}
|
|
||||||
console.log(f("PASS", "FAIL"));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(a, b) {
|
|
||||||
return a || b || 42;
|
|
||||||
}
|
|
||||||
console.log(f("PASS", "FAIL"));
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
negated_if: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
conditionals: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(function(a) {
|
|
||||||
if (!a)
|
|
||||||
return a ? "FAIL" : "PASS";
|
|
||||||
}(!console));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(function(a) {
|
|
||||||
if (!a)
|
|
||||||
return "PASS";
|
|
||||||
}(!console));
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
concat_truthy: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
evaluate: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log("foo") + (console.log("bar"), "baz") || console.log("moo");
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log("foo") + (console.log("bar"), "baz");
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"foo",
|
|
||||||
"bar",
|
|
||||||
]
|
|
||||||
expect_warnings: [
|
|
||||||
"WARN: + in boolean context always true [test/compress/booleans.js:1,8]",
|
|
||||||
"WARN: Condition left of || always true [test/compress/booleans.js:1,8]",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
process_returns: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function() {
|
|
||||||
return 42;
|
|
||||||
})() && console.log("PASS");
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(function() {
|
|
||||||
return 42;
|
|
||||||
})() && console.log("PASS");
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_3465_1: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(function(a) {
|
|
||||||
return typeof a;
|
|
||||||
}() ? "PASS" : "FAIL");
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(function(a) {
|
|
||||||
return 1;
|
|
||||||
}() ? "PASS" : "FAIL");
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_3465_2: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(function f(a) {
|
|
||||||
if (!a) console.log(f(42));
|
|
||||||
return typeof a;
|
|
||||||
}() ? "PASS" : "FAIL");
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(function f(a) {
|
|
||||||
if (!a) console.log(f(42));
|
|
||||||
return typeof a;
|
|
||||||
}() ? "PASS" : "FAIL");
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"number",
|
|
||||||
"PASS",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_3465_3: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
passes: 2,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(function f(a) {
|
|
||||||
return typeof a;
|
|
||||||
}() ? "PASS" : "FAIL");
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(function(a) {
|
|
||||||
return 1;
|
|
||||||
}() ? "PASS" : "FAIL");
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2737_2: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
inline: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function(bar) {
|
|
||||||
for (;bar();) break;
|
|
||||||
})(function qux() {
|
|
||||||
return console.log("PASS"), qux;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(function(bar) {
|
|
||||||
for (;bar();) break;
|
|
||||||
})(function() {
|
|
||||||
return console.log("PASS"), 1;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_3658: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
evaluate: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(function f() {
|
|
||||||
console || f();
|
|
||||||
return "PASS";
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(function f() {
|
|
||||||
console || f();
|
|
||||||
return "PASS";
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_3690: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(function(a) {
|
|
||||||
return function() {
|
|
||||||
return a = [ this ];
|
|
||||||
}() ? "PASS" : "FAIL";
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(function(a) {
|
|
||||||
return function() {
|
|
||||||
return 1;
|
|
||||||
}() ? "PASS" : "FAIL";
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_4374: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
conditionals: true,
|
|
||||||
if_return: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function() {
|
|
||||||
console.log(f());
|
|
||||||
function f(a) {
|
|
||||||
if (null) return 0;
|
|
||||||
if (a) return 1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(function() {
|
|
||||||
console.log(function(a) {
|
|
||||||
return !null && a ? 1 : 0;
|
|
||||||
}());
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect_stdout: "0"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_5028_1: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
conditionals: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 1;
|
|
||||||
console.log(function() {
|
|
||||||
return a-- ? a-- ? "FAIL 1" : "PASS" : "FAIL 2";
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 1;
|
|
||||||
console.log(function() {
|
|
||||||
return a-- ? a-- ? "FAIL 1" : "PASS" : "FAIL 2";
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_5028_2: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
conditionals: true,
|
|
||||||
dead_code: true,
|
|
||||||
if_return: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 1;
|
|
||||||
(function() {
|
|
||||||
if (a--)
|
|
||||||
if (a--)
|
|
||||||
a = "FAIL";
|
|
||||||
else
|
|
||||||
return;
|
|
||||||
})();
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 1;
|
|
||||||
(function() {
|
|
||||||
a-- && a-- && (a = "FAIL");
|
|
||||||
})();
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_stdout: "-1"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_5028_3: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
conditionals: true,
|
|
||||||
evaluate: true,
|
|
||||||
if_return: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 1;
|
|
||||||
(function() {
|
|
||||||
if (a--)
|
|
||||||
if (a--)
|
|
||||||
a = "FAIL";
|
|
||||||
else
|
|
||||||
return;
|
|
||||||
})();
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 1;
|
|
||||||
(function() {
|
|
||||||
a-- && a-- && (a = "FAIL");
|
|
||||||
})();
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_stdout: "-1"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_5041_1: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
conditionals: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 42;
|
|
||||||
if (a)
|
|
||||||
if ([ a = null ])
|
|
||||||
if (a)
|
|
||||||
console.log("FAIL");
|
|
||||||
else
|
|
||||||
console.log("PASS");
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 42;
|
|
||||||
a && [ a = null ] && (a ? console.log("FAIL") : console.log("PASS"));
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_5041_2: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
conditionals: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a;
|
|
||||||
if (!a)
|
|
||||||
if (a = 42)
|
|
||||||
if (a)
|
|
||||||
console.log("PASS");
|
|
||||||
else
|
|
||||||
console.log("FAIL");
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a;
|
|
||||||
a || (a = 42) && (a ? console.log("PASS") : console.log("FAIL"));
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_5228: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
evaluate: true,
|
|
||||||
inline: true,
|
|
||||||
passes: 2,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(function() {
|
|
||||||
return !function() {
|
|
||||||
do {
|
|
||||||
return null;
|
|
||||||
} while (console);
|
|
||||||
}();
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(function() {
|
|
||||||
do {
|
|
||||||
return !0;
|
|
||||||
} while (console);
|
|
||||||
return !0;
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
expect_stdout: "true"
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
76
test/compress/comparing.js
Normal file
76
test/compress/comparing.js
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
keep_comparisons: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
unsafe_comps: false
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var obj1 = {
|
||||||
|
valueOf: function() {triggeredFirst();}
|
||||||
|
}
|
||||||
|
var obj2 = {
|
||||||
|
valueOf: function() {triggeredSecond();}
|
||||||
|
}
|
||||||
|
var result1 = obj1 <= obj2;
|
||||||
|
var result2 = obj1 < obj2;
|
||||||
|
var result3 = obj1 >= obj2;
|
||||||
|
var result4 = obj1 > obj2;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var obj1 = {
|
||||||
|
valueOf: function() {triggeredFirst();}
|
||||||
|
}
|
||||||
|
var obj2 = {
|
||||||
|
valueOf: function() {triggeredSecond();}
|
||||||
|
}
|
||||||
|
var result1 = obj1 <= obj2;
|
||||||
|
var result2 = obj1 < obj2;
|
||||||
|
var result3 = obj1 >= obj2;
|
||||||
|
var result4 = obj1 > obj2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
keep_comparisons_with_unsafe_comps: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
unsafe_comps: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var obj1 = {
|
||||||
|
valueOf: function() {triggeredFirst();}
|
||||||
|
}
|
||||||
|
var obj2 = {
|
||||||
|
valueOf: function() {triggeredSecond();}
|
||||||
|
}
|
||||||
|
var result1 = obj1 <= obj2;
|
||||||
|
var result2 = obj1 < obj2;
|
||||||
|
var result3 = obj1 >= obj2;
|
||||||
|
var result4 = obj1 > obj2;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var obj1 = {
|
||||||
|
valueOf: function() {triggeredFirst();}
|
||||||
|
}
|
||||||
|
var obj2 = {
|
||||||
|
valueOf: function() {triggeredSecond();}
|
||||||
|
}
|
||||||
|
var result1 = obj2 >= obj1;
|
||||||
|
var result2 = obj2 > obj1;
|
||||||
|
var result3 = obj1 >= obj2;
|
||||||
|
var result4 = obj1 > obj2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dont_change_in_or_instanceof_expressions: {
|
||||||
|
input: {
|
||||||
|
1 in 1;
|
||||||
|
null in null;
|
||||||
|
1 instanceof 1;
|
||||||
|
null instanceof null;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
1 in 1;
|
||||||
|
null in null;
|
||||||
|
1 instanceof 1;
|
||||||
|
null instanceof null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,524 +0,0 @@
|
|||||||
comparisons: {
|
|
||||||
options = {
|
|
||||||
comparisons: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var obj1, obj2;
|
|
||||||
var result1 = obj1 <= obj2;
|
|
||||||
var result2 = obj1 < obj2;
|
|
||||||
var result3 = obj1 >= obj2;
|
|
||||||
var result4 = obj1 > obj2;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var obj1, obj2;
|
|
||||||
var result1 = obj1 <= obj2;
|
|
||||||
var result2 = obj1 < obj2;
|
|
||||||
var result3 = obj2 <= obj1;
|
|
||||||
var result4 = obj2 < obj1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
unsafe_comps: {
|
|
||||||
options = {
|
|
||||||
comparisons: true,
|
|
||||||
conditionals: true,
|
|
||||||
unsafe_comps: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var obj1, obj2;
|
|
||||||
obj1 <= obj2 ? f1() : g1();
|
|
||||||
obj1 < obj2 ? f2() : g2();
|
|
||||||
obj1 >= obj2 ? f3() : g3();
|
|
||||||
obj1 > obj2 ? f4() : g4();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var obj1, obj2;
|
|
||||||
(obj2 < obj1 ? g1 : f1)();
|
|
||||||
(obj1 < obj2 ? f2 : g2)();
|
|
||||||
(obj1 < obj2 ? g3 : f3)();
|
|
||||||
(obj2 < obj1 ? f4 : g4)();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dont_change_in_or_instanceof_expressions: {
|
|
||||||
input: {
|
|
||||||
1 in 1;
|
|
||||||
null in null;
|
|
||||||
1 instanceof 1;
|
|
||||||
null instanceof null;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
1 in 1;
|
|
||||||
null in null;
|
|
||||||
1 instanceof 1;
|
|
||||||
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"
|
|
||||||
}
|
|
||||||
|
|
||||||
self_comparison_3: {
|
|
||||||
options = {
|
|
||||||
comparisons: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a;
|
|
||||||
function f() {
|
|
||||||
var b = a;
|
|
||||||
a = null;
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
for (var i = 0; i < 2; i++)
|
|
||||||
console.log(f() === f());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a;
|
|
||||||
function f() {
|
|
||||||
var b = a;
|
|
||||||
a = null;
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
for (var i = 0; i < 2; i++)
|
|
||||||
console.log(f() === f());
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"false",
|
|
||||||
"true",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
self_comparison_4: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
comparisons: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var o = {};
|
|
||||||
console.log(o == o, o != o);
|
|
||||||
console.log(o === o, o !== o);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(!0, !1);
|
|
||||||
console.log(!0, !1);
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"true false",
|
|
||||||
"true false",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2857_1: {
|
|
||||||
options = {
|
|
||||||
comparisons: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f1(a) {
|
|
||||||
a === undefined || a === null;
|
|
||||||
a === undefined || a !== null;
|
|
||||||
a !== undefined || a === null;
|
|
||||||
a !== undefined || a !== null;
|
|
||||||
a === undefined && a === null;
|
|
||||||
a === undefined && a !== null;
|
|
||||||
a !== undefined && a === null;
|
|
||||||
a !== undefined && a !== null;
|
|
||||||
}
|
|
||||||
function f2(a) {
|
|
||||||
a === null || a === undefined;
|
|
||||||
a === null || a !== undefined;
|
|
||||||
a !== null || a === undefined;
|
|
||||||
a !== null || a !== undefined;
|
|
||||||
a === null && a === undefined;
|
|
||||||
a === null && a !== undefined;
|
|
||||||
a !== null && a === undefined;
|
|
||||||
a !== null && a !== undefined;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f1(a) {
|
|
||||||
null == a;
|
|
||||||
void 0 === a || null !== a;
|
|
||||||
void 0 !== a || null === a;
|
|
||||||
void 0 !== a || null !== a;
|
|
||||||
void 0 === a && null === a;
|
|
||||||
void 0 === a && null !== a;
|
|
||||||
void 0 !== a && null === a;
|
|
||||||
null != a;
|
|
||||||
}
|
|
||||||
function f2(a) {
|
|
||||||
null == a;
|
|
||||||
null === a || void 0 !== a;
|
|
||||||
null !== a || void 0 === a;
|
|
||||||
null !== a || void 0 !== a;
|
|
||||||
null === a && void 0 === a;
|
|
||||||
null === a && void 0 !== a;
|
|
||||||
null !== a && void 0 === a;
|
|
||||||
null != a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2857_2: {
|
|
||||||
options = {
|
|
||||||
comparisons: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(a, p) {
|
|
||||||
a === undefined || a === null || p;
|
|
||||||
a === undefined || a !== null || p;
|
|
||||||
a !== undefined || a === null || p;
|
|
||||||
a !== undefined || a !== null || p;
|
|
||||||
a === undefined && a === null || p;
|
|
||||||
a === undefined && a !== null || p;
|
|
||||||
a !== undefined && a === null || p;
|
|
||||||
a !== undefined && a !== null || p;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(a, p) {
|
|
||||||
null == a || p;
|
|
||||||
void 0 === a || null !== a || p;
|
|
||||||
void 0 !== a || null === a || p;
|
|
||||||
void 0 !== a || null !== a || p;
|
|
||||||
void 0 === a && null === a || p;
|
|
||||||
void 0 === a && null !== a || p;
|
|
||||||
void 0 !== a && null === a || p;
|
|
||||||
null != a || p;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2857_3: {
|
|
||||||
options = {
|
|
||||||
comparisons: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(a, p) {
|
|
||||||
a === undefined || a === null && p;
|
|
||||||
a === undefined || a !== null && p;
|
|
||||||
a !== undefined || a === null && p;
|
|
||||||
a !== undefined || a !== null && p;
|
|
||||||
a === undefined && a === null && p;
|
|
||||||
a === undefined && a !== null && p;
|
|
||||||
a !== undefined && a === null && p;
|
|
||||||
a !== undefined && a !== null && p;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(a, p) {
|
|
||||||
void 0 === a || null === a && p;
|
|
||||||
void 0 === a || null !== a && p;
|
|
||||||
void 0 !== a || null === a && p;
|
|
||||||
void 0 !== a || null !== a && p;
|
|
||||||
void 0 === a && null === a && p;
|
|
||||||
void 0 === a && null !== a && p;
|
|
||||||
void 0 !== a && null === a && p;
|
|
||||||
null != a && p;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2857_4: {
|
|
||||||
options = {
|
|
||||||
comparisons: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(a, p) {
|
|
||||||
p || a === undefined || a === null;
|
|
||||||
p || a === undefined || a !== null;
|
|
||||||
p || a !== undefined || a === null;
|
|
||||||
p || a !== undefined || a !== null;
|
|
||||||
p || a === undefined && a === null;
|
|
||||||
p || a === undefined && a !== null;
|
|
||||||
p || a !== undefined && a === null;
|
|
||||||
p || a !== undefined && a !== null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(a, p) {
|
|
||||||
p || null == a;
|
|
||||||
p || void 0 === a || null !== a;
|
|
||||||
p || void 0 !== a || null === a;
|
|
||||||
p || void 0 !== a || null !== a;
|
|
||||||
p || void 0 === a && null === a;
|
|
||||||
p || void 0 === a && null !== a;
|
|
||||||
p || void 0 !== a && null === a;
|
|
||||||
p || null != a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2857_5: {
|
|
||||||
options = {
|
|
||||||
comparisons: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(a, p) {
|
|
||||||
p && a === undefined || a === null;
|
|
||||||
p && a === undefined || a !== null;
|
|
||||||
p && a !== undefined || a === null;
|
|
||||||
p && a !== undefined || a !== null;
|
|
||||||
p && a === undefined && a === null;
|
|
||||||
p && a === undefined && a !== null;
|
|
||||||
p && a !== undefined && a === null;
|
|
||||||
p && a !== undefined && a !== null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(a, p) {
|
|
||||||
p && void 0 === a || null === a;
|
|
||||||
p && void 0 === a || null !== a;
|
|
||||||
p && void 0 !== a || null === a;
|
|
||||||
p && void 0 !== a || null !== a;
|
|
||||||
p && void 0 === a && null === a;
|
|
||||||
p && void 0 === a && null !== a;
|
|
||||||
p && void 0 !== a && null === a;
|
|
||||||
p && null != a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2857_6: {
|
|
||||||
options = {
|
|
||||||
comparisons: true,
|
|
||||||
pure_getters: "strict",
|
|
||||||
reduce_vars: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(a) {
|
|
||||||
if (({}).b === undefined || {}.b === null)
|
|
||||||
return a.b !== undefined && a.b !== null;
|
|
||||||
}
|
|
||||||
console.log(f({
|
|
||||||
a: [ null ],
|
|
||||||
get b() {
|
|
||||||
return this.a.shift();
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(a) {
|
|
||||||
if (null == {}.b)
|
|
||||||
return void 0 !== a.b && null !== a.b;
|
|
||||||
}
|
|
||||||
console.log(f({
|
|
||||||
a: [ null ],
|
|
||||||
get b() {
|
|
||||||
return this.a.shift();
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
expect_stdout: "true"
|
|
||||||
}
|
|
||||||
|
|
||||||
is_boolean_unsafe: {
|
|
||||||
options = {
|
|
||||||
comparisons: true,
|
|
||||||
unsafe: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(/foo/.test("bar") === [].isPrototypeOf({}));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(/foo/.test("bar") == [].isPrototypeOf({}));
|
|
||||||
}
|
|
||||||
expect_stdout: "true"
|
|
||||||
}
|
|
||||||
|
|
||||||
is_number_unsafe: {
|
|
||||||
options = {
|
|
||||||
comparisons: true,
|
|
||||||
unsafe: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(Math.acos(42) !== "foo".charCodeAt(4));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(Math.acos(42) != "foo".charCodeAt(4));
|
|
||||||
}
|
|
||||||
expect_stdout: "true"
|
|
||||||
}
|
|
||||||
|
|
||||||
is_boolean_var: {
|
|
||||||
options = {
|
|
||||||
comparisons: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(function(a, b) {
|
|
||||||
for (var i = 0, c = !b; i < a.length; i++)
|
|
||||||
if (!a[i] === c)
|
|
||||||
return i;
|
|
||||||
}([ false, true ], 42));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(function(a, b) {
|
|
||||||
for (var i = 0, c = !b; i < a.length; i++)
|
|
||||||
if (!a[i] == c)
|
|
||||||
return i;
|
|
||||||
}([ false, true ], 42));
|
|
||||||
}
|
|
||||||
expect_stdout: "1"
|
|
||||||
}
|
|
||||||
|
|
||||||
is_defined: {
|
|
||||||
options = {
|
|
||||||
comparisons: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(function a() {
|
|
||||||
return void 0 === a;
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(function a() {
|
|
||||||
return a, false;
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
expect_stdout: "false"
|
|
||||||
expect_warnings: [
|
|
||||||
"WARN: Expression always defined [test/compress/comparisons.js:2,19]",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
unsafe_indexOf: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
comparisons: true,
|
|
||||||
unsafe: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = Object.keys({ foo: 42 });
|
|
||||||
if (a.indexOf("bar") < 0) console.log("PASS");
|
|
||||||
if (0 > a.indexOf("bar")) console.log("PASS");
|
|
||||||
if (a.indexOf("foo") >= 0) console.log("PASS");
|
|
||||||
if (0 <= a.indexOf("foo")) console.log("PASS");
|
|
||||||
if (a.indexOf("foo") > -1) console.log("PASS");
|
|
||||||
if (-1 < a.indexOf("foo")) console.log("PASS");
|
|
||||||
if (a.indexOf("bar") == -1) console.log("PASS");
|
|
||||||
if (-1 == a.indexOf("bar")) console.log("PASS");
|
|
||||||
if (a.indexOf("bar") === -1) console.log("PASS");
|
|
||||||
if (-1 === a.indexOf("bar")) console.log("PASS");
|
|
||||||
if (a.indexOf("foo") != -1) console.log("PASS");
|
|
||||||
if (-1 != a.indexOf("foo")) console.log("PASS");
|
|
||||||
if (a.indexOf("foo") !== -1) console.log("PASS");
|
|
||||||
if (-1 !== a.indexOf("foo")) console.log("PASS");
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = Object.keys({ foo: 42 });
|
|
||||||
if (!~a.indexOf("bar")) console.log("PASS");
|
|
||||||
if (!~a.indexOf("bar")) console.log("PASS");
|
|
||||||
if (~a.indexOf("foo")) console.log("PASS");
|
|
||||||
if (~a.indexOf("foo")) console.log("PASS");
|
|
||||||
if (~a.indexOf("foo")) console.log("PASS");
|
|
||||||
if (~a.indexOf("foo")) console.log("PASS");
|
|
||||||
if (!~a.indexOf("bar")) console.log("PASS");
|
|
||||||
if (!~a.indexOf("bar")) console.log("PASS");
|
|
||||||
if (!~a.indexOf("bar")) console.log("PASS");
|
|
||||||
if (!~a.indexOf("bar")) console.log("PASS");
|
|
||||||
if (~a.indexOf("foo")) console.log("PASS");
|
|
||||||
if (~a.indexOf("foo")) console.log("PASS");
|
|
||||||
if (~a.indexOf("foo")) console.log("PASS");
|
|
||||||
if (~a.indexOf("foo")) console.log("PASS");
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"PASS",
|
|
||||||
"PASS",
|
|
||||||
"PASS",
|
|
||||||
"PASS",
|
|
||||||
"PASS",
|
|
||||||
"PASS",
|
|
||||||
"PASS",
|
|
||||||
"PASS",
|
|
||||||
"PASS",
|
|
||||||
"PASS",
|
|
||||||
"PASS",
|
|
||||||
"PASS",
|
|
||||||
"PASS",
|
|
||||||
"PASS",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_3413: {
|
|
||||||
options = {
|
|
||||||
comparisons: true,
|
|
||||||
evaluate: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var b;
|
|
||||||
void 0 !== ("" < b || void 0) || console.log("PASS");
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var b;
|
|
||||||
void 0 === ("" < b || void 0) && console.log("PASS");
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
nullish_assign: {
|
|
||||||
options = {
|
|
||||||
comparisons: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a;
|
|
||||||
void 0 !== (a = "PASS".split("")) && null !== a && console.log(a.join("-"));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a;
|
|
||||||
null != (a = "PASS".split("")) && console.log(a.join("-"));
|
|
||||||
}
|
|
||||||
expect_stdout: "P-A-S-S"
|
|
||||||
}
|
|
||||||
|
|
||||||
nullish_chain: {
|
|
||||||
options = {
|
|
||||||
comparisons: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a;
|
|
||||||
A || B || void 0 === a || null === a || C;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a;
|
|
||||||
A || B || null == a || C;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
concat_1: {
|
concat_1: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true
|
||||||
}
|
};
|
||||||
input: {
|
input: {
|
||||||
var a = "foo" + "bar" + x() + "moo" + "foo" + y() + "x" + "y" + "z" + q();
|
var a = "foo" + "bar" + x() + "moo" + "foo" + y() + "x" + "y" + "z" + q();
|
||||||
var b = "foo" + 1 + x() + 2 + "boo";
|
var b = "foo" + 1 + x() + 2 + "boo";
|
||||||
@@ -21,14 +21,12 @@ concat_1: {
|
|||||||
var c = 1 + x() + 2 + "boo";
|
var c = 1 + x() + 2 + "boo";
|
||||||
var d = 1 + x() + 2 + 3 + "boo";
|
var d = 1 + x() + 2 + 3 + "boo";
|
||||||
var e = 1 + x() + 2 + "X3boo";
|
var e = 1 + x() + 2 + "X3boo";
|
||||||
var f = "\x00360\x008\0";
|
var f = "\x00360\08\0";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
concat_2: {
|
concat_2: {
|
||||||
options = {
|
options = {};
|
||||||
strings: true,
|
|
||||||
}
|
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
1 + (2 + 3),
|
1 + (2 + 3),
|
||||||
@@ -57,9 +55,7 @@ concat_2: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
concat_3: {
|
concat_3: {
|
||||||
options = {
|
options = {};
|
||||||
strings: true,
|
|
||||||
}
|
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
1 + 2 + (3 + 4 + 5),
|
1 + 2 + (3 + 4 + 5),
|
||||||
@@ -88,9 +84,7 @@ concat_3: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
concat_4: {
|
concat_4: {
|
||||||
options = {
|
options = {};
|
||||||
strings: true,
|
|
||||||
}
|
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
1 + "2" + (3 + 4 + 5),
|
1 + "2" + (3 + 4 + 5),
|
||||||
@@ -119,9 +113,7 @@ concat_4: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
concat_5: {
|
concat_5: {
|
||||||
options = {
|
options = {};
|
||||||
strings: true,
|
|
||||||
}
|
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
"1" + 2 + (3 + 4 + 5),
|
"1" + 2 + (3 + 4 + 5),
|
||||||
@@ -150,9 +142,7 @@ concat_5: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
concat_6: {
|
concat_6: {
|
||||||
options = {
|
options = {};
|
||||||
strings: true,
|
|
||||||
}
|
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
"1" + "2" + (3 + 4 + 5),
|
"1" + "2" + (3 + 4 + 5),
|
||||||
@@ -181,9 +171,6 @@ concat_6: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
concat_7: {
|
concat_7: {
|
||||||
options = {
|
|
||||||
strings: true,
|
|
||||||
}
|
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
"" + 1,
|
"" + 1,
|
||||||
@@ -210,9 +197,6 @@ concat_7: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
concat_8: {
|
concat_8: {
|
||||||
options = {
|
|
||||||
strings: true,
|
|
||||||
}
|
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
1 + "",
|
1 + "",
|
||||||
@@ -237,70 +221,3 @@ concat_8: {
|
|||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
concat_9: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
evaluate: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
strings: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = "foo";
|
|
||||||
console.log(
|
|
||||||
12 + (34 + a),
|
|
||||||
null + (34 + a),
|
|
||||||
12 + (null + a),
|
|
||||||
false + (34 + a),
|
|
||||||
12 + (false + a),
|
|
||||||
"bar" + (34 + a),
|
|
||||||
12 + ("bar" + a)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = "foo";
|
|
||||||
console.log(
|
|
||||||
"1234" + a,
|
|
||||||
"null34" + a,
|
|
||||||
"12null" + a,
|
|
||||||
!1 + (34 + a),
|
|
||||||
12 + (!1 + a),
|
|
||||||
"bar34" + a,
|
|
||||||
"12bar" + a
|
|
||||||
);
|
|
||||||
}
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_3689: {
|
|
||||||
options = {
|
|
||||||
strings: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(function(a) {
|
|
||||||
return a + ("" + (a[0] = 0));
|
|
||||||
}([]));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(function(a) {
|
|
||||||
return a + ("" + (a[0] = 0));
|
|
||||||
}([]));
|
|
||||||
}
|
|
||||||
expect_stdout: "00"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_5145: {
|
|
||||||
options = {
|
|
||||||
strings: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = [];
|
|
||||||
console.log("" + a + ((a[0] = 4) + "2"));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = [];
|
|
||||||
console.log("" + a + (a[0] = 4) + "2");
|
|
||||||
}
|
|
||||||
expect_stdout: "42"
|
|
||||||
}
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,7 @@
|
|||||||
keep_debugger: {
|
keep_debugger: {
|
||||||
options = {
|
options = {
|
||||||
drop_debugger: false,
|
drop_debugger: false
|
||||||
}
|
};
|
||||||
input: {
|
input: {
|
||||||
debugger;
|
debugger;
|
||||||
}
|
}
|
||||||
@@ -12,8 +12,8 @@ keep_debugger: {
|
|||||||
|
|
||||||
drop_debugger: {
|
drop_debugger: {
|
||||||
options = {
|
options = {
|
||||||
drop_debugger: true,
|
drop_debugger: true
|
||||||
}
|
};
|
||||||
input: {
|
input: {
|
||||||
debugger;
|
debugger;
|
||||||
if (foo) debugger;
|
if (foo) debugger;
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
309
test/compress/destructuring.js
Normal file
309
test/compress/destructuring.js
Normal file
@@ -0,0 +1,309 @@
|
|||||||
|
destructuring_arrays: {
|
||||||
|
input: {
|
||||||
|
{const [aa, bb] = cc;}
|
||||||
|
{const [aa, [bb, cc]] = dd;}
|
||||||
|
{let [aa, bb] = cc;}
|
||||||
|
{let [aa, [bb, cc]] = dd;}
|
||||||
|
var [aa, bb] = cc;
|
||||||
|
var [aa, [bb, cc]] = dd;
|
||||||
|
var [,[,,,,,],,,zz,] = xx; // Trailing comma
|
||||||
|
var [,,zzz,,] = xxx; // Trailing comma after hole
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
{const [aa, bb] = cc;}
|
||||||
|
{const [aa, [bb, cc]] = dd;}
|
||||||
|
{let [aa, bb] = cc;}
|
||||||
|
{let [aa, [bb, cc]] = dd;}
|
||||||
|
var [aa, bb] = cc;
|
||||||
|
var [aa, [bb, cc]] = dd;
|
||||||
|
var [,[,,,,,],,,zz] = xx;
|
||||||
|
var [,,zzz,,] = xxx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
destructuring_arrays_holes: {
|
||||||
|
input: {
|
||||||
|
var [,,,,] = a;
|
||||||
|
var [,,b,] = c;
|
||||||
|
var [d,,] = e;
|
||||||
|
}
|
||||||
|
expect_exact: "var[,,,,]=a;var[,,b]=c;var[d,,]=e;"
|
||||||
|
}
|
||||||
|
|
||||||
|
destructuring_objects: {
|
||||||
|
input: {
|
||||||
|
{const {aa, bb} = {aa:1, bb:2};}
|
||||||
|
{const {aa, bb: {cc, dd}} = {aa:1, bb: {cc:2, dd: 3}};}
|
||||||
|
{let {aa, bb} = {aa:1, bb:2};}
|
||||||
|
{let {aa, bb: {cc, dd}} = {aa:1, bb: {cc:2, dd: 3}};}
|
||||||
|
var {aa, bb} = {aa:1, bb:2};
|
||||||
|
var {aa, bb: {cc, dd}} = {aa:1, bb: {cc:2, dd: 3}};
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
{const {aa, bb} = {aa:1, bb:2};}
|
||||||
|
{const {aa, bb: {cc, dd}} = {aa:1, bb: {cc:2, dd: 3}};}
|
||||||
|
{let {aa, bb} = {aa:1, bb:2};}
|
||||||
|
{let {aa, bb: {cc, dd}} = {aa:1, bb: {cc:2, dd: 3}};}
|
||||||
|
var {aa, bb} = {aa:1, bb:2};
|
||||||
|
var {aa, bb: {cc, dd}} = {aa:1, bb: {cc:2, dd: 3}};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
destructuring_objects_trailing_elision: {
|
||||||
|
beautify = {
|
||||||
|
ecma: 6
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var {cc,} = foo;
|
||||||
|
}
|
||||||
|
expect_exact: "var{cc}=foo;"
|
||||||
|
}
|
||||||
|
|
||||||
|
nested_destructuring_objects: {
|
||||||
|
beautify = {
|
||||||
|
ecma: 6
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
const [{a},b] = c;
|
||||||
|
let [{a},b] = c;
|
||||||
|
var [{a},b] = c;
|
||||||
|
}
|
||||||
|
expect_exact: 'const[{a},b]=c;let[{a},b]=c;var[{a},b]=c;';
|
||||||
|
}
|
||||||
|
|
||||||
|
destructuring_constdef_in_loops: {
|
||||||
|
beautify = {
|
||||||
|
ecma: 6
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
for (const [x,y] in pairs);
|
||||||
|
for (const [a] = 0;;);
|
||||||
|
for (const {c} of cees);
|
||||||
|
}
|
||||||
|
expect_exact: "for(const[x,y]in pairs);for(const[a]=0;;);for(const{c}of cees);"
|
||||||
|
}
|
||||||
|
|
||||||
|
destructuring_letdef_in_loops: {
|
||||||
|
beautify = {
|
||||||
|
ecma: 6
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
for (let [x,y] in pairs);
|
||||||
|
for (let [a] = 0;;);
|
||||||
|
for (let {c} of cees);
|
||||||
|
}
|
||||||
|
expect_exact: "for(let[x,y]in pairs);for(let[a]=0;;);for(let{c}of cees);"
|
||||||
|
}
|
||||||
|
|
||||||
|
destructuring_vardef_in_loops: {
|
||||||
|
beautify = {
|
||||||
|
ecma: 6
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
for (var [x,y] in pairs);
|
||||||
|
for (var [a] = 0;;);
|
||||||
|
for (var {c} of cees);
|
||||||
|
}
|
||||||
|
expect_exact: "for(var[x,y]in pairs);for(var[a]=0;;);for(var{c}of cees);"
|
||||||
|
}
|
||||||
|
|
||||||
|
destructuring_expressions: {
|
||||||
|
beautify = {
|
||||||
|
ecma: 6
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
({a, b});
|
||||||
|
[{a}];
|
||||||
|
f({x});
|
||||||
|
}
|
||||||
|
expect_exact: "({a,b});[{a}];f({x});"
|
||||||
|
}
|
||||||
|
|
||||||
|
destructuring_remove_unused_1: {
|
||||||
|
options = {
|
||||||
|
unused: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function a() {
|
||||||
|
var unused = "foo";
|
||||||
|
var a = [1];
|
||||||
|
var [b] = a;
|
||||||
|
f(b);
|
||||||
|
}
|
||||||
|
function b() {
|
||||||
|
var unused = "foo";
|
||||||
|
var a = {b: 1};
|
||||||
|
var {b} = a;
|
||||||
|
f(b);
|
||||||
|
}
|
||||||
|
function c() {
|
||||||
|
var unused = "foo";
|
||||||
|
var a = [[1]];
|
||||||
|
var [[b]] = a;
|
||||||
|
f(b);
|
||||||
|
}
|
||||||
|
function d() {
|
||||||
|
var unused = "foo";
|
||||||
|
var a = {b: {b:1}};
|
||||||
|
var {b:{b}} = a;
|
||||||
|
f(b);
|
||||||
|
}
|
||||||
|
function e() {
|
||||||
|
var unused = "foo";
|
||||||
|
var a = [1, 2, 3, 4, 5];
|
||||||
|
var [b, ...c] = a;
|
||||||
|
f(b, c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function a() {
|
||||||
|
var a = [1];
|
||||||
|
var [b] = a;
|
||||||
|
f(b);
|
||||||
|
}
|
||||||
|
function b() {
|
||||||
|
var a = {b: 1};
|
||||||
|
var {b} = a;
|
||||||
|
f(b);
|
||||||
|
}
|
||||||
|
function c() {
|
||||||
|
var a = [[1]];
|
||||||
|
var [[b]] = a;
|
||||||
|
f(b);
|
||||||
|
}
|
||||||
|
function d() {
|
||||||
|
var a = {b: {b:1}};
|
||||||
|
var {b:{b}} = a;
|
||||||
|
f(b);
|
||||||
|
}
|
||||||
|
function e() {
|
||||||
|
var a = [1, 2, 3, 4, 5];
|
||||||
|
var [b, ...c] = a;
|
||||||
|
f(b, c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
destructuring_remove_unused_2: {
|
||||||
|
options = {
|
||||||
|
unused: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function a() {
|
||||||
|
var unused = "foo";
|
||||||
|
var a = [,,1];
|
||||||
|
var [b] = a;
|
||||||
|
f(b);
|
||||||
|
}
|
||||||
|
function b() {
|
||||||
|
var unused = "foo";
|
||||||
|
var a = [{a: [1]}];
|
||||||
|
var [{b: a}] = a;
|
||||||
|
f(b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function a() {
|
||||||
|
var a = [,,1];
|
||||||
|
var [b] = a;
|
||||||
|
f(b);
|
||||||
|
}
|
||||||
|
function b() {
|
||||||
|
var a = [{a: [1]}];
|
||||||
|
var [{b: a}] = a;
|
||||||
|
f(b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
object_destructuring_may_need_parentheses: {
|
||||||
|
beautify = {
|
||||||
|
ecma: 6
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
({a, b} = {a: 1, b: 2});
|
||||||
|
}
|
||||||
|
expect_exact: "({a,b}={a:1,b:2});"
|
||||||
|
}
|
||||||
|
|
||||||
|
destructuring_with_undefined_as_default_assignment: {
|
||||||
|
options = {
|
||||||
|
evaluate: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
[foo = undefined] = bar;
|
||||||
|
[foo = void 0] = bar;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
[foo] = bar;
|
||||||
|
[foo] = bar;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
destructuring_dont_evaluate_with_undefined_as_default_assignment: {
|
||||||
|
options = {
|
||||||
|
evaluate: false
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
[foo = undefined] = bar;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
[foo = void 0] = bar;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
reduce_vars: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
{const [aa, [bb, cc]] = dd;}
|
||||||
|
{let [aa, [bb, cc]] = dd;}
|
||||||
|
var [aa, [bb, cc]] = dd;
|
||||||
|
[aa, [bb, cc]] = dd;
|
||||||
|
{const {aa, bb: {cc, dd}} = {aa:1, bb: {cc:2, dd: 3}};}
|
||||||
|
{let {aa, bb: {cc, dd}} = {aa:1, bb: {cc:2, dd: 3}};}
|
||||||
|
var {aa, bb: {cc, dd}} = {aa:1, bb: {cc:2, dd: 3}};
|
||||||
|
({aa, bb: {cc, dd}} = {aa:1, bb: {cc:2, dd: 3}});
|
||||||
|
const [{a},b] = c;
|
||||||
|
let [{a},b] = c;
|
||||||
|
var [{a},b] = c;
|
||||||
|
[{a},b] = c;
|
||||||
|
for (const [x,y] in pairs);
|
||||||
|
for (let [x,y] in pairs);
|
||||||
|
for (var [x,y] in pairs);
|
||||||
|
for ([x,y] in pairs);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
{const [aa, [bb, cc]] = dd;}
|
||||||
|
{let [aa, [bb, cc]] = dd;}
|
||||||
|
var [aa, [bb, cc]] = dd;
|
||||||
|
[aa, [bb, cc]] = dd;
|
||||||
|
{const {aa, bb: {cc, dd}} = {aa:1, bb: {cc:2, dd: 3}};}
|
||||||
|
{let {aa, bb: {cc, dd}} = {aa:1, bb: {cc:2, dd: 3}};}
|
||||||
|
var {aa, bb: {cc, dd}} = {aa:1, bb: {cc:2, dd: 3}};
|
||||||
|
({aa, bb: {cc, dd}} = {aa:1, bb: {cc:2, dd: 3}});
|
||||||
|
const [{a},b] = c;
|
||||||
|
let [{a},b] = c;
|
||||||
|
var [{a},b] = c;
|
||||||
|
[{a},b] = c;
|
||||||
|
for (const [x,y] in pairs);
|
||||||
|
for (let [x,y] in pairs);
|
||||||
|
for (var [x,y] in pairs);
|
||||||
|
for ([x,y] in pairs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unused: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
let { foo: [, , ...a] } = { foo: [1, 2, 3, 4], bar: 5 };
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
let { foo: [, , ...a] } = { foo: [1, 2, 3, 4], bar: 5 };
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,160 +1,10 @@
|
|||||||
simple_statement_is_not_a_directive: {
|
class_directives_compression: {
|
||||||
input: {
|
input: {
|
||||||
"use strict"
|
class foo {
|
||||||
.split(" ")
|
foo() {
|
||||||
.forEach(function(s) {
|
|
||||||
console.log(s);
|
|
||||||
});
|
|
||||||
console.log(!this); // is strict mode?
|
|
||||||
(function() {
|
|
||||||
"directive"
|
|
||||||
""
|
|
||||||
"use strict"
|
|
||||||
"hello world"
|
|
||||||
.split(" ")
|
|
||||||
.forEach(function(s) {
|
|
||||||
console.log(s);
|
|
||||||
});
|
|
||||||
console.log(!this); // is strict mode?
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
"use strict".split(" ").forEach(function(s) {
|
|
||||||
console.log(s);
|
|
||||||
});
|
|
||||||
console.log(!this);
|
|
||||||
(function() {
|
|
||||||
"directive";
|
|
||||||
"";
|
|
||||||
"use strict";
|
"use strict";
|
||||||
"hello world".split(" ").forEach(function(s) {
|
|
||||||
console.log(s);
|
|
||||||
});
|
|
||||||
console.log(!this);
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"use",
|
|
||||||
"strict",
|
|
||||||
"false",
|
|
||||||
"hello",
|
|
||||||
"world",
|
|
||||||
"true",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
drop_lone_use_strict: {
|
|
||||||
options = {
|
|
||||||
directives: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f1() {
|
|
||||||
"use strict";
|
|
||||||
}
|
|
||||||
function f2() {
|
|
||||||
"use strict";
|
|
||||||
function f3() {
|
|
||||||
"use strict";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
(function f4() {
|
|
||||||
"use strict";
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f1() {
|
|
||||||
}
|
|
||||||
function f2() {
|
|
||||||
}
|
|
||||||
(function() {})();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_3166: {
|
|
||||||
options = {
|
|
||||||
directives: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
"foo";
|
|
||||||
"use strict";
|
|
||||||
function f() {
|
|
||||||
"use strict";
|
|
||||||
"bar";
|
|
||||||
"use asm";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
"use strict";
|
|
||||||
function f() {
|
|
||||||
"use asm";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
valid_after_invalid_1: {
|
|
||||||
input: {
|
|
||||||
console.log(typeof function() {
|
|
||||||
"use\x20strict";
|
|
||||||
"use strict";
|
|
||||||
return this;
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(typeof function() {
|
|
||||||
"use\x20strict";
|
|
||||||
"use strict";
|
|
||||||
return this;
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
expect_stdout: "undefined"
|
|
||||||
}
|
|
||||||
|
|
||||||
valid_after_invalid_2: {
|
|
||||||
options = {
|
|
||||||
directives: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(typeof function() {
|
|
||||||
"use\x20strict";
|
|
||||||
"use strict";
|
|
||||||
return this;
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(typeof function() {
|
|
||||||
"use strict";
|
|
||||||
return this;
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
expect_stdout: "undefined"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_5368_1: {
|
|
||||||
options = {
|
|
||||||
directives: true,
|
|
||||||
expression: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
"foo";
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
"foo";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_5368_2: {
|
|
||||||
options = {
|
|
||||||
directives: true,
|
|
||||||
expression: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
"foo";
|
|
||||||
(function() {
|
|
||||||
"bar";
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(function() {})();
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: "class foo{foo(){}}"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
drop_console_1: {
|
drop_console_1: {
|
||||||
options = {}
|
options = {};
|
||||||
input: {
|
input: {
|
||||||
console.log('foo');
|
console.log('foo');
|
||||||
console.log.apply(console, arguments);
|
console.log.apply(console, arguments);
|
||||||
@@ -11,9 +11,7 @@ drop_console_1: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
drop_console_2: {
|
drop_console_2: {
|
||||||
options = {
|
options = { drop_console: true };
|
||||||
drop_console: true,
|
|
||||||
}
|
|
||||||
input: {
|
input: {
|
||||||
console.log('foo');
|
console.log('foo');
|
||||||
console.log.apply(console, arguments);
|
console.log.apply(console, arguments);
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
28
test/compress/expansions.js
Normal file
28
test/compress/expansions.js
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
|
||||||
|
expand_arguments: {
|
||||||
|
input: {
|
||||||
|
func(a, ...rest);
|
||||||
|
func(...all);
|
||||||
|
}
|
||||||
|
expect_exact: "func(a,...rest);func(...all);"
|
||||||
|
}
|
||||||
|
|
||||||
|
expand_expression_arguments: {
|
||||||
|
input: {
|
||||||
|
f(...a.b);
|
||||||
|
f(...a.b());
|
||||||
|
f(...(a));
|
||||||
|
f(...(a.b));
|
||||||
|
f(...a[i]);
|
||||||
|
}
|
||||||
|
expect_exact: "f(...a.b);f(...a.b());f(...a);f(...a.b);f(...a[i]);"
|
||||||
|
}
|
||||||
|
|
||||||
|
expand_parameters: {
|
||||||
|
input: {
|
||||||
|
(function (a, ...b){});
|
||||||
|
(function (...args){});
|
||||||
|
}
|
||||||
|
expect_exact: "(function(a,...b){});(function(...args){});"
|
||||||
|
}
|
||||||
|
|
||||||
@@ -1,147 +0,0 @@
|
|||||||
precedence_1: {
|
|
||||||
input: {
|
|
||||||
console.log(-4 ** 3 ** 2);
|
|
||||||
}
|
|
||||||
expect_exact: "console.log((-4)**3**2);"
|
|
||||||
expect_stdout: "-262144"
|
|
||||||
node_version: ">=8"
|
|
||||||
}
|
|
||||||
|
|
||||||
precedence_2: {
|
|
||||||
input: {
|
|
||||||
console.log(-4 ** (3 ** 2));
|
|
||||||
}
|
|
||||||
expect_exact: "console.log((-4)**3**2);"
|
|
||||||
expect_stdout: "-262144"
|
|
||||||
node_version: ">=8"
|
|
||||||
}
|
|
||||||
|
|
||||||
precedence_3: {
|
|
||||||
input: {
|
|
||||||
console.log(-(4 ** 3) ** 2);
|
|
||||||
}
|
|
||||||
expect_exact: "console.log((-(4**3))**2);"
|
|
||||||
expect_stdout: "4096"
|
|
||||||
node_version: ">=8"
|
|
||||||
}
|
|
||||||
|
|
||||||
precedence_4: {
|
|
||||||
input: {
|
|
||||||
console.log((-4 ** 3) ** 2);
|
|
||||||
}
|
|
||||||
expect_exact: "console.log(((-4)**3)**2);"
|
|
||||||
expect_stdout: "4096"
|
|
||||||
node_version: ">=8"
|
|
||||||
}
|
|
||||||
|
|
||||||
await: {
|
|
||||||
input: {
|
|
||||||
(async a => a * await a ** ++a % a)(2).then(console.log);
|
|
||||||
}
|
|
||||||
expect_exact: "(async a=>a*(await a)**++a%a)(2).then(console.log);"
|
|
||||||
expect_stdout: "1"
|
|
||||||
node_version: ">=8"
|
|
||||||
}
|
|
||||||
|
|
||||||
assignment_1: {
|
|
||||||
input: {
|
|
||||||
var a = 2;
|
|
||||||
a **= 5;
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_exact: "var a=2;a**=5;console.log(a);"
|
|
||||||
expect_stdout: "32"
|
|
||||||
node_version: ">=8"
|
|
||||||
}
|
|
||||||
|
|
||||||
assignment_2: {
|
|
||||||
input: {
|
|
||||||
var a = 8n;
|
|
||||||
a **= a;
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_exact: "var a=8n;a**=a;console.log(a);"
|
|
||||||
expect_stdout: "16777216n"
|
|
||||||
node_version: ">=10.4.0"
|
|
||||||
}
|
|
||||||
|
|
||||||
evaluate: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(1 + 2 ** 3 - 4);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(5);
|
|
||||||
}
|
|
||||||
expect_stdout: "5"
|
|
||||||
node_version: ">=8"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_4664: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
evaluate: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {
|
|
||||||
new function(a) {
|
|
||||||
console.log(typeof f, a, typeof this);
|
|
||||||
}((A = 0, (NaN ^ 1) * 2 ** 30), 0);
|
|
||||||
}
|
|
||||||
f();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(function f() {
|
|
||||||
new function(a) {
|
|
||||||
console.log(typeof f, 2 ** 30, typeof this);
|
|
||||||
}(A = 0);
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect_stdout: "function 1073741824 object"
|
|
||||||
node_version: ">=8"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_4715: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
A = 1;
|
|
||||||
console.log((-0) ** A + 0);
|
|
||||||
console.log((-0) ** A - 0);
|
|
||||||
console.log((-0) ** A * 1);
|
|
||||||
console.log((-0) ** A / 1);
|
|
||||||
console.log(Math.pow(-0, A) + 0);
|
|
||||||
console.log(Math.pow(-0, A) - 0);
|
|
||||||
console.log(Math.pow(-0, A) * 1);
|
|
||||||
console.log(Math.pow(-0, A) / 1);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
A = 1;
|
|
||||||
console.log((-0) ** A + 0);
|
|
||||||
console.log((-0) ** A);
|
|
||||||
console.log((-0) ** A * 1);
|
|
||||||
console.log((-0) ** A);
|
|
||||||
console.log(Math.pow(-0, A) + 0);
|
|
||||||
console.log(+Math.pow(-0, A));
|
|
||||||
console.log(+Math.pow(-0, A));
|
|
||||||
console.log(+Math.pow(-0, A));
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"0",
|
|
||||||
"-0",
|
|
||||||
"-0",
|
|
||||||
"-0",
|
|
||||||
"0",
|
|
||||||
"-0",
|
|
||||||
"-0",
|
|
||||||
"-0",
|
|
||||||
]
|
|
||||||
node_version: ">=8"
|
|
||||||
}
|
|
||||||
@@ -1,498 +0,0 @@
|
|||||||
refs: {
|
|
||||||
input: {
|
|
||||||
export {};
|
|
||||||
export { a, b as B, c as case, d as default };
|
|
||||||
}
|
|
||||||
expect_exact: "export{};export{a,b as B,c as case,d as default};"
|
|
||||||
}
|
|
||||||
|
|
||||||
var_defs: {
|
|
||||||
input: {
|
|
||||||
export const a = 1;
|
|
||||||
export let b = 2, c = 3;
|
|
||||||
export var { d, e: [] } = f;
|
|
||||||
}
|
|
||||||
expect_exact: "export const a=1;export let b=2,c=3;export var{d,e:[]}=f;"
|
|
||||||
}
|
|
||||||
|
|
||||||
defuns: {
|
|
||||||
input: {
|
|
||||||
export class A {}
|
|
||||||
export function e() {}
|
|
||||||
export function* f(a) {}
|
|
||||||
export async function g(b, c) {}
|
|
||||||
export async function* h({}, ...[]) {}
|
|
||||||
}
|
|
||||||
expect_exact: "export class A{}export function e(){}export function*f(a){}export async function g(b,c){}export async function*h({},...[]){}"
|
|
||||||
}
|
|
||||||
|
|
||||||
defaults: {
|
|
||||||
input: {
|
|
||||||
export default 42;
|
|
||||||
export default async;
|
|
||||||
export default (x, y) => x * x;
|
|
||||||
export default class {};
|
|
||||||
export default function*(a, b) {};
|
|
||||||
export default async function f({ c }, ...[ d ]) {};
|
|
||||||
}
|
|
||||||
expect_exact: "export default 42;export default async;export default(x,y)=>x*x;export default class{}export default function*(a,b){}export default async function f({c},...[d]){}"
|
|
||||||
}
|
|
||||||
|
|
||||||
defaults_parentheses_1: {
|
|
||||||
input: {
|
|
||||||
export default function() {
|
|
||||||
console.log("FAIL");
|
|
||||||
}(console.log("PASS"));
|
|
||||||
}
|
|
||||||
expect_exact: 'export default function(){console.log("FAIL")}console.log("PASS");'
|
|
||||||
}
|
|
||||||
|
|
||||||
defaults_parentheses_2: {
|
|
||||||
input: {
|
|
||||||
export default (async function() {
|
|
||||||
console.log("PASS");
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect_exact: 'export default(async function(){console.log("PASS")})();'
|
|
||||||
}
|
|
||||||
|
|
||||||
defaults_parentheses_3: {
|
|
||||||
input: {
|
|
||||||
export default (42, "PASS");
|
|
||||||
}
|
|
||||||
expect_exact: 'export default(42,"PASS");'
|
|
||||||
}
|
|
||||||
|
|
||||||
defaults_parentheses_4: {
|
|
||||||
input: {
|
|
||||||
export default (function f() {});
|
|
||||||
}
|
|
||||||
expect_exact: "export default(function f(){});"
|
|
||||||
}
|
|
||||||
|
|
||||||
defaults_parentheses_5: {
|
|
||||||
input: {
|
|
||||||
export default (function(a) {
|
|
||||||
console.log(a[0]);
|
|
||||||
}`PASS`);
|
|
||||||
}
|
|
||||||
expect_exact: "export default(function(a){console.log(a[0])})`PASS`;"
|
|
||||||
}
|
|
||||||
|
|
||||||
defaults_parentheses_6: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export default !function() {
|
|
||||||
while (!console);
|
|
||||||
}() ? "PASS" : "FAIL";
|
|
||||||
}
|
|
||||||
expect_exact: 'export default(function(){while(!console);})()?"FAIL":"PASS";'
|
|
||||||
}
|
|
||||||
|
|
||||||
defaults_regexp: {
|
|
||||||
input: {
|
|
||||||
export default /foo/;
|
|
||||||
}
|
|
||||||
expect_exact: "export default/foo/;"
|
|
||||||
}
|
|
||||||
|
|
||||||
foreign: {
|
|
||||||
input: {
|
|
||||||
export * from "foo";
|
|
||||||
export {} from "bar";
|
|
||||||
export * as a from "baz";
|
|
||||||
export { default } from "moo";
|
|
||||||
export { b, c as case, default as delete, d } from "moz";
|
|
||||||
}
|
|
||||||
expect_exact: 'export*from"foo";export{}from"bar";export*as a from"baz";export{default}from"moo";export{b,c as case,default as delete,d}from"moz";'
|
|
||||||
}
|
|
||||||
|
|
||||||
same_quotes: {
|
|
||||||
beautify = {
|
|
||||||
beautify: true,
|
|
||||||
quote_style: 3,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export * from 'foo';
|
|
||||||
export {} from "bar";
|
|
||||||
}
|
|
||||||
expect_exact: [
|
|
||||||
"export * from 'foo';",
|
|
||||||
"",
|
|
||||||
'export {} from "bar";',
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
drop_unused: {
|
|
||||||
options = {
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export default 42;
|
|
||||||
export default (x, y) => x * x;
|
|
||||||
export default class A extends B { get p() { h() } }
|
|
||||||
export default function*(a, b) {}
|
|
||||||
export default async function f({ c }, ...[ d ]) {}
|
|
||||||
export var e;
|
|
||||||
export function g(x, [ y ], ...z) {}
|
|
||||||
function h() {}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
export default 42;
|
|
||||||
export default (x, y) => x * x;
|
|
||||||
export default class extends B { get p() { h() } }
|
|
||||||
export default function*(a, b) {}
|
|
||||||
export default async function({}) {}
|
|
||||||
export var e;
|
|
||||||
export function g(x, []) {}
|
|
||||||
function h() {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mangle: {
|
|
||||||
rename = false
|
|
||||||
mangle = {
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
const a = 42;
|
|
||||||
export let b, { foo: c } = a;
|
|
||||||
export function f(d, { [b]: e }) {
|
|
||||||
d(e, f);
|
|
||||||
}
|
|
||||||
export default a;
|
|
||||||
export default async function g(x, ...{ [c]: y }) {
|
|
||||||
(await x)(g, y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
const t = 42;
|
|
||||||
export let b, { foo: c } = t;
|
|
||||||
export function f(t, { [b]: o }) {
|
|
||||||
t(o, f);
|
|
||||||
}
|
|
||||||
export default t;
|
|
||||||
export default async function e(t, ...{ [c]: o}) {
|
|
||||||
(await t)(e, o);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mangle_rename: {
|
|
||||||
rename = true
|
|
||||||
mangle = {
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
const a = 42;
|
|
||||||
export let b, { foo: c } = a;
|
|
||||||
export function f(d, { [b]: e }) {
|
|
||||||
d(e, f);
|
|
||||||
}
|
|
||||||
export default a;
|
|
||||||
export default async function g(x, ...{ [c]: y }) {
|
|
||||||
(await x)(g, y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
const t = 42;
|
|
||||||
export let b, { foo: c } = t;
|
|
||||||
export function f(t, { [b]: o }) {
|
|
||||||
t(o, f);
|
|
||||||
}
|
|
||||||
export default t;
|
|
||||||
export default async function e(t, ...{ [c]: o}) {
|
|
||||||
(await t)(e, o);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
hoist_exports_1: {
|
|
||||||
options = {
|
|
||||||
hoist_exports: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export { a };
|
|
||||||
export var b;
|
|
||||||
export function f() {}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var b;
|
|
||||||
function f() {}
|
|
||||||
export { a, b, f };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
hoist_exports_2: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
hoist_exports: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
mangle = {
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
const a = 42;
|
|
||||||
export let bbb, { foo: ccc } = a;
|
|
||||||
export function fff(d, { [bbb]: e }) {
|
|
||||||
d(e, fff);
|
|
||||||
}
|
|
||||||
export default a;
|
|
||||||
export default async function g(x, ...{ [ccc]: y }) {
|
|
||||||
(await x)(g, y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
let e, a = 42["foo"];
|
|
||||||
function f(t, { [e]: o }) {
|
|
||||||
t(o, f);
|
|
||||||
}
|
|
||||||
export default 42;
|
|
||||||
export default async function n(t, ...{ [a]: o }) {
|
|
||||||
(await t)(n, o);
|
|
||||||
};
|
|
||||||
export { e as bbb, a as ccc, f as fff };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
hoist_vars: {
|
|
||||||
options = {
|
|
||||||
hoist_vars: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a;
|
|
||||||
export var b = 42;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a;
|
|
||||||
export var b = 42;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
keep_return_values: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
evaluate: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export default function() {
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
export default function f() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
export default function() {
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
export default function f() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
in_use: {
|
|
||||||
options = {
|
|
||||||
pure_getters: "strict",
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export function f() {}
|
|
||||||
f.prototype.p = 42;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
export function f() {}
|
|
||||||
f.prototype.p = 42;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
in_use_default: {
|
|
||||||
options = {
|
|
||||||
pure_getters: "strict",
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export default function f() {}
|
|
||||||
f.prototype.p = 42;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
export default function f() {}
|
|
||||||
f.prototype.p = 42;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
single_use: {
|
|
||||||
options = {
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export function f() {
|
|
||||||
console.log("PASS");
|
|
||||||
}
|
|
||||||
f();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
export function f() {
|
|
||||||
console.log("PASS");
|
|
||||||
}
|
|
||||||
f();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
single_use_default: {
|
|
||||||
options = {
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export default function f() {
|
|
||||||
console.log("PASS");
|
|
||||||
}
|
|
||||||
f();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
export default function f() {
|
|
||||||
console.log("PASS");
|
|
||||||
}
|
|
||||||
f();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
single_use_class: {
|
|
||||||
options = {
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export class A {}
|
|
||||||
A.prototype.p = "PASS";
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
export class A {}
|
|
||||||
A.prototype.p = "PASS";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
single_use_class_default: {
|
|
||||||
options = {
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export default class A {}
|
|
||||||
A.prototype.p = "PASS";
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
export default class A {}
|
|
||||||
A.prototype.p = "PASS";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
hoist_funs: {
|
|
||||||
options = {
|
|
||||||
hoist_funs: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export function f() {}
|
|
||||||
export default async function* g() {}
|
|
||||||
}
|
|
||||||
expect_exact: "export function f(){}export default async function*g(){}"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_4742_join_vars_1: {
|
|
||||||
options = {
|
|
||||||
join_vars: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 42;
|
|
||||||
export var a;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 42;
|
|
||||||
export var a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_4742_join_vars_2: {
|
|
||||||
options = {
|
|
||||||
join_vars: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export var a = "foo";
|
|
||||||
var b;
|
|
||||||
b = "bar";
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
export var a = "foo";
|
|
||||||
var b, b = "bar";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_4742_unused_1: {
|
|
||||||
options = {
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 42;
|
|
||||||
export var a;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 42;
|
|
||||||
export var a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_4742_unused_2: {
|
|
||||||
options = {
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
export var a = "foo";
|
|
||||||
var a = "bar";
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
export var a = "foo";
|
|
||||||
a = "bar";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_4761: {
|
|
||||||
input: {
|
|
||||||
export default "function" == 42;
|
|
||||||
}
|
|
||||||
expect_exact: 'export default"function"==42;'
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_4766: {
|
|
||||||
options = {
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = "foo";
|
|
||||||
export var a = "bar";
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = "foo";
|
|
||||||
export var a = "bar";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
52
test/compress/expression.js
Normal file
52
test/compress/expression.js
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
pow: {
|
||||||
|
input: {
|
||||||
|
var a = 2 ** 7;
|
||||||
|
var b = 3;
|
||||||
|
b **= 2;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 2 ** 7;
|
||||||
|
var b = 3;
|
||||||
|
b **= 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pow_with_number_constants: {
|
||||||
|
input: {
|
||||||
|
var a = 5 ** NaN;
|
||||||
|
var b = 42 ** +0;
|
||||||
|
var c = 42 ** -0;
|
||||||
|
var d = NaN ** 1;
|
||||||
|
var e = 2 ** Infinity;
|
||||||
|
var f = 2 ** -Infinity;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 5 ** NaN;
|
||||||
|
var b = 42 ** +0;
|
||||||
|
var c = 42 ** -0;
|
||||||
|
var d = NaN ** 1;
|
||||||
|
var e = 2 ** (1/0);
|
||||||
|
var f = 2 ** (-1/0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pow_with_parentheses: {
|
||||||
|
input: {
|
||||||
|
var g = (-7) ** (0.5);
|
||||||
|
var h = 2324334 ** 34343443;
|
||||||
|
var i = (-2324334) ** 34343443;
|
||||||
|
var j = 2 ** (-3);
|
||||||
|
var k = 2.0 ** -3;
|
||||||
|
var l = 2.0 ** (5 - 7);
|
||||||
|
}
|
||||||
|
expect_exact: "var g=(-7)**.5;var h=2324334**34343443;var i=(-2324334)**34343443;var j=2**-3;var k=2**-3;var l=2**(5-7);"
|
||||||
|
}
|
||||||
|
|
||||||
|
pow_with_unary_between_brackets: {
|
||||||
|
input: {
|
||||||
|
var a = (-(+5)) ** 3;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = (-+5)**3;
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -2,7 +2,7 @@ must_replace: {
|
|||||||
options = {
|
options = {
|
||||||
global_defs: {
|
global_defs: {
|
||||||
D: "foo bar",
|
D: "foo bar",
|
||||||
},
|
}
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(D);
|
console.log(D);
|
||||||
@@ -12,20 +12,6 @@ must_replace: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
repeated_nodes: {
|
|
||||||
options = {
|
|
||||||
global_defs: {
|
|
||||||
"@N": "rand()",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(N, N);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(rand(), rand());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
keyword: {
|
keyword: {
|
||||||
options = {
|
options = {
|
||||||
global_defs: {
|
global_defs: {
|
||||||
@@ -51,7 +37,6 @@ object: {
|
|||||||
VALUE: 42,
|
VALUE: 42,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
side_effects: true,
|
|
||||||
unsafe: true,
|
unsafe: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -135,7 +120,7 @@ mixed: {
|
|||||||
properties: true,
|
properties: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var FOO = { BAR: 0 };
|
const FOO = { BAR: 0 };
|
||||||
console.log(FOO.BAR);
|
console.log(FOO.BAR);
|
||||||
console.log(++CONFIG.DEBUG);
|
console.log(++CONFIG.DEBUG);
|
||||||
console.log(++CONFIG.VALUE);
|
console.log(++CONFIG.VALUE);
|
||||||
@@ -145,7 +130,7 @@ mixed: {
|
|||||||
console.log(CONFIG);
|
console.log(CONFIG);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var FOO = { BAR: 0 };
|
const FOO = { BAR: 0 };
|
||||||
console.log("moo");
|
console.log("moo");
|
||||||
console.log(++CONFIG.DEBUG);
|
console.log(++CONFIG.DEBUG);
|
||||||
console.log(++CONFIG.VALUE);
|
console.log(++CONFIG.VALUE);
|
||||||
@@ -155,78 +140,8 @@ mixed: {
|
|||||||
console.log(CONFIG);
|
console.log(CONFIG);
|
||||||
}
|
}
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
"WARN: global_defs CONFIG.VALUE redefined [test/compress/global_defs.js:4,22]",
|
'WARN: global_defs CONFIG.VALUE redefined [test/compress/global_defs.js:126,22]',
|
||||||
"WARN: global_defs CONFIG.VALUE redefined [test/compress/global_defs.js:7,8]",
|
'WARN: global_defs CONFIG.VALUE redefined [test/compress/global_defs.js:127,22]',
|
||||||
|
'WARN: global_defs CONFIG.VALUE redefined [test/compress/global_defs.js:129,8]',
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_1801: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
global_defs: {
|
|
||||||
"CONFIG.FOO.BAR": true,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(CONFIG.FOO.BAR);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(!0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1986: {
|
|
||||||
options = {
|
|
||||||
global_defs: {
|
|
||||||
"@alert": "console.log",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
alert(42);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(42);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2167: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
|
||||||
global_defs: {
|
|
||||||
"@isDevMode": "function(){}",
|
|
||||||
},
|
|
||||||
passes: 2,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
if (isDevMode()) {
|
|
||||||
greetOverlord();
|
|
||||||
}
|
|
||||||
doWork();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
doWork();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_3217: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
global_defs: {
|
|
||||||
"@o": "{fn:function(){var a=42;console.log(a)}}",
|
|
||||||
},
|
|
||||||
inline: true,
|
|
||||||
properties: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
o.fn();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(42);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
351
test/compress/harmony.js
Normal file
351
test/compress/harmony.js
Normal file
@@ -0,0 +1,351 @@
|
|||||||
|
arrow_function_parens: {
|
||||||
|
input: {
|
||||||
|
something && (() => {});
|
||||||
|
}
|
||||||
|
expect_exact: "something&&(()=>{});"
|
||||||
|
}
|
||||||
|
arrow_function_parens_2: {
|
||||||
|
input: {
|
||||||
|
(() => null)();
|
||||||
|
}
|
||||||
|
expect_exact: "(()=>null)();"
|
||||||
|
}
|
||||||
|
|
||||||
|
typeof_arrow_functions: {
|
||||||
|
options = {
|
||||||
|
evaluate: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var foo = typeof (x) => null;
|
||||||
|
}
|
||||||
|
expect_exact: "var foo=\"function\";"
|
||||||
|
}
|
||||||
|
|
||||||
|
classes: {
|
||||||
|
input: {
|
||||||
|
class SomeClass {
|
||||||
|
constructor() {
|
||||||
|
};
|
||||||
|
foo() {};
|
||||||
|
};
|
||||||
|
class NoSemi {
|
||||||
|
constructor(...args) {
|
||||||
|
}
|
||||||
|
foo() {}
|
||||||
|
};
|
||||||
|
class ChildClass extends SomeClass {};
|
||||||
|
var asExpression = class AsExpression {};
|
||||||
|
var nameless = class {};
|
||||||
|
}
|
||||||
|
expect_exact: "class SomeClass{constructor(){}foo(){}}class NoSemi{constructor(...args){}foo(){}}class ChildClass extends SomeClass{}var asExpression=class AsExpression{};var nameless=class{};"
|
||||||
|
}
|
||||||
|
|
||||||
|
class_statics: {
|
||||||
|
input: {
|
||||||
|
x = class {
|
||||||
|
static staticMethod() {}
|
||||||
|
static get foo() {}
|
||||||
|
static set bar() {}
|
||||||
|
static() { /* "static" can be a method name! */ }
|
||||||
|
get() { /* "get" can be a method name! */ }
|
||||||
|
set() { /* "set" can be a method name! */ }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: "x=class{static staticMethod(){}static get foo(){}static set bar(){}static(){}get(){}set(){}};"
|
||||||
|
}
|
||||||
|
|
||||||
|
class_name_can_be_mangled: {
|
||||||
|
mangle = { };
|
||||||
|
input: {
|
||||||
|
function x() {
|
||||||
|
class Foo {
|
||||||
|
}
|
||||||
|
var class1 = Foo
|
||||||
|
var class2 = class Bar {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function x() {
|
||||||
|
class a { }
|
||||||
|
var n = a
|
||||||
|
var r = class a {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class_name_can_be_preserved: {
|
||||||
|
mangle = {
|
||||||
|
keep_classnames: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function x() {
|
||||||
|
(class Baz { });
|
||||||
|
class Foo {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function x() {
|
||||||
|
(class Baz { });
|
||||||
|
class Foo {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
classes_can_have_generators: {
|
||||||
|
input: {
|
||||||
|
class Foo {
|
||||||
|
*bar() {}
|
||||||
|
static *baz() {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
class Foo {
|
||||||
|
*bar() {}
|
||||||
|
static *baz() {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
classes_can_have_computed_generators: {
|
||||||
|
input: {
|
||||||
|
class C4 {
|
||||||
|
*['constructor']() {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
class C4 {
|
||||||
|
*['constructor']() {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
classes_can_have_computed_static: {
|
||||||
|
input: {
|
||||||
|
class C4 {
|
||||||
|
static ['constructor']() {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
class C4 {
|
||||||
|
static ['constructor']() {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class_methods_and_getters_with_keep_quoted_props_enabled: {
|
||||||
|
beautify = {
|
||||||
|
quote_style: 3,
|
||||||
|
keep_quoted_props: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
class clss {
|
||||||
|
a() {}
|
||||||
|
"b"() {}
|
||||||
|
get c() { return "c"}
|
||||||
|
get "d"() { return "d"}
|
||||||
|
set e(a) { doSomething(a); }
|
||||||
|
set 'f'(a) { doSomething(b); }
|
||||||
|
static g() {}
|
||||||
|
static "h"() {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: 'class clss{a(){}"b"(){}get c(){return"c"}get"d"(){return"d"}set e(a){doSomething(a)}set\'f\'(a){doSomething(b)}static g(){}static"h"(){}}'
|
||||||
|
}
|
||||||
|
|
||||||
|
new_target: {
|
||||||
|
input: {
|
||||||
|
new.target;
|
||||||
|
new.target.name;
|
||||||
|
}
|
||||||
|
expect_exact: "new.target;new.target.name;"
|
||||||
|
}
|
||||||
|
|
||||||
|
number_literals: {
|
||||||
|
input: {
|
||||||
|
0b1001;
|
||||||
|
0B1001;
|
||||||
|
0o11;
|
||||||
|
0O11;
|
||||||
|
}
|
||||||
|
|
||||||
|
expect: {
|
||||||
|
9;
|
||||||
|
9;
|
||||||
|
9;
|
||||||
|
9;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
import_statement: {
|
||||||
|
input: {
|
||||||
|
import "mod-name";
|
||||||
|
import Foo from "bar";
|
||||||
|
import { Bar, Baz } from 'lel';
|
||||||
|
import Bar, { Foo } from 'lel';
|
||||||
|
import { Bar as kex, Baz as food } from 'lel';
|
||||||
|
}
|
||||||
|
expect_exact: 'import"mod-name";import Foo from"bar";import{Bar,Baz}from"lel";import Bar,{Foo}from"lel";import{Bar as kex,Baz as food}from"lel";'
|
||||||
|
}
|
||||||
|
|
||||||
|
import_all_statement: {
|
||||||
|
input: {
|
||||||
|
import * from 'lel';
|
||||||
|
import * as Lel from 'lel';
|
||||||
|
}
|
||||||
|
expect_exact: 'import*from"lel";import*as Lel from"lel";'
|
||||||
|
}
|
||||||
|
|
||||||
|
export_statement: {
|
||||||
|
input: {
|
||||||
|
export default 1;
|
||||||
|
export var foo = 4;
|
||||||
|
export let foo = 6;
|
||||||
|
export const foo = 6;
|
||||||
|
export function foo() {};
|
||||||
|
export class foo { };
|
||||||
|
}
|
||||||
|
expect_exact: "export default 1;export var foo=4;export let foo=6;export const foo=6;export function foo(){};export class foo{};"
|
||||||
|
}
|
||||||
|
|
||||||
|
export_module_statement: {
|
||||||
|
input: {
|
||||||
|
export * from "a.js";
|
||||||
|
export {A} from "a.js";
|
||||||
|
export {A, B} from "a.js";
|
||||||
|
export {C};
|
||||||
|
}
|
||||||
|
expect_exact: 'export*from"a.js";export{A}from"a.js";export{A,B}from"a.js";export{C};'
|
||||||
|
}
|
||||||
|
|
||||||
|
import_statement_mangling: {
|
||||||
|
mangle = { toplevel: true };
|
||||||
|
input: {
|
||||||
|
import Foo from "foo";
|
||||||
|
import Bar, {Food} from "lel";
|
||||||
|
import {What as Whatever} from "lel";
|
||||||
|
Foo();
|
||||||
|
Bar();
|
||||||
|
Food();
|
||||||
|
Whatever();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
import l from "foo";
|
||||||
|
import e, {Food as o} from "lel";
|
||||||
|
import {What as f} from "lel";
|
||||||
|
l();
|
||||||
|
e();
|
||||||
|
o();
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export_statement_mangling: {
|
||||||
|
mangle = { };
|
||||||
|
input: {
|
||||||
|
export var foo = 6;
|
||||||
|
export function bar() { }
|
||||||
|
export class Baz { }
|
||||||
|
bar(foo, Baz)
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
export var foo = 6;
|
||||||
|
export function bar() { }
|
||||||
|
export class Baz { }
|
||||||
|
bar(foo, Baz)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://github.com/mishoo/UglifyJS2/issues/1021
|
||||||
|
regression_for_of_const: {
|
||||||
|
input: {
|
||||||
|
for (const x of y) {}
|
||||||
|
for (const x in y) {}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
for (const x of y);for (const x in y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fabio: My patches accidentally caused a crash whenever
|
||||||
|
// there's an extraneous set of parens around an object.
|
||||||
|
regression_cannot_destructure: {
|
||||||
|
input: {
|
||||||
|
var x = ({ x : 3 });
|
||||||
|
x(({ x: 3 }));
|
||||||
|
}
|
||||||
|
expect_exact: "var x={x:3};x({x:3});";
|
||||||
|
}
|
||||||
|
|
||||||
|
regression_cannot_use_of: {
|
||||||
|
input: {
|
||||||
|
function of() {
|
||||||
|
}
|
||||||
|
var of = "is a valid variable name";
|
||||||
|
of = { of: "is ok" };
|
||||||
|
x.of;
|
||||||
|
of: foo()
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function of(){}
|
||||||
|
var of="is a valid variable name";
|
||||||
|
of={of:"is ok"};
|
||||||
|
x.of;
|
||||||
|
foo(); /* Label statement missing? No prob. */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fat_arrow_as_param: {
|
||||||
|
input: {
|
||||||
|
foo(x => x);
|
||||||
|
foo(x => x, y => y);
|
||||||
|
|
||||||
|
foo(x => (x, x));
|
||||||
|
foo(x => (x, x), y => (y, y));
|
||||||
|
}
|
||||||
|
expect_exact: "foo(x=>x);foo(x=>x,y=>y);foo(x=>(x,x));foo(x=>(x,x),y=>(y,y));"
|
||||||
|
}
|
||||||
|
|
||||||
|
default_assign: {
|
||||||
|
options = {
|
||||||
|
keep_fargs: false,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b = 3) {
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a) {
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
expansion: {
|
||||||
|
options = {
|
||||||
|
keep_fargs: false,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, ...b) {
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a) {
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1613: {
|
||||||
|
mangle = { toplevel: true };
|
||||||
|
input: {
|
||||||
|
const name = 1;
|
||||||
|
const foo = {
|
||||||
|
name
|
||||||
|
};
|
||||||
|
}
|
||||||
|
expect_exact: "const n=1;const c={name:n};"
|
||||||
|
}
|
||||||
85
test/compress/hoist.js
Normal file
85
test/compress/hoist.js
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
|
||||||
|
hoist_vars: {
|
||||||
|
options = {
|
||||||
|
hoist_vars: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function a() {
|
||||||
|
bar();
|
||||||
|
var var1;
|
||||||
|
var var2;
|
||||||
|
}
|
||||||
|
function b(anArg) {
|
||||||
|
bar();
|
||||||
|
var var1;
|
||||||
|
var anArg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function a() {
|
||||||
|
var var1, var2; // Vars go up and are joined
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
function b(anArg) {
|
||||||
|
var var1;
|
||||||
|
bar();
|
||||||
|
// But vars named like arguments go away!
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
hoist_funs: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function a() {
|
||||||
|
bar();
|
||||||
|
function foo() {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function a() {
|
||||||
|
function foo() {} // Funs go up
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
hoist_no_destructurings: {
|
||||||
|
options = {
|
||||||
|
hoist_vars: true,
|
||||||
|
hoist_funs: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function a([anArg]) {
|
||||||
|
bar();
|
||||||
|
var var1;
|
||||||
|
var anArg; // Because anArg is already declared, this goes away!
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function a([anArg]) {
|
||||||
|
var var1;
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dont_hoist_var_destructurings: {
|
||||||
|
options = {
|
||||||
|
hoist_vars: true,
|
||||||
|
hoist_funs: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function x() {
|
||||||
|
// If foo is null or undefined, this should be an exception
|
||||||
|
var {x,y} = foo;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function x() {
|
||||||
|
var {x,y} = foo;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -88,414 +88,3 @@ sequences_funs: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
catch_var: {
|
|
||||||
options = {
|
|
||||||
dead_code: true,
|
|
||||||
hoist_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = "PASS";
|
|
||||||
try {
|
|
||||||
a;
|
|
||||||
} catch (a) {
|
|
||||||
var a = 0;
|
|
||||||
a;
|
|
||||||
}
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = "PASS";
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2295: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
hoist_vars: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function foo(o) {
|
|
||||||
var a = o.a;
|
|
||||||
if (a) return a;
|
|
||||||
var a = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function foo(o) {
|
|
||||||
var a = o.a;
|
|
||||||
if (a) return a;
|
|
||||||
a = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_4487_1: {
|
|
||||||
options = {
|
|
||||||
functions: true,
|
|
||||||
hoist_vars: true,
|
|
||||||
keep_fnames: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = function f() {
|
|
||||||
var f = console.log(typeof f);
|
|
||||||
};
|
|
||||||
var b = a();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = function f() {
|
|
||||||
var f = console.log(typeof f);
|
|
||||||
};
|
|
||||||
a();
|
|
||||||
}
|
|
||||||
expect_stdout: "undefined"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_4487_2: {
|
|
||||||
options = {
|
|
||||||
functions: true,
|
|
||||||
hoist_vars: true,
|
|
||||||
keep_fnames: true,
|
|
||||||
passes: 2,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = function f() {
|
|
||||||
var f = console.log(typeof f);
|
|
||||||
};
|
|
||||||
var b = a();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function a() {
|
|
||||||
var f = console.log(typeof f);
|
|
||||||
}
|
|
||||||
a();
|
|
||||||
}
|
|
||||||
expect_stdout: "undefined"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_4487_3: {
|
|
||||||
options = {
|
|
||||||
functions: true,
|
|
||||||
hoist_vars: true,
|
|
||||||
keep_fnames: true,
|
|
||||||
passes: 3,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = function f() {
|
|
||||||
var f = console.log(typeof f);
|
|
||||||
};
|
|
||||||
var b = a();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(function a() {
|
|
||||||
console.log(typeof void 0);
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect_stdout: "undefined"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_4489: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
evaluate: true,
|
|
||||||
hoist_vars: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
A = 0;
|
|
||||||
var o = !0 || null;
|
|
||||||
for (var k in o);
|
|
||||||
console.log(k);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
!(A = 0);
|
|
||||||
for (var k in true);
|
|
||||||
console.log(k);
|
|
||||||
}
|
|
||||||
expect_stdout: "undefined"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_4517: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
hoist_vars: true,
|
|
||||||
join_vars: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(function() {
|
|
||||||
var a = 2;
|
|
||||||
A = a;
|
|
||||||
var b = typeof !1;
|
|
||||||
return A + b;
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console.log(function() {
|
|
||||||
var a = 2;
|
|
||||||
return (A = a) + typeof !1;
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
expect_stdout: "2boolean"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_4736: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
evaluate: true,
|
|
||||||
hoist_vars: true,
|
|
||||||
merge_vars: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a;
|
|
||||||
function f() {
|
|
||||||
(function g() {
|
|
||||||
var b = (a = 0, 1 << 30);
|
|
||||||
var c = (a = 0, console.log(b));
|
|
||||||
var d = c;
|
|
||||||
})(f);
|
|
||||||
}
|
|
||||||
f();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(function() {
|
|
||||||
(function() {
|
|
||||||
0,
|
|
||||||
console.log(1 << 30);
|
|
||||||
})();
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect_stdout: "1073741824"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_4839: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
hoist_vars: true,
|
|
||||||
keep_fargs: false,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var log = console.log, o = function(a, b) {
|
|
||||||
return b && b;
|
|
||||||
}("foo");
|
|
||||||
for (var k in o)
|
|
||||||
throw "FAIL";
|
|
||||||
log("PASS");
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var k, log = console.log;
|
|
||||||
for (k in void 0)
|
|
||||||
throw "FAIL";
|
|
||||||
log("PASS");
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_4859: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
hoist_vars: true,
|
|
||||||
keep_infinity: true,
|
|
||||||
merge_vars: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(a) {
|
|
||||||
var b = (a = 2, 1 / 0), c = 3;
|
|
||||||
var d = a + b;
|
|
||||||
console.log(d);
|
|
||||||
return f;
|
|
||||||
}
|
|
||||||
f();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(function f(a) {
|
|
||||||
console.log(2 + 1 / 0);
|
|
||||||
return f;
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect_stdout: "Infinity"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_4893_1: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
evaluate: true,
|
|
||||||
hoist_vars: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {
|
|
||||||
function g() {}
|
|
||||||
var a = null;
|
|
||||||
var b = null;
|
|
||||||
var c = null;
|
|
||||||
b.p += a = 42;
|
|
||||||
f;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
f();
|
|
||||||
} catch (e) {
|
|
||||||
console.log("PASS");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
try{
|
|
||||||
(function f() {
|
|
||||||
null.p += 42;
|
|
||||||
f;
|
|
||||||
})();
|
|
||||||
} catch (e) {
|
|
||||||
console.log("PASS");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_4893_2: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
hoist_vars: true,
|
|
||||||
pure_getters: "strict",
|
|
||||||
reduce_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {
|
|
||||||
function g() {}
|
|
||||||
var a = null;
|
|
||||||
var b = null;
|
|
||||||
var c = null;
|
|
||||||
b.p += a = 42;
|
|
||||||
f;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
f();
|
|
||||||
} catch (e) {
|
|
||||||
console.log("PASS");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
try{
|
|
||||||
(function() {
|
|
||||||
var b;
|
|
||||||
b = null;
|
|
||||||
b.p += 42;
|
|
||||||
})();
|
|
||||||
} catch (e) {
|
|
||||||
console.log("PASS");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_4898: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
evaluate: true,
|
|
||||||
hoist_vars: true,
|
|
||||||
loops: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
do {
|
|
||||||
var b = [ console.log("PASS") ];
|
|
||||||
var c = b;
|
|
||||||
} while (c.p = 0);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var b;
|
|
||||||
b = [ console.log("PASS") ];
|
|
||||||
b.p = 0;
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_5187: {
|
|
||||||
options = {
|
|
||||||
hoist_props: true,
|
|
||||||
hoist_vars: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {
|
|
||||||
var a = 42;
|
|
||||||
do {
|
|
||||||
var b = { 0: a++ };
|
|
||||||
} while (console.log(b[b ^= 0]));
|
|
||||||
}
|
|
||||||
f();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(function() {
|
|
||||||
var b, a = 42;
|
|
||||||
do {
|
|
||||||
b = { 0: a++ };
|
|
||||||
} while (console.log(b[b ^= 0]));
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect_stdout: "42"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_5195: {
|
|
||||||
options = {
|
|
||||||
hoist_props: true,
|
|
||||||
hoist_vars: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {
|
|
||||||
var a;
|
|
||||||
do {
|
|
||||||
var b = { p: a };
|
|
||||||
} while (console.log(b += ""));
|
|
||||||
}
|
|
||||||
f();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(function() {
|
|
||||||
var a, b;
|
|
||||||
do {
|
|
||||||
b = { p: a };
|
|
||||||
} while (console.log(b += ""));
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect_stdout: "[object Object]"
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,107 +1,64 @@
|
|||||||
html_comment_in_expression: {
|
html_comment_in_expression: {
|
||||||
input: {
|
input: {
|
||||||
(function(a, b) {
|
function f(a, b, x, y) { return a < !--b && x-- > y; }
|
||||||
console.log(a < !--b && a-- > b, a, b);
|
|
||||||
})(1, 2);
|
|
||||||
}
|
}
|
||||||
expect_exact: "(function(a,b){console.log(a<! --b&&a-- >b,a,b)})(1,2);"
|
expect_exact: "function f(a,b,x,y){return a< !--b&&x-- >y}";
|
||||||
expect_stdout: "false 1 1"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
html_comment_in_less_than: {
|
html_comment_in_less_than: {
|
||||||
input: {
|
input: {
|
||||||
(function(a, b, c) {
|
function f(a, b) { return a < !--b; }
|
||||||
console.log(
|
|
||||||
a < !--b,
|
|
||||||
a < !--b + c,
|
|
||||||
a + b < !--c,
|
|
||||||
a, b, c
|
|
||||||
);
|
|
||||||
})(1, 2, 3);
|
|
||||||
}
|
}
|
||||||
expect_exact: "(function(a,b,c){console.log(a<! --b,a<! --b+c,a+b<! --c,a,b,c)})(1,2,3);"
|
expect_exact: "function f(a,b){return a< !--b}";
|
||||||
expect_stdout: "false true false 1 0 2"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
html_comment_in_left_shift: {
|
html_comment_in_left_shift: {
|
||||||
input: {
|
input: {
|
||||||
(function(a, b, c) {
|
function f(a, b) { return a << !--b; }
|
||||||
console.log(
|
|
||||||
a << !--b,
|
|
||||||
a << !--b + c,
|
|
||||||
a + b << !--c,
|
|
||||||
a, b, c
|
|
||||||
);
|
|
||||||
})(1, 2, 3);
|
|
||||||
}
|
}
|
||||||
expect_exact: "(function(a,b,c){console.log(a<<! --b,a<<! --b+c,a+b<<! --c,a,b,c)})(1,2,3);"
|
expect_exact: "function f(a,b){return a<< !--b}";
|
||||||
expect_stdout: "1 16 1 1 0 2"
|
|
||||||
}
|
|
||||||
|
|
||||||
html_comment_in_greater_than: {
|
|
||||||
input: {
|
|
||||||
(function(a, b, c) {
|
|
||||||
console.log(
|
|
||||||
a-- > b,
|
|
||||||
a-- > b + c,
|
|
||||||
a + b-- > c,
|
|
||||||
a, b, c
|
|
||||||
);
|
|
||||||
})(1, 2, 3);
|
|
||||||
}
|
|
||||||
expect_exact: "(function(a,b,c){console.log(a-- >b,a-- >b+c,a+b-- >c,a,b,c)})(1,2,3);"
|
|
||||||
expect_stdout: "false false false -1 1 3"
|
|
||||||
}
|
|
||||||
|
|
||||||
html_comment_in_greater_than_or_equal: {
|
|
||||||
input: {
|
|
||||||
(function(a, b, c) {
|
|
||||||
console.log(
|
|
||||||
a-- >= b,
|
|
||||||
a-- >= b + c,
|
|
||||||
a + b-- >= c,
|
|
||||||
a, b, c
|
|
||||||
);
|
|
||||||
})(1, 2, 3);
|
|
||||||
}
|
|
||||||
expect_exact: "(function(a,b,c){console.log(a-- >=b,a-- >=b+c,a+b-- >=c,a,b,c)})(1,2,3);"
|
|
||||||
expect_stdout: "false false false -1 1 3"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
html_comment_in_right_shift: {
|
html_comment_in_right_shift: {
|
||||||
input: {
|
input: {
|
||||||
(function(a, b, c) {
|
function f(a, b) { return a-- >> b; }
|
||||||
console.log(
|
|
||||||
a-- >> b,
|
|
||||||
a-- >> b + c,
|
|
||||||
a + b-- >> c,
|
|
||||||
a, b, c
|
|
||||||
);
|
|
||||||
})(1, 2, 3);
|
|
||||||
}
|
}
|
||||||
expect_exact: "(function(a,b,c){console.log(a-- >>b,a-- >>b+c,a+b-- >>c,a,b,c)})(1,2,3);"
|
expect_exact: "function f(a,b){return a-- >>b}";
|
||||||
expect_stdout: "0 0 0 -1 1 3"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
html_comment_in_zero_fill_right_shift: {
|
html_comment_in_zero_fill_right_shift: {
|
||||||
input: {
|
input: {
|
||||||
(function(a, b, c) {
|
function f(a, b) { return a-- >>> b; }
|
||||||
console.log(
|
|
||||||
a-- >>> b,
|
|
||||||
a-- >>> b + c,
|
|
||||||
a + b-- >>> c,
|
|
||||||
a, b, c
|
|
||||||
);
|
|
||||||
})(1, 2, 3);
|
|
||||||
}
|
}
|
||||||
expect_exact: "(function(a,b,c){console.log(a-- >>>b,a-- >>>b+c,a+b-- >>>c,a,b,c)})(1,2,3);"
|
expect_exact: "function f(a,b){return a-- >>>b}";
|
||||||
expect_stdout: "0 0 0 -1 1 3"
|
}
|
||||||
|
|
||||||
|
html_comment_in_greater_than: {
|
||||||
|
input: {
|
||||||
|
function f(a, b) { return a-- > b; }
|
||||||
|
}
|
||||||
|
expect_exact: "function f(a,b){return a-- >b}";
|
||||||
|
}
|
||||||
|
|
||||||
|
html_comment_in_greater_than_or_equal: {
|
||||||
|
input: {
|
||||||
|
function f(a, b) { return a-- >= b; }
|
||||||
|
}
|
||||||
|
expect_exact: "function f(a,b){return a-- >=b}";
|
||||||
}
|
}
|
||||||
|
|
||||||
html_comment_in_string_literal: {
|
html_comment_in_string_literal: {
|
||||||
input: {
|
input: {
|
||||||
console.log("<!--HTML-->comment in<!--string literal-->".length);
|
function f() { return "<!--HTML-->comment in<!--string literal-->"; }
|
||||||
}
|
}
|
||||||
expect_exact: 'console.log("\\x3c!--HTML--\\x3ecomment in\\x3c!--string literal--\\x3e".length);'
|
expect_exact: 'function f(){return"\\x3c!--HTML--\\x3ecomment in\\x3c!--string literal--\\x3e"}';
|
||||||
expect_stdout: "42"
|
}
|
||||||
|
|
||||||
|
html_comment_after_multiline_comment: {
|
||||||
|
input: {
|
||||||
|
var foo; /*
|
||||||
|
*/--> var bar;
|
||||||
|
var foobar;
|
||||||
|
}
|
||||||
|
expect_exact: "var foo;var foobar;"
|
||||||
}
|
}
|
||||||
|
|||||||
3476
test/compress/ie.js
3476
test/compress/ie.js
File diff suppressed because it is too large
Load Diff
@@ -1,14 +1,14 @@
|
|||||||
if_return_1: {
|
if_return_1: {
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
if_return : true,
|
||||||
comparisons: true,
|
sequences : true,
|
||||||
conditionals: true,
|
conditionals : true,
|
||||||
dead_code: true,
|
comparisons : true,
|
||||||
evaluate: true,
|
evaluate : true,
|
||||||
if_return: true,
|
booleans : true,
|
||||||
sequences: true,
|
unused : true,
|
||||||
side_effects: true,
|
side_effects : true,
|
||||||
unused: true,
|
dead_code : true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(x) {
|
function f(x) {
|
||||||
@@ -24,15 +24,15 @@ if_return_1: {
|
|||||||
|
|
||||||
if_return_2: {
|
if_return_2: {
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
if_return : true,
|
||||||
comparisons: true,
|
sequences : true,
|
||||||
conditionals: true,
|
conditionals : true,
|
||||||
dead_code: true,
|
comparisons : true,
|
||||||
evaluate: true,
|
evaluate : true,
|
||||||
if_return: true,
|
booleans : true,
|
||||||
sequences: true,
|
unused : true,
|
||||||
side_effects: true,
|
side_effects : true,
|
||||||
unused: true,
|
dead_code : true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(x, y) {
|
function f(x, y) {
|
||||||
@@ -49,15 +49,15 @@ if_return_2: {
|
|||||||
|
|
||||||
if_return_3: {
|
if_return_3: {
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
if_return : true,
|
||||||
comparisons: true,
|
sequences : true,
|
||||||
conditionals: true,
|
conditionals : true,
|
||||||
dead_code: true,
|
comparisons : true,
|
||||||
evaluate: true,
|
evaluate : true,
|
||||||
if_return: true,
|
booleans : true,
|
||||||
sequences: true,
|
unused : true,
|
||||||
side_effects: true,
|
side_effects : true,
|
||||||
unused: true,
|
dead_code : true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(x) {
|
function f(x) {
|
||||||
@@ -75,15 +75,15 @@ if_return_3: {
|
|||||||
|
|
||||||
if_return_4: {
|
if_return_4: {
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
if_return : true,
|
||||||
comparisons: true,
|
sequences : true,
|
||||||
conditionals: true,
|
conditionals : true,
|
||||||
dead_code: true,
|
comparisons : true,
|
||||||
evaluate: true,
|
evaluate : true,
|
||||||
if_return: true,
|
booleans : true,
|
||||||
sequences: true,
|
unused : true,
|
||||||
side_effects: true,
|
side_effects : true,
|
||||||
unused: true,
|
dead_code : true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(x, y) {
|
function f(x, y) {
|
||||||
@@ -100,15 +100,15 @@ if_return_4: {
|
|||||||
|
|
||||||
if_return_5: {
|
if_return_5: {
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
if_return : true,
|
||||||
comparisons: true,
|
sequences : true,
|
||||||
conditionals: true,
|
conditionals : true,
|
||||||
dead_code: true,
|
comparisons : true,
|
||||||
evaluate: true,
|
evaluate : true,
|
||||||
if_return: true,
|
booleans : true,
|
||||||
sequences: true,
|
unused : true,
|
||||||
side_effects: true,
|
side_effects : true,
|
||||||
unused: true,
|
dead_code : true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f() {
|
function f() {
|
||||||
@@ -126,15 +126,15 @@ if_return_5: {
|
|||||||
|
|
||||||
if_return_6: {
|
if_return_6: {
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
if_return : true,
|
||||||
comparisons: true,
|
sequences : true,
|
||||||
conditionals: true,
|
conditionals : true,
|
||||||
dead_code: true,
|
comparisons : true,
|
||||||
evaluate: true,
|
evaluate : true,
|
||||||
if_return: true,
|
booleans : true,
|
||||||
sequences: true,
|
unused : true,
|
||||||
side_effects: true,
|
side_effects : true,
|
||||||
unused: true,
|
dead_code : true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(x) {
|
function f(x) {
|
||||||
@@ -150,15 +150,15 @@ if_return_6: {
|
|||||||
|
|
||||||
if_return_7: {
|
if_return_7: {
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
if_return : true,
|
||||||
comparisons: true,
|
sequences : true,
|
||||||
conditionals: true,
|
conditionals : true,
|
||||||
dead_code: true,
|
comparisons : true,
|
||||||
evaluate: true,
|
evaluate : true,
|
||||||
if_return: true,
|
booleans : true,
|
||||||
sequences: true,
|
unused : true,
|
||||||
side_effects: true,
|
side_effects : true,
|
||||||
unused: true,
|
dead_code : true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(x) {
|
function f(x) {
|
||||||
@@ -176,10 +176,10 @@ if_return_7: {
|
|||||||
|
|
||||||
if_return_8: {
|
if_return_8: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
|
||||||
if_return: true,
|
if_return: true,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
side_effects: true,
|
conditionals: true,
|
||||||
|
side_effects : true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(e) {
|
function f(e) {
|
||||||
@@ -220,15 +220,15 @@ if_return_8: {
|
|||||||
|
|
||||||
issue_1089: {
|
issue_1089: {
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
if_return : true,
|
||||||
comparisons: true,
|
sequences : true,
|
||||||
conditionals: true,
|
conditionals : true,
|
||||||
dead_code: true,
|
comparisons : true,
|
||||||
evaluate: true,
|
evaluate : true,
|
||||||
if_return: true,
|
booleans : true,
|
||||||
sequences: true,
|
unused : true,
|
||||||
side_effects: true,
|
side_effects : true,
|
||||||
unused: true,
|
dead_code : true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function x() {
|
function x() {
|
||||||
@@ -243,7 +243,7 @@ issue_1089: {
|
|||||||
expect: {
|
expect: {
|
||||||
function x() {
|
function x() {
|
||||||
var f = document.getElementById("fname");
|
var f = document.getElementById("fname");
|
||||||
if (12345 < f.files[0].size)
|
if (f.files[0].size > 12345)
|
||||||
return alert("alert"), f.focus(), !1;
|
return alert("alert"), f.focus(), !1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -251,9 +251,9 @@ issue_1089: {
|
|||||||
|
|
||||||
issue_1437: {
|
issue_1437: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: false,
|
if_return : true,
|
||||||
if_return: true,
|
sequences : true,
|
||||||
sequences: true,
|
conditionals : false
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function x() {
|
function x() {
|
||||||
@@ -281,9 +281,9 @@ issue_1437: {
|
|||||||
|
|
||||||
issue_1437_conditionals: {
|
issue_1437_conditionals: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
conditionals : true,
|
||||||
if_return: true,
|
if_return : true,
|
||||||
sequences: true,
|
sequences : true
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function x() {
|
function x() {
|
||||||
@@ -302,551 +302,3 @@ issue_1437_conditionals: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_512: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
if_return: true,
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function a() {
|
|
||||||
if (b()) {
|
|
||||||
c();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function a() {
|
|
||||||
if (!b()) throw e;
|
|
||||||
c();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if_var_return_1: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
if_return: true,
|
|
||||||
join_vars: true,
|
|
||||||
sequences: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {
|
|
||||||
var a;
|
|
||||||
return;
|
|
||||||
var b;
|
|
||||||
}
|
|
||||||
function g() {
|
|
||||||
var a;
|
|
||||||
if (u()) {
|
|
||||||
var b;
|
|
||||||
return v();
|
|
||||||
var c;
|
|
||||||
}
|
|
||||||
var d;
|
|
||||||
if (w()) {
|
|
||||||
var e;
|
|
||||||
return x();
|
|
||||||
var f;
|
|
||||||
} else {
|
|
||||||
var g;
|
|
||||||
y();
|
|
||||||
var h;
|
|
||||||
}
|
|
||||||
var i;
|
|
||||||
z();
|
|
||||||
var j;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f() {
|
|
||||||
var a, b;
|
|
||||||
}
|
|
||||||
function g() {
|
|
||||||
var a, b, c, d, e, f, g, h, i, j;
|
|
||||||
return u() ? v() : w() ? x() : (y(), z(), void 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if_var_return_2: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
if_return: true,
|
|
||||||
sequences: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function() {
|
|
||||||
var a = w();
|
|
||||||
if (x())
|
|
||||||
return y();
|
|
||||||
z();
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(function() {
|
|
||||||
var a = w();
|
|
||||||
return x() ? y() : (z(), void 0);
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if_var_retrn_3: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
if_return: true,
|
|
||||||
sequences: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
f(function() {
|
|
||||||
var a = w();
|
|
||||||
if (x())
|
|
||||||
return y(a);
|
|
||||||
z();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
f(function() {
|
|
||||||
var a = w();
|
|
||||||
if (x())
|
|
||||||
return y(a);
|
|
||||||
z();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if_var_return_4: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
if_return: true,
|
|
||||||
sequences: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {
|
|
||||||
if (u())
|
|
||||||
return v();
|
|
||||||
var a = w();
|
|
||||||
if (x())
|
|
||||||
return y();
|
|
||||||
z();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f() {
|
|
||||||
return u() ? v() : (a = w(), x() ? y() : (z(), void 0));
|
|
||||||
var a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if_if_return_return: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
if_return: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(a, b) {
|
|
||||||
if (a) {
|
|
||||||
if (b)
|
|
||||||
return b;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
g();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(a, b) {
|
|
||||||
if (a)
|
|
||||||
return b || void 0;
|
|
||||||
g();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if_body_return_1: {
|
|
||||||
options = {
|
|
||||||
if_return: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var c = "PASS";
|
|
||||||
function f(a, b) {
|
|
||||||
if (a) {
|
|
||||||
if (b) throw new Error(c);
|
|
||||||
return 42;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
console.log(f(0, 0));
|
|
||||||
console.log(f(0, 1));
|
|
||||||
console.log(f(1, 0));
|
|
||||||
try {
|
|
||||||
f(1, 1);
|
|
||||||
console.log("FAIL");
|
|
||||||
} catch (e) {
|
|
||||||
console.log(e.message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var c = "PASS";
|
|
||||||
function f(a, b) {
|
|
||||||
if (a) {
|
|
||||||
if (b) throw new Error(c);
|
|
||||||
return 42;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
console.log(f(0, 0));
|
|
||||||
console.log(f(0, 1));
|
|
||||||
console.log(f(1, 0));
|
|
||||||
try {
|
|
||||||
f(1, 1);
|
|
||||||
console.log("FAIL");
|
|
||||||
} catch (e) {
|
|
||||||
console.log(e.message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"true",
|
|
||||||
"true",
|
|
||||||
"42",
|
|
||||||
"PASS",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
if_body_return_2: {
|
|
||||||
options = {
|
|
||||||
if_return: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var c = "PASS";
|
|
||||||
function f(a, b) {
|
|
||||||
if (0 + a) {
|
|
||||||
if (b) throw new Error(c);
|
|
||||||
return 42;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
console.log(f(0, 0));
|
|
||||||
console.log(f(0, 1));
|
|
||||||
console.log(f(1, 0));
|
|
||||||
try {
|
|
||||||
f(1, 1);
|
|
||||||
console.log("FAIL");
|
|
||||||
} catch (e) {
|
|
||||||
console.log(e.message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var c = "PASS";
|
|
||||||
function f(a, b) {
|
|
||||||
if (0 + a) {
|
|
||||||
if (b) throw new Error(c);
|
|
||||||
return 42;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
console.log(f(0, 0));
|
|
||||||
console.log(f(0, 1));
|
|
||||||
console.log(f(1, 0));
|
|
||||||
try {
|
|
||||||
f(1, 1);
|
|
||||||
console.log("FAIL");
|
|
||||||
} catch (e) {
|
|
||||||
console.log(e.message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"true",
|
|
||||||
"true",
|
|
||||||
"42",
|
|
||||||
"PASS",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
if_body_return_3: {
|
|
||||||
options = {
|
|
||||||
if_return: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var c = "PASS";
|
|
||||||
function f(a, b) {
|
|
||||||
if (1 == a) {
|
|
||||||
if (b) throw new Error(c);
|
|
||||||
return 42;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
console.log(f(0, 0));
|
|
||||||
console.log(f(0, 1));
|
|
||||||
console.log(f(1, 0));
|
|
||||||
try {
|
|
||||||
f(1, 1);
|
|
||||||
console.log("FAIL");
|
|
||||||
} catch (e) {
|
|
||||||
console.log(e.message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var c = "PASS";
|
|
||||||
function f(a, b) {
|
|
||||||
if (1 != a) return true;
|
|
||||||
if (b) throw new Error(c);
|
|
||||||
return 42;
|
|
||||||
}
|
|
||||||
console.log(f(0, 0));
|
|
||||||
console.log(f(0, 1));
|
|
||||||
console.log(f(1, 0));
|
|
||||||
try {
|
|
||||||
f(1, 1);
|
|
||||||
console.log("FAIL");
|
|
||||||
} catch (e) {
|
|
||||||
console.log(e.message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"true",
|
|
||||||
"true",
|
|
||||||
"42",
|
|
||||||
"PASS",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_3600_1: {
|
|
||||||
options = {
|
|
||||||
if_return: true,
|
|
||||||
inline: 3,
|
|
||||||
side_effects: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var c = 0;
|
|
||||||
(function() {
|
|
||||||
if ([ ][c++]); else return;
|
|
||||||
return void function() {
|
|
||||||
var b = --b, a = c = 42;
|
|
||||||
return c;
|
|
||||||
}();
|
|
||||||
})();
|
|
||||||
console.log(c);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var c = 0;
|
|
||||||
(function() {
|
|
||||||
if ([][c++]) b = --b, c = 42;
|
|
||||||
var b;
|
|
||||||
})();
|
|
||||||
console.log(c);
|
|
||||||
}
|
|
||||||
expect_stdout: "1"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_3600_2: {
|
|
||||||
options = {
|
|
||||||
if_return: true,
|
|
||||||
inline: true,
|
|
||||||
side_effects: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var c = 0;
|
|
||||||
(function() {
|
|
||||||
if ([ ][c++]); else return;
|
|
||||||
return void function() {
|
|
||||||
var b = --b, a = c = 42;
|
|
||||||
return c;
|
|
||||||
}();
|
|
||||||
})();
|
|
||||||
console.log(c);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var c = 0;
|
|
||||||
(function() {
|
|
||||||
if ([][c++])
|
|
||||||
b = --b,
|
|
||||||
c = 42;
|
|
||||||
var b;
|
|
||||||
})();
|
|
||||||
console.log(c);
|
|
||||||
}
|
|
||||||
expect_stdout: "1"
|
|
||||||
}
|
|
||||||
|
|
||||||
iife_if_return_simple: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
if_return: true,
|
|
||||||
inline: true,
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function() {
|
|
||||||
if (console)
|
|
||||||
return console.log("PASS");
|
|
||||||
console.log("FAIL");
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
console ? console.log("PASS") : console.log("FAIL");
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
nested_if_break: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
if_return: true,
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
for (var i = 0; i < 3; i++)
|
|
||||||
L1: if ("number" == typeof i) {
|
|
||||||
if (0 === i) break L1;
|
|
||||||
console.log(i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
for (var i = 0; i < 3; i++)
|
|
||||||
L1: "number" == typeof i && 0 !== i && console.log(i);
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"1",
|
|
||||||
"2",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
nested_if_continue: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
if_return: true,
|
|
||||||
join_vars: true,
|
|
||||||
loops: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(n) {
|
|
||||||
var i = 0;
|
|
||||||
do {
|
|
||||||
if ("number" == typeof n) {
|
|
||||||
if (0 === n) {
|
|
||||||
console.log("even", i);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (1 === n) {
|
|
||||||
console.log("odd", i);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
} while (0 <= (n -= 2));
|
|
||||||
}
|
|
||||||
f(37);
|
|
||||||
f(42);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(n) {
|
|
||||||
for (var i = 0;
|
|
||||||
"number" == typeof n
|
|
||||||
&& (0 === n
|
|
||||||
? console.log("even", i)
|
|
||||||
: 1 === n
|
|
||||||
? console.log("odd", i)
|
|
||||||
: i++),
|
|
||||||
0 <= (n -= 2););
|
|
||||||
}
|
|
||||||
f(37);
|
|
||||||
f(42);
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"odd 18",
|
|
||||||
"even 21",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
nested_if_return: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
if_return: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {
|
|
||||||
if (A) {
|
|
||||||
if (B)
|
|
||||||
return B;
|
|
||||||
if (C)
|
|
||||||
return D;
|
|
||||||
if (E)
|
|
||||||
return F;
|
|
||||||
if (G)
|
|
||||||
return H;
|
|
||||||
if (I) {
|
|
||||||
if (J)
|
|
||||||
return K;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (L) {
|
|
||||||
if (M)
|
|
||||||
return;
|
|
||||||
return N;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f() {
|
|
||||||
if (A)
|
|
||||||
return B || (C ? D : E ? F : G ? H : I ? J ? K : void 0 : L && !M ? N : void 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_866_1: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
if_return: true,
|
|
||||||
sequences: false,
|
|
||||||
};
|
|
||||||
input: {
|
|
||||||
function f(a) {
|
|
||||||
if (a)
|
|
||||||
return "";
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f(a) {
|
|
||||||
if (a)
|
|
||||||
return "";
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_866_2: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
if_return: true,
|
|
||||||
sequences: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function() {
|
|
||||||
if (a)
|
|
||||||
if (b)
|
|
||||||
c;
|
|
||||||
else
|
|
||||||
return d;
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(function() {
|
|
||||||
if (a) {
|
|
||||||
if (!b)
|
|
||||||
return d;
|
|
||||||
c;
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,229 +0,0 @@
|
|||||||
nought: {
|
|
||||||
input: {
|
|
||||||
import "foo";
|
|
||||||
}
|
|
||||||
expect_exact: 'import"foo";'
|
|
||||||
}
|
|
||||||
|
|
||||||
default_only: {
|
|
||||||
input: {
|
|
||||||
import foo from "bar";
|
|
||||||
}
|
|
||||||
expect_exact: 'import foo from"bar";'
|
|
||||||
}
|
|
||||||
|
|
||||||
all_only: {
|
|
||||||
input: {
|
|
||||||
import * as foo from "bar";
|
|
||||||
}
|
|
||||||
expect_exact: 'import*as foo from"bar";'
|
|
||||||
}
|
|
||||||
|
|
||||||
keys_only: {
|
|
||||||
input: {
|
|
||||||
import { as as foo, bar, delete as baz } from "moo";
|
|
||||||
}
|
|
||||||
expect_exact: 'import{as as foo,bar,delete as baz}from"moo";'
|
|
||||||
}
|
|
||||||
|
|
||||||
default_all: {
|
|
||||||
input: {
|
|
||||||
import foo, * as bar from "baz";
|
|
||||||
}
|
|
||||||
expect_exact: 'import foo,*as bar from"baz";'
|
|
||||||
}
|
|
||||||
|
|
||||||
default_keys: {
|
|
||||||
input: {
|
|
||||||
import foo, { bar } from "baz";
|
|
||||||
}
|
|
||||||
expect_exact: 'import foo,{bar}from"baz";'
|
|
||||||
}
|
|
||||||
|
|
||||||
dynamic: {
|
|
||||||
input: {
|
|
||||||
(async a => await import(a))("foo").then(bar);
|
|
||||||
}
|
|
||||||
expect_exact: '(async a=>await import(a))("foo").then(bar);'
|
|
||||||
}
|
|
||||||
|
|
||||||
dynamic_nought: {
|
|
||||||
input: {
|
|
||||||
import(foo);
|
|
||||||
}
|
|
||||||
expect_exact: "import(foo);"
|
|
||||||
}
|
|
||||||
|
|
||||||
import_meta_1: {
|
|
||||||
input: {
|
|
||||||
console.log(import.meta, import.meta.url);
|
|
||||||
}
|
|
||||||
expect_exact: "console.log(import.meta,import.meta.url);"
|
|
||||||
}
|
|
||||||
|
|
||||||
import_meta_2: {
|
|
||||||
input: {
|
|
||||||
import.meta.url.split("/").forEach(function(part, index) {
|
|
||||||
console.log(index, part);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
expect_exact: 'import.meta.url.split("/").forEach(function(part,index){console.log(index,part)});'
|
|
||||||
}
|
|
||||||
|
|
||||||
same_quotes: {
|
|
||||||
beautify = {
|
|
||||||
beautify: true,
|
|
||||||
quote_style: 3,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
import 'foo';
|
|
||||||
import "bar";
|
|
||||||
}
|
|
||||||
expect_exact: [
|
|
||||||
"import 'foo';",
|
|
||||||
"",
|
|
||||||
'import "bar";',
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
drop_unused: {
|
|
||||||
options = {
|
|
||||||
imports: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
import a, * as b from "foo";
|
|
||||||
import { c } from "bar";
|
|
||||||
import { d, _ as e } from "baz";
|
|
||||||
console.log(d);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
import "foo";
|
|
||||||
import "bar";
|
|
||||||
import { d as d } from "baz";
|
|
||||||
console.log(d);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
drop_side_effect_free: {
|
|
||||||
options = {
|
|
||||||
imports: true,
|
|
||||||
side_effects: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
import foo from "bar";
|
|
||||||
var a = foo;
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
import "bar";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mangle: {
|
|
||||||
rename = false
|
|
||||||
mangle = {
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
import foo, { bar } from "baz";
|
|
||||||
consoe.log(moo);
|
|
||||||
import * as moo from "moz";
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
import o, { bar as m } from "baz";
|
|
||||||
consoe.log(r);
|
|
||||||
import * as r from "moz";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
rename_mangle: {
|
|
||||||
rename = true
|
|
||||||
mangle = {
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
import foo, { bar } from "baz";
|
|
||||||
consoe.log(moo);
|
|
||||||
import * as moo from "moz";
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
import o, { bar as m } from "baz";
|
|
||||||
consoe.log(r);
|
|
||||||
import * as r from "moz";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
keep_ref: {
|
|
||||||
options = {
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
import foo from "bar";
|
|
||||||
foo();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
import foo from "bar";
|
|
||||||
foo();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
forbid_merge: {
|
|
||||||
options = {
|
|
||||||
merge_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
import A from "foo";
|
|
||||||
export default class extends A {}
|
|
||||||
var f = () => () => {};
|
|
||||||
f();
|
|
||||||
f();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
import A from "foo";
|
|
||||||
export default class extends A {}
|
|
||||||
var f = () => () => {};
|
|
||||||
f();
|
|
||||||
f();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_4708_1: {
|
|
||||||
options = {
|
|
||||||
imports: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a;
|
|
||||||
import a from "foo";
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a;
|
|
||||||
import a from "foo";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_4708_2: {
|
|
||||||
options = {
|
|
||||||
imports: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a;
|
|
||||||
console.log(a);
|
|
||||||
import a from "foo";
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a;
|
|
||||||
console.log(a);
|
|
||||||
import a from "foo";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,100 +0,0 @@
|
|||||||
numeric: {
|
|
||||||
beautify = {
|
|
||||||
beautify: true,
|
|
||||||
indent_start: 1,
|
|
||||||
indent_level: 3,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
switch (42) {
|
|
||||||
case null:
|
|
||||||
console.log("FAIL");
|
|
||||||
}
|
|
||||||
console.log("PASS");
|
|
||||||
}
|
|
||||||
expect_exact: [
|
|
||||||
" switch (42) {",
|
|
||||||
" case null:",
|
|
||||||
' console.log("FAIL");',
|
|
||||||
" }",
|
|
||||||
"",
|
|
||||||
' console.log("PASS");',
|
|
||||||
]
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
spaces: {
|
|
||||||
beautify = {
|
|
||||||
beautify: true,
|
|
||||||
indent_start: " ",
|
|
||||||
indent_level: " ",
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
switch (42) {
|
|
||||||
case null:
|
|
||||||
console.log("FAIL");
|
|
||||||
}
|
|
||||||
console.log("PASS");
|
|
||||||
}
|
|
||||||
expect_exact: [
|
|
||||||
" switch (42) {",
|
|
||||||
" case null:",
|
|
||||||
' console.log("FAIL");',
|
|
||||||
" }",
|
|
||||||
"",
|
|
||||||
' console.log("PASS");',
|
|
||||||
]
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
tabs: {
|
|
||||||
beautify = {
|
|
||||||
beautify: true,
|
|
||||||
indent_start: "\t",
|
|
||||||
indent_level: "\t",
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
switch (42) {
|
|
||||||
case null:
|
|
||||||
console.log("FAIL");
|
|
||||||
}
|
|
||||||
console.log("PASS");
|
|
||||||
}
|
|
||||||
expect_exact: [
|
|
||||||
"\tswitch (42) {",
|
|
||||||
"\tcase null:",
|
|
||||||
'\t\tconsole.log("FAIL");',
|
|
||||||
"\t}",
|
|
||||||
"",
|
|
||||||
'\tconsole.log("PASS");',
|
|
||||||
]
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
mixed: {
|
|
||||||
beautify = {
|
|
||||||
beautify: true,
|
|
||||||
indent_start: "\n",
|
|
||||||
indent_level: " \t",
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
switch (42) {
|
|
||||||
case null:
|
|
||||||
console.log("FAIL");
|
|
||||||
}
|
|
||||||
console.log("PASS");
|
|
||||||
}
|
|
||||||
expect_exact: [
|
|
||||||
"",
|
|
||||||
"switch (42) {",
|
|
||||||
"",
|
|
||||||
" case null:",
|
|
||||||
"",
|
|
||||||
' \tconsole.log("FAIL");',
|
|
||||||
"",
|
|
||||||
"}",
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
'console.log("PASS");',
|
|
||||||
]
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
8
test/compress/issue-1001.js
Normal file
8
test/compress/issue-1001.js
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
parenthesis_strings_in_parenthesis: {
|
||||||
|
input: {
|
||||||
|
var foo = ('(');
|
||||||
|
a(')');
|
||||||
|
|
||||||
|
}
|
||||||
|
expect_exact: 'var foo="(";a(")");'
|
||||||
|
}
|
||||||
@@ -1,17 +1,8 @@
|
|||||||
non_hoisted_function_after_return: {
|
non_hoisted_function_after_return: {
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
hoist_funs: false, dead_code: true, conditionals: true, comparisons: true,
|
||||||
comparisons: true,
|
evaluate: true, booleans: true, loops: true, unused: true, keep_fargs: true,
|
||||||
conditionals: true,
|
if_return: true, join_vars: true, cascade: true, side_effects: true
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
|
||||||
hoist_funs: false,
|
|
||||||
if_return: true,
|
|
||||||
join_vars: true,
|
|
||||||
keep_fargs: true,
|
|
||||||
loops: true,
|
|
||||||
side_effects: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function foo(x) {
|
function foo(x) {
|
||||||
@@ -30,35 +21,25 @@ non_hoisted_function_after_return: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function foo(x) {
|
function foo(x) {
|
||||||
return (x ? bar : baz)();
|
return x ? bar() : baz();
|
||||||
function bar() { return 7 }
|
function bar() { return 7 }
|
||||||
function baz() { return 8 }
|
function baz() { return 8 }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:4,16]",
|
'WARN: Dropping unreachable code [test/compress/issue-1034.js:11,16]',
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:7,16]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:14,16]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:10,12]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:17,12]",
|
||||||
"WARN: Dropping unused function UnusedFunction [test/compress/issue-1034.js:11,21]",
|
"WARN: Dropping unused function UnusedFunction [test/compress/issue-1034.js:18,21]"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
non_hoisted_function_after_return_2a: {
|
non_hoisted_function_after_return_2a: {
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
hoist_funs: false, dead_code: true, conditionals: true, comparisons: true,
|
||||||
collapse_vars: false,
|
evaluate: true, booleans: true, loops: true, unused: true, keep_fargs: true,
|
||||||
comparisons: true,
|
if_return: true, join_vars: true, cascade: true, side_effects: true,
|
||||||
conditionals: true,
|
collapse_vars: false, passes: 2, warnings: "verbose"
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
|
||||||
hoist_funs: false,
|
|
||||||
if_return: true,
|
|
||||||
join_vars: true,
|
|
||||||
keep_fargs: true,
|
|
||||||
loops: true,
|
|
||||||
passes: 2,
|
|
||||||
side_effects: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function foo(x) {
|
function foo(x) {
|
||||||
@@ -84,34 +65,26 @@ non_hoisted_function_after_return_2a: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
"WARN: Dropping initialization in unreachable code [test/compress/issue-1034.js:4,16]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:48,16]",
|
||||||
"WARN: Dropping initialization in unreachable code [test/compress/issue-1034.js:7,16]",
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:48,16]",
|
||||||
"WARN: Dropping unused variable a [test/compress/issue-1034.js:4,20]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:51,16]",
|
||||||
"WARN: Dropping unused function nope [test/compress/issue-1034.js:11,21]",
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:51,16]",
|
||||||
"INFO: pass 0: last_count: Infinity, count: 35",
|
"WARN: Dropping unused variable a [test/compress/issue-1034.js:48,20]",
|
||||||
"WARN: Dropping initialization in unreachable code [test/compress/issue-1034.js:9,12]",
|
"WARN: Dropping unused function nope [test/compress/issue-1034.js:55,21]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:12,12]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:53,12]",
|
||||||
"INFO: Dropping unused variable b [test/compress/issue-1034.js:7,20]",
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:53,12]",
|
||||||
"INFO: Dropping unused variable c [test/compress/issue-1034.js:9,16]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:56,12]",
|
||||||
"INFO: pass 1: last_count: 35, count: 18",
|
"WARN: Dropping unused variable b [test/compress/issue-1034.js:51,20]",
|
||||||
|
"WARN: Dropping unused variable c [test/compress/issue-1034.js:53,16]",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
non_hoisted_function_after_return_2b: {
|
non_hoisted_function_after_return_2b: {
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
hoist_funs: false, dead_code: true, conditionals: true, comparisons: true,
|
||||||
collapse_vars: false,
|
evaluate: true, booleans: true, loops: true, unused: true, keep_fargs: true,
|
||||||
comparisons: true,
|
if_return: true, join_vars: true, cascade: true, side_effects: true,
|
||||||
conditionals: true,
|
collapse_vars: false
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
|
||||||
hoist_funs: false,
|
|
||||||
if_return: true,
|
|
||||||
join_vars: true,
|
|
||||||
keep_fargs: true,
|
|
||||||
loops: true,
|
|
||||||
side_effects: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function foo(x) {
|
function foo(x) {
|
||||||
@@ -135,164 +108,11 @@ non_hoisted_function_after_return_2b: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
"WARN: Dropping initialization in unreachable code [test/compress/issue-1034.js:8,12]",
|
// duplicate warnings no longer emitted
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:12,12]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:95,16]",
|
||||||
]
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:95,16]",
|
||||||
}
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:97,12]",
|
||||||
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:97,12]",
|
||||||
non_hoisted_function_after_return_strict: {
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:101,12]",
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
comparisons: true,
|
|
||||||
conditionals: true,
|
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
|
||||||
hoist_funs: false,
|
|
||||||
if_return: true,
|
|
||||||
join_vars: true,
|
|
||||||
keep_fargs: true,
|
|
||||||
loops: true,
|
|
||||||
side_effects: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
"use strict";
|
|
||||||
function foo(x) {
|
|
||||||
if (x) {
|
|
||||||
return bar();
|
|
||||||
not_called1();
|
|
||||||
} else {
|
|
||||||
return baz();
|
|
||||||
not_called2();
|
|
||||||
}
|
|
||||||
function bar() { return 7; }
|
|
||||||
return not_reached;
|
|
||||||
function UnusedFunction() {}
|
|
||||||
function baz() { return 8; }
|
|
||||||
}
|
|
||||||
console.log(foo(0), foo(1));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
"use strict";
|
|
||||||
function foo(x) {
|
|
||||||
return (x ? bar : baz)();
|
|
||||||
function bar() { return 7 }
|
|
||||||
function baz() { return 8 }
|
|
||||||
}
|
|
||||||
console.log(foo(0), foo(1));
|
|
||||||
}
|
|
||||||
expect_stdout: "8 7"
|
|
||||||
expect_warnings: [
|
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:5,16]",
|
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:8,16]",
|
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:11,12]",
|
|
||||||
"WARN: Dropping unused function UnusedFunction [test/compress/issue-1034.js:12,21]",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
non_hoisted_function_after_return_2a_strict: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
collapse_vars: false,
|
|
||||||
comparisons: true,
|
|
||||||
conditionals: true,
|
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
|
||||||
hoist_funs: false,
|
|
||||||
if_return: true,
|
|
||||||
join_vars: true,
|
|
||||||
keep_fargs: true,
|
|
||||||
loops: true,
|
|
||||||
passes: 2,
|
|
||||||
side_effects: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
"use strict";
|
|
||||||
function foo(x) {
|
|
||||||
if (x) {
|
|
||||||
return bar(1);
|
|
||||||
var a = not_called(1);
|
|
||||||
} else {
|
|
||||||
return bar(2);
|
|
||||||
var b = not_called(2);
|
|
||||||
}
|
|
||||||
var c = bar(3);
|
|
||||||
function bar(x) { return 7 - x; }
|
|
||||||
function nope() {}
|
|
||||||
return b || c;
|
|
||||||
}
|
|
||||||
console.log(foo(0), foo(1));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
"use strict";
|
|
||||||
function foo(x) {
|
|
||||||
return bar(x ? 1 : 2);
|
|
||||||
function bar(x) {
|
|
||||||
return 7 - x;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
console.log(foo(0), foo(1));
|
|
||||||
}
|
|
||||||
expect_stdout: "5 6"
|
|
||||||
expect_warnings: [
|
|
||||||
"WARN: Dropping initialization in unreachable code [test/compress/issue-1034.js:5,16]",
|
|
||||||
"WARN: Dropping initialization in unreachable code [test/compress/issue-1034.js:8,16]",
|
|
||||||
"WARN: Dropping unused variable a [test/compress/issue-1034.js:5,20]",
|
|
||||||
"WARN: Dropping unused function nope [test/compress/issue-1034.js:12,21]",
|
|
||||||
"INFO: pass 0: last_count: Infinity, count: 46",
|
|
||||||
"WARN: Dropping initialization in unreachable code [test/compress/issue-1034.js:10,12]",
|
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:13,12]",
|
|
||||||
"INFO: Dropping unused variable b [test/compress/issue-1034.js:8,20]",
|
|
||||||
"INFO: Dropping unused variable c [test/compress/issue-1034.js:10,16]",
|
|
||||||
"INFO: pass 1: last_count: 46, count: 29",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
non_hoisted_function_after_return_2b_strict: {
|
|
||||||
options = {
|
|
||||||
booleans: true,
|
|
||||||
collapse_vars: false,
|
|
||||||
comparisons: true,
|
|
||||||
conditionals: true,
|
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
|
||||||
hoist_funs: false,
|
|
||||||
if_return: true,
|
|
||||||
join_vars: true,
|
|
||||||
keep_fargs: true,
|
|
||||||
loops: true,
|
|
||||||
side_effects: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
"use strict";
|
|
||||||
function foo(x) {
|
|
||||||
if (x) {
|
|
||||||
return bar(1);
|
|
||||||
} else {
|
|
||||||
return bar(2);
|
|
||||||
var b;
|
|
||||||
}
|
|
||||||
var c = bar(3);
|
|
||||||
function bar(x) {
|
|
||||||
return 7 - x;
|
|
||||||
}
|
|
||||||
return b || c;
|
|
||||||
}
|
|
||||||
console.log(foo(0), foo(1));
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
"use strict";
|
|
||||||
function foo(x) {
|
|
||||||
return bar(x ? 1 : 2);
|
|
||||||
function bar(x) { return 7 - x; }
|
|
||||||
}
|
|
||||||
console.log(foo(0), foo(1));
|
|
||||||
}
|
|
||||||
expect_stdout: "5 6"
|
|
||||||
expect_warnings: [
|
|
||||||
"WARN: Dropping initialization in unreachable code [test/compress/issue-1034.js:9,12]",
|
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:13,12]",
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,21 @@
|
|||||||
|
const_declaration: {
|
||||||
|
options = {
|
||||||
|
evaluate: true
|
||||||
|
};
|
||||||
|
|
||||||
|
input: {
|
||||||
|
const goog = goog || {};
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
const goog = goog || {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const_pragma: {
|
const_pragma: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
}
|
};
|
||||||
|
|
||||||
input: {
|
input: {
|
||||||
/** @const */ var goog = goog || {};
|
/** @const */ var goog = goog || {};
|
||||||
@@ -17,9 +29,8 @@ const_pragma: {
|
|||||||
not_const: {
|
not_const: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
}
|
};
|
||||||
|
|
||||||
input: {
|
input: {
|
||||||
var goog = goog || {};
|
var goog = goog || {};
|
||||||
|
|||||||
30
test/compress/issue-1043.js
Normal file
30
test/compress/issue-1043.js
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
issue_1043: {
|
||||||
|
options = {
|
||||||
|
side_effects: true
|
||||||
|
};
|
||||||
|
|
||||||
|
input: {
|
||||||
|
function* range(start = 0, end = null, step = 1) {
|
||||||
|
if (end == null) {
|
||||||
|
end = start;
|
||||||
|
start = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let i = start; i < end; i += step) {
|
||||||
|
yield i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
expect: {
|
||||||
|
function* range(start = 0, end = null, step = 1) {
|
||||||
|
if (null == end) {
|
||||||
|
end = start;
|
||||||
|
start = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let i = start; i < end; i += step)
|
||||||
|
yield i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
9
test/compress/issue-1044.js
Normal file
9
test/compress/issue-1044.js
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
issue_1044: {
|
||||||
|
options = { evaluate: true, conditionals: true };
|
||||||
|
input: {
|
||||||
|
const mixed = Base ? class extends Base {} : class {}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
const mixed = Base ? class extends Base {} : class {}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,169 +1,96 @@
|
|||||||
multiple_functions: {
|
multiple_functions: {
|
||||||
options = {
|
options = { if_return: true, hoist_funs: false };
|
||||||
hoist_funs: false,
|
|
||||||
if_return: true,
|
|
||||||
}
|
|
||||||
input: {
|
input: {
|
||||||
(function() {
|
( function() {
|
||||||
if (!window)
|
if ( !window ) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
function f() {}
|
function f() {}
|
||||||
function g() {}
|
function g() {}
|
||||||
})();
|
} )();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
(function() {
|
( function() {
|
||||||
// NOTE: other compression steps will reduce this
|
|
||||||
// down to just `window`.
|
|
||||||
if (!window);
|
|
||||||
function f() {}
|
function f() {}
|
||||||
function g() {}
|
function g() {}
|
||||||
})();
|
|
||||||
|
// NOTE: other compression steps will reduce this
|
||||||
|
// down to just `window`.
|
||||||
|
if ( window );
|
||||||
|
} )();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
single_function: {
|
single_function: {
|
||||||
options = {
|
options = { if_return: true, hoist_funs: false };
|
||||||
hoist_funs: false,
|
|
||||||
if_return: true,
|
|
||||||
}
|
|
||||||
input: {
|
input: {
|
||||||
(function() {
|
( function() {
|
||||||
if (!window)
|
if ( !window ) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
function f() {}
|
function f() {}
|
||||||
})();
|
} )();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
(function() {
|
( function() {
|
||||||
if (!window);
|
|
||||||
function f() {}
|
function f() {}
|
||||||
})();
|
|
||||||
|
if ( window );
|
||||||
|
} )();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
deeply_nested: {
|
deeply_nested: {
|
||||||
options = {
|
options = { if_return: true, hoist_funs: false };
|
||||||
hoist_funs: false,
|
|
||||||
if_return: true,
|
|
||||||
}
|
|
||||||
input: {
|
input: {
|
||||||
(function() {
|
( function() {
|
||||||
if (!window)
|
if ( !window ) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
function f() {}
|
function f() {}
|
||||||
function g() {}
|
function g() {}
|
||||||
if (!document)
|
|
||||||
|
if ( !document ) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
function h() {}
|
function h() {}
|
||||||
})();
|
} )();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
(function() {
|
( function() {
|
||||||
// NOTE: other compression steps will reduce this
|
|
||||||
// down to just `window`.
|
|
||||||
if (!window);
|
|
||||||
else if (!document);
|
|
||||||
function f() {}
|
function f() {}
|
||||||
function g() {}
|
function g() {}
|
||||||
|
|
||||||
function h() {}
|
function h() {}
|
||||||
})();
|
|
||||||
|
// NOTE: other compression steps will reduce this
|
||||||
|
// down to just `window`.
|
||||||
|
if ( window )
|
||||||
|
if (document);
|
||||||
|
} )();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
not_hoisted_when_already_nested: {
|
not_hoisted_when_already_nested: {
|
||||||
options = {
|
options = { if_return: true, hoist_funs: false };
|
||||||
hoist_funs: false,
|
|
||||||
if_return: true,
|
|
||||||
}
|
|
||||||
input: {
|
input: {
|
||||||
(function() {
|
( function() {
|
||||||
if (!window)
|
if ( !window ) {
|
||||||
return;
|
return;
|
||||||
if (foo) function f() {}
|
|
||||||
})();
|
|
||||||
}
|
}
|
||||||
expect: {
|
|
||||||
(function() {
|
|
||||||
if (!window);
|
|
||||||
else if (foo)
|
|
||||||
function f() {}
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
defun_if_return: {
|
if ( foo ) function f() {}
|
||||||
options = {
|
|
||||||
hoist_funs: false,
|
|
||||||
if_return: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function e() {
|
|
||||||
function f() {}
|
|
||||||
if (!window)
|
|
||||||
return;
|
|
||||||
else
|
|
||||||
function g() {}
|
|
||||||
function h() {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function e() {
|
|
||||||
function f() {}
|
|
||||||
if (!window);
|
|
||||||
else
|
|
||||||
function g() {}
|
|
||||||
function h() {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
defun_hoist_funs: {
|
} )();
|
||||||
options = {
|
|
||||||
hoist_funs: true,
|
|
||||||
if_return: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function e() {
|
|
||||||
function f() {}
|
|
||||||
if (!window)
|
|
||||||
return;
|
|
||||||
else
|
|
||||||
function g() {}
|
|
||||||
function h() {}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function e() {
|
( function() {
|
||||||
function f() {}
|
if ( window )
|
||||||
function g() {}
|
if ( foo ) function f() {}
|
||||||
function h() {}
|
} )();
|
||||||
if (!window);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
defun_else_if_return: {
|
|
||||||
options = {
|
|
||||||
hoist_funs: false,
|
|
||||||
if_return: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function e() {
|
|
||||||
function f() {}
|
|
||||||
if (window)
|
|
||||||
function g() {}
|
|
||||||
else
|
|
||||||
return;
|
|
||||||
function h() {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function e() {
|
|
||||||
function f() {}
|
|
||||||
if (window)
|
|
||||||
function g() {}
|
|
||||||
function h() {}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
with_in_global_scope: {
|
with_in_global_scope: {
|
||||||
options = {
|
options = {
|
||||||
unused: true,
|
unused: true
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var o = 42;
|
var o = 42;
|
||||||
@@ -18,7 +18,7 @@ with_in_global_scope: {
|
|||||||
}
|
}
|
||||||
with_in_function_scope: {
|
with_in_function_scope: {
|
||||||
options = {
|
options = {
|
||||||
unused: true,
|
unused: true
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function foo() {
|
function foo() {
|
||||||
@@ -40,7 +40,7 @@ with_in_function_scope: {
|
|||||||
}
|
}
|
||||||
compress_with_with_in_other_scope: {
|
compress_with_with_in_other_scope: {
|
||||||
options = {
|
options = {
|
||||||
unused: true,
|
unused: true
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function foo() {
|
function foo() {
|
||||||
@@ -69,7 +69,7 @@ compress_with_with_in_other_scope: {
|
|||||||
}
|
}
|
||||||
with_using_existing_variable_outside_scope: {
|
with_using_existing_variable_outside_scope: {
|
||||||
options = {
|
options = {
|
||||||
unused: true,
|
unused: true
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f() {
|
function f() {
|
||||||
@@ -99,7 +99,7 @@ with_using_existing_variable_outside_scope: {
|
|||||||
}
|
}
|
||||||
check_drop_unused_in_peer_function: {
|
check_drop_unused_in_peer_function: {
|
||||||
options = {
|
options = {
|
||||||
unused: true,
|
unused: true
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function outer() {
|
function outer() {
|
||||||
@@ -148,57 +148,52 @@ check_drop_unused_in_peer_function: {
|
|||||||
|
|
||||||
Infinity_not_in_with_scope: {
|
Infinity_not_in_with_scope: {
|
||||||
options = {
|
options = {
|
||||||
unused: true,
|
unused: true
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var o = { Infinity: "FAIL" };
|
var o = { Infinity: 'oInfinity' };
|
||||||
var vInfinity = "Infinity";
|
var vInfinity = "Infinity";
|
||||||
vInfinity = Infinity;
|
vInfinity = Infinity;
|
||||||
console.log(vInfinity);
|
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var o = { Infinity: "FAIL" };
|
var o = { Infinity: 'oInfinity' }
|
||||||
var vInfinity = "Infinity";
|
var vInfinity = "Infinity"
|
||||||
vInfinity = 1/0;
|
vInfinity = 1/0
|
||||||
console.log(vInfinity);
|
|
||||||
}
|
}
|
||||||
expect_stdout: "Infinity"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Infinity_in_with_scope: {
|
Infinity_in_with_scope: {
|
||||||
options = {
|
options = {
|
||||||
unused: true,
|
unused: true
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var o = { Infinity: "PASS" };
|
var o = { Infinity: 'oInfinity' };
|
||||||
var vInfinity = "Infinity";
|
var vInfinity = "Infinity";
|
||||||
with (o) { vInfinity = Infinity; }
|
with (o) { vInfinity = Infinity; }
|
||||||
console.log(vInfinity);
|
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var o = { Infinity: "PASS" };
|
var o = { Infinity: 'oInfinity' }
|
||||||
var vInfinity = "Infinity";
|
var vInfinity = "Infinity"
|
||||||
with (o) vInfinity = Infinity;
|
with (o) vInfinity = Infinity
|
||||||
console.log(vInfinity);
|
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
assorted_Infinity_NaN_undefined_in_with_scope: {
|
assorted_Infinity_NaN_undefined_in_with_scope: {
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
unused: true,
|
||||||
comparisons: true,
|
|
||||||
conditionals: true,
|
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
dead_code: true,
|
||||||
|
conditionals: true,
|
||||||
|
comparisons: true,
|
||||||
|
booleans: true,
|
||||||
hoist_funs: true,
|
hoist_funs: true,
|
||||||
|
keep_fargs: true,
|
||||||
if_return: true,
|
if_return: true,
|
||||||
join_vars: true,
|
join_vars: true,
|
||||||
keep_fargs: true,
|
cascade: true,
|
||||||
keep_infinity: false,
|
|
||||||
sequences: false,
|
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
unused: true,
|
sequences: false,
|
||||||
|
keep_infinity: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var f = console.log;
|
var f = console.log;
|
||||||
@@ -248,19 +243,20 @@ assorted_Infinity_NaN_undefined_in_with_scope: {
|
|||||||
|
|
||||||
assorted_Infinity_NaN_undefined_in_with_scope_keep_infinity: {
|
assorted_Infinity_NaN_undefined_in_with_scope_keep_infinity: {
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
unused: true,
|
||||||
comparisons: true,
|
|
||||||
conditionals: true,
|
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
dead_code: true,
|
||||||
|
conditionals: true,
|
||||||
|
comparisons: true,
|
||||||
|
booleans: true,
|
||||||
hoist_funs: true,
|
hoist_funs: true,
|
||||||
|
keep_fargs: true,
|
||||||
if_return: true,
|
if_return: true,
|
||||||
join_vars: true,
|
join_vars: true,
|
||||||
keep_fargs: true,
|
cascade: true,
|
||||||
keep_infinity: true,
|
|
||||||
sequences: false,
|
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
unused: true,
|
sequences: false,
|
||||||
|
keep_infinity: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var f = console.log;
|
var f = console.log;
|
||||||
|
|||||||
@@ -1,78 +1,58 @@
|
|||||||
keep_name_of_getter: {
|
keep_name_of_getter: {
|
||||||
options = {
|
options = { unused: true };
|
||||||
unused: true,
|
input: { a = { get foo () {} } }
|
||||||
}
|
expect: { a = { get foo () {} } }
|
||||||
input: {
|
|
||||||
a = {
|
|
||||||
get foo() {},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
a = {
|
|
||||||
get foo() {},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
keep_name_of_setter: {
|
keep_name_of_setter: {
|
||||||
options = {
|
options = { unused: true };
|
||||||
unused: true,
|
input: { a = { set foo () {} } }
|
||||||
}
|
expect: { a = { set foo () {} } }
|
||||||
input: {
|
|
||||||
a = {
|
|
||||||
set foo(v) {},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
a = {
|
|
||||||
set foo(v) {},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
setter_with_operator_keys: {
|
setter_with_operator_keys: {
|
||||||
input: {
|
input: {
|
||||||
var tokenCodes = {
|
var tokenCodes = {
|
||||||
get instanceof() {
|
get instanceof(){
|
||||||
return test0;
|
return test0;
|
||||||
},
|
},
|
||||||
set instanceof(value) {
|
set instanceof(value){
|
||||||
test0 = value;
|
test0 = value;
|
||||||
},
|
},
|
||||||
set typeof(value) {
|
set typeof(value){
|
||||||
test1 = value;
|
test1 = value;
|
||||||
},
|
},
|
||||||
get typeof() {
|
get typeof(){
|
||||||
return test1;
|
return test1;
|
||||||
},
|
},
|
||||||
set else(value) {
|
set else(value){
|
||||||
test2 = value;
|
test2 = value;
|
||||||
},
|
},
|
||||||
get else() {
|
get else(){
|
||||||
return test2;
|
return test2;
|
||||||
},
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var tokenCodes = {
|
var tokenCodes = {
|
||||||
get instanceof() {
|
get instanceof(){
|
||||||
return test0;
|
return test0;
|
||||||
},
|
},
|
||||||
set instanceof(value) {
|
set instanceof(value){
|
||||||
test0 = value;
|
test0 = value;
|
||||||
},
|
},
|
||||||
set typeof(value) {
|
set typeof(value){
|
||||||
test1 = value;
|
test1 = value;
|
||||||
},
|
},
|
||||||
get typeof() {
|
get typeof(){
|
||||||
return test1;
|
return test1;
|
||||||
},
|
},
|
||||||
set else(value) {
|
set else(value){
|
||||||
test2 = value;
|
test2 = value;
|
||||||
},
|
},
|
||||||
get else() {
|
get else(){
|
||||||
return test2;
|
return test2;
|
||||||
},
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
mangle_keep_fnames_false: {
|
mangle_keep_fnames_false: {
|
||||||
options = {
|
options = {
|
||||||
keep_fargs: true,
|
keep_fnames : true,
|
||||||
keep_fnames: true,
|
keep_fargs : true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
keep_fnames: false,
|
keep_fnames : false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
"use strict";
|
"use strict";
|
||||||
@@ -26,11 +26,11 @@ mangle_keep_fnames_false: {
|
|||||||
|
|
||||||
mangle_keep_fnames_true: {
|
mangle_keep_fnames_true: {
|
||||||
options = {
|
options = {
|
||||||
keep_fargs: true,
|
keep_fnames : true,
|
||||||
keep_fnames: true,
|
keep_fargs : true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
keep_fnames: true,
|
keep_fnames : true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|||||||
76
test/compress/issue-1212.js
Normal file
76
test/compress/issue-1212.js
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
issue_1212_debug_false: {
|
||||||
|
options = {
|
||||||
|
global_defs : { DEBUG: false },
|
||||||
|
sequences : true,
|
||||||
|
properties : true,
|
||||||
|
dead_code : true,
|
||||||
|
conditionals : true,
|
||||||
|
comparisons : true,
|
||||||
|
evaluate : true,
|
||||||
|
booleans : true,
|
||||||
|
loops : true,
|
||||||
|
unused : true,
|
||||||
|
hoist_funs : true,
|
||||||
|
keep_fargs : true,
|
||||||
|
if_return : true,
|
||||||
|
join_vars : true,
|
||||||
|
cascade : true,
|
||||||
|
side_effects : true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
class foo {
|
||||||
|
bar() {
|
||||||
|
if (DEBUG)
|
||||||
|
console.log("DEV");
|
||||||
|
else
|
||||||
|
console.log("PROD");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
new foo().bar();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
class foo{
|
||||||
|
bar() { console.log("PROD") }
|
||||||
|
}
|
||||||
|
(new foo).bar();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1212_debug_true: {
|
||||||
|
options = {
|
||||||
|
global_defs : { DEBUG: true },
|
||||||
|
sequences : true,
|
||||||
|
properties : true,
|
||||||
|
dead_code : true,
|
||||||
|
conditionals : true,
|
||||||
|
comparisons : true,
|
||||||
|
evaluate : true,
|
||||||
|
booleans : true,
|
||||||
|
loops : true,
|
||||||
|
unused : true,
|
||||||
|
hoist_funs : true,
|
||||||
|
keep_fargs : true,
|
||||||
|
if_return : true,
|
||||||
|
join_vars : true,
|
||||||
|
cascade : true,
|
||||||
|
side_effects : true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
class foo {
|
||||||
|
bar() {
|
||||||
|
if (DEBUG)
|
||||||
|
console.log("DEV");
|
||||||
|
else
|
||||||
|
console.log("PROD");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
new foo().bar();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
class foo{
|
||||||
|
bar() { console.log("DEV") }
|
||||||
|
}
|
||||||
|
(new foo).bar();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -1,15 +1,15 @@
|
|||||||
pure_function_calls: {
|
pure_function_calls: {
|
||||||
options = {
|
options = {
|
||||||
annotations: true,
|
evaluate : true,
|
||||||
booleans: true,
|
conditionals : true,
|
||||||
comparisons: true,
|
comparisons : true,
|
||||||
conditionals: true,
|
side_effects : true,
|
||||||
evaluate: true,
|
booleans : true,
|
||||||
if_return: true,
|
unused : true,
|
||||||
join_vars: true,
|
if_return : true,
|
||||||
negate_iife: true,
|
join_vars : true,
|
||||||
side_effects: true,
|
cascade : true,
|
||||||
unused: true,
|
negate_iife : true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
// pure top-level IIFE will be dropped
|
// pure top-level IIFE will be dropped
|
||||||
@@ -49,29 +49,29 @@ pure_function_calls: {
|
|||||||
a.b(), f.g();
|
a.b(), f.g();
|
||||||
}
|
}
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:3,8]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:17,8]",
|
||||||
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:3,8]",
|
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:17,8]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:16,37]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:30,37]",
|
||||||
"WARN: Dropping unused variable iife2 [test/compress/issue-1261.js:16,16]",
|
"WARN: Dropping unused variable iife2 [test/compress/issue-1261.js:30,16]",
|
||||||
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:14,8]",
|
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:28,8]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:24,8]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:38,8]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:25,31]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:39,31]",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
pure_function_calls_toplevel: {
|
pure_function_calls_toplevel: {
|
||||||
options = {
|
options = {
|
||||||
annotations: true,
|
evaluate : true,
|
||||||
booleans: true,
|
conditionals : true,
|
||||||
comparisons: true,
|
comparisons : true,
|
||||||
conditionals: true,
|
side_effects : true,
|
||||||
evaluate: true,
|
booleans : true,
|
||||||
if_return: true,
|
unused : true,
|
||||||
join_vars: true,
|
if_return : true,
|
||||||
negate_iife: true,
|
join_vars : true,
|
||||||
side_effects: true,
|
cascade : true,
|
||||||
toplevel: true,
|
negate_iife : true,
|
||||||
unused: true,
|
toplevel : true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
// pure top-level IIFE will be dropped
|
// pure top-level IIFE will be dropped
|
||||||
@@ -96,13 +96,6 @@ pure_function_calls_toplevel: {
|
|||||||
})();
|
})();
|
||||||
})();
|
})();
|
||||||
|
|
||||||
// pure top-level calls will be dropped regardless of the leading comments position
|
|
||||||
var MyClass = /*#__PURE__*//*@class*/(function(){
|
|
||||||
function MyClass() {}
|
|
||||||
MyClass.prototype.method = function() {};
|
|
||||||
return MyClass;
|
|
||||||
})();
|
|
||||||
|
|
||||||
// comment #__PURE__ comment
|
// comment #__PURE__ comment
|
||||||
bar(), baz(), quux();
|
bar(), baz(), quux();
|
||||||
a.b(), /* @__PURE__ */ c.d.e(), f.g();
|
a.b(), /* @__PURE__ */ c.d.e(), f.g();
|
||||||
@@ -112,23 +105,20 @@ pure_function_calls_toplevel: {
|
|||||||
a.b(), f.g();
|
a.b(), f.g();
|
||||||
}
|
}
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:3,8]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:79,8]",
|
||||||
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:3,8]",
|
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:79,8]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:16,37]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:92,37]",
|
||||||
"WARN: Dropping unused variable iife2 [test/compress/issue-1261.js:16,16]",
|
"WARN: Dropping unused variable iife2 [test/compress/issue-1261.js:92,16]",
|
||||||
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:14,8]",
|
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:90,8]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:31,8]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:100,8]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:32,31]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:101,31]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:8,33]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:84,33]",
|
||||||
"WARN: Dropping unused variable iife1 [test/compress/issue-1261.js:8,12]",
|
"WARN: Dropping unused variable iife1 [test/compress/issue-1261.js:84,12]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:24,45]",
|
|
||||||
"WARN: Dropping unused variable MyClass [test/compress/issue-1261.js:24,12]",
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
should_warn: {
|
should_warn: {
|
||||||
options = {
|
options = {
|
||||||
annotations: true,
|
|
||||||
booleans: true,
|
booleans: true,
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
@@ -158,29 +148,29 @@ should_warn: {
|
|||||||
baz();
|
baz();
|
||||||
}
|
}
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:1,61]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:128,61]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:1,23]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:128,23]",
|
||||||
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:1,23]",
|
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:128,23]",
|
||||||
"WARN: Boolean || always true [test/compress/issue-1261.js:2,23]",
|
"WARN: Boolean || always true [test/compress/issue-1261.js:129,23]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:2,23]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:129,23]",
|
||||||
"WARN: Condition always true [test/compress/issue-1261.js:2,23]",
|
"WARN: Condition always true [test/compress/issue-1261.js:129,23]",
|
||||||
"WARN: Condition left of || always true [test/compress/issue-1261.js:3,8]",
|
"WARN: Condition left of || always true [test/compress/issue-1261.js:130,8]",
|
||||||
"WARN: Condition always true [test/compress/issue-1261.js:3,8]",
|
"WARN: Condition always true [test/compress/issue-1261.js:130,8]",
|
||||||
"WARN: Boolean && always false [test/compress/issue-1261.js:4,23]",
|
"WARN: Boolean && always false [test/compress/issue-1261.js:131,23]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:4,23]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:131,23]",
|
||||||
"WARN: Condition always false [test/compress/issue-1261.js:4,23]",
|
"WARN: Condition always false [test/compress/issue-1261.js:131,23]",
|
||||||
"WARN: Condition left of && always false [test/compress/issue-1261.js:5,8]",
|
"WARN: Condition left of && always false [test/compress/issue-1261.js:132,8]",
|
||||||
"WARN: Condition always false [test/compress/issue-1261.js:5,8]",
|
"WARN: Condition always false [test/compress/issue-1261.js:132,8]",
|
||||||
"WARN: + in boolean context always true [test/compress/issue-1261.js:6,23]",
|
"WARN: + in boolean context always true [test/compress/issue-1261.js:133,23]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:6,23]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:133,23]",
|
||||||
"WARN: Condition always true [test/compress/issue-1261.js:6,23]",
|
"WARN: Condition always true [test/compress/issue-1261.js:133,23]",
|
||||||
"WARN: + in boolean context always true [test/compress/issue-1261.js:7,8]",
|
"WARN: + in boolean context always true [test/compress/issue-1261.js:134,8]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:7,31]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:134,31]",
|
||||||
"WARN: Condition always true [test/compress/issue-1261.js:7,8]",
|
"WARN: Condition always true [test/compress/issue-1261.js:134,8]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:8,23]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:135,23]",
|
||||||
"WARN: Condition always true [test/compress/issue-1261.js:9,8]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:136,24]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:9,24]",
|
"WARN: Condition always true [test/compress/issue-1261.js:136,8]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:10,31]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:137,31]",
|
||||||
"WARN: Condition always false [test/compress/issue-1261.js:10,8]",
|
"WARN: Condition always false [test/compress/issue-1261.js:137,8]",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,16 +1,17 @@
|
|||||||
string_plus_optimization: {
|
string_plus_optimization: {
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
side_effects : true,
|
||||||
comparisons: true,
|
evaluate : true,
|
||||||
conditionals: true,
|
conditionals : true,
|
||||||
dead_code: true,
|
comparisons : true,
|
||||||
evaluate: true,
|
dead_code : true,
|
||||||
hoist_funs: true,
|
booleans : true,
|
||||||
if_return: true,
|
unused : true,
|
||||||
join_vars: true,
|
if_return : true,
|
||||||
side_effects: true,
|
join_vars : true,
|
||||||
unused: true,
|
cascade : true,
|
||||||
}
|
hoist_funs : true,
|
||||||
|
};
|
||||||
input: {
|
input: {
|
||||||
function foo(anything) {
|
function foo(anything) {
|
||||||
function throwing_function() {
|
function throwing_function() {
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
issue_1321_no_debug: {
|
issue_1321_no_debug: {
|
||||||
mangle = {
|
mangle_props = {
|
||||||
properties: {
|
ignore_quoted: true
|
||||||
keep_quoted: true,
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = {};
|
var x = {};
|
||||||
@@ -12,19 +10,17 @@ issue_1321_no_debug: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var x = {};
|
var x = {};
|
||||||
x.x = 1;
|
x.b = 1;
|
||||||
x["a"] = 2 * x.x;
|
x["a"] = 2 * x.b;
|
||||||
console.log(x.x, x["a"]);
|
console.log(x.b, x["a"]);
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_1321_debug: {
|
issue_1321_debug: {
|
||||||
mangle = {
|
mangle_props = {
|
||||||
properties: {
|
ignore_quoted: true,
|
||||||
debug: "",
|
debug: ""
|
||||||
keep_quoted: true,
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = {};
|
var x = {};
|
||||||
@@ -34,18 +30,16 @@ issue_1321_debug: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var x = {};
|
var x = {};
|
||||||
x.x = 1;
|
x.a = 1;
|
||||||
x["_$foo$_"] = 2 * x.x;
|
x["_$foo$_"] = 2 * x.a;
|
||||||
console.log(x.x, x["_$foo$_"]);
|
console.log(x.a, x["_$foo$_"]);
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_1321_with_quoted: {
|
issue_1321_with_quoted: {
|
||||||
mangle = {
|
mangle_props = {
|
||||||
properties: {
|
ignore_quoted: false
|
||||||
keep_quoted: false,
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = {};
|
var x = {};
|
||||||
@@ -55,9 +49,9 @@ issue_1321_with_quoted: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var x = {};
|
var x = {};
|
||||||
x.x = 1;
|
x.a = 1;
|
||||||
x["o"] = 2 * x.x;
|
x["b"] = 2 * x.a;
|
||||||
console.log(x.x, x["o"]);
|
console.log(x.a, x["b"]);
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
tranformation_sort_order_equal: {
|
tranformation_sort_order_equal: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
}
|
};
|
||||||
|
|
||||||
input: { (a = parseInt('100')) == a }
|
input: { (a = parseInt('100')) == a }
|
||||||
expect: { (a = parseInt('100')) == a }
|
expect: { (a = parseInt('100')) == a }
|
||||||
@@ -24,7 +24,7 @@ tranformation_sort_order_equal: {
|
|||||||
tranformation_sort_order_unequal: {
|
tranformation_sort_order_unequal: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
}
|
};
|
||||||
|
|
||||||
input: { (a = parseInt('100')) != a }
|
input: { (a = parseInt('100')) != a }
|
||||||
expect: { (a = parseInt('100')) != a }
|
expect: { (a = parseInt('100')) != a }
|
||||||
@@ -33,7 +33,7 @@ tranformation_sort_order_unequal: {
|
|||||||
tranformation_sort_order_lesser_or_equal: {
|
tranformation_sort_order_lesser_or_equal: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
}
|
};
|
||||||
|
|
||||||
input: { (a = parseInt('100')) <= a }
|
input: { (a = parseInt('100')) <= a }
|
||||||
expect: { (a = parseInt('100')) <= a }
|
expect: { (a = parseInt('100')) <= a }
|
||||||
@@ -41,7 +41,7 @@ tranformation_sort_order_lesser_or_equal: {
|
|||||||
tranformation_sort_order_greater_or_equal: {
|
tranformation_sort_order_greater_or_equal: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
}
|
};
|
||||||
|
|
||||||
input: { (a = parseInt('100')) >= a }
|
input: { (a = parseInt('100')) >= a }
|
||||||
expect: { (a = parseInt('100')) >= a }
|
expect: { (a = parseInt('100')) >= a }
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
level_zero: {
|
level_zero: {
|
||||||
options = {
|
options = {
|
||||||
keep_fnames: true,
|
keep_fnames: true
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
keep_fnames: true
|
keep_fnames: true
|
||||||
@@ -29,7 +29,7 @@ level_zero: {
|
|||||||
|
|
||||||
level_one: {
|
level_one: {
|
||||||
options = {
|
options = {
|
||||||
keep_fnames: true,
|
keep_fnames: true
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
keep_fnames: true
|
keep_fnames: true
|
||||||
@@ -58,7 +58,7 @@ level_one: {
|
|||||||
|
|
||||||
level_two: {
|
level_two: {
|
||||||
options = {
|
options = {
|
||||||
keep_fnames: true,
|
keep_fnames: true
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
keep_fnames: true
|
keep_fnames: true
|
||||||
@@ -97,7 +97,7 @@ level_two: {
|
|||||||
|
|
||||||
level_three: {
|
level_three: {
|
||||||
options = {
|
options = {
|
||||||
keep_fnames: true,
|
keep_fnames: true
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
keep_fnames: true
|
keep_fnames: true
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ unsafe_undefined: {
|
|||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
if_return: true,
|
if_return: true,
|
||||||
unsafe_undefined: true,
|
unsafe: true
|
||||||
}
|
}
|
||||||
mangle = {}
|
mangle = {}
|
||||||
input: {
|
input: {
|
||||||
@@ -30,7 +30,7 @@ keep_fnames: {
|
|||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
if_return: true,
|
if_return: true,
|
||||||
unsafe_undefined: true,
|
unsafe: true
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
keep_fnames: true
|
keep_fnames: true
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
typeof_eq_undefined: {
|
typeof_eq_undefined: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true,
|
comparisons: true
|
||||||
typeofs: true,
|
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var a = typeof b != "undefined";
|
var a = typeof b != "undefined";
|
||||||
@@ -24,8 +23,7 @@ typeof_eq_undefined: {
|
|||||||
typeof_eq_undefined_ie8: {
|
typeof_eq_undefined_ie8: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
ie: true,
|
screw_ie8: false
|
||||||
typeofs: true,
|
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var a = typeof b != "undefined";
|
var a = typeof b != "undefined";
|
||||||
@@ -47,8 +45,7 @@ typeof_eq_undefined_ie8: {
|
|||||||
|
|
||||||
undefined_redefined: {
|
undefined_redefined: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true,
|
comparisons: true
|
||||||
typeofs: true,
|
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(undefined) {
|
function f(undefined) {
|
||||||
@@ -61,8 +58,7 @@ undefined_redefined: {
|
|||||||
|
|
||||||
undefined_redefined_mangle: {
|
undefined_redefined_mangle: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true,
|
comparisons: true
|
||||||
typeofs: true,
|
|
||||||
}
|
}
|
||||||
mangle = {}
|
mangle = {}
|
||||||
input: {
|
input: {
|
||||||
|
|||||||
@@ -22,17 +22,18 @@ else_with_empty_statement: {
|
|||||||
|
|
||||||
conditional_false_stray_else_in_loop: {
|
conditional_false_stray_else_in_loop: {
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
evaluate : true,
|
||||||
comparisons: true,
|
comparisons : true,
|
||||||
conditionals: false,
|
booleans : true,
|
||||||
dead_code: true,
|
unused : true,
|
||||||
evaluate: true,
|
loops : true,
|
||||||
hoist_vars: true,
|
side_effects : true,
|
||||||
if_return: true,
|
dead_code : true,
|
||||||
join_vars: true,
|
hoist_vars : true,
|
||||||
loops: true,
|
join_vars : true,
|
||||||
side_effects: true,
|
if_return : true,
|
||||||
unused: true,
|
cascade : true,
|
||||||
|
conditionals : false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
for (var i = 1; i <= 4; ++i) {
|
for (var i = 1; i <= 4; ++i) {
|
||||||
@@ -40,9 +41,6 @@ conditional_false_stray_else_in_loop: {
|
|||||||
console.log(i);
|
console.log(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect_exact: "for(var i=1;i<=4;++i)if(i<=2);else console.log(i);"
|
expect_exact: "for(var i=1;i<=4;++i)if(!(i<=2))console.log(i);"
|
||||||
expect_stdout: [
|
expect_stdout: true
|
||||||
"3",
|
|
||||||
"4",
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|||||||
291
test/compress/issue-1466.js
Normal file
291
test/compress/issue-1466.js
Normal file
@@ -0,0 +1,291 @@
|
|||||||
|
same_variable_in_multiple_for_loop: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: true,
|
||||||
|
dead_code: true,
|
||||||
|
conditionals: true,
|
||||||
|
comparisons: true,
|
||||||
|
evaluate: true,
|
||||||
|
booleans: true,
|
||||||
|
loops: true,
|
||||||
|
unused: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
cascade: true,
|
||||||
|
side_effects: true,
|
||||||
|
collapse_vars: true,
|
||||||
|
}
|
||||||
|
mangle = {}
|
||||||
|
input: {
|
||||||
|
for (let i = 0; i < 3; i++) {
|
||||||
|
let a = 100;
|
||||||
|
console.log(i, a);
|
||||||
|
for (let i = 0; i < 2; i++) {
|
||||||
|
console.log(i, a);
|
||||||
|
let c = 2;
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
for (let o = 0; o < 3; o++) {
|
||||||
|
let l = 100;
|
||||||
|
console.log(o, l);
|
||||||
|
for (let o = 0; o < 2; o++) {
|
||||||
|
console.log(o, l);
|
||||||
|
let c = 2;
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
same_variable_in_multiple_forOf: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: true,
|
||||||
|
dead_code: true,
|
||||||
|
conditionals: true,
|
||||||
|
comparisons: true,
|
||||||
|
evaluate: true,
|
||||||
|
booleans: true,
|
||||||
|
loops: true,
|
||||||
|
unused: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
cascade: true,
|
||||||
|
side_effects: true,
|
||||||
|
collapse_vars: true,
|
||||||
|
}
|
||||||
|
mangle = {}
|
||||||
|
input: {
|
||||||
|
var test = [ "a", "b", "c" ];
|
||||||
|
for (let tmp of test) {
|
||||||
|
console.log(tmp);
|
||||||
|
let dd;
|
||||||
|
dd = [ "e", "f", "g" ];
|
||||||
|
for (let tmp of dd) {
|
||||||
|
console.log(tmp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var test = [ "a", "b", "c" ];
|
||||||
|
for (let o of test) {
|
||||||
|
console.log(o);
|
||||||
|
let e;
|
||||||
|
e = [ "e", "f", "g" ];
|
||||||
|
for (let o of e)
|
||||||
|
console.log(o);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
same_variable_in_multiple_forIn: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: true,
|
||||||
|
dead_code: true,
|
||||||
|
conditionals: true,
|
||||||
|
comparisons: true,
|
||||||
|
evaluate: true,
|
||||||
|
booleans: true,
|
||||||
|
loops: true,
|
||||||
|
unused: false,
|
||||||
|
keep_fargs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
cascade: true,
|
||||||
|
side_effects: true,
|
||||||
|
collapse_vars: true,
|
||||||
|
}
|
||||||
|
mangle = {}
|
||||||
|
input: {
|
||||||
|
var test = [ "a", "b", "c" ];
|
||||||
|
for (let tmp in test) {
|
||||||
|
console.log(tmp);
|
||||||
|
let dd;
|
||||||
|
dd = [ "e", "f", "g" ];
|
||||||
|
for (let tmp in test) {
|
||||||
|
console.log(tmp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var test = [ "a", "b", "c" ];
|
||||||
|
for (let o in test) {
|
||||||
|
console.log(o);
|
||||||
|
let e;
|
||||||
|
e = [ "e", "f", "g" ];
|
||||||
|
for (let o in test)
|
||||||
|
console.log(o);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
different_variable_in_multiple_for_loop: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: true,
|
||||||
|
dead_code: true,
|
||||||
|
conditionals: true,
|
||||||
|
comparisons: true,
|
||||||
|
evaluate: true,
|
||||||
|
booleans: true,
|
||||||
|
loops: true,
|
||||||
|
unused: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
cascade: true,
|
||||||
|
side_effects: true,
|
||||||
|
collapse_vars: true,
|
||||||
|
}
|
||||||
|
mangle = {}
|
||||||
|
input: {
|
||||||
|
for (let i = 0; i < 3; i++) {
|
||||||
|
let a = 100;
|
||||||
|
console.log(i, a);
|
||||||
|
for (let j = 0; j < 2; j++) {
|
||||||
|
console.log(j, a);
|
||||||
|
let c = 2;
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
for (let o = 0; o < 3; o++) {
|
||||||
|
let l = 100;
|
||||||
|
console.log(o, l);
|
||||||
|
for (let o = 0; o < 2; o++) {
|
||||||
|
console.log(o, l);
|
||||||
|
let c = 2;
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
different_variable_in_multiple_forOf: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: true,
|
||||||
|
dead_code: true,
|
||||||
|
conditionals: true,
|
||||||
|
comparisons: true,
|
||||||
|
evaluate: true,
|
||||||
|
booleans: true,
|
||||||
|
loops: true,
|
||||||
|
unused: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
cascade: true,
|
||||||
|
side_effects: true,
|
||||||
|
collapse_vars: true,
|
||||||
|
}
|
||||||
|
mangle = {}
|
||||||
|
input: {
|
||||||
|
var test = [ "a", "b", "c" ];
|
||||||
|
for (let tmp of test) {
|
||||||
|
console.log(tmp);
|
||||||
|
let dd;
|
||||||
|
dd = [ "e", "f", "g" ];
|
||||||
|
for (let t of dd) {
|
||||||
|
console.log(t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var test = [ "a", "b", "c" ];
|
||||||
|
for (let o of test) {
|
||||||
|
console.log(o);
|
||||||
|
let e;
|
||||||
|
e = [ "e", "f", "g" ];
|
||||||
|
for (let o of e)
|
||||||
|
console.log(o);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
different_variable_in_multiple_forIn: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: true,
|
||||||
|
dead_code: true,
|
||||||
|
conditionals: true,
|
||||||
|
comparisons: true,
|
||||||
|
evaluate: true,
|
||||||
|
booleans: true,
|
||||||
|
loops: true,
|
||||||
|
unused: false,
|
||||||
|
keep_fargs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
cascade: true,
|
||||||
|
side_effects: true,
|
||||||
|
collapse_vars: true,
|
||||||
|
}
|
||||||
|
mangle = {}
|
||||||
|
input: {
|
||||||
|
var test = [ "a", "b", "c" ];
|
||||||
|
for (let tmp in test) {
|
||||||
|
console.log(tmp);
|
||||||
|
let dd;
|
||||||
|
dd = [ "e", "f", "g" ];
|
||||||
|
for (let t in test) {
|
||||||
|
console.log(t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var test = [ "a", "b", "c" ];
|
||||||
|
for (let o in test) {
|
||||||
|
console.log(o);
|
||||||
|
let e;
|
||||||
|
e = [ "e", "f", "g" ];
|
||||||
|
for (let o in test)
|
||||||
|
console.log(o);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
more_variable_in_multiple_for: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: true,
|
||||||
|
dead_code: true,
|
||||||
|
conditionals: true,
|
||||||
|
comparisons: true,
|
||||||
|
evaluate: true,
|
||||||
|
booleans: true,
|
||||||
|
loops: true,
|
||||||
|
unused: false,
|
||||||
|
keep_fargs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
cascade: true,
|
||||||
|
side_effects: true,
|
||||||
|
collapse_vars: true,
|
||||||
|
}
|
||||||
|
mangle = {}
|
||||||
|
input: {
|
||||||
|
for (let a = 9, i = 0; i < 20; i += a) {
|
||||||
|
let b = a++ + i;
|
||||||
|
console.log(a, b, i);
|
||||||
|
for (let k = b, m = b*b, i = 0; i < 10; i++) {
|
||||||
|
console.log(a, b, m, k, i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
for (let o = 9, l = 0; l < 20; l += o) {
|
||||||
|
let c = o++ + l;
|
||||||
|
console.log(o, c, l);
|
||||||
|
for (let l = c, e = c * c, f = 0; f < 10; f++)
|
||||||
|
console.log(o, c, e, l, f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
screw_ie8: {
|
screw_ie8: {
|
||||||
options = {
|
options = {
|
||||||
ie: false,
|
screw_ie8: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie: false,
|
screw_ie8: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
try { throw "foo"; } catch (x) { console.log(x); }
|
try { throw "foo"; } catch (x) { console.log(x); }
|
||||||
@@ -16,10 +16,10 @@ screw_ie8: {
|
|||||||
|
|
||||||
support_ie8: {
|
support_ie8: {
|
||||||
options = {
|
options = {
|
||||||
ie: true,
|
screw_ie8: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie: true,
|
screw_ie8: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
try { throw "foo"; } catch (x) { console.log(x); }
|
try { throw "foo"; } catch (x) { console.log(x); }
|
||||||
@@ -61,7 +61,7 @@ unsafe_undefined: {
|
|||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
if_return: true,
|
if_return: true,
|
||||||
unsafe_undefined: true,
|
unsafe: true,
|
||||||
}
|
}
|
||||||
mangle = {}
|
mangle = {}
|
||||||
input: {
|
input: {
|
||||||
@@ -85,3 +85,15 @@ unsafe_undefined: {
|
|||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
runtime_error: {
|
||||||
|
input: {
|
||||||
|
const a = 1;
|
||||||
|
console.log(a++);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
const a = 1;
|
||||||
|
console.log(a++);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ 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,
|
||||||
}
|
}
|
||||||
@@ -19,7 +18,9 @@ chained_evaluation_1: {
|
|||||||
expect: {
|
expect: {
|
||||||
(function() {
|
(function() {
|
||||||
(function() {
|
(function() {
|
||||||
f(1).bar = 1;
|
var c;
|
||||||
|
c = f(1);
|
||||||
|
c.bar = 1;
|
||||||
})();
|
})();
|
||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
@@ -29,7 +30,6 @@ 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,
|
||||||
}
|
}
|
||||||
@@ -44,37 +44,12 @@ chained_evaluation_2: {
|
|||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
(function() {
|
|
||||||
(function() {
|
|
||||||
var b = "long piece of string";
|
|
||||||
f(b).bar = b;
|
|
||||||
})();
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
chained_evaluation_3: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
evaluate: 10,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function() {
|
(function() {
|
||||||
var a = "long piece of string";
|
var a = "long piece of string";
|
||||||
(function() {
|
(function() {
|
||||||
var b = a, c;
|
var c;
|
||||||
c = f(b);
|
c = f(a);
|
||||||
c.bar = b;
|
c.bar = a;
|
||||||
})();
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(function() {
|
|
||||||
(function() {
|
|
||||||
f("long piece of string").bar = "long piece of string";
|
|
||||||
})();
|
})();
|
||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
|
|
||||||
issue_1639_1: {
|
issue_1639_1: {
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
booleans: true,
|
||||||
collapse_vars: true,
|
cascade: true,
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
join_vars: true,
|
join_vars: true,
|
||||||
@@ -11,6 +12,7 @@ issue_1639_1: {
|
|||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var a = 100, b = 10;
|
var a = 100, b = 10;
|
||||||
|
|
||||||
var L1 = 5;
|
var L1 = 5;
|
||||||
while (--L1 > 0) {
|
while (--L1 > 0) {
|
||||||
if ((--b), false) {
|
if ((--b), false) {
|
||||||
@@ -19,21 +21,21 @@ issue_1639_1: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log(a, b);
|
console.log(a, b);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
for (var a = 100, b = 10, L1 = 5, ignore; --L1 > 0;) {
|
for (var a = 100, b = 10, L1 = 5; --L1 > 0;)
|
||||||
--b;
|
if (--b, !1) var ignore = 0;
|
||||||
}
|
|
||||||
console.log(a, b);
|
console.log(a, b);
|
||||||
}
|
}
|
||||||
expect_stdout: "100 6"
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_1639_2: {
|
issue_1639_2: {
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
booleans: true,
|
||||||
collapse_vars: true,
|
cascade: true,
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
join_vars: true,
|
join_vars: true,
|
||||||
@@ -42,12 +44,14 @@ issue_1639_2: {
|
|||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var a = 100, b = 10;
|
var a = 100, b = 10;
|
||||||
|
|
||||||
function f19() {
|
function f19() {
|
||||||
if (++a, false)
|
if (++a, false)
|
||||||
if (a)
|
if (a)
|
||||||
if (++a);
|
if (++a);
|
||||||
}
|
}
|
||||||
f19();
|
f19();
|
||||||
|
|
||||||
console.log(a, b);
|
console.log(a, b);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
@@ -58,13 +62,13 @@ issue_1639_2: {
|
|||||||
f19(),
|
f19(),
|
||||||
console.log(a, b);
|
console.log(a, b);
|
||||||
}
|
}
|
||||||
expect_stdout: "101 10"
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_1639_3: {
|
issue_1639_3: {
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
booleans: true,
|
||||||
collapse_vars: true,
|
cascade: true,
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
@@ -80,5 +84,5 @@ issue_1639_3: {
|
|||||||
a++,
|
a++,
|
||||||
console.log(a, b);
|
console.log(a, b);
|
||||||
}
|
}
|
||||||
expect_stdout: "101 10"
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
f7: {
|
f7: {
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
booleans: true,
|
||||||
|
cascade: true,
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
@@ -14,7 +15,6 @@ 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,
|
||||||
@@ -35,7 +35,11 @@ f7: {
|
|||||||
console.log(a, b);
|
console.log(a, b);
|
||||||
}
|
}
|
||||||
expect_exact: [
|
expect_exact: [
|
||||||
"console.log(100, 100);",
|
"var a = 100, b = 10;",
|
||||||
|
"",
|
||||||
|
"!function() {",
|
||||||
|
" for (;b = a, !1; ) ;",
|
||||||
|
"}(), console.log(a, b);",
|
||||||
]
|
]
|
||||||
expect_stdout: "100 100"
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
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,
|
||||||
@@ -35,7 +34,6 @@ 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,
|
||||||
@@ -64,7 +62,6 @@ 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,
|
||||||
@@ -101,7 +98,6 @@ 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,
|
||||||
@@ -134,7 +130,6 @@ 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,
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
mangle_catch: {
|
mangle_catch: {
|
||||||
options = {
|
options = {
|
||||||
ie: false,
|
screw_ie8: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie: false,
|
screw_ie8: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -22,11 +22,11 @@ mangle_catch: {
|
|||||||
|
|
||||||
mangle_catch_ie8: {
|
mangle_catch_ie8: {
|
||||||
options = {
|
options = {
|
||||||
ie: true,
|
screw_ie8: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie: true,
|
screw_ie8: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -44,11 +44,11 @@ mangle_catch_ie8: {
|
|||||||
|
|
||||||
mangle_catch_var: {
|
mangle_catch_var: {
|
||||||
options = {
|
options = {
|
||||||
ie: false,
|
screw_ie8: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie: false,
|
screw_ie8: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -66,11 +66,11 @@ mangle_catch_var: {
|
|||||||
|
|
||||||
mangle_catch_var_ie8: {
|
mangle_catch_var_ie8: {
|
||||||
options = {
|
options = {
|
||||||
ie: true,
|
screw_ie8: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie: true,
|
screw_ie8: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -88,11 +88,11 @@ mangle_catch_var_ie8: {
|
|||||||
|
|
||||||
mangle_catch_toplevel: {
|
mangle_catch_toplevel: {
|
||||||
options = {
|
options = {
|
||||||
ie: false,
|
screw_ie8: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie: false,
|
screw_ie8: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -104,17 +104,17 @@ mangle_catch_toplevel: {
|
|||||||
}
|
}
|
||||||
console.log(a);
|
console.log(a);
|
||||||
}
|
}
|
||||||
expect_exact: 'var c="FAIL";try{throw 1}catch(o){c="PASS"}console.log(c);'
|
expect_exact: 'var o="FAIL";try{throw 1}catch(c){o="PASS"}console.log(o);'
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
mangle_catch_ie8_toplevel: {
|
mangle_catch_ie8_toplevel: {
|
||||||
options = {
|
options = {
|
||||||
ie: true,
|
screw_ie8: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie: true,
|
screw_ie8: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -132,11 +132,11 @@ mangle_catch_ie8_toplevel: {
|
|||||||
|
|
||||||
mangle_catch_var_toplevel: {
|
mangle_catch_var_toplevel: {
|
||||||
options = {
|
options = {
|
||||||
ie: false,
|
screw_ie8: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie: false,
|
screw_ie8: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -148,17 +148,17 @@ mangle_catch_var_toplevel: {
|
|||||||
}
|
}
|
||||||
console.log(a);
|
console.log(a);
|
||||||
}
|
}
|
||||||
expect_exact: 'var r="FAIL";try{throw 1}catch(o){var r="PASS"}console.log(r);'
|
expect_exact: 'var o="FAIL";try{throw 1}catch(r){var o="PASS"}console.log(o);'
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
mangle_catch_var_ie8_toplevel: {
|
mangle_catch_var_ie8_toplevel: {
|
||||||
options = {
|
options = {
|
||||||
ie: true,
|
screw_ie8: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie: true,
|
screw_ie8: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -176,11 +176,11 @@ mangle_catch_var_ie8_toplevel: {
|
|||||||
|
|
||||||
mangle_catch_redef_1: {
|
mangle_catch_redef_1: {
|
||||||
options = {
|
options = {
|
||||||
ie: false,
|
screw_ie8: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie: false,
|
screw_ie8: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -198,11 +198,11 @@ mangle_catch_redef_1: {
|
|||||||
|
|
||||||
mangle_catch_redef_1_ie8: {
|
mangle_catch_redef_1_ie8: {
|
||||||
options = {
|
options = {
|
||||||
ie: true,
|
screw_ie8: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie: true,
|
screw_ie8: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -220,11 +220,11 @@ mangle_catch_redef_1_ie8: {
|
|||||||
|
|
||||||
mangle_catch_redef_1_toplevel: {
|
mangle_catch_redef_1_toplevel: {
|
||||||
options = {
|
options = {
|
||||||
ie: false,
|
screw_ie8: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie: false,
|
screw_ie8: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -242,11 +242,11 @@ mangle_catch_redef_1_toplevel: {
|
|||||||
|
|
||||||
mangle_catch_redef_1_ie8_toplevel: {
|
mangle_catch_redef_1_ie8_toplevel: {
|
||||||
options = {
|
options = {
|
||||||
ie: true,
|
screw_ie8: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie: true,
|
screw_ie8: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -264,11 +264,11 @@ mangle_catch_redef_1_ie8_toplevel: {
|
|||||||
|
|
||||||
mangle_catch_redef_2: {
|
mangle_catch_redef_2: {
|
||||||
options = {
|
options = {
|
||||||
ie: false,
|
screw_ie8: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie: false,
|
screw_ie8: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -285,11 +285,11 @@ mangle_catch_redef_2: {
|
|||||||
|
|
||||||
mangle_catch_redef_2_ie8: {
|
mangle_catch_redef_2_ie8: {
|
||||||
options = {
|
options = {
|
||||||
ie: true,
|
screw_ie8: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie: true,
|
screw_ie8: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -306,11 +306,11 @@ mangle_catch_redef_2_ie8: {
|
|||||||
|
|
||||||
mangle_catch_redef_2_toplevel: {
|
mangle_catch_redef_2_toplevel: {
|
||||||
options = {
|
options = {
|
||||||
ie: false,
|
screw_ie8: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie: false,
|
screw_ie8: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -327,11 +327,11 @@ mangle_catch_redef_2_toplevel: {
|
|||||||
|
|
||||||
mangle_catch_redef_2_ie8_toplevel: {
|
mangle_catch_redef_2_ie8_toplevel: {
|
||||||
options = {
|
options = {
|
||||||
ie: true,
|
screw_ie8: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie: true,
|
screw_ie8: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -345,103 +345,3 @@ mangle_catch_redef_2_ie8_toplevel: {
|
|||||||
expect_exact: 'try{throw"FAIL1"}catch(o){var o="FAIL2"}console.log(o);'
|
expect_exact: 'try{throw"FAIL1"}catch(o){var o="FAIL2"}console.log(o);'
|
||||||
expect_stdout: "undefined"
|
expect_stdout: "undefined"
|
||||||
}
|
}
|
||||||
|
|
||||||
mangle_catch_redef_3: {
|
|
||||||
mangle = {
|
|
||||||
ie: false,
|
|
||||||
toplevel: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var o = "PASS";
|
|
||||||
try {
|
|
||||||
throw 0;
|
|
||||||
} catch (o) {
|
|
||||||
// prints "FAIL" if inlined on Node.js v4-
|
|
||||||
(function() {
|
|
||||||
function f() {
|
|
||||||
o = "FAIL";
|
|
||||||
}
|
|
||||||
f(), f();
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
console.log(o);
|
|
||||||
}
|
|
||||||
expect_exact: 'var o="PASS";try{throw 0}catch(o){(function(){function c(){o="FAIL"}c(),c()})()}console.log(o);'
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
mangle_catch_redef_3_toplevel: {
|
|
||||||
mangle = {
|
|
||||||
ie: false,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var o = "PASS";
|
|
||||||
try {
|
|
||||||
throw 0;
|
|
||||||
} catch (o) {
|
|
||||||
// prints "FAIL" if inlined on Node.js v4-
|
|
||||||
(function() {
|
|
||||||
function f() {
|
|
||||||
o = "FAIL";
|
|
||||||
}
|
|
||||||
f(), f();
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
console.log(o);
|
|
||||||
}
|
|
||||||
expect_exact: 'var c="PASS";try{throw 0}catch(c){(function(){function o(){c="FAIL"}o(),o()})()}console.log(c);'
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
mangle_catch_redef_3_ie8: {
|
|
||||||
mangle = {
|
|
||||||
ie: true,
|
|
||||||
toplevel: false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var o = "PASS";
|
|
||||||
try {
|
|
||||||
throw 0;
|
|
||||||
} catch (o) {
|
|
||||||
// prints "FAIL" if inlined on Node.js v4-
|
|
||||||
(function() {
|
|
||||||
function f() {
|
|
||||||
o = "FAIL";
|
|
||||||
}
|
|
||||||
f(), f();
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
console.log(o);
|
|
||||||
}
|
|
||||||
expect_exact: 'var o="PASS";try{throw 0}catch(o){(function(){function c(){o="FAIL"}c(),c()})()}console.log(o);'
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
mangle_catch_redef_3_ie8_toplevel: {
|
|
||||||
mangle = {
|
|
||||||
ie: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var o = "PASS";
|
|
||||||
try {
|
|
||||||
throw 0;
|
|
||||||
} catch (o) {
|
|
||||||
// prints "FAIL" if inlined on Node.js v4-
|
|
||||||
(function() {
|
|
||||||
function f() {
|
|
||||||
o = "FAIL";
|
|
||||||
}
|
|
||||||
f(), f();
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
console.log(o);
|
|
||||||
}
|
|
||||||
expect_exact: 'var c="PASS";try{throw 0}catch(c){(function(){function o(){c="FAIL"}o(),o()})()}console.log(c);'
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,6 +1,27 @@
|
|||||||
function_iife_catch: {
|
function_iife_catch: {
|
||||||
mangle = {
|
mangle = {
|
||||||
ie: false,
|
screw_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(c){var o=1;console.log(c,o)}}()}f();"
|
||||||
|
expect_stdout: "0 1"
|
||||||
|
}
|
||||||
|
|
||||||
|
function_iife_catch_ie8: {
|
||||||
|
mangle = {
|
||||||
|
screw_ie8: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(n) {
|
function f(n) {
|
||||||
@@ -19,58 +40,37 @@ function_iife_catch: {
|
|||||||
expect_stdout: "0 1"
|
expect_stdout: "0 1"
|
||||||
}
|
}
|
||||||
|
|
||||||
function_iife_catch_ie8: {
|
|
||||||
mangle = {
|
|
||||||
ie: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f(n) {
|
|
||||||
!function() {
|
|
||||||
try {
|
|
||||||
throw 0;
|
|
||||||
} catch (n) {
|
|
||||||
var a = 1;
|
|
||||||
console.log(n, a);
|
|
||||||
}
|
|
||||||
}();
|
|
||||||
}
|
|
||||||
f();
|
|
||||||
}
|
|
||||||
expect_exact: "function f(c){!function(){try{throw 0}catch(c){var o=1;console.log(c,o)}}()}f();"
|
|
||||||
expect_stdout: "0 1"
|
|
||||||
}
|
|
||||||
|
|
||||||
function_catch_catch: {
|
function_catch_catch: {
|
||||||
mangle = {
|
mangle = {
|
||||||
ie: false,
|
screw_ie8: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var o = 0;
|
var o = 0;
|
||||||
function f() {
|
function f() {
|
||||||
try {
|
try {
|
||||||
throw 1;
|
throw 1;
|
||||||
} catch (c) {
|
} catch (c) {
|
||||||
try {
|
try {
|
||||||
throw 2;
|
throw 2;
|
||||||
} catch (o) {
|
} catch (o) {
|
||||||
var o = 3;
|
var o = 3;
|
||||||
console.log(o);
|
console.log(o);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
console.log(o);
|
console.log(o);
|
||||||
}
|
}
|
||||||
f();
|
f();
|
||||||
}
|
}
|
||||||
expect_exact: "var o=0;function f(){try{throw 1}catch(o){try{throw 2}catch(c){var c=3;console.log(c)}}console.log(c)}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: [
|
expect_stdout: [
|
||||||
"3",
|
"3",
|
||||||
"undefined",
|
"undefined",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
function_catch_catch_ie8: {
|
function_catch_catch_ie8: {
|
||||||
mangle = {
|
mangle = {
|
||||||
ie: true,
|
screw_ie8: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var o = 0;
|
var o = 0;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -1,245 +0,0 @@
|
|||||||
mangle_props: {
|
|
||||||
mangle = {
|
|
||||||
properties: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var obj = {
|
|
||||||
undefined: 1,
|
|
||||||
NaN: 2,
|
|
||||||
Infinity: 3,
|
|
||||||
"-Infinity": 4,
|
|
||||||
null: 5,
|
|
||||||
};
|
|
||||||
console.log(
|
|
||||||
obj[void 0],
|
|
||||||
obj[undefined],
|
|
||||||
obj["undefined"],
|
|
||||||
obj[0/0],
|
|
||||||
obj[NaN],
|
|
||||||
obj["NaN"],
|
|
||||||
obj[1/0],
|
|
||||||
obj[Infinity],
|
|
||||||
obj["Infinity"],
|
|
||||||
obj[-1/0],
|
|
||||||
obj[-Infinity],
|
|
||||||
obj["-Infinity"],
|
|
||||||
obj[null],
|
|
||||||
obj["null"]
|
|
||||||
);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var obj = {
|
|
||||||
undefined: 1,
|
|
||||||
NaN: 2,
|
|
||||||
Infinity: 3,
|
|
||||||
"-Infinity": 4,
|
|
||||||
null: 5,
|
|
||||||
};
|
|
||||||
console.log(
|
|
||||||
obj[void 0],
|
|
||||||
obj[void 0],
|
|
||||||
obj["undefined"],
|
|
||||||
obj[0/0],
|
|
||||||
obj[NaN],
|
|
||||||
obj["NaN"],
|
|
||||||
obj[1/0],
|
|
||||||
obj[1/0],
|
|
||||||
obj["Infinity"],
|
|
||||||
obj[-1/0],
|
|
||||||
obj[-(1/0)],
|
|
||||||
obj["-Infinity"],
|
|
||||||
obj[null],
|
|
||||||
obj["null"]
|
|
||||||
);
|
|
||||||
}
|
|
||||||
expect_stdout: "1 1 1 2 2 2 3 3 3 4 4 4 5 5"
|
|
||||||
}
|
|
||||||
|
|
||||||
numeric_literal: {
|
|
||||||
mangle = {
|
|
||||||
properties: true,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
beautify: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var obj = {
|
|
||||||
0: 0,
|
|
||||||
"-0": 1,
|
|
||||||
42: 2,
|
|
||||||
"42": 3,
|
|
||||||
0x25: 4,
|
|
||||||
"0x25": 5,
|
|
||||||
1E42: 6,
|
|
||||||
"1E42": 7,
|
|
||||||
"1e+42": 8,
|
|
||||||
};
|
|
||||||
console.log(obj[-0], obj[-""], obj["-0"]);
|
|
||||||
console.log(obj[42], obj["42"]);
|
|
||||||
console.log(obj[0x25], obj["0x25"], obj[37], obj["37"]);
|
|
||||||
console.log(obj[1E42], obj["1E42"], obj["1e+42"]);
|
|
||||||
}
|
|
||||||
expect_exact: [
|
|
||||||
'var obj = {',
|
|
||||||
' 0: 0,',
|
|
||||||
' "-0": 1,',
|
|
||||||
' 42: 2,',
|
|
||||||
' 42: 3,',
|
|
||||||
' 37: 4,',
|
|
||||||
' o: 5,',
|
|
||||||
' 1e42: 6,',
|
|
||||||
' b: 7,',
|
|
||||||
' 1e42: 8',
|
|
||||||
'};',
|
|
||||||
'',
|
|
||||||
'console.log(obj[-0], obj[-""], obj["-0"]);',
|
|
||||||
'',
|
|
||||||
'console.log(obj[42], obj["42"]);',
|
|
||||||
'',
|
|
||||||
'console.log(obj[37], obj["o"], obj[37], obj["37"]);',
|
|
||||||
'',
|
|
||||||
'console.log(obj[1e42], obj["b"], obj["1e+42"]);',
|
|
||||||
]
|
|
||||||
expect_stdout: [
|
|
||||||
"0 0 1",
|
|
||||||
"3 3",
|
|
||||||
"4 5 4 4",
|
|
||||||
"8 7 8",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
identifier: {
|
|
||||||
mangle = {
|
|
||||||
properties: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var obj = {
|
|
||||||
abstract: 1,
|
|
||||||
boolean: 2,
|
|
||||||
byte: 3,
|
|
||||||
char: 4,
|
|
||||||
class: 5,
|
|
||||||
double: 6,
|
|
||||||
enum: 7,
|
|
||||||
export: 8,
|
|
||||||
extends: 9,
|
|
||||||
final: 10,
|
|
||||||
float: 11,
|
|
||||||
goto: 12,
|
|
||||||
implements: 13,
|
|
||||||
import: 14,
|
|
||||||
int: 15,
|
|
||||||
interface: 16,
|
|
||||||
let: 17,
|
|
||||||
long: 18,
|
|
||||||
native: 19,
|
|
||||||
package: 20,
|
|
||||||
private: 21,
|
|
||||||
protected: 22,
|
|
||||||
public: 23,
|
|
||||||
short: 24,
|
|
||||||
static: 25,
|
|
||||||
super: 26,
|
|
||||||
synchronized: 27,
|
|
||||||
this: 28,
|
|
||||||
throws: 29,
|
|
||||||
transient: 30,
|
|
||||||
volatile: 31,
|
|
||||||
yield: 32,
|
|
||||||
false: 33,
|
|
||||||
null: 34,
|
|
||||||
true: 35,
|
|
||||||
break: 36,
|
|
||||||
case: 37,
|
|
||||||
catch: 38,
|
|
||||||
const: 39,
|
|
||||||
continue: 40,
|
|
||||||
debugger: 41,
|
|
||||||
default: 42,
|
|
||||||
delete: 43,
|
|
||||||
do: 44,
|
|
||||||
else: 45,
|
|
||||||
finally: 46,
|
|
||||||
for: 47,
|
|
||||||
function: 48,
|
|
||||||
if: 49,
|
|
||||||
in: 50,
|
|
||||||
instanceof: 51,
|
|
||||||
new: 52,
|
|
||||||
return: 53,
|
|
||||||
switch: 54,
|
|
||||||
throw: 55,
|
|
||||||
try: 56,
|
|
||||||
typeof: 57,
|
|
||||||
var: 58,
|
|
||||||
void: 59,
|
|
||||||
while: 60,
|
|
||||||
with: 61,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var obj = {
|
|
||||||
e: 1,
|
|
||||||
t: 2,
|
|
||||||
n: 3,
|
|
||||||
a: 4,
|
|
||||||
i: 5,
|
|
||||||
o: 6,
|
|
||||||
r: 7,
|
|
||||||
l: 8,
|
|
||||||
s: 9,
|
|
||||||
c: 10,
|
|
||||||
f: 11,
|
|
||||||
u: 12,
|
|
||||||
d: 13,
|
|
||||||
h: 14,
|
|
||||||
p: 15,
|
|
||||||
b: 16,
|
|
||||||
v: 17,
|
|
||||||
w: 18,
|
|
||||||
y: 19,
|
|
||||||
g: 20,
|
|
||||||
m: 21,
|
|
||||||
k: 22,
|
|
||||||
x: 23,
|
|
||||||
j: 24,
|
|
||||||
z: 25,
|
|
||||||
q: 26,
|
|
||||||
A: 27,
|
|
||||||
B: 28,
|
|
||||||
C: 29,
|
|
||||||
D: 30,
|
|
||||||
F: 31,
|
|
||||||
G: 32,
|
|
||||||
false: 33,
|
|
||||||
null: 34,
|
|
||||||
true: 35,
|
|
||||||
H: 36,
|
|
||||||
I: 37,
|
|
||||||
J: 38,
|
|
||||||
K: 39,
|
|
||||||
L: 40,
|
|
||||||
M: 41,
|
|
||||||
N: 42,
|
|
||||||
O: 43,
|
|
||||||
P: 44,
|
|
||||||
Q: 45,
|
|
||||||
R: 46,
|
|
||||||
S: 47,
|
|
||||||
T: 48,
|
|
||||||
U: 49,
|
|
||||||
V: 50,
|
|
||||||
W: 51,
|
|
||||||
X: 52,
|
|
||||||
Y: 53,
|
|
||||||
Z: 54,
|
|
||||||
$: 55,
|
|
||||||
_: 56,
|
|
||||||
ee: 57,
|
|
||||||
te: 58,
|
|
||||||
ne: 59,
|
|
||||||
ae: 60,
|
|
||||||
ie: 61,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
unary_prefix: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
inline: true,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(function() {
|
|
||||||
var x = -(2 / 3);
|
|
||||||
return x;
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
expect_exact: "console.log(-2/3);"
|
|
||||||
expect_stdout: true
|
|
||||||
}
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user