Compare commits
350 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8aa650bcf9 | ||
|
|
d576495e5a | ||
|
|
a06e20304b | ||
|
|
4cccc01f3e | ||
|
|
97bd56b7e8 | ||
|
|
acf951a5bc | ||
|
|
324587f769 | ||
|
|
80efaa2f33 | ||
|
|
a1a212f639 | ||
|
|
a2b1b96752 | ||
|
|
c296a63fb3 | ||
|
|
10dd9d4eaf | ||
|
|
9b8deff64d | ||
|
|
f46209b7e5 | ||
|
|
bddb5a0102 | ||
|
|
3c161a6662 | ||
|
|
c58e174647 | ||
|
|
c53af3dfb1 | ||
|
|
f1f4a4dd82 | ||
|
|
ca49f6f41a | ||
|
|
8a82822654 | ||
|
|
ebe4e1ad28 | ||
|
|
a37ca558dd | ||
|
|
73a564343b | ||
|
|
4870747306 | ||
|
|
b179a2459f | ||
|
|
231c3d7c84 | ||
|
|
aed758ed5c | ||
|
|
0df028187d | ||
|
|
10fbf8e295 | ||
|
|
cf38b52afa | ||
|
|
e755d01a0b | ||
|
|
4084948d3b | ||
|
|
cea1fb5c58 | ||
|
|
1947a21824 | ||
|
|
6335b5fd8a | ||
|
|
daa8319b8a | ||
|
|
d5599604e8 | ||
|
|
072933f1d5 | ||
|
|
39df3a1680 | ||
|
|
03c5ecb2e3 | ||
|
|
40ef074cb3 | ||
|
|
78e3936cd4 | ||
|
|
e7be38b42a | ||
|
|
44394e61c9 | ||
|
|
f9055df44d | ||
|
|
51bdb7281b | ||
|
|
9c01511f84 | ||
|
|
9faee3b66a | ||
|
|
8ea1ced389 | ||
|
|
24619daf68 | ||
|
|
b89cc84c3a | ||
|
|
3016a78d85 | ||
|
|
2508481e33 | ||
|
|
48c46fa9a7 | ||
|
|
7da49b5709 | ||
|
|
d837a46ebd | ||
|
|
d4303b62cc | ||
|
|
7d595e2eac | ||
|
|
9fc0ff5953 | ||
|
|
997d09bb33 | ||
|
|
b244b4ec21 | ||
|
|
b872ffee01 | ||
|
|
9a9543013c | ||
|
|
b98ce6c84f | ||
|
|
7b43b6396f | ||
|
|
67f8fcb103 | ||
|
|
352a944868 | ||
|
|
77c9116c91 | ||
|
|
e821787095 | ||
|
|
aa6e33e208 | ||
|
|
176581d732 | ||
|
|
01aa078e9c | ||
|
|
149d75c092 | ||
|
|
2619bff3cf | ||
|
|
4fb54b066f | ||
|
|
e124ef57e3 | ||
|
|
73e6b2550b | ||
|
|
241113200e | ||
|
|
6f3ab09319 | ||
|
|
3b5d5014e0 | ||
|
|
c36c3cb470 | ||
|
|
24b73a95fa | ||
|
|
862b1b77b5 | ||
|
|
b4944a31a4 | ||
|
|
58362d5ec7 | ||
|
|
01fa430a3e | ||
|
|
f4ee0f651c | ||
|
|
077512d151 | ||
|
|
e4848a7f5a | ||
|
|
f52b0e7c31 | ||
|
|
31e7d25cad | ||
|
|
12babdfe20 | ||
|
|
397e48b97e | ||
|
|
c7520b4b97 | ||
|
|
ad903e9240 | ||
|
|
83c3838b07 | ||
|
|
fa09f87589 | ||
|
|
2db1a141ab | ||
|
|
dd30ed6a9b | ||
|
|
cb50a2d192 | ||
|
|
20be5209c0 | ||
|
|
2a49760032 | ||
|
|
04ed818f0a | ||
|
|
10ca578ee5 | ||
|
|
955411e065 | ||
|
|
adcafce048 | ||
|
|
b1e05fd48a | ||
|
|
23b51287aa | ||
|
|
74dee5c445 | ||
|
|
ee27d87a08 | ||
|
|
62887f2c66 | ||
|
|
68b2dadc58 | ||
|
|
bd73720061 | ||
|
|
ec0440f264 | ||
|
|
81254f67e4 | ||
|
|
c549ee89b9 | ||
|
|
7924a3ae8b | ||
|
|
13ad10a6b5 | ||
|
|
e6ebf827ce | ||
|
|
0a42457df6 | ||
|
|
ba4a771bbc | ||
|
|
ac26993b5a | ||
|
|
ea52339502 | ||
|
|
992952d8f6 | ||
|
|
6d7ab63a66 | ||
|
|
822b1da5d2 | ||
|
|
72805ea73a | ||
|
|
a5e6946f74 | ||
|
|
b8672b55b2 | ||
|
|
a5a958beda | ||
|
|
c885660347 | ||
|
|
d68d155f93 | ||
|
|
e535f19189 | ||
|
|
f9a2a9d78e | ||
|
|
960668ccdb | ||
|
|
55b59407e4 | ||
|
|
b726e364c1 | ||
|
|
bfe3a8b516 | ||
|
|
ae09773ba0 | ||
|
|
8d668c2963 | ||
|
|
5f60c1b830 | ||
|
|
10de27ca3d | ||
|
|
7b4fd858ba | ||
|
|
a7bcd4d613 | ||
|
|
6a2bda52f3 | ||
|
|
fa8aa204a0 | ||
|
|
76b27891c6 | ||
|
|
203ca2586a | ||
|
|
c21f096ab8 | ||
|
|
b7219ac489 | ||
|
|
a6bb66931b | ||
|
|
766742e1d3 | ||
|
|
94e8944f67 | ||
|
|
83197ffdb3 | ||
|
|
952765be66 | ||
|
|
083679bcad | ||
|
|
f5659f292b | ||
|
|
c6e287331d | ||
|
|
a98ec7e4df | ||
|
|
5ec82e5801 | ||
|
|
c76481341c | ||
|
|
5e6307974f | ||
|
|
228cdf8e7e | ||
|
|
14fedbf123 | ||
|
|
fcee32527b | ||
|
|
e13d1e9969 | ||
|
|
aedc1e7fc9 | ||
|
|
353f654038 | ||
|
|
357d861246 | ||
|
|
fd4caf7a9c | ||
|
|
c44b6399c3 | ||
|
|
522cceeccf | ||
|
|
5c84dfa151 | ||
|
|
5359900b78 | ||
|
|
739fa266f8 | ||
|
|
da24dfb59e | ||
|
|
a2f27c7640 | ||
|
|
3c556b8689 | ||
|
|
7110c6923b | ||
|
|
b27b6807cb | ||
|
|
ba6e29d6fd | ||
|
|
d4685640a0 | ||
|
|
ac7b5c07d7 | ||
|
|
0cd4a199b0 | ||
|
|
35435d4bd3 | ||
|
|
d0bb147639 | ||
|
|
4723b4541e | ||
|
|
9d23ba0a22 | ||
|
|
a08d42555a | ||
|
|
fd7ad8e779 | ||
|
|
a36c5472d2 | ||
|
|
8bfd891c09 | ||
|
|
ef9f7ca3e7 | ||
|
|
acc443b2cf | ||
|
|
f87e7be12c | ||
|
|
c0614654d9 | ||
|
|
0358637725 | ||
|
|
63b5b6d2b3 | ||
|
|
e675262d51 | ||
|
|
c1e771a89a | ||
|
|
bc7a88baea | ||
|
|
018e0350f8 | ||
|
|
d37ee4d41c | ||
|
|
7793c6c389 | ||
|
|
90ec468240 | ||
|
|
994293e972 | ||
|
|
b57bae4b9e | ||
|
|
e23a10f7f9 | ||
|
|
884ec4e8a5 | ||
|
|
e616916de5 | ||
|
|
8d21516623 | ||
|
|
74368c3dba | ||
|
|
18dbceb36f | ||
|
|
65d39a3702 | ||
|
|
24917e7084 | ||
|
|
e84957e3da | ||
|
|
c11a748908 | ||
|
|
90017051f2 | ||
|
|
fc816628c1 | ||
|
|
46ad273df4 | ||
|
|
b689028e87 | ||
|
|
1e831df1f6 | ||
|
|
c12486bab4 | ||
|
|
52e94a0723 | ||
|
|
16b97f9558 | ||
|
|
dbfa5d4d14 | ||
|
|
ba54d074d8 | ||
|
|
0818d396c5 | ||
|
|
770f3ba5fe | ||
|
|
553034fe52 | ||
|
|
7fe8c9150a | ||
|
|
6c419bc083 | ||
|
|
25321df959 | ||
|
|
cf1b0165af | ||
|
|
c3d358a5b8 | ||
|
|
68497d0258 | ||
|
|
71c3d04681 | ||
|
|
4c89550c43 | ||
|
|
7ebfb22d16 | ||
|
|
6eceac0966 | ||
|
|
fc5aee662d | ||
|
|
5fbbb43839 | ||
|
|
df2cfcb5fc | ||
|
|
623a0d920f | ||
|
|
e8c04f8cb6 | ||
|
|
110c1ac097 | ||
|
|
15ef272790 | ||
|
|
b3a706114c | ||
|
|
cc2d7acaf0 | ||
|
|
dfb86ccdd1 | ||
|
|
0417a69c3e | ||
|
|
2dbafbb4ee | ||
|
|
311c074622 | ||
|
|
a10c7793bb | ||
|
|
0b7d65d331 | ||
|
|
8b954b022b | ||
|
|
0013cbf91f | ||
|
|
1956edd503 | ||
|
|
560ccc1221 | ||
|
|
10a71c182b | ||
|
|
ddc0ed7072 | ||
|
|
c00efe56f4 | ||
|
|
28bcdbd7df | ||
|
|
6a8aed2049 | ||
|
|
a8785fb694 | ||
|
|
dd6d7b3d88 | ||
|
|
94f3819dc6 | ||
|
|
be1f5199f4 | ||
|
|
95aea0e33c | ||
|
|
a1b2735dd8 | ||
|
|
f345175bc2 | ||
|
|
bb45f48ab7 | ||
|
|
b2f27fd873 | ||
|
|
ced32f9bd8 | ||
|
|
dfc3ec9cef | ||
|
|
1896694532 | ||
|
|
5f269cd573 | ||
|
|
6988cd9558 | ||
|
|
2390fae5c4 | ||
|
|
56fce2131c | ||
|
|
7e575e9d7f | ||
|
|
cb4a02949e | ||
|
|
f85a206b9e | ||
|
|
bba7cd0a70 | ||
|
|
e1b2026929 | ||
|
|
c319030373 | ||
|
|
47b63ed1a0 | ||
|
|
7aefe97083 | ||
|
|
89198e0ad4 | ||
|
|
caea6aac81 | ||
|
|
f5224ca1f5 | ||
|
|
b7c49b72b3 | ||
|
|
8ce3c7d70f | ||
|
|
87cf715213 | ||
|
|
2c9c72e06c | ||
|
|
882968c68c | ||
|
|
acc2d7d845 | ||
|
|
9a5aede941 | ||
|
|
e6dd471f8f | ||
|
|
0f55bd92f1 | ||
|
|
7d9dad0289 | ||
|
|
44e494f16f | ||
|
|
2415a72e75 | ||
|
|
9c0718b162 | ||
|
|
d2c50ace99 | ||
|
|
1b646d3bc4 | ||
|
|
82d2aa4acf | ||
|
|
c1256c399a | ||
|
|
2c637fea8a | ||
|
|
4fa54b075c | ||
|
|
ab82be82b2 | ||
|
|
02fdcfde01 | ||
|
|
a96f087ac3 | ||
|
|
75e9fd8417 | ||
|
|
f68e267830 | ||
|
|
8b10b93ee1 | ||
|
|
549de028b6 | ||
|
|
f579f1aa47 | ||
|
|
fcc40d0502 | ||
|
|
b309527264 | ||
|
|
5d19bb8d5d | ||
|
|
af97629912 | ||
|
|
8c000033d3 | ||
|
|
fd0d28e465 | ||
|
|
2123f38394 | ||
|
|
58dff9ada3 | ||
|
|
4fdec765bc | ||
|
|
1020d37256 | ||
|
|
076739db07 | ||
|
|
515e93d88a | ||
|
|
57105b299e | ||
|
|
77e1bda426 | ||
|
|
a59593cac8 | ||
|
|
046bbde9d4 | ||
|
|
fea9da9866 | ||
|
|
4733159782 | ||
|
|
5fba98608c | ||
|
|
c587d7917d | ||
|
|
336336f53f | ||
|
|
4bde50ce85 | ||
|
|
fbecedf94c | ||
|
|
2f31f95095 | ||
|
|
6b603e1a62 | ||
|
|
499f8d89ff | ||
|
|
9eb65f3af3 | ||
|
|
2cbbf5c375 | ||
|
|
3c384cf9a8 | ||
|
|
37f4f56752 | ||
|
|
1e4985ed9e |
25
.github/ISSUE_TEMPLATE.md
vendored
25
.github/ISSUE_TEMPLATE.md
vendored
@@ -1,25 +0,0 @@
|
||||
**Bug report or feature request?**
|
||||
|
||||
<!-- 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.
|
||||
Post a link to a gist if necessary.
|
||||
|
||||
Issues without a reproducible test case will be closed.
|
||||
-->
|
||||
|
||||
**The `uglifyjs` CLI command executed or `minify()` options used.**
|
||||
|
||||
**JavaScript output or error produced.**
|
||||
|
||||
<!--
|
||||
Note: `uglify-js` only supports JavaScript.
|
||||
Those wishing to minify ES6+ should transpile first.
|
||||
-->
|
||||
51
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
51
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@@ -0,0 +1,51 @@
|
||||
---
|
||||
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
Normal file
58
.github/workflows/build.yml
vendored
Normal file
@@ -0,0 +1,58 @@
|
||||
name: Build testing
|
||||
on:
|
||||
pull_request:
|
||||
push:
|
||||
branches: [ master ]
|
||||
jobs:
|
||||
ufuzz:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
options:
|
||||
- '-mb braces'
|
||||
- '--ie8 -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
|
||||
23
.github/workflows/ci.yml
vendored
23
.github/workflows/ci.yml
vendored
@@ -7,13 +7,13 @@ jobs:
|
||||
test:
|
||||
strategy:
|
||||
matrix:
|
||||
node: [ "0.8", "0.10", "0.12", "4", "6", "8", "10", "12", latest ]
|
||||
node: [ '0.8', '0.10', '0.12', '4', '6', '8', '10', '12', '14', latest ]
|
||||
os: [ ubuntu-latest, windows-latest ]
|
||||
script: [ compress, mocha, release/benchmark, release/jetstream ]
|
||||
exclude:
|
||||
- node: "0.8"
|
||||
- node: '0.8'
|
||||
script: release/benchmark
|
||||
- node: "0.8"
|
||||
- node: '0.8'
|
||||
script: release/jetstream
|
||||
name: ${{ matrix.node }} ${{ matrix.os }} ${{ matrix.script }}
|
||||
runs-on: ${{ matrix.os }}
|
||||
@@ -29,20 +29,5 @@ jobs:
|
||||
- name: Perform tests
|
||||
shell: bash
|
||||
run: |
|
||||
git clone --branch v1.5.4 --depth 1 https://github.com/jasongin/nvs.git ~/.nvs
|
||||
while ! timeout 60 bash -c '. ~/.nvs/nvs.sh add $NODE && nvs use $NODE'; do
|
||||
cd ~/.nvs
|
||||
while !(git clean -xdf); do echo "'git clean' failed - retrying..."; done
|
||||
cd -
|
||||
done
|
||||
. ~/.nvs/nvs.sh --version
|
||||
nvs use $NODE
|
||||
node --version
|
||||
npm config set audit false
|
||||
npm config set optional false
|
||||
npm config set save false
|
||||
npm config set strict-ssl false
|
||||
npm config set update-notifier false
|
||||
npm --version
|
||||
while !(npm install); do echo "'npm install' failed - retrying..."; done
|
||||
. ./test/release/install.sh
|
||||
node test/$TYPE
|
||||
|
||||
35
.github/workflows/ufuzz.yml
vendored
35
.github/workflows/ufuzz.yml
vendored
@@ -2,7 +2,7 @@ name: Fuzzing
|
||||
on:
|
||||
pull_request:
|
||||
schedule:
|
||||
- cron: "*/5 * * * *"
|
||||
- cron: '*/5 * * * *'
|
||||
env:
|
||||
BASE_URL: https://api.github.com/repos/${{ github.repository }}
|
||||
CAUSE: ${{ github.event_name }}
|
||||
@@ -13,30 +13,27 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [ ubuntu-latest, windows-latest ]
|
||||
name: ${{ matrix.os }}
|
||||
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: |
|
||||
git clone --branch v1.5.4 --depth 1 https://github.com/jasongin/nvs.git ~/.nvs
|
||||
while ! timeout 60 bash -c '. ~/.nvs/nvs.sh add 8 && nvs use 8'; do
|
||||
cd ~/.nvs
|
||||
while !(git clean -xdf); do echo "'git clean' failed - retrying..."; done
|
||||
cd -
|
||||
done
|
||||
. ~/.nvs/nvs.sh --version
|
||||
nvs use 8
|
||||
node --version
|
||||
npm config set audit false
|
||||
npm config set optional false
|
||||
npm config set save false
|
||||
npm config set strict-ssl false
|
||||
npm config set update-notifier false
|
||||
npm --version
|
||||
while !(npm install); do echo "'npm install' failed - retrying..."; done
|
||||
. ./test/release/install.sh
|
||||
if [[ $CAUSE == "schedule" ]]; then
|
||||
node test/ufuzz/job $BASE_URL $TOKEN $RUN_NUM
|
||||
else
|
||||
|
||||
402
README.md
402
README.md
@@ -4,10 +4,11 @@ UglifyJS 3
|
||||
UglifyJS is a JavaScript parser, minifier, compressor and beautifier toolkit.
|
||||
|
||||
#### Note:
|
||||
- **`uglify-js@3` has a simplified [API](#api-reference) and [CLI](#command-line-usage) that is not backwards compatible with [`uglify-js@2`](https://github.com/mishoo/UglifyJS/tree/v2.x)**.
|
||||
- **Documentation for UglifyJS `2.x` releases can be found [here](https://github.com/mishoo/UglifyJS/tree/v2.x)**.
|
||||
- `uglify-js` only supports JavaScript (ECMAScript 5).
|
||||
- To minify ECMAScript 2015 or above, transpile using tools like [Babel](https://babeljs.io/).
|
||||
- `uglify-js` supports JavaScript and most language features in ECMAScript.
|
||||
- For more exotic parts of ECMAScript, process your source file with transpilers
|
||||
like [Babel](https://babeljs.io/) before passing onto `uglify-js`.
|
||||
- `uglify-js@3` has a simplified [API](#api-reference) and [CLI](#command-line-usage)
|
||||
that is not backwards compatible with [`uglify-js@2`](https://github.com/mishoo/UglifyJS/tree/v2.x).
|
||||
|
||||
Install
|
||||
-------
|
||||
@@ -84,13 +85,16 @@ a double dash to prevent input files being used as option arguments:
|
||||
1 - single
|
||||
2 - double
|
||||
3 - original
|
||||
`wrap_iife` Wrap IIFEs in parenthesis. Note: you may
|
||||
`wrap_iife` Wrap IIFEs in parentheses. Note: you may
|
||||
want to disable `negate_iife` under
|
||||
compressor options.
|
||||
-O, --output-opts [options] Specify output options (`beautify` disabled by default).
|
||||
-o, --output <file> Output file path (default STDOUT). Specify `ast` or
|
||||
`spidermonkey` to write UglifyJS or SpiderMonkey AST
|
||||
as JSON to STDOUT respectively.
|
||||
--annotations Process and preserve comment annotations.
|
||||
(`/*@__PURE__*/` or `/*#__PURE__*/`)
|
||||
--no-annotations Ignore and discard comment annotations.
|
||||
--comments [filter] Preserve copyright comments in the output. By
|
||||
default this works like Google Closure, keeping
|
||||
JSDoc-style comments that contain "@license" or
|
||||
@@ -133,6 +137,10 @@ a double dash to prevent input files being used as option arguments:
|
||||
`//# sourceMappingURL`.
|
||||
--timings Display operations run time on STDERR.
|
||||
--toplevel Compress and/or mangle variables in top level scope.
|
||||
--v8 Support non-standard Chrome & Node.js
|
||||
Equivalent to setting `v8: true` in `minify()`
|
||||
for `mangle` and `output` options.
|
||||
By default UglifyJS will not try to be v8-proof.
|
||||
--verbose Print diagnostic messages.
|
||||
--warn Print warning messages.
|
||||
--webkit Support non-standard Safari/Webkit.
|
||||
@@ -216,10 +224,10 @@ Example:
|
||||
To enable the mangler you need to pass `--mangle` (`-m`). The following
|
||||
(comma-separated) options are supported:
|
||||
|
||||
- `eval` (default `false`) -- mangle names visible in scopes where `eval` or
|
||||
- `eval` (default: `false`) — mangle names visible in scopes where `eval` or
|
||||
`with` are used.
|
||||
|
||||
- `reserved` (default: `[]`) -- when mangling is enabled but you want to
|
||||
- `reserved` (default: `[]`) — when mangling is enabled but you want to
|
||||
prevent certain names from being mangled, you can declare those names with
|
||||
`--mangle reserved` — pass a comma-separated list of names. For example:
|
||||
|
||||
@@ -486,44 +494,51 @@ if (result.error) throw result.error;
|
||||
|
||||
## Minify options
|
||||
|
||||
- `compress` (default `{}`) — pass `false` to skip compressing entirely.
|
||||
- `annotations` — pass `false` to ignore all comment annotations and elide them
|
||||
from output. Useful when, for instance, external tools incorrectly applied
|
||||
`/*@__PURE__*/` or `/*#__PURE__*/`. Pass `true` to both compress and retain
|
||||
comment annotations in output to allow for further processing downstream.
|
||||
|
||||
- `compress` (default: `{}`) — pass `false` to skip compressing entirely.
|
||||
Pass an object to specify custom [compress options](#compress-options).
|
||||
|
||||
- `ie8` (default `false`) -- set to `true` to support IE8.
|
||||
- `ie8` (default: `false`) — set to `true` to support IE8.
|
||||
|
||||
- `keep_fnames` (default: `false`) -- pass `true` to prevent discarding or mangling
|
||||
- `keep_fnames` (default: `false`) — pass `true` to prevent discarding or mangling
|
||||
of function names. Useful for code relying on `Function.prototype.name`.
|
||||
|
||||
- `mangle` (default `true`) — pass `false` to skip mangling names, or pass
|
||||
- `mangle` (default: `true`) — pass `false` to skip mangling names, or pass
|
||||
an object to specify [mangle options](#mangle-options) (see below).
|
||||
|
||||
- `mangle.properties` (default `false`) — a subcategory of the mangle option.
|
||||
- `mangle.properties` (default: `false`) — a subcategory of the mangle option.
|
||||
Pass an object to specify custom [mangle property options](#mangle-properties-options).
|
||||
|
||||
- `nameCache` (default `null`) -- pass an empty object `{}` or a previously
|
||||
- `nameCache` (default: `null`) — pass an empty object `{}` or a previously
|
||||
used `nameCache` object if you wish to cache mangled variable and
|
||||
property names across multiple invocations of `minify()`. Note: this is
|
||||
a read/write property. `minify()` will read the name cache state of this
|
||||
object and update it during minification so that it may be
|
||||
reused or externally persisted by the user.
|
||||
|
||||
- `output` (default `null`) — pass an object if you wish to specify
|
||||
- `output` (default: `null`) — pass an object if you wish to specify
|
||||
additional [output options](#output-options). The defaults are optimized
|
||||
for best compression.
|
||||
|
||||
- `parse` (default `{}`) — pass an object if you wish to specify some
|
||||
- `parse` (default: `{}`) — pass an object if you wish to specify some
|
||||
additional [parse options](#parse-options).
|
||||
|
||||
- `sourceMap` (default `false`) -- pass an object if you wish to specify
|
||||
- `sourceMap` (default: `false`) — pass an object if you wish to specify
|
||||
[source map options](#source-map-options).
|
||||
|
||||
- `toplevel` (default `false`) -- set to `true` if you wish to enable top level
|
||||
- `toplevel` (default: `false`) — set to `true` if you wish to enable top level
|
||||
variable and function name mangling and to drop unused variables and functions.
|
||||
|
||||
- `warnings` (default `false`) — pass `true` to return compressor warnings
|
||||
- `v8` (default: `false`) — enable workarounds for Chrome & Node.js bugs.
|
||||
|
||||
- `warnings` (default: `false`) — pass `true` to return compressor warnings
|
||||
in `result.warnings`. Use the value `"verbose"` for more detailed warnings.
|
||||
|
||||
- `webkit` (default `false`) -- enable workarounds for Safari/WebKit bugs.
|
||||
- `webkit` (default: `false`) — enable workarounds for Safari/WebKit bugs.
|
||||
PhantomJS users should set this option to `true`.
|
||||
|
||||
## Minify options structure
|
||||
@@ -608,109 +623,121 @@ to be `false` and all symbol names will be omitted.
|
||||
|
||||
## Parse options
|
||||
|
||||
- `bare_returns` (default `false`) -- support top level `return` statements
|
||||
- `bare_returns` (default: `false`) — support top level `return` statements
|
||||
|
||||
- `html5_comments` (default `true`)
|
||||
- `html5_comments` (default: `true`)
|
||||
|
||||
- `shebang` (default `true`) -- support `#!command` as the first line
|
||||
- `shebang` (default: `true`) — support `#!command` as the first line
|
||||
|
||||
## Compress options
|
||||
|
||||
- `arguments` (default: `true`) -- replace `arguments[index]` with function
|
||||
- `annotations` (default: `true`) — Pass `false` to disable potentially dropping
|
||||
functions marked as "pure". A function call is marked as "pure" if a comment
|
||||
annotation `/*@__PURE__*/` or `/*#__PURE__*/` immediately precedes the call. For
|
||||
example: `/*@__PURE__*/foo();`
|
||||
|
||||
- `arguments` (default: `true`) — replace `arguments[index]` with function
|
||||
parameter name whenever possible.
|
||||
|
||||
- `assignments` (default: `true`) -- apply optimizations to assignment expressions.
|
||||
- `arrows` (default: `true`) — apply optimizations to arrow functions
|
||||
|
||||
- `booleans` (default: `true`) -- various optimizations for boolean context,
|
||||
- `assignments` (default: `true`) — apply optimizations to assignment expressions
|
||||
|
||||
- `awaits` (default: `true`) — apply optimizations to `await` expressions
|
||||
|
||||
- `booleans` (default: `true`) — various optimizations for boolean context,
|
||||
for example `!!a ? b : c → a ? b : c`
|
||||
|
||||
- `collapse_vars` (default: `true`) -- Collapse single-use non-constant variables,
|
||||
- `collapse_vars` (default: `true`) — Collapse single-use non-constant variables,
|
||||
side effects permitting.
|
||||
|
||||
- `comparisons` (default: `true`) -- apply certain optimizations to binary nodes,
|
||||
- `comparisons` (default: `true`) — apply certain optimizations to binary nodes,
|
||||
e.g. `!(a <= b) → a > b`, attempts to negate binary nodes, e.g.
|
||||
`a = !b && !c && !d && !e → a=!(b||c||d||e)` etc.
|
||||
|
||||
- `conditionals` (default: `true`) -- apply optimizations for `if`-s and conditional
|
||||
- `conditionals` (default: `true`) — apply optimizations for `if`-s and conditional
|
||||
expressions
|
||||
|
||||
- `dead_code` (default: `true`) -- remove unreachable code
|
||||
- `dead_code` (default: `true`) — remove unreachable code
|
||||
|
||||
- `directives` (default: `true`) -- remove redundant or non-standard directives
|
||||
- `default_values` (default: `true`) — drop overshadowed default values
|
||||
|
||||
- `drop_console` (default: `false`) -- Pass `true` to discard calls to
|
||||
- `directives` (default: `true`) — remove redundant or non-standard directives
|
||||
|
||||
- `drop_console` (default: `false`) — Pass `true` to discard calls to
|
||||
`console.*` functions. If you wish to drop a specific function call
|
||||
such as `console.info` and/or retain side effects from function arguments
|
||||
after dropping the function call then use `pure_funcs` instead.
|
||||
|
||||
- `drop_debugger` (default: `true`) -- remove `debugger;` statements
|
||||
- `drop_debugger` (default: `true`) — remove `debugger;` statements
|
||||
|
||||
- `evaluate` (default: `true`) -- Evaluate expression for shorter constant
|
||||
- `evaluate` (default: `true`) — Evaluate expression for shorter constant
|
||||
representation. Pass `"eager"` to always replace function calls whenever
|
||||
possible, or a positive integer to specify an upper bound for each individual
|
||||
evaluation in number of characters.
|
||||
|
||||
- `expression` (default: `false`) -- Pass `true` to preserve completion values
|
||||
- `expression` (default: `false`) — Pass `true` to preserve completion values
|
||||
from terminal statements without `return`, e.g. in bookmarklets.
|
||||
|
||||
- `functions` (default: `true`) -- convert declarations from `var`to `function`
|
||||
- `functions` (default: `true`) — convert declarations from `var` to `function`
|
||||
whenever possible.
|
||||
|
||||
- `global_defs` (default: `{}`) -- see [conditional compilation](#conditional-compilation)
|
||||
- `global_defs` (default: `{}`) — see [conditional compilation](#conditional-compilation)
|
||||
|
||||
- `hoist_funs` (default: `false`) -- hoist function declarations
|
||||
- `hoist_exports` (default: `true`) — hoist `export` statements to facilitate
|
||||
various `compress` and `mangle` optimizations.
|
||||
|
||||
- `hoist_props` (default: `true`) -- hoist properties from constant object and
|
||||
- `hoist_funs` (default: `false`) — hoist function declarations
|
||||
|
||||
- `hoist_props` (default: `true`) — hoist properties from constant object and
|
||||
array literals into regular variables subject to a set of constraints. For example:
|
||||
`var o={p:1, q:2}; f(o.p, o.q);` is converted to `f(1, 2);`. Note: `hoist_props`
|
||||
works best with `toplevel` and `mangle` enabled, alongside with `compress` option
|
||||
`passes` set to `2` or higher.
|
||||
|
||||
- `hoist_vars` (default: `false`) -- hoist `var` declarations (this is `false`
|
||||
- `hoist_vars` (default: `false`) — hoist `var` declarations (this is `false`
|
||||
by default because it seems to increase the size of the output in general)
|
||||
|
||||
- `if_return` (default: `true`) -- optimizations for if/return and if/continue
|
||||
- `if_return` (default: `true`) — optimizations for if/return and if/continue
|
||||
|
||||
- `inline` (default: `true`) -- inline calls to function with simple/`return` statement:
|
||||
- `false` -- same as `0`
|
||||
- `0` -- disabled inlining
|
||||
- `1` -- inline simple functions
|
||||
- `2` -- inline functions with arguments
|
||||
- `3` -- inline functions with arguments and variables
|
||||
- `true` -- same as `3`
|
||||
- `imports` (default: `true`) — drop unreferenced import symbols when used with `unused`
|
||||
|
||||
- `join_vars` (default: `true`) -- join consecutive `var` statements
|
||||
- `inline` (default: `true`) — inline calls to function with simple/`return` statement:
|
||||
- `false` — same as `0`
|
||||
- `0` — disabled inlining
|
||||
- `1` — inline simple functions
|
||||
- `2` — inline functions with arguments
|
||||
- `3` — inline functions with arguments and variables
|
||||
- `true` — same as `3`
|
||||
|
||||
- `keep_fargs` (default: `strict`) -- Discard unused function arguments. Code
|
||||
which relies on `Function.length` will break if this is done indiscriminately,
|
||||
i.e. when passing `true`. Pass `false` to always retain function arguments.
|
||||
- `join_vars` (default: `true`) — join consecutive `var` statements
|
||||
|
||||
- `keep_fnames` (default: `false`) -- Pass `true` to prevent the
|
||||
compressor from discarding function names. Useful for code relying on
|
||||
`Function.prototype.name`. See also: the `keep_fnames` [mangle option](#mangle-options).
|
||||
- `keep_fargs` (default: `false`) — discard unused function arguments except
|
||||
when unsafe to do so, e.g. code which relies on `Function.prototype.length`.
|
||||
Pass `true` to always retain function arguments.
|
||||
|
||||
- `keep_infinity` (default: `false`) -- Pass `true` to prevent `Infinity` from
|
||||
- `keep_infinity` (default: `false`) — Pass `true` to prevent `Infinity` from
|
||||
being compressed into `1/0`, which may cause performance issues on Chrome.
|
||||
|
||||
- `loops` (default: `true`) -- optimizations for `do`, `while` and `for` loops
|
||||
- `loops` (default: `true`) — optimizations for `do`, `while` and `for` loops
|
||||
when we can statically determine the condition.
|
||||
|
||||
- `merge_vars` (default: `true`) -- combine and reuse variables.
|
||||
- `merge_vars` (default: `true`) — combine and reuse variables.
|
||||
|
||||
- `negate_iife` (default: `true`) -- negate "Immediately-Called Function Expressions"
|
||||
- `negate_iife` (default: `true`) — negate "Immediately-Called Function Expressions"
|
||||
where the return value is discarded, to avoid the parens that the
|
||||
code generator would insert.
|
||||
|
||||
- `objects` (default: `true`) -- compact duplicate keys in object literals.
|
||||
- `objects` (default: `true`) — compact duplicate keys in object literals.
|
||||
|
||||
- `passes` (default: `1`) -- The maximum number of times to run compress.
|
||||
- `passes` (default: `1`) — The maximum number of times to run compress.
|
||||
In some cases more than one pass leads to further compressed code. Keep in
|
||||
mind more passes will take more time.
|
||||
|
||||
- `properties` (default: `true`) -- rewrite property access using the dot notation, for
|
||||
- `properties` (default: `true`) — rewrite property access using the dot notation, for
|
||||
example `foo["bar"] → foo.bar`
|
||||
|
||||
- `pure_funcs` (default: `null`) -- You can pass an array of names and
|
||||
- `pure_funcs` (default: `null`) — You can pass an array of names and
|
||||
UglifyJS will assume that those functions do not produce side
|
||||
effects. DANGER: will not check if the name is redefined in scope.
|
||||
An example case here, for instance `var q = Math.floor(a/b)`. If
|
||||
@@ -722,22 +749,24 @@ to be `false` and all symbol names will be omitted.
|
||||
overhead (compression will be slower). Make sure symbols under `pure_funcs`
|
||||
are also under `mangle.reserved` to avoid mangling.
|
||||
|
||||
- `pure_getters` (default: `"strict"`) -- If you pass `true` for
|
||||
- `pure_getters` (default: `"strict"`) — If you pass `true` for
|
||||
this, UglifyJS will assume that object property access
|
||||
(e.g. `foo.bar` or `foo["bar"]`) doesn't have any side effects.
|
||||
Specify `"strict"` to treat `foo.bar` as side-effect-free only when
|
||||
`foo` is certain to not throw, i.e. not `null` or `undefined`.
|
||||
|
||||
- `reduce_funcs` (default: `true`) -- Allows single-use functions to be
|
||||
- `reduce_funcs` (default: `true`) — Allows single-use functions to be
|
||||
inlined as function expressions when permissible allowing further
|
||||
optimization. Enabled by default. Option depends on `reduce_vars`
|
||||
being enabled. Some code runs faster in the Chrome V8 engine if this
|
||||
option is disabled. Does not negatively impact other major browsers.
|
||||
|
||||
- `reduce_vars` (default: `true`) -- Improve optimization on variables assigned with and
|
||||
- `reduce_vars` (default: `true`) — Improve optimization on variables assigned with and
|
||||
used as constant values.
|
||||
|
||||
- `sequences` (default: `true`) -- join consecutive simple statements using the
|
||||
- `rests` (default: `true`) — apply optimizations to rest parameters
|
||||
|
||||
- `sequences` (default: `true`) — join consecutive simple statements using the
|
||||
comma operator. May be set to a positive integer to specify the maximum number
|
||||
of consecutive comma sequences that will be generated. If this option is set to
|
||||
`true` then the default `sequences` limit is `200`. Set option to `false` or `0`
|
||||
@@ -746,67 +775,68 @@ to be `false` and all symbol names will be omitted.
|
||||
occasions the default sequences limit leads to very slow compress times in which
|
||||
case a value of `20` or less is recommended.
|
||||
|
||||
- `side_effects` (default: `true`) -- Pass `false` to disable potentially dropping
|
||||
functions marked as "pure". A function call is marked as "pure" if a comment
|
||||
annotation `/*@__PURE__*/` or `/*#__PURE__*/` immediately precedes the call. For
|
||||
example: `/*@__PURE__*/foo();`
|
||||
- `side_effects` (default: `true`) — drop extraneous code which does not affect
|
||||
outcome of runtime execution.
|
||||
|
||||
- `strings` (default: `true`) -- compact string concatenations.
|
||||
- `spreads` (default: `true`) — flatten spread expressions.
|
||||
|
||||
- `switches` (default: `true`) -- de-duplicate and remove unreachable `switch` branches
|
||||
- `strings` (default: `true`) — compact string concatenations.
|
||||
|
||||
- `toplevel` (default: `false`) -- drop unreferenced functions (`"funcs"`) and/or
|
||||
variables (`"vars"`) in the top level scope (`false` by default, `true` to drop
|
||||
both unreferenced functions and variables)
|
||||
- `switches` (default: `true`) — de-duplicate and remove unreachable `switch` branches
|
||||
|
||||
- `top_retain` (default: `null`) -- prevent specific toplevel functions and
|
||||
- `templates` (default: `true`) — compact template literals by embedding expressions
|
||||
and/or converting to string literals, e.g. `` `foo ${42}` → "foo 42"``
|
||||
|
||||
- `top_retain` (default: `null`) — prevent specific toplevel functions and
|
||||
variables from `unused` removal (can be array, comma-separated, RegExp or
|
||||
function. Implies `toplevel`)
|
||||
|
||||
- `typeofs` (default: `true`) -- Transforms `typeof foo == "undefined"` into
|
||||
- `toplevel` (default: `false`) — drop unreferenced functions (`"funcs"`) and/or
|
||||
variables (`"vars"`) in the top level scope (`false` by default, `true` to drop
|
||||
both unreferenced functions and variables)
|
||||
|
||||
- `typeofs` (default: `true`) — Transforms `typeof foo == "undefined"` into
|
||||
`foo === void 0`. Note: recommend to set this value to `false` for IE10 and
|
||||
earlier versions due to known issues.
|
||||
|
||||
- `unsafe` (default: `false`) -- apply "unsafe" transformations (discussion below)
|
||||
- `unsafe` (default: `false`) — apply "unsafe" transformations (discussion below)
|
||||
|
||||
- `unsafe_comps` (default: `false`) -- compress expressions like `a <= b` assuming
|
||||
- `unsafe_comps` (default: `false`) — compress expressions like `a <= b` assuming
|
||||
none of the operands can be (coerced to) `NaN`.
|
||||
|
||||
- `unsafe_Function` (default: `false`) -- compress and mangle `Function(args, code)`
|
||||
- `unsafe_Function` (default: `false`) — compress and mangle `Function(args, code)`
|
||||
when both `args` and `code` are string literals.
|
||||
|
||||
- `unsafe_math` (default: `false`) -- optimize numerical expressions like
|
||||
- `unsafe_math` (default: `false`) — optimize numerical expressions like
|
||||
`2 * x * 3` into `6 * x`, which may give imprecise floating point results.
|
||||
|
||||
- `unsafe_proto` (default: `false`) -- optimize expressions like
|
||||
- `unsafe_proto` (default: `false`) — optimize expressions like
|
||||
`Array.prototype.slice.call(a)` into `[].slice.call(a)`
|
||||
|
||||
- `unsafe_regexp` (default: `false`) -- enable substitutions of variables with
|
||||
- `unsafe_regexp` (default: `false`) — enable substitutions of variables with
|
||||
`RegExp` values the same way as if they are constants.
|
||||
|
||||
- `unsafe_undefined` (default: `false`) -- substitute `void 0` if there is a
|
||||
- `unsafe_undefined` (default: `false`) — substitute `void 0` if there is a
|
||||
variable named `undefined` in scope (variable name will be mangled, typically
|
||||
reduced to a single character)
|
||||
|
||||
- `unused` (default: `true`) -- drop unreferenced functions and variables (simple
|
||||
- `unused` (default: `true`) — drop unreferenced functions and variables (simple
|
||||
direct variable assignments do not count as references unless set to `"keep_assign"`)
|
||||
|
||||
- `varify` (default: `true`) -- convert block-scoped declaractions into `var`
|
||||
- `varify` (default: `true`) — convert block-scoped declaractions into `var`
|
||||
whenever safe to do so
|
||||
|
||||
- `yields` (default: `true`) — apply optimizations to `yield` expressions
|
||||
|
||||
## Mangle options
|
||||
|
||||
- `eval` (default `false`) -- Pass `true` to mangle names visible in scopes
|
||||
- `eval` (default: `false`) — Pass `true` to mangle names visible in scopes
|
||||
where `eval` or `with` are used.
|
||||
|
||||
- `keep_fnames` (default `false`) -- Pass `true` to not mangle function names.
|
||||
Useful for code relying on `Function.prototype.name`. See also: the `keep_fnames`
|
||||
[compress option](#compress-options).
|
||||
|
||||
- `reserved` (default `[]`) -- Pass an array of identifiers that should be
|
||||
- `reserved` (default: `[]`) — Pass an array of identifiers that should be
|
||||
excluded from mangling. Example: `["foo", "bar"]`.
|
||||
|
||||
- `toplevel` (default `false`) -- Pass `true` to mangle names declared in the
|
||||
- `toplevel` (default: `false`) — Pass `true` to mangle names declared in the
|
||||
top level scope.
|
||||
|
||||
Examples:
|
||||
@@ -833,18 +863,18 @@ UglifyJS.minify(code, { mangle: { toplevel: true } }).code;
|
||||
|
||||
### Mangle properties options
|
||||
|
||||
- `builtins` (default: `false`) -- Use `true` to allow the mangling of builtin
|
||||
- `builtins` (default: `false`) — Use `true` to allow the mangling of builtin
|
||||
DOM properties. Not recommended to override this setting.
|
||||
|
||||
- `debug` (default: `false`) -— Mangle names with the original name still present.
|
||||
- `debug` (default: `false`) — Mangle names with the original name still present.
|
||||
Pass an empty string `""` to enable, or a non-empty string to set the debug suffix.
|
||||
|
||||
- `keep_quoted` (default: `false`) -— Only mangle unquoted property names.
|
||||
- `keep_quoted` (default: `false`) — Only mangle unquoted property names.
|
||||
|
||||
- `regex` (default: `null`) -— Pass a RegExp literal to only mangle property
|
||||
- `regex` (default: `null`) — Pass a RegExp literal to only mangle property
|
||||
names matching the regular expression.
|
||||
|
||||
- `reserved` (default: `[]`) -- Do not mangle property names listed in the
|
||||
- `reserved` (default: `[]`) — Do not mangle property names listed in the
|
||||
`reserved` array.
|
||||
|
||||
## Output options
|
||||
@@ -853,77 +883,79 @@ The code generator tries to output shortest code possible by default. In
|
||||
case you want beautified output, pass `--beautify` (`-b`). Optionally you
|
||||
can pass additional arguments that control the code output:
|
||||
|
||||
- `ascii_only` (default `false`) -- escape Unicode characters in strings and
|
||||
- `annotations` (default: `false`) — pass `true` to retain comment annotations
|
||||
`/*@__PURE__*/` or `/*#__PURE__*/`, otherwise they will be discarded even if
|
||||
`comments` is set.
|
||||
|
||||
- `ascii_only` (default: `false`) — escape Unicode characters in strings and
|
||||
regexps (affects directives with non-ascii characters becoming invalid)
|
||||
|
||||
- `beautify` (default `true`) -- whether to actually beautify the output.
|
||||
- `beautify` (default: `true`) — whether to actually beautify the output.
|
||||
Passing `-b` will set this to true, but you might need to pass `-b` even
|
||||
when you want to generate minified code, in order to specify additional
|
||||
arguments, so you can use `-b beautify=false` to override it.
|
||||
|
||||
- `braces` (default `false`) -- always insert braces in `if`, `for`,
|
||||
- `braces` (default: `false`) — always insert braces in `if`, `for`,
|
||||
`do`, `while` or `with` statements, even if their body is a single
|
||||
statement.
|
||||
|
||||
- `comments` (default `false`) -- pass `true` or `"all"` to preserve all
|
||||
- `comments` (default: `false`) — pass `true` or `"all"` to preserve all
|
||||
comments, `"some"` to preserve multi-line comments that contain `@cc_on`,
|
||||
`@license`, or `@preserve` (case-insensitive), a regular expression string
|
||||
(e.g. `/^!/`), or a function which returns `boolean`, e.g.
|
||||
```js
|
||||
```javascript
|
||||
function(node, comment) {
|
||||
return comment.value.indexOf("@type " + node.TYPE) >= 0;
|
||||
}
|
||||
```
|
||||
|
||||
- `galio` (default `false`) -- enable workarounds for ANT Galio bugs
|
||||
- `galio` (default: `false`) — enable workarounds for ANT Galio bugs
|
||||
|
||||
- `indent_level` (default `4`)
|
||||
- `indent_level` (default: `4`)
|
||||
|
||||
- `indent_start` (default `0`) -- prefix all lines by that many spaces
|
||||
- `indent_start` (default: `0`) — prefix all lines by that many spaces
|
||||
|
||||
- `inline_script` (default `true`) -- escape HTML comments and the slash in
|
||||
- `inline_script` (default: `true`) — escape HTML comments and the slash in
|
||||
occurrences of `</script>` in strings
|
||||
|
||||
- `keep_quoted_props` (default `false`) -- when turned on, prevents stripping
|
||||
- `keep_quoted_props` (default: `false`) — when turned on, prevents stripping
|
||||
quotes from property names in object literals.
|
||||
|
||||
- `max_line_len` (default `false`) -- maximum line length (for uglified code)
|
||||
- `max_line_len` (default: `false`) — maximum line length (for uglified code)
|
||||
|
||||
- `preamble` (default `null`) -- when passed it must be a string and
|
||||
- `preamble` (default: `null`) — when passed it must be a string and
|
||||
it will be prepended to the output literally. The source map will
|
||||
adjust for this text. Can be used to insert a comment containing
|
||||
licensing information, for example.
|
||||
|
||||
- `preserve_line` (default `false`) -- pass `true` to retain line numbering on
|
||||
- `preserve_line` (default: `false`) — pass `true` to retain line numbering on
|
||||
a best effort basis.
|
||||
|
||||
- `quote_keys` (default `false`) -- pass `true` to quote all keys in literal
|
||||
- `quote_keys` (default: `false`) — pass `true` to quote all keys in literal
|
||||
objects
|
||||
|
||||
- `quote_style` (default `0`) -- preferred quote style for strings (affects
|
||||
- `quote_style` (default: `0`) — preferred quote style for strings (affects
|
||||
quoted property names and directives as well):
|
||||
- `0` -- prefers double quotes, switches to single quotes when there are
|
||||
- `0` — prefers double quotes, switches to single quotes when there are
|
||||
more double quotes in the string itself. `0` is best for gzip size.
|
||||
- `1` -- always use single quotes
|
||||
- `2` -- always use double quotes
|
||||
- `3` -- always use the original quotes
|
||||
- `1` — always use single quotes
|
||||
- `2` — always use double quotes
|
||||
- `3` — always use the original quotes
|
||||
|
||||
- `semicolons` (default `true`) -- separate statements with semicolons. If
|
||||
- `semicolons` (default: `true`) — separate statements with semicolons. If
|
||||
you pass `false` then whenever possible we will use a newline instead of a
|
||||
semicolon, leading to more readable output of uglified code (size before
|
||||
gzip could be smaller; size after gzip insignificantly larger).
|
||||
|
||||
- `shebang` (default `true`) -- preserve shebang `#!` in preamble (bash scripts)
|
||||
- `shebang` (default: `true`) — preserve shebang `#!` in preamble (bash scripts)
|
||||
|
||||
- `v8` (default `false`) -- enable workarounds for Chrome & Node.js bugs
|
||||
|
||||
- `width` (default `80`) -- only takes effect when beautification is on, this
|
||||
- `width` (default: `80`) — only takes effect when beautification is on, this
|
||||
specifies an (orientative) line width that the beautifier will try to
|
||||
obey. It refers to the width of the line text (excluding indentation).
|
||||
It doesn't work very well currently, but it does make the code generated
|
||||
by UglifyJS more readable.
|
||||
|
||||
- `wrap_iife` (default `false`) -- pass `true` to wrap immediately invoked
|
||||
- `wrap_iife` (default: `false`) — pass `true` to wrap immediately invoked
|
||||
function expressions. See
|
||||
[#640](https://github.com/mishoo/UglifyJS/issues/640) for more details.
|
||||
|
||||
@@ -1124,25 +1156,21 @@ in total it's a bit more than just using UglifyJS's own parser.
|
||||
It's not well known, but whitespace removal and symbol mangling accounts
|
||||
for 95% of the size reduction in minified code for most JavaScript - not
|
||||
elaborate code transforms. One can simply disable `compress` to speed up
|
||||
Uglify builds by 3 to 4 times. In this fast `mangle`-only mode Uglify has
|
||||
comparable minify speeds and gzip sizes to
|
||||
[`butternut`](https://www.npmjs.com/package/butternut):
|
||||
Uglify builds by 3 to 5 times.
|
||||
|
||||
| d3.js | minify size | gzip size | minify time (seconds) |
|
||||
| --- | ---: | ---: | ---: |
|
||||
| original | 451,131 | 108,733 | - |
|
||||
| uglify-js@3.0.24 mangle=false, compress=false | 316,600 | 85,245 | 0.70 |
|
||||
| uglify-js@3.0.24 mangle=true, compress=false | 220,216 | 72,730 | 1.13 |
|
||||
| butternut@0.4.6 | 217,568 | 72,738 | 1.41 |
|
||||
| uglify-js@3.0.24 mangle=true, compress=true | 212,511 | 71,560 | 3.36 |
|
||||
| babili@0.1.4 | 210,713 | 72,140 | 12.64 |
|
||||
| original | 511,371 | 119,932 | - |
|
||||
| uglify-js@3.13.0 mangle=false, compress=false | 363,988 | 95,695 | 0.56 |
|
||||
| uglify-js@3.13.0 mangle=true, compress=false | 253,305 | 81,281 | 0.99 |
|
||||
| uglify-js@3.13.0 mangle=true, compress=true | 244,436 | 79,854 | 5.30 |
|
||||
|
||||
To enable fast minify mode from the CLI use:
|
||||
```
|
||||
uglifyjs file.js -m
|
||||
```
|
||||
To enable fast minify mode with the API use:
|
||||
```js
|
||||
```javascript
|
||||
UglifyJS.minify(code, { compress: false, mangle: true });
|
||||
```
|
||||
|
||||
@@ -1173,9 +1201,21 @@ To allow for better optimizations, the compiler makes various assumptions:
|
||||
- Object properties can be added, removed and modified (not prevented with
|
||||
`Object.defineProperty()`, `Object.defineProperties()`, `Object.freeze()`,
|
||||
`Object.preventExtensions()` or `Object.seal()`).
|
||||
- Earlier versions of JavaScript will throw `SyntaxError` with the following:
|
||||
```javascript
|
||||
({
|
||||
p: 42,
|
||||
get p() {},
|
||||
});
|
||||
// SyntaxError: Object literal may not have data and accessor property with
|
||||
// the same name
|
||||
```
|
||||
UglifyJS may modify the input which in turn may suppress those errors.
|
||||
- Iteration order of keys over an object which contains spread syntax in later
|
||||
versions of Chrome and Node.js may be altered.
|
||||
- When `toplevel` is enabled, UglifyJS effectively assumes input code is wrapped
|
||||
within `function(){ ... }`, thus forbids aliasing of declared global variables:
|
||||
```js
|
||||
```javascript
|
||||
A = "FAIL";
|
||||
var B = "FAIL";
|
||||
// can be `global`, `self`, `window` etc.
|
||||
@@ -1193,3 +1233,97 @@ To allow for better optimizations, the compiler makes various assumptions:
|
||||
`function({}, arguments) {}` will result in `SyntaxError` in earlier versions
|
||||
of Chrome and Node.js - UglifyJS may modify the input which in turn may
|
||||
suppress those errors.
|
||||
- Earlier versions of Chrome and Node.js will throw `ReferenceError` with the
|
||||
following:
|
||||
```javascript
|
||||
var a;
|
||||
try {
|
||||
throw 42;
|
||||
} catch ({
|
||||
[a]: b,
|
||||
// ReferenceError: a is not defined
|
||||
}) {
|
||||
let a;
|
||||
}
|
||||
```
|
||||
UglifyJS may modify the input which in turn may suppress those errors.
|
||||
- Later versions of JavaScript will throw `SyntaxError` with the following:
|
||||
```javascript
|
||||
a => {
|
||||
let a;
|
||||
};
|
||||
// SyntaxError: Identifier 'a' has already been declared
|
||||
```
|
||||
UglifyJS may modify the input which in turn may suppress those errors.
|
||||
- Later versions of JavaScript will throw `SyntaxError` with the following:
|
||||
```javascript
|
||||
try {
|
||||
// ...
|
||||
} catch ({ message: a }) {
|
||||
var a;
|
||||
}
|
||||
// SyntaxError: Identifier 'a' has already been declared
|
||||
```
|
||||
UglifyJS may modify the input which in turn may suppress those errors.
|
||||
- Some versions of Chrome and Node.js will throw `ReferenceError` with the
|
||||
following:
|
||||
```javascript
|
||||
console.log(((a, b = function() {
|
||||
return a;
|
||||
// ReferenceError: a is not defined
|
||||
}()) => b)());
|
||||
```
|
||||
UglifyJS may modify the input which in turn may suppress those errors.
|
||||
- Some arithmetic operations with `BigInt` may throw `TypeError`:
|
||||
```javascript
|
||||
1n + 1;
|
||||
// TypeError: can't convert BigInt to number
|
||||
```
|
||||
UglifyJS may modify the input which in turn may suppress those errors.
|
||||
- Some versions of JavaScript will throw `SyntaxError` with the
|
||||
following:
|
||||
```javascript
|
||||
console.log(String.raw`\uFo`);
|
||||
// SyntaxError: Invalid Unicode escape sequence
|
||||
```
|
||||
UglifyJS may modify the input which in turn may suppress those errors.
|
||||
- Some versions of JavaScript will throw `SyntaxError` with the
|
||||
following:
|
||||
```javascript
|
||||
try {} catch (e) {
|
||||
for (var e of []);
|
||||
}
|
||||
// SyntaxError: Identifier 'e' has already been declared
|
||||
```
|
||||
UglifyJS may modify the input which in turn may suppress those errors.
|
||||
- Some versions of Chrome and Node.js will give incorrect results with the
|
||||
following:
|
||||
```javascript
|
||||
console.log({
|
||||
...{
|
||||
set 42(v) {},
|
||||
42: "PASS",
|
||||
},
|
||||
});
|
||||
// Expected: { '42': 'PASS' }
|
||||
// Actual: { '42': undefined }
|
||||
```
|
||||
UglifyJS may modify the input which in turn may suppress those errors.
|
||||
- Later versions of JavaScript will throw `SyntaxError` with the following:
|
||||
```javascript
|
||||
var await;
|
||||
async function f() {
|
||||
class A {
|
||||
static p = await;
|
||||
}
|
||||
}
|
||||
// SyntaxError: Unexpected reserved word
|
||||
```
|
||||
UglifyJS may modify the input which in turn may suppress those errors.
|
||||
- Later versions of JavaScript will throw `SyntaxError` with the following:
|
||||
```javascript
|
||||
var async;
|
||||
for (async of []);
|
||||
// SyntaxError: The left-hand side of a for-of loop may not be 'async'.
|
||||
```
|
||||
UglifyJS may modify the input which in turn may suppress those errors.
|
||||
|
||||
107
bin/uglifyjs
107
bin/uglifyjs
@@ -3,14 +3,14 @@
|
||||
|
||||
"use strict";
|
||||
|
||||
require("../tools/exit");
|
||||
require("../tools/tty");
|
||||
|
||||
var fs = require("fs");
|
||||
var info = require("../package.json");
|
||||
var path = require("path");
|
||||
var UglifyJS = require("../tools/node");
|
||||
|
||||
var skip_keys = [ "cname", "inlined", "parent_scope", "scope", "uses_eval", "uses_with" ];
|
||||
var skip_keys = [ "cname", "fixed", "inlined", "parent_scope", "scope", "uses_eval", "uses_with" ];
|
||||
var files = {};
|
||||
var options = {};
|
||||
var short_forms = {
|
||||
@@ -95,6 +95,8 @@ function process_option(name, no_value) {
|
||||
" -b, --beautify [options] Beautify output/specify output options.",
|
||||
" -O, --output-opts <options> Output options (beautify disabled).",
|
||||
" -o, --output <file> Output file (default STDOUT).",
|
||||
" --annotations Process and preserve comment annotations.",
|
||||
" --no-annotations Ignore and discard comment annotations.",
|
||||
" --comments [filter] Preserve copyright comments in the output.",
|
||||
" --config-file <file> Read minify() options from JSON file.",
|
||||
" -d, --define <expr>[=value] Global definitions.",
|
||||
@@ -113,6 +115,9 @@ function process_option(name, no_value) {
|
||||
" --warn Print warning messages.",
|
||||
" --webkit Support non-standard Safari/Webkit.",
|
||||
" --wrap <name> Embed everything as a function with “exports” corresponding to “name” globally.",
|
||||
"",
|
||||
"(internal debug use only)",
|
||||
" --in-situ Warning: replaces original source files with minified output.",
|
||||
" --reduce-test Reduce a standalone test case (assumes cloned repository).",
|
||||
].join("\n"));
|
||||
}
|
||||
@@ -139,6 +144,7 @@ function process_option(name, no_value) {
|
||||
case "enclose":
|
||||
options[name] = read_value();
|
||||
break;
|
||||
case "annotations":
|
||||
case "ie8":
|
||||
case "timings":
|
||||
case "toplevel":
|
||||
@@ -146,6 +152,9 @@ function process_option(name, no_value) {
|
||||
case "webkit":
|
||||
options[name] = true;
|
||||
break;
|
||||
case "no-annotations":
|
||||
options.annotations = false;
|
||||
break;
|
||||
case "keep-fnames":
|
||||
options.keep_fnames = true;
|
||||
break;
|
||||
@@ -194,6 +203,7 @@ function process_option(name, no_value) {
|
||||
case "no-rename":
|
||||
options.rename = false;
|
||||
break;
|
||||
case "in-situ":
|
||||
case "reduce-test":
|
||||
case "self":
|
||||
break;
|
||||
@@ -225,10 +235,11 @@ if (options.mangle && options.mangle.properties) {
|
||||
});
|
||||
}
|
||||
}
|
||||
if (output == "ast") options.output = {
|
||||
ast: true,
|
||||
code: false,
|
||||
};
|
||||
if (/^ast|spidermonkey$/.test(output)) {
|
||||
if (typeof options.output != "object") options.output = {};
|
||||
options.output.ast = true;
|
||||
options.output.code = false;
|
||||
}
|
||||
if (options.parse && (options.parse.acorn || options.parse.spidermonkey)
|
||||
&& options.sourceMap && options.sourceMap.content == "inline") {
|
||||
fatal("inline source map only works with built-in parser");
|
||||
@@ -254,18 +265,35 @@ if (specified["self"]) {
|
||||
if (!options.wrap) options.wrap = "UglifyJS";
|
||||
paths = UglifyJS.FILES;
|
||||
}
|
||||
if (paths.length) {
|
||||
if (specified["in-situ"]) {
|
||||
if (output && output != "spidermonkey" || specified["reduce-test"] || specified["self"]) {
|
||||
fatal("incompatible options specified");
|
||||
}
|
||||
paths.forEach(function(name) {
|
||||
print(name);
|
||||
if (/^ast|spidermonkey$/.test(name)) fatal("invalid file name specified");
|
||||
files = {};
|
||||
files[convert_path(name)] = read_file(name);
|
||||
output = name;
|
||||
run();
|
||||
});
|
||||
} else if (paths.length) {
|
||||
simple_glob(paths).forEach(function(name) {
|
||||
files[convert_path(name)] = read_file(name);
|
||||
});
|
||||
run();
|
||||
} else {
|
||||
var timerId = process.stdin.isTTY && process.argv.length < 3 && setTimeout(function() {
|
||||
print_error("Waiting for input... (use `--help` to print usage information)");
|
||||
}, 1500);
|
||||
var chunks = [];
|
||||
process.stdin.setEncoding("utf8");
|
||||
process.stdin.on("data", function(chunk) {
|
||||
process.stdin.once("data", function() {
|
||||
clearTimeout(timerId);
|
||||
}).on("data", function(chunk) {
|
||||
chunks.push(chunk);
|
||||
}).on("end", function() {
|
||||
files = [ chunks.join("") ];
|
||||
files = { STDIN: chunks.join("") };
|
||||
run();
|
||||
});
|
||||
process.stdin.resume();
|
||||
@@ -286,13 +314,43 @@ function run() {
|
||||
try {
|
||||
if (options.parse) {
|
||||
if (options.parse.acorn) {
|
||||
var annotations = Object.create(null);
|
||||
files = convert_ast(function(toplevel, name) {
|
||||
return require("acorn").parse(files[name], {
|
||||
var content = files[name];
|
||||
var list = annotations[name] = [];
|
||||
var prev = -1;
|
||||
return require("acorn").parse(content, {
|
||||
allowHashBang: true,
|
||||
ecmaVersion: "latest",
|
||||
locations: true,
|
||||
onComment: function(block, text, start, end) {
|
||||
var match = /[@#]__PURE__/.exec(text);
|
||||
if (!match) {
|
||||
if (start != prev) return;
|
||||
match = [ list[prev] ];
|
||||
}
|
||||
while (/\s/.test(content[end])) end++;
|
||||
list[end] = match[0];
|
||||
prev = end;
|
||||
},
|
||||
preserveParens: true,
|
||||
program: toplevel,
|
||||
sourceFile: name
|
||||
sourceFile: name,
|
||||
sourceType: "module",
|
||||
});
|
||||
});
|
||||
files.walk(new UglifyJS.TreeWalker(function(node) {
|
||||
if (!(node instanceof UglifyJS.AST_Call)) return;
|
||||
var list = annotations[node.start.file];
|
||||
var pure = list[node.start.pos];
|
||||
if (!pure) {
|
||||
var pos = node.start.parens;
|
||||
if (pos) for (var i = 0; !pure && i < pos.length; i++) {
|
||||
pure = list[pos[i]];
|
||||
}
|
||||
}
|
||||
if (pure) node.pure = pure;
|
||||
}));
|
||||
} else if (options.parse.spidermonkey) {
|
||||
files = convert_ast(function(toplevel, name) {
|
||||
var obj = JSON.parse(files[name]);
|
||||
@@ -360,14 +418,14 @@ function run() {
|
||||
}
|
||||
print(JSON.stringify(result.ast, function(key, value) {
|
||||
if (value) switch (key) {
|
||||
case "thedef":
|
||||
return symdef(value);
|
||||
case "enclosed":
|
||||
return value.length ? value.map(symdef) : undefined;
|
||||
case "variables":
|
||||
case "functions":
|
||||
case "globals":
|
||||
case "variables":
|
||||
return value.size() ? value.map(symdef) : undefined;
|
||||
case "thedef":
|
||||
return symdef(value);
|
||||
}
|
||||
if (skip_key(key)) return;
|
||||
if (value instanceof UglifyJS.AST_Token) return;
|
||||
@@ -384,16 +442,19 @@ function run() {
|
||||
return value;
|
||||
}, 2));
|
||||
} else if (output == "spidermonkey") {
|
||||
print(JSON.stringify(UglifyJS.minify(result.code, {
|
||||
compress: false,
|
||||
mangle: false,
|
||||
output: {
|
||||
ast: true,
|
||||
code: false
|
||||
},
|
||||
}).ast.to_mozilla_ast(), null, 2));
|
||||
print(JSON.stringify(result.ast.to_mozilla_ast(), null, 2));
|
||||
} else if (output) {
|
||||
fs.writeFileSync(output, result.code);
|
||||
var code;
|
||||
if (result.ast) {
|
||||
var opts = {};
|
||||
for (var name in options.output) {
|
||||
if (!/^ast|code$/.test(name)) opts[name] = options.output[name];
|
||||
}
|
||||
code = UglifyJS.AST_Node.from_mozilla_ast(result.ast.to_mozilla_ast()).print_to_string(opts);
|
||||
} else {
|
||||
code = result.code;
|
||||
}
|
||||
fs.writeFileSync(output, code);
|
||||
if (result.map) fs.writeFileSync(output + ".map", result.map);
|
||||
} else {
|
||||
print(result.code);
|
||||
|
||||
833
lib/ast.js
833
lib/ast.js
File diff suppressed because it is too large
Load Diff
4438
lib/compress.js
4438
lib/compress.js
File diff suppressed because it is too large
Load Diff
@@ -47,14 +47,12 @@ function parse_source_map(content) {
|
||||
}
|
||||
|
||||
function set_shorthand(name, options, keys) {
|
||||
if (options[name]) {
|
||||
keys.forEach(function(key) {
|
||||
if (options[key]) {
|
||||
if (typeof options[key] != "object") options[key] = {};
|
||||
if (!(name in options[key])) options[key][name] = options[name];
|
||||
}
|
||||
});
|
||||
}
|
||||
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) {
|
||||
@@ -75,6 +73,7 @@ function to_json(cache) {
|
||||
function minify(files, options) {
|
||||
try {
|
||||
options = defaults(options, {
|
||||
annotations: undefined,
|
||||
compress: {},
|
||||
enclose: false,
|
||||
ie8: false,
|
||||
@@ -87,22 +86,21 @@ function minify(files, options) {
|
||||
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;
|
||||
}
|
||||
set_shorthand("ie8", options, [ "compress", "mangle", "output" ]);
|
||||
set_shorthand("keep_fnames", options, [ "compress", "mangle" ]);
|
||||
set_shorthand("toplevel", options, [ "compress", "mangle" ]);
|
||||
set_shorthand("webkit", options, [ "mangle", "output" ]);
|
||||
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) set_shorthand("ie8", options, [ "compress", "mangle", "output" ]);
|
||||
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, [ "mangle", "output" ]);
|
||||
var quoted_props;
|
||||
if (options.mangle) {
|
||||
options.mangle = defaults(options.mangle, {
|
||||
@@ -113,6 +111,7 @@ function minify(files, options) {
|
||||
properties: false,
|
||||
reserved: [],
|
||||
toplevel: false,
|
||||
v8: false,
|
||||
webkit: false,
|
||||
}, true);
|
||||
if (options.mangle.properties) {
|
||||
@@ -205,27 +204,29 @@ function minify(files, options) {
|
||||
if (options.mangle && options.mangle.properties) mangle_properties(toplevel, options.mangle.properties);
|
||||
if (timings) timings.output = Date.now();
|
||||
var result = {};
|
||||
if (options.output.ast) {
|
||||
result.ast = toplevel;
|
||||
}
|
||||
if (!HOP(options.output, "code") || options.output.code) {
|
||||
var output = defaults(options.output, {
|
||||
ast: false,
|
||||
code: true,
|
||||
});
|
||||
if (output.ast) result.ast = toplevel;
|
||||
if (output.code) {
|
||||
if (options.sourceMap) {
|
||||
options.output.source_map = SourceMap(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)) {
|
||||
options.output.source_map.setSourceContent(name, files[name]);
|
||||
output.source_map.setSourceContent(name, files[name]);
|
||||
}
|
||||
}
|
||||
}
|
||||
delete options.output.ast;
|
||||
delete options.output.code;
|
||||
var stream = OutputStream(options.output);
|
||||
delete output.ast;
|
||||
delete output.code;
|
||||
var stream = OutputStream(output);
|
||||
toplevel.print(stream);
|
||||
result.code = stream.get();
|
||||
if (options.sourceMap) {
|
||||
result.map = options.output.source_map.toString();
|
||||
result.map = output.source_map.toString();
|
||||
var url = options.sourceMap.url;
|
||||
if (url) {
|
||||
result.code = result.code.replace(/\n\/\/# sourceMappingURL=\S+\s*$/, "");
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
885
lib/output.js
885
lib/output.js
File diff suppressed because it is too large
Load Diff
1280
lib/parse.js
1280
lib/parse.js
File diff suppressed because it is too large
Load Diff
@@ -81,7 +81,9 @@ var builtins = function() {
|
||||
|
||||
function reserve_quoted_keys(ast, reserved) {
|
||||
ast.walk(new TreeWalker(function(node) {
|
||||
if (node instanceof AST_ObjectProperty) {
|
||||
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);
|
||||
@@ -163,6 +165,8 @@ function mangle_properties(ast, options) {
|
||||
addStrings(node.args[0], add);
|
||||
break;
|
||||
}
|
||||
} else if (node instanceof AST_ClassProperty) {
|
||||
if (typeof node.key == "string") add(node.key);
|
||||
} else if (node instanceof AST_Dot) {
|
||||
add(node.property);
|
||||
} else if (node instanceof AST_ObjectProperty) {
|
||||
@@ -193,6 +197,8 @@ function mangle_properties(ast, options) {
|
||||
mangleStrings(node.args[0]);
|
||||
break;
|
||||
}
|
||||
} else if (node instanceof AST_ClassProperty) {
|
||||
if (typeof node.key == "string") node.key = mangle(node.key);
|
||||
} else if (node instanceof AST_Dot) {
|
||||
node.property = mangle(node.property);
|
||||
} else if (node instanceof AST_ObjectProperty) {
|
||||
@@ -222,13 +228,11 @@ function mangle_properties(ast, options) {
|
||||
}
|
||||
|
||||
function mangle(name) {
|
||||
if (!should_mangle(name)) {
|
||||
return name;
|
||||
}
|
||||
if (!should_mangle(name)) return name;
|
||||
var mangled = cache.get(name);
|
||||
if (!mangled) {
|
||||
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 + "_";
|
||||
if (can_mangle(debug_mangled)) mangled = debug_mangled;
|
||||
}
|
||||
@@ -236,6 +240,7 @@ function mangle_properties(ast, options) {
|
||||
if (!mangled) do {
|
||||
mangled = base54(++cname);
|
||||
} while (!can_mangle(mangled));
|
||||
if (/^#/.test(name)) mangled = "#" + mangled;
|
||||
cache.set(name, mangled);
|
||||
}
|
||||
return mangled;
|
||||
|
||||
178
lib/scope.js
178
lib/scope.js
@@ -45,10 +45,10 @@
|
||||
|
||||
function SymbolDef(id, scope, orig, init) {
|
||||
this.eliminated = 0;
|
||||
this.exported = false;
|
||||
this.global = false;
|
||||
this.id = id;
|
||||
this.init = init;
|
||||
this.lambda = orig instanceof AST_SymbolLambda;
|
||||
this.mangled_name = null;
|
||||
this.name = orig.name;
|
||||
this.orig = [ orig ];
|
||||
@@ -92,14 +92,28 @@ SymbolDef.prototype = {
|
||||
},
|
||||
unmangleable: function(options) {
|
||||
return this.global && !options.toplevel
|
||||
|| this.exported
|
||||
|| this.undeclared
|
||||
|| !options.eval && this.scope.pinned()
|
||||
|| options.keep_fnames
|
||||
&& (this.orig[0] instanceof AST_SymbolLambda
|
||||
|| this.orig[0] instanceof AST_SymbolDefun);
|
||||
&& (this.orig[0] instanceof AST_SymbolClass
|
||||
|| this.orig[0] instanceof AST_SymbolDefClass
|
||||
|| this.orig[0] instanceof AST_SymbolDefun
|
||||
|| this.orig[0] instanceof AST_SymbolLambda);
|
||||
},
|
||||
};
|
||||
|
||||
var unary_side_effects = makePredicate("delete ++ --");
|
||||
|
||||
function is_lhs(node, parent) {
|
||||
if (parent instanceof AST_Assign) return parent.left === node && node;
|
||||
if (parent instanceof AST_DefaultValue) return parent.name === node && node;
|
||||
if (parent instanceof AST_Destructured) return node;
|
||||
if (parent instanceof AST_DestructuredKeyVal) return node;
|
||||
if (parent instanceof AST_ForEnumeration) return parent.init === node && node;
|
||||
if (parent instanceof AST_Unary) return unary_side_effects[parent.operator] && parent.expression;
|
||||
}
|
||||
|
||||
AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
|
||||
options = defaults(options, {
|
||||
cache: null,
|
||||
@@ -109,15 +123,40 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
|
||||
// pass 1: setup scope chaining and handle definitions
|
||||
var self = this;
|
||||
var defun = null;
|
||||
var exported = false;
|
||||
var next_def_id = 0;
|
||||
var scope = self.parent_scope = null;
|
||||
var tw = new TreeWalker(function(node, descend) {
|
||||
if (node instanceof AST_Defun) {
|
||||
if (node instanceof AST_DefClass) {
|
||||
var save_exported = exported;
|
||||
exported = tw.parent() instanceof AST_ExportDeclaration;
|
||||
node.name.walk(tw);
|
||||
exported = save_exported;
|
||||
walk_scope(function() {
|
||||
if (node.extends) node.extends.walk(tw);
|
||||
node.properties.forEach(function(prop) {
|
||||
prop.walk(tw);
|
||||
});
|
||||
});
|
||||
return true;
|
||||
}
|
||||
if (node instanceof AST_Definitions) {
|
||||
var save_exported = exported;
|
||||
exported = tw.parent() instanceof AST_ExportDeclaration;
|
||||
descend();
|
||||
exported = save_exported;
|
||||
return true;
|
||||
}
|
||||
if (node instanceof AST_LambdaDefinition) {
|
||||
var save_exported = exported;
|
||||
exported = tw.parent() instanceof AST_ExportDeclaration;
|
||||
node.name.walk(tw);
|
||||
exported = save_exported;
|
||||
walk_scope(function() {
|
||||
node.argnames.forEach(function(argname) {
|
||||
argname.walk(tw);
|
||||
});
|
||||
if (node.rest) node.rest.walk(tw);
|
||||
walk_body(node, tw);
|
||||
});
|
||||
return true;
|
||||
@@ -159,9 +198,12 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
|
||||
if (node instanceof AST_SymbolCatch) {
|
||||
scope.def_variable(node).defun = defun;
|
||||
} else if (node instanceof AST_SymbolConst) {
|
||||
scope.def_variable(node).defun = defun;
|
||||
var def = scope.def_variable(node);
|
||||
def.defun = defun;
|
||||
if (exported) def.exported = true;
|
||||
} else if (node instanceof AST_SymbolDefun) {
|
||||
defun.def_function(node, tw.parent());
|
||||
var def = defun.def_function(node, tw.parent());
|
||||
if (exported) def.exported = true;
|
||||
entangle(defun, scope);
|
||||
} else if (node instanceof AST_SymbolFunarg) {
|
||||
defun.def_variable(node);
|
||||
@@ -170,9 +212,11 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
|
||||
var def = defun.def_function(node, node.name == "arguments" ? undefined : defun);
|
||||
if (options.ie8) def.defun = defun.parent_scope.resolve();
|
||||
} else if (node instanceof AST_SymbolLet) {
|
||||
scope.def_variable(node);
|
||||
var def = scope.def_variable(node);
|
||||
if (exported) def.exported = true;
|
||||
} else if (node instanceof AST_SymbolVar) {
|
||||
defun.def_variable(node, null);
|
||||
var def = defun.def_variable(node, node instanceof AST_SymbolImport ? undefined : null);
|
||||
if (exported) def.exported = true;
|
||||
entangle(defun, scope);
|
||||
}
|
||||
|
||||
@@ -190,7 +234,7 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
|
||||
function entangle(defun, scope) {
|
||||
if (defun === scope) return;
|
||||
node.mark_enclosed(options);
|
||||
var def = scope.find_variable(node);
|
||||
var def = scope.find_variable(node.name);
|
||||
if (node.thedef === def) return;
|
||||
node.thedef = def;
|
||||
def.orig.push(node);
|
||||
@@ -206,19 +250,50 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
|
||||
self.globals = new Dictionary();
|
||||
var in_arg = [];
|
||||
var tw = new TreeWalker(function(node) {
|
||||
if (node instanceof AST_Catch) {
|
||||
if (!(node.argname instanceof AST_Destructured)) return;
|
||||
in_arg.push(node);
|
||||
node.argname.walk(tw);
|
||||
in_arg.pop();
|
||||
walk_body(node, tw);
|
||||
return true;
|
||||
}
|
||||
if (node instanceof AST_Lambda) {
|
||||
in_arg.push(node);
|
||||
node.argnames.forEach(function(argname) {
|
||||
argname.walk(tw);
|
||||
});
|
||||
if (node.rest) node.rest.walk(tw);
|
||||
in_arg.pop();
|
||||
walk_body(node, tw);
|
||||
walk_lambda(node, tw);
|
||||
return true;
|
||||
}
|
||||
if (node instanceof AST_LoopControl) {
|
||||
if (node.label) node.label.thedef.references.push(node);
|
||||
return true;
|
||||
}
|
||||
if (node instanceof AST_SymbolDeclaration) {
|
||||
var def = node.definition();
|
||||
def.preinit = def.references.length;
|
||||
if (node instanceof AST_SymbolCatch) {
|
||||
// ensure mangling works if `catch` reuses a scope variable
|
||||
var redef = def.redefined();
|
||||
if (redef) for (var s = node.scope; s; s = s.parent_scope) {
|
||||
push_uniq(s.enclosed, redef);
|
||||
if (s === redef.scope) break;
|
||||
}
|
||||
} else if (node instanceof AST_SymbolConst) {
|
||||
// ensure compression works if `const` reuses a scope variable
|
||||
var redef = def.redefined();
|
||||
if (redef) redef.const_redefs = true;
|
||||
}
|
||||
if (node.name != "arguments") return true;
|
||||
var parent = node instanceof AST_SymbolVar && tw.parent();
|
||||
if (parent instanceof AST_VarDef && !parent.value) return true;
|
||||
var sym = node.scope.resolve().find_variable("arguments");
|
||||
if (sym && is_arguments(sym)) sym.scope.uses_arguments = 3;
|
||||
return true;
|
||||
}
|
||||
if (node instanceof AST_SymbolRef) {
|
||||
var name = node.name;
|
||||
var sym = node.scope.find_variable(name);
|
||||
@@ -226,7 +301,9 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
|
||||
i = in_arg.lastIndexOf(sym.scope, i - 1);
|
||||
if (i < 0) break;
|
||||
var decl = sym.orig[0];
|
||||
if (decl instanceof AST_SymbolFunarg || decl instanceof AST_SymbolLambda) {
|
||||
if (decl instanceof AST_SymbolCatch
|
||||
|| decl instanceof AST_SymbolFunarg
|
||||
|| decl instanceof AST_SymbolLambda) {
|
||||
node.in_arg = true;
|
||||
break;
|
||||
}
|
||||
@@ -234,9 +311,13 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
|
||||
}
|
||||
if (!sym) {
|
||||
sym = self.def_global(node);
|
||||
} else if (name == "arguments" && sym.scope instanceof AST_Lambda) {
|
||||
if (!(tw.parent() instanceof AST_PropAccess)) {
|
||||
sym.scope.uses_arguments = "d";
|
||||
} else if (name == "arguments" && is_arguments(sym)) {
|
||||
var parent = tw.parent();
|
||||
if (is_lhs(node, parent)) {
|
||||
sym.scope.uses_arguments = 3;
|
||||
} else if (sym.scope.uses_arguments < 2
|
||||
&& !(parent instanceof AST_PropAccess && parent.expression === node)) {
|
||||
sym.scope.uses_arguments = 2;
|
||||
} else if (!sym.scope.uses_arguments) {
|
||||
sym.scope.uses_arguments = true;
|
||||
}
|
||||
@@ -254,25 +335,17 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
|
||||
self.uses_eval = true;
|
||||
}
|
||||
}
|
||||
if (sym.init instanceof AST_LambdaDefinition && sym.scope !== sym.init.name.scope) {
|
||||
var scope = node.scope;
|
||||
do {
|
||||
if (scope === sym.init.name.scope) break;
|
||||
} while (scope = scope.parent_scope);
|
||||
if (!scope) sym.init = undefined;
|
||||
}
|
||||
node.thedef = sym;
|
||||
node.reference(options);
|
||||
return true;
|
||||
}
|
||||
// ensure mangling works if `catch` reuses a scope variable
|
||||
if (node instanceof AST_SymbolCatch) {
|
||||
var def = node.definition().redefined();
|
||||
if (def) for (var s = node.scope; s; s = s.parent_scope) {
|
||||
push_uniq(s.enclosed, def);
|
||||
if (s === def.scope) break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
// ensure compression works if `const` reuses a scope variable
|
||||
if (node instanceof AST_SymbolConst) {
|
||||
var redef = node.definition().redefined();
|
||||
if (redef) redef.const_redefs = true;
|
||||
return true;
|
||||
}
|
||||
});
|
||||
self.walk(tw);
|
||||
|
||||
@@ -288,8 +361,9 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
|
||||
}
|
||||
if (node instanceof AST_SymbolLambda) {
|
||||
var def = node.thedef;
|
||||
redefine(node, node.scope.parent_scope.resolve());
|
||||
if (typeof node.thedef.init !== "undefined") {
|
||||
if (!redefine(node, node.scope.parent_scope.resolve())) {
|
||||
delete def.defun;
|
||||
} else if (typeof node.thedef.init !== "undefined") {
|
||||
node.thedef.init = false;
|
||||
} else if (def.init) {
|
||||
node.thedef.init = def.init;
|
||||
@@ -298,12 +372,18 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
|
||||
}
|
||||
}));
|
||||
|
||||
function is_arguments(sym) {
|
||||
return sym.orig[0] instanceof AST_SymbolFunarg
|
||||
&& !(sym.orig[1] instanceof AST_SymbolFunarg || sym.orig[2] instanceof AST_SymbolFunarg)
|
||||
&& !is_arrow(sym.scope);
|
||||
}
|
||||
|
||||
function redefine(node, scope) {
|
||||
var name = node.name;
|
||||
var old_def = node.thedef;
|
||||
if (!all(old_def.orig, function(sym) {
|
||||
return !(sym instanceof AST_SymbolConst || sym instanceof AST_SymbolLet);
|
||||
})) return;
|
||||
})) return false;
|
||||
var new_def = scope.find_variable(name);
|
||||
if (new_def) {
|
||||
var redef = new_def.redefined();
|
||||
@@ -318,12 +398,12 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
|
||||
}
|
||||
old_def.defun = new_def.scope;
|
||||
old_def.forEach(function(node) {
|
||||
node.redef = true;
|
||||
node.redef = old_def;
|
||||
node.thedef = new_def;
|
||||
node.reference(options);
|
||||
});
|
||||
if (old_def.lambda) new_def.lambda = true;
|
||||
if (new_def.undeclared) self.variables.set(name, new_def);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
@@ -360,6 +440,13 @@ AST_BlockScope.DEFMETHOD("init_vars", function(parent_scope) {
|
||||
AST_Scope.DEFMETHOD("init_vars", function(parent_scope) {
|
||||
init_scope_vars(this, parent_scope);
|
||||
});
|
||||
AST_Arrow.DEFMETHOD("init_vars", function(parent_scope) {
|
||||
init_scope_vars(this, parent_scope);
|
||||
return this;
|
||||
});
|
||||
AST_AsyncArrow.DEFMETHOD("init_vars", function(parent_scope) {
|
||||
init_scope_vars(this, parent_scope);
|
||||
});
|
||||
AST_Lambda.DEFMETHOD("init_vars", function(parent_scope) {
|
||||
init_scope_vars(this, parent_scope);
|
||||
this.uses_arguments = false;
|
||||
@@ -375,7 +462,9 @@ AST_Symbol.DEFMETHOD("mark_enclosed", function(options) {
|
||||
var def = this.definition();
|
||||
for (var s = this.scope; s; s = s.parent_scope) {
|
||||
push_uniq(s.enclosed, def);
|
||||
if (options.keep_fnames) {
|
||||
if (!options) {
|
||||
delete s._var_names;
|
||||
} else if (options.keep_fnames) {
|
||||
s.functions.each(function(d) {
|
||||
push_uniq(def.scope.enclosed, d);
|
||||
});
|
||||
@@ -390,14 +479,13 @@ AST_Symbol.DEFMETHOD("reference", function(options) {
|
||||
});
|
||||
|
||||
AST_BlockScope.DEFMETHOD("find_variable", function(name) {
|
||||
if (name instanceof AST_Symbol) name = name.name;
|
||||
return this.variables.get(name)
|
||||
|| (this.parent_scope && this.parent_scope.find_variable(name));
|
||||
|| this.parent_scope && this.parent_scope.find_variable(name);
|
||||
});
|
||||
|
||||
AST_BlockScope.DEFMETHOD("def_function", function(symbol, init) {
|
||||
var def = this.def_variable(symbol, init);
|
||||
if (!def.init || def.init instanceof AST_Defun) def.init = init;
|
||||
if (!def.init || def.init instanceof AST_LambdaDefinition) def.init = init;
|
||||
this.functions.set(symbol.name, def);
|
||||
return def;
|
||||
});
|
||||
@@ -406,7 +494,7 @@ AST_BlockScope.DEFMETHOD("def_variable", function(symbol, init) {
|
||||
var def = this.variables.get(symbol.name);
|
||||
if (def) {
|
||||
def.orig.push(symbol);
|
||||
if (def.init instanceof AST_Function) def.init = init;
|
||||
if (def.init instanceof AST_LambdaExpression) def.init = init;
|
||||
} else {
|
||||
def = this.make_def(symbol, init);
|
||||
this.variables.set(symbol.name, def);
|
||||
@@ -486,6 +574,7 @@ function _default_mangler_options(options) {
|
||||
keep_fnames : false,
|
||||
reserved : [],
|
||||
toplevel : false,
|
||||
v8 : false,
|
||||
webkit : false,
|
||||
});
|
||||
if (!Array.isArray(options.reserved)) options.reserved = [];
|
||||
@@ -517,7 +606,7 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options) {
|
||||
// lname is incremented when we get to the AST_Label
|
||||
var save_nesting = lname;
|
||||
descend();
|
||||
lname = save_nesting;
|
||||
if (!options.v8 || !in_label(tw)) lname = save_nesting;
|
||||
return true;
|
||||
}
|
||||
if (node instanceof AST_BlockScope) {
|
||||
@@ -576,6 +665,7 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options) {
|
||||
if (!(sym instanceof AST_SymbolConst)) return false;
|
||||
var scope = def.scope.resolve();
|
||||
if (def.scope === scope) return false;
|
||||
if (def.scope.parent_scope.find_variable(sym.name)) return false;
|
||||
redef = scope.def_variable(sym);
|
||||
scope.to_mangle.push(redef);
|
||||
}
|
||||
@@ -590,6 +680,14 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options) {
|
||||
sym.thedef = def;
|
||||
}
|
||||
}
|
||||
|
||||
function in_label(tw) {
|
||||
var level = 0, parent;
|
||||
while (parent = tw.parent(level++)) {
|
||||
if (parent instanceof AST_Block) return parent instanceof AST_Toplevel && !options.toplevel;
|
||||
if (parent instanceof AST_LabeledStatement) return true;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
AST_Toplevel.DEFMETHOD("find_colliding_names", function(options) {
|
||||
|
||||
@@ -144,7 +144,9 @@ function SourceMap(options) {
|
||||
add(source, gen_line, gen_col, orig_line, orig_col, name);
|
||||
} : add,
|
||||
setSourceContent: sources_content ? function(source, content) {
|
||||
sources_content[source] = content;
|
||||
if (!(source in sources_content)) {
|
||||
sources_content[source] = content;
|
||||
}
|
||||
} : noop,
|
||||
toString: function() {
|
||||
return JSON.stringify({
|
||||
|
||||
@@ -82,7 +82,7 @@ TreeTransformer.prototype = new TreeWalker;
|
||||
if (self.step) self.step = self.step.transform(tw);
|
||||
self.body = self.body.transform(tw);
|
||||
});
|
||||
DEF(AST_ForIn, function(self, tw) {
|
||||
DEF(AST_ForEnumeration, function(self, tw) {
|
||||
self.init = self.init.transform(tw);
|
||||
self.object = self.object.transform(tw);
|
||||
self.body = self.body.transform(tw);
|
||||
@@ -126,11 +126,36 @@ TreeTransformer.prototype = new TreeWalker;
|
||||
self.name = self.name.transform(tw);
|
||||
if (self.value) self.value = self.value.transform(tw);
|
||||
});
|
||||
DEF(AST_DefaultValue, function(self, tw) {
|
||||
self.name = self.name.transform(tw);
|
||||
self.value = self.value.transform(tw);
|
||||
});
|
||||
DEF(AST_Lambda, function(self, tw) {
|
||||
if (self.name) self.name = self.name.transform(tw);
|
||||
self.argnames = do_list(self.argnames, tw);
|
||||
if (self.rest) self.rest = self.rest.transform(tw);
|
||||
self.body = do_list(self.body, 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 {
|
||||
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);
|
||||
if (self.value) self.value = self.value.transform(tw);
|
||||
});
|
||||
DEF(AST_Call, function(self, tw) {
|
||||
self.expression = self.expression.transform(tw);
|
||||
self.args = do_list(self.args, tw);
|
||||
@@ -138,6 +163,12 @@ TreeTransformer.prototype = new TreeWalker;
|
||||
DEF(AST_Sequence, function(self, tw) {
|
||||
self.expressions = do_list(self.expressions, tw);
|
||||
});
|
||||
DEF(AST_Await, function(self, tw) {
|
||||
self.expression = self.expression.transform(tw);
|
||||
});
|
||||
DEF(AST_Yield, function(self, tw) {
|
||||
if (self.expression) self.expression = self.expression.transform(tw);
|
||||
});
|
||||
DEF(AST_Dot, function(self, tw) {
|
||||
self.expression = self.expression.transform(tw);
|
||||
});
|
||||
@@ -145,6 +176,9 @@ TreeTransformer.prototype = new TreeWalker;
|
||||
self.expression = self.expression.transform(tw);
|
||||
self.property = self.property.transform(tw);
|
||||
});
|
||||
DEF(AST_Spread, function(self, tw) {
|
||||
self.expression = self.expression.transform(tw);
|
||||
});
|
||||
DEF(AST_Unary, function(self, tw) {
|
||||
self.expression = self.expression.transform(tw);
|
||||
});
|
||||
@@ -162,6 +196,7 @@ TreeTransformer.prototype = new TreeWalker;
|
||||
});
|
||||
DEF(AST_DestructuredArray, function(self, tw) {
|
||||
self.elements = do_list(self.elements, tw);
|
||||
if (self.rest) self.rest = self.rest.transform(tw);
|
||||
});
|
||||
DEF(AST_DestructuredKeyVal, function(self, tw) {
|
||||
if (self.key instanceof AST_Node) self.key = self.key.transform(tw);
|
||||
@@ -169,6 +204,7 @@ TreeTransformer.prototype = new TreeWalker;
|
||||
});
|
||||
DEF(AST_DestructuredObject, function(self, tw) {
|
||||
self.properties = do_list(self.properties, tw);
|
||||
if (self.rest) self.rest = self.rest.transform(tw);
|
||||
});
|
||||
DEF(AST_Object, function(self, tw) {
|
||||
self.properties = do_list(self.properties, tw);
|
||||
@@ -177,6 +213,24 @@ TreeTransformer.prototype = new TreeWalker;
|
||||
if (self.key instanceof AST_Node) self.key = self.key.transform(tw);
|
||||
self.value = self.value.transform(tw);
|
||||
});
|
||||
DEF(AST_ExportDeclaration, function(self, tw) {
|
||||
self.body = self.body.transform(tw);
|
||||
});
|
||||
DEF(AST_ExportDefault, function(self, tw) {
|
||||
self.body = self.body.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;
|
||||
|
||||
16
lib/utils.js
16
lib/utils.js
@@ -238,21 +238,27 @@ function HOP(obj, prop) {
|
||||
// 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
|
||||
// a statement.
|
||||
function first_in_statement(stack) {
|
||||
function first_in_statement(stack, arrow, export_default) {
|
||||
var node = stack.parent(-1);
|
||||
for (var i = 0, p; p = stack.parent(i++); node = p) {
|
||||
if (p.TYPE == "Call") {
|
||||
if (p.expression === node) continue;
|
||||
if (is_arrow(p)) {
|
||||
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_Statement) {
|
||||
return p.body === node;
|
||||
} else if (p instanceof AST_SimpleStatement) {
|
||||
return true;
|
||||
} else if (p instanceof AST_Template) {
|
||||
if (p.tag === node) continue;
|
||||
} else if (p instanceof AST_UnaryPostfix) {
|
||||
if (p.expression === node) continue;
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"description": "JavaScript parser, mangler/compressor and beautifier toolkit",
|
||||
"author": "Mihai Bazon <mihai.bazon@gmail.com> (http://lisperator.net/)",
|
||||
"license": "BSD-2-Clause",
|
||||
"version": "3.12.1",
|
||||
"version": "3.13.5",
|
||||
"engines": {
|
||||
"node": ">=0.8.0"
|
||||
},
|
||||
@@ -23,7 +23,7 @@
|
||||
"LICENSE"
|
||||
],
|
||||
"devDependencies": {
|
||||
"acorn": "~7.1.0",
|
||||
"acorn": "~8.2.1",
|
||||
"semver": "~6.3.0"
|
||||
},
|
||||
"scripts": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
"use strict";
|
||||
|
||||
require("../tools/exit");
|
||||
require("../tools/tty");
|
||||
|
||||
var assert = require("assert");
|
||||
var child_process = require("child_process");
|
||||
@@ -10,33 +10,38 @@ var sandbox = require("./sandbox");
|
||||
var semver = require("semver");
|
||||
var U = require("./node");
|
||||
|
||||
var file = process.argv[2];
|
||||
var batch = 50;
|
||||
var dir = path.resolve(path.dirname(module.filename), "compress");
|
||||
if (file) {
|
||||
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);
|
||||
log("--- {file}", { file: file });
|
||||
var tests = parse_test(path.resolve(dir, file));
|
||||
process.exit(Object.keys(tests).filter(function(name) {
|
||||
process.exit(Object.keys(tests).slice(start, start + batch).filter(function(name) {
|
||||
return !test_case(tests[name]);
|
||||
}).length);
|
||||
} else {
|
||||
var files = fs.readdirSync(dir).filter(function(name) {
|
||||
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() {
|
||||
var file = files.shift();
|
||||
if (file) {
|
||||
child_process.spawn(process.argv[0], [ process.argv[1], file ], {
|
||||
(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] = code;
|
||||
failed_files[file] = true;
|
||||
}
|
||||
next();
|
||||
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).");
|
||||
@@ -209,7 +214,7 @@ function reminify(orig_options, input_code, input_formatted, stdout) {
|
||||
} else {
|
||||
var toplevel = sandbox.has_toplevel(options);
|
||||
var expected = stdout[toplevel ? 1 : 0];
|
||||
var actual = run_code(result.code, toplevel);
|
||||
var actual = sandbox.run_code(result.code, toplevel);
|
||||
if (typeof expected != "string" && typeof actual != "string" && expected.name == actual.name) {
|
||||
actual = expected;
|
||||
}
|
||||
@@ -244,11 +249,6 @@ function reminify(orig_options, input_code, input_formatted, stdout) {
|
||||
return true;
|
||||
}
|
||||
|
||||
function run_code(code, toplevel) {
|
||||
var result = sandbox.run_code(code, toplevel);
|
||||
return typeof result == "string" ? result.replace(/\u001b\[\d+m/g, "") : result;
|
||||
}
|
||||
|
||||
function test_case(test) {
|
||||
log(" Running test [{name}]", { name: test.name });
|
||||
U.AST_Node.enable_validation();
|
||||
@@ -262,6 +262,7 @@ function test_case(test) {
|
||||
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,
|
||||
@@ -380,7 +381,7 @@ function test_case(test) {
|
||||
}
|
||||
}
|
||||
if (test.expect_stdout && (!test.node_version || semver.satisfies(process.version, test.node_version))) {
|
||||
var stdout = [ run_code(input_code), run_code(input_code, true) ];
|
||||
var stdout = [ sandbox.run_code(input_code), sandbox.run_code(input_code, true) ];
|
||||
var toplevel = sandbox.has_toplevel({
|
||||
compress: test.options,
|
||||
mangle: test.mangle
|
||||
@@ -409,7 +410,7 @@ function test_case(test) {
|
||||
});
|
||||
return false;
|
||||
}
|
||||
actual = run_code(output_code, toplevel);
|
||||
actual = sandbox.run_code(output_code, toplevel);
|
||||
if (!sandbox.same_stdout(test.expect_stdout, actual)) {
|
||||
log([
|
||||
"!!! failed",
|
||||
|
||||
473
test/compress/annotations.js
Normal file
473
test/compress/annotations.js
Normal file
@@ -0,0 +1,473 @@
|
||||
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,
|
||||
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());",
|
||||
]
|
||||
}
|
||||
@@ -78,12 +78,13 @@ replace_index_strict: {
|
||||
]
|
||||
}
|
||||
|
||||
replace_index_keep_fargs: {
|
||||
replace_index_drop_fargs_1: {
|
||||
options = {
|
||||
arguments: true,
|
||||
evaluate: true,
|
||||
keep_fargs: false,
|
||||
properties: true,
|
||||
reduce_vars: true,
|
||||
}
|
||||
input: {
|
||||
var arguments = [];
|
||||
@@ -101,6 +102,13 @@ replace_index_keep_fargs: {
|
||||
var arguments;
|
||||
console.log(arguments[1], arguments["1"], arguments["foo"]);
|
||||
})("bar", 42);
|
||||
(function() {
|
||||
var arguments = {
|
||||
1: "foo",
|
||||
foo: "bar",
|
||||
};
|
||||
console.log(arguments[1], arguments["1"], arguments["foo"]);
|
||||
})("bar", 42);
|
||||
}
|
||||
expect: {
|
||||
var arguments = [];
|
||||
@@ -112,10 +120,17 @@ replace_index_keep_fargs: {
|
||||
console.log(b, b, arguments.foo);
|
||||
})("bar", 42);
|
||||
(function(arguments) {
|
||||
console.log(arguments[1], arguments[1], arguments.foo);
|
||||
console.log("bar"[1], "bar"[1], "bar".foo);
|
||||
})("bar", 42);
|
||||
(function(argument_0, argument_1) {
|
||||
var arguments;
|
||||
console.log(argument_1, argument_1, arguments.foo);
|
||||
})("bar", 42);
|
||||
(function() {
|
||||
var arguments;
|
||||
var arguments = {
|
||||
1: "foo",
|
||||
foo: "bar",
|
||||
};
|
||||
console.log(arguments[1], arguments[1], arguments.foo);
|
||||
})("bar", 42);
|
||||
}
|
||||
@@ -125,10 +140,11 @@ replace_index_keep_fargs: {
|
||||
"42 42 undefined",
|
||||
"a a undefined",
|
||||
"42 42 undefined",
|
||||
"foo foo bar",
|
||||
]
|
||||
}
|
||||
|
||||
replace_index_keep_fargs_strict: {
|
||||
replace_index_drop_fargs_2: {
|
||||
options = {
|
||||
arguments: true,
|
||||
evaluate: true,
|
||||
@@ -412,7 +428,7 @@ issue_3273_global_strict_reduce_vars: {
|
||||
]
|
||||
}
|
||||
|
||||
issue_3273_keep_fargs_false: {
|
||||
issue_3273_drop_fargs_1: {
|
||||
options = {
|
||||
arguments: true,
|
||||
keep_fargs: false,
|
||||
@@ -435,10 +451,10 @@ issue_3273_keep_fargs_false: {
|
||||
expect_stdout: "1"
|
||||
}
|
||||
|
||||
issue_3273_keep_fargs_strict: {
|
||||
issue_3273_drop_fargs_2: {
|
||||
options = {
|
||||
arguments: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
reduce_vars: true,
|
||||
}
|
||||
input: {
|
||||
@@ -633,7 +649,8 @@ issue_3282_2_passes: {
|
||||
issue_3420_1: {
|
||||
options = {
|
||||
arguments: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
reduce_vars: true,
|
||||
}
|
||||
input: {
|
||||
console.log(function() {
|
||||
@@ -655,7 +672,8 @@ issue_3420_1: {
|
||||
issue_3420_2: {
|
||||
options = {
|
||||
arguments: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
reduce_vars: true,
|
||||
}
|
||||
input: {
|
||||
var foo = function() {
|
||||
@@ -675,7 +693,8 @@ issue_3420_2: {
|
||||
issue_3420_3: {
|
||||
options = {
|
||||
arguments: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
reduce_vars: true,
|
||||
}
|
||||
input: {
|
||||
"use strict";
|
||||
@@ -697,7 +716,8 @@ issue_3420_3: {
|
||||
issue_3420_4: {
|
||||
options = {
|
||||
arguments: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
reduce_vars: true,
|
||||
}
|
||||
input: {
|
||||
!function() {
|
||||
@@ -722,7 +742,8 @@ issue_3420_4: {
|
||||
issue_3420_5: {
|
||||
options = {
|
||||
arguments: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
reduce_vars: true,
|
||||
}
|
||||
input: {
|
||||
"use strict";
|
||||
@@ -749,7 +770,8 @@ issue_3420_5: {
|
||||
issue_3420_6: {
|
||||
options = {
|
||||
arguments: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
reduce_vars: true,
|
||||
}
|
||||
input: {
|
||||
console.log(function() {
|
||||
@@ -767,7 +789,8 @@ issue_3420_6: {
|
||||
issue_3420_7: {
|
||||
options = {
|
||||
arguments: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
reduce_vars: true,
|
||||
}
|
||||
input: {
|
||||
"use strict";
|
||||
@@ -811,7 +834,8 @@ issue_4200: {
|
||||
issue_4291_1: {
|
||||
options = {
|
||||
arguments: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
reduce_vars: true,
|
||||
}
|
||||
input: {
|
||||
console.log(function() {
|
||||
@@ -831,7 +855,8 @@ issue_4291_1: {
|
||||
issue_4291_2: {
|
||||
options = {
|
||||
arguments: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
reduce_vars: true,
|
||||
}
|
||||
input: {
|
||||
var a = function() {
|
||||
@@ -842,8 +867,8 @@ issue_4291_2: {
|
||||
console.log(a[1], a[0], a.length);
|
||||
}
|
||||
expect: {
|
||||
var a = function(argument_0) {
|
||||
if (argument_0)
|
||||
var a = function() {
|
||||
if (arguments[0])
|
||||
arguments[1] = "PASS";
|
||||
return arguments;
|
||||
}(42);
|
||||
@@ -851,3 +876,160 @@ issue_4291_2: {
|
||||
}
|
||||
expect_stdout: "PASS 42 1"
|
||||
}
|
||||
|
||||
issue_4397: {
|
||||
options = {
|
||||
arguments: true,
|
||||
keep_fargs: false,
|
||||
reduce_vars: true,
|
||||
}
|
||||
input: {
|
||||
console.log(typeof function() {
|
||||
arguments += 0;
|
||||
return arguments[0];
|
||||
}());
|
||||
}
|
||||
expect: {
|
||||
console.log(typeof function() {
|
||||
arguments += 0;
|
||||
return arguments[0];
|
||||
}());
|
||||
}
|
||||
expect_stdout: "string"
|
||||
}
|
||||
|
||||
issue_4410_1: {
|
||||
options = {
|
||||
arguments: true,
|
||||
conditionals: true,
|
||||
evaluate: true,
|
||||
reduce_vars: true,
|
||||
}
|
||||
input: {
|
||||
(function(a) {
|
||||
console.log(arguments[0] === (a = 0) ? "FAIL" : "PASS");
|
||||
})(1);
|
||||
}
|
||||
expect: {
|
||||
(function(a) {
|
||||
console.log(a === (a = 0) ? "FAIL" : "PASS");
|
||||
})(1);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
issue_4410_2: {
|
||||
options = {
|
||||
arguments: true,
|
||||
conditionals: true,
|
||||
evaluate: true,
|
||||
reduce_vars: true,
|
||||
}
|
||||
input: {
|
||||
(function f(a) {
|
||||
console.log(arguments[0] === (a = 0) ? "FAIL" : "PASS");
|
||||
})(1);
|
||||
}
|
||||
expect: {
|
||||
(function f(a) {
|
||||
console.log(arguments[0] === (a = 0) ? "FAIL" : "PASS");
|
||||
})(1);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
issue_4410_3: {
|
||||
options = {
|
||||
arguments: true,
|
||||
}
|
||||
input: {
|
||||
var a = 1;
|
||||
(function f(b) {
|
||||
a-- && f();
|
||||
for (var c = 2; c--;)
|
||||
switch (arguments[0]) {
|
||||
case b = 42:
|
||||
case 42:
|
||||
console.log("PASS");
|
||||
}
|
||||
})(null);
|
||||
}
|
||||
expect: {
|
||||
var a = 1;
|
||||
(function f(b) {
|
||||
a-- && f();
|
||||
for (var c = 2; c--;)
|
||||
switch (arguments[0]) {
|
||||
case b = 42:
|
||||
case 42:
|
||||
console.log("PASS");
|
||||
}
|
||||
})(null);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
issue_4432: {
|
||||
options = {
|
||||
arguments: true,
|
||||
reduce_vars: true,
|
||||
}
|
||||
input: {
|
||||
console.log(function(a) {
|
||||
for (a in { FAIL: 42 });
|
||||
return arguments[0];
|
||||
}() || "PASS");
|
||||
}
|
||||
expect: {
|
||||
console.log(function(a) {
|
||||
for (a in { FAIL: 42 });
|
||||
return arguments[0];
|
||||
}() || "PASS");
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
issue_4696: {
|
||||
options = {
|
||||
arguments: true,
|
||||
keep_fargs: false,
|
||||
}
|
||||
input: {
|
||||
console.log(function() {
|
||||
for (arguments in [ 42 ]);
|
||||
for (var a in arguments[0])
|
||||
return "PASS";
|
||||
}());
|
||||
}
|
||||
expect: {
|
||||
console.log(function() {
|
||||
for (arguments in [ 42 ]);
|
||||
for (var a in arguments[0])
|
||||
return "PASS";
|
||||
}());
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
issue_4809: {
|
||||
options = {
|
||||
arguments: true,
|
||||
keep_fargs: false,
|
||||
reduce_vars: true,
|
||||
}
|
||||
input: {
|
||||
A = 0;
|
||||
(function() {
|
||||
arguments[A] = "PASS";
|
||||
console.log(arguments[0]);
|
||||
})();
|
||||
}
|
||||
expect: {
|
||||
A = 0;
|
||||
(function() {
|
||||
arguments[A] = "PASS";
|
||||
console.log(arguments[0]);
|
||||
})();
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
@@ -13,9 +13,10 @@ holes_and_undefined: {
|
||||
}
|
||||
}
|
||||
|
||||
constant_join: {
|
||||
constant_join_1: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
side_effects: true,
|
||||
strings: true,
|
||||
unsafe: true,
|
||||
}
|
||||
@@ -57,7 +58,7 @@ constant_join: {
|
||||
var c5 = [ boo() + bar() + "foo", 1, 2, 3, "bar", bar() + "foo" ].join();
|
||||
var c6 = [ "1,2,,,foo,bar", baz() ].join();
|
||||
var d = "foo-3bar-baz";
|
||||
var e = [].join(foo + bar);
|
||||
var e = (foo, bar, "");
|
||||
var f = "";
|
||||
var g = "";
|
||||
}
|
||||
@@ -354,3 +355,72 @@ constructor_good: {
|
||||
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"
|
||||
}
|
||||
|
||||
816
test/compress/arrows.js
Normal file
816
test/compress/arrows.js
Normal file
@@ -0,0 +1,816 @@
|
||||
no_funarg: {
|
||||
input: {
|
||||
(() => console.log(42))();
|
||||
}
|
||||
expect_exact: "(()=>console.log(42))();"
|
||||
expect_stdout: "42"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
single_funarg: {
|
||||
input: {
|
||||
(a => console.log(a))(42);
|
||||
}
|
||||
expect_exact: "(a=>console.log(a))(42);"
|
||||
expect_stdout: "42"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
multiple_funargs: {
|
||||
input: {
|
||||
((a, b) => console.log(a, b))("foo", "bar");
|
||||
}
|
||||
expect_exact: '((a,b)=>console.log(a,b))("foo","bar");'
|
||||
expect_stdout: "foo bar"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
destructured_funarg: {
|
||||
input: {
|
||||
(([ a, b, c ]) => console.log(a, b, c))("foo");
|
||||
}
|
||||
expect_exact: '(([a,b,c])=>console.log(a,b,c))("foo");'
|
||||
expect_stdout: "f o o"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
await_parentheses: {
|
||||
input: {
|
||||
async function f() {
|
||||
await (a => a);
|
||||
}
|
||||
}
|
||||
expect_exact: "async function f(){await(a=>a)}"
|
||||
}
|
||||
|
||||
for_parentheses_init: {
|
||||
input: {
|
||||
for (a => (a in a); console.log(42););
|
||||
}
|
||||
expect_exact: "for((a=>a in a);console.log(42););"
|
||||
expect_stdout: "42"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
for_parentheses_condition: {
|
||||
input: {
|
||||
for (console.log(42); a => (a in a);)
|
||||
break;
|
||||
}
|
||||
expect_exact: "for(console.log(42);a=>a in a;)break;"
|
||||
expect_stdout: "42"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
for_parentheses_step: {
|
||||
input: {
|
||||
for (; console.log(42); a => (a in a));
|
||||
}
|
||||
expect_exact: "for(;console.log(42);a=>a in a);"
|
||||
expect_stdout: "42"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
for_assign_parentheses_init: {
|
||||
input: {
|
||||
for (f = a => (a in a); console.log(42););
|
||||
}
|
||||
expect_exact: "for((f=a=>a in a);console.log(42););"
|
||||
expect_stdout: "42"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
for_assign_parentheses_condition: {
|
||||
input: {
|
||||
for (console.log(42); f = a => (a in a);)
|
||||
break;
|
||||
}
|
||||
expect_exact: "for(console.log(42);f=a=>a in a;)break;"
|
||||
expect_stdout: "42"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
for_assign_parentheses_step: {
|
||||
input: {
|
||||
for (; console.log(42); f = a => (a in a));
|
||||
}
|
||||
expect_exact: "for(;console.log(42);f=a=>a in a);"
|
||||
expect_stdout: "42"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
for_declaration_parentheses_init: {
|
||||
input: {
|
||||
for (var f = a => (a in a); console.log(42););
|
||||
}
|
||||
expect_exact: "for(var f=(a=>a in a);console.log(42););"
|
||||
expect_stdout: "42"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
for_statement_parentheses_init: {
|
||||
input: {
|
||||
for (a => {
|
||||
a in a;
|
||||
}; console.log(42););
|
||||
}
|
||||
expect_exact: "for(a=>{a in a};console.log(42););"
|
||||
expect_stdout: "42"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
body_call: {
|
||||
input: {
|
||||
(() => {
|
||||
console.log("foo");
|
||||
console.log("bar");
|
||||
})();
|
||||
}
|
||||
expect_exact: '(()=>{console.log("foo");console.log("bar")})();'
|
||||
expect_stdout: [
|
||||
"foo",
|
||||
"bar",
|
||||
]
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
body_conditional: {
|
||||
input: {
|
||||
console.log((a => {}) ? "PASS" : "FAIL");
|
||||
}
|
||||
expect_exact: 'console.log((a=>{})?"PASS":"FAIL");'
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
destructured_object_value: {
|
||||
input: {
|
||||
console.log((a => ({} = a))(42));
|
||||
}
|
||||
expect_exact: "console.log((a=>({}=a))(42));"
|
||||
expect_stdout: "42"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
function_value: {
|
||||
input: {
|
||||
console.log((a => function() {
|
||||
return a;
|
||||
})(42)());
|
||||
}
|
||||
expect_exact: "console.log((a=>function(){return a})(42)());"
|
||||
expect_stdout: "42"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
in_value: {
|
||||
input: {
|
||||
console.log((a => a in {
|
||||
foo: 42,
|
||||
})("foo"));
|
||||
}
|
||||
expect_exact: 'console.log((a=>a in{foo:42})("foo"));'
|
||||
expect_stdout: "true"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
object_value: {
|
||||
input: {
|
||||
console.log((() => ({
|
||||
4: 2,
|
||||
}))()[4]);
|
||||
}
|
||||
expect_exact: "console.log((()=>({4:2}))()[4]);"
|
||||
expect_stdout: "2"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
object_first_in_value: {
|
||||
input: {
|
||||
console.log((a => ({
|
||||
p: a,
|
||||
}.p ? "FAIL" : "PASS"))());
|
||||
}
|
||||
expect_exact: 'console.log((a=>({p:a}).p?"FAIL":"PASS")());'
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
sequence_value: {
|
||||
input: {
|
||||
console.log((a => (console.log("foo"), a))("bar"));
|
||||
}
|
||||
expect_exact: 'console.log((a=>(console.log("foo"),a))("bar"));'
|
||||
expect_stdout: [
|
||||
"foo",
|
||||
"bar",
|
||||
]
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
side_effects_value: {
|
||||
options = {
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
console.log((a => function() {
|
||||
return a;
|
||||
})(42)());
|
||||
}
|
||||
expect: {
|
||||
console.log((a => function() {
|
||||
return a;
|
||||
})(42)());
|
||||
}
|
||||
expect_stdout: "42"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
arrow_property: {
|
||||
input: {
|
||||
console.log((a => 42).prototype);
|
||||
}
|
||||
expect_exact: "console.log((a=>42).prototype);"
|
||||
expect_stdout: "undefined"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
assign_arrow: {
|
||||
input: {
|
||||
var f = a => a;
|
||||
console.log(f(42));
|
||||
}
|
||||
expect_exact: "var f=a=>a;console.log(f(42));"
|
||||
expect_stdout: "42"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
binary_arrow: {
|
||||
input: {
|
||||
console.log(4 || (() => 2));
|
||||
}
|
||||
expect_exact: "console.log(4||(()=>2));"
|
||||
expect_stdout: "4"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
unary_arrow: {
|
||||
input: {
|
||||
console.log(+(() => 42));
|
||||
}
|
||||
expect_exact: "console.log(+(()=>42));"
|
||||
expect_stdout: "NaN"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
trailing_comma: {
|
||||
input: {
|
||||
((a,) => console.log(a))(42);
|
||||
}
|
||||
expect_exact: "(a=>console.log(a))(42);"
|
||||
expect_stdout: "42"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
drop_arguments: {
|
||||
options = {
|
||||
arguments: true,
|
||||
keep_fargs: false,
|
||||
reduce_vars: true,
|
||||
}
|
||||
input: {
|
||||
console.log(function() {
|
||||
return () => arguments[0];
|
||||
}("PASS")("FAIL"));
|
||||
}
|
||||
expect: {
|
||||
console.log(function(argument_0) {
|
||||
return () => argument_0;
|
||||
}("PASS")("FAIL"));
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
funarg_arguments: {
|
||||
options = {
|
||||
inline: true,
|
||||
}
|
||||
input: {
|
||||
console.log((arguments => arguments)(42));
|
||||
}
|
||||
expect: {
|
||||
console.log(42);
|
||||
}
|
||||
expect_stdout: "42"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
inline_arguments: {
|
||||
options = {
|
||||
inline: true,
|
||||
}
|
||||
input: {
|
||||
console.log(function() {
|
||||
return () => arguments[0];
|
||||
}("PASS")("FAIL"));
|
||||
}
|
||||
expect: {
|
||||
console.log(function() {
|
||||
return () => arguments[0];
|
||||
}("PASS")("FAIL"));
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
var_arguments: {
|
||||
options = {
|
||||
inline: true,
|
||||
properties: true,
|
||||
reduce_vars: true,
|
||||
side_effects: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
console.log(function() {
|
||||
return () => {
|
||||
var arguments = [ "PASS" ];
|
||||
return arguments;
|
||||
};
|
||||
}("FAIL 1")("FAIL 2")[0]);
|
||||
}
|
||||
expect: {
|
||||
console.log("PASS");
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
negate: {
|
||||
options = {
|
||||
conditionals: true,
|
||||
}
|
||||
input: {
|
||||
if (!console ? 0 : () => 1)
|
||||
console.log("PASS");
|
||||
}
|
||||
expect: {
|
||||
(console ? () => 1 : 0) && console.log("PASS");
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
inline_this: {
|
||||
options = {
|
||||
inline: true,
|
||||
}
|
||||
input: {
|
||||
var o = {
|
||||
p: function() {
|
||||
return function() {
|
||||
return () => this.q;
|
||||
}();
|
||||
},
|
||||
q: "FAIL",
|
||||
};
|
||||
q = "PASS";
|
||||
console.log(o.p()());
|
||||
}
|
||||
expect: {
|
||||
var o = {
|
||||
p: function() {
|
||||
return function() {
|
||||
return () => this.q;
|
||||
}();
|
||||
},
|
||||
q: "FAIL",
|
||||
};
|
||||
q = "PASS";
|
||||
console.log(o.p()());
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
trim_body: {
|
||||
options = {
|
||||
arrows: true,
|
||||
if_return: true,
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
var f = a => {
|
||||
return a;
|
||||
};
|
||||
var g = b => void b;
|
||||
console.log(f("PASS"), g("FAIL"));
|
||||
}
|
||||
expect: {
|
||||
var f = a => a;
|
||||
var g = b => {};
|
||||
console.log(f("PASS"), g("FAIL"));
|
||||
}
|
||||
expect_stdout: "PASS undefined"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
collapse_value: {
|
||||
options = {
|
||||
arrows: true,
|
||||
collapse_vars: true,
|
||||
keep_fargs: false,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
var a = 42;
|
||||
console.log((b => Math.floor(b))(a));
|
||||
}
|
||||
expect: {
|
||||
var a = 42;
|
||||
console.log((() => Math.floor(a))());
|
||||
}
|
||||
expect_stdout: "42"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
collapse_property_lambda: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
pure_getters: "strict",
|
||||
}
|
||||
input: {
|
||||
console.log(function f() {
|
||||
f.g = () => 42;
|
||||
return f.g();
|
||||
}());
|
||||
}
|
||||
expect: {
|
||||
console.log(function f() {
|
||||
return (f.g = () => 42)();
|
||||
}());
|
||||
}
|
||||
expect_stdout: "42"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
drop_return: {
|
||||
options = {
|
||||
arrows: true,
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
(a => {
|
||||
while (!console);
|
||||
return console.log(a);
|
||||
})(42);
|
||||
}
|
||||
expect: {
|
||||
(a => {
|
||||
while (!console);
|
||||
console.log(a);
|
||||
})(42);
|
||||
}
|
||||
expect_stdout: "42"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
drop_value: {
|
||||
options = {
|
||||
arrows: true,
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
((a, b) => a + b)(console.log(42));
|
||||
}
|
||||
expect: {
|
||||
((a, b) => {})(console.log(42));
|
||||
}
|
||||
expect_stdout: "42"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
reduce_iife_1: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
keep_fargs: false,
|
||||
reduce_vars: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
(a => console.log(a + a))(21);
|
||||
}
|
||||
expect: {
|
||||
(() => console.log(42))();
|
||||
}
|
||||
expect_stdout: "42"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
reduce_iife_2: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
reduce_vars: true,
|
||||
toplevel: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
var a = 21;
|
||||
(() => console.log(a + a))();
|
||||
}
|
||||
expect: {
|
||||
(() => console.log(42))();
|
||||
}
|
||||
expect_stdout: "42"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
reduce_iife_3: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
reduce_vars: true,
|
||||
side_effects: true,
|
||||
toplevel: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
var a = "foo";
|
||||
(() => {
|
||||
console.log(a);
|
||||
console.log(a);
|
||||
})();
|
||||
a = "bar";
|
||||
}
|
||||
expect: {
|
||||
(() => {
|
||||
console.log("foo");
|
||||
console.log("foo");
|
||||
})();
|
||||
}
|
||||
expect_stdout: [
|
||||
"foo",
|
||||
"foo",
|
||||
]
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
single_use_recursive: {
|
||||
options = {
|
||||
reduce_vars: true,
|
||||
toplevel: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
function f() {
|
||||
return (() => f)();
|
||||
}
|
||||
console.log(typeof f());
|
||||
}
|
||||
expect: {
|
||||
console.log(typeof function f() {
|
||||
return (() => f)();
|
||||
}());
|
||||
}
|
||||
expect_stdout: "function"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
issue_4388: {
|
||||
options = {
|
||||
inline: true,
|
||||
toplevel: true,
|
||||
}
|
||||
input: {
|
||||
(arguments => console.log(arguments && arguments))();
|
||||
}
|
||||
expect: {
|
||||
(arguments => console.log(arguments && arguments))();
|
||||
}
|
||||
expect_stdout: "undefined"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
issue_4390: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
}
|
||||
input: {
|
||||
function log() {
|
||||
console.log.apply(console, arguments);
|
||||
}
|
||||
var a = 42, b = "FAIL";
|
||||
b = "PASS";
|
||||
(c => log(b, c))(a);
|
||||
log(b);
|
||||
}
|
||||
expect: {
|
||||
function log() {
|
||||
console.log.apply(console, arguments);
|
||||
}
|
||||
var a = 42, b = "FAIL";
|
||||
b = "PASS";
|
||||
(c => log(b, c))(a);
|
||||
log(b);
|
||||
}
|
||||
expect_stdout: [
|
||||
"PASS 42",
|
||||
"PASS",
|
||||
]
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
issue_4401: {
|
||||
options = {
|
||||
merge_vars: true,
|
||||
}
|
||||
input: {
|
||||
(function() {
|
||||
var a = (b => b(a))(console.log || a);
|
||||
var c = console.log;
|
||||
c && c(typeof b);
|
||||
})();
|
||||
}
|
||||
expect: {
|
||||
(function() {
|
||||
var a = (b => b(a))(console.log || a);
|
||||
var c = console.log;
|
||||
c && c(typeof b);
|
||||
})();
|
||||
}
|
||||
expect_stdout: [
|
||||
"undefined",
|
||||
"undefined",
|
||||
]
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
issue_4448: {
|
||||
options = {
|
||||
pure_getters: "strict",
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
var A;
|
||||
try {
|
||||
(arguments => {
|
||||
arguments[0];
|
||||
})(A);
|
||||
} catch (e) {
|
||||
console.log("PASS");
|
||||
}
|
||||
}
|
||||
expect: {
|
||||
var A;
|
||||
try {
|
||||
(arguments => {
|
||||
arguments[0];
|
||||
})(A);
|
||||
} catch (e) {
|
||||
console.log("PASS");
|
||||
}
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
issue_4476: {
|
||||
options = {
|
||||
arguments: true,
|
||||
}
|
||||
input: {
|
||||
(function(a, b) {
|
||||
(a => {
|
||||
console.log(arguments[0], a);
|
||||
})(b);
|
||||
})("foo", "bar");
|
||||
}
|
||||
expect: {
|
||||
(function(a, b) {
|
||||
(a => {
|
||||
console.log(arguments[0], a);
|
||||
})(b);
|
||||
})("foo", "bar");
|
||||
}
|
||||
expect_stdout: "foo bar"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
issue_4666: {
|
||||
input: {
|
||||
console.log((a => /[0-9]/.test(a))(42));
|
||||
}
|
||||
expect_exact: "console.log((a=>/[0-9]/.test(a))(42));"
|
||||
expect_stdout: "true"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
issue_4685_1: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
new function(f) {
|
||||
if (f() !== this)
|
||||
console.log("PASS");
|
||||
}(() => this);
|
||||
}
|
||||
expect: {
|
||||
new function(f) {
|
||||
if (f() !== this)
|
||||
console.log("PASS");
|
||||
}(() => this);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
issue_4685_2: {
|
||||
options = {
|
||||
reduce_vars: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
new function(f) {
|
||||
if (f() !== this)
|
||||
console.log("PASS");
|
||||
}(() => {
|
||||
if (console)
|
||||
return this;
|
||||
});
|
||||
}
|
||||
expect: {
|
||||
new function(f) {
|
||||
if (f() !== this)
|
||||
console.log("PASS");
|
||||
}(() => {
|
||||
if (console)
|
||||
return this;
|
||||
});
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
issue_4687_1: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
new function() {
|
||||
console.log(function(f) {
|
||||
return f() === this;
|
||||
}(() => this) || "PASS");
|
||||
}
|
||||
}
|
||||
expect: {
|
||||
new function() {
|
||||
console.log(function(f) {
|
||||
return f() === this;
|
||||
}(() => this) || "PASS");
|
||||
}
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
issue_4687_2: {
|
||||
options = {
|
||||
reduce_vars: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
new function() {
|
||||
console.log(function(f) {
|
||||
return f() === this;
|
||||
}(() => {
|
||||
if (console)
|
||||
return this;
|
||||
}) || "PASS");
|
||||
}
|
||||
}
|
||||
expect: {
|
||||
new function() {
|
||||
console.log(function(f) {
|
||||
return f() === this;
|
||||
}(() => {
|
||||
if (console)
|
||||
return this;
|
||||
}) || "PASS");
|
||||
}
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
issue_4772: {
|
||||
input: {
|
||||
var f = a => (a)
|
||||
/**/ console.log(f("PASS"));
|
||||
}
|
||||
expect_exact: 'var f=a=>a;console.log(f("PASS"));'
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
@@ -461,3 +461,243 @@ issue_3949_2: {
|
||||
}
|
||||
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: {
|
||||
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_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"
|
||||
}
|
||||
|
||||
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: {
|
||||
A = "FAIL";
|
||||
var a = A, 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"
|
||||
}
|
||||
|
||||
1533
test/compress/awaits.js
Normal file
1533
test/compress/awaits.js
Normal file
File diff suppressed because it is too large
Load Diff
92
test/compress/bigint.js
Normal file
92
test/compress/bigint.js
Normal file
@@ -0,0 +1,92 @@
|
||||
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"
|
||||
}
|
||||
|
||||
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"
|
||||
}
|
||||
|
||||
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"
|
||||
}
|
||||
|
||||
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"
|
||||
}
|
||||
|
||||
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"
|
||||
}
|
||||
|
||||
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"
|
||||
}
|
||||
@@ -153,3 +153,31 @@ issue_3690: {
|
||||
}
|
||||
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"
|
||||
}
|
||||
|
||||
1565
test/compress/classes.js
Normal file
1565
test/compress/classes.js
Normal file
File diff suppressed because it is too large
Load Diff
@@ -958,8 +958,7 @@ collapse_vars_misc: {
|
||||
}
|
||||
expect: {
|
||||
function f0(o, a, h) {
|
||||
var b = 3 - a;
|
||||
return o.run(b)[7] = h;
|
||||
return o.run(3 - a)[7] = h;
|
||||
}
|
||||
function f1(x) { return 5 - x }
|
||||
function f2(x) { return foo() / (5 - x) }
|
||||
@@ -2276,8 +2275,8 @@ var_defs: {
|
||||
}
|
||||
expect: {
|
||||
var f1 = function(x, y) {
|
||||
var r = x + y, z = r * r - r, b = 7;
|
||||
console.log(z + b);
|
||||
var r = x + y;
|
||||
console.log(r * r - r + 7);
|
||||
};
|
||||
f1("1", 0);
|
||||
}
|
||||
@@ -2869,7 +2868,7 @@ lvalues_def: {
|
||||
expect_stdout: true
|
||||
}
|
||||
|
||||
compound_assignment: {
|
||||
compound_assignment_1: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
}
|
||||
@@ -2888,6 +2887,23 @@ compound_assignment: {
|
||||
expect_stdout: "4"
|
||||
}
|
||||
|
||||
compound_assignment_2: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
}
|
||||
input: {
|
||||
var a;
|
||||
a = 1;
|
||||
for (a += a + 2; console.log(a););
|
||||
}
|
||||
expect: {
|
||||
var a;
|
||||
a = 1;
|
||||
for (a += a + 2; console.log(a););
|
||||
}
|
||||
expect_stdout: "4"
|
||||
}
|
||||
|
||||
issue_2187_1: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
@@ -2907,8 +2923,7 @@ issue_2187_1: {
|
||||
var a = 1;
|
||||
!function(foo) {
|
||||
foo();
|
||||
var a = 2;
|
||||
console.log(a);
|
||||
console.log(2);
|
||||
}(function() {
|
||||
console.log(a);
|
||||
});
|
||||
@@ -3145,8 +3160,8 @@ issue_2313_2: {
|
||||
var c = 0;
|
||||
!function a() {
|
||||
a && c++;
|
||||
var a = 0;
|
||||
a && c++;
|
||||
var a;
|
||||
(a = 0) && c++;
|
||||
}();
|
||||
console.log(c);
|
||||
}
|
||||
@@ -4273,8 +4288,8 @@ issue_2436_14: {
|
||||
var b = {};
|
||||
(function() {
|
||||
a && function(c, d) {
|
||||
console.log(c, d);
|
||||
}(b, a);
|
||||
console.log(b, d);
|
||||
}(0, a);
|
||||
})();
|
||||
}
|
||||
expect_stdout: true
|
||||
@@ -5502,8 +5517,7 @@ collapse_rhs_lhs_2: {
|
||||
expect: {
|
||||
var b = 1;
|
||||
(function f(f) {
|
||||
f = b;
|
||||
f[b] = 0;
|
||||
b[b] = 0;
|
||||
})();
|
||||
console.log("PASS");
|
||||
}
|
||||
@@ -5609,6 +5623,7 @@ collapse_rhs_array: {
|
||||
collapse_rhs_boolean_1: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
evaluate: true,
|
||||
}
|
||||
input: {
|
||||
var a, b;
|
||||
@@ -5634,6 +5649,7 @@ collapse_rhs_boolean_1: {
|
||||
collapse_rhs_boolean_2: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
evaluate: true,
|
||||
}
|
||||
input: {
|
||||
var a;
|
||||
@@ -5668,6 +5684,7 @@ collapse_rhs_boolean_3: {
|
||||
booleans: true,
|
||||
collapse_vars: true,
|
||||
conditionals: true,
|
||||
evaluate: true,
|
||||
}
|
||||
input: {
|
||||
var a, f, g, h, i, n, s, t, x, y;
|
||||
@@ -5721,6 +5738,7 @@ collapse_rhs_function: {
|
||||
collapse_rhs_number: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
evaluate: true,
|
||||
}
|
||||
input: {
|
||||
var a, b;
|
||||
@@ -5800,6 +5818,7 @@ collapse_rhs_regexp: {
|
||||
collapse_rhs_string: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
evaluate: true,
|
||||
}
|
||||
input: {
|
||||
var a, b;
|
||||
@@ -5875,6 +5894,7 @@ collapse_rhs_this: {
|
||||
collapse_rhs_undefined: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
var a, b;
|
||||
@@ -5996,7 +6016,7 @@ issue_3215_1: {
|
||||
}());
|
||||
}
|
||||
expect: {
|
||||
console.log(typeof 42);
|
||||
console.log("number");
|
||||
}
|
||||
expect_stdout: "number"
|
||||
}
|
||||
@@ -6956,8 +6976,7 @@ sequence_in_iife_2: {
|
||||
}
|
||||
expect: {
|
||||
var a = "foo", b = 42;
|
||||
b = a;
|
||||
console.log(a, b);
|
||||
console.log(a, b = a);
|
||||
}
|
||||
expect_stdout: "foo foo"
|
||||
}
|
||||
@@ -8045,6 +8064,67 @@ mangleable_var: {
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
mangleable_assignment_1: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
var o = {
|
||||
p: function() {
|
||||
return 6;
|
||||
},
|
||||
};
|
||||
(function() {
|
||||
var a, b = a = o.p();
|
||||
console.log(a * (b / a + b));
|
||||
})();
|
||||
}
|
||||
expect: {
|
||||
var o = {
|
||||
p: function() {
|
||||
return 6;
|
||||
},
|
||||
};
|
||||
(function() {
|
||||
var a;
|
||||
a = o.p();
|
||||
console.log(a * (a / a + a));
|
||||
})();
|
||||
}
|
||||
expect_stdout: "42"
|
||||
}
|
||||
|
||||
mangleable_assignment_2: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
var o = {
|
||||
p: function() {
|
||||
return 6;
|
||||
},
|
||||
};
|
||||
(function(a, b) {
|
||||
b = a = o.p();
|
||||
console.log(a * (b / a + b));
|
||||
})();
|
||||
}
|
||||
expect: {
|
||||
var o = {
|
||||
p: function() {
|
||||
return 6;
|
||||
},
|
||||
};
|
||||
(function(a, b) {
|
||||
a = o.p();
|
||||
console.log(a * (a / a + a));
|
||||
})();
|
||||
}
|
||||
expect_stdout: "42"
|
||||
}
|
||||
|
||||
issue_3884_1: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
@@ -8602,3 +8682,378 @@ issue_4248: {
|
||||
}
|
||||
expect_stdout: "1"
|
||||
}
|
||||
|
||||
issue_4430_1: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
pure_getters: "strict",
|
||||
}
|
||||
input: {
|
||||
function f(a) {
|
||||
switch (a = 1, arguments[0]) {
|
||||
case 1:
|
||||
return "PASS";
|
||||
case 2:
|
||||
return "FAIL";
|
||||
}
|
||||
}
|
||||
console.log(f(2));
|
||||
}
|
||||
expect: {
|
||||
function f(a) {
|
||||
switch (a = 1, arguments[0]) {
|
||||
case 1:
|
||||
return "PASS";
|
||||
case 2:
|
||||
return "FAIL";
|
||||
}
|
||||
}
|
||||
console.log(f(2));
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
issue_4430_2: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
pure_getters: "strict",
|
||||
}
|
||||
input: {
|
||||
function f(a) {
|
||||
switch (a = 0, arguments[0]) {
|
||||
case 0:
|
||||
return "PASS";
|
||||
case 1:
|
||||
return "FAIL";
|
||||
}
|
||||
}
|
||||
console.log(f(1));
|
||||
}
|
||||
expect: {
|
||||
function f(a) {
|
||||
switch (arguments[a = 0]) {
|
||||
case 0:
|
||||
return "PASS";
|
||||
case 1:
|
||||
return "FAIL";
|
||||
}
|
||||
}
|
||||
console.log(f(1));
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
collapse_and_assign: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
}
|
||||
input: {
|
||||
var log = console.log;
|
||||
var a = {
|
||||
p: "PASS",
|
||||
};
|
||||
console && (a = a.p);
|
||||
log(a);
|
||||
}
|
||||
expect: {
|
||||
var log = console.log;
|
||||
var a = {
|
||||
p: "PASS",
|
||||
};
|
||||
log(a = console ? a.p : a);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
collapse_or_assign: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
}
|
||||
input: {
|
||||
var log = console.log;
|
||||
var a = {
|
||||
p: "PASS",
|
||||
};
|
||||
a.q || (a = a.p);
|
||||
log(a);
|
||||
}
|
||||
expect: {
|
||||
var log = console.log;
|
||||
var a = {
|
||||
p: "PASS",
|
||||
};
|
||||
log(a = !a.q ? a.p : a);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
issue_4586_1: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
}
|
||||
input: {
|
||||
var a = 42;
|
||||
(function f(b) {
|
||||
var b = a;
|
||||
if (b === arguments[0])
|
||||
console.log("PASS");
|
||||
})(console);
|
||||
}
|
||||
expect: {
|
||||
var a = 42;
|
||||
(function f(b) {
|
||||
var b = a;
|
||||
if (b === arguments[0])
|
||||
console.log("PASS");
|
||||
})(console);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
issue_4586_2: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
}
|
||||
input: {
|
||||
var a = 42;
|
||||
(function f(b) {
|
||||
b = a;
|
||||
if (b === arguments[0])
|
||||
console.log("PASS");
|
||||
})(console);
|
||||
}
|
||||
expect: {
|
||||
var a = 42;
|
||||
(function f(b) {
|
||||
if ((b = a) === arguments[0])
|
||||
console.log("PASS");
|
||||
})(console);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
issue_4732_1: {
|
||||
options = {
|
||||
booleans: true,
|
||||
collapse_vars: true,
|
||||
evaluate: true,
|
||||
reduce_vars: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
var a = 0;
|
||||
(function(b) {
|
||||
var b = a++;
|
||||
var c = b ? b && console.log("PASS") : 0;
|
||||
})(a++);
|
||||
}
|
||||
expect: {
|
||||
var a = 0;
|
||||
(function(b) {
|
||||
(b = a++) && (b && console.log("PASS"));
|
||||
})(a++);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
issue_4732_2: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
conditionals: true,
|
||||
evaluate: true,
|
||||
reduce_vars: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
var a = 0;
|
||||
(function(b) {
|
||||
var b = a++;
|
||||
var c = b ? b && console.log("PASS") : 0;
|
||||
})(a++);
|
||||
}
|
||||
expect: {
|
||||
var a = 0;
|
||||
(function(b) {
|
||||
(b = a++) && b && console.log("PASS");
|
||||
})(a++);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
dot_in_try: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
}
|
||||
input: {
|
||||
var o, a = 6, b = 7, c;
|
||||
try {
|
||||
c = a * b;
|
||||
o.p(c);
|
||||
} catch (e) {
|
||||
console.log(c);
|
||||
}
|
||||
}
|
||||
expect: {
|
||||
var o, a = 6, b = 7, c;
|
||||
try {
|
||||
c = a * b;
|
||||
o.p(c);
|
||||
} catch (e) {
|
||||
console.log(c);
|
||||
}
|
||||
}
|
||||
expect_stdout: "42"
|
||||
}
|
||||
|
||||
dot_non_local: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
}
|
||||
input: {
|
||||
var o, a = 6, b = 7, c;
|
||||
function f() {
|
||||
c = a * b;
|
||||
o.p(c);
|
||||
}
|
||||
try {
|
||||
f();
|
||||
} catch (e) {
|
||||
console.log(c);
|
||||
}
|
||||
}
|
||||
expect: {
|
||||
var o, a = 6, b = 7, c;
|
||||
function f() {
|
||||
c = a * b;
|
||||
o.p(c);
|
||||
}
|
||||
try {
|
||||
f();
|
||||
} catch (e) {
|
||||
console.log(c);
|
||||
}
|
||||
}
|
||||
expect_stdout: "42"
|
||||
}
|
||||
|
||||
issue_4806: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
}
|
||||
input: {
|
||||
var a, o = {
|
||||
f: function() {
|
||||
console.log(this === o ? "FAIL" : "PASS");
|
||||
},
|
||||
};
|
||||
(a = 42, o.f)(42);
|
||||
}
|
||||
expect: {
|
||||
var a, o = {
|
||||
f: function() {
|
||||
console.log(this === o ? "FAIL" : "PASS");
|
||||
},
|
||||
};
|
||||
(0, o.f)(a = 42);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
issue_4852: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
}
|
||||
input: {
|
||||
var a = "PASS";
|
||||
(function(b) {
|
||||
switch (b = a) {
|
||||
case 42:
|
||||
try {
|
||||
console;
|
||||
} catch (b) {
|
||||
b.p;
|
||||
}
|
||||
case console.log(b):
|
||||
}
|
||||
})("FAIL");
|
||||
}
|
||||
expect: {
|
||||
var a = "PASS";
|
||||
(function(b) {
|
||||
switch (a) {
|
||||
case 42:
|
||||
try {
|
||||
console;
|
||||
} catch (b) {
|
||||
b.p;
|
||||
}
|
||||
case console.log(a):
|
||||
}
|
||||
})("FAIL");
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
issue_4865: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
}
|
||||
input: {
|
||||
var NaN;
|
||||
var a = NaN = "PASS";
|
||||
console.log(a, NaN);
|
||||
}
|
||||
expect: {
|
||||
var NaN;
|
||||
var a = NaN = "PASS";
|
||||
console.log(a, NaN);
|
||||
}
|
||||
expect_stdout: true
|
||||
}
|
||||
|
||||
issue_4868: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
var a;
|
||||
(function(b) {
|
||||
console.log(b[0]);
|
||||
})(a = [ "PASS" ], a = [ "FAIL" ]);
|
||||
}
|
||||
expect: {
|
||||
var a;
|
||||
(function(b) {
|
||||
console.log(b[0]);
|
||||
})(a = [ "PASS" ], a = [ "FAIL" ]);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
issue_4874: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
evaluate: true,
|
||||
reduce_vars: true,
|
||||
toplevel: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
var a;
|
||||
a = null;
|
||||
(function(b) {
|
||||
for (var c in b = b && b[console.log("PASS")])
|
||||
console;
|
||||
})(a = 42);
|
||||
}
|
||||
expect: {
|
||||
var a;
|
||||
null;
|
||||
(function(b) {
|
||||
for (var c in a && a[console.log("PASS")])
|
||||
console;
|
||||
})(a = 42);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
@@ -1861,3 +1861,39 @@ issue_3808_2: {
|
||||
}
|
||||
expect_stdout: " PASS"
|
||||
}
|
||||
|
||||
object_super: {
|
||||
options = {
|
||||
conditionals: true,
|
||||
}
|
||||
input: {
|
||||
Object.setPrototypeOf({
|
||||
f(a) {
|
||||
a ? this.g("FAIL") : super.g("FAIL");
|
||||
},
|
||||
g(b) {
|
||||
console.log(b);
|
||||
},
|
||||
}, {
|
||||
g() {
|
||||
console.log("PASS");
|
||||
},
|
||||
}).f();
|
||||
}
|
||||
expect: {
|
||||
Object.setPrototypeOf({
|
||||
f(a) {
|
||||
a ? this.g("FAIL") : super.g("FAIL");
|
||||
},
|
||||
g(b) {
|
||||
console.log(b);
|
||||
},
|
||||
}, {
|
||||
g() {
|
||||
console.log("PASS");
|
||||
},
|
||||
}).f();
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
@@ -658,6 +658,30 @@ legacy_scope: {
|
||||
expect_stdout: true
|
||||
}
|
||||
|
||||
hoist_vars: {
|
||||
options = {
|
||||
hoist_vars: true,
|
||||
}
|
||||
input: {
|
||||
{
|
||||
const a = "FAIL";
|
||||
var b = 42;
|
||||
}
|
||||
var a = "PASS";
|
||||
console.log(a, b);
|
||||
}
|
||||
expect: {
|
||||
var b;
|
||||
{
|
||||
const a = "FAIL";
|
||||
b = 42;
|
||||
}
|
||||
var a = "PASS";
|
||||
console.log(a, b);
|
||||
}
|
||||
expect_stdout: true
|
||||
}
|
||||
|
||||
issue_4191: {
|
||||
options = {
|
||||
functions: true,
|
||||
@@ -1347,3 +1371,167 @@ issue_4305_2: {
|
||||
}
|
||||
expect_stdout: true
|
||||
}
|
||||
|
||||
issue_4365_1: {
|
||||
options = {
|
||||
toplevel: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
const arguments = 42;
|
||||
}
|
||||
expect: {
|
||||
const arguments = 42;
|
||||
}
|
||||
expect_stdout: true
|
||||
}
|
||||
|
||||
issue_4365_2: {
|
||||
options = {
|
||||
toplevel: true,
|
||||
varify: true,
|
||||
}
|
||||
input: {
|
||||
const arguments = 42;
|
||||
}
|
||||
expect: {
|
||||
const arguments = 42;
|
||||
}
|
||||
expect_stdout: true
|
||||
}
|
||||
|
||||
issue_4527: {
|
||||
mangle = {}
|
||||
input: {
|
||||
(function() {
|
||||
try {
|
||||
throw 1;
|
||||
} catch (a) {
|
||||
try {
|
||||
const a = FAIL;
|
||||
} finally {
|
||||
if (!b)
|
||||
return console.log("aaaa");
|
||||
}
|
||||
}
|
||||
var b;
|
||||
})();
|
||||
}
|
||||
expect: {
|
||||
(function() {
|
||||
try {
|
||||
throw 1;
|
||||
} catch (a) {
|
||||
try {
|
||||
const a = FAIL;
|
||||
} finally {
|
||||
if (!t)
|
||||
return console.log("aaaa");
|
||||
}
|
||||
}
|
||||
var t;
|
||||
})();
|
||||
}
|
||||
expect_stdout: "aaaa"
|
||||
}
|
||||
|
||||
issue_4689: {
|
||||
options = {
|
||||
sequences: true,
|
||||
}
|
||||
input: {
|
||||
"use strict";
|
||||
var a = "PASS";
|
||||
console.log(a);
|
||||
for (const a in 42);
|
||||
}
|
||||
expect: {
|
||||
"use strict";
|
||||
var a = "PASS";
|
||||
console.log(a);
|
||||
for (const a in 42);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
issue_4691: {
|
||||
options = {
|
||||
if_return: true,
|
||||
toplevel: true,
|
||||
}
|
||||
input: {
|
||||
function A() {}
|
||||
A.prototype.f = function() {
|
||||
if (!this)
|
||||
return;
|
||||
const a = "PA";
|
||||
function g(b) {
|
||||
h(a + b);
|
||||
}
|
||||
[ "SS" ].forEach(function(c) {
|
||||
g(c);
|
||||
});
|
||||
};
|
||||
function h(d) {
|
||||
console.log(d);
|
||||
}
|
||||
new A().f();
|
||||
}
|
||||
expect: {
|
||||
function A() {}
|
||||
A.prototype.f = function() {
|
||||
if (this) {
|
||||
const a = "PA";
|
||||
[ "SS" ].forEach(function(c) {
|
||||
g(c);
|
||||
});
|
||||
function g(b) {
|
||||
h(a + b);
|
||||
}
|
||||
}
|
||||
};
|
||||
function h(d) {
|
||||
console.log(d);
|
||||
}
|
||||
new A().f();
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
issue_4848: {
|
||||
options = {
|
||||
if_return: true,
|
||||
}
|
||||
input: {
|
||||
function f(a) {
|
||||
a(function() {
|
||||
console.log(b);
|
||||
});
|
||||
if (!console)
|
||||
return;
|
||||
const b = "PASS";
|
||||
}
|
||||
var g;
|
||||
f(function(h) {
|
||||
g = h;
|
||||
});
|
||||
g();
|
||||
}
|
||||
expect: {
|
||||
function f(a) {
|
||||
a(function() {
|
||||
console.log(b);
|
||||
});
|
||||
if (!console)
|
||||
return;
|
||||
const b = "PASS";
|
||||
}
|
||||
var g;
|
||||
f(function(h) {
|
||||
g = h;
|
||||
});
|
||||
g();
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
@@ -53,8 +53,10 @@ dead_code_2_should_warn: {
|
||||
g();
|
||||
x = 10;
|
||||
throw new Error("foo");
|
||||
var x;
|
||||
function g(){};
|
||||
{
|
||||
var x;
|
||||
function g(){};
|
||||
}
|
||||
}
|
||||
f();
|
||||
}
|
||||
@@ -62,7 +64,6 @@ dead_code_2_should_warn: {
|
||||
expect_warnings: [
|
||||
"WARN: Dropping unreachable code [test/compress/dead-code.js:8,12]",
|
||||
]
|
||||
node_version: "<=4"
|
||||
}
|
||||
|
||||
dead_code_constant_boolean_should_warn_more: {
|
||||
@@ -88,8 +89,10 @@ dead_code_constant_boolean_should_warn_more: {
|
||||
bar();
|
||||
}
|
||||
expect: {
|
||||
var foo;
|
||||
function bar() {}
|
||||
{
|
||||
var foo;
|
||||
function bar() {}
|
||||
}
|
||||
// nothing for the while
|
||||
// as for the for, it should keep:
|
||||
var x = 10, y;
|
||||
@@ -725,7 +728,7 @@ issue_2749: {
|
||||
expect: {
|
||||
var a = 2, c = "PASS";
|
||||
while (a--)
|
||||
b = void 0, b ? c = "FAIL" : b = 1;
|
||||
b = void 0, b ? c = "FAIL" : 1;
|
||||
var b;
|
||||
console.log(c);
|
||||
}
|
||||
@@ -1375,3 +1378,45 @@ issue_4051: {
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
issue_4366: {
|
||||
options = {
|
||||
dead_code: true,
|
||||
}
|
||||
input: {
|
||||
function f() {
|
||||
return "PASS";
|
||||
({
|
||||
p: 42,
|
||||
get p() {},
|
||||
});
|
||||
}
|
||||
console.log(f());
|
||||
}
|
||||
expect: {
|
||||
function f() {
|
||||
return "PASS";
|
||||
}
|
||||
console.log(f());
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
issue_4570: {
|
||||
options = {
|
||||
dead_code: true,
|
||||
inline: true,
|
||||
}
|
||||
input: {
|
||||
var a = function(b) {
|
||||
return a += b;
|
||||
}() ? 0 : a;
|
||||
console.log(a);
|
||||
}
|
||||
expect: {
|
||||
var a = (a += void 0) ? 0 : a;
|
||||
console.log(a);
|
||||
}
|
||||
expect_stdout: "NaN"
|
||||
}
|
||||
|
||||
1705
test/compress/default-values.js
Normal file
1705
test/compress/default-values.js
Normal file
File diff suppressed because it is too large
Load Diff
@@ -40,7 +40,7 @@ redefine_arguments_2: {
|
||||
|
||||
redefine_arguments_3: {
|
||||
options = {
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
@@ -188,7 +188,7 @@ funarg_side_effects_1: {
|
||||
}
|
||||
expect: {
|
||||
try {
|
||||
(function({}) {})();
|
||||
[ {} ] = [];
|
||||
} catch (e) {
|
||||
console.log("PASS");
|
||||
}
|
||||
@@ -259,7 +259,7 @@ funarg_side_effects_3: {
|
||||
|
||||
funarg_unused_1: {
|
||||
options = {
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
@@ -318,7 +318,7 @@ funarg_unused_3: {
|
||||
|
||||
funarg_unused_4: {
|
||||
options = {
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
pure_getters: "strict",
|
||||
unused: true,
|
||||
}
|
||||
@@ -384,7 +384,7 @@ funarg_unused_6_inline: {
|
||||
|
||||
funarg_unused_6_keep_fargs: {
|
||||
options = {
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
@@ -426,7 +426,7 @@ funarg_collapse_vars_1: {
|
||||
funarg_collapse_vars_2: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
@@ -505,7 +505,7 @@ funarg_reduce_vars_1: {
|
||||
funarg_reduce_vars_2: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
pure_getters: "strict",
|
||||
reduce_vars: true,
|
||||
unsafe: true,
|
||||
@@ -682,7 +682,7 @@ funarg_inline: {
|
||||
}
|
||||
expect: {
|
||||
try {
|
||||
(function({}) {})();
|
||||
[ {} ] = [];
|
||||
} catch (e) {
|
||||
console.log("PASS");
|
||||
}
|
||||
@@ -691,6 +691,28 @@ funarg_inline: {
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
process_boolean_returns: {
|
||||
options = {
|
||||
booleans: true,
|
||||
}
|
||||
input: {
|
||||
console.log(function({ length }) {
|
||||
return length ? "FAIL" : "PASS";
|
||||
}(function() {
|
||||
return 42;
|
||||
}));
|
||||
}
|
||||
expect: {
|
||||
console.log(function({ length }) {
|
||||
return length ? "FAIL" : "PASS";
|
||||
}(function() {
|
||||
return 42;
|
||||
}));
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
simple_const: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
@@ -750,6 +772,46 @@ simple_var: {
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
drop_catch: {
|
||||
options = {
|
||||
dead_code: true,
|
||||
}
|
||||
input: {
|
||||
try {} catch ({
|
||||
[console.log("FAIL")]: e,
|
||||
}) {} finally {
|
||||
console.log("PASS");
|
||||
}
|
||||
}
|
||||
expect: {
|
||||
console.log("PASS");
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
drop_catch_var: {
|
||||
options = {
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
try {
|
||||
throw new Error("PASS");
|
||||
} catch ({ name, message }) {
|
||||
console.log(message);
|
||||
}
|
||||
}
|
||||
expect: {
|
||||
try {
|
||||
throw new Error("PASS");
|
||||
} catch ({ message }) {
|
||||
console.log(message);
|
||||
}
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
collapse_vars_1: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
@@ -1061,7 +1123,7 @@ join_vars: {
|
||||
|
||||
keep_fargs: {
|
||||
options = {
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
@@ -1296,6 +1358,24 @@ fn_name_unused: {
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
hoist_vars: {
|
||||
options = {
|
||||
hoist_vars: true,
|
||||
}
|
||||
input: {
|
||||
var a = "PASS";
|
||||
var [ b ] = [ 42 ];
|
||||
console.log(a, b);
|
||||
}
|
||||
expect: {
|
||||
var a = "PASS";
|
||||
var [ b ] = [ 42 ];
|
||||
console.log(a, b);
|
||||
}
|
||||
expect_stdout: "PASS 42"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
issue_4280: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
@@ -1638,10 +1718,14 @@ issue_4312: {
|
||||
expect: {
|
||||
var a;
|
||||
b = "PASS",
|
||||
(function({
|
||||
[a = b]: d,
|
||||
}){})((c = "FAIL") && c);
|
||||
var b, c;
|
||||
c = "FAIL",
|
||||
[
|
||||
{
|
||||
[a = b]: d,
|
||||
},
|
||||
] = [ c && c ],
|
||||
void 0;
|
||||
var b, c, d;
|
||||
console.log(a);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
@@ -1703,9 +1787,7 @@ issue_4319: {
|
||||
function f(a) {
|
||||
while (!a);
|
||||
}
|
||||
console.log(function({}) {
|
||||
return f(console);
|
||||
}(0));
|
||||
console.log(([ {} ] = [ 0 ], f(console)));
|
||||
}
|
||||
expect_stdout: "undefined"
|
||||
node_version: ">=6"
|
||||
@@ -1714,7 +1796,7 @@ issue_4319: {
|
||||
issue_4321: {
|
||||
options = {
|
||||
inline: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
}
|
||||
input: {
|
||||
try {
|
||||
@@ -1729,11 +1811,9 @@ issue_4321: {
|
||||
}
|
||||
expect: {
|
||||
try {
|
||||
console.log(function({}) {
|
||||
return function() {
|
||||
while (!console);
|
||||
}();
|
||||
}());
|
||||
console.log(([ {} ] = [], function() {
|
||||
while (!console);
|
||||
}()));
|
||||
} catch (e) {
|
||||
console.log("PASS");
|
||||
}
|
||||
@@ -1764,11 +1844,15 @@ issue_4323: {
|
||||
}
|
||||
expect: {
|
||||
var a = 0;
|
||||
(function({
|
||||
[function a() {
|
||||
console.log(typeof a);
|
||||
}()]: d,
|
||||
}) {})(0);
|
||||
[
|
||||
{
|
||||
[function a() {
|
||||
console.log(typeof a);
|
||||
}()]: d,
|
||||
},
|
||||
] = [ 0 ],
|
||||
void 0;
|
||||
var d;
|
||||
e = 1,
|
||||
console.log,
|
||||
void e.p;
|
||||
@@ -1777,3 +1861,698 @@ issue_4323: {
|
||||
expect_stdout: "function"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
issue_4355: {
|
||||
options = {
|
||||
loops: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
var a;
|
||||
(function({
|
||||
[function() {
|
||||
for (a in "foo");
|
||||
}()]: b,
|
||||
}) {
|
||||
var a;
|
||||
})(0);
|
||||
console.log(a);
|
||||
}
|
||||
expect: {
|
||||
var a;
|
||||
(function({
|
||||
[function() {
|
||||
for (a in "foo");
|
||||
}()]: b,
|
||||
}) {})(0);
|
||||
console.log(a);
|
||||
}
|
||||
expect_stdout: "2"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
issue_4372_1: {
|
||||
options = {
|
||||
dead_code: true,
|
||||
}
|
||||
input: {
|
||||
var a = "FAIL";
|
||||
a += {
|
||||
[console.log(a)]: a,
|
||||
} = a = "PASS";
|
||||
}
|
||||
expect: {
|
||||
var a = "FAIL";
|
||||
a += {
|
||||
[console.log(a)]: a,
|
||||
} = a = "PASS";
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
issue_4372_2: {
|
||||
options = {
|
||||
dead_code: true,
|
||||
}
|
||||
input: {
|
||||
var a;
|
||||
[ a ] = a = [ "PASS", "FAIL" ];
|
||||
console.log(a);
|
||||
}
|
||||
expect: {
|
||||
var a;
|
||||
[ a ] = [ "PASS", "FAIL" ];
|
||||
console.log(a);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
issue_4383: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
reduce_vars: true,
|
||||
unsafe: true,
|
||||
}
|
||||
input: {
|
||||
console.log(function(a) {
|
||||
[ a[0] ] = [];
|
||||
return a.length;
|
||||
}([]));
|
||||
}
|
||||
expect: {
|
||||
console.log(function(a) {
|
||||
[ a[0] ] = [];
|
||||
return a.length;
|
||||
}([]));
|
||||
}
|
||||
expect_stdout: "1"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
issue_4386: {
|
||||
options = {
|
||||
arguments: true,
|
||||
}
|
||||
input: {
|
||||
function f({}) {
|
||||
return arguments[0];
|
||||
}
|
||||
console.log(f("PASS"));
|
||||
}
|
||||
expect: {
|
||||
function f({}) {
|
||||
return arguments[0];
|
||||
}
|
||||
console.log(f("PASS"));
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
issue_4395: {
|
||||
options = {
|
||||
arguments: true,
|
||||
}
|
||||
input: {
|
||||
console.log(function(a, {}) {
|
||||
a = "FAIL";
|
||||
return arguments[0];
|
||||
}("PASS", 42));
|
||||
}
|
||||
expect: {
|
||||
console.log(function(a, {}) {
|
||||
a = "FAIL";
|
||||
return arguments[0];
|
||||
}("PASS", 42));
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
issue_4399: {
|
||||
options = {
|
||||
arguments: true,
|
||||
}
|
||||
input: {
|
||||
console.log(function({
|
||||
[arguments[1]]: a,
|
||||
}, b) {
|
||||
return a;
|
||||
}([ "PASS" ], 0));
|
||||
}
|
||||
expect: {
|
||||
console.log(function({
|
||||
[arguments[1]]: a,
|
||||
}, b) {
|
||||
return a;
|
||||
}([ "PASS" ], 0));
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
issue_4420: {
|
||||
options = {
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
console.log(function() {
|
||||
var a = 1;
|
||||
try {
|
||||
throw [ "FAIL", "PASS" ];
|
||||
} catch ({
|
||||
[a]: b,
|
||||
}) {
|
||||
let a = 0;
|
||||
return b;
|
||||
}
|
||||
}());
|
||||
}
|
||||
expect: {
|
||||
console.log(function() {
|
||||
var a = 1;
|
||||
try {
|
||||
throw [ "FAIL", "PASS" ];
|
||||
} catch ({
|
||||
[a]: b,
|
||||
}) {
|
||||
return b;
|
||||
}
|
||||
}());
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=8"
|
||||
}
|
||||
|
||||
issue_4425: {
|
||||
rename = true
|
||||
input: {
|
||||
var a;
|
||||
console.log(function() {
|
||||
try {
|
||||
try {
|
||||
throw 42;
|
||||
} catch ({
|
||||
[a]: a,
|
||||
}) {}
|
||||
return "FAIL";
|
||||
} catch (e) {
|
||||
return "PASS";
|
||||
}
|
||||
}());
|
||||
}
|
||||
expect: {
|
||||
var a;
|
||||
console.log(function() {
|
||||
try {
|
||||
try {
|
||||
throw 42;
|
||||
} catch ({
|
||||
[b]: b,
|
||||
}) {}
|
||||
return "FAIL";
|
||||
} catch (c) {
|
||||
return "PASS";
|
||||
}
|
||||
}());
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=8"
|
||||
}
|
||||
|
||||
issue_4436_Infinity: {
|
||||
options = {
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
console.log(function({
|
||||
[delete Infinity]: a,
|
||||
}) {
|
||||
var Infinity;
|
||||
return a;
|
||||
}({
|
||||
true: "FAIL",
|
||||
false: "PASS",
|
||||
}));
|
||||
}
|
||||
expect: {
|
||||
console.log(function({
|
||||
[delete Infinity]: a,
|
||||
}) {
|
||||
return a;
|
||||
}({
|
||||
true: "FAIL",
|
||||
false: "PASS",
|
||||
}));
|
||||
}
|
||||
expect_stdout: true
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
issue_4436_NaN: {
|
||||
options = {
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
console.log(function({
|
||||
[delete NaN]: a,
|
||||
}) {
|
||||
var NaN;
|
||||
return a;
|
||||
}({
|
||||
true: "FAIL",
|
||||
false: "PASS",
|
||||
}));
|
||||
}
|
||||
expect: {
|
||||
console.log(function({
|
||||
[delete NaN]: a,
|
||||
}) {
|
||||
return a;
|
||||
}({
|
||||
true: "FAIL",
|
||||
false: "PASS",
|
||||
}));
|
||||
}
|
||||
expect_stdout: true
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
issue_4436_undefined: {
|
||||
options = {
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
console.log(function({
|
||||
[delete undefined]: a,
|
||||
}) {
|
||||
var undefined;
|
||||
return a;
|
||||
}({
|
||||
true: "FAIL",
|
||||
false: "PASS",
|
||||
}));
|
||||
}
|
||||
expect: {
|
||||
console.log(function({
|
||||
[delete undefined]: a,
|
||||
}) {
|
||||
return a;
|
||||
}({
|
||||
true: "FAIL",
|
||||
false: "PASS",
|
||||
}));
|
||||
}
|
||||
expect_stdout: true
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
issue_4446: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
}
|
||||
input: {
|
||||
a = "PASS";
|
||||
var a = [ a[0] ] = [ a ];
|
||||
console.log(a[0]);
|
||||
}
|
||||
expect: {
|
||||
a = "PASS";
|
||||
var a = [ a[0] ] = [ a ];
|
||||
console.log(a[0]);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
issue_4456: {
|
||||
options = {
|
||||
pure_getters: "strict",
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
var o = {
|
||||
set p(v) {
|
||||
console.log(v);
|
||||
},
|
||||
};
|
||||
[ function() {
|
||||
try {
|
||||
return o;
|
||||
} catch ({}) {}
|
||||
}().p ] = [ "PASS" ];
|
||||
}
|
||||
expect: {
|
||||
var o = {
|
||||
set p(v) {
|
||||
console.log(v);
|
||||
},
|
||||
};
|
||||
[ function() {
|
||||
try {
|
||||
return o;
|
||||
} catch ({}) {}
|
||||
}().p ] = [ "PASS" ];
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
issue_4485_1: {
|
||||
options = {
|
||||
pure_getters: "strict",
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
(function([]) {
|
||||
var arguments;
|
||||
try {
|
||||
arguments.length;
|
||||
} catch (e) {
|
||||
console.log("PASS");
|
||||
}
|
||||
})([]);
|
||||
}
|
||||
expect: {
|
||||
(function([]) {
|
||||
var arguments;
|
||||
try {
|
||||
arguments.length;
|
||||
} catch (e) {
|
||||
console.log("PASS");
|
||||
}
|
||||
})([]);
|
||||
}
|
||||
expect_stdout: true
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
issue_4485_2: {
|
||||
options = {
|
||||
pure_getters: "strict",
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
(function([]) {
|
||||
var arguments = null;
|
||||
try {
|
||||
arguments.length;
|
||||
} catch (e) {
|
||||
console.log("PASS");
|
||||
}
|
||||
})([]);
|
||||
}
|
||||
expect: {
|
||||
(function([]) {
|
||||
var arguments = null;
|
||||
try {
|
||||
arguments.length;
|
||||
} catch (e) {
|
||||
console.log("PASS");
|
||||
}
|
||||
})([]);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
issue_4485_3: {
|
||||
options = {
|
||||
keep_fargs: false,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
(function([]) {
|
||||
var arguments;
|
||||
try {
|
||||
arguments.length;
|
||||
} catch (e) {
|
||||
console.log("PASS");
|
||||
}
|
||||
})([]);
|
||||
}
|
||||
expect: {
|
||||
(function([]) {
|
||||
var arguments;
|
||||
try {
|
||||
arguments.length;
|
||||
} catch (e) {
|
||||
console.log("PASS");
|
||||
}
|
||||
})([]);
|
||||
}
|
||||
expect_stdout: true
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
issue_4500: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
keep_fnames: true,
|
||||
reduce_vars: true,
|
||||
toplevel: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
var a = function f(b) {
|
||||
return [ b ] = [], b;
|
||||
}("FAIL");
|
||||
console.log(a || "PASS");
|
||||
}
|
||||
expect: {
|
||||
var a = function f(b) {
|
||||
return [ b ] = [], b;
|
||||
}("FAIL");
|
||||
console.log(a || "PASS");
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
issue_4504: {
|
||||
options = {
|
||||
inline: true,
|
||||
merge_vars: true,
|
||||
}
|
||||
input: {
|
||||
A = "FAIL";
|
||||
(function f(a) {
|
||||
({
|
||||
[console.log(a)]: 0[(b => console + b)(A)]
|
||||
} = 0);
|
||||
})("PASS");
|
||||
}
|
||||
expect: {
|
||||
A = "FAIL";
|
||||
(function f(a) {
|
||||
({
|
||||
[console.log(a)]: 0[b = A, console + b]
|
||||
} = 0);
|
||||
var b;
|
||||
})("PASS");
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
issue_4508: {
|
||||
options = {
|
||||
inline: true,
|
||||
toplevel: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
for (var i = 0; i < 2; i++)
|
||||
(function f([ a ]) {
|
||||
var a = console.log(a) && b, b = null;
|
||||
})([ "PASS" ]);
|
||||
}
|
||||
expect: {
|
||||
for (var i = 0; i < 2; i++)
|
||||
[ [ a ] ] = [ [ "PASS" ] ],
|
||||
b = void 0,
|
||||
a = console.log(a) && b,
|
||||
b = null,
|
||||
void 0;
|
||||
var a, b;
|
||||
}
|
||||
expect_stdout: [
|
||||
"PASS",
|
||||
"PASS",
|
||||
]
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
issue_4512: {
|
||||
options = {
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
console.log(function([ a, b = a ]) {}([]));
|
||||
}
|
||||
expect: {
|
||||
console.log(function([ a, b = a ]) {}([]));
|
||||
}
|
||||
expect_stdout: "undefined"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
issue_4519_1: {
|
||||
options = {
|
||||
arguments: true,
|
||||
keep_fargs: false,
|
||||
}
|
||||
input: {
|
||||
try {
|
||||
(function() {
|
||||
var [ arguments ] = [];
|
||||
arguments[0];
|
||||
})();
|
||||
} catch (e) {
|
||||
console.log("PASS");
|
||||
}
|
||||
}
|
||||
expect: {
|
||||
try {
|
||||
(function() {
|
||||
var [ arguments ] = [];
|
||||
arguments[0];
|
||||
})();
|
||||
} catch (e) {
|
||||
console.log("PASS");
|
||||
}
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
issue_4519_2: {
|
||||
options = {
|
||||
pure_getters: "strict",
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
try {
|
||||
(function() {
|
||||
var [ arguments ] = [];
|
||||
arguments[0];
|
||||
})();
|
||||
} catch (e) {
|
||||
console.log("PASS");
|
||||
}
|
||||
}
|
||||
expect: {
|
||||
try {
|
||||
(function() {
|
||||
var [ arguments ] = [];
|
||||
arguments[0];
|
||||
})();
|
||||
} catch (e) {
|
||||
console.log("PASS");
|
||||
}
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
issue_4554: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
A = "PASS";
|
||||
var a = "FAIL";
|
||||
try {
|
||||
(function({}, b) {
|
||||
return b;
|
||||
})(void 0, a = A);
|
||||
} catch (e) {
|
||||
console.log(a);
|
||||
}
|
||||
}
|
||||
expect: {
|
||||
A = "PASS";
|
||||
var a = "FAIL";
|
||||
try {
|
||||
(function({}, b) {
|
||||
return b;
|
||||
})(void 0, a = A);
|
||||
} catch (e) {
|
||||
console.log(a);
|
||||
}
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
issue_4584: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
reduce_vars: true,
|
||||
}
|
||||
input: {
|
||||
try {
|
||||
(function f({
|
||||
[console.log(a = "FAIL")]: a,
|
||||
}) {})(0);
|
||||
} catch (e) {
|
||||
console.log("PASS");
|
||||
}
|
||||
}
|
||||
expect: {
|
||||
try {
|
||||
(function f({
|
||||
[console.log(a = "FAIL")]: a,
|
||||
}) {})(0);
|
||||
} catch (e) {
|
||||
console.log("PASS");
|
||||
}
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
issue_4608_1: {
|
||||
options = {
|
||||
arguments: true,
|
||||
keep_fargs: false,
|
||||
}
|
||||
input: {
|
||||
(function() {
|
||||
[ arguments ] = [ "foo" ];
|
||||
console.log(arguments[0]);
|
||||
})();
|
||||
}
|
||||
expect: {
|
||||
(function() {
|
||||
[ arguments ] = [ "foo" ];
|
||||
console.log(arguments[0]);
|
||||
})();
|
||||
}
|
||||
expect_stdout: "f"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
issue_4608_2: {
|
||||
options = {
|
||||
arguments: true,
|
||||
reduce_vars: true,
|
||||
}
|
||||
input: {
|
||||
(function(a) {
|
||||
[ arguments ] = [ "foo" ];
|
||||
console.log(arguments[0]);
|
||||
})();
|
||||
}
|
||||
expect: {
|
||||
(function(a) {
|
||||
[ arguments ] = [ "foo" ];
|
||||
console.log(arguments[0]);
|
||||
})();
|
||||
}
|
||||
expect_stdout: "f"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
@@ -4,15 +4,16 @@ unused_funarg_1: {
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
function f(a, b, c, d, e) {
|
||||
console.log(function f(a, b, c, d, e) {
|
||||
return a + b;
|
||||
}
|
||||
}(14, 28));
|
||||
}
|
||||
expect: {
|
||||
function f(a, b) {
|
||||
console.log(function(a, b) {
|
||||
return a + b;
|
||||
}
|
||||
}(14, 28));
|
||||
}
|
||||
expect_stdout: "42"
|
||||
}
|
||||
|
||||
unused_funarg_2: {
|
||||
@@ -21,15 +22,16 @@ unused_funarg_2: {
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
function f(a, b, c, d, e) {
|
||||
console.log(function f(a, b, c, d, e) {
|
||||
return a + c;
|
||||
}
|
||||
}(14, 21, 28));
|
||||
}
|
||||
expect: {
|
||||
function f(a, b, c) {
|
||||
console.log(function(a, c) {
|
||||
return a + c;
|
||||
}
|
||||
}(14, 28));
|
||||
}
|
||||
expect_stdout: "42"
|
||||
}
|
||||
|
||||
unused_nested_function: {
|
||||
@@ -357,37 +359,6 @@ drop_toplevel_vars: {
|
||||
}
|
||||
}
|
||||
|
||||
drop_toplevel_vars_fargs: {
|
||||
options = {
|
||||
keep_fargs: false,
|
||||
toplevel: "vars",
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
var a, b = 1, c = g;
|
||||
function f(d) {
|
||||
return function() {
|
||||
c = 2;
|
||||
};
|
||||
}
|
||||
a = 2;
|
||||
function g() {}
|
||||
function h() {}
|
||||
console.log(b = 3);
|
||||
}
|
||||
expect: {
|
||||
function f() {
|
||||
return function() {
|
||||
2;
|
||||
};
|
||||
}
|
||||
2;
|
||||
function g() {}
|
||||
function h() {}
|
||||
console.log(3);
|
||||
}
|
||||
}
|
||||
|
||||
drop_toplevel_all: {
|
||||
options = {
|
||||
toplevel: true,
|
||||
@@ -625,13 +596,14 @@ drop_fargs: {
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
function f(a) {
|
||||
console.log(function f(a) {
|
||||
var b = a;
|
||||
}
|
||||
}());
|
||||
}
|
||||
expect: {
|
||||
function f() {}
|
||||
console.log(function() {}());
|
||||
}
|
||||
expect_stdout: "undefined"
|
||||
}
|
||||
|
||||
drop_fnames: {
|
||||
@@ -2027,7 +1999,7 @@ issue_3192_1: {
|
||||
|
||||
issue_3192_2: {
|
||||
options = {
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
@@ -2166,6 +2138,7 @@ issue_3497: {
|
||||
issue_3515_1: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
evaluate: true,
|
||||
reduce_vars: true,
|
||||
unused: true,
|
||||
}
|
||||
@@ -2217,6 +2190,7 @@ issue_3515_2: {
|
||||
issue_3515_3: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
evaluate: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
@@ -2284,6 +2258,7 @@ function_assign: {
|
||||
issue_3598: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
evaluate: true,
|
||||
reduce_vars: true,
|
||||
unused: true,
|
||||
}
|
||||
@@ -2396,6 +2371,7 @@ function_parameter_ie8: {
|
||||
issue_3664: {
|
||||
options = {
|
||||
pure_getters: "strict",
|
||||
side_effects: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
@@ -2406,7 +2382,7 @@ issue_3664: {
|
||||
}
|
||||
expect: {
|
||||
console.log(function() {
|
||||
var b = ([ b && console.log("FAIL") ].p = 0, 0);
|
||||
var b = (b && console.log("FAIL"), 0, 0);
|
||||
return "PASS";
|
||||
}());
|
||||
}
|
||||
@@ -2416,6 +2392,7 @@ issue_3664: {
|
||||
issue_3673: {
|
||||
options = {
|
||||
pure_getters: "strict",
|
||||
sequences: true,
|
||||
side_effects: true,
|
||||
toplevel: true,
|
||||
unused: true,
|
||||
@@ -2426,8 +2403,6 @@ issue_3673: {
|
||||
console.log("PASS");
|
||||
}
|
||||
expect: {
|
||||
var a;
|
||||
(a = [ a ]).p = 42;
|
||||
console.log("PASS");
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
@@ -2435,7 +2410,7 @@ issue_3673: {
|
||||
|
||||
issue_3746: {
|
||||
options = {
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
side_effects: true,
|
||||
unused: true,
|
||||
}
|
||||
@@ -2697,8 +2672,7 @@ issue_3956: {
|
||||
})();
|
||||
}
|
||||
expect: {
|
||||
var c, d;
|
||||
c += 0,
|
||||
var d;
|
||||
console.log(NaN),
|
||||
d = 1 ^ console.log(1),
|
||||
console.log(d);
|
||||
@@ -2713,7 +2687,7 @@ issue_3956: {
|
||||
issue_3962_1: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
reduce_vars: true,
|
||||
toplevel: true,
|
||||
unused: true,
|
||||
@@ -2731,13 +2705,13 @@ issue_3962_1: {
|
||||
}
|
||||
expect: {
|
||||
var a = 0;
|
||||
a = (function(c) {
|
||||
(function(c) {
|
||||
do {
|
||||
console;
|
||||
0..toString();
|
||||
} while (0);
|
||||
if (c) console.log("PASS");
|
||||
}(1), 0);
|
||||
})(1);
|
||||
void 0;
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
@@ -2745,7 +2719,7 @@ issue_3962_1: {
|
||||
|
||||
issue_3962_2: {
|
||||
options = {
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
reduce_vars: true,
|
||||
side_effects: true,
|
||||
toplevel: true,
|
||||
@@ -2764,13 +2738,13 @@ issue_3962_2: {
|
||||
}
|
||||
expect: {
|
||||
var a = 0;
|
||||
a = (function(c) {
|
||||
(function(c) {
|
||||
do {
|
||||
console;
|
||||
0..toString();
|
||||
} while (0);
|
||||
if (c) console.log("PASS");
|
||||
}(1), 0);
|
||||
})(1);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
@@ -2827,7 +2801,9 @@ issue_4017: {
|
||||
var a = 0;
|
||||
console.log(function() {
|
||||
c &= 0;
|
||||
var c = (a++, A = a, 0);
|
||||
var c;
|
||||
a++,
|
||||
A = a;
|
||||
}());
|
||||
}
|
||||
expect_stdout: "undefined"
|
||||
@@ -2948,7 +2924,7 @@ issue_4133: {
|
||||
|
||||
issue_4144: {
|
||||
options = {
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
reduce_vars: true,
|
||||
unused: true,
|
||||
}
|
||||
@@ -3112,3 +3088,303 @@ issue_4235: {
|
||||
}
|
||||
expect_stdout: "undefined"
|
||||
}
|
||||
|
||||
issue_4404: {
|
||||
options = {
|
||||
pure_getters: "strict",
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
function f(a) {
|
||||
arguments[0] = "PASS";
|
||||
console.log(a);
|
||||
}
|
||||
f("FAIL");
|
||||
}
|
||||
expect: {
|
||||
function f(a) {
|
||||
arguments[0] = "PASS";
|
||||
console.log(a);
|
||||
}
|
||||
f("FAIL");
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
issue_4413: {
|
||||
options = {
|
||||
reduce_vars: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
console.log(function f(arguments) {
|
||||
var arguments = function() {};
|
||||
return arguments.length;
|
||||
}());
|
||||
}
|
||||
expect: {
|
||||
console.log(function(arguments) {
|
||||
return function() {}.length;
|
||||
}());
|
||||
}
|
||||
expect_stdout: "0"
|
||||
}
|
||||
|
||||
issue_4464_1: {
|
||||
options = {
|
||||
reduce_vars: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
function f(a) {
|
||||
var a = function() {};
|
||||
return [ arguments, a ];
|
||||
}
|
||||
console.log(typeof f()[1]);
|
||||
}
|
||||
expect: {
|
||||
function f(a) {
|
||||
a = function() {};
|
||||
return [ arguments, a ];
|
||||
}
|
||||
console.log(typeof f()[1]);
|
||||
}
|
||||
expect_stdout: "function"
|
||||
}
|
||||
|
||||
issue_4464_2: {
|
||||
options = {
|
||||
reduce_vars: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
function f(a) {
|
||||
var a = function() {};
|
||||
return [ arguments, a ];
|
||||
}
|
||||
console.log(typeof f(42)[0][0]);
|
||||
}
|
||||
expect: {
|
||||
function f(a) {
|
||||
a = function() {};
|
||||
return [ arguments, a ];
|
||||
}
|
||||
console.log(typeof f(42)[0][0]);
|
||||
}
|
||||
expect_stdout: "function"
|
||||
}
|
||||
|
||||
issue_4464_3: {
|
||||
options = {
|
||||
reduce_vars: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
(function a(a) {
|
||||
var a = function() {};
|
||||
return [ arguments[0], a ];
|
||||
})(42).forEach(function(b) {
|
||||
console.log(typeof b);
|
||||
});
|
||||
}
|
||||
expect: {
|
||||
(function(a) {
|
||||
a = function() {};
|
||||
return [ arguments[0], a ];
|
||||
})(42).forEach(function(b) {
|
||||
console.log(typeof b);
|
||||
});
|
||||
}
|
||||
expect_stdout: [
|
||||
"function",
|
||||
"function",
|
||||
]
|
||||
}
|
||||
|
||||
issue_4558_1: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
pure_getters: true,
|
||||
reduce_vars: true,
|
||||
sequences: true,
|
||||
side_effects: true,
|
||||
toplevel: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
var a = 0;
|
||||
var b = 1, b = c >>>= a;
|
||||
var c = 0;
|
||||
b && 0[a++],
|
||||
console.log(a);
|
||||
}
|
||||
expect: {
|
||||
var a = 0;
|
||||
var b = c >>>= a;
|
||||
var c;
|
||||
b && a++,
|
||||
console.log(a);
|
||||
}
|
||||
expect_stdout: "0"
|
||||
}
|
||||
|
||||
issue_4558_2: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
ie8: true,
|
||||
reduce_vars: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
(function() {
|
||||
var a = 1;
|
||||
var b = (a = NaN) || (console.log("PASS"), 2);
|
||||
return a;
|
||||
})();
|
||||
}
|
||||
expect: {
|
||||
(function() {
|
||||
var a;
|
||||
(a = NaN) || console.log("PASS");
|
||||
return a;
|
||||
})();
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
issue_4662: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
reduce_vars: true,
|
||||
toplevel: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
var a = 0;
|
||||
function f(b, c) {
|
||||
console.log(b, c);
|
||||
}
|
||||
f(++a, a = a, a);
|
||||
}
|
||||
expect: {
|
||||
var a = 0;
|
||||
(function(b, c) {
|
||||
console.log(b, c);
|
||||
})(++a, a = 1);
|
||||
}
|
||||
expect_stdout: "1 1"
|
||||
}
|
||||
|
||||
issue_4806_1: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
reduce_vars: true,
|
||||
toplevel: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
O = {
|
||||
f: function() {
|
||||
console.log(this === O ? "FAIL" : "PASS");
|
||||
},
|
||||
};
|
||||
var a;
|
||||
(a = 42, O.f)();
|
||||
a;
|
||||
}
|
||||
expect: {
|
||||
O = {
|
||||
f: function() {
|
||||
console.log(this === O ? "FAIL" : "PASS");
|
||||
},
|
||||
};
|
||||
(0, O.f)();
|
||||
42;
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
issue_4806_2: {
|
||||
options = {
|
||||
sequences: true,
|
||||
toplevel: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
O = {
|
||||
f: function() {
|
||||
console.log(this === O ? "FAIL" : "PASS");
|
||||
},
|
||||
};
|
||||
var a;
|
||||
(a = 42, O.f)();
|
||||
a;
|
||||
}
|
||||
expect: {
|
||||
O = {
|
||||
f: function() {
|
||||
console.log(this === O ? "FAIL" : "PASS");
|
||||
},
|
||||
},
|
||||
(0, O.f)();
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
issue_4806_3: {
|
||||
options = {
|
||||
side_effects: true,
|
||||
toplevel: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
O = {
|
||||
f: function() {
|
||||
console.log(this === O ? "FAIL" : "PASS");
|
||||
},
|
||||
};
|
||||
var a;
|
||||
(a = 42, O.f)();
|
||||
a;
|
||||
}
|
||||
expect: {
|
||||
O = {
|
||||
f: function() {
|
||||
console.log(this === O ? "FAIL" : "PASS");
|
||||
},
|
||||
};
|
||||
(0, O.f)();
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
issue_4834: {
|
||||
options = {
|
||||
inline: true,
|
||||
keep_fargs: false,
|
||||
pure_getters: "strict",
|
||||
reduce_vars: true,
|
||||
side_effects: true,
|
||||
toplevel: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
try {
|
||||
new function(a, b) {
|
||||
b;
|
||||
b.p;
|
||||
}(42);
|
||||
} catch (e) {
|
||||
console.log("PASS");
|
||||
}
|
||||
}
|
||||
expect: {
|
||||
try {
|
||||
void b.p;
|
||||
} catch (e) {
|
||||
console.log("PASS");
|
||||
}
|
||||
var b;
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
@@ -399,18 +399,18 @@ unsafe_object_accessor: {
|
||||
function f() {
|
||||
var a = {
|
||||
get b() {},
|
||||
set b() {}
|
||||
set b(v) {},
|
||||
};
|
||||
return {a:a};
|
||||
return { a: a };
|
||||
}
|
||||
}
|
||||
expect: {
|
||||
function f() {
|
||||
var a = {
|
||||
get b() {},
|
||||
set b() {}
|
||||
set b(v) {},
|
||||
};
|
||||
return {a:a};
|
||||
return { a: a };
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -703,6 +703,7 @@ prototype_function: {
|
||||
var g = 0();
|
||||
var h = 0();
|
||||
}
|
||||
expect_stdout: true
|
||||
}
|
||||
|
||||
call_args: {
|
||||
@@ -846,6 +847,8 @@ unsafe_charAt_noop: {
|
||||
unsafe: true,
|
||||
}
|
||||
input: {
|
||||
s = "foo";
|
||||
x = 42;
|
||||
console.log(
|
||||
s.charAt(0),
|
||||
"string".charAt(x),
|
||||
@@ -853,12 +856,15 @@ unsafe_charAt_noop: {
|
||||
);
|
||||
}
|
||||
expect: {
|
||||
s = "foo";
|
||||
x = 42;
|
||||
console.log(
|
||||
s[0],
|
||||
"string"[0 | x],
|
||||
(typeof x)[0]
|
||||
s[0] || "",
|
||||
"string"[0 | x] || "",
|
||||
(typeof x)[0] || ""
|
||||
);
|
||||
}
|
||||
expect_stdout: "f n"
|
||||
}
|
||||
|
||||
issue_1649: {
|
||||
@@ -2800,7 +2806,7 @@ operator_in: {
|
||||
console.log("PASS" in { });
|
||||
console.log("FAIL" in { });
|
||||
console.log("toString" in { });
|
||||
console.log(true);
|
||||
console.log("toString" in { toString: 3 });
|
||||
}
|
||||
expect_stdout: [
|
||||
"true",
|
||||
@@ -3074,3 +3080,104 @@ issue_4271: {
|
||||
"PASS",
|
||||
]
|
||||
}
|
||||
|
||||
issue_4393: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
reduce_vars: true,
|
||||
}
|
||||
input: {
|
||||
(function f(a) {
|
||||
a = "PASS";
|
||||
console.log(arguments[0]);
|
||||
})("FAIL");
|
||||
}
|
||||
expect: {
|
||||
(function f(a) {
|
||||
a = "PASS";
|
||||
console.log(arguments[0]);
|
||||
})("FAIL");
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
issue_4422: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
reduce_vars: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
console.log(function f(a) {
|
||||
a = "FAIL 1";
|
||||
arguments[0] = "PASS";
|
||||
return a;
|
||||
}("FAIL 2"));
|
||||
}
|
||||
expect: {
|
||||
console.log(function(a) {
|
||||
a = "FAIL 1";
|
||||
arguments[0] = "PASS";
|
||||
return a;
|
||||
}("FAIL 2"));
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
issue_4480: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
reduce_vars: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
var a = function f(b) {
|
||||
b = "FAIL";
|
||||
arguments[0] = "PASS";
|
||||
var arguments = 0;
|
||||
console.log(b);
|
||||
}(a);
|
||||
}
|
||||
expect: {
|
||||
var a = function(b) {
|
||||
b = "FAIL";
|
||||
arguments[0] = "PASS";
|
||||
var arguments = 0;
|
||||
console.log(b);
|
||||
}(a);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
issue_4552: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
keep_fnames: true,
|
||||
reduce_vars: true,
|
||||
toplevel: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
var a = function f(b) {
|
||||
return function() {
|
||||
b++;
|
||||
try {
|
||||
return b;
|
||||
} catch (e) {}
|
||||
}();
|
||||
}();
|
||||
console.log(a);
|
||||
}
|
||||
expect: {
|
||||
var a = function f(b) {
|
||||
return function() {
|
||||
b++;
|
||||
try {
|
||||
return b;
|
||||
} catch (e) {}
|
||||
}();
|
||||
}();
|
||||
console.log(a);
|
||||
}
|
||||
expect_stdout: "NaN"
|
||||
}
|
||||
|
||||
147
test/compress/exponentiation.js
Normal file
147
test/compress/exponentiation.js
Normal file
@@ -0,0 +1,147 @@
|
||||
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"
|
||||
}
|
||||
|
||||
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, 1073741824, 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"
|
||||
}
|
||||
498
test/compress/exports.js
Normal file
498
test/compress/exports.js
Normal file
@@ -0,0 +1,498 @@
|
||||
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, { foo: a } = 42;
|
||||
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";
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1068,3 +1068,29 @@ issue_4023: {
|
||||
}
|
||||
expect_stdout: "true"
|
||||
}
|
||||
|
||||
object_super: {
|
||||
options = {
|
||||
hoist_props: true,
|
||||
reduce_vars: true,
|
||||
toplevel: true,
|
||||
}
|
||||
input: {
|
||||
var o = {
|
||||
f(a) {
|
||||
return a ? console.log("PASS") : super.log("PASS");
|
||||
},
|
||||
};
|
||||
o.f(42);
|
||||
}
|
||||
expect: {
|
||||
var o = {
|
||||
f(a) {
|
||||
return a ? console.log("PASS") : super.log("PASS");
|
||||
},
|
||||
};
|
||||
o.f(42);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
@@ -89,6 +89,31 @@ 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,
|
||||
@@ -109,3 +134,163 @@ issue_2295: {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
issue_4487: {
|
||||
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: {
|
||||
function a() {
|
||||
var f = console.log(typeof f);
|
||||
}
|
||||
a();
|
||||
}
|
||||
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;
|
||||
A = a;
|
||||
return 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(1073741824);
|
||||
})();
|
||||
})();
|
||||
}
|
||||
expect_stdout: "1073741824"
|
||||
}
|
||||
|
||||
issue_4839: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
hoist_vars: true,
|
||||
keep_fargs: false,
|
||||
reduce_vars: true,
|
||||
toplevel: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
var o = function(a, b) {
|
||||
return b && b;
|
||||
}("foo");
|
||||
for (var k in o)
|
||||
throw "FAIL";
|
||||
console.log("PASS");
|
||||
}
|
||||
expect: {
|
||||
var k, o = void 0;
|
||||
for (k in o)
|
||||
throw "FAIL";
|
||||
console.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) {
|
||||
var d = 1 / 0, d = Infinity;
|
||||
console.log(d);
|
||||
return f;
|
||||
})();
|
||||
}
|
||||
expect_stdout: "Infinity"
|
||||
}
|
||||
|
||||
@@ -588,7 +588,6 @@ issue_3197_1: {
|
||||
ie8: false,
|
||||
}
|
||||
input: {
|
||||
var window = {};
|
||||
!function() {
|
||||
function Foo() {
|
||||
console.log(this instanceof Foo);
|
||||
@@ -598,7 +597,6 @@ issue_3197_1: {
|
||||
new window.Foo();
|
||||
}
|
||||
expect: {
|
||||
var window = {};
|
||||
window.Foo = function o() {
|
||||
console.log(this instanceof o);
|
||||
};
|
||||
@@ -619,7 +617,6 @@ issue_3197_1_ie8: {
|
||||
ie8: true,
|
||||
}
|
||||
input: {
|
||||
var window = {};
|
||||
!function() {
|
||||
function Foo() {
|
||||
console.log(this instanceof Foo);
|
||||
@@ -629,7 +626,6 @@ issue_3197_1_ie8: {
|
||||
new window.Foo();
|
||||
}
|
||||
expect: {
|
||||
var window = {};
|
||||
window.Foo = function Foo() {
|
||||
console.log(this instanceof Foo);
|
||||
};
|
||||
@@ -2904,3 +2900,48 @@ issue_4250: {
|
||||
}
|
||||
expect_stdout: "0"
|
||||
}
|
||||
|
||||
issue_4568: {
|
||||
options = {
|
||||
ie8: true,
|
||||
reduce_vars: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
console.log(typeof f, function(a) {
|
||||
return a.length;
|
||||
}([ function f() {} ]));
|
||||
}
|
||||
expect: {
|
||||
console.log(typeof f, function(a) {
|
||||
return a.length;
|
||||
}([ function f() {} ]));
|
||||
}
|
||||
expect_stdout: "undefined 1"
|
||||
}
|
||||
|
||||
issue_4729: {
|
||||
options = {
|
||||
ie8: true,
|
||||
pure_getters: true,
|
||||
toplevel: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
try {
|
||||
f;
|
||||
} catch (e) {
|
||||
var a = a && a[function f() {}];
|
||||
console.log("PASS");
|
||||
}
|
||||
}
|
||||
expect: {
|
||||
try {
|
||||
f;
|
||||
} catch (e) {
|
||||
(function f() {});
|
||||
console.log("PASS");
|
||||
}
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
211
test/compress/imports.js
Normal file
211
test/compress/imports.js
Normal file
@@ -0,0 +1,211 @@
|
||||
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, bar as d } from "baz";
|
||||
console.log(c);
|
||||
}
|
||||
expect: {
|
||||
import "foo";
|
||||
import { c as c } from "baz";
|
||||
console.log(c);
|
||||
}
|
||||
}
|
||||
|
||||
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";
|
||||
}
|
||||
}
|
||||
@@ -2,61 +2,77 @@ keep_name_of_getter: {
|
||||
options = {
|
||||
unused: true,
|
||||
}
|
||||
input: { a = { get foo () {} } }
|
||||
expect: { a = { get foo () {} } }
|
||||
input: {
|
||||
a = {
|
||||
get foo() {},
|
||||
};
|
||||
}
|
||||
expect: {
|
||||
a = {
|
||||
get foo() {},
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
keep_name_of_setter: {
|
||||
options = {
|
||||
unused: true,
|
||||
}
|
||||
input: { a = { set foo () {} } }
|
||||
expect: { a = { set foo () {} } }
|
||||
input: {
|
||||
a = {
|
||||
set foo(v) {},
|
||||
};
|
||||
}
|
||||
expect: {
|
||||
a = {
|
||||
set foo(v) {},
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
setter_with_operator_keys: {
|
||||
input: {
|
||||
var tokenCodes = {
|
||||
get instanceof(){
|
||||
var tokenCodes = {
|
||||
get instanceof() {
|
||||
return test0;
|
||||
},
|
||||
set instanceof(value){
|
||||
set instanceof(value) {
|
||||
test0 = value;
|
||||
},
|
||||
set typeof(value){
|
||||
set typeof(value) {
|
||||
test1 = value;
|
||||
},
|
||||
get typeof(){
|
||||
get typeof() {
|
||||
return test1;
|
||||
},
|
||||
set else(value){
|
||||
set else(value) {
|
||||
test2 = value;
|
||||
},
|
||||
get else(){
|
||||
get else() {
|
||||
return test2;
|
||||
}
|
||||
},
|
||||
};
|
||||
}
|
||||
expect: {
|
||||
var tokenCodes = {
|
||||
get instanceof(){
|
||||
var tokenCodes = {
|
||||
get instanceof() {
|
||||
return test0;
|
||||
},
|
||||
set instanceof(value){
|
||||
set instanceof(value) {
|
||||
test0 = value;
|
||||
},
|
||||
set typeof(value){
|
||||
set typeof(value) {
|
||||
test1 = value;
|
||||
},
|
||||
get typeof(){
|
||||
get typeof() {
|
||||
return test1;
|
||||
},
|
||||
set else(value){
|
||||
set else(value) {
|
||||
test2 = value;
|
||||
},
|
||||
get else(){
|
||||
get else() {
|
||||
return test2;
|
||||
}
|
||||
},
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ mangle_keep_fnames_false: {
|
||||
keep_fnames: true,
|
||||
}
|
||||
mangle = {
|
||||
keep_fnames : false,
|
||||
keep_fnames: false,
|
||||
}
|
||||
input: {
|
||||
"use strict";
|
||||
@@ -30,7 +30,7 @@ mangle_keep_fnames_true: {
|
||||
keep_fnames: true,
|
||||
}
|
||||
mangle = {
|
||||
keep_fnames : true,
|
||||
keep_fnames: true,
|
||||
}
|
||||
input: {
|
||||
"use strict";
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
pure_function_calls: {
|
||||
options = {
|
||||
annotations: true,
|
||||
booleans: true,
|
||||
comparisons: true,
|
||||
conditionals: true,
|
||||
@@ -60,6 +61,7 @@ pure_function_calls: {
|
||||
|
||||
pure_function_calls_toplevel: {
|
||||
options = {
|
||||
annotations: true,
|
||||
booleans: true,
|
||||
comparisons: true,
|
||||
conditionals: true,
|
||||
@@ -126,6 +128,7 @@ pure_function_calls_toplevel: {
|
||||
|
||||
should_warn: {
|
||||
options = {
|
||||
annotations: true,
|
||||
booleans: true,
|
||||
conditionals: true,
|
||||
evaluate: true,
|
||||
|
||||
@@ -17,7 +17,7 @@ issue_269_1: {
|
||||
expect: {
|
||||
var x = {};
|
||||
console.log(
|
||||
x + "", +x, !!x,
|
||||
"" + x, +("" + x), !!x,
|
||||
"", 0, false
|
||||
);
|
||||
}
|
||||
|
||||
@@ -426,6 +426,7 @@ wrap_iife_in_return_call: {
|
||||
|
||||
pure_annotation_1: {
|
||||
options = {
|
||||
annotations: true,
|
||||
inline: true,
|
||||
side_effects: true,
|
||||
}
|
||||
@@ -439,6 +440,7 @@ pure_annotation_1: {
|
||||
|
||||
pure_annotation_2: {
|
||||
options = {
|
||||
annotations: true,
|
||||
collapse_vars: true,
|
||||
inline: true,
|
||||
side_effects: true,
|
||||
@@ -463,15 +465,19 @@ drop_fargs: {
|
||||
var a = 1;
|
||||
!function(a_1) {
|
||||
a++;
|
||||
}(a++ + (a && a.var));
|
||||
}(a++ + (a && console.log(a)));
|
||||
console.log(a);
|
||||
}
|
||||
expect: {
|
||||
var a = 1;
|
||||
++a && a.var, a++;
|
||||
++a && console.log(a),
|
||||
a++;
|
||||
console.log(a);
|
||||
}
|
||||
expect_stdout: "3"
|
||||
expect_stdout: [
|
||||
"2",
|
||||
"3",
|
||||
]
|
||||
}
|
||||
|
||||
keep_fargs: {
|
||||
@@ -486,13 +492,17 @@ keep_fargs: {
|
||||
var a = 1;
|
||||
!function(a_1) {
|
||||
a++;
|
||||
}(a++ + (a && a.var));
|
||||
}(a++ + (a && console.log(a)));
|
||||
console.log(a);
|
||||
}
|
||||
expect: {
|
||||
var a = 1;
|
||||
++a && a.var, a++;
|
||||
++a && console.log(a),
|
||||
a++;
|
||||
console.log(a);
|
||||
}
|
||||
expect_stdout: "3"
|
||||
expect_stdout: [
|
||||
"2",
|
||||
"3",
|
||||
]
|
||||
}
|
||||
|
||||
@@ -63,42 +63,81 @@ eval_unused: {
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
function f1(a, eval, c, d, e) {
|
||||
return a('c') + eval;
|
||||
}
|
||||
function f2(a, b, c, d, e) {
|
||||
return a + eval('c');
|
||||
}
|
||||
function f3(a, eval, c, d, e) {
|
||||
return a + eval('c');
|
||||
function o(k) {
|
||||
return { c: 14 }[k];
|
||||
}
|
||||
console.log(function f1(a, eval, c, d, e) {
|
||||
return a("c") + eval;
|
||||
}(o, 28, true));
|
||||
console.log(function f2(a, b, c, d, e) {
|
||||
return a + eval("c");
|
||||
}(14, true, 28));
|
||||
console.log(function f3(a, eval, c, d, e) {
|
||||
return a + eval("c");
|
||||
}(28, o, true));
|
||||
}
|
||||
expect: {
|
||||
function f1(a, eval) {
|
||||
return a('c') + eval;
|
||||
}
|
||||
function f2(a, b, c, d, e) {
|
||||
return a + eval('c');
|
||||
}
|
||||
function f3(a, eval, c, d, e) {
|
||||
return a + eval('c');
|
||||
function o(k) {
|
||||
return { c: 14 }[k];
|
||||
}
|
||||
console.log(function(a, eval) {
|
||||
return a("c") + eval;
|
||||
}(o, 28));
|
||||
console.log(function f2(a, b, c, d, e) {
|
||||
return a + eval("c");
|
||||
}(14, true, 28));
|
||||
console.log(function f3(a, eval, c, d, e) {
|
||||
return a + eval("c");
|
||||
}(28, o, true));
|
||||
}
|
||||
expect_stdout: [
|
||||
"42",
|
||||
"42",
|
||||
"42",
|
||||
]
|
||||
}
|
||||
|
||||
eval_mangle: {
|
||||
mangle = {
|
||||
};
|
||||
input: {
|
||||
function f1(a, eval, c, d, e) {
|
||||
return a('c') + eval;
|
||||
}
|
||||
function f2(a, b, c, d, e) {
|
||||
return a + eval('c');
|
||||
}
|
||||
function f3(a, eval, c, d, e) {
|
||||
return a + eval('c');
|
||||
}
|
||||
mangle = {}
|
||||
beautify = {
|
||||
beautify: true,
|
||||
}
|
||||
expect_exact: 'function f1(n,c,e,a,f){return n("c")+c}function f2(a,b,c,d,e){return a+eval("c")}function f3(a,eval,c,d,e){return a+eval("c")}'
|
||||
input: {
|
||||
function o(k) {
|
||||
return { cc: 14 }[k + "c"];
|
||||
}
|
||||
console.log(function f1(a, eval, c, d, e) {
|
||||
return a("c") + eval;
|
||||
}(o, 28, true));
|
||||
console.log(function f2(a, b, c, d, e) {
|
||||
return a + eval("c");
|
||||
}(14, true, 28));
|
||||
console.log(function f3(a, eval, c, d, e) {
|
||||
return a + eval("c");
|
||||
}(28, o, true));
|
||||
}
|
||||
expect_exact: [
|
||||
"function o(o) {",
|
||||
" return {",
|
||||
" cc: 14",
|
||||
' }[o + "c"];',
|
||||
"}",
|
||||
"",
|
||||
"console.log(function o(c, e, n, r, t) {",
|
||||
' return c("c") + e;',
|
||||
"}(o, 28, true));",
|
||||
"",
|
||||
"console.log(function f2(a, b, c, d, e) {",
|
||||
' return a + eval("c");',
|
||||
"}(14, true, 28));",
|
||||
"",
|
||||
"console.log(function f3(a, eval, c, d, e) {",
|
||||
' return a + eval("c");',
|
||||
"}(28, o, true));",
|
||||
]
|
||||
expect_stdout: [
|
||||
"42",
|
||||
"42",
|
||||
"42",
|
||||
]
|
||||
}
|
||||
|
||||
@@ -790,7 +790,7 @@ issue_3795: {
|
||||
dead_code: true,
|
||||
evaluate: true,
|
||||
join_vars: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
loops: true,
|
||||
passes: 2,
|
||||
reduce_vars: true,
|
||||
@@ -1055,3 +1055,75 @@ issue_3916: {
|
||||
}
|
||||
expect_stdout: "object PASS true PASS"
|
||||
}
|
||||
|
||||
assign_var: {
|
||||
options = {
|
||||
join_vars: true,
|
||||
}
|
||||
input: {
|
||||
b = "foo";
|
||||
var a = [ , "bar" ];
|
||||
console.log(b);
|
||||
for (var b in a)
|
||||
console.log(b, a[b]);
|
||||
}
|
||||
expect: {
|
||||
var b = "foo", a = [ , "bar" ], b;
|
||||
console.log(b);
|
||||
for (b in a)
|
||||
console.log(b, a[b]);
|
||||
}
|
||||
expect_stdout: [
|
||||
"foo",
|
||||
"1 bar",
|
||||
]
|
||||
}
|
||||
|
||||
assign_for_var: {
|
||||
options = {
|
||||
join_vars: true,
|
||||
}
|
||||
input: {
|
||||
i = "foo",
|
||||
a = new Array(i, "bar");
|
||||
for (var i = 2; --i >= 0;) {
|
||||
console.log(a[i]);
|
||||
for (var a in i);
|
||||
}
|
||||
}
|
||||
expect: {
|
||||
for (var i = "foo", a = new Array(i, "bar"), i = 2; --i >= 0;) {
|
||||
console.log(a[i]);
|
||||
for (var a in i);
|
||||
}
|
||||
}
|
||||
expect_stdout: [
|
||||
"bar",
|
||||
"foo",
|
||||
]
|
||||
}
|
||||
|
||||
assign_sequence_var: {
|
||||
options = {
|
||||
join_vars: true,
|
||||
}
|
||||
input: {
|
||||
var a = 0, b = 1;
|
||||
console.log(a),
|
||||
a++,
|
||||
b = 2;
|
||||
var c = 3;
|
||||
console.log(a, b, c);
|
||||
}
|
||||
expect: {
|
||||
var a = 0, b = 1;
|
||||
console.log(a),
|
||||
a++;
|
||||
var b = 2, c = 3;
|
||||
console.log(a, b, c);
|
||||
}
|
||||
expect_stdout: [
|
||||
"0",
|
||||
"1 2 3",
|
||||
]
|
||||
}
|
||||
|
||||
@@ -18,43 +18,6 @@ keep_fargs_false: {
|
||||
function j(e) {}
|
||||
console.log(h(), i().length, j.length);
|
||||
}
|
||||
expect: {
|
||||
console.log(function f() {
|
||||
return f.length;
|
||||
}(), function g() {
|
||||
return g;
|
||||
}().length);
|
||||
function h() {
|
||||
return h.length;
|
||||
}
|
||||
function i() {
|
||||
return i;
|
||||
}
|
||||
function j() {}
|
||||
console.log(h(), i().length, j.length);
|
||||
}
|
||||
}
|
||||
|
||||
keep_fargs_strict: {
|
||||
options = {
|
||||
keep_fargs: "strict",
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
console.log(function f(a) {
|
||||
return f.length;
|
||||
}(), function g(b) {
|
||||
return g;
|
||||
}().length);
|
||||
function h(c) {
|
||||
return h.length;
|
||||
}
|
||||
function i(d) {
|
||||
return i;
|
||||
}
|
||||
function j(e) {}
|
||||
console.log(h(), i().length, j.length);
|
||||
}
|
||||
expect: {
|
||||
console.log(function f(a) {
|
||||
return f.length;
|
||||
@@ -117,61 +80,11 @@ keep_fargs_true: {
|
||||
]
|
||||
}
|
||||
|
||||
replace_index: {
|
||||
options = {
|
||||
arguments: true,
|
||||
evaluate: true,
|
||||
keep_fargs: "strict",
|
||||
properties: true,
|
||||
}
|
||||
input: {
|
||||
var arguments = [];
|
||||
console.log(arguments[0]);
|
||||
(function() {
|
||||
console.log(arguments[1], arguments["1"], arguments["foo"]);
|
||||
})("bar", 42);
|
||||
(function(a, b) {
|
||||
console.log(arguments[1], arguments["1"], arguments["foo"]);
|
||||
})("bar", 42);
|
||||
(function(arguments) {
|
||||
console.log(arguments[1], arguments["1"], arguments["foo"]);
|
||||
})("bar", 42);
|
||||
(function() {
|
||||
var arguments;
|
||||
console.log(arguments[1], arguments["1"], arguments["foo"]);
|
||||
})("bar", 42);
|
||||
}
|
||||
expect: {
|
||||
var arguments = [];
|
||||
console.log(arguments[0]);
|
||||
(function(argument_0, argument_1) {
|
||||
console.log(argument_1, argument_1, arguments.foo);
|
||||
})("bar", 42);
|
||||
(function(a, b) {
|
||||
console.log(b, b, arguments.foo);
|
||||
})("bar", 42);
|
||||
(function(arguments) {
|
||||
console.log(arguments[1], arguments[1], arguments.foo);
|
||||
})("bar", 42);
|
||||
(function() {
|
||||
var arguments;
|
||||
console.log(arguments[1], arguments[1], arguments.foo);
|
||||
})("bar", 42);
|
||||
}
|
||||
expect_stdout: [
|
||||
"undefined",
|
||||
"42 42 undefined",
|
||||
"42 42 undefined",
|
||||
"a a undefined",
|
||||
"42 42 undefined",
|
||||
]
|
||||
}
|
||||
|
||||
replace_index_strict: {
|
||||
options = {
|
||||
arguments: true,
|
||||
evaluate: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
properties: true,
|
||||
reduce_vars: true,
|
||||
}
|
||||
@@ -202,7 +115,7 @@ replace_index_strict: {
|
||||
issue_1858: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
pure_getters: true,
|
||||
unused: true,
|
||||
}
|
||||
@@ -224,7 +137,7 @@ issue_1858: {
|
||||
issue_2187_2: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
@@ -245,7 +158,7 @@ issue_2187_2: {
|
||||
issue_2203_2: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
@@ -280,7 +193,7 @@ issue_2203_2: {
|
||||
issue_2298: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
passes: 2,
|
||||
reduce_funcs: true,
|
||||
reduce_vars: true,
|
||||
@@ -323,7 +236,7 @@ issue_2298: {
|
||||
issue_2319_1: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
@@ -346,7 +259,7 @@ issue_2319_1: {
|
||||
issue_2319_2: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
@@ -371,7 +284,7 @@ issue_2319_2: {
|
||||
issue_2319_3: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
@@ -396,7 +309,7 @@ issue_2319_3: {
|
||||
issue_2425_1: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
@@ -419,7 +332,7 @@ issue_2425_1: {
|
||||
issue_2425_2: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
@@ -442,7 +355,7 @@ issue_2425_2: {
|
||||
issue_2425_3: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
@@ -465,7 +378,7 @@ issue_2425_3: {
|
||||
issue_2436_13: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
passes: 2,
|
||||
reduce_vars: true,
|
||||
unused: true,
|
||||
@@ -499,7 +412,7 @@ issue_2436_13: {
|
||||
issue_2506: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
passes: 2,
|
||||
reduce_vars: true,
|
||||
unused: true,
|
||||
@@ -525,7 +438,7 @@ issue_2506: {
|
||||
function f0(bar) {
|
||||
(function() {
|
||||
(function() {
|
||||
if (false <= NaN & this >> 1 >= 0)
|
||||
if (false <= 0/0 & this >> 1 >= 0)
|
||||
c++;
|
||||
})(c++);
|
||||
})();
|
||||
@@ -538,7 +451,7 @@ issue_2506: {
|
||||
|
||||
issue_2226_1: {
|
||||
options = {
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
side_effects: true,
|
||||
unused: true,
|
||||
}
|
||||
@@ -585,7 +498,7 @@ issue_2226_1: {
|
||||
issue_2226_2: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
sequences: true,
|
||||
side_effects: true,
|
||||
unused: true,
|
||||
@@ -607,7 +520,7 @@ issue_2226_2: {
|
||||
issue_2226_3: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
side_effects: true,
|
||||
unused: true,
|
||||
}
|
||||
@@ -627,7 +540,7 @@ issue_2226_3: {
|
||||
|
||||
issue_3192: {
|
||||
options = {
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
@@ -657,7 +570,7 @@ issue_3192: {
|
||||
if_increment: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
reduce_vars: true,
|
||||
unused: true,
|
||||
}
|
||||
@@ -679,7 +592,7 @@ if_increment: {
|
||||
try_increment: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
reduce_vars: true,
|
||||
unused: true,
|
||||
}
|
||||
@@ -703,7 +616,7 @@ try_increment: {
|
||||
issue_2630_3: {
|
||||
options = {
|
||||
inline: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
reduce_vars: true,
|
||||
unused: true,
|
||||
}
|
||||
@@ -740,7 +653,7 @@ issue_2630_3: {
|
||||
issue_3364: {
|
||||
options = {
|
||||
functions: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
reduce_vars: true,
|
||||
toplevel: true,
|
||||
unused: true,
|
||||
@@ -805,7 +718,7 @@ issue_3364: {
|
||||
|
||||
defun_label: {
|
||||
options = {
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
passes: 2,
|
||||
reduce_funcs: true,
|
||||
reduce_vars: true,
|
||||
@@ -837,7 +750,7 @@ defun_label: {
|
||||
|
||||
iife_func_side_effects: {
|
||||
options = {
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
reduce_funcs: true,
|
||||
reduce_vars: true,
|
||||
unused: true,
|
||||
@@ -889,7 +802,7 @@ iife_func_side_effects: {
|
||||
issue_1595_1: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
reduce_funcs: true,
|
||||
reduce_vars: true,
|
||||
unused: true,
|
||||
@@ -909,7 +822,7 @@ issue_1595_1: {
|
||||
issue_1595_2: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
reduce_funcs: true,
|
||||
reduce_vars: true,
|
||||
unused: true,
|
||||
@@ -929,7 +842,7 @@ issue_1595_2: {
|
||||
issue_1595_3: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
passes: 2,
|
||||
reduce_funcs: true,
|
||||
reduce_vars: true,
|
||||
@@ -950,7 +863,7 @@ issue_1595_3: {
|
||||
issue_1595_4: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
reduce_funcs: true,
|
||||
reduce_vars: true,
|
||||
unused: true,
|
||||
@@ -972,7 +885,7 @@ issue_1595_4: {
|
||||
|
||||
duplicate_lambda_defun_name_1: {
|
||||
options = {
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
reduce_vars: true,
|
||||
}
|
||||
input: {
|
||||
@@ -992,7 +905,7 @@ duplicate_lambda_defun_name_1: {
|
||||
|
||||
duplicate_lambda_defun_name_2: {
|
||||
options = {
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
passes: 2,
|
||||
reduce_vars: true,
|
||||
unused: true,
|
||||
@@ -1013,7 +926,7 @@ duplicate_lambda_defun_name_2: {
|
||||
|
||||
function_name_mangle: {
|
||||
options = {
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
keep_fnames: true,
|
||||
reduce_vars: true,
|
||||
unused: true,
|
||||
@@ -1031,7 +944,7 @@ function_name_mangle: {
|
||||
|
||||
function_name_mangle_ie8: {
|
||||
options = {
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
keep_fnames: true,
|
||||
reduce_vars: true,
|
||||
unused: true,
|
||||
@@ -1052,7 +965,7 @@ function_name_mangle_ie8: {
|
||||
|
||||
issue_3420_1: {
|
||||
options = {
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
@@ -1075,7 +988,7 @@ issue_3420_1: {
|
||||
issue_3420_2: {
|
||||
options = {
|
||||
inline: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
@@ -1096,7 +1009,7 @@ issue_3420_2: {
|
||||
issue_3420_3: {
|
||||
options = {
|
||||
inline: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
reduce_vars: true,
|
||||
unused: true,
|
||||
}
|
||||
@@ -1118,7 +1031,7 @@ issue_3420_3: {
|
||||
|
||||
issue_3423_1: {
|
||||
options = {
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
@@ -1138,7 +1051,7 @@ issue_3423_1: {
|
||||
|
||||
issue_3423_2: {
|
||||
options = {
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
@@ -1165,7 +1078,7 @@ collapse_vars_repeated: {
|
||||
hoist_funs: true,
|
||||
if_return: true,
|
||||
join_vars: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
loops: true,
|
||||
properties: true,
|
||||
reduce_funcs: true,
|
||||
@@ -1212,7 +1125,7 @@ collapse_vars_repeated: {
|
||||
chained_3: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
@@ -1236,7 +1149,7 @@ replace_all_var_scope: {
|
||||
rename = true
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
unused: true,
|
||||
}
|
||||
mangle = {}
|
||||
@@ -1265,7 +1178,7 @@ replace_all_var_scope: {
|
||||
|
||||
issue_1583: {
|
||||
options = {
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
passes: 2,
|
||||
reduce_funcs: true,
|
||||
reduce_vars: true,
|
||||
@@ -1302,7 +1215,7 @@ issues_3267_1: {
|
||||
dead_code: true,
|
||||
evaluate: true,
|
||||
inline: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
reduce_vars: true,
|
||||
sequences: true,
|
||||
side_effects: true,
|
||||
@@ -1331,7 +1244,7 @@ issues_3267_1: {
|
||||
|
||||
trailing_argument_side_effects: {
|
||||
options = {
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
@@ -1355,7 +1268,7 @@ trailing_argument_side_effects: {
|
||||
|
||||
recursive_iife_1: {
|
||||
options = {
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
reduce_vars: true,
|
||||
unused: true,
|
||||
}
|
||||
@@ -1374,7 +1287,7 @@ recursive_iife_1: {
|
||||
|
||||
recursive_iife_2: {
|
||||
options = {
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
reduce_vars: true,
|
||||
unused: true,
|
||||
}
|
||||
@@ -1452,3 +1365,37 @@ issue_3619: {
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
issue_4353_1: {
|
||||
options = {
|
||||
keep_fargs: false,
|
||||
reduce_vars: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
console.log(function f(a) {}.length);
|
||||
}
|
||||
expect: {
|
||||
console.log(function(a) {}.length);
|
||||
}
|
||||
expect_stdout: "1"
|
||||
}
|
||||
|
||||
issue_4353_2: {
|
||||
options = {
|
||||
keep_fargs: false,
|
||||
reduce_vars: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
(function f(a) {
|
||||
while (console.log("PASS"));
|
||||
})();
|
||||
}
|
||||
expect: {
|
||||
(function() {
|
||||
while (console.log("PASS"));
|
||||
})();
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
@@ -207,3 +207,123 @@ labels_10: {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
issue_4466_1: {
|
||||
mangle = {
|
||||
v8: false,
|
||||
}
|
||||
input: {
|
||||
A: if (console.log("PASS"))
|
||||
B:;
|
||||
else
|
||||
C:;
|
||||
}
|
||||
expect: {
|
||||
e: if (console.log("PASS"))
|
||||
l:;
|
||||
else
|
||||
l:;
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=12"
|
||||
}
|
||||
|
||||
issue_4466_1_v8: {
|
||||
mangle = {
|
||||
v8: true,
|
||||
}
|
||||
input: {
|
||||
A: if (console.log("PASS"))
|
||||
B:;
|
||||
else
|
||||
C:;
|
||||
}
|
||||
expect: {
|
||||
e: if (console.log("PASS"))
|
||||
l:;
|
||||
else
|
||||
o:;
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=12"
|
||||
}
|
||||
|
||||
issue_4466_2: {
|
||||
mangle = {
|
||||
toplevel: false,
|
||||
v8: false,
|
||||
}
|
||||
input: {
|
||||
if (console.log("PASS"))
|
||||
A:;
|
||||
else
|
||||
B:;
|
||||
}
|
||||
expect: {
|
||||
if (console.log("PASS"))
|
||||
e:;
|
||||
else
|
||||
e:;
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
issue_4466_2_v8: {
|
||||
mangle = {
|
||||
toplevel: false,
|
||||
v8: true,
|
||||
}
|
||||
input: {
|
||||
if (console.log("PASS"))
|
||||
A:;
|
||||
else
|
||||
B:;
|
||||
}
|
||||
expect: {
|
||||
if (console.log("PASS"))
|
||||
e:;
|
||||
else
|
||||
l:;
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
issue_4466_2_toplevel: {
|
||||
mangle = {
|
||||
toplevel: true,
|
||||
v8: false,
|
||||
}
|
||||
input: {
|
||||
if (console.log("PASS"))
|
||||
A:;
|
||||
else
|
||||
B:;
|
||||
}
|
||||
expect: {
|
||||
if (console.log("PASS"))
|
||||
e:;
|
||||
else
|
||||
e:;
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
issue_4466_2_toplevel_v8: {
|
||||
mangle = {
|
||||
toplevel: true,
|
||||
v8: true,
|
||||
}
|
||||
input: {
|
||||
if (console.log("PASS"))
|
||||
A:;
|
||||
else
|
||||
B:;
|
||||
}
|
||||
expect: {
|
||||
if (console.log("PASS"))
|
||||
e:;
|
||||
else
|
||||
e:;
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
@@ -359,6 +359,108 @@ reduce_block_2_toplevel: {
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
reduce_vars_1: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
reduce_vars: true,
|
||||
toplevel: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
"use strict";
|
||||
let a = "PASS";
|
||||
console.log(a);
|
||||
a = "FAIL";
|
||||
}
|
||||
expect: {
|
||||
"use strict";
|
||||
console.log("PASS");
|
||||
"FAIL";
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
reduce_vars_2: {
|
||||
options = {
|
||||
reduce_funcs: true,
|
||||
reduce_vars: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
"use strict";
|
||||
(function() {
|
||||
function f() {
|
||||
console.log(typeof a);
|
||||
}
|
||||
for (let a in [ 42 ])
|
||||
f();
|
||||
})();
|
||||
}
|
||||
expect: {
|
||||
"use strict";
|
||||
(function() {
|
||||
function f() {
|
||||
console.log(typeof a);
|
||||
}
|
||||
for (let a in [ 42 ])
|
||||
f();
|
||||
})();
|
||||
}
|
||||
expect_stdout: "undefined"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
reduce_vars_3: {
|
||||
options = {
|
||||
reduce_funcs: true,
|
||||
reduce_vars: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
"use strict";
|
||||
(function(a) {
|
||||
let i = 1;
|
||||
function f() {
|
||||
i = 0;
|
||||
}
|
||||
for (let i = 0, x = 0; i < a.length; i++, x++) {
|
||||
if (x != i) {
|
||||
console.log("FAIL");
|
||||
break;
|
||||
}
|
||||
f();
|
||||
console.log(a[i]);
|
||||
}
|
||||
console.log(i);
|
||||
})([ 4, 2 ]);
|
||||
}
|
||||
expect: {
|
||||
"use strict";
|
||||
(function(a) {
|
||||
let i = 1;
|
||||
function f() {
|
||||
i = 0;
|
||||
}
|
||||
for (let i = 0, x = 0; i < a.length; i++, x++) {
|
||||
if (x != i) {
|
||||
console.log("FAIL");
|
||||
break;
|
||||
}
|
||||
f();
|
||||
console.log(a[i]);
|
||||
}
|
||||
console.log(i);
|
||||
})([ 4, 2 ]);
|
||||
}
|
||||
expect_stdout: [
|
||||
"4",
|
||||
"2",
|
||||
"0",
|
||||
]
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
hoist_props: {
|
||||
options = {
|
||||
hoist_props: true,
|
||||
@@ -588,6 +690,28 @@ drop_unused: {
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
default_init: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
reduce_vars: true,
|
||||
sequences: true,
|
||||
toplevel: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
"use strict";
|
||||
let a;
|
||||
a = "PASS";
|
||||
console.log(a);
|
||||
}
|
||||
expect: {
|
||||
"use strict";
|
||||
console.log("PASS");
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
issue_4191: {
|
||||
options = {
|
||||
functions: true,
|
||||
@@ -1228,3 +1352,197 @@ issue_1753_toplevel: {
|
||||
expect_stdout: "0"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
issue_4438: {
|
||||
options = {
|
||||
if_return: true,
|
||||
}
|
||||
input: {
|
||||
"use strict";
|
||||
function f() {
|
||||
if (console) {
|
||||
{
|
||||
let a = console.log;
|
||||
return void a("PASS");
|
||||
}
|
||||
}
|
||||
}
|
||||
f();
|
||||
}
|
||||
expect: {
|
||||
"use strict";
|
||||
function f() {
|
||||
if (!console)
|
||||
;
|
||||
else {
|
||||
let a = console.log;
|
||||
a("PASS");
|
||||
}
|
||||
}
|
||||
f();
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
issue_4531_1: {
|
||||
mangle = {
|
||||
ie8: true,
|
||||
toplevel: true,
|
||||
}
|
||||
input: {
|
||||
"use strict";
|
||||
var a;
|
||||
console.log(function a() {
|
||||
let a;
|
||||
var b;
|
||||
}());
|
||||
}
|
||||
expect: {
|
||||
"use strict";
|
||||
var o;
|
||||
console.log(function o() {
|
||||
let o;
|
||||
var t;
|
||||
}());
|
||||
}
|
||||
expect_stdout: "undefined"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
issue_4531_2: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
ie8: true,
|
||||
toplevel: true,
|
||||
}
|
||||
mangle = {
|
||||
ie8: true,
|
||||
toplevel: true,
|
||||
}
|
||||
input: {
|
||||
var a = console;
|
||||
console.log(typeof a, function a() {
|
||||
let { [console]: a } = 0 && a;
|
||||
var b = console;
|
||||
while (!b);
|
||||
}());
|
||||
}
|
||||
expect: {
|
||||
var o = console;
|
||||
console.log(typeof o, function o() {
|
||||
let { [console]: o } = 0;
|
||||
var e = console;
|
||||
while (!e);
|
||||
}());
|
||||
}
|
||||
expect_stdout: "object undefined"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
issue_4689: {
|
||||
options = {
|
||||
sequences: true,
|
||||
}
|
||||
input: {
|
||||
"use strict";
|
||||
var a = "PASS";
|
||||
console.log(a);
|
||||
for (let a in 42);
|
||||
}
|
||||
expect: {
|
||||
"use strict";
|
||||
var a = "PASS";
|
||||
console.log(a);
|
||||
for (let a in 42);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
issue_4691: {
|
||||
options = {
|
||||
if_return: true,
|
||||
toplevel: true,
|
||||
}
|
||||
input: {
|
||||
"use strict";
|
||||
function A() {}
|
||||
A.prototype.f = function() {
|
||||
if (!this)
|
||||
return;
|
||||
let a = "PA";
|
||||
function g(b) {
|
||||
h(a + b);
|
||||
}
|
||||
[ "SS" ].forEach(function(c) {
|
||||
g(c);
|
||||
});
|
||||
};
|
||||
function h(d) {
|
||||
console.log(d);
|
||||
}
|
||||
new A().f();
|
||||
}
|
||||
expect: {
|
||||
"use strict";
|
||||
function A() {}
|
||||
A.prototype.f = function() {
|
||||
if (this) {
|
||||
let a = "PA";
|
||||
[ "SS" ].forEach(function(c) {
|
||||
g(c);
|
||||
});
|
||||
function g(b) {
|
||||
h(a + b);
|
||||
}
|
||||
}
|
||||
};
|
||||
function h(d) {
|
||||
console.log(d);
|
||||
}
|
||||
new A().f();
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
issue_4848: {
|
||||
options = {
|
||||
if_return: true,
|
||||
}
|
||||
input: {
|
||||
"use strict";
|
||||
function f(a) {
|
||||
a(function() {
|
||||
console.log(b);
|
||||
});
|
||||
if (!console)
|
||||
return;
|
||||
let b = "PASS";
|
||||
}
|
||||
var g;
|
||||
f(function(h) {
|
||||
g = h;
|
||||
});
|
||||
g();
|
||||
}
|
||||
expect: {
|
||||
"use strict";
|
||||
function f(a) {
|
||||
a(function() {
|
||||
console.log(b);
|
||||
});
|
||||
if (!console)
|
||||
return;
|
||||
let b = "PASS";
|
||||
}
|
||||
var g;
|
||||
f(function(h) {
|
||||
g = h;
|
||||
});
|
||||
g();
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
@@ -501,14 +501,14 @@ do_switch: {
|
||||
}
|
||||
}
|
||||
|
||||
in_parenthesis_1: {
|
||||
in_parentheses_1: {
|
||||
input: {
|
||||
for (("foo" in {});0;);
|
||||
}
|
||||
expect_exact: 'for(("foo"in{});0;);'
|
||||
}
|
||||
|
||||
in_parenthesis_2: {
|
||||
in_parentheses_2: {
|
||||
input: {
|
||||
for ((function(){ "foo" in {}; });0;);
|
||||
}
|
||||
@@ -828,6 +828,44 @@ empty_for_in_prop_init: {
|
||||
]
|
||||
}
|
||||
|
||||
for_of: {
|
||||
input: {
|
||||
var a = [ "PASS", 42 ];
|
||||
a.p = "FAIL";
|
||||
for (a of (null, a))
|
||||
console.log(a);
|
||||
}
|
||||
expect_exact: 'var a=["PASS",42];a.p="FAIL";for(a of(null,a))console.log(a);'
|
||||
expect_stdout: true
|
||||
node_version: ">=0.12"
|
||||
}
|
||||
|
||||
for_async_of: {
|
||||
input: {
|
||||
var async = [ "PASS", 42 ];
|
||||
async.p = "FAIL";
|
||||
for (async of (null, async))
|
||||
console.log(async);
|
||||
}
|
||||
expect_exact: 'var async=["PASS",42];async.p="FAIL";for(async of(null,async))console.log(async);'
|
||||
expect_stdout: true
|
||||
node_version: ">=0.12 <16"
|
||||
}
|
||||
|
||||
for_of_regexp: {
|
||||
input: {
|
||||
for (var a of /foo/);
|
||||
}
|
||||
expect_exact: "for(var a of/foo/);"
|
||||
}
|
||||
|
||||
for_await_of_regexp: {
|
||||
input: {
|
||||
for await (var a of /foo/);
|
||||
}
|
||||
expect_exact: "for await(var a of/foo/);"
|
||||
}
|
||||
|
||||
issue_3631_1: {
|
||||
options = {
|
||||
dead_code: true,
|
||||
@@ -1026,7 +1064,7 @@ issue_4075: {
|
||||
|
||||
issue_4082: {
|
||||
options = {
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
loops: true,
|
||||
unused: true,
|
||||
}
|
||||
@@ -1050,9 +1088,8 @@ issue_4082: {
|
||||
|
||||
issue_4084: {
|
||||
options = {
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
loops: true,
|
||||
passes: 2,
|
||||
reduce_vars: true,
|
||||
unused: true,
|
||||
}
|
||||
@@ -1255,3 +1292,59 @@ issue_4240: {
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
issue_4355: {
|
||||
options = {
|
||||
dead_code: true,
|
||||
evaluate: true,
|
||||
loops: true,
|
||||
passes: 2,
|
||||
side_effects: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
while (function() {
|
||||
var a;
|
||||
for (a in console.log("PASS"))
|
||||
var b = 0;
|
||||
}())
|
||||
var c;
|
||||
}
|
||||
expect: {
|
||||
(function() {
|
||||
console.log("PASS");
|
||||
})();
|
||||
var c;
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
issue_4564: {
|
||||
options = {
|
||||
loops: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
try {
|
||||
throw null;
|
||||
} catch (a) {
|
||||
var a;
|
||||
(function() {
|
||||
for (a in "foo");
|
||||
})();
|
||||
console.log(a);
|
||||
}
|
||||
}
|
||||
expect: {
|
||||
try {
|
||||
throw null;
|
||||
} catch (a) {
|
||||
var a;
|
||||
(function() {
|
||||
for (a in "foo");
|
||||
})();
|
||||
console.log(a);
|
||||
}
|
||||
}
|
||||
expect_stdout: "2"
|
||||
}
|
||||
|
||||
@@ -327,7 +327,7 @@ issue_4103: {
|
||||
|
||||
issue_4107: {
|
||||
options = {
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
merge_vars: true,
|
||||
reduce_vars: true,
|
||||
unused: true,
|
||||
@@ -2620,9 +2620,9 @@ issue_4126_1: {
|
||||
try {
|
||||
console.log("PASS");
|
||||
} catch (e) {
|
||||
var b = a;
|
||||
var c = a;
|
||||
} finally {
|
||||
var c = b;
|
||||
var c = c;
|
||||
}
|
||||
console.log(c);
|
||||
}
|
||||
@@ -3183,3 +3183,121 @@ issue_4257: {
|
||||
"1",
|
||||
]
|
||||
}
|
||||
|
||||
issue_4628: {
|
||||
options = {
|
||||
merge_vars: true,
|
||||
}
|
||||
input: {
|
||||
(function() {
|
||||
try {
|
||||
console;
|
||||
} finally {
|
||||
var b = a;
|
||||
}
|
||||
for (var a in "foo");
|
||||
console.log(b);
|
||||
})();
|
||||
}
|
||||
expect: {
|
||||
(function() {
|
||||
try {
|
||||
console;
|
||||
} finally {
|
||||
var b = a;
|
||||
}
|
||||
for (var a in "foo");
|
||||
console.log(b);
|
||||
})();
|
||||
}
|
||||
expect_stdout: "undefined"
|
||||
}
|
||||
|
||||
issue_4653: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
merge_vars: true,
|
||||
reduce_vars: true,
|
||||
toplevel: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
var a = 1, b;
|
||||
function f(c, d) {
|
||||
c || console.log(d);
|
||||
}
|
||||
f(a++ + (b = b), b |= console.log(a));
|
||||
}
|
||||
expect: {
|
||||
var b = 1;
|
||||
(function(c, d) {
|
||||
c || console.log(d);
|
||||
})(+b + (b = void 0), b |= console.log(2));
|
||||
}
|
||||
expect_stdout: [
|
||||
"2",
|
||||
"0",
|
||||
]
|
||||
}
|
||||
|
||||
issue_4759: {
|
||||
options = {
|
||||
merge_vars: true,
|
||||
toplevel: true,
|
||||
}
|
||||
input: {
|
||||
var i = 2, a = 1, b, c, d;
|
||||
while (i--) {
|
||||
try {
|
||||
if (1 != b) {
|
||||
d = [];
|
||||
null.p;
|
||||
c = d;
|
||||
} else {
|
||||
b = 0;
|
||||
a = c;
|
||||
}
|
||||
} catch (e) {}
|
||||
b = a;
|
||||
}
|
||||
console.log(a);
|
||||
}
|
||||
expect: {
|
||||
var i = 2, a = 1, b, c, d;
|
||||
while (i--) {
|
||||
try {
|
||||
if (1 != b) {
|
||||
d = [];
|
||||
null.p;
|
||||
c = d;
|
||||
} else {
|
||||
b = 0;
|
||||
a = c;
|
||||
}
|
||||
} catch (e) {}
|
||||
b = a;
|
||||
}
|
||||
console.log(a);
|
||||
}
|
||||
expect_stdout: "undefined"
|
||||
}
|
||||
|
||||
issue_4761: {
|
||||
options = {
|
||||
merge_vars: true,
|
||||
toplevel: true,
|
||||
}
|
||||
input: {
|
||||
var a = "FAIL", b;
|
||||
try {
|
||||
!a && --a && (b = 0)[console] || console.log(b);
|
||||
} catch (e) {}
|
||||
}
|
||||
expect: {
|
||||
var a = "FAIL", b;
|
||||
try {
|
||||
!a && --a && (b = 0)[console] || console.log(b);
|
||||
} catch (e) {}
|
||||
}
|
||||
expect_stdout: "undefined"
|
||||
}
|
||||
|
||||
@@ -85,7 +85,7 @@ new_with_unary_prefix: {
|
||||
expect_exact: 'var bar=(+new Date).toString(32);';
|
||||
}
|
||||
|
||||
dot_parenthesis_1: {
|
||||
dot_parentheses_1: {
|
||||
input: {
|
||||
console.log(new (Math.random().constructor) instanceof Number);
|
||||
}
|
||||
@@ -93,7 +93,7 @@ dot_parenthesis_1: {
|
||||
expect_stdout: "true"
|
||||
}
|
||||
|
||||
dot_parenthesis_2: {
|
||||
dot_parentheses_2: {
|
||||
input: {
|
||||
console.log(typeof new function(){Math.random()}.constructor);
|
||||
}
|
||||
|
||||
130
test/compress/nullish.js
Normal file
130
test/compress/nullish.js
Normal file
@@ -0,0 +1,130 @@
|
||||
parentheses: {
|
||||
input: {
|
||||
(console.log("foo") || console.log("bar") ?? console.log("baz")) && console.log("moo");
|
||||
}
|
||||
expect_exact:'((console.log("foo")||console.log("bar"))??console.log("baz"))&&console.log("moo");'
|
||||
expect_stdout: [
|
||||
"foo",
|
||||
"bar",
|
||||
"baz",
|
||||
]
|
||||
node_version: ">=14"
|
||||
}
|
||||
|
||||
evaluate: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
void console.log("foo" ?? "bar") ?? console.log("baz");
|
||||
}
|
||||
expect: {
|
||||
console.log("foo"),
|
||||
console.log("baz");
|
||||
}
|
||||
expect_stdout: [
|
||||
"foo",
|
||||
"baz",
|
||||
]
|
||||
node_version: ">=14"
|
||||
}
|
||||
|
||||
conditional_assignment_1: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
}
|
||||
input: {
|
||||
console.log(function(a, b) {
|
||||
b ?? (a = "FAIL");
|
||||
return a;
|
||||
}("PASS", !console));
|
||||
}
|
||||
expect: {
|
||||
console.log(function(a, b) {
|
||||
b ?? (a = "FAIL");
|
||||
return a;
|
||||
}("PASS", !console));
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=14"
|
||||
}
|
||||
|
||||
conditional_assignment_2: {
|
||||
options = {
|
||||
conditionals: true,
|
||||
}
|
||||
input: {
|
||||
var a, b = false;
|
||||
a = "PASS",
|
||||
b ?? (a = "FAIL"),
|
||||
console.log(a);
|
||||
}
|
||||
expect: {
|
||||
var a, b = false;
|
||||
a = "PASS",
|
||||
b ?? (a = "FAIL"),
|
||||
console.log(a);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=14"
|
||||
}
|
||||
|
||||
conditional_assignment_3: {
|
||||
options = {
|
||||
conditionals: true,
|
||||
join_vars: true,
|
||||
}
|
||||
input: {
|
||||
var a, b = false;
|
||||
a = "PASS",
|
||||
b ?? (a = "FAIL"),
|
||||
console.log(a);
|
||||
}
|
||||
expect: {
|
||||
var a, b = false, a = "PASS";
|
||||
b ?? (a = "FAIL"),
|
||||
console.log(a);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=14"
|
||||
}
|
||||
|
||||
conditional_assignment_4: {
|
||||
options = {
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
console.log(function(a) {
|
||||
!console ?? (a = "FAIL");
|
||||
return a;
|
||||
}("PASS"));
|
||||
}
|
||||
expect: {
|
||||
console.log(function(a) {
|
||||
!console ?? (a = "FAIL");
|
||||
return a;
|
||||
}("PASS"));
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=14"
|
||||
}
|
||||
|
||||
issue_4679: {
|
||||
options = {
|
||||
comparisons: true,
|
||||
ie8: true,
|
||||
}
|
||||
input: {
|
||||
var a;
|
||||
if (void 0 === (undefined ?? a))
|
||||
console.log("PASS");
|
||||
}
|
||||
expect: {
|
||||
var a;
|
||||
if (void 0 === (undefined ?? a))
|
||||
console.log("PASS");
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=14"
|
||||
}
|
||||
@@ -1,3 +1,10 @@
|
||||
literal_infinity: {
|
||||
input: {
|
||||
console.log(2e308, -1e2345);
|
||||
}
|
||||
expect_exact: "console.log(1/0,-(1/0));"
|
||||
}
|
||||
|
||||
parentheses_for_prototype_functions: {
|
||||
beautify = {
|
||||
beautify: true,
|
||||
@@ -97,6 +104,40 @@ parentheses_for_prototype_functions_galio: {
|
||||
expect_stdout: true
|
||||
}
|
||||
|
||||
octal: {
|
||||
beautify = {
|
||||
beautify: true,
|
||||
}
|
||||
input: {
|
||||
(function() {
|
||||
console.log(052);
|
||||
console.log(-052);
|
||||
|
||||
console.log(018);
|
||||
console.log(-018);
|
||||
|
||||
console.log(052.toFixed(0));
|
||||
console.log(-052.toFixed(0));
|
||||
|
||||
console.log(018..toFixed(0));
|
||||
console.log(-018..toFixed(0));
|
||||
})();
|
||||
}
|
||||
expect_exact: [
|
||||
"(function() {",
|
||||
" console.log(42);",
|
||||
" console.log(-42);",
|
||||
" console.log(18);",
|
||||
" console.log(-18);",
|
||||
" console.log(42..toFixed(0));",
|
||||
" console.log(-42..toFixed(0));",
|
||||
" console.log(18..toFixed(0));",
|
||||
" console.log(-18..toFixed(0));",
|
||||
"})();",
|
||||
]
|
||||
expect_stdout: true
|
||||
}
|
||||
|
||||
comparisons: {
|
||||
options = {
|
||||
comparisons: true,
|
||||
@@ -338,7 +379,7 @@ evaluate_3: {
|
||||
console.log(1 + Number(x) + 2);
|
||||
}
|
||||
expect: {
|
||||
console.log(+x + 3);
|
||||
console.log(+("" + x) + 3);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -777,7 +818,7 @@ issue_1710: {
|
||||
expect_stdout: true
|
||||
}
|
||||
|
||||
unary_binary_parenthesis: {
|
||||
unary_binary_parentheses: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
}
|
||||
@@ -1386,3 +1427,75 @@ issue_4142: {
|
||||
}
|
||||
expect_stdout: "0"
|
||||
}
|
||||
|
||||
issue_4542_1: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
unsafe_math: true,
|
||||
}
|
||||
input: {
|
||||
console.log(function(a) {
|
||||
return a / (1 / (a[0] = 2));
|
||||
}([ 3 ]));
|
||||
}
|
||||
expect: {
|
||||
console.log(function(a) {
|
||||
return a / (1 / (a[0] = 2));
|
||||
}([ 3 ]));
|
||||
}
|
||||
expect_stdout: "4"
|
||||
}
|
||||
|
||||
issue_4542_2: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
unsafe_math: true,
|
||||
}
|
||||
input: {
|
||||
console.log(function(a) {
|
||||
return a / (1 / --a[0]);
|
||||
}([ 3 ]));
|
||||
}
|
||||
expect: {
|
||||
console.log(function(a) {
|
||||
return a / (1 / --a[0]);
|
||||
}([ 3 ]));
|
||||
}
|
||||
expect_stdout: "4"
|
||||
}
|
||||
|
||||
issue_4542_3: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
unsafe_math: true,
|
||||
}
|
||||
input: {
|
||||
console.log(function(a) {
|
||||
return a / (0 / (a[0] = 0, 1));
|
||||
}([ 1 ]));
|
||||
}
|
||||
expect: {
|
||||
console.log(function(a) {
|
||||
return a / (0 / (a[0] = 0, 1));
|
||||
}([ 1 ]));
|
||||
}
|
||||
expect_stdout: "NaN"
|
||||
}
|
||||
|
||||
issue_4542_4: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
unsafe_math: true,
|
||||
}
|
||||
input: {
|
||||
console.log(function(a) {
|
||||
return a / (1 / (a.length = 1));
|
||||
}([ 2, 3 ]));
|
||||
}
|
||||
expect: {
|
||||
console.log(function(a) {
|
||||
return a / (1 / (a.length = 1));
|
||||
}([ 2, 3 ]));
|
||||
}
|
||||
expect_stdout: "2"
|
||||
}
|
||||
|
||||
@@ -45,8 +45,8 @@ duplicate_key_strict: {
|
||||
"use strict";
|
||||
var o = {
|
||||
a: 1,
|
||||
b: 2,
|
||||
a: 3,
|
||||
b: 2,
|
||||
};
|
||||
for (var k in o)
|
||||
console.log(k, o[k]);
|
||||
@@ -257,6 +257,95 @@ keep_computed_key: {
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
shorthand_keywords: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
reduce_vars: true,
|
||||
toplevel: true,
|
||||
unsafe: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
var async = 1, get = 2, set = 3, o = {
|
||||
async,
|
||||
get,
|
||||
set,
|
||||
};
|
||||
console.log(o.async, o.get, o.set);
|
||||
}
|
||||
expect: {
|
||||
console.log(1, 2, 3);
|
||||
}
|
||||
expect_stdout: "1 2 3"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
object_super: {
|
||||
input: {
|
||||
var o = {
|
||||
f() {
|
||||
return super.p;
|
||||
},
|
||||
p: "FAIL",
|
||||
};
|
||||
Object.setPrototypeOf(o, { p: "PASS" });
|
||||
console.log(o.f());
|
||||
}
|
||||
expect_exact: 'var o={f(){return super.p},p:"FAIL"};Object.setPrototypeOf(o,{p:"PASS"});console.log(o.f());'
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
object_super_async: {
|
||||
input: {
|
||||
var o = {
|
||||
async f() {
|
||||
return super.p;
|
||||
},
|
||||
p: "FAIL",
|
||||
};
|
||||
Object.setPrototypeOf(o, { p: "PASS" });
|
||||
o.f().then(console.log);
|
||||
}
|
||||
expect_exact: 'var o={async f(){return super.p},p:"FAIL"};Object.setPrototypeOf(o,{p:"PASS"});o.f().then(console.log);'
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=8"
|
||||
}
|
||||
|
||||
object_super_generator: {
|
||||
input: {
|
||||
var o = {
|
||||
*f() {
|
||||
yield super.p;
|
||||
},
|
||||
p: "FAIL",
|
||||
};
|
||||
Object.setPrototypeOf(o, { p: "PASS" });
|
||||
console.log(o.f().next().value);
|
||||
}
|
||||
expect_exact: 'var o={*f(){yield super.p},p:"FAIL"};Object.setPrototypeOf(o,{p:"PASS"});console.log(o.f().next().value);'
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
object_super_async_generator: {
|
||||
input: {
|
||||
var o = {
|
||||
async *f() {
|
||||
return super.p;
|
||||
},
|
||||
p: "FAIL",
|
||||
};
|
||||
Object.setPrototypeOf(o, { p: "PASS" });
|
||||
o.f().next().then(function(v) {
|
||||
console.log(v.value, v.done);
|
||||
});
|
||||
}
|
||||
expect_exact: 'var o={async*f(){return super.p},p:"FAIL"};Object.setPrototypeOf(o,{p:"PASS"});o.f().next().then(function(v){console.log(v.value,v.done)});'
|
||||
expect_stdout: "PASS true"
|
||||
node_version: ">=10"
|
||||
}
|
||||
|
||||
issue_4269_1: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
@@ -323,8 +412,8 @@ issue_4269_3: {
|
||||
}
|
||||
expect: {
|
||||
console.log({
|
||||
["foo"]: "bar",
|
||||
get 42() {
|
||||
foo: "bar",
|
||||
get [42]() {
|
||||
return "FAIL";
|
||||
},
|
||||
42: "PASS",
|
||||
@@ -353,10 +442,82 @@ issue_4269_4: {
|
||||
get 42() {
|
||||
return "FAIL";
|
||||
},
|
||||
["foo"]: "bar",
|
||||
foo: "bar",
|
||||
[42]: "PASS",
|
||||
}[42]);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
issue_4269_5: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
objects: true,
|
||||
}
|
||||
input: {
|
||||
console.log({
|
||||
get 42() {
|
||||
return "FAIL";
|
||||
},
|
||||
[console]: "bar",
|
||||
42: "PASS",
|
||||
}[42]);
|
||||
}
|
||||
expect: {
|
||||
console.log({
|
||||
get 42() {
|
||||
return "FAIL";
|
||||
},
|
||||
[console]: "bar",
|
||||
42: "PASS",
|
||||
}[42]);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
issue_4380: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
objects: true,
|
||||
}
|
||||
input: {
|
||||
console.log({
|
||||
get 0() {
|
||||
return "FAIL 1";
|
||||
},
|
||||
0: "FAIL 2",
|
||||
[0]: "PASS",
|
||||
}[0]);
|
||||
}
|
||||
expect: {
|
||||
console.log({
|
||||
get 0() {
|
||||
return "FAIL 1";
|
||||
},
|
||||
[0]: ("FAIL 2", "PASS"),
|
||||
}[0]);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
issue_4415: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
objects: true,
|
||||
}
|
||||
input: {
|
||||
console.log({
|
||||
["00"]: "FAIL",
|
||||
}[0] || "PASS");
|
||||
}
|
||||
expect: {
|
||||
console.log({
|
||||
"00": "FAIL",
|
||||
}[0] || "PASS");
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
@@ -1378,3 +1378,71 @@ issue_3389: {
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
object_super: {
|
||||
options = {
|
||||
properties: true,
|
||||
}
|
||||
input: {
|
||||
({
|
||||
f(a) {
|
||||
return a ? console.log("PASS") : super.log("PASS");
|
||||
},
|
||||
}).f(console);
|
||||
}
|
||||
expect: {
|
||||
({
|
||||
f(a) {
|
||||
return a ? console.log("PASS") : super.log("PASS");
|
||||
},
|
||||
}).f(console);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
issue_4831_1: {
|
||||
options = {
|
||||
properties: true,
|
||||
}
|
||||
input: {
|
||||
console.log({
|
||||
f() {
|
||||
return arguments;
|
||||
},
|
||||
}.f("PASS")[0]);
|
||||
}
|
||||
expect: {
|
||||
console.log([
|
||||
function() {
|
||||
return arguments;
|
||||
},
|
||||
][0]("PASS")[0]);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
issue_4831_2: {
|
||||
options = {
|
||||
properties: true,
|
||||
}
|
||||
input: {
|
||||
var f = {
|
||||
f() {
|
||||
return arguments;
|
||||
},
|
||||
}.f;
|
||||
console.log(f("PASS")[0]);
|
||||
}
|
||||
expect: {
|
||||
var f = {
|
||||
f() {
|
||||
return arguments;
|
||||
},
|
||||
}.f;
|
||||
console.log(f("PASS")[0]);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
@@ -294,248 +294,6 @@ unary: {
|
||||
}
|
||||
}
|
||||
|
||||
issue_2629_1: {
|
||||
options = {
|
||||
side_effects: true,
|
||||
}
|
||||
beautify = {
|
||||
comments: "all",
|
||||
}
|
||||
input: {
|
||||
/*@__PURE__*/ a();
|
||||
/*@__PURE__*/ (b());
|
||||
(/*@__PURE__*/ c)();
|
||||
(/*@__PURE__*/ d());
|
||||
}
|
||||
expect_exact: [
|
||||
"/* */c();",
|
||||
]
|
||||
}
|
||||
|
||||
issue_2629_2: {
|
||||
options = {
|
||||
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 = {
|
||||
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 = {
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
(/*@__PURE__*/ x(), y());
|
||||
(w(), /*@__PURE__*/ x(), y());
|
||||
}
|
||||
expect: {
|
||||
y();
|
||||
w(), y();
|
||||
}
|
||||
}
|
||||
|
||||
issue_2629_5: {
|
||||
options = {
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
[ /*@__PURE__*/ x() ];
|
||||
[ /*@__PURE__*/ x(), y() ];
|
||||
[ w(), /*@__PURE__*/ x(), y() ];
|
||||
}
|
||||
expect: {
|
||||
y();
|
||||
w(), y();
|
||||
}
|
||||
}
|
||||
|
||||
issue_2638: {
|
||||
options = {
|
||||
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 = {
|
||||
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 = {
|
||||
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 = {
|
||||
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 = {
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
(/*@__PURE__*/ new x(), y());
|
||||
(w(), /*@__PURE__*/ new x(), y());
|
||||
}
|
||||
expect: {
|
||||
y();
|
||||
w(), y();
|
||||
}
|
||||
}
|
||||
|
||||
issue_2705_5: {
|
||||
options = {
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
[ /*@__PURE__*/ new x() ];
|
||||
[ /*@__PURE__*/ new x(), y() ];
|
||||
[ w(), /*@__PURE__*/ new x(), y() ];
|
||||
}
|
||||
expect: {
|
||||
y();
|
||||
w(), y();
|
||||
}
|
||||
}
|
||||
|
||||
issue_2705_6: {
|
||||
options = {
|
||||
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_3065_1: {
|
||||
options = {
|
||||
inline: true,
|
||||
@@ -680,130 +438,3 @@ issue_3325_2: {
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
issue_3858: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
inline: true,
|
||||
keep_fargs: "strict",
|
||||
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 = {
|
||||
collapse_vars: true,
|
||||
inline: true,
|
||||
keep_fargs: "strict",
|
||||
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 = {
|
||||
collapse_vars: true,
|
||||
inline: true,
|
||||
keep_fargs: "strict",
|
||||
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 = {
|
||||
collapse_vars: true,
|
||||
evaluate: true,
|
||||
inline: true,
|
||||
keep_fargs: "strict",
|
||||
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 = {
|
||||
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",
|
||||
]
|
||||
}
|
||||
|
||||
@@ -248,6 +248,35 @@ issue_2110_2: {
|
||||
expect_stdout: "function"
|
||||
}
|
||||
|
||||
issue_2110_3: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
pure_getters: "strict",
|
||||
reduce_vars: true,
|
||||
}
|
||||
input: {
|
||||
function g() {
|
||||
return this;
|
||||
}
|
||||
console.log(typeof function() {
|
||||
function f() {}
|
||||
f.g = g;
|
||||
return f.g();
|
||||
}());
|
||||
}
|
||||
expect: {
|
||||
function g() {
|
||||
return this;
|
||||
}
|
||||
console.log(typeof function() {
|
||||
function f() {}
|
||||
f.g = g;
|
||||
return f.g();
|
||||
}());
|
||||
}
|
||||
expect_stdout: "function"
|
||||
}
|
||||
|
||||
set_immutable_1: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
@@ -979,6 +1008,7 @@ collapse_vars_2_strict: {
|
||||
collapse_rhs_true: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
evaluate: true,
|
||||
pure_getters: true,
|
||||
}
|
||||
input: {
|
||||
@@ -1015,6 +1045,7 @@ collapse_rhs_true: {
|
||||
collapse_rhs_false: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
evaluate: true,
|
||||
pure_getters: false,
|
||||
}
|
||||
input: {
|
||||
@@ -1051,6 +1082,7 @@ collapse_rhs_false: {
|
||||
collapse_rhs_strict: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
evaluate: true,
|
||||
pure_getters: "strict",
|
||||
}
|
||||
input: {
|
||||
@@ -1087,6 +1119,7 @@ collapse_rhs_strict: {
|
||||
collapse_rhs_setter: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
evaluate: true,
|
||||
pure_getters: "strict",
|
||||
}
|
||||
input: {
|
||||
@@ -1187,13 +1220,110 @@ drop_arguments: {
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
lvalues_def: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
pure_getters: true,
|
||||
side_effects: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
var a = 0, b = 1;
|
||||
var a = b++, b = +function() {}();
|
||||
a && a[a++];
|
||||
console.log(a, b);
|
||||
}
|
||||
expect: {
|
||||
var a = 0, b = 1;
|
||||
a = b++, b = +void 0;
|
||||
a && a++;
|
||||
console.log(a, b);
|
||||
}
|
||||
expect_stdout: true
|
||||
}
|
||||
|
||||
side_effects_assign: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
pure_getters: true,
|
||||
reduce_funcs: true,
|
||||
reduce_vars: true,
|
||||
sequences: true,
|
||||
side_effects: true,
|
||||
toplevel: true,
|
||||
}
|
||||
input: {
|
||||
var a = typeof void (a && a.in == 1, 0);
|
||||
console.log(a);
|
||||
}
|
||||
expect: {
|
||||
var a = "undefined";
|
||||
console.log(a);
|
||||
}
|
||||
expect_stdout: "undefined"
|
||||
}
|
||||
|
||||
issue_2062: {
|
||||
options = {
|
||||
booleans: true,
|
||||
collapse_vars: true,
|
||||
conditionals: true,
|
||||
pure_getters: true,
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
var a = 1;
|
||||
if ([ a || a++ + a--, a++ + a--, a && a.var ]);
|
||||
console.log(a);
|
||||
}
|
||||
expect: {
|
||||
var a = 1;
|
||||
a || (a++, a--), a++, a--;
|
||||
console.log(a);
|
||||
}
|
||||
expect_stdout: "1"
|
||||
}
|
||||
|
||||
issue_2878: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
pure_getters: true,
|
||||
sequences: true,
|
||||
}
|
||||
input: {
|
||||
var c = 0;
|
||||
(function(a, b) {
|
||||
function f2() {
|
||||
if (a) c++;
|
||||
}
|
||||
b = f2();
|
||||
a = 1;
|
||||
b && b.b;
|
||||
f2();
|
||||
})();
|
||||
console.log(c);
|
||||
}
|
||||
expect: {
|
||||
var c = 0;
|
||||
(function(a, b) {
|
||||
function f2() {
|
||||
if (a) c++;
|
||||
}
|
||||
b = f2(),
|
||||
a = 1,
|
||||
f2();
|
||||
})(),
|
||||
console.log(c);
|
||||
}
|
||||
expect_stdout: "1"
|
||||
}
|
||||
|
||||
issue_3427: {
|
||||
options = {
|
||||
assignments: true,
|
||||
collapse_vars: true,
|
||||
evaluate: true,
|
||||
inline: true,
|
||||
passes: 2,
|
||||
pure_getters: "strict",
|
||||
reduce_vars: true,
|
||||
sequences: true,
|
||||
side_effects: true,
|
||||
toplevel: true,
|
||||
@@ -1208,3 +1338,303 @@ issue_3427: {
|
||||
expect: {}
|
||||
expect_stdout: true
|
||||
}
|
||||
|
||||
issue_3490_1: {
|
||||
options = {
|
||||
conditionals: true,
|
||||
dead_code: true,
|
||||
inline: true,
|
||||
pure_getters: true,
|
||||
sequences: true,
|
||||
side_effects: true,
|
||||
toplevel: true,
|
||||
}
|
||||
input: {
|
||||
var b = 42, c = "FAIL";
|
||||
if ({
|
||||
3: function() {
|
||||
var a;
|
||||
return (a && a.p) < this;
|
||||
}(),
|
||||
}) c = "PASS";
|
||||
if (b) while ("" == typeof d);
|
||||
console.log(c, b);
|
||||
}
|
||||
expect: {
|
||||
var b = 42, c = "FAIL";
|
||||
if (function() {
|
||||
var a;
|
||||
}(), c = "PASS", b) while ("" == typeof d);
|
||||
console.log(c, b);
|
||||
}
|
||||
expect_stdout: "PASS 42"
|
||||
}
|
||||
|
||||
issue_4135: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
inline: true,
|
||||
merge_vars: true,
|
||||
pure_getters: true,
|
||||
reduce_vars: true,
|
||||
side_effects: true,
|
||||
toplevel: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
var a = 0, b = 0;
|
||||
--b;
|
||||
a++;
|
||||
if (!a)
|
||||
var c = function() {
|
||||
var d = 0;
|
||||
function f() {
|
||||
d && d.p;
|
||||
}
|
||||
f();
|
||||
this;
|
||||
}(a++);
|
||||
console.log(a, b, c);
|
||||
}
|
||||
expect: {
|
||||
var a = 0;
|
||||
0;
|
||||
a++;
|
||||
if (!a)
|
||||
var c = void a++;
|
||||
console.log(a, -1, c);
|
||||
}
|
||||
expect_stdout: "1 -1 undefined"
|
||||
}
|
||||
|
||||
issue_4440: {
|
||||
options = {
|
||||
pure_getters: "strict",
|
||||
side_effects: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
try {
|
||||
(function() {
|
||||
arguments = null;
|
||||
console.log(arguments.p = "FAIL");
|
||||
})();
|
||||
} catch (e) {
|
||||
console.log("PASS");
|
||||
}
|
||||
}
|
||||
expect: {
|
||||
try {
|
||||
(function() {
|
||||
arguments = null;
|
||||
console.log(arguments.p = "FAIL");
|
||||
})();
|
||||
} catch (e) {
|
||||
console.log("PASS");
|
||||
}
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
issue_4730_1: {
|
||||
options = {
|
||||
pure_getters: true,
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
var a;
|
||||
console.log("PASS") + (a && a[a.p]);
|
||||
}
|
||||
expect: {
|
||||
var a;
|
||||
console.log("PASS");
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
issue_4730_2: {
|
||||
options = {
|
||||
pure_getters: true,
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
var a;
|
||||
!console.log("PASS") || a && a[a.p];
|
||||
}
|
||||
expect: {
|
||||
var a;
|
||||
console.log("PASS");
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
issue_4751: {
|
||||
options = {
|
||||
pure_getters: true,
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
var o = {
|
||||
get p() {
|
||||
console.log("PASS");
|
||||
},
|
||||
};
|
||||
o && o.p;
|
||||
}
|
||||
expect: {
|
||||
var o = {
|
||||
get p() {
|
||||
console.log("PASS");
|
||||
},
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
super_toString: {
|
||||
options = {
|
||||
pure_getters: true,
|
||||
unsafe: true,
|
||||
}
|
||||
input: {
|
||||
console.log({
|
||||
f() {
|
||||
return super.toString();
|
||||
},
|
||||
}.f());
|
||||
}
|
||||
expect: {
|
||||
console.log({
|
||||
f() {
|
||||
return super.toString();
|
||||
},
|
||||
}.f());
|
||||
}
|
||||
expect_stdout: "[object Object]"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
this_toString: {
|
||||
options = {
|
||||
pure_getters: true,
|
||||
unsafe: true,
|
||||
}
|
||||
input: {
|
||||
console.log({
|
||||
f() {
|
||||
return this.toString();
|
||||
},
|
||||
}.f());
|
||||
}
|
||||
expect: {
|
||||
console.log({
|
||||
f() {
|
||||
return "" + this;
|
||||
},
|
||||
}.f());
|
||||
}
|
||||
expect_stdout: "[object Object]"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
issue_4803: {
|
||||
options = {
|
||||
hoist_vars: true,
|
||||
pure_getters: "strict",
|
||||
reduce_vars: true,
|
||||
side_effects: true,
|
||||
toplevel: true,
|
||||
}
|
||||
input: {
|
||||
var o = {
|
||||
get f() {
|
||||
console.log("PASS");
|
||||
},
|
||||
} || 42;
|
||||
for (var k in o)
|
||||
o[k];
|
||||
}
|
||||
expect: {
|
||||
var k, o = {
|
||||
get f() {
|
||||
console.log("PASS");
|
||||
},
|
||||
} || 42;
|
||||
for (k in o)
|
||||
o[k];
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
nested_property_assignments_1: {
|
||||
options = {
|
||||
pure_getters: "strict",
|
||||
reduce_vars: true,
|
||||
sequences: true,
|
||||
side_effects: true,
|
||||
toplevel: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
var f;
|
||||
((f = function() {
|
||||
console.log("FAIL");
|
||||
}).p = f).q = console.log("PASS");
|
||||
}
|
||||
expect: {
|
||||
console.log("PASS");
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
nested_property_assignments_2: {
|
||||
options = {
|
||||
pure_getters: "strict",
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
var o = {};
|
||||
(function() {
|
||||
var a;
|
||||
(o.p = a = {}).q = "PASS";
|
||||
})();
|
||||
console.log(o.p.q);
|
||||
}
|
||||
expect: {
|
||||
var o = {};
|
||||
(function() {
|
||||
(o.p = {}).q = "PASS";
|
||||
})();
|
||||
console.log(o.p.q);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
nested_property_assignments_3: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
pure_getters: true,
|
||||
side_effects: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
var o = { p: {} };
|
||||
(function(a) {
|
||||
console && a;
|
||||
if (console) {
|
||||
a = a.p;
|
||||
a.q = a;
|
||||
}
|
||||
})(o);
|
||||
console.log(o.p.q === o.p ? "PASS" : "FAIL");
|
||||
}
|
||||
expect: {
|
||||
var o = { p: {} };
|
||||
(function(a) {
|
||||
console;
|
||||
if (console)
|
||||
(a = a.p).q = a;
|
||||
})(o);
|
||||
console.log(o.p.q === o.p ? "PASS" : "FAIL");
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
@@ -2373,7 +2373,7 @@ redefine_farg_1: {
|
||||
function f(a) {
|
||||
return typeof a;
|
||||
}
|
||||
function g() {
|
||||
function g(a) {
|
||||
return "number";
|
||||
}
|
||||
function h(a, b) {
|
||||
@@ -2460,6 +2460,7 @@ delay_def: {
|
||||
evaluate: true,
|
||||
reduce_funcs: true,
|
||||
reduce_vars: true,
|
||||
side_effects: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
@@ -6928,7 +6929,7 @@ issue_3622: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
inline: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
reduce_vars: true,
|
||||
sequences: true,
|
||||
toplevel: true,
|
||||
@@ -7196,7 +7197,7 @@ issue_3894: {
|
||||
issue_3922: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
pure_getters: "strict",
|
||||
reduce_vars: true,
|
||||
side_effects: true,
|
||||
@@ -7601,3 +7602,32 @@ issue_4188_2: {
|
||||
}
|
||||
expect_stdout: "number undefined"
|
||||
}
|
||||
|
||||
issue_4568: {
|
||||
options = {
|
||||
booleans: true,
|
||||
conditionals: true,
|
||||
dead_code: true,
|
||||
evaluate: true,
|
||||
loops: true,
|
||||
passes: 2,
|
||||
reduce_vars: true,
|
||||
sequences: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
(function(a) {
|
||||
a && console.log("FAIL");
|
||||
if (1)
|
||||
do {
|
||||
if (!console.log("PASS")) break;
|
||||
} while (1);
|
||||
})(!(0 !== delete NaN));
|
||||
}
|
||||
expect: {
|
||||
(function(a) {
|
||||
for (a && console.log("FAIL"), 1; console.log("PASS"); ) 1;
|
||||
})(!(0 !== delete NaN));
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
786
test/compress/rests.js
Normal file
786
test/compress/rests.js
Normal file
@@ -0,0 +1,786 @@
|
||||
arrow_1: {
|
||||
input: {
|
||||
console.log.apply(console, ((...a) => a)("PASS", 42));
|
||||
}
|
||||
expect_exact: 'console.log.apply(console,((...a)=>a)("PASS",42));'
|
||||
expect_stdout: "PASS 42"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
arrow_2: {
|
||||
input: {
|
||||
console.log.apply(console, ((a, ...b) => b)("FAIL", "PASS", 42));
|
||||
}
|
||||
expect_exact: 'console.log.apply(console,((a,...b)=>b)("FAIL","PASS",42));'
|
||||
expect_stdout: "PASS 42"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
arrow_destructured_array_1: {
|
||||
input: {
|
||||
console.log.apply(console, (([ ...a ]) => a)("PASS"));
|
||||
}
|
||||
expect_exact: 'console.log.apply(console,(([...a])=>a)("PASS"));'
|
||||
expect_stdout: "P A S S"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
arrow_destructured_array_2: {
|
||||
input: {
|
||||
console.log.apply(console, (([ a, ...b ]) => b)([ "FAIL", "PASS", 42 ]));
|
||||
}
|
||||
expect_exact: 'console.log.apply(console,(([a,...b])=>b)(["FAIL","PASS",42]));'
|
||||
expect_stdout: "PASS 42"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
arrow_destructured_array_3: {
|
||||
input: {
|
||||
console.log((([ [ ...a ] = "FAIL" ]) => a)([ "PASS" ]).join("|"));
|
||||
}
|
||||
expect_exact: 'console.log((([[...a]="FAIL"])=>a)(["PASS"]).join("|"));'
|
||||
expect_stdout: "P|A|S|S"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
arrow_destructured_object_1: {
|
||||
input: {
|
||||
var f = ({ ...a }) => a, o = f({ PASS: 42 });
|
||||
for (var k in o)
|
||||
console.log(k, o[k]);
|
||||
}
|
||||
expect_exact: "var f=({...a})=>a,o=f({PASS:42});for(var k in o)console.log(k,o[k]);"
|
||||
expect_stdout: "PASS 42"
|
||||
node_version: ">=8"
|
||||
}
|
||||
|
||||
arrow_destructured_object_2: {
|
||||
input: {
|
||||
var f = ({ FAIL: a, ...b }) => b, o = f({ PASS: 42, FAIL: null });
|
||||
for (var k in o)
|
||||
console.log(k, o[k]);
|
||||
}
|
||||
expect_exact: "var f=({FAIL:a,...b})=>b,o=f({PASS:42,FAIL:null});for(var k in o)console.log(k,o[k]);"
|
||||
expect_stdout: "PASS 42"
|
||||
node_version: ">=8"
|
||||
}
|
||||
|
||||
arrow_destructured_object_3: {
|
||||
input: {
|
||||
var f = ([ { ...a } = [ "FAIL" ] ]) => a;
|
||||
var o = f([ "PASS" ]);
|
||||
for (var k in o)
|
||||
console.log(k, o[k]);
|
||||
}
|
||||
expect_exact: 'var f=([{...a}=["FAIL"]])=>a;var o=f(["PASS"]);for(var k in o)console.log(k,o[k]);'
|
||||
expect_stdout: [
|
||||
"0 P",
|
||||
"1 A",
|
||||
"2 S",
|
||||
"3 S",
|
||||
]
|
||||
node_version: ">=8"
|
||||
}
|
||||
|
||||
funarg_1: {
|
||||
input: {
|
||||
console.log.apply(console, function(...a) {
|
||||
return a;
|
||||
}("PASS", 42));
|
||||
}
|
||||
expect_exact: 'console.log.apply(console,function(...a){return a}("PASS",42));'
|
||||
expect_stdout: "PASS 42"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
funarg_2: {
|
||||
input: {
|
||||
console.log.apply(console, function(a, ...b) {
|
||||
return b;
|
||||
}("FAIL", "PASS", 42));
|
||||
}
|
||||
expect_exact: 'console.log.apply(console,function(a,...b){return b}("FAIL","PASS",42));'
|
||||
expect_stdout: "PASS 42"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
destructured_array_1: {
|
||||
input: {
|
||||
var [ ...a ] = [ "PASS", 42 ];
|
||||
console.log.apply(console, a);
|
||||
}
|
||||
expect_exact: 'var[...a]=["PASS",42];console.log.apply(console,a);'
|
||||
expect_stdout: "PASS 42"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
destructured_array_2: {
|
||||
input: {
|
||||
var [ a, ...b ] = [ "FAIL", "PASS", 42 ];
|
||||
console.log.apply(console, b);
|
||||
}
|
||||
expect_exact: 'var[a,...b]=["FAIL","PASS",42];console.log.apply(console,b);'
|
||||
expect_stdout: "PASS 42"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
destructured_object_1: {
|
||||
input: {
|
||||
var { ...a } = [ "FAIL", "PASS", 42 ];
|
||||
console.log(a[1], a[2]);
|
||||
}
|
||||
expect_exact: 'var{...a}=["FAIL","PASS",42];console.log(a[1],a[2]);'
|
||||
expect_stdout: "PASS 42"
|
||||
node_version: ">=8"
|
||||
}
|
||||
|
||||
destructured_object_2: {
|
||||
input: {
|
||||
var { 0: a, ...b } = [ "FAIL", "PASS", 42 ];
|
||||
console.log(b[1], b[2]);
|
||||
}
|
||||
expect_exact: 'var{0:a,...b}=["FAIL","PASS",42];console.log(b[1],b[2]);'
|
||||
expect_stdout: "PASS 42"
|
||||
node_version: ">=8"
|
||||
}
|
||||
|
||||
drop_fargs: {
|
||||
options = {
|
||||
keep_fargs: false,
|
||||
rests: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
console.log(function(a, ...b) {
|
||||
return b[0];
|
||||
}("FAIL", "PASS"));
|
||||
}
|
||||
expect: {
|
||||
console.log(function(b) {
|
||||
return b[0];
|
||||
}([ "PASS" ]));
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
inline: {
|
||||
options = {
|
||||
inline: true,
|
||||
toplevel: true,
|
||||
}
|
||||
input: {
|
||||
console.log(function(a, ...[ b, c ]) {
|
||||
return c + b + a;
|
||||
}("SS", "A", "P"));
|
||||
}
|
||||
expect: {
|
||||
console.log(([ a, ...[ b, c ] ] = [ "SS", "A", "P" ], c + b + a));
|
||||
var a, b, c;
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
retain_var: {
|
||||
options = {
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
var [ ...a ] = [ "PASS" ];
|
||||
console.log(a[0]);
|
||||
}
|
||||
expect: {
|
||||
var [ ...a ] = [ "PASS" ];
|
||||
console.log(a[0]);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
reduce_destructured_array: {
|
||||
options = {
|
||||
reduce_vars: true,
|
||||
rests: true,
|
||||
toplevel: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
var [ ...a ] = [ "PASS" ];
|
||||
console.log(a[0]);
|
||||
}
|
||||
expect: {
|
||||
console.log([ "PASS" ][0]);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
reduce_destructured_object: {
|
||||
options = {
|
||||
reduce_vars: true,
|
||||
toplevel: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
var { ...a } = [ "PASS" ];
|
||||
console.log(a[0]);
|
||||
}
|
||||
expect: {
|
||||
var { ...a } = [ "PASS" ];
|
||||
console.log(a[0]);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=8"
|
||||
}
|
||||
|
||||
retain_destructured_array: {
|
||||
options = {
|
||||
toplevel: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
var [ a, ...b ] = [ "FAIL", "PASS", 42 ];
|
||||
console.log.apply(console, b);
|
||||
}
|
||||
expect: {
|
||||
var [ , ...b ] = [ "FAIL", "PASS", 42 ];
|
||||
console.log.apply(console, b);
|
||||
}
|
||||
expect_stdout: "PASS 42"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
retain_destructured_object_1: {
|
||||
options = {
|
||||
toplevel: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
var { 0: a, ...b } = [ "FAIL", "PASS", 42 ];
|
||||
for (var k in b)
|
||||
console.log(k, b[k]);
|
||||
}
|
||||
expect: {
|
||||
var { 0: a, ...b } = [ "FAIL", "PASS", 42 ];
|
||||
for (var k in b)
|
||||
console.log(k, b[k]);
|
||||
}
|
||||
expect_stdout: [
|
||||
"1 PASS",
|
||||
"2 42",
|
||||
]
|
||||
node_version: ">=8"
|
||||
}
|
||||
|
||||
retain_destructured_object_2: {
|
||||
options = {
|
||||
toplevel: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
var { foo: [ a ], ...b } = { foo: [ "FAIL" ], bar: "PASS", baz: 42 };
|
||||
for (var k in b)
|
||||
console.log(k, b[k]);
|
||||
}
|
||||
expect: {
|
||||
var { foo: [], ...b } = { foo: [ "FAIL" ], bar: "PASS", baz: 42 };
|
||||
for (var k in b)
|
||||
console.log(k, b[k]);
|
||||
}
|
||||
expect_stdout: [
|
||||
"bar PASS",
|
||||
"baz 42",
|
||||
]
|
||||
node_version: ">=8"
|
||||
}
|
||||
|
||||
retain_funarg_destructured_array_1: {
|
||||
options = {
|
||||
inline: true,
|
||||
keep_fargs: false,
|
||||
pure_getters: "strict",
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
console.log((([ ...a ]) => a)([ "PASS" ])[0]);
|
||||
}
|
||||
expect: {
|
||||
console.log((([ ...a ]) => a)([ "PASS" ])[0]);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
retain_funarg_destructured_array_2: {
|
||||
options = {
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
console.log(function([ a, ...b ]) {
|
||||
return b;
|
||||
}("bar")[1]);
|
||||
}
|
||||
expect: {
|
||||
console.log(function([ , ...b ]) {
|
||||
return b;
|
||||
}("bar")[1]);
|
||||
}
|
||||
expect_stdout: "r"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
retain_funarg_destructured_object_1: {
|
||||
options = {
|
||||
inline: true,
|
||||
keep_fargs: false,
|
||||
pure_getters: "strict",
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
console.log((({ ...a }) => a)([ "PASS" ])[0]);
|
||||
}
|
||||
expect: {
|
||||
console.log((({ ...a }) => a)([ "PASS" ])[0]);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=8"
|
||||
}
|
||||
|
||||
retain_funarg_destructured_object_2: {
|
||||
options = {
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
console.log(function({ p: a, ... b }) {
|
||||
return b;
|
||||
}({ p: "FAIL" }).p || "PASS");
|
||||
}
|
||||
expect: {
|
||||
console.log(function({ p: a, ... b }) {
|
||||
return b;
|
||||
}({ p: "FAIL" }).p || "PASS");
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=8"
|
||||
}
|
||||
|
||||
drop_unused_call_args_1: {
|
||||
options = {
|
||||
rests: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
(function(...a) {
|
||||
console.log(a[0]);
|
||||
})(42, console.log("PASS"));
|
||||
}
|
||||
expect: {
|
||||
(function(a) {
|
||||
console.log(a[0]);
|
||||
})([ 42, console.log("PASS") ]);
|
||||
}
|
||||
expect_stdout: [
|
||||
"PASS",
|
||||
"42",
|
||||
]
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
drop_unused_call_args_2: {
|
||||
options = {
|
||||
keep_fargs: false,
|
||||
rests: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
console.log(function(a, ...b) {
|
||||
return b;
|
||||
}(console).length);
|
||||
}
|
||||
expect: {
|
||||
console.log(function(b) {
|
||||
return b;
|
||||
}((console, [])).length);
|
||||
}
|
||||
expect_stdout: "0"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
merge_funarg: {
|
||||
options = {
|
||||
merge_vars: true,
|
||||
}
|
||||
input: {
|
||||
(function(...a) {
|
||||
var b = a.length;
|
||||
console.log(b);
|
||||
})();
|
||||
}
|
||||
expect: {
|
||||
(function(...b) {
|
||||
var b = b.length;
|
||||
console.log(b);
|
||||
})();
|
||||
}
|
||||
expect_stdout: "0"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
merge_funarg_destructured_array: {
|
||||
options = {
|
||||
merge_vars: true,
|
||||
}
|
||||
input: {
|
||||
(function([ ...a ]) {
|
||||
var b = a.length;
|
||||
console.log(b);
|
||||
})([]);
|
||||
}
|
||||
expect: {
|
||||
(function([ ...b ]) {
|
||||
var b = b.length;
|
||||
console.log(b);
|
||||
})([]);
|
||||
}
|
||||
expect_stdout: "0"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
merge_funarg_destructured_object: {
|
||||
options = {
|
||||
merge_vars: true,
|
||||
}
|
||||
input: {
|
||||
(function({ ...a }) {
|
||||
var b = a[0];
|
||||
console.log(b);
|
||||
})([ "PASS" ]);
|
||||
}
|
||||
expect: {
|
||||
(function({ ...b }) {
|
||||
var b = b[0];
|
||||
console.log(b);
|
||||
})([ "PASS" ]);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=8"
|
||||
}
|
||||
|
||||
keep_arguments: {
|
||||
options = {
|
||||
arguments: true,
|
||||
keep_fargs: false,
|
||||
}
|
||||
input: {
|
||||
(function(...[ {} ]) {
|
||||
console.log(arguments[0]);
|
||||
})("PASS");
|
||||
}
|
||||
expect: {
|
||||
(function(...[ {} ]) {
|
||||
console.log(arguments[0]);
|
||||
})("PASS");
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
drop_rest_array: {
|
||||
options = {
|
||||
rests: true,
|
||||
}
|
||||
input: {
|
||||
var [ ...[ a ]] = [ "PASS" ];
|
||||
console.log(a);
|
||||
}
|
||||
expect: {
|
||||
var [ a ] = [ "PASS" ];
|
||||
console.log(a);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
drop_rest_arrow: {
|
||||
options = {
|
||||
arrows: true,
|
||||
keep_fargs: false,
|
||||
reduce_vars: true,
|
||||
rests: true,
|
||||
}
|
||||
input: {
|
||||
console.log(((...[ a ]) => a)("PASS"));
|
||||
}
|
||||
expect: {
|
||||
console.log((a => a)("PASS"));
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
drop_rest_lambda: {
|
||||
options = {
|
||||
keep_fargs: false,
|
||||
reduce_vars: true,
|
||||
rests: true,
|
||||
toplevel: true,
|
||||
}
|
||||
input: {
|
||||
function f(...[ a ]) {
|
||||
return a;
|
||||
}
|
||||
console.log(f("PASS"), f(42));
|
||||
}
|
||||
expect: {
|
||||
function f(a) {
|
||||
return a;
|
||||
}
|
||||
console.log(f("PASS"), f(42));
|
||||
}
|
||||
expect_stdout: "PASS 42"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
issue_4525_1: {
|
||||
options = {
|
||||
arguments: true,
|
||||
}
|
||||
input: {
|
||||
console.log(function(a, ...[]) {
|
||||
a = "FAIL";
|
||||
return arguments[0];
|
||||
}("PASS"));
|
||||
}
|
||||
expect: {
|
||||
console.log(function(a, ...[]) {
|
||||
a = "FAIL";
|
||||
return arguments[0];
|
||||
}("PASS"));
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
issue_4525_2: {
|
||||
options = {
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
console.log(function(a, ...[]) {
|
||||
a = "FAIL";
|
||||
return arguments[0];
|
||||
}("PASS"));
|
||||
}
|
||||
expect: {
|
||||
console.log(function(a, ...[]) {
|
||||
a = "FAIL";
|
||||
return arguments[0];
|
||||
}("PASS"));
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
issue_4538: {
|
||||
options = {
|
||||
rests: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
console.log(typeof function f(...a) {
|
||||
return a.p, f;
|
||||
}()());
|
||||
}
|
||||
expect: {
|
||||
console.log(typeof function f(...a) {
|
||||
return a.p, f;
|
||||
}()());
|
||||
}
|
||||
expect_stdout: "function"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
issue_4544_1: {
|
||||
options = {
|
||||
keep_fnames: true,
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
try {
|
||||
(function f(...[ {} ]) {})();
|
||||
} catch (e) {
|
||||
console.log("PASS");
|
||||
}
|
||||
}
|
||||
expect: {
|
||||
try {
|
||||
[ ...[ {} ] ] = [];
|
||||
} catch (e) {
|
||||
console.log("PASS");
|
||||
}
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
issue_4544_2: {
|
||||
options = {
|
||||
keep_fnames: true,
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
try {
|
||||
(function f(a, ...[ {} ]) {})([]);
|
||||
} catch (e) {
|
||||
console.log("PASS");
|
||||
}
|
||||
}
|
||||
expect: {
|
||||
try {
|
||||
[ , ...[ {} ] ] = [ [] ];
|
||||
} catch (e) {
|
||||
console.log("PASS");
|
||||
}
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
issue_4562: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
reduce_vars: true,
|
||||
rests: true,
|
||||
unsafe: true,
|
||||
}
|
||||
input: {
|
||||
console.log((([ ...[ a ] ]) => a)("foo"));
|
||||
}
|
||||
expect: {
|
||||
console.log((([ a ]) => a)("foo"));
|
||||
}
|
||||
expect_stdout: "f"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
issue_4575: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
ie8: true,
|
||||
reduce_vars: true,
|
||||
rests: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
(function(a) {
|
||||
var b = a;
|
||||
var c = function a(...d) {
|
||||
console.log(d.length);
|
||||
}();
|
||||
})();
|
||||
}
|
||||
expect: {
|
||||
(function(a) {
|
||||
(function a(...d) {
|
||||
console.log(d.length);
|
||||
})();
|
||||
})();
|
||||
}
|
||||
expect_stdout: "0"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
issue_4621: {
|
||||
options = {
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
(function f(a, ...{
|
||||
[console.log(a)]: b,
|
||||
}) {})("PASS");
|
||||
}
|
||||
expect: {
|
||||
(function f(a, ...{
|
||||
[console.log(a)]: b,
|
||||
}) {})("PASS");
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
issue_4644_1: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
}
|
||||
input: {
|
||||
var a = "FAIL";
|
||||
(function f(b, ...{
|
||||
[a = "PASS"]: c,
|
||||
}) {
|
||||
return b;
|
||||
})();
|
||||
console.log(a);
|
||||
}
|
||||
expect: {
|
||||
var a = "FAIL";
|
||||
(function f(b, ...{
|
||||
[a = "PASS"]: c,
|
||||
}) {
|
||||
return b;
|
||||
})();
|
||||
console.log(a);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
issue_4644_2: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
unsafe: true,
|
||||
}
|
||||
input: {
|
||||
console.log(function(...a) {
|
||||
return a[1];
|
||||
}("FAIL", "PASS"), function(...b) {
|
||||
return b.length;
|
||||
}(), function(c, ...d) {
|
||||
return d[0];
|
||||
}("FAIL"));
|
||||
}
|
||||
expect: {
|
||||
console.log("PASS", 0, function(c, ...d) {
|
||||
return d[0];
|
||||
}("FAIL"));
|
||||
}
|
||||
expect_stdout: "PASS 0 undefined"
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
issue_4666: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
reduce_vars: true,
|
||||
rests: true,
|
||||
toplevel: true,
|
||||
unsafe: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
var a = 0, b = 0;
|
||||
var o = ((...c) => a++ + c)(b);
|
||||
for (var k in o)
|
||||
b++;
|
||||
console.log(a, b);
|
||||
}
|
||||
expect: {
|
||||
var a = 0, b = 0;
|
||||
var o = (c => +a + c)([ b ]);
|
||||
for(var k in o)
|
||||
b++;
|
||||
console.log(1, b);
|
||||
}
|
||||
expect_stdout: "1 2"
|
||||
node_version: ">=6"
|
||||
}
|
||||
@@ -13,6 +13,23 @@ console_log: {
|
||||
]
|
||||
}
|
||||
|
||||
console_log_console: {
|
||||
input: {
|
||||
var log = console.log;
|
||||
log(console);
|
||||
log(typeof console.log);
|
||||
}
|
||||
expect: {
|
||||
var log = console.log;
|
||||
log(console);
|
||||
log(typeof console.log);
|
||||
}
|
||||
expect_stdout: [
|
||||
"{ log: 'function(){}' }",
|
||||
"function",
|
||||
]
|
||||
}
|
||||
|
||||
typeof_arguments: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
@@ -81,6 +98,63 @@ log_global: {
|
||||
expect_stdout: "[object global]"
|
||||
}
|
||||
|
||||
log_nested: {
|
||||
options = {
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
var o = { p: 42 };
|
||||
for (var i = 0; i < 10; i++)
|
||||
o = {
|
||||
p: o,
|
||||
q: function foo() {},
|
||||
};
|
||||
console.log(o);
|
||||
}
|
||||
expect: {
|
||||
var o = { p: 42 };
|
||||
for (var i = 0; i < 10; i++)
|
||||
o = {
|
||||
p: o,
|
||||
q: function() {},
|
||||
};
|
||||
console.log(o);
|
||||
}
|
||||
expect_stdout: true
|
||||
}
|
||||
|
||||
timers: {
|
||||
options = {
|
||||
reduce_vars: true,
|
||||
toplevel: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
var count = 0, interval = 1000, duration = 3210;
|
||||
var timer = setInterval(function() {
|
||||
console.log(++count);
|
||||
}, interval);
|
||||
setTimeout(function() {
|
||||
clearInterval(timer);
|
||||
}, duration);
|
||||
}
|
||||
expect: {
|
||||
var count = 0;
|
||||
var timer = setInterval(function() {
|
||||
console.log(++count);
|
||||
}, 1000);
|
||||
setTimeout(function() {
|
||||
clearInterval(timer);
|
||||
}, 3210);
|
||||
}
|
||||
expect_stdout: [
|
||||
"1",
|
||||
"2",
|
||||
"3",
|
||||
]
|
||||
node_version: ">=0.12"
|
||||
}
|
||||
|
||||
issue_4054: {
|
||||
input: {
|
||||
console.log({
|
||||
@@ -98,3 +172,32 @@ issue_4054: {
|
||||
}
|
||||
expect_stdout: "{ p: [Setter] }"
|
||||
}
|
||||
|
||||
issue_4811_1: {
|
||||
input: {
|
||||
for (var PASS in this);
|
||||
console.log(PASS, this, {} < this);
|
||||
}
|
||||
expect: {
|
||||
for (var PASS in this);
|
||||
console.log(PASS, this, {} < this);
|
||||
}
|
||||
expect_stdout: "PASS [object global] true"
|
||||
}
|
||||
|
||||
issue_4811_2: {
|
||||
options = {
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
(async function() {});
|
||||
for (var PASS in this);
|
||||
console.log(PASS, this, {} < this);
|
||||
}
|
||||
expect: {
|
||||
for (var PASS in this);
|
||||
console.log(PASS, this, {} < this);
|
||||
}
|
||||
expect_stdout: "PASS [object global] true"
|
||||
node_version: ">=8"
|
||||
}
|
||||
|
||||
@@ -564,6 +564,34 @@ delete_seq_3: {
|
||||
}
|
||||
|
||||
delete_seq_4: {
|
||||
options = {
|
||||
booleans: true,
|
||||
evaluate: false,
|
||||
sequences: true,
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
function f() {}
|
||||
console.log(delete (f(), undefined));
|
||||
console.log(delete (f(), void 0));
|
||||
console.log(delete (f(), Infinity));
|
||||
console.log(delete (f(), 1 / 0));
|
||||
console.log(delete (f(), NaN));
|
||||
console.log(delete (f(), 0 / 0));
|
||||
}
|
||||
expect: {
|
||||
function f() {}
|
||||
console.log(delete void f()),
|
||||
console.log(delete void f()),
|
||||
console.log((f(), delete (1 / 0))),
|
||||
console.log((f(), delete (1 / 0))),
|
||||
console.log(delete (f(), NaN)),
|
||||
console.log((f(), delete(0 / 0)));
|
||||
}
|
||||
expect_stdout: true
|
||||
}
|
||||
|
||||
delete_seq_4_evaluate: {
|
||||
options = {
|
||||
booleans: true,
|
||||
evaluate: true,
|
||||
@@ -592,6 +620,35 @@ delete_seq_4: {
|
||||
}
|
||||
|
||||
delete_seq_5: {
|
||||
options = {
|
||||
booleans: true,
|
||||
evaluate: false,
|
||||
keep_infinity: true,
|
||||
sequences: true,
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
function f() {}
|
||||
console.log(delete (f(), undefined));
|
||||
console.log(delete (f(), void 0));
|
||||
console.log(delete (f(), Infinity));
|
||||
console.log(delete (f(), 1 / 0));
|
||||
console.log(delete (f(), NaN));
|
||||
console.log(delete (f(), 0 / 0));
|
||||
}
|
||||
expect: {
|
||||
function f() {}
|
||||
console.log(delete void f()),
|
||||
console.log(delete void f()),
|
||||
console.log(delete (f(), Infinity)),
|
||||
console.log((f(), delete (1 / 0))),
|
||||
console.log(delete (f(), NaN)),
|
||||
console.log((f(), delete (0 / 0)));
|
||||
}
|
||||
expect_stdout: true
|
||||
}
|
||||
|
||||
delete_seq_5_evaluate: {
|
||||
options = {
|
||||
booleans: true,
|
||||
evaluate: true,
|
||||
@@ -663,12 +720,21 @@ side_effects_cascade_1: {
|
||||
if (a < 0) a = 0;
|
||||
b.a = a;
|
||||
}
|
||||
var m = {}, n = {};
|
||||
f(13, m);
|
||||
f("foo", n);
|
||||
console.log(m.a, n.a);
|
||||
}
|
||||
expect: {
|
||||
function f(a, b) {
|
||||
(a -= 42) < 0 && (a = 0), b.a = a;
|
||||
b.a = a = (a -= 42) < 0 ? 0 : a;
|
||||
}
|
||||
var m = {}, n = {};
|
||||
f(13, m),
|
||||
f("foo", n),
|
||||
console.log(m.a, n.a);
|
||||
}
|
||||
expect_stdout: "0 NaN"
|
||||
}
|
||||
|
||||
side_effects_cascade_2: {
|
||||
|
||||
@@ -198,6 +198,36 @@ global_fns: {
|
||||
]
|
||||
}
|
||||
|
||||
global_constructors: {
|
||||
options = {
|
||||
side_effects: true,
|
||||
unsafe: true,
|
||||
}
|
||||
input: {
|
||||
Map;
|
||||
new Map(console.log("foo"));
|
||||
Set;
|
||||
new Set(console.log("bar"));
|
||||
WeakMap;
|
||||
new WeakMap(console.log("baz"));
|
||||
WeakSet;
|
||||
new WeakSet(console.log("moo"));
|
||||
}
|
||||
expect: {
|
||||
console.log("foo");
|
||||
console.log("bar");
|
||||
console.log("baz");
|
||||
console.log("moo");
|
||||
}
|
||||
expect_stdout: [
|
||||
"foo",
|
||||
"bar",
|
||||
"baz",
|
||||
"moo",
|
||||
]
|
||||
node_version: ">=0.12"
|
||||
}
|
||||
|
||||
unsafe_builtin_1: {
|
||||
options = {
|
||||
side_effects: true,
|
||||
@@ -348,8 +378,6 @@ issue_3983_1: {
|
||||
}
|
||||
expect: {
|
||||
var a = "PASS";
|
||||
g();
|
||||
function g() {}
|
||||
console.log(a);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
@@ -436,7 +464,7 @@ trim_new: {
|
||||
|
||||
issue_4325: {
|
||||
options = {
|
||||
keep_fargs: "strict",
|
||||
keep_fargs: false,
|
||||
passes: 2,
|
||||
pure_getters: "strict",
|
||||
reduce_vars: true,
|
||||
@@ -458,15 +486,162 @@ issue_4325: {
|
||||
}
|
||||
expect: {
|
||||
(function() {
|
||||
(function() {
|
||||
(function(c) {
|
||||
try {
|
||||
(void 0).p = 0;
|
||||
c.p = 0;
|
||||
} catch (e) {
|
||||
console.log("PASS");
|
||||
return;
|
||||
}
|
||||
})();
|
||||
})(void 0);
|
||||
})();
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
issue_4366_1: {
|
||||
options = {
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
({
|
||||
p: 42,
|
||||
get p() {},
|
||||
q: console.log("PASS"),
|
||||
});
|
||||
}
|
||||
expect: {
|
||||
console.log("PASS");
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
issue_4366_2: {
|
||||
options = {
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
({
|
||||
set p(v) {},
|
||||
q: console.log("PASS"),
|
||||
p: 42,
|
||||
});
|
||||
}
|
||||
expect: {
|
||||
console.log("PASS");
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
issue_4668: {
|
||||
options = {
|
||||
conditionals: true,
|
||||
keep_fargs: false,
|
||||
keep_fnames: true,
|
||||
reduce_vars: true,
|
||||
side_effects: true,
|
||||
toplevel: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
function f(a) {
|
||||
var b, c;
|
||||
function g() {
|
||||
return a = 0 + a, !d || (a = 0);
|
||||
}
|
||||
c = g();
|
||||
}
|
||||
console.log(f());
|
||||
var d = 0;
|
||||
}
|
||||
expect: {
|
||||
console.log(function f() {
|
||||
(function g() {
|
||||
0;
|
||||
})();
|
||||
}());
|
||||
}
|
||||
expect_stdout: "undefined"
|
||||
}
|
||||
|
||||
drop_side_effect_free_call: {
|
||||
options = {
|
||||
inline: true,
|
||||
reduce_vars: true,
|
||||
side_effects: true,
|
||||
toplevel: true,
|
||||
}
|
||||
input: {
|
||||
function f(a) {
|
||||
return "PA" + a;
|
||||
}
|
||||
f(42);
|
||||
console.log(f("SS"));
|
||||
}
|
||||
expect: {
|
||||
function f(a) {
|
||||
return "PA" + a;
|
||||
}
|
||||
console.log(f("SS"));
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
issue_4730_1: {
|
||||
options = {
|
||||
pure_getters: "strict",
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
var a;
|
||||
console.log("PASS") + (a && a[a.p]);
|
||||
}
|
||||
expect: {
|
||||
var a;
|
||||
console.log("PASS"),
|
||||
a && a[a.p];
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
issue_4730_2: {
|
||||
options = {
|
||||
pure_getters: "strict",
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
var a;
|
||||
!console.log("PASS") || a && a[a.p];
|
||||
}
|
||||
expect: {
|
||||
var a;
|
||||
!console.log("PASS") || a && a[a.p];
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
issue_4751: {
|
||||
options = {
|
||||
pure_getters: "strict",
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
var o = {
|
||||
get p() {
|
||||
console.log("PASS");
|
||||
},
|
||||
};
|
||||
o && o.p;
|
||||
}
|
||||
expect: {
|
||||
var o = {
|
||||
get p() {
|
||||
console.log("PASS");
|
||||
},
|
||||
};
|
||||
o && o.p;
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
}
|
||||
|
||||
1070
test/compress/spreads.js
Normal file
1070
test/compress/spreads.js
Normal file
File diff suppressed because it is too large
Load Diff
368
test/compress/templates.js
Normal file
368
test/compress/templates.js
Normal file
@@ -0,0 +1,368 @@
|
||||
simple: {
|
||||
input: {
|
||||
console.log(`foo
|
||||
bar\nbaz`);
|
||||
}
|
||||
expect_exact: "console.log(`foo\n bar\\nbaz`);"
|
||||
expect_stdout: [
|
||||
"foo",
|
||||
" bar",
|
||||
"baz",
|
||||
]
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
placeholder: {
|
||||
input: {
|
||||
console.log(`foo ${ function(a, b) {
|
||||
return a * b;
|
||||
}(6, 7) }`);
|
||||
}
|
||||
expect_exact: "console.log(`foo ${function(a,b){return a*b}(6,7)}`);"
|
||||
expect_stdout: "foo 42"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
nested: {
|
||||
input: {
|
||||
console.log(`P${`A${"S"}`}S`);
|
||||
}
|
||||
expect_exact: 'console.log(`P${`A${"S"}`}S`);'
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
tagged: {
|
||||
input: {
|
||||
console.log(String.raw`foo\nbar`);
|
||||
}
|
||||
expect_exact: "console.log(String.raw`foo\\nbar`);"
|
||||
expect_stdout: "foo\\nbar"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
tagged_chain: {
|
||||
input: {
|
||||
function f(strings) {
|
||||
return strings.join("") || f;
|
||||
}
|
||||
console.log(f```${42}``pass`.toUpperCase());
|
||||
}
|
||||
expect_exact: 'function f(strings){return strings.join("")||f}console.log(f```${42}``pass`.toUpperCase());'
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
tag_parentheses_arrow: {
|
||||
input: {
|
||||
console.log((s => s.raw[0])`\tPASS`.slice(2));
|
||||
}
|
||||
expect_exact: "console.log((s=>s.raw[0])`\\tPASS`.slice(2));"
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
tag_parentheses_new: {
|
||||
input: {
|
||||
(new function() {
|
||||
return console.log;
|
||||
})`foo`;
|
||||
}
|
||||
expect_exact: "(new function(){return console.log})`foo`;"
|
||||
expect_stdout: true
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
tag_parentheses_sequence: {
|
||||
input: {
|
||||
var o = {
|
||||
f() {
|
||||
console.log(this === o ? "FAIL" : "PASS");
|
||||
},
|
||||
};
|
||||
(42, o.f)``;
|
||||
}
|
||||
expect_exact: 'var o={f(){console.log(this===o?"FAIL":"PASS")}};(42,o.f)``;'
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
malformed_escape: {
|
||||
input: {
|
||||
(function(s) {
|
||||
s.forEach((c, i) => console.log(i, c, s.raw[i]));
|
||||
return () => console.log(arguments);
|
||||
})`\uFo${42}`();
|
||||
}
|
||||
expect_exact: "(function(s){s.forEach((c,i)=>console.log(i,c,s.raw[i]));return()=>console.log(arguments)})`\\uFo${42}`();"
|
||||
expect_stdout: true
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
evaluate: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
templates: false,
|
||||
}
|
||||
input: {
|
||||
console.log(`foo ${ function(a, b) {
|
||||
return a * b;
|
||||
}(6, 7) }`);
|
||||
}
|
||||
expect: {
|
||||
console.log(`foo ${42}`);
|
||||
}
|
||||
expect_stdout: "foo 42"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
evaluate_templates: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
templates: true,
|
||||
}
|
||||
input: {
|
||||
console.log(`foo ${ function(a, b) {
|
||||
return a * b;
|
||||
}(6, 7) }`);
|
||||
}
|
||||
expect: {
|
||||
console.log("foo 42");
|
||||
}
|
||||
expect_stdout: "foo 42"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
partial_evaluate: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
templates: true,
|
||||
}
|
||||
input: {
|
||||
console.log(`${6 * 7} foo ${console ? `PA` + "SS" : `FA` + `IL`}`);
|
||||
}
|
||||
expect: {
|
||||
console.log(`42 foo ${console ? "PASS" : "FAIL"}`);
|
||||
}
|
||||
expect_stdout: "42 foo PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
malformed_evaluate_1: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
templates: true,
|
||||
}
|
||||
input: {
|
||||
console.log(`\67 ${6 * 7}`);
|
||||
}
|
||||
expect: {
|
||||
console.log(`\67 42`);
|
||||
}
|
||||
expect_stdout: true
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
malformed_evaluate_2: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
templates: true,
|
||||
}
|
||||
input: {
|
||||
console.log(`\u0${0}b${5}`);
|
||||
}
|
||||
expect: {
|
||||
console.log(`\u0${0}b5`);
|
||||
}
|
||||
expect_stdout: true
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
malformed_evaluate_3: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
templates: true,
|
||||
}
|
||||
input: {
|
||||
console.log(`\u${0}b${5}`);
|
||||
}
|
||||
expect: {
|
||||
console.log(`\u0b5`);
|
||||
}
|
||||
expect_stdout: true
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
malformed_evaluate_4: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
templates: true,
|
||||
unsafe: true,
|
||||
}
|
||||
input: {
|
||||
console.log(String.raw`\u0${0}b${5}`);
|
||||
}
|
||||
expect: {
|
||||
console.log("\\u00b5");
|
||||
}
|
||||
expect_stdout: "\\u00b5"
|
||||
node_version: ">=8"
|
||||
}
|
||||
|
||||
unsafe_evaluate: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
templates: true,
|
||||
unsafe: true,
|
||||
}
|
||||
input: {
|
||||
console.log(String.raw`\uFo`);
|
||||
}
|
||||
expect: {
|
||||
console.log("\\uFo");
|
||||
}
|
||||
expect_stdout: "\\uFo"
|
||||
node_version: ">=8"
|
||||
}
|
||||
|
||||
side_effects_1: {
|
||||
options = {
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
`42`;
|
||||
`${console.log("foo")}`;
|
||||
console.log`\nbar`;
|
||||
}
|
||||
expect: {
|
||||
console.log("foo");
|
||||
console.log`\nbar`;
|
||||
}
|
||||
expect_stdout: true
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
side_effects_2: {
|
||||
options = {
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
var o = {
|
||||
f() {
|
||||
console.log(this === o ? "FAIL" : "PASS");
|
||||
},
|
||||
};
|
||||
(42, o.f)``;
|
||||
}
|
||||
expect: {
|
||||
var o = {
|
||||
f() {
|
||||
console.log(this === o ? "FAIL" : "PASS");
|
||||
},
|
||||
};
|
||||
(0, o.f)``;
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
unsafe_side_effects: {
|
||||
options = {
|
||||
side_effects: true,
|
||||
unsafe: true,
|
||||
}
|
||||
input: {
|
||||
`42`;
|
||||
`${console.log("foo")}`;
|
||||
String.raw`\nbar`;
|
||||
}
|
||||
expect: {
|
||||
console.log("foo");
|
||||
}
|
||||
expect_stdout: "foo"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
issue_4604: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
}
|
||||
input: {
|
||||
var a = 0, log = console.log;
|
||||
a = "FAIL";
|
||||
(function() {
|
||||
a = "PASS";
|
||||
})``;
|
||||
log(a);
|
||||
}
|
||||
expect: {
|
||||
var a = 0, log = console.log;
|
||||
a = "FAIL";
|
||||
(function() {
|
||||
a = "PASS";
|
||||
})``;
|
||||
log(a);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
issue_4606: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
templates: true,
|
||||
}
|
||||
input: {
|
||||
console.log(`${typeof A} ${"\r"} ${"\\"} ${"`"}`);
|
||||
}
|
||||
expect: {
|
||||
console.log(`${typeof A} \r \\ \``);
|
||||
}
|
||||
expect_stdout: "undefined \r \\ `"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
issue_4630: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
templates: true,
|
||||
}
|
||||
input: {
|
||||
console.log(`${/PASS/}`);
|
||||
}
|
||||
expect: {
|
||||
console.log("/PASS/");
|
||||
}
|
||||
expect_stdout: "/PASS/"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
issue_4676: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
reduce_vars: true,
|
||||
templates: true,
|
||||
toplevel: true,
|
||||
unsafe:true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
function f(a) {
|
||||
var b = `foo${a = "PASS"}`;
|
||||
for (var c in f && b)
|
||||
b.p;
|
||||
return a;
|
||||
}
|
||||
console.log(f("FAIL"));
|
||||
}
|
||||
expect: {
|
||||
console.log(function f(a) {
|
||||
var b = "fooPASS";
|
||||
for (var c in f, b)
|
||||
b.p;
|
||||
return "PASS";
|
||||
}());
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
@@ -50,7 +50,7 @@ unicode_parse_variables: {
|
||||
}
|
||||
}
|
||||
|
||||
unicode_escaped_identifier: {
|
||||
unicode_escaped_identifier_1: {
|
||||
input: {
|
||||
var \u0061 = "\ud800\udc00";
|
||||
console.log(a);
|
||||
@@ -59,6 +59,17 @@ unicode_escaped_identifier: {
|
||||
expect_stdout: "\ud800\udc00"
|
||||
}
|
||||
|
||||
unicode_escaped_identifier_2: {
|
||||
input: {
|
||||
var \u{61} = "foo";
|
||||
var \u{10000} = "bar";
|
||||
console.log(a, \u{10000});
|
||||
}
|
||||
expect_exact: 'var a="foo";var \u{10000}="bar";console.log(a,\u{10000});'
|
||||
expect_stdout: "foo bar"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
unicode_identifier_ascii_only: {
|
||||
beautify = {
|
||||
ascii_only: true,
|
||||
|
||||
@@ -354,6 +354,92 @@ forin_let_2: {
|
||||
node_version: ">=6"
|
||||
}
|
||||
|
||||
loop_scope_1: {
|
||||
options = {
|
||||
toplevel: true,
|
||||
varify: true,
|
||||
}
|
||||
input: {
|
||||
"use strict";
|
||||
var o = { foo: 1, bar: 2 };
|
||||
for (let i in o) {
|
||||
console.log(i);
|
||||
}
|
||||
for (const j in o)
|
||||
setTimeout(() => console.log(j), 0);
|
||||
for (let k in o)
|
||||
setTimeout(function() {
|
||||
console.log(k);
|
||||
}, 0);
|
||||
}
|
||||
expect: {
|
||||
"use strict";
|
||||
var o = { foo: 1, bar: 2 };
|
||||
for (var i in o)
|
||||
console.log(i);
|
||||
for (const j in o)
|
||||
setTimeout(() => console.log(j), 0);
|
||||
for (let k in o)
|
||||
setTimeout(function() {
|
||||
console.log(k);
|
||||
}, 0);
|
||||
}
|
||||
expect_stdout: [
|
||||
"foo",
|
||||
"bar",
|
||||
"foo",
|
||||
"bar",
|
||||
"foo",
|
||||
"bar",
|
||||
]
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
loop_scope_2: {
|
||||
options = {
|
||||
reduce_vars: true,
|
||||
toplevel: true,
|
||||
varify: true,
|
||||
}
|
||||
input: {
|
||||
"use strict";
|
||||
var a = [ "foo", "bar" ];
|
||||
for (var i = 0; i < a.length; i++) {
|
||||
const x = a[i];
|
||||
console.log(x);
|
||||
let y = a[i];
|
||||
setTimeout(() => console.log(y), 0);
|
||||
const z = a[i];
|
||||
setTimeout(function() {
|
||||
console.log(z);
|
||||
}, 0);
|
||||
}
|
||||
}
|
||||
expect: {
|
||||
"use strict";
|
||||
var a = [ "foo", "bar" ];
|
||||
for (var i = 0; i < a.length; i++) {
|
||||
var x = a[i];
|
||||
console.log(x);
|
||||
let y = a[i];
|
||||
setTimeout(() => console.log(y), 0);
|
||||
const z = a[i];
|
||||
setTimeout(function() {
|
||||
console.log(z);
|
||||
}, 0);
|
||||
}
|
||||
}
|
||||
expect_stdout: [
|
||||
"foo",
|
||||
"bar",
|
||||
"foo",
|
||||
"foo",
|
||||
"bar",
|
||||
"bar",
|
||||
]
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
issue_4290_1_const: {
|
||||
options = {
|
||||
reduce_vars: true,
|
||||
@@ -409,3 +495,31 @@ drop_forin_let: {
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
default_init: {
|
||||
options = {
|
||||
join_vars: true,
|
||||
reduce_vars: true,
|
||||
unused: true,
|
||||
varify: true,
|
||||
}
|
||||
input: {
|
||||
A = "PASS";
|
||||
(function() {
|
||||
"use strict";
|
||||
let a;
|
||||
a = A;
|
||||
console.log(a);
|
||||
})();
|
||||
}
|
||||
expect: {
|
||||
A = "PASS";
|
||||
(function() {
|
||||
"use strict";
|
||||
var a = A;
|
||||
console.log(a);
|
||||
})();
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
1085
test/compress/yields.js
Normal file
1085
test/compress/yields.js
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,6 @@
|
||||
exports["Compressor"] = Compressor;
|
||||
exports["defaults"] = defaults;
|
||||
exports["is_statement"] = is_statement;
|
||||
exports["JS_Parse_Error"] = JS_Parse_Error;
|
||||
exports["List"] = List;
|
||||
exports["mangle_properties"] = mangle_properties;
|
||||
|
||||
8
test/input/invalid/destructured_var.js
Normal file
8
test/input/invalid/destructured_var.js
Normal file
@@ -0,0 +1,8 @@
|
||||
function f() {
|
||||
var { eval } = null;
|
||||
}
|
||||
|
||||
function g() {
|
||||
"use strict";
|
||||
var { eval } = 42;
|
||||
}
|
||||
1
test/input/invalid/for-await.js
Normal file
1
test/input/invalid/for-await.js
Normal file
@@ -0,0 +1 @@
|
||||
for await (; console.log(42););
|
||||
3
test/input/invalid/for-of_1.js
Normal file
3
test/input/invalid/for-of_1.js
Normal file
@@ -0,0 +1,3 @@
|
||||
var a = [ 1 ], b;
|
||||
for (b = 2 of a)
|
||||
console.log(b);
|
||||
3
test/input/invalid/for-of_2.js
Normal file
3
test/input/invalid/for-of_2.js
Normal file
@@ -0,0 +1,3 @@
|
||||
var a = [ 1 ];
|
||||
for (var b = 2 of a)
|
||||
console.log(b);
|
||||
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"version": 3,
|
||||
"sources": [
|
||||
"input.js"
|
||||
],
|
||||
"names": [],
|
||||
"mappings": ";;;;;;;;;;;;;;eAAc,OAAO,CAAC,KAAD,C;IAAd,G,YAAA,G;;gBACS,OAAO,CAAC,OAAD,C;IAAhB,K,aAAA,K;;AAEP,GAAG,CAAC,CAAJ,OAAA,GAAG,qBAAM,GAAG,CAAC,CAAJ,CAAM,KAAK,CAAC,CAAZ,CAAN,EAAH",
|
||||
"sourcesContent": [
|
||||
"const {foo} = require(\"bar\");\nconst {hello} = require(\"world\");\n\nfoo.x(...foo.y(hello.z));\n"
|
||||
]
|
||||
}
|
||||
{
|
||||
"version": 3,
|
||||
"sources": [
|
||||
"input.js"
|
||||
],
|
||||
"names": [],
|
||||
"mappings": ";;;;;;;;;;;;;;eAAc,OAAO,CAAC,KAAD,C;IAAd,G,YAAA,G;;gBACS,OAAO,CAAC,OAAD,C;IAAhB,K,aAAA,K;;AAEP,GAAG,CAAC,CAAJ,OAAA,GAAG,qBAAM,GAAG,CAAC,CAAJ,CAAM,KAAK,CAAC,CAAZ,CAAN,EAAH",
|
||||
"sourcesContent": [
|
||||
"const {foo} = require(\"bar\");\nconst {hello} = require(\"world\");\n\nfoo.x(...foo.y(hello.z));\n"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"compress": false,
|
||||
"mangle": {
|
||||
"properties": {
|
||||
"regex": "/^_/"
|
||||
}
|
||||
}
|
||||
}
|
||||
{
|
||||
"compress": false,
|
||||
"mangle": {
|
||||
"properties": {
|
||||
"regex": "/^_/"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
3
test/input/reduce/destructured_assign.js
Normal file
3
test/input/reduce/destructured_assign.js
Normal file
@@ -0,0 +1,3 @@
|
||||
var o = {};
|
||||
[ o[1 + .1 + .1] ] = [ 42 ];
|
||||
console.log(o[1.2]);
|
||||
17
test/input/reduce/destructured_assign.reduced.js
Normal file
17
test/input/reduce/destructured_assign.reduced.js
Normal file
@@ -0,0 +1,17 @@
|
||||
// (beautified)
|
||||
var o = {};
|
||||
|
||||
[ o[1 + .1 + .1] ] = [];
|
||||
|
||||
console.log(o);
|
||||
// output: { '1.2000000000000002': undefined }
|
||||
//
|
||||
// minify: { '1.2': undefined }
|
||||
//
|
||||
// options: {
|
||||
// "compress": {
|
||||
// "unsafe_math": true
|
||||
// },
|
||||
// "mangle": false,
|
||||
// "validate": true
|
||||
// }
|
||||
7
test/input/reduce/destructured_catch.js
Normal file
7
test/input/reduce/destructured_catch.js
Normal file
@@ -0,0 +1,7 @@
|
||||
try {
|
||||
"foo" in 42;
|
||||
} catch ({
|
||||
message,
|
||||
}) {
|
||||
console.log(message);
|
||||
}
|
||||
13
test/input/reduce/destructured_catch.reduced.js
Normal file
13
test/input/reduce/destructured_catch.reduced.js
Normal file
@@ -0,0 +1,13 @@
|
||||
// (beautified)
|
||||
try {
|
||||
1 in 0;
|
||||
} catch (message) {
|
||||
console.log(message);
|
||||
}
|
||||
// output: TypeError: Cannot use 'in' operator to search for '1' in 0
|
||||
//
|
||||
// minify: TypeError: Cannot use 'in' operator to search for '0' in 0
|
||||
//
|
||||
// options: {
|
||||
// "mangle": false
|
||||
// }
|
||||
@@ -1,5 +1,5 @@
|
||||
(function f(a) {
|
||||
do {
|
||||
console.log(f.length);
|
||||
} while (console.log(f += 0));
|
||||
})();
|
||||
console.log(function(undefined) {
|
||||
return undefined[function() {
|
||||
{}
|
||||
}] || 1 + .1 + .1;
|
||||
}(42));
|
||||
|
||||
@@ -1,19 +1,14 @@
|
||||
// (beautified)
|
||||
(function f(a) {
|
||||
do {
|
||||
console.log(f.length);
|
||||
} while (console.log(f += 0));
|
||||
})();
|
||||
// output: 1
|
||||
// function(){}0
|
||||
console.log(function() {
|
||||
return 1 + .1 + .1;
|
||||
}());
|
||||
// output: 1.2000000000000002
|
||||
//
|
||||
// minify: 0
|
||||
// function(){}0
|
||||
// minify: 1.2
|
||||
//
|
||||
// options: {
|
||||
// "compress": {
|
||||
// "keep_fargs": false,
|
||||
// "unsafe": true
|
||||
// "unsafe_math": true
|
||||
// },
|
||||
// "mangle": false
|
||||
// }
|
||||
@@ -1,8 +1,5 @@
|
||||
console.log(function f(a) {
|
||||
({
|
||||
set p(v) {
|
||||
f++;
|
||||
}
|
||||
});
|
||||
return f.length;
|
||||
}());
|
||||
({
|
||||
set p(v) {
|
||||
console.log(+v + .1 + .1);
|
||||
}
|
||||
}).p = 1;
|
||||
|
||||
@@ -1,20 +1,16 @@
|
||||
// (beautified)
|
||||
console.log(function f(a) {
|
||||
({
|
||||
set p(v) {
|
||||
f++;
|
||||
}
|
||||
});
|
||||
return f.length;
|
||||
}());
|
||||
// output: 1
|
||||
({
|
||||
set p(v) {
|
||||
console.log(1 + .1 + .1);
|
||||
}
|
||||
}).p = 0;
|
||||
// output: 1.2000000000000002
|
||||
//
|
||||
// minify: 0
|
||||
// minify: 1.2
|
||||
//
|
||||
// options: {
|
||||
// "compress": {
|
||||
// "keep_fargs": false,
|
||||
// "unsafe": true
|
||||
// "unsafe_math": true
|
||||
// },
|
||||
// "mangle": false
|
||||
// }
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
var site = "https://browserbench.org/JetStream1.1";
|
||||
if (typeof phantom == "undefined") {
|
||||
require("../tools/exit");
|
||||
require("../tools/tty");
|
||||
var args = process.argv.slice(2);
|
||||
var debug = args.indexOf("--debug");
|
||||
if (debug < 0) {
|
||||
|
||||
65
test/mocha/awaits.js
Normal file
65
test/mocha/awaits.js
Normal file
@@ -0,0 +1,65 @@
|
||||
var assert = require("assert");
|
||||
var UglifyJS = require("../node");
|
||||
|
||||
describe("async", function() {
|
||||
it("Should reject `await` as symbol name within async functions only", function() {
|
||||
[
|
||||
"function await() {}",
|
||||
"function(await) {}",
|
||||
"function() { await; }",
|
||||
"function() { await:{} }",
|
||||
"function() { var await; }",
|
||||
"function() { function await() {} }",
|
||||
"function() { try {} catch (await) {} }",
|
||||
].forEach(function(code) {
|
||||
var ast = UglifyJS.parse("(" + code + ")();");
|
||||
assert.strictEqual(ast.TYPE, "Toplevel");
|
||||
assert.strictEqual(ast.body.length, 1);
|
||||
assert.strictEqual(ast.body[0].TYPE, "SimpleStatement");
|
||||
assert.strictEqual(ast.body[0].body.TYPE, "Call");
|
||||
assert.strictEqual(ast.body[0].body.expression.TYPE, "Function");
|
||||
assert.throws(function() {
|
||||
UglifyJS.parse("(async " + code + ")();");
|
||||
}, function(e) {
|
||||
return e instanceof UglifyJS.JS_Parse_Error;
|
||||
}, code);
|
||||
});
|
||||
});
|
||||
it("Should reject `await` expression outside of async functions", function() {
|
||||
[
|
||||
"await 42;",
|
||||
"function f() { await 42; }",
|
||||
"async function f() { function g() { await 42; } }",
|
||||
].forEach(function(code) {
|
||||
assert.throws(function() {
|
||||
UglifyJS.parse(code);
|
||||
}, function(e) {
|
||||
return e instanceof UglifyJS.JS_Parse_Error;
|
||||
}, code);
|
||||
});
|
||||
});
|
||||
it("Should reject `await` expression directly on computed key of function argument", function() {
|
||||
[
|
||||
"function f({ [await 42]: a }) {}",
|
||||
"async function f({ [await 42]: a }) {}",
|
||||
].forEach(function(code) {
|
||||
assert.throws(function() {
|
||||
UglifyJS.parse(code);
|
||||
}, function(e) {
|
||||
return e instanceof UglifyJS.JS_Parse_Error;
|
||||
}, code);
|
||||
});
|
||||
});
|
||||
it("Should accept `await` expression nested within computed key of function argument", function() {
|
||||
[
|
||||
"function f({ [async function() { await 42; }()]: a }) {}",
|
||||
"async function f({ [async function() { await 42; }()]: a }) {}",
|
||||
].forEach(function(code) {
|
||||
var ast = UglifyJS.parse(code);
|
||||
assert.strictEqual(ast.TYPE, "Toplevel");
|
||||
assert.strictEqual(ast.body.length, 1);
|
||||
assert.strictEqual(ast.body[0].argnames.length, 1);
|
||||
assert.strictEqual(ast.body[0].argnames[0].TYPE, "DestructuredObject");
|
||||
});
|
||||
});
|
||||
});
|
||||
40
test/mocha/bug-report.js
Normal file
40
test/mocha/bug-report.js
Normal file
@@ -0,0 +1,40 @@
|
||||
var assert = require("assert");
|
||||
var exec = require("child_process").exec;
|
||||
|
||||
describe("UGLIFY_BUG_REPORT", function() {
|
||||
var env = Object.create(process.env);
|
||||
env.UGLIFY_BUG_REPORT = 1;
|
||||
it("Should generate bug report via API", function(done) {
|
||||
exec('"' + process.argv[0] + '"', { env: env }, function(err, stdout) {
|
||||
if (err) throw err;
|
||||
assert.strictEqual(stdout, [
|
||||
"// UGLIFY_BUG_REPORT",
|
||||
"// <<undefined>>",
|
||||
"",
|
||||
"//-------------------------------------------------------------",
|
||||
"// INPUT CODE",
|
||||
"...---...",
|
||||
"",
|
||||
].join("\n"));
|
||||
done();
|
||||
}).stdin.end('console.log(require("./").minify("...---...").code);');
|
||||
});
|
||||
it("Should generate bug report via CLI", function(done) {
|
||||
exec('"' + process.argv[0] + '" bin/uglifyjs -mc', { env: env }, function(err, stdout) {
|
||||
if (err) throw err;
|
||||
assert.strictEqual(stdout, [
|
||||
"// UGLIFY_BUG_REPORT",
|
||||
"// {",
|
||||
'// "mangle": {},',
|
||||
'// "compress": {}',
|
||||
"// }",
|
||||
"",
|
||||
"//-------------------------------------------------------------",
|
||||
"// STDIN",
|
||||
"...---...",
|
||||
"",
|
||||
].join("\n"));
|
||||
done();
|
||||
}).stdin.end("...---...");
|
||||
});
|
||||
});
|
||||
@@ -29,7 +29,7 @@ describe("bin/uglifyjs", function() {
|
||||
var command = uglifyjscmd + ' test/input/comments/filter.js --comments all';
|
||||
exec(command, function(err, stdout) {
|
||||
if (err) throw err;
|
||||
assert.strictEqual(stdout, "// foo\n/*@preserve*/\n// bar\n\n");
|
||||
assert.strictEqual(stdout, "// foo\n/*@preserve*/\n// bar\n");
|
||||
done();
|
||||
});
|
||||
});
|
||||
@@ -37,7 +37,7 @@ describe("bin/uglifyjs", function() {
|
||||
var command = uglifyjscmd + ' test/input/comments/filter.js --comments /r/';
|
||||
exec(command, function(err, stdout) {
|
||||
if (err) throw err;
|
||||
assert.strictEqual(stdout, "/*@preserve*/\n// bar\n\n");
|
||||
assert.strictEqual(stdout, "/*@preserve*/\n// bar\n");
|
||||
done();
|
||||
});
|
||||
});
|
||||
@@ -45,7 +45,7 @@ describe("bin/uglifyjs", function() {
|
||||
var command = uglifyjscmd + ' test/input/comments/filter.js --comments';
|
||||
exec(command, function(err, stdout) {
|
||||
if (err) throw err;
|
||||
assert.strictEqual(stdout, "/*@preserve*/\n\n");
|
||||
assert.strictEqual(stdout, "/*@preserve*/\n");
|
||||
done();
|
||||
});
|
||||
});
|
||||
@@ -56,7 +56,7 @@ describe("bin/uglifyjs", function() {
|
||||
"--source-map", [
|
||||
"names=true",
|
||||
"url=inline",
|
||||
].join(","),
|
||||
].join(),
|
||||
].join(" "), function(err, stdout) {
|
||||
if (err) throw err;
|
||||
var expected = [
|
||||
@@ -84,7 +84,7 @@ describe("bin/uglifyjs", function() {
|
||||
"--source-map", [
|
||||
"names=false",
|
||||
"url=inline",
|
||||
].join(","),
|
||||
].join(),
|
||||
].join(" "), function(err, stdout) {
|
||||
if (err) throw err;
|
||||
var expected = [
|
||||
@@ -171,7 +171,7 @@ describe("bin/uglifyjs", function() {
|
||||
"content=" + mapFile,
|
||||
"includeSources",
|
||||
"url=inline",
|
||||
].join(","),
|
||||
].join(),
|
||||
].join(" ");
|
||||
|
||||
var child = exec(command, function(err, stdout) {
|
||||
@@ -333,11 +333,13 @@ describe("bin/uglifyjs", function() {
|
||||
var command = uglifyjscmd + " test/input/invalid/simple.js";
|
||||
exec(command, function(err, stdout, stderr) {
|
||||
assert.ok(err);
|
||||
var lines = stderr.split(/\n/);
|
||||
assert.strictEqual(lines[0], "Parse error at test/input/invalid/simple.js:1,12");
|
||||
assert.strictEqual(lines[1], "function f(a{}");
|
||||
assert.strictEqual(lines[2], " ^");
|
||||
assert.strictEqual(lines[3], "ERROR: Unexpected token: punc «{», expected: punc «,»");
|
||||
assert.strictEqual(stdout, "");
|
||||
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
||||
"Parse error at test/input/invalid/simple.js:1,12",
|
||||
"function f(a{}",
|
||||
" ^",
|
||||
"ERROR: Unexpected token: punc «{», expected: punc «,»",
|
||||
].join("\n"));
|
||||
done();
|
||||
});
|
||||
});
|
||||
@@ -345,11 +347,13 @@ describe("bin/uglifyjs", function() {
|
||||
var command = uglifyjscmd + " test/input/invalid/tab.js";
|
||||
exec(command, function(err, stdout, stderr) {
|
||||
assert.ok(err);
|
||||
var lines = stderr.split(/\n/);
|
||||
assert.strictEqual(lines[0], "Parse error at test/input/invalid/tab.js:1,12");
|
||||
assert.strictEqual(lines[1], "\t\tfoo(\txyz, 0abc);");
|
||||
assert.strictEqual(lines[2], "\t\t \t ^");
|
||||
assert.strictEqual(lines[3], "ERROR: Invalid syntax: 0abc");
|
||||
assert.strictEqual(stdout, "");
|
||||
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
||||
"Parse error at test/input/invalid/tab.js:1,12",
|
||||
"\t\tfoo(\txyz, 0abc);",
|
||||
"\t\t \t ^",
|
||||
"ERROR: Invalid syntax: 0abc",
|
||||
].join("\n"));
|
||||
done();
|
||||
});
|
||||
});
|
||||
@@ -357,11 +361,13 @@ describe("bin/uglifyjs", function() {
|
||||
var command = uglifyjscmd + " test/input/invalid/eof.js";
|
||||
exec(command, function(err, stdout, stderr) {
|
||||
assert.ok(err);
|
||||
var lines = stderr.split(/\n/);
|
||||
assert.strictEqual(lines[0], "Parse error at test/input/invalid/eof.js:2,0");
|
||||
assert.strictEqual(lines[1], "foo, bar(");
|
||||
assert.strictEqual(lines[2], " ^");
|
||||
assert.strictEqual(lines[3], "ERROR: Unexpected token: eof");
|
||||
assert.strictEqual(stdout, "");
|
||||
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
||||
"Parse error at test/input/invalid/eof.js:2,0",
|
||||
"foo, bar(",
|
||||
" ^",
|
||||
"ERROR: Unexpected token: eof",
|
||||
].join("\n"));
|
||||
done();
|
||||
});
|
||||
});
|
||||
@@ -369,11 +375,13 @@ describe("bin/uglifyjs", function() {
|
||||
var command = uglifyjscmd + " test/input/invalid/loop-no-body.js";
|
||||
exec(command, function(err, stdout, stderr) {
|
||||
assert.ok(err);
|
||||
var lines = stderr.split(/\n/);
|
||||
assert.strictEqual(lines[0], "Parse error at test/input/invalid/loop-no-body.js:2,0");
|
||||
assert.strictEqual(lines[1], "for (var i = 0; i < 1; i++) ");
|
||||
assert.strictEqual(lines[2], " ^");
|
||||
assert.strictEqual(lines[3], "ERROR: Unexpected token: eof");
|
||||
assert.strictEqual(stdout, "");
|
||||
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
||||
"Parse error at test/input/invalid/loop-no-body.js:2,0",
|
||||
"for (var i = 0; i < 1; i++) ",
|
||||
" ^",
|
||||
"ERROR: Unexpected token: eof",
|
||||
].join("\n"));
|
||||
done();
|
||||
});
|
||||
});
|
||||
@@ -386,7 +394,7 @@ describe("bin/uglifyjs", function() {
|
||||
"Parse error at test/input/invalid/assign_1.js:1,18",
|
||||
"console.log(1 || 5--);",
|
||||
" ^",
|
||||
"ERROR: Invalid use of -- operator"
|
||||
"ERROR: Invalid use of -- operator",
|
||||
].join("\n"));
|
||||
done();
|
||||
});
|
||||
@@ -400,7 +408,7 @@ describe("bin/uglifyjs", function() {
|
||||
"Parse error at test/input/invalid/assign_2.js:1,32",
|
||||
"console.log(2 || (Math.random() /= 2));",
|
||||
" ^",
|
||||
"ERROR: Invalid assignment"
|
||||
"ERROR: Invalid assignment",
|
||||
].join("\n"));
|
||||
done();
|
||||
});
|
||||
@@ -414,7 +422,7 @@ describe("bin/uglifyjs", function() {
|
||||
"Parse error at test/input/invalid/assign_3.js:1,17",
|
||||
"console.log(3 || ++this);",
|
||||
" ^",
|
||||
"ERROR: Invalid use of ++ operator"
|
||||
"ERROR: Invalid use of ++ operator",
|
||||
].join("\n"));
|
||||
done();
|
||||
});
|
||||
@@ -428,7 +436,7 @@ describe("bin/uglifyjs", function() {
|
||||
"Parse error at test/input/invalid/assign_4.js:1,0",
|
||||
"++null",
|
||||
"^",
|
||||
"ERROR: Invalid use of ++ operator"
|
||||
"ERROR: Invalid use of ++ operator",
|
||||
].join("\n"));
|
||||
done();
|
||||
});
|
||||
@@ -442,7 +450,7 @@ describe("bin/uglifyjs", function() {
|
||||
"Parse error at test/input/invalid/dot_1.js:1,2",
|
||||
"a.=",
|
||||
" ^",
|
||||
"ERROR: Unexpected token: operator «=», expected: name"
|
||||
"ERROR: Unexpected token: operator «=», expected: name",
|
||||
].join("\n"));
|
||||
done();
|
||||
});
|
||||
@@ -456,7 +464,7 @@ describe("bin/uglifyjs", function() {
|
||||
"Parse error at test/input/invalid/dot_2.js:1,0",
|
||||
"%.a;",
|
||||
"^",
|
||||
"ERROR: Unexpected token: operator «%»"
|
||||
"ERROR: Unexpected token: operator «%»",
|
||||
].join("\n"));
|
||||
done();
|
||||
});
|
||||
@@ -470,7 +478,7 @@ describe("bin/uglifyjs", function() {
|
||||
"Parse error at test/input/invalid/dot_3.js:1,2",
|
||||
"a./();",
|
||||
" ^",
|
||||
"ERROR: Unexpected token: operator «/», expected: name"
|
||||
"ERROR: Unexpected token: operator «/», expected: name",
|
||||
].join("\n"));
|
||||
done();
|
||||
});
|
||||
@@ -484,7 +492,7 @@ describe("bin/uglifyjs", function() {
|
||||
"Parse error at test/input/invalid/object.js:1,13",
|
||||
"console.log({%: 1});",
|
||||
" ^",
|
||||
"ERROR: Unexpected token: operator «%»"
|
||||
"ERROR: Unexpected token: operator «%»",
|
||||
].join("\n"));
|
||||
done();
|
||||
});
|
||||
@@ -498,7 +506,7 @@ describe("bin/uglifyjs", function() {
|
||||
"Parse error at test/input/invalid/delete.js:13,11",
|
||||
" delete x;",
|
||||
" ^",
|
||||
"ERROR: Calling delete on expression not allowed in strict mode"
|
||||
"ERROR: Calling delete on expression not allowed in strict mode",
|
||||
].join("\n"));
|
||||
done();
|
||||
});
|
||||
@@ -512,7 +520,7 @@ describe("bin/uglifyjs", function() {
|
||||
"Parse error at test/input/invalid/function_1.js:4,11",
|
||||
"function g(arguments) {",
|
||||
" ^",
|
||||
"ERROR: Unexpected arguments in strict mode"
|
||||
"ERROR: Unexpected arguments in strict mode",
|
||||
].join("\n"));
|
||||
done();
|
||||
});
|
||||
@@ -526,7 +534,7 @@ describe("bin/uglifyjs", function() {
|
||||
"Parse error at test/input/invalid/function_2.js:4,9",
|
||||
"function eval() {",
|
||||
" ^",
|
||||
"ERROR: Unexpected eval in strict mode"
|
||||
"ERROR: Unexpected eval in strict mode",
|
||||
].join("\n"));
|
||||
done();
|
||||
});
|
||||
@@ -540,7 +548,7 @@ describe("bin/uglifyjs", function() {
|
||||
"Parse error at test/input/invalid/function_3.js:4,10",
|
||||
"!function arguments() {",
|
||||
" ^",
|
||||
"ERROR: Unexpected arguments in strict mode"
|
||||
"ERROR: Unexpected arguments in strict mode",
|
||||
].join("\n"));
|
||||
done();
|
||||
});
|
||||
@@ -554,7 +562,7 @@ describe("bin/uglifyjs", function() {
|
||||
"Parse error at test/input/invalid/try.js:7,18",
|
||||
" try {} catch (eval) {}",
|
||||
" ^",
|
||||
"ERROR: Unexpected eval in strict mode"
|
||||
"ERROR: Unexpected eval in strict mode",
|
||||
].join("\n"));
|
||||
done();
|
||||
});
|
||||
@@ -568,7 +576,21 @@ describe("bin/uglifyjs", function() {
|
||||
"Parse error at test/input/invalid/var.js:7,8",
|
||||
" var eval;",
|
||||
" ^",
|
||||
"ERROR: Unexpected eval in strict mode"
|
||||
"ERROR: Unexpected eval in strict mode",
|
||||
].join("\n"));
|
||||
done();
|
||||
});
|
||||
});
|
||||
it("Should throw syntax error (var { eval })", function(done) {
|
||||
var command = uglifyjscmd + " test/input/invalid/destructured_var.js";
|
||||
exec(command, function(err, stdout, stderr) {
|
||||
assert.ok(err);
|
||||
assert.strictEqual(stdout, "");
|
||||
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
||||
"Parse error at test/input/invalid/destructured_var.js:7,10",
|
||||
" var { eval } = 42;",
|
||||
" ^",
|
||||
"ERROR: Unexpected eval in strict mode",
|
||||
].join("\n"));
|
||||
done();
|
||||
});
|
||||
@@ -582,7 +604,7 @@ describe("bin/uglifyjs", function() {
|
||||
"Parse error at test/input/invalid/else.js:1,7",
|
||||
"if (0) else 1;",
|
||||
" ^",
|
||||
"ERROR: Unexpected token: keyword «else»"
|
||||
"ERROR: Unexpected token: keyword «else»",
|
||||
].join("\n"));
|
||||
done();
|
||||
});
|
||||
@@ -596,7 +618,7 @@ describe("bin/uglifyjs", function() {
|
||||
"Parse error at test/input/invalid/return.js:1,0",
|
||||
"return 42;",
|
||||
"^",
|
||||
"ERROR: 'return' outside of function"
|
||||
"ERROR: 'return' outside of function",
|
||||
].join("\n"));
|
||||
done();
|
||||
});
|
||||
@@ -610,7 +632,7 @@ describe("bin/uglifyjs", function() {
|
||||
"Parse error at test/input/invalid/for-in_1.js:2,5",
|
||||
"for (1, 2, a in b) {",
|
||||
" ^",
|
||||
"ERROR: Invalid left-hand side in for..in loop"
|
||||
"ERROR: Invalid left-hand side in for..in/of loop",
|
||||
].join("\n"));
|
||||
done();
|
||||
});
|
||||
@@ -624,7 +646,49 @@ describe("bin/uglifyjs", function() {
|
||||
"Parse error at test/input/invalid/for-in_2.js:2,5",
|
||||
"for (var a, b in c) {",
|
||||
" ^",
|
||||
"ERROR: Only one variable declaration allowed in for..in loop"
|
||||
"ERROR: Only one variable declaration allowed in for..in/of loop",
|
||||
].join("\n"));
|
||||
done();
|
||||
});
|
||||
});
|
||||
it("Should throw syntax error (for-of init)", function(done) {
|
||||
var command = uglifyjscmd + " test/input/invalid/for-of_1.js";
|
||||
exec(command, function(err, stdout, stderr) {
|
||||
assert.ok(err);
|
||||
assert.strictEqual(stdout, "");
|
||||
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
||||
"Parse error at test/input/invalid/for-of_1.js:2,5",
|
||||
"for (b = 2 of a)",
|
||||
" ^",
|
||||
"ERROR: Invalid left-hand side in for..in/of loop",
|
||||
].join("\n"));
|
||||
done();
|
||||
});
|
||||
});
|
||||
it("Should throw syntax error (for-of var)", function(done) {
|
||||
var command = uglifyjscmd + " test/input/invalid/for-of_2.js";
|
||||
exec(command, function(err, stdout, stderr) {
|
||||
assert.ok(err);
|
||||
assert.strictEqual(stdout, "");
|
||||
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
||||
"Parse error at test/input/invalid/for-of_2.js:2,13",
|
||||
"for (var b = 2 of a)",
|
||||
" ^",
|
||||
"ERROR: No initializers allowed in for..of loop",
|
||||
].join("\n"));
|
||||
done();
|
||||
});
|
||||
});
|
||||
it("Should throw syntax error (for-await)", function(done) {
|
||||
var command = uglifyjscmd + " test/input/invalid/for-await.js";
|
||||
exec(command, function(err, stdout, stderr) {
|
||||
assert.ok(err);
|
||||
assert.strictEqual(stdout, "");
|
||||
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
||||
"Parse error at test/input/invalid/for-await.js:1,11",
|
||||
"for await (; console.log(42););",
|
||||
" ^",
|
||||
"ERROR: Unexpected token: punc «;»",
|
||||
].join("\n"));
|
||||
done();
|
||||
});
|
||||
@@ -633,11 +697,13 @@ describe("bin/uglifyjs", function() {
|
||||
var command = uglifyjscmd + " test/input/invalid/switch.js";
|
||||
exec(command, function(err, stdout, stderr) {
|
||||
assert.ok(err);
|
||||
var lines = stderr.split(/\n/);
|
||||
assert.strictEqual(lines[0], "Parse error at test/input/invalid/switch.js:3,2");
|
||||
assert.strictEqual(lines[1], " default:");
|
||||
assert.strictEqual(lines[2], " ^");
|
||||
assert.strictEqual(lines[3], "ERROR: More than one default clause in switch statement");
|
||||
assert.strictEqual(stdout, "");
|
||||
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
||||
"Parse error at test/input/invalid/switch.js:3,2",
|
||||
" default:",
|
||||
" ^",
|
||||
"ERROR: More than one default clause in switch statement",
|
||||
].join("\n"));
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -259,7 +259,7 @@ describe("comments", function() {
|
||||
assert.strictEqual(result.code, code);
|
||||
});
|
||||
|
||||
it("Should handle comments around parenthesis correctly", function() {
|
||||
it("Should handle comments around parentheses correctly", function() {
|
||||
var code = [
|
||||
"a();",
|
||||
"/* foo */",
|
||||
@@ -392,12 +392,12 @@ describe("comments", function() {
|
||||
describe("comment filters", function() {
|
||||
it("Should be able to filter comments by passing regexp", function() {
|
||||
var ast = UglifyJS.parse("/*!test1*/\n/*test2*/\n//!test3\n//test4\n<!--test5\n<!--!test6\n-->test7\n-->!test8");
|
||||
assert.strictEqual(ast.print_to_string({comments: /^!/}), "/*!test1*/\n//!test3\n//!test6\n//!test8\n");
|
||||
assert.strictEqual(ast.print_to_string({comments: /^!/}), "/*!test1*/\n//!test3\n//!test6\n//!test8");
|
||||
});
|
||||
|
||||
it("Should be able to filter comments with the 'all' option", function() {
|
||||
var ast = UglifyJS.parse("/*!test1*/\n/*test2*/\n//!test3\n//test4\n<!--test5\n<!--!test6\n-->test7\n-->!test8");
|
||||
assert.strictEqual(ast.print_to_string({comments: "all"}), "/*!test1*/\n/*test2*/\n//!test3\n//test4\n//test5\n//!test6\n//test7\n//!test8\n");
|
||||
assert.strictEqual(ast.print_to_string({comments: "all"}), "/*!test1*/\n/*test2*/\n//!test3\n//test4\n//test5\n//!test6\n//test7\n//!test8");
|
||||
});
|
||||
|
||||
it("Should be able to filter commments with the 'some' option", function() {
|
||||
@@ -410,13 +410,12 @@ describe("comments", function() {
|
||||
var f = function(node, comment) {
|
||||
return comment.value.length === 8;
|
||||
};
|
||||
|
||||
assert.strictEqual(ast.print_to_string({comments: f}), "/*TEST 123*/\n//8 chars.\n");
|
||||
assert.strictEqual(ast.print_to_string({comments: f}), "/*TEST 123*/\n//8 chars.");
|
||||
});
|
||||
|
||||
it("Should be able to filter comments by passing regex in string format", function() {
|
||||
var ast = UglifyJS.parse("/*!test1*/\n/*test2*/\n//!test3\n//test4\n<!--test5\n<!--!test6\n-->test7\n-->!test8");
|
||||
assert.strictEqual(ast.print_to_string({comments: "/^!/"}), "/*!test1*/\n//!test3\n//!test6\n//!test8\n");
|
||||
assert.strictEqual(ast.print_to_string({comments: "/^!/"}), "/*!test1*/\n//!test3\n//!test6\n//!test8");
|
||||
});
|
||||
|
||||
it("Should be able to get the comment and comment type when using a function", function() {
|
||||
@@ -424,14 +423,12 @@ describe("comments", function() {
|
||||
var f = function(node, comment) {
|
||||
return comment.type == "comment1" || comment.type == "comment3";
|
||||
};
|
||||
|
||||
assert.strictEqual(ast.print_to_string({comments: f}), "//!test3\n//test4\n//test5\n//!test6\n");
|
||||
assert.strictEqual(ast.print_to_string({comments: f}), "//!test3\n//test4\n//test5\n//!test6");
|
||||
});
|
||||
|
||||
it("Should be able to filter comments by passing a boolean", function() {
|
||||
var ast = UglifyJS.parse("/*!test1*/\n/*test2*/\n//!test3\n//test4\n<!--test5\n<!--!test6\n-->test7\n-->!test8");
|
||||
|
||||
assert.strictEqual(ast.print_to_string({comments: true}), "/*!test1*/\n/*test2*/\n//!test3\n//test4\n//test5\n//!test6\n//test7\n//!test8\n");
|
||||
assert.strictEqual(ast.print_to_string({comments: true}), "/*!test1*/\n/*test2*/\n//!test3\n//test4\n//test5\n//!test6\n//test7\n//!test8");
|
||||
assert.strictEqual(ast.print_to_string({comments: false}), "");
|
||||
});
|
||||
|
||||
@@ -439,10 +436,8 @@ describe("comments", function() {
|
||||
var ast = UglifyJS.parse("#!Random comment\n//test1\n/*test2*/");
|
||||
var f = function(node, comment) {
|
||||
assert.strictEqual(comment.type === "comment5", false);
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
assert.strictEqual(ast.print_to_string({comments: f}), "#!Random comment\n//test1\n/*test2*/");
|
||||
});
|
||||
|
||||
@@ -453,9 +448,8 @@ describe("comments", function() {
|
||||
|
||||
it("Should have no problem on multiple calls", function() {
|
||||
const options = {
|
||||
comments: /ok/
|
||||
comments: /ok/,
|
||||
};
|
||||
|
||||
assert.strictEqual(UglifyJS.parse("/* ok */ function a(){}").print_to_string(options), "/* ok */function a(){}");
|
||||
assert.strictEqual(UglifyJS.parse("/* ok */ function a(){}").print_to_string(options), "/* ok */function a(){}");
|
||||
assert.strictEqual(UglifyJS.parse("/* ok */ function a(){}").print_to_string(options), "/* ok */function a(){}");
|
||||
@@ -463,14 +457,14 @@ describe("comments", function() {
|
||||
|
||||
it("Should handle shebang and preamble correctly", function() {
|
||||
var code = UglifyJS.minify("#!/usr/bin/node\nvar x = 10;", {
|
||||
output: { preamble: "/* Build */" }
|
||||
output: { preamble: "/* Build */" },
|
||||
}).code;
|
||||
assert.strictEqual(code, "#!/usr/bin/node\n/* Build */\nvar x=10;");
|
||||
});
|
||||
|
||||
it("Should handle preamble without shebang correctly", function() {
|
||||
var code = UglifyJS.minify("var x = 10;", {
|
||||
output: { preamble: "/* Build */" }
|
||||
output: { preamble: "/* Build */" },
|
||||
}).code;
|
||||
assert.strictEqual(code, "/* Build */\nvar x=10;");
|
||||
});
|
||||
|
||||
71
test/mocha/exports.js
Normal file
71
test/mocha/exports.js
Normal file
@@ -0,0 +1,71 @@
|
||||
var assert = require("assert");
|
||||
var UglifyJS = require("../node");
|
||||
|
||||
describe("export", function() {
|
||||
it("Should reject invalid `export ...` statement syntax", function() {
|
||||
[
|
||||
"export *;",
|
||||
"export A;",
|
||||
"export 42;",
|
||||
"export var;",
|
||||
"export * as A;",
|
||||
"export A as B;",
|
||||
"export const A;",
|
||||
"export function(){};",
|
||||
].forEach(function(code) {
|
||||
assert.throws(function() {
|
||||
UglifyJS.parse(code);
|
||||
}, function(e) {
|
||||
return e instanceof UglifyJS.JS_Parse_Error;
|
||||
}, code);
|
||||
});
|
||||
});
|
||||
it("Should reject invalid `export { ... }` statement syntax", function() {
|
||||
[
|
||||
"export { * };",
|
||||
"export { * as A };",
|
||||
"export { 42 as A };",
|
||||
"export { A as B-C };",
|
||||
"export { default as A };",
|
||||
].forEach(function(code) {
|
||||
assert.throws(function() {
|
||||
UglifyJS.parse(code);
|
||||
}, function(e) {
|
||||
return e instanceof UglifyJS.JS_Parse_Error;
|
||||
}, code);
|
||||
});
|
||||
});
|
||||
it("Should reject invalid `export default ...` statement syntax", function() {
|
||||
[
|
||||
"export default *;",
|
||||
"export default var;",
|
||||
"export default A as B;",
|
||||
].forEach(function(code) {
|
||||
assert.throws(function() {
|
||||
UglifyJS.parse(code);
|
||||
}, function(e) {
|
||||
return e instanceof UglifyJS.JS_Parse_Error;
|
||||
}, code);
|
||||
});
|
||||
});
|
||||
it("Should reject invalid `export ... from ...` statement syntax", function() {
|
||||
[
|
||||
"export from 'path';",
|
||||
"export * from `path`;",
|
||||
"export A as B from 'path';",
|
||||
"export default from 'path';",
|
||||
"export { A }, B from 'path';",
|
||||
"export * as A, B from 'path';",
|
||||
"export * as A, {} from 'path';",
|
||||
"export { * as A } from 'path';",
|
||||
"export { 42 as A } from 'path';",
|
||||
"export { A-B as C } from 'path';",
|
||||
].forEach(function(code) {
|
||||
assert.throws(function() {
|
||||
UglifyJS.parse(code);
|
||||
}, function(e) {
|
||||
return e instanceof UglifyJS.JS_Parse_Error;
|
||||
}, code);
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -3,7 +3,7 @@ var UglifyJS = require("../node");
|
||||
|
||||
describe("Getters and setters", function() {
|
||||
it("Should not accept operator symbols as getter/setter name", function() {
|
||||
var illegalOperators = [
|
||||
[
|
||||
"++",
|
||||
"--",
|
||||
"+",
|
||||
@@ -42,43 +42,26 @@ describe("Getters and setters", function() {
|
||||
"&=",
|
||||
"&&",
|
||||
"||"
|
||||
];
|
||||
var generator = function() {
|
||||
var results = [];
|
||||
|
||||
for (var i in illegalOperators) {
|
||||
results.push({
|
||||
code: "var obj = { get " + illegalOperators[i] + "() { return test; }};",
|
||||
operator: illegalOperators[i],
|
||||
method: "get"
|
||||
});
|
||||
results.push({
|
||||
code: "var obj = { set " + illegalOperators[i] + "(value) { test = value}};",
|
||||
operator: illegalOperators[i],
|
||||
method: "set"
|
||||
});
|
||||
}
|
||||
|
||||
return results;
|
||||
};
|
||||
var testCase = function(data) {
|
||||
return function() {
|
||||
UglifyJS.parse(data.code);
|
||||
};
|
||||
};
|
||||
var fail = function(data) {
|
||||
return function(e) {
|
||||
].reduce(function(tests, illegalOperator) {
|
||||
tests.push({
|
||||
code: "var obj = { get " + illegalOperator + "() { return test; }};",
|
||||
operator: illegalOperator,
|
||||
});
|
||||
tests.push({
|
||||
code: "var obj = { set " + illegalOperator + "(value) { test = value; }};",
|
||||
operator: illegalOperator,
|
||||
});
|
||||
return tests;
|
||||
}, []).forEach(function(test) {
|
||||
assert.throws(function() {
|
||||
UglifyJS.parse(test.code);
|
||||
}, test.operator == "=" ? function(e) {
|
||||
return e instanceof UglifyJS.JS_Parse_Error
|
||||
&& e.message === "Unexpected token: operator «" + data.operator + "»";
|
||||
};
|
||||
};
|
||||
var errorMessage = function(data) {
|
||||
return "Expected but didn't get a syntax error while parsing following line:\n" + data.code;
|
||||
};
|
||||
var tests = generator();
|
||||
for (var i = 0; i < tests.length; i++) {
|
||||
var test = tests[i];
|
||||
assert.throws(testCase(test), fail(test), errorMessage(test));
|
||||
}
|
||||
&& /^Unexpected token: punc «{», expected: punc «.*?»$/.test(e.message);
|
||||
} : function(e) {
|
||||
return e instanceof UglifyJS.JS_Parse_Error
|
||||
&& e.message === "Unexpected token: operator «" + test.operator + "»";
|
||||
}, "Expected but didn't get a syntax error while parsing following line:\n" + test.code);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
28
test/mocha/imports.js
Normal file
28
test/mocha/imports.js
Normal file
@@ -0,0 +1,28 @@
|
||||
var assert = require("assert");
|
||||
var UglifyJS = require("../node");
|
||||
|
||||
describe("import", function() {
|
||||
it("Should reject invalid `import` statement syntax", function() {
|
||||
[
|
||||
"import *;",
|
||||
"import A;",
|
||||
"import {};",
|
||||
"import `path`;",
|
||||
"import from 'path';",
|
||||
"import * from 'path';",
|
||||
"import A as B from 'path';",
|
||||
"import { A }, B from 'path';",
|
||||
"import * as A, B from 'path';",
|
||||
"import * as A, {} from 'path';",
|
||||
"import { * as A } from 'path';",
|
||||
"import { 42 as A } from 'path';",
|
||||
"import { A-B as C } from 'path';",
|
||||
].forEach(function(code) {
|
||||
assert.throws(function() {
|
||||
UglifyJS.parse(code);
|
||||
}, function(e) {
|
||||
return e instanceof UglifyJS.JS_Parse_Error;
|
||||
}, code);
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -235,8 +235,8 @@ describe("minify", function() {
|
||||
}
|
||||
});
|
||||
var code = result.code;
|
||||
assert.strictEqual(code, "var a=/* */function(){foo()}();");
|
||||
})
|
||||
assert.strictEqual(code, "var a=function(){foo()}();");
|
||||
});
|
||||
});
|
||||
|
||||
describe("JS_Parse_Error", function() {
|
||||
|
||||
@@ -89,4 +89,13 @@ describe("Number literals", function() {
|
||||
}, code);
|
||||
});
|
||||
});
|
||||
it("Should reject invalid syntax under expression=true", function() {
|
||||
assert.throws(function() {
|
||||
UglifyJS.parse("42.g", {
|
||||
expression: true,
|
||||
});
|
||||
}, function(e) {
|
||||
return e instanceof UglifyJS.JS_Parse_Error;
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -84,7 +84,7 @@ describe("parentheses", function() {
|
||||
}
|
||||
});
|
||||
|
||||
it("Should compress leading parenthesis with reasonable performance", function() {
|
||||
it("Should compress leading parentheses with reasonable performance", function() {
|
||||
this.timeout(30000);
|
||||
var code = [
|
||||
"({}?0:1)&&x();",
|
||||
|
||||
@@ -37,8 +37,7 @@ describe("test/reduce.js", function() {
|
||||
it("Should retain setter arguments", function() {
|
||||
var result = reduce_test(read("test/input/reduce/setter.js"), {
|
||||
compress: {
|
||||
keep_fargs: false,
|
||||
unsafe: true,
|
||||
unsafe_math: true,
|
||||
},
|
||||
mangle: false,
|
||||
}, {
|
||||
@@ -110,28 +109,24 @@ describe("test/reduce.js", function() {
|
||||
});
|
||||
it("Should print correct output for irreducible test case", function() {
|
||||
var result = reduce_test([
|
||||
"console.log(function f(a) {",
|
||||
" return f.length;",
|
||||
"}());",
|
||||
"console.log(1 + .1 + .1);",
|
||||
].join("\n"), {
|
||||
compress: {
|
||||
keep_fargs: false,
|
||||
unsafe_math: true,
|
||||
},
|
||||
mangle: false,
|
||||
});
|
||||
if (result.error) throw result.error;
|
||||
assert.strictEqual(result.code, [
|
||||
"// (beautified)",
|
||||
"console.log(function f(a) {",
|
||||
" return f.length;",
|
||||
"}());",
|
||||
"// output: 1",
|
||||
"console.log(1 + .1 + .1);",
|
||||
"// output: 1.2000000000000002",
|
||||
"// ",
|
||||
"// minify: 0",
|
||||
"// minify: 1.2",
|
||||
"// ",
|
||||
"// options: {",
|
||||
'// "compress": {',
|
||||
'// "keep_fargs": false',
|
||||
'// "unsafe_math": true',
|
||||
"// },",
|
||||
'// "mangle": false',
|
||||
"// }",
|
||||
@@ -188,6 +183,24 @@ describe("test/reduce.js", function() {
|
||||
"// }",
|
||||
].join("\n"));
|
||||
});
|
||||
it("Should reduce `for (const ... in ...)` without invalid intermediate AST", function() {
|
||||
if (semver.satisfies(process.version, "<4")) return;
|
||||
var code = [
|
||||
"var a = 0;",
|
||||
"",
|
||||
"for (const b in [ 1, 2, 3 ]) {",
|
||||
" a = +a + 1 - .2;",
|
||||
" console.log(a);",
|
||||
"}",
|
||||
].join("\n");
|
||||
var result = reduce_test(code, {
|
||||
compress: {
|
||||
unsafe_math: true,
|
||||
},
|
||||
});
|
||||
if (result.error) throw result.error;
|
||||
assert.deepEqual(result.warnings, []);
|
||||
});
|
||||
it("Should reduce infinite loops with reasonable performance", function() {
|
||||
if (semver.satisfies(process.version, "<=0.10")) return;
|
||||
this.timeout(120000);
|
||||
@@ -299,12 +312,45 @@ describe("test/reduce.js", function() {
|
||||
"// }",
|
||||
]).join("\n"));
|
||||
});
|
||||
it("Should maintain block-scope for const/let", function() {
|
||||
if (semver.satisfies(process.version, "<4")) return;
|
||||
this.timeout(120000);
|
||||
var code = [
|
||||
'"use strict";',
|
||||
"",
|
||||
"L: for (let a = (1 - .8).toString(); ;) {",
|
||||
" if (!console.log(a)) {",
|
||||
" break L;",
|
||||
" }",
|
||||
"}",
|
||||
].join("\n");
|
||||
var result = reduce_test(code, {
|
||||
compress: {
|
||||
unsafe_math: true,
|
||||
},
|
||||
mangle: false,
|
||||
});
|
||||
if (result.error) throw result.error;
|
||||
assert.strictEqual(result.code, [
|
||||
"// (beautified)",
|
||||
code,
|
||||
"// output: 0.19999999999999996",
|
||||
"// ",
|
||||
"// minify: 0.2",
|
||||
"// ",
|
||||
"// options: {",
|
||||
'// "compress": {',
|
||||
'// "unsafe_math": true',
|
||||
'// },',
|
||||
'// "mangle": false',
|
||||
"// }",
|
||||
].join("\n"));
|
||||
});
|
||||
it("Should handle corner cases when intermediate case differs only in Error.message", function() {
|
||||
if (semver.satisfies(process.version, "<=0.10")) return;
|
||||
var result = reduce_test(read("test/input/reduce/diff_error.js"), {
|
||||
compress: {
|
||||
keep_fargs: false,
|
||||
unsafe: true,
|
||||
unsafe_math: true,
|
||||
},
|
||||
mangle: false,
|
||||
}, {
|
||||
@@ -313,4 +359,59 @@ describe("test/reduce.js", function() {
|
||||
if (result.error) throw result.error;
|
||||
assert.strictEqual(result.code, read("test/input/reduce/diff_error.reduced.js"));
|
||||
});
|
||||
it("Should maintain valid LHS in destructuring assignments", function() {
|
||||
if (semver.satisfies(process.version, "<6")) return;
|
||||
var result = reduce_test(read("test/input/reduce/destructured_assign.js"), {
|
||||
compress: {
|
||||
unsafe_math: true,
|
||||
},
|
||||
mangle: false,
|
||||
validate: true,
|
||||
});
|
||||
if (result.error) throw result.error;
|
||||
assert.strictEqual(result.code, read("test/input/reduce/destructured_assign.reduced.js"));
|
||||
});
|
||||
it("Should handle destructured catch expressions", function() {
|
||||
if (semver.satisfies(process.version, "<6")) return;
|
||||
var result = reduce_test(read("test/input/reduce/destructured_catch.js"), {
|
||||
mangle: false,
|
||||
});
|
||||
if (result.error) throw result.error;
|
||||
assert.strictEqual(result.code, read("test/input/reduce/destructured_catch.reduced.js"));
|
||||
});
|
||||
it("Should not enumerate `toString` over global context", function() {
|
||||
if (semver.satisfies(process.version, "<8")) return;
|
||||
var code = [
|
||||
"(async function() {});",
|
||||
"for (var k in this);",
|
||||
"console.log(k, 42 + this);",
|
||||
].join("\n");
|
||||
var result = reduce_test(code, {
|
||||
mangle: false,
|
||||
});
|
||||
if (result.error) throw result.error;
|
||||
assert.strictEqual(result.code, [
|
||||
"// Can't reproduce test failure",
|
||||
"// minify options: {",
|
||||
'// "mangle": false',
|
||||
"// }",
|
||||
].join("\n"));
|
||||
});
|
||||
it("Should reduce object with method syntax without invalid intermediate AST", function() {
|
||||
if (semver.satisfies(process.version, "<4")) return;
|
||||
var code = [
|
||||
"console.log({",
|
||||
" f() {",
|
||||
" return 1 - .8;",
|
||||
" },",
|
||||
"}.f());",
|
||||
].join("\n");
|
||||
var result = reduce_test(code, {
|
||||
compress: {
|
||||
unsafe_math: true,
|
||||
},
|
||||
});
|
||||
if (result.error) throw result.error;
|
||||
assert.deepEqual(result.warnings, []);
|
||||
});
|
||||
});
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user