Compare commits
393 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4a44d95f09 | ||
|
|
36718948be | ||
|
|
21bd4c4a9d | ||
|
|
998c9792da | ||
|
|
ccd77d70db | ||
|
|
d75a946707 | ||
|
|
696a20f10d | ||
|
|
224c91b6c1 | ||
|
|
8065e27a7d | ||
|
|
584e253f33 | ||
|
|
fb5e08e4ec | ||
|
|
e3d328f741 | ||
|
|
8922f08fbf | ||
|
|
15a4074d1a | ||
|
|
c624b43739 | ||
|
|
a8e040b133 | ||
|
|
5e30f3a48b | ||
|
|
46570a4eb6 | ||
|
|
01b84074d7 | ||
|
|
7aba2dc5f2 | ||
|
|
12a6728c4e | ||
|
|
042c228c7b | ||
|
|
e2b00814a8 | ||
|
|
104d385ba9 | ||
|
|
fdbbef2991 | ||
|
|
f8edf05c3c | ||
|
|
a9d0ddea9d | ||
|
|
313e4974a4 | ||
|
|
dd3b81dec6 | ||
|
|
d5afe16bc8 | ||
|
|
212ce4608e | ||
|
|
fbc5ecf75a | ||
|
|
a7d06167a0 | ||
|
|
9686379884 | ||
|
|
82e8ebd77d | ||
|
|
0b50880b4f | ||
|
|
316245ee12 | ||
|
|
63b92ead4e | ||
|
|
a14555a39e | ||
|
|
6d0bb58d68 | ||
|
|
33c163f648 | ||
|
|
b6c72c84d4 | ||
|
|
327e94a759 | ||
|
|
6fb7de7787 | ||
|
|
d338e45033 | ||
|
|
b106cd9476 | ||
|
|
9a91a7a4dc | ||
|
|
fa30960b8b | ||
|
|
8ceb4b0492 | ||
|
|
aad5d6e122 | ||
|
|
77552d9e69 | ||
|
|
93105f1a6d | ||
|
|
d7eb80b050 | ||
|
|
0a5a1f3687 | ||
|
|
e7d6dd2ea2 | ||
|
|
28943bcebb | ||
|
|
18f00457f6 | ||
|
|
e4a91a89e0 | ||
|
|
3693bde2dd | ||
|
|
67438f3ff9 | ||
|
|
371d25944d | ||
|
|
5c863b74d7 | ||
|
|
6de708af37 | ||
|
|
b9b2a4f7f8 | ||
|
|
b46c7944c6 | ||
|
|
866cd4a975 | ||
|
|
e24b255350 | ||
|
|
efed55f42d | ||
|
|
8c2b76eff9 | ||
|
|
b636e97e3b | ||
|
|
35d7f316ef | ||
|
|
43807c26fb | ||
|
|
774feeadb8 | ||
|
|
d96c59f9e6 | ||
|
|
dfd6418878 | ||
|
|
87e8aca245 | ||
|
|
14e1311bdf | ||
|
|
ff3c2ed7a2 | ||
|
|
f8602aca96 | ||
|
|
9a58270b70 | ||
|
|
f639a30bd2 | ||
|
|
082013c20f | ||
|
|
c7d2837184 | ||
|
|
caaa753861 | ||
|
|
4b949f6686 | ||
|
|
e9d9d5a9d2 | ||
|
|
f473b4db38 | ||
|
|
b0df5d7b55 | ||
|
|
be8c75bae1 | ||
|
|
58bea676ac | ||
|
|
9aab1f3661 | ||
|
|
10a1523ee6 | ||
|
|
d46eb69320 | ||
|
|
3a3666a94e | ||
|
|
2f568b9357 | ||
|
|
c94624f36c | ||
|
|
dec359ce58 | ||
|
|
1a054e869e | ||
|
|
7889192cae | ||
|
|
f7841bc8b8 | ||
|
|
aa6eb0d5be | ||
|
|
87a7426598 | ||
|
|
8d0422b6f3 | ||
|
|
e7ce1051fe | ||
|
|
80d5f23fee | ||
|
|
d51caaf358 | ||
|
|
835d130ccf | ||
|
|
e1013bd56d | ||
|
|
13d41778b3 | ||
|
|
bab416465f | ||
|
|
29a1e71705 | ||
|
|
7b2eb4b5ff | ||
|
|
343bf6d7a5 | ||
|
|
ba42cbad3f | ||
|
|
86406e71ec | ||
|
|
9e927ecc9a | ||
|
|
509896a410 | ||
|
|
7fe7c39a01 | ||
|
|
2c5e23506b | ||
|
|
07f35ea2c9 | ||
|
|
57a9519c3d | ||
|
|
9e4c4c995c | ||
|
|
d11c82f8ca | ||
|
|
bc27966a19 | ||
|
|
8f39491e96 | ||
|
|
065c50ebde | ||
|
|
d2e7c4af20 | ||
|
|
033d8d9405 | ||
|
|
b0799105c2 | ||
|
|
860aa9531b | ||
|
|
2547542873 | ||
|
|
3f8f0e246e | ||
|
|
12227ebbb0 | ||
|
|
1b4bd7082b | ||
|
|
0b6c185818 | ||
|
|
bfd0ac7f4b | ||
|
|
1a8f2ecc65 | ||
|
|
dc9e1ff0b1 | ||
|
|
ea10498902 | ||
|
|
69636dad69 | ||
|
|
3ee1b0d00d | ||
|
|
1e3ca4c6f7 | ||
|
|
839f4361f4 | ||
|
|
ae5c3ee8a1 | ||
|
|
77f7ae5ba2 | ||
|
|
2d0f8bcff5 | ||
|
|
f97e107c09 | ||
|
|
e9932e1314 | ||
|
|
eaa84d32df | ||
|
|
6e4aa0326f | ||
|
|
f9a4b36dd1 | ||
|
|
3acb5a329e | ||
|
|
6d94242318 | ||
|
|
bca83cb9df | ||
|
|
a841d45bc3 | ||
|
|
eb93d92357 | ||
|
|
a0250ec923 | ||
|
|
25801627be | ||
|
|
32ae994f88 | ||
|
|
03aec89f60 | ||
|
|
faf0190546 | ||
|
|
c8b0f685ee | ||
|
|
87b99162fb | ||
|
|
940887f20f | ||
|
|
0b2573c3fa | ||
|
|
157521066f | ||
|
|
f766babf5e | ||
|
|
436a29367c | ||
|
|
55418fd460 | ||
|
|
85786889bd | ||
|
|
4b88dfb8d9 | ||
|
|
c3aef23614 | ||
|
|
db94d21980 | ||
|
|
9634a9d1fd | ||
|
|
befb99bd71 | ||
|
|
02eb8baa1c | ||
|
|
c09f63aefb | ||
|
|
fdcc6d3a9c | ||
|
|
4fe2cac35e | ||
|
|
e219a9a78a | ||
|
|
c80eabd61e | ||
|
|
9b82f9be91 | ||
|
|
657d525c80 | ||
|
|
6a3fe9d1df | ||
|
|
ec7fadcb5b | ||
|
|
65adeba55d | ||
|
|
7fac839c62 | ||
|
|
8926a2f327 | ||
|
|
85968dee54 | ||
|
|
a7e7865e6b | ||
|
|
ef5f7fc25e | ||
|
|
902997b73d | ||
|
|
f18804fa06 | ||
|
|
8e2dff632e | ||
|
|
92c3fddd7a | ||
|
|
0d350b78bf | ||
|
|
1ad830facb | ||
|
|
64ebf6efe9 | ||
|
|
08391b8e1c | ||
|
|
d147d5d7f0 | ||
|
|
aae1fcd12d | ||
|
|
f67dd31cbb | ||
|
|
450aabaaa0 | ||
|
|
ea7829daf5 | ||
|
|
6577d641ac | ||
|
|
2340feff87 | ||
|
|
0c48b84540 | ||
|
|
1fefe3f1d1 | ||
|
|
0668fad5e9 | ||
|
|
d0e3f6955d | ||
|
|
6961c57d1e | ||
|
|
f5dbb672b9 | ||
|
|
f4ae267920 | ||
|
|
972b9f0bef | ||
|
|
668f96623c | ||
|
|
1b745494ce | ||
|
|
611abff49f | ||
|
|
4ba8b66c5a | ||
|
|
798121c9f3 | ||
|
|
b23b333d9d | ||
|
|
7621527a5f | ||
|
|
1a064b6e74 | ||
|
|
82772ccb12 | ||
|
|
7cbcd11440 | ||
|
|
980dbde171 | ||
|
|
8b05677c15 | ||
|
|
95090dbf24 | ||
|
|
7c5b6f349e | ||
|
|
e9c902b044 | ||
|
|
111366fca0 | ||
|
|
e368d39715 | ||
|
|
fd8dec61ad | ||
|
|
7880568d15 | ||
|
|
21fc8f4630 | ||
|
|
bf76e35772 | ||
|
|
ac1262dc97 | ||
|
|
498ac83541 | ||
|
|
6fc7a2ab6a | ||
|
|
f8b2215145 | ||
|
|
70ceda5398 | ||
|
|
ce75477670 | ||
|
|
e70b84895c | ||
|
|
8dbf0b042e | ||
|
|
83f7887e5d | ||
|
|
dff7b48921 | ||
|
|
f4f0d2a2dd | ||
|
|
06e3dbc089 | ||
|
|
55a230daa8 | ||
|
|
23b9f36bd8 | ||
|
|
7e88d52fae | ||
|
|
b9d5bba5fb | ||
|
|
8d23496e0f | ||
|
|
260431f4e0 | ||
|
|
7fa1dea9d0 | ||
|
|
d40631fd44 | ||
|
|
d320a6cde2 | ||
|
|
8cd95dd263 | ||
|
|
749a828fc5 | ||
|
|
ab42a90edb | ||
|
|
362abe0ffb | ||
|
|
e3798d9a76 | ||
|
|
c8d10b7cde | ||
|
|
7caab39e26 | ||
|
|
eff45eac0e | ||
|
|
1e787c556b | ||
|
|
df47632ecc | ||
|
|
eb08fed120 | ||
|
|
8b0c836515 | ||
|
|
5d4e6e3bdc | ||
|
|
d2a45ba441 | ||
|
|
de376c3d33 | ||
|
|
4a19575e74 | ||
|
|
e0695ef549 | ||
|
|
d6152e6a76 | ||
|
|
d930c705f6 | ||
|
|
254937754c | ||
|
|
ae4dbcb5b9 | ||
|
|
e13615549e | ||
|
|
a7698f8845 | ||
|
|
bbed9b13b1 | ||
|
|
2cff7c94e8 | ||
|
|
7576048118 | ||
|
|
3c1898fd65 | ||
|
|
e04429350f | ||
|
|
60f3b55156 | ||
|
|
689f8f504d | ||
|
|
ae51f76ba7 | ||
|
|
7eef86ed05 | ||
|
|
b1cfa71131 | ||
|
|
7b8570f16c | ||
|
|
bb225367cb | ||
|
|
bbca9de9cd | ||
|
|
ee9ceb79ca | ||
|
|
ac1f7d689b | ||
|
|
19d232badb | ||
|
|
d464be3f3f | ||
|
|
3094eaaa89 | ||
|
|
ce3c35fa8b | ||
|
|
5d9224deb8 | ||
|
|
45b6d23d36 | ||
|
|
f0de9a8b5d | ||
|
|
203f4b7ad9 | ||
|
|
4114431eec | ||
|
|
fb03561799 | ||
|
|
6ab26eef6c | ||
|
|
53b57ee57e | ||
|
|
16411dcb87 | ||
|
|
8bbfaacdae | ||
|
|
df980db4a8 | ||
|
|
8e4a19ffec | ||
|
|
d833e66d23 | ||
|
|
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 |
39
.github/workflows/build.yml
vendored
39
.github/workflows/build.yml
vendored
@@ -8,11 +8,27 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
options: [ '-mb braces', '-mc', '--toplevel -mc passes=10,pure_getters,unsafe' ]
|
options:
|
||||||
script: [ acorn.sh, buble.sh, butternut.sh, mathjs.sh, rollup-es.sh, rollup-ts.sh, sucrase.sh ]
|
- '-mb braces'
|
||||||
|
- '--ie -c'
|
||||||
|
- '-mc'
|
||||||
|
- '-p acorn --toplevel -mco spidermonkey'
|
||||||
|
- '--toplevel -mc passes=3,pure_getters,unsafe'
|
||||||
|
script:
|
||||||
|
- acorn.sh
|
||||||
|
- bootstrap.sh
|
||||||
|
- buble.sh
|
||||||
|
- butternut.sh
|
||||||
|
- mathjs.sh
|
||||||
|
- rollup-es.sh
|
||||||
|
- rollup-ts.sh
|
||||||
|
- sucrase.sh
|
||||||
|
- web-tooling-benchmark.sh
|
||||||
include:
|
include:
|
||||||
- node: '14'
|
- node: '14'
|
||||||
script: acorn.sh
|
script: acorn.sh
|
||||||
|
- node: '14'
|
||||||
|
script: bootstrap.sh
|
||||||
- node: '14'
|
- node: '14'
|
||||||
script: buble.sh
|
script: buble.sh
|
||||||
- node: '14'
|
- node: '14'
|
||||||
@@ -25,6 +41,8 @@ jobs:
|
|||||||
script: rollup-ts.sh
|
script: rollup-ts.sh
|
||||||
- node: '14'
|
- node: '14'
|
||||||
script: sucrase.sh
|
script: sucrase.sh
|
||||||
|
- node: '14'
|
||||||
|
script: web-tooling-benchmark.sh
|
||||||
name: ${{ matrix.script }} ${{ matrix.options }}
|
name: ${{ matrix.script }} ${{ matrix.options }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
env:
|
env:
|
||||||
@@ -36,20 +54,5 @@ jobs:
|
|||||||
- name: Perform uglify, build & test
|
- name: Perform uglify, build & test
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
git clone --branch v1.6.0 --depth 1 https://github.com/jasongin/nvs.git ~/.nvs
|
. ./test/release/install.sh
|
||||||
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/$SCRIPT $OPTIONS
|
./test/release/$SCRIPT $OPTIONS
|
||||||
|
|||||||
24
.github/workflows/ci.yml
vendored
24
.github/workflows/ci.yml
vendored
@@ -7,14 +7,9 @@ jobs:
|
|||||||
test:
|
test:
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
node: [ '0.8', '0.10', '0.12', '4', '6', '8', '10', '12', '14', latest ]
|
node: [ '0.10', '0.12', '4', '6', '8', '10', '12', '14', '16', latest ]
|
||||||
os: [ ubuntu-latest, windows-latest ]
|
os: [ ubuntu-latest, windows-latest ]
|
||||||
script: [ compress, mocha, release/benchmark, release/jetstream ]
|
script: [ compress, mocha, release/benchmark, release/jetstream ]
|
||||||
exclude:
|
|
||||||
- node: '0.8'
|
|
||||||
script: release/benchmark
|
|
||||||
- node: '0.8'
|
|
||||||
script: release/jetstream
|
|
||||||
name: ${{ matrix.node }} ${{ matrix.os }} ${{ matrix.script }}
|
name: ${{ matrix.node }} ${{ matrix.os }} ${{ matrix.script }}
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
env:
|
env:
|
||||||
@@ -29,20 +24,5 @@ jobs:
|
|||||||
- name: Perform tests
|
- name: Perform tests
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
git clone --branch v1.6.0 --depth 1 https://github.com/jasongin/nvs.git ~/.nvs
|
. ./test/release/install.sh
|
||||||
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
|
|
||||||
node test/$TYPE
|
node test/$TYPE
|
||||||
|
|||||||
40
.github/workflows/ufuzz.yml
vendored
40
.github/workflows/ufuzz.yml
vendored
@@ -2,11 +2,14 @@ name: Fuzzing
|
|||||||
on:
|
on:
|
||||||
pull_request:
|
pull_request:
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '*/5 * * * *'
|
- cron: '*/15 * * * *'
|
||||||
|
workflow_dispatch:
|
||||||
|
workflow_run:
|
||||||
|
branches: [ master ]
|
||||||
|
types: [ completed ]
|
||||||
|
workflows: [ 'Build testing', CI ]
|
||||||
env:
|
env:
|
||||||
BASE_URL: https://api.github.com/repos/${{ github.repository }}
|
BASE_URL: https://api.github.com/repos/${{ github.repository }}
|
||||||
CAUSE: ${{ github.event_name }}
|
|
||||||
RUN_NUM: ${{ github.run_number }}
|
|
||||||
TOKEN: ${{ github.token }}
|
TOKEN: ${{ github.token }}
|
||||||
jobs:
|
jobs:
|
||||||
ufuzz:
|
ufuzz:
|
||||||
@@ -30,35 +33,12 @@ jobs:
|
|||||||
NODE: ${{ matrix.node }}
|
NODE: ${{ matrix.node }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- name: Install GNU Core Utilities
|
|
||||||
if: ${{ startsWith(matrix.os, 'macos') }}
|
|
||||||
env:
|
|
||||||
HOMEBREW_NO_BOTTLE_SOURCE_FALLBACK: 1
|
|
||||||
HOMEBREW_NO_INSTALL_CLEANUP: 1
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
while !(brew install coreutils); do echo "'brew install' failed - retrying..."; done
|
|
||||||
- name: Perform fuzzing
|
- name: Perform fuzzing
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
git clone --branch v1.6.0 --depth 1 https://github.com/jasongin/nvs.git ~/.nvs
|
. ./test/release/install.sh
|
||||||
while ! timeout 60 bash -c '. ~/.nvs/nvs.sh add $NODE && nvs use $NODE'; do
|
if [[ $GITHUB_EVENT_NAME == "pull_request" ]]; then
|
||||||
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
|
|
||||||
if [[ $CAUSE == "schedule" ]]; then
|
|
||||||
node test/ufuzz/job $BASE_URL $TOKEN $RUN_NUM
|
|
||||||
else
|
|
||||||
node test/ufuzz/job 5000
|
node test/ufuzz/job 5000
|
||||||
|
else
|
||||||
|
node test/ufuzz/job $BASE_URL $TOKEN $GITHUB_RUN_NUMBER
|
||||||
fi
|
fi
|
||||||
|
|||||||
330
README.md
330
README.md
@@ -92,6 +92,9 @@ a double dash to prevent input files being used as option arguments:
|
|||||||
-o, --output <file> Output file path (default STDOUT). Specify `ast` or
|
-o, --output <file> Output file path (default STDOUT). Specify `ast` or
|
||||||
`spidermonkey` to write UglifyJS or SpiderMonkey AST
|
`spidermonkey` to write UglifyJS or SpiderMonkey AST
|
||||||
as JSON to STDOUT respectively.
|
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
|
--comments [filter] Preserve copyright comments in the output. By
|
||||||
default this works like Google Closure, keeping
|
default this works like Google Closure, keeping
|
||||||
JSDoc-style comments that contain "@license" or
|
JSDoc-style comments that contain "@license" or
|
||||||
@@ -108,10 +111,11 @@ a double dash to prevent input files being used as option arguments:
|
|||||||
-d, --define <expr>[=value] Global definitions.
|
-d, --define <expr>[=value] Global definitions.
|
||||||
-e, --enclose [arg[:value]] Embed everything in a big function, with configurable
|
-e, --enclose [arg[:value]] Embed everything in a big function, with configurable
|
||||||
argument(s) & value(s).
|
argument(s) & value(s).
|
||||||
--ie8 Support non-standard Internet Explorer 8.
|
--ie Support non-standard Internet Explorer.
|
||||||
Equivalent to setting `ie8: true` in `minify()`
|
Equivalent to setting `ie: true` in `minify()`
|
||||||
for `compress`, `mangle` and `output` options.
|
for `compress`, `mangle` and `output` options.
|
||||||
By default UglifyJS will not try to be IE-proof.
|
By default UglifyJS will not try to be IE-proof.
|
||||||
|
--keep-fargs Do not mangle/drop function arguments.
|
||||||
--keep-fnames Do not mangle/drop function names. Useful for
|
--keep-fnames Do not mangle/drop function names. Useful for
|
||||||
code relying on Function.prototype.name.
|
code relying on Function.prototype.name.
|
||||||
--name-cache <file> File to hold mangled name mappings.
|
--name-cache <file> File to hold mangled name mappings.
|
||||||
@@ -221,10 +225,10 @@ Example:
|
|||||||
To enable the mangler you need to pass `--mangle` (`-m`). The following
|
To enable the mangler you need to pass `--mangle` (`-m`). The following
|
||||||
(comma-separated) options are supported:
|
(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.
|
`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
|
prevent certain names from being mangled, you can declare those names with
|
||||||
`--mangle reserved` — pass a comma-separated list of names. For example:
|
`--mangle reserved` — pass a comma-separated list of names. For example:
|
||||||
|
|
||||||
@@ -491,46 +495,54 @@ if (result.error) throw result.error;
|
|||||||
|
|
||||||
## Minify options
|
## 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).
|
Pass an object to specify custom [compress options](#compress-options).
|
||||||
|
|
||||||
- `ie8` (default `false`) -- set to `true` to support IE8.
|
- `ie` (default: `false`) — enable workarounds for Internet Explorer bugs.
|
||||||
|
|
||||||
- `keep_fnames` (default: `false`) -- pass `true` to prevent discarding or mangling
|
- `keep_fargs` (default: `false`) — pass `true` to prevent discarding or mangling
|
||||||
|
of function arguments.
|
||||||
|
|
||||||
|
- `keep_fnames` (default: `false`) — pass `true` to prevent discarding or mangling
|
||||||
of function names. Useful for code relying on `Function.prototype.name`.
|
of function names. Useful for code relying on `Function.prototype.name`.
|
||||||
|
|
||||||
- `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).
|
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).
|
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
|
used `nameCache` object if you wish to cache mangled variable and
|
||||||
property names across multiple invocations of `minify()`. Note: this is
|
property names across multiple invocations of `minify()`. Note: this is
|
||||||
a read/write property. `minify()` will read the name cache state of this
|
a read/write property. `minify()` will read the name cache state of this
|
||||||
object and update it during minification so that it may be
|
object and update it during minification so that it may be
|
||||||
reused or externally persisted by the user.
|
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
|
additional [output options](#output-options). The defaults are optimized
|
||||||
for best compression.
|
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).
|
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).
|
[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.
|
variable and function name mangling and to drop unused variables and functions.
|
||||||
|
|
||||||
- `v8` (default `false`) -- enable workarounds for Chrome & Node.js bugs.
|
- `v8` (default: `false`) — enable workarounds for Chrome & Node.js bugs.
|
||||||
|
|
||||||
- `warnings` (default `false`) — pass `true` to return compressor warnings
|
- `warnings` (default: `false`) — pass `true` to return compressor warnings
|
||||||
in `result.warnings`. Use the value `"verbose"` for more detailed 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`.
|
PhantomJS users should set this option to `true`.
|
||||||
|
|
||||||
## Minify options structure
|
## Minify options structure
|
||||||
@@ -558,7 +570,6 @@ if (result.error) throw result.error;
|
|||||||
},
|
},
|
||||||
nameCache: null, // or specify a name cache object
|
nameCache: null, // or specify a name cache object
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
ie8: false,
|
|
||||||
warnings: false,
|
warnings: false,
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -615,116 +626,122 @@ to be `false` and all symbol names will be omitted.
|
|||||||
|
|
||||||
## Parse options
|
## 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
|
## 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.
|
parameter name whenever possible.
|
||||||
|
|
||||||
- `arrows` (default: `true`) -- apply optimizations to arrow functions
|
- `arrows` (default: `true`) — apply optimizations to arrow functions
|
||||||
|
|
||||||
- `assignments` (default: `true`) -- apply optimizations to assignment expressions
|
- `assignments` (default: `true`) — apply optimizations to assignment expressions
|
||||||
|
|
||||||
- `awaits` (default: `true`) -- apply optimizations to `await` expressions
|
- `awaits` (default: `true`) — apply optimizations to `await` expressions
|
||||||
|
|
||||||
- `booleans` (default: `true`) -- various optimizations for boolean context,
|
- `booleans` (default: `true`) — various optimizations for boolean context,
|
||||||
for example `!!a ? b : c → a ? b : c`
|
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.
|
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.
|
e.g. `!(a <= b) → a > b`, attempts to negate binary nodes, e.g.
|
||||||
`a = !b && !c && !d && !e → a=!(b||c||d||e)` etc.
|
`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
|
expressions
|
||||||
|
|
||||||
- `dead_code` (default: `true`) -- remove unreachable code
|
- `dead_code` (default: `true`) — remove unreachable code
|
||||||
|
|
||||||
- `default_values` (default: `true`) -- drop overshadowed default values
|
- `default_values` (default: `true`) — drop overshadowed default values
|
||||||
|
|
||||||
- `directives` (default: `true`) -- remove redundant or non-standard directives
|
- `directives` (default: `true`) — remove redundant or non-standard directives
|
||||||
|
|
||||||
- `drop_console` (default: `false`) -- Pass `true` to discard calls to
|
- `drop_console` (default: `false`) — Pass `true` to discard calls to
|
||||||
`console.*` functions. If you wish to drop a specific function call
|
`console.*` functions. If you wish to drop a specific function call
|
||||||
such as `console.info` and/or retain side effects from function arguments
|
such as `console.info` and/or retain side effects from function arguments
|
||||||
after dropping the function call then use `pure_funcs` instead.
|
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
|
representation. Pass `"eager"` to always replace function calls whenever
|
||||||
possible, or a positive integer to specify an upper bound for each individual
|
possible, or a positive integer to specify an upper bound for each individual
|
||||||
evaluation in number of characters.
|
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.
|
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.
|
whenever possible.
|
||||||
|
|
||||||
- `global_defs` (default: `{}`) -- see [conditional compilation](#conditional-compilation)
|
- `global_defs` (default: `{}`) — see [conditional compilation](#conditional-compilation)
|
||||||
|
|
||||||
- `hoist_exports` (default: `true`) -- hoist `export` statements to facilitate
|
- `hoist_exports` (default: `true`) — hoist `export` statements to facilitate
|
||||||
various `compress` and `mangle` optimizations.
|
various `compress` and `mangle` optimizations.
|
||||||
|
|
||||||
- `hoist_funs` (default: `false`) -- hoist function declarations
|
- `hoist_funs` (default: `false`) — hoist function declarations
|
||||||
|
|
||||||
- `hoist_props` (default: `true`) -- hoist properties from constant object and
|
- `hoist_props` (default: `true`) — hoist properties from constant object and
|
||||||
array literals into regular variables subject to a set of constraints. For example:
|
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`
|
`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
|
works best with `toplevel` and `mangle` enabled, alongside with `compress` option
|
||||||
`passes` set to `2` or higher.
|
`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)
|
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
|
||||||
|
|
||||||
- `imports` (default: `true`) -- drop unreferenced import symbols when used with `unused`
|
- `imports` (default: `true`) — drop unreferenced import symbols when used with `unused`
|
||||||
|
|
||||||
- `inline` (default: `true`) -- inline calls to function with simple/`return` statement:
|
- `inline` (default: `true`) — inline calls to function with simple/`return` statement:
|
||||||
- `false` -- same as `0`
|
- `false` — same as `0`
|
||||||
- `0` -- disabled inlining
|
- `0` — disabled inlining
|
||||||
- `1` -- inline simple functions
|
- `1` — inline simple functions
|
||||||
- `2` -- inline functions with arguments
|
- `2` — inline functions with arguments
|
||||||
- `3` -- inline functions with arguments and variables
|
- `3` — inline functions with arguments and variables
|
||||||
- `true` -- same as `3`
|
- `4` — inline functions with arguments, variables and statements
|
||||||
|
- `true` — same as `4`
|
||||||
|
|
||||||
- `join_vars` (default: `true`) -- join consecutive `var` statements
|
- `join_vars` (default: `true`) — join consecutive `var` statements
|
||||||
|
|
||||||
- `keep_fargs` (default: `false`) -- discard unused function arguments except
|
- `keep_fargs` (default: `false`) — discard unused function arguments except
|
||||||
when unsafe to do so, e.g. code which relies on `Function.prototype.length`.
|
when unsafe to do so, e.g. code which relies on `Function.prototype.length`.
|
||||||
Pass `true` to always retain function arguments.
|
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.
|
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.
|
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
|
where the return value is discarded, to avoid the parens that the
|
||||||
code generator would insert.
|
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
|
In some cases more than one pass leads to further compressed code. Keep in
|
||||||
mind more passes will take more time.
|
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`
|
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
|
UglifyJS will assume that those functions do not produce side
|
||||||
effects. DANGER: will not check if the name is redefined in scope.
|
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
|
An example case here, for instance `var q = Math.floor(a/b)`. If
|
||||||
@@ -736,24 +753,24 @@ to be `false` and all symbol names will be omitted.
|
|||||||
overhead (compression will be slower). Make sure symbols under `pure_funcs`
|
overhead (compression will be slower). Make sure symbols under `pure_funcs`
|
||||||
are also under `mangle.reserved` to avoid mangling.
|
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
|
this, UglifyJS will assume that object property access
|
||||||
(e.g. `foo.bar` or `foo["bar"]`) doesn't have any side effects.
|
(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
|
Specify `"strict"` to treat `foo.bar` as side-effect-free only when
|
||||||
`foo` is certain to not throw, i.e. not `null` or `undefined`.
|
`foo` is certain to not throw, i.e. not `null` or `undefined`.
|
||||||
|
|
||||||
- `reduce_funcs` (default: `true`) -- Allows single-use functions to be
|
- `reduce_funcs` (default: `true`) — Allows single-use functions to be
|
||||||
inlined as function expressions when permissible allowing further
|
inlined as function expressions when permissible allowing further
|
||||||
optimization. Enabled by default. Option depends on `reduce_vars`
|
optimization. Enabled by default. Option depends on `reduce_vars`
|
||||||
being enabled. Some code runs faster in the Chrome V8 engine if this
|
being enabled. Some code runs faster in the Chrome V8 engine if this
|
||||||
option is disabled. Does not negatively impact other major browsers.
|
option is disabled. Does not negatively impact other major browsers.
|
||||||
|
|
||||||
- `reduce_vars` (default: `true`) -- Improve optimization on variables assigned with and
|
- `reduce_vars` (default: `true`) — Improve optimization on variables assigned with and
|
||||||
used as constant values.
|
used as constant values.
|
||||||
|
|
||||||
- `rests` (default: `true`) -- apply optimizations to rest parameters
|
- `rests` (default: `true`) — apply optimizations to rest parameters
|
||||||
|
|
||||||
- `sequences` (default: `true`) -- join consecutive simple statements using the
|
- `sequences` (default: `true`) — join consecutive simple statements using the
|
||||||
comma operator. May be set to a positive integer to specify the maximum number
|
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
|
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`
|
`true` then the default `sequences` limit is `200`. Set option to `false` or `0`
|
||||||
@@ -762,70 +779,67 @@ to be `false` and all symbol names will be omitted.
|
|||||||
occasions the default sequences limit leads to very slow compress times in which
|
occasions the default sequences limit leads to very slow compress times in which
|
||||||
case a value of `20` or less is recommended.
|
case a value of `20` or less is recommended.
|
||||||
|
|
||||||
- `side_effects` (default: `true`) -- Pass `false` to disable potentially dropping
|
- `side_effects` (default: `true`) — drop extraneous code which does not affect
|
||||||
functions marked as "pure". A function call is marked as "pure" if a comment
|
outcome of runtime execution.
|
||||||
annotation `/*@__PURE__*/` or `/*#__PURE__*/` immediately precedes the call. For
|
|
||||||
example: `/*@__PURE__*/foo();`
|
|
||||||
|
|
||||||
- `spreads` (default: `true`) -- flatten spread expressions.
|
- `spreads` (default: `true`) — flatten spread expressions.
|
||||||
|
|
||||||
- `strings` (default: `true`) -- compact string concatenations.
|
- `strings` (default: `true`) — compact string concatenations.
|
||||||
|
|
||||||
- `switches` (default: `true`) -- de-duplicate and remove unreachable `switch` branches
|
- `switches` (default: `true`) — de-duplicate and remove unreachable `switch` branches
|
||||||
|
|
||||||
- `templates` (default: `true`) -- compact template literals by embedding expressions
|
- `templates` (default: `true`) — compact template literals by embedding expressions
|
||||||
and/or converting to string literals, e.g. `` `foo ${42}` → "foo 42"``
|
and/or converting to string literals, e.g. `` `foo ${42}` → "foo 42"``
|
||||||
|
|
||||||
- `top_retain` (default: `null`) -- prevent specific toplevel functions and
|
- `top_retain` (default: `null`) — prevent specific toplevel functions and
|
||||||
variables from `unused` removal (can be array, comma-separated, RegExp or
|
variables from `unused` removal (can be array, comma-separated, RegExp or
|
||||||
function. Implies `toplevel`)
|
function. Implies `toplevel`)
|
||||||
|
|
||||||
- `toplevel` (default: `false`) -- drop unreferenced functions (`"funcs"`) and/or
|
- `toplevel` (default: `false`) — drop unreferenced functions (`"funcs"`) and/or
|
||||||
variables (`"vars"`) in the top level scope (`false` by default, `true` to drop
|
variables (`"vars"`) in the top level scope (`false` by default, `true` to drop
|
||||||
both unreferenced functions and variables)
|
both unreferenced functions and variables)
|
||||||
|
|
||||||
- `typeofs` (default: `true`) -- Transforms `typeof foo == "undefined"` into
|
- `typeofs` (default: `true`) — compress `typeof` expressions, e.g.
|
||||||
`foo === void 0`. Note: recommend to set this value to `false` for IE10 and
|
`typeof foo == "undefined" → void 0 === foo`
|
||||||
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`.
|
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.
|
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.
|
`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)`
|
`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.
|
`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
|
variable named `undefined` in scope (variable name will be mangled, typically
|
||||||
reduced to a single character)
|
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"`)
|
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
|
whenever safe to do so
|
||||||
|
|
||||||
- `yields` (default: `true`) -- apply optimizations to `yield` expressions
|
- `yields` (default: `true`) — apply optimizations to `yield` expressions
|
||||||
|
|
||||||
## Mangle options
|
## Mangle options
|
||||||
|
|
||||||
- `eval` (default `false`) -- Pass `true` to mangle names visible in scopes
|
- `eval` (default: `false`) — Pass `true` to mangle names visible in scopes
|
||||||
where `eval` or `with` are used.
|
where `eval` or `with` are used.
|
||||||
|
|
||||||
- `reserved` (default `[]`) -- Pass an array of identifiers that should be
|
- `reserved` (default: `[]`) — Pass an array of identifiers that should be
|
||||||
excluded from mangling. Example: `["foo", "bar"]`.
|
excluded from mangling. Example: `["foo", "bar"]`.
|
||||||
|
|
||||||
- `toplevel` (default `false`) -- Pass `true` to mangle names declared in the
|
- `toplevel` (default: `false`) — Pass `true` to mangle names declared in the
|
||||||
top level scope.
|
top level scope.
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
@@ -852,18 +866,21 @@ UglifyJS.minify(code, { mangle: { toplevel: true } }).code;
|
|||||||
|
|
||||||
### Mangle properties options
|
### 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.
|
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.
|
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_fargs` (default: `false`) — Use `true` to prevent mangling of function
|
||||||
|
arguments.
|
||||||
|
|
||||||
- `regex` (default: `null`) -— Pass a RegExp literal to only mangle property
|
- `keep_quoted` (default: `false`) — Only mangle unquoted property names.
|
||||||
|
|
||||||
|
- `regex` (default: `null`) — Pass a RegExp literal to only mangle property
|
||||||
names matching the regular expression.
|
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.
|
`reserved` array.
|
||||||
|
|
||||||
## Output options
|
## Output options
|
||||||
@@ -872,19 +889,23 @@ The code generator tries to output shortest code possible by default. In
|
|||||||
case you want beautified output, pass `--beautify` (`-b`). Optionally you
|
case you want beautified output, pass `--beautify` (`-b`). Optionally you
|
||||||
can pass additional arguments that control the code output:
|
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)
|
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
|
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
|
when you want to generate minified code, in order to specify additional
|
||||||
arguments, so you can use `-b beautify=false` to override it.
|
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
|
`do`, `while` or `with` statements, even if their body is a single
|
||||||
statement.
|
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`,
|
comments, `"some"` to preserve multi-line comments that contain `@cc_on`,
|
||||||
`@license`, or `@preserve` (case-insensitive), a regular expression string
|
`@license`, or `@preserve` (case-insensitive), a regular expression string
|
||||||
(e.g. `/^!/`), or a function which returns `boolean`, e.g.
|
(e.g. `/^!/`), or a function which returns `boolean`, e.g.
|
||||||
@@ -894,53 +915,55 @@ can pass additional arguments that control the code output:
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
- `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 by specified number of spaces or the
|
||||||
|
exact whitespace sequence supplied, e.g. `"\t"`.
|
||||||
|
|
||||||
- `indent_start` (default `0`) -- prefix all lines by that many spaces
|
- `indent_start` (default: `0`) — prefix all lines by whitespace sequence
|
||||||
|
specified in the same format as `indent_level`.
|
||||||
|
|
||||||
- `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
|
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.
|
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
|
it will be prepended to the output literally. The source map will
|
||||||
adjust for this text. Can be used to insert a comment containing
|
adjust for this text. Can be used to insert a comment containing
|
||||||
licensing information, for example.
|
licensing information, for example.
|
||||||
|
|
||||||
- `preserve_line` (default `false`) -- pass `true` to retain line numbering on
|
- `preserve_line` (default: `false`) — pass `true` to retain line numbering on
|
||||||
a best effort basis.
|
a best effort basis.
|
||||||
|
|
||||||
- `quote_keys` (default `false`) -- pass `true` to quote all keys in literal
|
- `quote_keys` (default: `false`) — pass `true` to quote all keys in literal
|
||||||
objects
|
objects
|
||||||
|
|
||||||
- `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):
|
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.
|
more double quotes in the string itself. `0` is best for gzip size.
|
||||||
- `1` -- always use single quotes
|
- `1` — always use single quotes
|
||||||
- `2` -- always use double quotes
|
- `2` — always use double quotes
|
||||||
- `3` -- always use the original 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
|
you pass `false` then whenever possible we will use a newline instead of a
|
||||||
semicolon, leading to more readable output of uglified code (size before
|
semicolon, leading to more readable output of uglified code (size before
|
||||||
gzip could be smaller; size after gzip insignificantly larger).
|
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)
|
||||||
|
|
||||||
- `width` (default `80`) -- only takes effect when beautification is on, this
|
- `width` (default: `80`) — only takes effect when beautification is on, this
|
||||||
specifies an (orientative) line width that the beautifier will try to
|
specifies an (orientative) line width that the beautifier will try to
|
||||||
obey. It refers to the width of the line text (excluding indentation).
|
obey. It refers to the width of the line text (excluding indentation).
|
||||||
It doesn't work very well currently, but it does make the code generated
|
It doesn't work very well currently, but it does make the code generated
|
||||||
by UglifyJS more readable.
|
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
|
function expressions. See
|
||||||
[#640](https://github.com/mishoo/UglifyJS/issues/640) for more details.
|
[#640](https://github.com/mishoo/UglifyJS/issues/640) for more details.
|
||||||
|
|
||||||
@@ -1186,6 +1209,17 @@ To allow for better optimizations, the compiler makes various assumptions:
|
|||||||
- Object properties can be added, removed and modified (not prevented with
|
- Object properties can be added, removed and modified (not prevented with
|
||||||
`Object.defineProperty()`, `Object.defineProperties()`, `Object.freeze()`,
|
`Object.defineProperty()`, `Object.defineProperties()`, `Object.freeze()`,
|
||||||
`Object.preventExtensions()` or `Object.seal()`).
|
`Object.preventExtensions()` or `Object.seal()`).
|
||||||
|
- If array destructuring is present, index-like properties in `Array.prototype`
|
||||||
|
have not been overridden:
|
||||||
|
```javascript
|
||||||
|
Object.prototype[0] = 42;
|
||||||
|
var [ a ] = [];
|
||||||
|
var { 0: b } = {};
|
||||||
|
// 42 undefined
|
||||||
|
console.log([][0], a);
|
||||||
|
// 42 42
|
||||||
|
console.log({}[0], b);
|
||||||
|
```
|
||||||
- Earlier versions of JavaScript will throw `SyntaxError` with the following:
|
- Earlier versions of JavaScript will throw `SyntaxError` with the following:
|
||||||
```javascript
|
```javascript
|
||||||
({
|
({
|
||||||
@@ -1281,3 +1315,61 @@ To allow for better optimizations, the compiler makes various assumptions:
|
|||||||
// SyntaxError: Identifier 'e' has already been declared
|
// SyntaxError: Identifier 'e' has already been declared
|
||||||
```
|
```
|
||||||
UglifyJS may modify the input which in turn may suppress those errors.
|
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.
|
||||||
|
- Later versions of Chrome and Node.js will give incorrect results with the
|
||||||
|
following:
|
||||||
|
```javascript
|
||||||
|
console.log({
|
||||||
|
...console,
|
||||||
|
get 42() {
|
||||||
|
return "FAIL";
|
||||||
|
},
|
||||||
|
[42]: "PASS",
|
||||||
|
}[42]);
|
||||||
|
// Expected: "PASS"
|
||||||
|
// Actual: "FAIL"
|
||||||
|
```
|
||||||
|
UglifyJS may modify the input which in turn may suppress those errors.
|
||||||
|
- Earlier versions of JavaScript will throw `TypeError` with the following:
|
||||||
|
```javascript
|
||||||
|
(function() {
|
||||||
|
{
|
||||||
|
const a = "foo";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
const a = "bar";
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
// TypeError: const 'a' has already been declared
|
||||||
|
```
|
||||||
|
UglifyJS may modify the input which in turn may suppress those errors.
|
||||||
|
|||||||
98
bin/uglifyjs
98
bin/uglifyjs
@@ -10,7 +10,9 @@ var info = require("../package.json");
|
|||||||
var path = require("path");
|
var path = require("path");
|
||||||
var UglifyJS = require("../tools/node");
|
var UglifyJS = require("../tools/node");
|
||||||
|
|
||||||
var skip_keys = [ "cname", "fixed", "inlined", "parent_scope", "scope", "uses_eval", "uses_with" ];
|
var skip_keys = [ "cname", "fixed", "in_arg", "inlined", "length_read", "parent_scope", "redef", "scope", "unused" ];
|
||||||
|
var truthy_keys = [ "optional", "pure", "terminal", "uses_arguments", "uses_eval", "uses_with" ];
|
||||||
|
|
||||||
var files = {};
|
var files = {};
|
||||||
var options = {};
|
var options = {};
|
||||||
var short_forms = {
|
var short_forms = {
|
||||||
@@ -70,6 +72,7 @@ function process_option(name, no_value) {
|
|||||||
} else {
|
} else {
|
||||||
if (padding.length < name.length) padding = Array(name.length + 1).join(" ");
|
if (padding.length < name.length) padding = Array(name.length + 1).join(" ");
|
||||||
toplevels.push([ {
|
toplevels.push([ {
|
||||||
|
keep_fargs: "keep-fargs",
|
||||||
keep_fnames: "keep-fnames",
|
keep_fnames: "keep-fnames",
|
||||||
nameCache: "name-cache",
|
nameCache: "name-cache",
|
||||||
}[name] || name, option ]);
|
}[name] || name, option ]);
|
||||||
@@ -95,11 +98,14 @@ function process_option(name, no_value) {
|
|||||||
" -b, --beautify [options] Beautify output/specify output options.",
|
" -b, --beautify [options] Beautify output/specify output options.",
|
||||||
" -O, --output-opts <options> Output options (beautify disabled).",
|
" -O, --output-opts <options> Output options (beautify disabled).",
|
||||||
" -o, --output <file> Output file (default STDOUT).",
|
" -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.",
|
" --comments [filter] Preserve copyright comments in the output.",
|
||||||
" --config-file <file> Read minify() options from JSON file.",
|
" --config-file <file> Read minify() options from JSON file.",
|
||||||
" -d, --define <expr>[=value] Global definitions.",
|
" -d, --define <expr>[=value] Global definitions.",
|
||||||
" -e, --enclose [arg[,...][:value[,...]]] Embed everything in a big function, with configurable argument(s) & value(s).",
|
" -e, --enclose [arg[,...][:value[,...]]] Embed everything in a big function, with configurable argument(s) & value(s).",
|
||||||
" --ie8 Support non-standard Internet Explorer 8.",
|
" --ie Support non-standard Internet Explorer.",
|
||||||
|
" --keep-fargs Do not mangle/drop function arguments.",
|
||||||
" --keep-fnames Do not mangle/drop function names. Useful for code relying on Function.prototype.name.",
|
" --keep-fnames Do not mangle/drop function names. Useful for code relying on Function.prototype.name.",
|
||||||
" --name-cache <file> File to hold mangled name mappings.",
|
" --name-cache <file> File to hold mangled name mappings.",
|
||||||
" --rename Force symbol expansion.",
|
" --rename Force symbol expansion.",
|
||||||
@@ -108,6 +114,7 @@ function process_option(name, no_value) {
|
|||||||
" --source-map [options] Enable source map/specify source map options.",
|
" --source-map [options] Enable source map/specify source map options.",
|
||||||
" --timings Display operations run time on STDERR.",
|
" --timings Display operations run time on STDERR.",
|
||||||
" --toplevel Compress and/or mangle variables in toplevel scope.",
|
" --toplevel Compress and/or mangle variables in toplevel scope.",
|
||||||
|
" --v8 Support non-standard Chrome & Node.js.",
|
||||||
" --validate Perform validation during AST manipulations.",
|
" --validate Perform validation during AST manipulations.",
|
||||||
" --verbose Print diagnostic messages.",
|
" --verbose Print diagnostic messages.",
|
||||||
" --warn Print warning messages.",
|
" --warn Print warning messages.",
|
||||||
@@ -142,13 +149,22 @@ function process_option(name, no_value) {
|
|||||||
case "enclose":
|
case "enclose":
|
||||||
options[name] = read_value();
|
options[name] = read_value();
|
||||||
break;
|
break;
|
||||||
|
case "annotations":
|
||||||
|
case "ie":
|
||||||
case "ie8":
|
case "ie8":
|
||||||
case "timings":
|
case "timings":
|
||||||
case "toplevel":
|
case "toplevel":
|
||||||
|
case "v8":
|
||||||
case "validate":
|
case "validate":
|
||||||
case "webkit":
|
case "webkit":
|
||||||
options[name] = true;
|
options[name] = true;
|
||||||
break;
|
break;
|
||||||
|
case "no-annotations":
|
||||||
|
options.annotations = false;
|
||||||
|
break;
|
||||||
|
case "keep-fargs":
|
||||||
|
options.keep_fargs = true;
|
||||||
|
break;
|
||||||
case "keep-fnames":
|
case "keep-fnames":
|
||||||
options.keep_fnames = true;
|
options.keep_fnames = true;
|
||||||
break;
|
break;
|
||||||
@@ -229,10 +245,11 @@ if (options.mangle && options.mangle.properties) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (output == "ast") options.output = {
|
if (/^ast|spidermonkey$/.test(output)) {
|
||||||
ast: true,
|
if (typeof options.output != "object") options.output = {};
|
||||||
code: false,
|
options.output.ast = true;
|
||||||
};
|
options.output.code = false;
|
||||||
|
}
|
||||||
if (options.parse && (options.parse.acorn || options.parse.spidermonkey)
|
if (options.parse && (options.parse.acorn || options.parse.spidermonkey)
|
||||||
&& options.sourceMap && options.sourceMap.content == "inline") {
|
&& options.sourceMap && options.sourceMap.content == "inline") {
|
||||||
fatal("inline source map only works with built-in parser");
|
fatal("inline source map only works with built-in parser");
|
||||||
@@ -259,7 +276,9 @@ if (specified["self"]) {
|
|||||||
paths = UglifyJS.FILES;
|
paths = UglifyJS.FILES;
|
||||||
}
|
}
|
||||||
if (specified["in-situ"]) {
|
if (specified["in-situ"]) {
|
||||||
if (output || specified["reduce-test"] || specified["self"]) fatal("incompatible options specified");
|
if (output && output != "spidermonkey" || specified["reduce-test"] || specified["self"]) {
|
||||||
|
fatal("incompatible options specified");
|
||||||
|
}
|
||||||
paths.forEach(function(name) {
|
paths.forEach(function(name) {
|
||||||
print(name);
|
print(name);
|
||||||
if (/^ast|spidermonkey$/.test(name)) fatal("invalid file name specified");
|
if (/^ast|spidermonkey$/.test(name)) fatal("invalid file name specified");
|
||||||
@@ -305,13 +324,43 @@ function run() {
|
|||||||
try {
|
try {
|
||||||
if (options.parse) {
|
if (options.parse) {
|
||||||
if (options.parse.acorn) {
|
if (options.parse.acorn) {
|
||||||
|
var annotations = Object.create(null);
|
||||||
files = convert_ast(function(toplevel, name) {
|
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,
|
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,
|
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 tokens = node.start.parens;
|
||||||
|
if (tokens) for (var i = 0; !pure && i < tokens.length; i++) {
|
||||||
|
pure = list[tokens[i].pos];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (pure) node.pure = pure;
|
||||||
|
}));
|
||||||
} else if (options.parse.spidermonkey) {
|
} else if (options.parse.spidermonkey) {
|
||||||
files = convert_ast(function(toplevel, name) {
|
files = convert_ast(function(toplevel, name) {
|
||||||
var obj = JSON.parse(files[name]);
|
var obj = JSON.parse(files[name]);
|
||||||
@@ -388,7 +437,7 @@ function run() {
|
|||||||
case "thedef":
|
case "thedef":
|
||||||
return symdef(value);
|
return symdef(value);
|
||||||
}
|
}
|
||||||
if (skip_key(key)) return;
|
if (skip_property(key, value)) return;
|
||||||
if (value instanceof UglifyJS.AST_Token) return;
|
if (value instanceof UglifyJS.AST_Token) return;
|
||||||
if (value instanceof UglifyJS.Dictionary) return;
|
if (value instanceof UglifyJS.Dictionary) return;
|
||||||
if (value instanceof UglifyJS.AST_Node) {
|
if (value instanceof UglifyJS.AST_Node) {
|
||||||
@@ -403,16 +452,19 @@ function run() {
|
|||||||
return value;
|
return value;
|
||||||
}, 2));
|
}, 2));
|
||||||
} else if (output == "spidermonkey") {
|
} else if (output == "spidermonkey") {
|
||||||
print(JSON.stringify(UglifyJS.minify(result.code, {
|
print(JSON.stringify(result.ast.to_mozilla_ast(), null, 2));
|
||||||
compress: false,
|
|
||||||
mangle: false,
|
|
||||||
output: {
|
|
||||||
ast: true,
|
|
||||||
code: false
|
|
||||||
},
|
|
||||||
}).ast.to_mozilla_ast(), null, 2));
|
|
||||||
} else if (output) {
|
} 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);
|
if (result.map) fs.writeFileSync(output + ".map", result.map);
|
||||||
} else {
|
} else {
|
||||||
print(result.code);
|
print(result.code);
|
||||||
@@ -474,7 +526,7 @@ function read_file(path, default_value) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function parse_js(value, options, flag) {
|
function parse_js(value, options, flag) {
|
||||||
if (!options || typeof options != "object") options = {};
|
if (!options || typeof options != "object") options = Object.create(null);
|
||||||
if (typeof value == "string") try {
|
if (typeof value == "string") try {
|
||||||
UglifyJS.parse(value, {
|
UglifyJS.parse(value, {
|
||||||
expression: true
|
expression: true
|
||||||
@@ -514,8 +566,10 @@ function parse_js(value, options, flag) {
|
|||||||
return options;
|
return options;
|
||||||
}
|
}
|
||||||
|
|
||||||
function skip_key(key) {
|
function skip_property(key, value) {
|
||||||
return skip_keys.indexOf(key) >= 0;
|
return skip_keys.indexOf(key) >= 0
|
||||||
|
// only skip truthy_keys if their value is falsy
|
||||||
|
|| truthy_keys.indexOf(key) >= 0 && !value;
|
||||||
}
|
}
|
||||||
|
|
||||||
function symdef(def) {
|
function symdef(def) {
|
||||||
|
|||||||
233
lib/ast.js
233
lib/ast.js
@@ -50,40 +50,39 @@ function DEFNODE(type, props, methods, base) {
|
|||||||
if (base && base.PROPS) props = props.concat(base.PROPS);
|
if (base && base.PROPS) props = props.concat(base.PROPS);
|
||||||
var code = [
|
var code = [
|
||||||
"return function AST_", type, "(props){",
|
"return function AST_", type, "(props){",
|
||||||
|
// not essential, but speeds up compress by a few percent
|
||||||
|
"this._bits=0;",
|
||||||
"if(props){",
|
"if(props){",
|
||||||
];
|
];
|
||||||
props.forEach(function(prop) {
|
props.forEach(function(prop) {
|
||||||
code.push("this.", prop, "=props.", prop, ";");
|
code.push("this.", prop, "=props.", prop, ";");
|
||||||
});
|
});
|
||||||
var proto = base && new base;
|
code.push("}");
|
||||||
if (proto && proto.initialize || methods && methods.initialize) code.push("this.initialize();");
|
var proto = Object.create(base && base.prototype);
|
||||||
code.push("}}");
|
if (methods.initialize || proto.initialize) code.push("this.initialize();");
|
||||||
|
code.push("};");
|
||||||
var ctor = new Function(code.join(""))();
|
var ctor = new Function(code.join(""))();
|
||||||
if (proto) {
|
ctor.prototype = proto;
|
||||||
ctor.prototype = proto;
|
|
||||||
ctor.BASE = base;
|
|
||||||
}
|
|
||||||
if (base) base.SUBCLASSES.push(ctor);
|
|
||||||
ctor.prototype.CTOR = ctor;
|
ctor.prototype.CTOR = ctor;
|
||||||
ctor.PROPS = props || null;
|
ctor.prototype.TYPE = ctor.TYPE = type;
|
||||||
ctor.SELF_PROPS = self_props;
|
if (base) {
|
||||||
ctor.SUBCLASSES = [];
|
ctor.BASE = base;
|
||||||
if (type) {
|
base.SUBCLASSES.push(ctor);
|
||||||
ctor.prototype.TYPE = ctor.TYPE = type;
|
|
||||||
}
|
|
||||||
if (methods) for (var name in methods) if (HOP(methods, name)) {
|
|
||||||
if (/^\$/.test(name)) {
|
|
||||||
ctor[name.substr(1)] = methods[name];
|
|
||||||
} else {
|
|
||||||
ctor.prototype[name] = methods[name];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
ctor.DEFMETHOD = function(name, method) {
|
ctor.DEFMETHOD = function(name, method) {
|
||||||
this.prototype[name] = method;
|
this.prototype[name] = method;
|
||||||
};
|
};
|
||||||
if (typeof exports !== "undefined") {
|
ctor.PROPS = props;
|
||||||
exports["AST_" + type] = ctor;
|
ctor.SELF_PROPS = self_props;
|
||||||
|
ctor.SUBCLASSES = [];
|
||||||
|
for (var name in methods) if (HOP(methods, name)) {
|
||||||
|
if (/^\$/.test(name)) {
|
||||||
|
ctor[name.substr(1)] = methods[name];
|
||||||
|
} else {
|
||||||
|
ctor.DEFMETHOD(name, methods[name]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
if (typeof exports !== "undefined") exports["AST_" + type] = ctor;
|
||||||
return ctor;
|
return ctor;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -138,6 +137,53 @@ var AST_Node = DEFNODE("Node", "start end", {
|
|||||||
},
|
},
|
||||||
}, null);
|
}, null);
|
||||||
|
|
||||||
|
DEF_BITPROPS(AST_Node, [
|
||||||
|
"_optimized",
|
||||||
|
"_squeezed",
|
||||||
|
// AST_Call
|
||||||
|
"call_only",
|
||||||
|
// AST_Lambda
|
||||||
|
"collapse_scanning",
|
||||||
|
// AST_SymbolRef
|
||||||
|
"defined",
|
||||||
|
"evaluating",
|
||||||
|
"falsy",
|
||||||
|
// AST_SymbolRef
|
||||||
|
"in_arg",
|
||||||
|
// AST_Return
|
||||||
|
"in_bool",
|
||||||
|
// AST_SymbolRef
|
||||||
|
"is_undefined",
|
||||||
|
// AST_LambdaExpression
|
||||||
|
// AST_LambdaDefinition
|
||||||
|
"inlined",
|
||||||
|
// AST_Lambda
|
||||||
|
"length_read",
|
||||||
|
// AST_Yield
|
||||||
|
"nested",
|
||||||
|
// AST_Lambda
|
||||||
|
"new",
|
||||||
|
// AST_Call
|
||||||
|
// AST_PropAccess
|
||||||
|
"optional",
|
||||||
|
// AST_ClassProperty
|
||||||
|
"private",
|
||||||
|
// AST_Call
|
||||||
|
"pure",
|
||||||
|
// AST_Assign
|
||||||
|
"redundant",
|
||||||
|
// AST_ClassProperty
|
||||||
|
"static",
|
||||||
|
// AST_Call
|
||||||
|
// AST_PropAccess
|
||||||
|
"terminal",
|
||||||
|
"truthy",
|
||||||
|
// AST_Scope
|
||||||
|
"uses_eval",
|
||||||
|
// AST_Scope
|
||||||
|
"uses_with",
|
||||||
|
]);
|
||||||
|
|
||||||
(AST_Node.log_function = function(fn, verbose) {
|
(AST_Node.log_function = function(fn, verbose) {
|
||||||
if (typeof fn != "function") {
|
if (typeof fn != "function") {
|
||||||
AST_Node.info = AST_Node.warn = noop;
|
AST_Node.info = AST_Node.warn = noop;
|
||||||
@@ -256,13 +302,13 @@ var AST_SimpleStatement = DEFNODE("SimpleStatement", "body", {
|
|||||||
},
|
},
|
||||||
}, AST_Statement);
|
}, AST_Statement);
|
||||||
|
|
||||||
var AST_BlockScope = DEFNODE("BlockScope", "enclosed functions make_def parent_scope variables", {
|
var AST_BlockScope = DEFNODE("BlockScope", "_var_names enclosed functions make_def parent_scope variables", {
|
||||||
$documentation: "Base class for all statements introducing a lexical scope",
|
$documentation: "Base class for all statements introducing a lexical scope",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
enclosed: "[SymbolDef*/S] a list of all symbol definitions that are accessed from this scope or any subscopes",
|
enclosed: "[SymbolDef*/S] a list of all symbol definitions that are accessed from this scope or any subscopes",
|
||||||
functions: "[Object/S] like `variables`, but only lists function declarations",
|
functions: "[Dictionary/S] like `variables`, but only lists function declarations",
|
||||||
parent_scope: "[AST_Scope?/S] link to the parent scope",
|
parent_scope: "[AST_Scope?/S] link to the parent scope",
|
||||||
variables: "[Object/S] a map of name ---> SymbolDef for all variables/functions defined in this scope",
|
variables: "[Dictionary/S] a map of name ---> SymbolDef for all variables/functions defined in this scope",
|
||||||
},
|
},
|
||||||
clone: function(deep) {
|
clone: function(deep) {
|
||||||
var node = this._clone(deep);
|
var node = this._clone(deep);
|
||||||
@@ -487,7 +533,7 @@ var AST_With = DEFNODE("With", "expression", {
|
|||||||
|
|
||||||
/* -----[ scope and functions ]----- */
|
/* -----[ scope and functions ]----- */
|
||||||
|
|
||||||
var AST_Scope = DEFNODE("Scope", "uses_eval uses_with", {
|
var AST_Scope = DEFNODE("Scope", "fn_defs may_call_this uses_eval uses_with", {
|
||||||
$documentation: "Base class for all statements introducing a lexical scope",
|
$documentation: "Base class for all statements introducing a lexical scope",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
uses_eval: "[boolean/S] tells whether this scope contains a direct call to the global `eval`",
|
uses_eval: "[boolean/S] tells whether this scope contains a direct call to the global `eval`",
|
||||||
@@ -505,7 +551,7 @@ var AST_Scope = DEFNODE("Scope", "uses_eval uses_with", {
|
|||||||
var AST_Toplevel = DEFNODE("Toplevel", "globals", {
|
var AST_Toplevel = DEFNODE("Toplevel", "globals", {
|
||||||
$documentation: "The toplevel scope",
|
$documentation: "The toplevel scope",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
globals: "[Object/S] a map of name ---> SymbolDef for all undeclared names",
|
globals: "[Dictionary/S] a map of name ---> SymbolDef for all undeclared names",
|
||||||
},
|
},
|
||||||
wrap: function(name) {
|
wrap: function(name) {
|
||||||
var body = this.body;
|
var body = this.body;
|
||||||
@@ -546,13 +592,13 @@ var AST_Toplevel = DEFNODE("Toplevel", "globals", {
|
|||||||
}
|
}
|
||||||
}, AST_Scope);
|
}, AST_Scope);
|
||||||
|
|
||||||
var AST_Lambda = DEFNODE("Lambda", "argnames length_read rest uses_arguments", {
|
var AST_Lambda = DEFNODE("Lambda", "argnames length_read rest safe_ids uses_arguments", {
|
||||||
$documentation: "Base class for functions",
|
$documentation: "Base class for functions",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
argnames: "[(AST_DefaultValue|AST_Destructured|AST_SymbolFunarg)*] array of function arguments and/or destructured literals",
|
argnames: "[(AST_DefaultValue|AST_Destructured|AST_SymbolFunarg)*] array of function arguments and/or destructured literals",
|
||||||
length_read: "[boolean/S] whether length property of this function is accessed",
|
length_read: "[boolean/S] whether length property of this function is accessed",
|
||||||
rest: "[(AST_Destructured|AST_SymbolFunarg)?] rest parameter, or null if absent",
|
rest: "[(AST_Destructured|AST_SymbolFunarg)?] rest parameter, or null if absent",
|
||||||
uses_arguments: "[boolean/S] whether this function accesses the arguments array",
|
uses_arguments: "[boolean|number/S] whether this function accesses the arguments array",
|
||||||
},
|
},
|
||||||
each_argname: function(visit) {
|
each_argname: function(visit) {
|
||||||
var tw = new TreeWalker(function(node) {
|
var tw = new TreeWalker(function(node) {
|
||||||
@@ -805,6 +851,9 @@ var AST_DefClass = DEFNODE("DefClass", null, {
|
|||||||
$propdoc: {
|
$propdoc: {
|
||||||
name: "[AST_SymbolDefClass] the name of this class",
|
name: "[AST_SymbolDefClass] the name of this class",
|
||||||
},
|
},
|
||||||
|
resolve: function(def_class) {
|
||||||
|
return def_class ? this : this.parent_scope.resolve();
|
||||||
|
},
|
||||||
_validate: function() {
|
_validate: function() {
|
||||||
if (!(this.name instanceof AST_SymbolDefClass)) throw new Error("name must be AST_SymbolDefClass");
|
if (!(this.name instanceof AST_SymbolDefClass)) throw new Error("name must be AST_SymbolDefClass");
|
||||||
},
|
},
|
||||||
@@ -1292,11 +1341,14 @@ function must_be_expressions(node, prop, allow_spread, allow_hole) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
var AST_Call = DEFNODE("Call", "expression args pure", {
|
var AST_Call = DEFNODE("Call", "args expression optional pure terminal", {
|
||||||
$documentation: "A function call expression",
|
$documentation: "A function call expression",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
|
args: "[AST_Node*] array of arguments",
|
||||||
expression: "[AST_Node] expression to invoke as function",
|
expression: "[AST_Node] expression to invoke as function",
|
||||||
args: "[AST_Node*] array of arguments"
|
optional: "[boolean] whether the expression is optional chaining",
|
||||||
|
pure: "[boolean/S] marker for side-effect-free call expression",
|
||||||
|
terminal: "[boolean] whether the chain has ended",
|
||||||
},
|
},
|
||||||
walk: function(visitor) {
|
walk: function(visitor) {
|
||||||
var node = this;
|
var node = this;
|
||||||
@@ -1314,7 +1366,11 @@ var AST_Call = DEFNODE("Call", "expression args pure", {
|
|||||||
});
|
});
|
||||||
|
|
||||||
var AST_New = DEFNODE("New", null, {
|
var AST_New = DEFNODE("New", null, {
|
||||||
$documentation: "An object instantiation. Derives from a function call since it has exactly the same properties"
|
$documentation: "An object instantiation. Derives from a function call since it has exactly the same properties",
|
||||||
|
_validate: function() {
|
||||||
|
if (this.optional) throw new Error("optional must be false");
|
||||||
|
if (this.terminal) throw new Error("terminal must be false");
|
||||||
|
},
|
||||||
}, AST_Call);
|
}, AST_Call);
|
||||||
|
|
||||||
var AST_Sequence = DEFNODE("Sequence", "expressions", {
|
var AST_Sequence = DEFNODE("Sequence", "expressions", {
|
||||||
@@ -1336,22 +1392,23 @@ var AST_Sequence = DEFNODE("Sequence", "expressions", {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
var AST_PropAccess = DEFNODE("PropAccess", "expression property", {
|
function root_expr(prop) {
|
||||||
|
while (prop instanceof AST_PropAccess) prop = prop.expression;
|
||||||
|
return prop;
|
||||||
|
}
|
||||||
|
|
||||||
|
var AST_PropAccess = DEFNODE("PropAccess", "expression optional property terminal", {
|
||||||
$documentation: "Base class for property access expressions, i.e. `a.foo` or `a[\"foo\"]`",
|
$documentation: "Base class for property access expressions, i.e. `a.foo` or `a[\"foo\"]`",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
expression: "[AST_Node] the “container” expression",
|
expression: "[AST_Node] the “container” expression",
|
||||||
property: "[AST_Node|string] the property to access. For AST_Dot this is always a plain string, while for AST_Sub it's an arbitrary AST_Node"
|
optional: "[boolean] whether the expression is optional chaining",
|
||||||
|
property: "[AST_Node|string] the property to access. For AST_Dot this is always a plain string, while for AST_Sub it's an arbitrary AST_Node",
|
||||||
|
terminal: "[boolean] whether the chain has ended",
|
||||||
},
|
},
|
||||||
getProperty: function() {
|
get_property: function() {
|
||||||
var p = this.property;
|
var p = this.property;
|
||||||
if (p instanceof AST_Constant) {
|
if (p instanceof AST_Constant) return p.value;
|
||||||
return p.value;
|
if (p instanceof AST_UnaryPrefix && p.operator == "void" && p.expression instanceof AST_Constant) return;
|
||||||
}
|
|
||||||
if (p instanceof AST_UnaryPrefix
|
|
||||||
&& p.operator == "void"
|
|
||||||
&& p.expression instanceof AST_Constant) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
return p;
|
return p;
|
||||||
},
|
},
|
||||||
_validate: function() {
|
_validate: function() {
|
||||||
@@ -1484,6 +1541,12 @@ var AST_Assign = DEFNODE("Assign", null, {
|
|||||||
throw new Error("left must be assignable: " + node.TYPE);
|
throw new Error("left must be assignable: " + node.TYPE);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
} else if (!(this.left instanceof AST_Infinity
|
||||||
|
|| this.left instanceof AST_NaN
|
||||||
|
|| this.left instanceof AST_PropAccess && !this.left.optional
|
||||||
|
|| this.left instanceof AST_SymbolRef
|
||||||
|
|| this.left instanceof AST_Undefined)) {
|
||||||
|
throw new Error("left must be assignable");
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
}, AST_Binary);
|
}, AST_Binary);
|
||||||
@@ -1685,7 +1748,7 @@ var AST_ObjectMethod = DEFNODE("ObjectMethod", null, {
|
|||||||
_validate: function() {
|
_validate: function() {
|
||||||
if (!(this.value instanceof AST_LambdaExpression)) throw new Error("value must be AST_LambdaExpression");
|
if (!(this.value instanceof AST_LambdaExpression)) throw new Error("value must be AST_LambdaExpression");
|
||||||
if (is_arrow(this.value)) throw new Error("value cannot be AST_Arrow or AST_AsyncArrow");
|
if (is_arrow(this.value)) throw new Error("value cannot be AST_Arrow or AST_AsyncArrow");
|
||||||
if (this.value.name != null) throw new Error("name of class method's lambda must be null");
|
if (this.value.name != null) throw new Error("name of object method's lambda must be null");
|
||||||
},
|
},
|
||||||
}, AST_ObjectKeyVal);
|
}, AST_ObjectKeyVal);
|
||||||
|
|
||||||
@@ -1742,7 +1805,7 @@ var AST_SymbolVar = DEFNODE("SymbolVar", null, {
|
|||||||
$documentation: "Symbol defining a variable",
|
$documentation: "Symbol defining a variable",
|
||||||
}, AST_SymbolDeclaration);
|
}, AST_SymbolDeclaration);
|
||||||
|
|
||||||
var AST_SymbolFunarg = DEFNODE("SymbolFunarg", null, {
|
var AST_SymbolFunarg = DEFNODE("SymbolFunarg", "unused", {
|
||||||
$documentation: "Symbol naming a function argument",
|
$documentation: "Symbol naming a function argument",
|
||||||
}, AST_SymbolVar);
|
}, AST_SymbolVar);
|
||||||
|
|
||||||
@@ -1756,11 +1819,11 @@ var AST_SymbolLambda = DEFNODE("SymbolLambda", null, {
|
|||||||
|
|
||||||
var AST_SymbolDefClass = DEFNODE("SymbolDefClass", null, {
|
var AST_SymbolDefClass = DEFNODE("SymbolDefClass", null, {
|
||||||
$documentation: "Symbol defining a class",
|
$documentation: "Symbol defining a class",
|
||||||
}, AST_SymbolLet);
|
}, AST_SymbolConst);
|
||||||
|
|
||||||
var AST_SymbolClass = DEFNODE("SymbolClass", null, {
|
var AST_SymbolClass = DEFNODE("SymbolClass", null, {
|
||||||
$documentation: "Symbol naming a class expression",
|
$documentation: "Symbol naming a class expression",
|
||||||
}, AST_SymbolLet);
|
}, AST_SymbolConst);
|
||||||
|
|
||||||
var AST_SymbolCatch = DEFNODE("SymbolCatch", null, {
|
var AST_SymbolCatch = DEFNODE("SymbolCatch", null, {
|
||||||
$documentation: "Symbol naming the exception in catch",
|
$documentation: "Symbol naming the exception in catch",
|
||||||
@@ -1818,6 +1881,9 @@ var AST_This = DEFNODE("This", null, {
|
|||||||
|
|
||||||
var AST_NewTarget = DEFNODE("NewTarget", null, {
|
var AST_NewTarget = DEFNODE("NewTarget", null, {
|
||||||
$documentation: "The `new.target` symbol",
|
$documentation: "The `new.target` symbol",
|
||||||
|
initialize: function() {
|
||||||
|
this.name = "new.target";
|
||||||
|
},
|
||||||
_validate: function() {
|
_validate: function() {
|
||||||
if (this.name !== "new.target") throw new Error('name must be "new.target": ' + this.name);
|
if (this.name !== "new.target") throw new Error('name must be "new.target": ' + this.name);
|
||||||
},
|
},
|
||||||
@@ -1915,27 +1981,27 @@ var AST_Atom = DEFNODE("Atom", null, {
|
|||||||
|
|
||||||
var AST_Null = DEFNODE("Null", null, {
|
var AST_Null = DEFNODE("Null", null, {
|
||||||
$documentation: "The `null` atom",
|
$documentation: "The `null` atom",
|
||||||
value: null
|
value: null,
|
||||||
}, AST_Atom);
|
}, AST_Atom);
|
||||||
|
|
||||||
var AST_NaN = DEFNODE("NaN", null, {
|
var AST_NaN = DEFNODE("NaN", null, {
|
||||||
$documentation: "The impossible value",
|
$documentation: "The impossible value",
|
||||||
value: 0/0
|
value: 0/0,
|
||||||
}, AST_Atom);
|
}, AST_Atom);
|
||||||
|
|
||||||
var AST_Undefined = DEFNODE("Undefined", null, {
|
var AST_Undefined = DEFNODE("Undefined", null, {
|
||||||
$documentation: "The `undefined` value",
|
$documentation: "The `undefined` value",
|
||||||
value: function(){}()
|
value: function(){}(),
|
||||||
}, AST_Atom);
|
}, AST_Atom);
|
||||||
|
|
||||||
var AST_Hole = DEFNODE("Hole", null, {
|
var AST_Hole = DEFNODE("Hole", null, {
|
||||||
$documentation: "A hole in an array",
|
$documentation: "A hole in an array",
|
||||||
value: function(){}()
|
value: function(){}(),
|
||||||
}, AST_Atom);
|
}, AST_Atom);
|
||||||
|
|
||||||
var AST_Infinity = DEFNODE("Infinity", null, {
|
var AST_Infinity = DEFNODE("Infinity", null, {
|
||||||
$documentation: "The `Infinity` value",
|
$documentation: "The `Infinity` value",
|
||||||
value: 1/0
|
value: 1/0,
|
||||||
}, AST_Atom);
|
}, AST_Atom);
|
||||||
|
|
||||||
var AST_Boolean = DEFNODE("Boolean", null, {
|
var AST_Boolean = DEFNODE("Boolean", null, {
|
||||||
@@ -1947,12 +2013,12 @@ var AST_Boolean = DEFNODE("Boolean", null, {
|
|||||||
|
|
||||||
var AST_False = DEFNODE("False", null, {
|
var AST_False = DEFNODE("False", null, {
|
||||||
$documentation: "The `false` atom",
|
$documentation: "The `false` atom",
|
||||||
value: false
|
value: false,
|
||||||
}, AST_Boolean);
|
}, AST_Boolean);
|
||||||
|
|
||||||
var AST_True = DEFNODE("True", null, {
|
var AST_True = DEFNODE("True", null, {
|
||||||
$documentation: "The `true` atom",
|
$documentation: "The `true` atom",
|
||||||
value: true
|
value: true,
|
||||||
}, AST_Boolean);
|
}, AST_Boolean);
|
||||||
|
|
||||||
/* -----[ TreeWalker ]----- */
|
/* -----[ TreeWalker ]----- */
|
||||||
@@ -1991,7 +2057,7 @@ TreeWalker.prototype = {
|
|||||||
},
|
},
|
||||||
find_parent: function(type) {
|
find_parent: function(type) {
|
||||||
var stack = this.stack;
|
var stack = this.stack;
|
||||||
for (var i = stack.length; --i >= 0;) {
|
for (var i = stack.length - 1; --i >= 0;) {
|
||||||
var x = stack[i];
|
var x = stack[i];
|
||||||
if (x instanceof type) return x;
|
if (x instanceof type) return x;
|
||||||
}
|
}
|
||||||
@@ -2022,33 +2088,40 @@ TreeWalker.prototype = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
in_boolean_context: function() {
|
in_boolean_context: function() {
|
||||||
var self = this.self();
|
for (var drop = true, level = 0, parent, self = this.self(); parent = this.parent(level++); self = parent) {
|
||||||
for (var i = 0, p; p = this.parent(i); i++) {
|
if (parent instanceof AST_Binary) switch (parent.operator) {
|
||||||
if (p instanceof AST_Conditional && p.condition === self
|
case "&&":
|
||||||
|| p instanceof AST_DWLoop && p.condition === self
|
case "||":
|
||||||
|| p instanceof AST_For && p.condition === self
|
if (parent.left === self) drop = false;
|
||||||
|| p instanceof AST_If && p.condition === self
|
continue;
|
||||||
|| p instanceof AST_Return && p.in_bool
|
default:
|
||||||
|| p instanceof AST_Sequence && p.tail_node() !== self
|
|
||||||
|| p instanceof AST_SimpleStatement
|
|
||||||
|| p instanceof AST_UnaryPrefix && p.operator == "!" && p.expression === self) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (p instanceof AST_Binary && (p.operator == "&&" || p.operator == "||")
|
|
||||||
|| p instanceof AST_Conditional
|
|
||||||
|| p.tail_node() === self) {
|
|
||||||
self = p;
|
|
||||||
} else if (p instanceof AST_Return) {
|
|
||||||
for (var call, fn = p; call = this.parent(++i); fn = call) {
|
|
||||||
if (call.TYPE == "Call") {
|
|
||||||
if (!(fn instanceof AST_Lambda) || fn.name) return false;
|
|
||||||
} else if (fn instanceof AST_Lambda) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if (parent instanceof AST_Conditional) {
|
||||||
|
if (parent.condition === self) return true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (parent instanceof AST_DWLoop) return parent.condition === self;
|
||||||
|
if (parent instanceof AST_For) return parent.condition === self;
|
||||||
|
if (parent instanceof AST_If) return parent.condition === self;
|
||||||
|
if (parent instanceof AST_Return) {
|
||||||
|
if (parent.in_bool) return true;
|
||||||
|
while (parent = this.parent(level++)) {
|
||||||
|
if (parent instanceof AST_Lambda) {
|
||||||
|
if (parent.name) return false;
|
||||||
|
parent = this.parent(level++);
|
||||||
|
if (parent.TYPE != "Call") return false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (parent instanceof AST_Sequence) {
|
||||||
|
if (parent.tail_node() === self) continue;
|
||||||
|
return drop ? "d" : true;
|
||||||
|
}
|
||||||
|
if (parent instanceof AST_SimpleStatement) return drop ? "d" : true;
|
||||||
|
if (parent instanceof AST_UnaryPrefix) return parent.operator == "!";
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
6507
lib/compress.js
6507
lib/compress.js
File diff suppressed because it is too large
Load Diff
@@ -28,7 +28,7 @@ function read_source_map(name, toplevel) {
|
|||||||
var match = /^# ([^\s=]+)=(\S+)\s*$/.exec(comment.value);
|
var match = /^# ([^\s=]+)=(\S+)\s*$/.exec(comment.value);
|
||||||
if (!match) break;
|
if (!match) break;
|
||||||
if (match[1] == "sourceMappingURL") {
|
if (match[1] == "sourceMappingURL") {
|
||||||
match = /^data:application\/json(;.*?)?;base64,(\S+)$/.exec(match[2]);
|
match = /^data:application\/json(;.*?)?;base64,([^,]+)$/.exec(match[2]);
|
||||||
if (!match) break;
|
if (!match) break;
|
||||||
return to_ascii(match[2]);
|
return to_ascii(match[2]);
|
||||||
}
|
}
|
||||||
@@ -47,14 +47,12 @@ function parse_source_map(content) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function set_shorthand(name, options, keys) {
|
function set_shorthand(name, options, keys) {
|
||||||
if (options[name]) {
|
keys.forEach(function(key) {
|
||||||
keys.forEach(function(key) {
|
if (options[key]) {
|
||||||
if (options[key]) {
|
if (typeof options[key] != "object") options[key] = {};
|
||||||
if (typeof options[key] != "object") options[key] = {};
|
if (!(name in options[key])) options[key][name] = options[name];
|
||||||
if (!(name in options[key])) options[key][name] = options[name];
|
}
|
||||||
}
|
});
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function init_cache(cache) {
|
function init_cache(cache) {
|
||||||
@@ -75,9 +73,12 @@ function to_json(cache) {
|
|||||||
function minify(files, options) {
|
function minify(files, options) {
|
||||||
try {
|
try {
|
||||||
options = defaults(options, {
|
options = defaults(options, {
|
||||||
|
annotations: undefined,
|
||||||
compress: {},
|
compress: {},
|
||||||
enclose: false,
|
enclose: false,
|
||||||
|
ie: false,
|
||||||
ie8: false,
|
ie8: false,
|
||||||
|
keep_fargs: false,
|
||||||
keep_fnames: false,
|
keep_fnames: false,
|
||||||
mangle: {},
|
mangle: {},
|
||||||
nameCache: null,
|
nameCache: null,
|
||||||
@@ -94,23 +95,22 @@ function minify(files, options) {
|
|||||||
wrap: false,
|
wrap: false,
|
||||||
}, true);
|
}, true);
|
||||||
if (options.validate) AST_Node.enable_validation();
|
if (options.validate) AST_Node.enable_validation();
|
||||||
var timings = options.timings && {
|
var timings = options.timings && { start: Date.now() };
|
||||||
start: Date.now()
|
if (options.annotations !== undefined) set_shorthand("annotations", options, [ "compress", "output" ]);
|
||||||
};
|
if (options.ie8) options.ie = options.ie || options.ie8;
|
||||||
if (options.rename === undefined) {
|
if (options.ie) set_shorthand("ie", options, [ "compress", "mangle", "output", "rename" ]);
|
||||||
options.rename = options.compress && options.mangle;
|
if (options.keep_fargs) set_shorthand("keep_fargs", options, [ "compress", "mangle", "rename" ]);
|
||||||
}
|
if (options.keep_fnames) set_shorthand("keep_fnames", options, [ "compress", "mangle", "rename" ]);
|
||||||
set_shorthand("ie8", options, [ "compress", "mangle", "output" ]);
|
if (options.toplevel) set_shorthand("toplevel", options, [ "compress", "mangle", "rename" ]);
|
||||||
set_shorthand("keep_fnames", options, [ "compress", "mangle" ]);
|
if (options.v8) set_shorthand("v8", options, [ "mangle", "output", "rename" ]);
|
||||||
set_shorthand("toplevel", options, [ "compress", "mangle" ]);
|
if (options.webkit) set_shorthand("webkit", options, [ "compress", "mangle", "output", "rename" ]);
|
||||||
set_shorthand("v8", options, [ "mangle", "output" ]);
|
|
||||||
set_shorthand("webkit", options, [ "mangle", "output" ]);
|
|
||||||
var quoted_props;
|
var quoted_props;
|
||||||
if (options.mangle) {
|
if (options.mangle) {
|
||||||
options.mangle = defaults(options.mangle, {
|
options.mangle = defaults(options.mangle, {
|
||||||
cache: options.nameCache && (options.nameCache.vars || {}),
|
cache: options.nameCache && (options.nameCache.vars || {}),
|
||||||
eval: false,
|
eval: false,
|
||||||
ie8: false,
|
ie: false,
|
||||||
|
keep_fargs: false,
|
||||||
keep_fnames: false,
|
keep_fnames: false,
|
||||||
properties: false,
|
properties: false,
|
||||||
reserved: [],
|
reserved: [],
|
||||||
@@ -134,6 +134,7 @@ function minify(files, options) {
|
|||||||
init_cache(options.mangle.cache);
|
init_cache(options.mangle.cache);
|
||||||
init_cache(options.mangle.properties.cache);
|
init_cache(options.mangle.properties.cache);
|
||||||
}
|
}
|
||||||
|
if (options.rename === undefined) options.rename = options.compress && options.mangle;
|
||||||
if (options.sourceMap) {
|
if (options.sourceMap) {
|
||||||
options.sourceMap = defaults(options.sourceMap, {
|
options.sourceMap = defaults(options.sourceMap, {
|
||||||
content: null,
|
content: null,
|
||||||
@@ -189,8 +190,8 @@ function minify(files, options) {
|
|||||||
if (options.validate) toplevel.validate_ast();
|
if (options.validate) toplevel.validate_ast();
|
||||||
if (timings) timings.rename = Date.now();
|
if (timings) timings.rename = Date.now();
|
||||||
if (options.rename) {
|
if (options.rename) {
|
||||||
toplevel.figure_out_scope(options.mangle);
|
toplevel.figure_out_scope(options.rename);
|
||||||
toplevel.expand_names(options.mangle);
|
toplevel.expand_names(options.rename);
|
||||||
}
|
}
|
||||||
if (timings) timings.compress = Date.now();
|
if (timings) timings.compress = Date.now();
|
||||||
if (options.compress) {
|
if (options.compress) {
|
||||||
@@ -208,27 +209,29 @@ function minify(files, options) {
|
|||||||
if (options.mangle && options.mangle.properties) mangle_properties(toplevel, options.mangle.properties);
|
if (options.mangle && options.mangle.properties) mangle_properties(toplevel, options.mangle.properties);
|
||||||
if (timings) timings.output = Date.now();
|
if (timings) timings.output = Date.now();
|
||||||
var result = {};
|
var result = {};
|
||||||
if (options.output.ast) {
|
var output = defaults(options.output, {
|
||||||
result.ast = toplevel;
|
ast: false,
|
||||||
}
|
code: true,
|
||||||
if (!HOP(options.output, "code") || options.output.code) {
|
});
|
||||||
|
if (output.ast) result.ast = toplevel;
|
||||||
|
if (output.code) {
|
||||||
if (options.sourceMap) {
|
if (options.sourceMap) {
|
||||||
options.output.source_map = SourceMap(options.sourceMap);
|
output.source_map = SourceMap(options.sourceMap);
|
||||||
if (options.sourceMap.includeSources) {
|
if (options.sourceMap.includeSources) {
|
||||||
if (files instanceof AST_Toplevel) {
|
if (files instanceof AST_Toplevel) {
|
||||||
throw new Error("original source content unavailable");
|
throw new Error("original source content unavailable");
|
||||||
} else for (var name in files) if (HOP(files, name)) {
|
} 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 output.ast;
|
||||||
delete options.output.code;
|
delete output.code;
|
||||||
var stream = OutputStream(options.output);
|
var stream = OutputStream(output);
|
||||||
toplevel.print(stream);
|
toplevel.print(stream);
|
||||||
result.code = stream.get();
|
result.code = stream.get();
|
||||||
if (options.sourceMap) {
|
if (options.sourceMap) {
|
||||||
result.map = options.output.source_map.toString();
|
result.map = output.source_map.toString();
|
||||||
var url = options.sourceMap.url;
|
var url = options.sourceMap.url;
|
||||||
if (url) {
|
if (url) {
|
||||||
result.code = result.code.replace(/\n\/\/# sourceMappingURL=\S+\s*$/, "");
|
result.code = result.code.replace(/\n\/\/# sourceMappingURL=\S+\s*$/, "");
|
||||||
|
|||||||
1022
lib/mozilla-ast.js
1022
lib/mozilla-ast.js
File diff suppressed because it is too large
Load Diff
651
lib/output.js
651
lib/output.js
File diff suppressed because it is too large
Load Diff
348
lib/parse.js
348
lib/parse.js
@@ -44,10 +44,10 @@
|
|||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
var KEYWORDS = "break case catch class const continue debugger default delete do else extends finally for function if in instanceof let new return switch throw try typeof var void while with";
|
var KEYWORDS = "break case catch class const continue debugger default delete do else extends finally for function if in instanceof new return switch throw try typeof var void while with";
|
||||||
var KEYWORDS_ATOM = "false null true";
|
var KEYWORDS_ATOM = "false null true";
|
||||||
var RESERVED_WORDS = [
|
var RESERVED_WORDS = [
|
||||||
"abstract async await boolean byte char double enum export final float goto implements import int interface long native package private protected public short static super synchronized this throws transient volatile yield",
|
"abstract async await boolean byte char double enum export final float goto implements import int interface let long native package private protected public short static super synchronized this throws transient volatile yield",
|
||||||
KEYWORDS_ATOM,
|
KEYWORDS_ATOM,
|
||||||
KEYWORDS,
|
KEYWORDS,
|
||||||
].join(" ");
|
].join(" ");
|
||||||
@@ -100,15 +100,19 @@ var OPERATORS = makePredicate([
|
|||||||
"/=",
|
"/=",
|
||||||
"*=",
|
"*=",
|
||||||
"%=",
|
"%=",
|
||||||
|
"**=",
|
||||||
">>=",
|
">>=",
|
||||||
"<<=",
|
"<<=",
|
||||||
">>>=",
|
">>>=",
|
||||||
|
"&=",
|
||||||
"|=",
|
"|=",
|
||||||
"^=",
|
"^=",
|
||||||
"&=",
|
|
||||||
"&&",
|
"&&",
|
||||||
"||",
|
"||",
|
||||||
"??",
|
"??",
|
||||||
|
"&&=",
|
||||||
|
"||=",
|
||||||
|
"??=",
|
||||||
]);
|
]);
|
||||||
|
|
||||||
var NEWLINE_CHARS = "\n\r\u2028\u2029";
|
var NEWLINE_CHARS = "\n\r\u2028\u2029";
|
||||||
@@ -120,7 +124,7 @@ var PUNC_AFTER_EXPRESSION = PUNC_SEPARATORS + PUNC_CLOSERS;
|
|||||||
var PUNC_BEFORE_EXPRESSION = PUNC_OPENERS + PUNC_SEPARATORS;
|
var PUNC_BEFORE_EXPRESSION = PUNC_OPENERS + PUNC_SEPARATORS;
|
||||||
var PUNC_CHARS = PUNC_BEFORE_EXPRESSION + "`" + PUNC_CLOSERS;
|
var PUNC_CHARS = PUNC_BEFORE_EXPRESSION + "`" + PUNC_CLOSERS;
|
||||||
var WHITESPACE_CHARS = NEWLINE_CHARS + " \u00a0\t\f\u000b\u200b\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\uFEFF";
|
var WHITESPACE_CHARS = NEWLINE_CHARS + " \u00a0\t\f\u000b\u200b\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\uFEFF";
|
||||||
var NON_IDENTIFIER_CHARS = makePredicate(characters("./'\"" + OPERATOR_CHARS + PUNC_CHARS + WHITESPACE_CHARS));
|
var NON_IDENTIFIER_CHARS = makePredicate(characters("./'\"#" + OPERATOR_CHARS + PUNC_CHARS + WHITESPACE_CHARS));
|
||||||
|
|
||||||
NEWLINE_CHARS = makePredicate(characters(NEWLINE_CHARS));
|
NEWLINE_CHARS = makePredicate(characters(NEWLINE_CHARS));
|
||||||
OPERATOR_CHARS = makePredicate(characters(OPERATOR_CHARS));
|
OPERATOR_CHARS = makePredicate(characters(OPERATOR_CHARS));
|
||||||
@@ -160,10 +164,10 @@ function decode_escape_sequence(seq) {
|
|||||||
case "t": return "\t";
|
case "t": return "\t";
|
||||||
case "u":
|
case "u":
|
||||||
var code;
|
var code;
|
||||||
if (seq.length == 5) {
|
if (seq[1] == "{" && seq.slice(-1) == "}") {
|
||||||
code = seq.slice(1);
|
|
||||||
} else if (seq[1] == "{" && seq.slice(-1) == "}") {
|
|
||||||
code = seq.slice(2, -1);
|
code = seq.slice(2, -1);
|
||||||
|
} else if (seq.length == 5) {
|
||||||
|
code = seq.slice(1);
|
||||||
} else {
|
} else {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -238,10 +242,10 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {
|
|||||||
read_template : with_eof_error("Unterminated template literal", function(strings) {
|
read_template : with_eof_error("Unterminated template literal", function(strings) {
|
||||||
var s = "";
|
var s = "";
|
||||||
for (;;) {
|
for (;;) {
|
||||||
var ch = next(true, true);
|
var ch = read();
|
||||||
switch (ch) {
|
switch (ch) {
|
||||||
case "\\":
|
case "\\":
|
||||||
ch += next(true, true);
|
ch += read();
|
||||||
break;
|
break;
|
||||||
case "`":
|
case "`":
|
||||||
strings.push(s);
|
strings.push(s);
|
||||||
@@ -256,6 +260,11 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {
|
|||||||
}
|
}
|
||||||
s += ch;
|
s += ch;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function read() {
|
||||||
|
var ch = next(true, true);
|
||||||
|
return ch == "\r" ? "\n" : ch;
|
||||||
|
}
|
||||||
}),
|
}),
|
||||||
};
|
};
|
||||||
var prev_was_dot = false;
|
var prev_was_dot = false;
|
||||||
@@ -347,7 +356,7 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {
|
|||||||
|
|
||||||
function read_while(pred) {
|
function read_while(pred) {
|
||||||
var ret = "", ch;
|
var ret = "", ch;
|
||||||
while ((ch = peek()) && pred(ch)) ret += next();
|
while ((ch = peek()) && pred(ch, ret)) ret += next();
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -355,24 +364,27 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {
|
|||||||
js_error(err, filename, S.tokline, S.tokcol, S.tokpos);
|
js_error(err, filename, S.tokline, S.tokcol, S.tokpos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function is_octal(num) {
|
||||||
|
return /^0[0-7_]+$/.test(num);
|
||||||
|
}
|
||||||
|
|
||||||
function read_num(prefix) {
|
function read_num(prefix) {
|
||||||
var has_e = false, after_e = false, has_x = false, has_dot = prefix == ".";
|
var has_e = false, after_e = false, has_x = false, has_dot = prefix == ".";
|
||||||
var num = read_while(function(ch) {
|
var num = read_while(function(ch, str) {
|
||||||
var code = ch.charCodeAt(0);
|
switch (ch) {
|
||||||
switch (code) {
|
case "x": case "X":
|
||||||
case 120: case 88: // xX
|
|
||||||
return has_x ? false : (has_x = true);
|
return has_x ? false : (has_x = true);
|
||||||
case 101: case 69: // eE
|
case "e": case "E":
|
||||||
return has_x ? true : has_e ? false : (has_e = after_e = true);
|
return has_x ? true : has_e ? false : (has_e = after_e = true);
|
||||||
case 43: case 45: // +-
|
case "+": case "-":
|
||||||
return after_e;
|
return after_e;
|
||||||
case (after_e = false, 46): // .
|
case (after_e = false, "."):
|
||||||
return (!has_dot && !has_x && !has_e) ? (has_dot = true) : false;
|
return has_dot || has_e || has_x || is_octal(str) ? false : (has_dot = true);
|
||||||
}
|
}
|
||||||
return is_digit(code) || /[_0-9a-fo]/i.test(ch);
|
return /[_0-9a-dfo]/i.test(ch);
|
||||||
});
|
});
|
||||||
if (prefix) num = prefix + num;
|
if (prefix) num = prefix + num;
|
||||||
if (/^0[0-7_]+$/.test(num)) {
|
if (is_octal(num)) {
|
||||||
if (next_token.has_directive("use strict")) parse_error("Legacy octal literals are not allowed in strict mode");
|
if (next_token.has_directive("use strict")) parse_error("Legacy octal literals are not allowed in strict mode");
|
||||||
} else {
|
} else {
|
||||||
num = num.replace(has_x ? /([1-9a-f]|.0)_(?=[0-9a-f])/gi : /([1-9]|.0)_(?=[0-9])/gi, "$1");
|
num = num.replace(has_x ? /([1-9a-f]|.0)_(?=[0-9a-f])/gi : /([1-9]|.0)_(?=[0-9])/gi, "$1");
|
||||||
@@ -461,7 +473,7 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
function read_name() {
|
function read_name() {
|
||||||
var backslash = false, name = "", ch, escaped = false, hex;
|
var backslash = false, ch, escaped = false, name = peek() == "#" ? next() : "";
|
||||||
while (ch = peek()) {
|
while (ch = peek()) {
|
||||||
if (!backslash) {
|
if (!backslash) {
|
||||||
if (ch == "\\") escaped = backslash = true, next();
|
if (ch == "\\") escaped = backslash = true, next();
|
||||||
@@ -476,7 +488,7 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (KEYWORDS[name] && escaped) {
|
if (KEYWORDS[name] && escaped) {
|
||||||
hex = name.charCodeAt(0).toString(16).toUpperCase();
|
var hex = name.charCodeAt(0).toString(16).toUpperCase();
|
||||||
name = "\\u" + "0000".substr(hex.length) + hex + name.slice(1);
|
name = "\\u" + "0000".substr(hex.length) + hex + name.slice(1);
|
||||||
}
|
}
|
||||||
return name;
|
return name;
|
||||||
@@ -611,7 +623,7 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {
|
|||||||
if (PUNC_CHARS[ch]) return token("punc", next());
|
if (PUNC_CHARS[ch]) return token("punc", next());
|
||||||
if (looking_at("=>")) return token("punc", next() + next());
|
if (looking_at("=>")) return token("punc", next() + next());
|
||||||
if (OPERATOR_CHARS[ch]) return read_operator();
|
if (OPERATOR_CHARS[ch]) return read_operator();
|
||||||
if (code == 92 || !NON_IDENTIFIER_CHARS[ch]) return read_word();
|
if (code == 35 || code == 92 || !NON_IDENTIFIER_CHARS[ch]) return read_word();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
parse_error("Unexpected character '" + ch + "'");
|
parse_error("Unexpected character '" + ch + "'");
|
||||||
@@ -652,7 +664,7 @@ var UNARY_PREFIX = makePredicate("typeof void delete -- ++ ! ~ - +");
|
|||||||
|
|
||||||
var UNARY_POSTFIX = makePredicate("-- ++");
|
var UNARY_POSTFIX = makePredicate("-- ++");
|
||||||
|
|
||||||
var ASSIGNMENT = makePredicate("= += -= /= *= %= >>= <<= >>>= |= ^= &=");
|
var ASSIGNMENT = makePredicate("= += -= /= *= %= **= >>= <<= >>>= &= |= ^= &&= ||= ??=");
|
||||||
|
|
||||||
var PRECEDENCE = function(a, ret) {
|
var PRECEDENCE = function(a, ret) {
|
||||||
for (var i = 0; i < a.length;) {
|
for (var i = 0; i < a.length;) {
|
||||||
@@ -850,10 +862,20 @@ function parse($TEXT, options) {
|
|||||||
next();
|
next();
|
||||||
return export_();
|
return export_();
|
||||||
case "import":
|
case "import":
|
||||||
if (!is_token(peek(), "punc", "(")) {
|
var token = peek();
|
||||||
|
if (!(token.type == "punc" && /^[(.]$/.test(token.value))) {
|
||||||
next();
|
next();
|
||||||
return import_();
|
return import_();
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
case "let":
|
||||||
|
if (is_vardefs()) {
|
||||||
|
next();
|
||||||
|
var node = let_();
|
||||||
|
semicolon();
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case "yield":
|
case "yield":
|
||||||
if (S.in_generator) return simple_statement();
|
if (S.in_generator) return simple_statement();
|
||||||
break;
|
break;
|
||||||
@@ -939,12 +961,6 @@ function parse($TEXT, options) {
|
|||||||
next();
|
next();
|
||||||
return if_();
|
return if_();
|
||||||
|
|
||||||
case "let":
|
|
||||||
next();
|
|
||||||
var node = let_();
|
|
||||||
semicolon();
|
|
||||||
return node;
|
|
||||||
|
|
||||||
case "return":
|
case "return":
|
||||||
if (S.in_function == 0 && !options.bare_returns)
|
if (S.in_function == 0 && !options.bare_returns)
|
||||||
croak("'return' outside of function");
|
croak("'return' outside of function");
|
||||||
@@ -1178,19 +1194,19 @@ function parse($TEXT, options) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function for_() {
|
function for_() {
|
||||||
var await = is("name", "await") && next();
|
var await_token = is("name", "await") && next();
|
||||||
expect("(");
|
expect("(");
|
||||||
var init = null;
|
var init = null;
|
||||||
if (!is("punc", ";")) {
|
if (await_token || !is("punc", ";")) {
|
||||||
init = is("keyword", "const")
|
init = is("keyword", "const")
|
||||||
? (next(), const_(true))
|
? (next(), const_(true))
|
||||||
: is("keyword", "let")
|
: is("name", "let") && is_vardefs()
|
||||||
? (next(), let_(true))
|
? (next(), let_(true))
|
||||||
: is("keyword", "var")
|
: is("keyword", "var")
|
||||||
? (next(), var_(true))
|
? (next(), var_(true))
|
||||||
: expression(true);
|
: expression(true);
|
||||||
var ctor;
|
var ctor;
|
||||||
if (await) {
|
if (await_token) {
|
||||||
expect_token("name", "of");
|
expect_token("name", "of");
|
||||||
ctor = AST_ForAwaitOf;
|
ctor = AST_ForAwaitOf;
|
||||||
} else if (is("operator", "in")) {
|
} else if (is("operator", "in")) {
|
||||||
@@ -1232,6 +1248,7 @@ function parse($TEXT, options) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function for_enum(ctor, init) {
|
function for_enum(ctor, init) {
|
||||||
|
handle_regexp();
|
||||||
var obj = expression();
|
var obj = expression();
|
||||||
expect(")");
|
expect(")");
|
||||||
return new ctor({
|
return new ctor({
|
||||||
@@ -1299,6 +1316,11 @@ function parse($TEXT, options) {
|
|||||||
}
|
}
|
||||||
if (node instanceof AST_SymbolFunarg) return node;
|
if (node instanceof AST_SymbolFunarg) return node;
|
||||||
if (node instanceof AST_SymbolRef) return new AST_SymbolFunarg(node);
|
if (node instanceof AST_SymbolRef) return new AST_SymbolFunarg(node);
|
||||||
|
if (node instanceof AST_Yield) return new AST_SymbolFunarg({
|
||||||
|
start: node.start,
|
||||||
|
name: "yield",
|
||||||
|
end: node.end,
|
||||||
|
});
|
||||||
token_error(node.start, "Invalid arrow parameter");
|
token_error(node.start, "Invalid arrow parameter");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1325,21 +1347,19 @@ function parse($TEXT, options) {
|
|||||||
if (is("punc", "{")) {
|
if (is("punc", "{")) {
|
||||||
body = block_();
|
body = block_();
|
||||||
value = null;
|
value = null;
|
||||||
if (S.input.has_directive("use strict")) {
|
|
||||||
argnames.forEach(strict_verify_symbol);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
body = [];
|
body = [];
|
||||||
handle_regexp();
|
handle_regexp();
|
||||||
value = maybe_assign();
|
value = maybe_assign();
|
||||||
}
|
}
|
||||||
|
var is_strict = S.input.has_directive("use strict");
|
||||||
S.input.pop_directives_stack();
|
S.input.pop_directives_stack();
|
||||||
--S.in_function;
|
--S.in_function;
|
||||||
S.in_loop = loop;
|
S.in_loop = loop;
|
||||||
S.labels = labels;
|
S.labels = labels;
|
||||||
S.in_generator = was_gen;
|
S.in_generator = was_gen;
|
||||||
S.in_async = was_async;
|
S.in_async = was_async;
|
||||||
return new (async ? AST_AsyncArrow : AST_Arrow)({
|
var node = new (async ? AST_AsyncArrow : AST_Arrow)({
|
||||||
start: start,
|
start: start,
|
||||||
argnames: argnames,
|
argnames: argnames,
|
||||||
rest: rest,
|
rest: rest,
|
||||||
@@ -1347,6 +1367,8 @@ function parse($TEXT, options) {
|
|||||||
value: value,
|
value: value,
|
||||||
end: prev(),
|
end: prev(),
|
||||||
});
|
});
|
||||||
|
if (is_strict) node.each_argname(strict_verify_symbol);
|
||||||
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
var function_ = function(ctor) {
|
var function_ = function(ctor) {
|
||||||
@@ -1379,23 +1401,24 @@ function parse($TEXT, options) {
|
|||||||
S.in_loop = 0;
|
S.in_loop = 0;
|
||||||
S.labels = [];
|
S.labels = [];
|
||||||
var body = block_();
|
var body = block_();
|
||||||
if (S.input.has_directive("use strict")) {
|
var is_strict = S.input.has_directive("use strict");
|
||||||
if (name) strict_verify_symbol(name);
|
|
||||||
argnames.forEach(strict_verify_symbol);
|
|
||||||
if (argnames.rest) strict_verify_symbol(argnames.rest);
|
|
||||||
}
|
|
||||||
S.input.pop_directives_stack();
|
S.input.pop_directives_stack();
|
||||||
--S.in_function;
|
--S.in_function;
|
||||||
S.in_loop = loop;
|
S.in_loop = loop;
|
||||||
S.labels = labels;
|
S.labels = labels;
|
||||||
S.in_generator = was_gen;
|
S.in_generator = was_gen;
|
||||||
S.in_async = was_async;
|
S.in_async = was_async;
|
||||||
return new ctor({
|
var node = new ctor({
|
||||||
name: name,
|
name: name,
|
||||||
argnames: argnames,
|
argnames: argnames,
|
||||||
rest: argnames.rest || null,
|
rest: argnames.rest || null,
|
||||||
body: body
|
body: body
|
||||||
});
|
});
|
||||||
|
if (is_strict) {
|
||||||
|
if (name) strict_verify_symbol(name);
|
||||||
|
node.each_argname(strict_verify_symbol);
|
||||||
|
}
|
||||||
|
return node;
|
||||||
};
|
};
|
||||||
|
|
||||||
function if_() {
|
function if_() {
|
||||||
@@ -1487,6 +1510,7 @@ function parse($TEXT, options) {
|
|||||||
body.start = start;
|
body.start = start;
|
||||||
body.end = prev();
|
body.end = prev();
|
||||||
} else {
|
} else {
|
||||||
|
handle_regexp();
|
||||||
body = expression();
|
body = expression();
|
||||||
semicolon();
|
semicolon();
|
||||||
}
|
}
|
||||||
@@ -1524,12 +1548,18 @@ function parse($TEXT, options) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var export_decl = embed_tokens(function() {
|
var export_decl = embed_tokens(function() {
|
||||||
if (is("name", "async")) {
|
if (is("name")) switch (S.token.value) {
|
||||||
|
case "async":
|
||||||
next();
|
next();
|
||||||
expect_token("keyword", "function");
|
expect_token("keyword", "function");
|
||||||
if (!is("operator", "*")) return function_(AST_AsyncDefun);
|
if (!is("operator", "*")) return function_(AST_AsyncDefun);
|
||||||
next();
|
next();
|
||||||
return function_(AST_AsyncGeneratorDefun);
|
return function_(AST_AsyncGeneratorDefun);
|
||||||
|
case "let":
|
||||||
|
next();
|
||||||
|
var node = let_();
|
||||||
|
semicolon();
|
||||||
|
return node;
|
||||||
} else if (is("keyword")) switch (S.token.value) {
|
} else if (is("keyword")) switch (S.token.value) {
|
||||||
case "class":
|
case "class":
|
||||||
next();
|
next();
|
||||||
@@ -1544,11 +1574,6 @@ function parse($TEXT, options) {
|
|||||||
if (!is("operator", "*")) return function_(AST_Defun);
|
if (!is("operator", "*")) return function_(AST_Defun);
|
||||||
next();
|
next();
|
||||||
return function_(AST_GeneratorDefun);
|
return function_(AST_GeneratorDefun);
|
||||||
case "let":
|
|
||||||
next();
|
|
||||||
var node = let_();
|
|
||||||
semicolon();
|
|
||||||
return node;
|
|
||||||
case "var":
|
case "var":
|
||||||
next();
|
next();
|
||||||
var node = var_();
|
var node = var_();
|
||||||
@@ -1709,6 +1734,11 @@ function parse($TEXT, options) {
|
|||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function is_vardefs() {
|
||||||
|
var token = peek();
|
||||||
|
return is_token(token, "name") || is_token(token, "punc", "[") || is_token(token, "punc", "{");
|
||||||
|
}
|
||||||
|
|
||||||
var const_ = function(no_in) {
|
var const_ = function(no_in) {
|
||||||
return new AST_Const({
|
return new AST_Const({
|
||||||
start : prev(),
|
start : prev(),
|
||||||
@@ -1736,67 +1766,66 @@ function parse($TEXT, options) {
|
|||||||
var new_ = function(allow_calls) {
|
var new_ = function(allow_calls) {
|
||||||
var start = S.token;
|
var start = S.token;
|
||||||
expect_token("operator", "new");
|
expect_token("operator", "new");
|
||||||
|
var call;
|
||||||
if (is("punc", ".") && is_token(peek(), "name", "target")) {
|
if (is("punc", ".") && is_token(peek(), "name", "target")) {
|
||||||
next();
|
next();
|
||||||
next();
|
next();
|
||||||
return new AST_NewTarget({
|
call = new AST_NewTarget();
|
||||||
name: "new.target",
|
|
||||||
start: start,
|
|
||||||
end: prev(),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
var newexp = expr_atom(false), args;
|
|
||||||
if (is("punc", "(")) {
|
|
||||||
next();
|
|
||||||
args = expr_list(")", !options.strict);
|
|
||||||
} else {
|
} else {
|
||||||
args = [];
|
var exp = expr_atom(false), args;
|
||||||
|
if (is("punc", "(")) {
|
||||||
|
next();
|
||||||
|
args = expr_list(")", !options.strict);
|
||||||
|
} else {
|
||||||
|
args = [];
|
||||||
|
}
|
||||||
|
call = new AST_New({ expression: exp, args: args });
|
||||||
}
|
}
|
||||||
var call = new AST_New({
|
call.start = start;
|
||||||
start : start,
|
call.end = prev();
|
||||||
expression : newexp,
|
|
||||||
args : args,
|
|
||||||
end : prev()
|
|
||||||
});
|
|
||||||
mark_pure(call);
|
|
||||||
return subscripts(call, allow_calls);
|
return subscripts(call, allow_calls);
|
||||||
};
|
};
|
||||||
|
|
||||||
function as_atom_node() {
|
function as_atom_node() {
|
||||||
var tok = S.token, ret;
|
var ret, tok = S.token, value = tok.value;
|
||||||
switch (tok.type) {
|
switch (tok.type) {
|
||||||
case "num":
|
case "num":
|
||||||
ret = new AST_Number({ start: tok, end: tok, value: tok.value });
|
if (isFinite(value)) {
|
||||||
break;
|
ret = new AST_Number({ value: value });
|
||||||
case "bigint":
|
} else {
|
||||||
ret = new AST_BigInt({ start: tok, end: tok, value: tok.value });
|
ret = new AST_Infinity();
|
||||||
break;
|
if (value < 0) ret = new AST_UnaryPrefix({ operator: "-", expression: ret });
|
||||||
case "string":
|
|
||||||
ret = new AST_String({
|
|
||||||
start : tok,
|
|
||||||
end : tok,
|
|
||||||
value : tok.value,
|
|
||||||
quote : tok.quote
|
|
||||||
});
|
|
||||||
break;
|
|
||||||
case "regexp":
|
|
||||||
ret = new AST_RegExp({ start: tok, end: tok, value: tok.value });
|
|
||||||
break;
|
|
||||||
case "atom":
|
|
||||||
switch (tok.value) {
|
|
||||||
case "false":
|
|
||||||
ret = new AST_False({ start: tok, end: tok });
|
|
||||||
break;
|
|
||||||
case "true":
|
|
||||||
ret = new AST_True({ start: tok, end: tok });
|
|
||||||
break;
|
|
||||||
case "null":
|
|
||||||
ret = new AST_Null({ start: tok, end: tok });
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case "bigint":
|
||||||
|
ret = new AST_BigInt({ value: value });
|
||||||
|
break;
|
||||||
|
case "string":
|
||||||
|
ret = new AST_String({ value : value, quote : tok.quote });
|
||||||
|
break;
|
||||||
|
case "regexp":
|
||||||
|
ret = new AST_RegExp({ value: value });
|
||||||
|
break;
|
||||||
|
case "atom":
|
||||||
|
switch (value) {
|
||||||
|
case "false":
|
||||||
|
ret = new AST_False();
|
||||||
|
break;
|
||||||
|
case "true":
|
||||||
|
ret = new AST_True();
|
||||||
|
break;
|
||||||
|
case "null":
|
||||||
|
ret = new AST_Null();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
unexpected();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
unexpected();
|
||||||
}
|
}
|
||||||
next();
|
next();
|
||||||
|
ret.start = ret.end = tok;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1808,10 +1837,7 @@ function parse($TEXT, options) {
|
|||||||
if (is("punc")) {
|
if (is("punc")) {
|
||||||
switch (start.value) {
|
switch (start.value) {
|
||||||
case "`":
|
case "`":
|
||||||
var tmpl = template(null);
|
return subscripts(template(null), allow_calls);
|
||||||
tmpl.start = start;
|
|
||||||
tmpl.end = prev();
|
|
||||||
return subscripts(tmpl, allow_calls);
|
|
||||||
case "(":
|
case "(":
|
||||||
next();
|
next();
|
||||||
if (is("punc", ")")) {
|
if (is("punc", ")")) {
|
||||||
@@ -1836,11 +1862,13 @@ function parse($TEXT, options) {
|
|||||||
expect(")");
|
expect(")");
|
||||||
var end = prev();
|
var end = prev();
|
||||||
end.comments_before = ex.end.comments_before;
|
end.comments_before = ex.end.comments_before;
|
||||||
[].push.apply(ex.end.comments_after, end.comments_after);
|
end.comments_after.forEach(function(comment) {
|
||||||
|
ex.end.comments_after.push(comment);
|
||||||
|
if (comment.nlb) S.token.nlb = true;
|
||||||
|
});
|
||||||
end.comments_after.length = 0;
|
end.comments_after.length = 0;
|
||||||
end.comments_after = ex.end.comments_after;
|
end.comments_after = ex.end.comments_after;
|
||||||
ex.end = end;
|
ex.end = end;
|
||||||
if (ex instanceof AST_Call) mark_pure(ex);
|
|
||||||
if (is("punc", "=>")) return arrow(ex instanceof AST_Sequence ? ex.expressions : [ ex ], start);
|
if (is("punc", "=>")) return arrow(ex instanceof AST_Sequence ? ex.expressions : [ ex ], start);
|
||||||
return subscripts(ex, allow_calls);
|
return subscripts(ex, allow_calls);
|
||||||
case "[":
|
case "[":
|
||||||
@@ -2121,7 +2149,7 @@ function parse($TEXT, options) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function strict_verify_symbol(sym) {
|
function strict_verify_symbol(sym) {
|
||||||
if (sym.name == "arguments" || sym.name == "eval")
|
if (sym.name == "arguments" || sym.name == "eval" || sym.name == "let")
|
||||||
token_error(sym.start, "Unexpected " + sym.name + " in strict mode");
|
token_error(sym.start, "Unexpected " + sym.name + " in strict mode");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2217,20 +2245,8 @@ function parse($TEXT, options) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function mark_pure(call) {
|
|
||||||
var start = call.start;
|
|
||||||
var comments = start.comments_before;
|
|
||||||
var i = HOP(start, "comments_before_length") ? start.comments_before_length : comments.length;
|
|
||||||
while (--i >= 0) {
|
|
||||||
var comment = comments[i];
|
|
||||||
if (/[@#]__PURE__/.test(comment.value)) {
|
|
||||||
call.pure = comment;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function template(tag) {
|
function template(tag) {
|
||||||
|
var start = tag ? tag.start : S.token;
|
||||||
var read = S.input.context().read_template;
|
var read = S.input.context().read_template;
|
||||||
var strings = [];
|
var strings = [];
|
||||||
var expressions = [];
|
var expressions = [];
|
||||||
@@ -2241,53 +2257,73 @@ function parse($TEXT, options) {
|
|||||||
}
|
}
|
||||||
next();
|
next();
|
||||||
return new AST_Template({
|
return new AST_Template({
|
||||||
|
start: start,
|
||||||
expressions: expressions,
|
expressions: expressions,
|
||||||
strings: strings,
|
strings: strings,
|
||||||
tag: tag,
|
tag: tag,
|
||||||
|
end: prev(),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
var subscripts = function(expr, allow_calls) {
|
function subscripts(expr, allow_calls) {
|
||||||
var start = expr.start;
|
var start = expr.start;
|
||||||
if (is("punc", ".")) {
|
var optional = null;
|
||||||
next();
|
while (true) {
|
||||||
return subscripts(new AST_Dot({
|
if (is("operator", "?") && is_token(peek(), "punc", ".")) {
|
||||||
start : start,
|
next();
|
||||||
expression : expr,
|
next();
|
||||||
property : as_name(),
|
optional = expr;
|
||||||
end : prev()
|
}
|
||||||
}), allow_calls);
|
if (is("punc", "[")) {
|
||||||
|
next();
|
||||||
|
var prop = expression();
|
||||||
|
expect("]");
|
||||||
|
expr = new AST_Sub({
|
||||||
|
start: start,
|
||||||
|
optional: optional === expr,
|
||||||
|
expression: expr,
|
||||||
|
property: prop,
|
||||||
|
end: prev(),
|
||||||
|
});
|
||||||
|
} else if (allow_calls && is("punc", "(")) {
|
||||||
|
next();
|
||||||
|
expr = new AST_Call({
|
||||||
|
start: start,
|
||||||
|
optional: optional === expr,
|
||||||
|
expression: expr,
|
||||||
|
args: expr_list(")", !options.strict),
|
||||||
|
end: prev(),
|
||||||
|
});
|
||||||
|
} else if (optional === expr || is("punc", ".")) {
|
||||||
|
if (optional !== expr) next();
|
||||||
|
expr = new AST_Dot({
|
||||||
|
start: start,
|
||||||
|
optional: optional === expr,
|
||||||
|
expression: expr,
|
||||||
|
property: as_name(),
|
||||||
|
end: prev(),
|
||||||
|
});
|
||||||
|
} else if (is("punc", "`")) {
|
||||||
|
if (optional) croak("Invalid template on optional chain");
|
||||||
|
expr = template(expr);
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (is("punc", "[")) {
|
if (optional) expr.terminal = true;
|
||||||
next();
|
if (expr instanceof AST_Call && !expr.pure) {
|
||||||
var prop = expression();
|
var start = expr.start;
|
||||||
expect("]");
|
var comments = start.comments_before;
|
||||||
return subscripts(new AST_Sub({
|
var i = HOP(start, "comments_before_length") ? start.comments_before_length : comments.length;
|
||||||
start : start,
|
while (--i >= 0) {
|
||||||
expression : expr,
|
if (/[@#]__PURE__/.test(comments[i].value)) {
|
||||||
property : prop,
|
expr.pure = true;
|
||||||
end : prev()
|
break;
|
||||||
}), allow_calls);
|
}
|
||||||
}
|
}
|
||||||
if (allow_calls && is("punc", "(")) {
|
|
||||||
next();
|
|
||||||
var call = new AST_Call({
|
|
||||||
start : start,
|
|
||||||
expression : expr,
|
|
||||||
args : expr_list(")", !options.strict),
|
|
||||||
end : prev()
|
|
||||||
});
|
|
||||||
mark_pure(call);
|
|
||||||
return subscripts(call, true);
|
|
||||||
}
|
|
||||||
if (is("punc", "`")) {
|
|
||||||
var tmpl = template(expr);
|
|
||||||
tmpl.start = expr.start;
|
|
||||||
tmpl.end = prev();
|
|
||||||
return subscripts(tmpl, allow_calls);
|
|
||||||
}
|
}
|
||||||
return expr;
|
return expr;
|
||||||
};
|
}
|
||||||
|
|
||||||
function maybe_unary(no_in) {
|
function maybe_unary(no_in) {
|
||||||
var start = S.token;
|
var start = S.token;
|
||||||
@@ -2396,7 +2432,7 @@ function parse($TEXT, options) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
function is_assignable(expr) {
|
function is_assignable(expr) {
|
||||||
return expr instanceof AST_PropAccess || expr instanceof AST_SymbolRef;
|
return expr instanceof AST_PropAccess && !expr.optional || expr instanceof AST_SymbolRef;
|
||||||
}
|
}
|
||||||
|
|
||||||
function to_destructured(node) {
|
function to_destructured(node) {
|
||||||
@@ -2518,7 +2554,7 @@ function parse($TEXT, options) {
|
|||||||
while (!is("eof"))
|
while (!is("eof"))
|
||||||
body.push(statement());
|
body.push(statement());
|
||||||
S.input.pop_directives_stack();
|
S.input.pop_directives_stack();
|
||||||
var end = prev();
|
var end = prev() || start;
|
||||||
var toplevel = options.toplevel;
|
var toplevel = options.toplevel;
|
||||||
if (toplevel) {
|
if (toplevel) {
|
||||||
toplevel.body = toplevel.body.concat(body);
|
toplevel.body = toplevel.body.concat(body);
|
||||||
|
|||||||
@@ -44,7 +44,7 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
var builtins = function() {
|
var builtins = function() {
|
||||||
var names = [];
|
var names = new Dictionary();
|
||||||
// NaN will be included due to Number.NaN
|
// NaN will be included due to Number.NaN
|
||||||
[
|
[
|
||||||
"null",
|
"null",
|
||||||
@@ -72,16 +72,18 @@ var builtins = function() {
|
|||||||
Object.getOwnPropertyNames(ctor.prototype).map(add);
|
Object.getOwnPropertyNames(ctor.prototype).map(add);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return makePredicate(names);
|
return names;
|
||||||
|
|
||||||
function add(name) {
|
function add(name) {
|
||||||
names.push(name);
|
names.set(name, true);
|
||||||
}
|
}
|
||||||
}();
|
}();
|
||||||
|
|
||||||
function reserve_quoted_keys(ast, reserved) {
|
function reserve_quoted_keys(ast, reserved) {
|
||||||
ast.walk(new TreeWalker(function(node) {
|
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);
|
if (node.start && node.start.quote) add(node.key);
|
||||||
} else if (node instanceof AST_Sub) {
|
} else if (node instanceof AST_Sub) {
|
||||||
addStrings(node.property, add);
|
addStrings(node.property, add);
|
||||||
@@ -114,9 +116,9 @@ function mangle_properties(ast, options) {
|
|||||||
reserved: null,
|
reserved: null,
|
||||||
}, true);
|
}, true);
|
||||||
|
|
||||||
var reserved = Object.create(options.builtins ? null : builtins);
|
var reserved = options.builtins ? new Dictionary() : builtins.clone();
|
||||||
if (Array.isArray(options.reserved)) options.reserved.forEach(function(name) {
|
if (Array.isArray(options.reserved)) options.reserved.forEach(function(name) {
|
||||||
reserved[name] = true;
|
reserved.set(name, true);
|
||||||
});
|
});
|
||||||
|
|
||||||
var cname = -1;
|
var cname = -1;
|
||||||
@@ -124,7 +126,7 @@ function mangle_properties(ast, options) {
|
|||||||
if (options.cache) {
|
if (options.cache) {
|
||||||
cache = options.cache.props;
|
cache = options.cache.props;
|
||||||
cache.each(function(name) {
|
cache.each(function(name) {
|
||||||
reserved[name] = true;
|
reserved.set(name, true);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
cache = new Dictionary();
|
cache = new Dictionary();
|
||||||
@@ -139,8 +141,8 @@ function mangle_properties(ast, options) {
|
|||||||
var debug_suffix;
|
var debug_suffix;
|
||||||
if (debug) debug_suffix = options.debug === true ? "" : options.debug;
|
if (debug) debug_suffix = options.debug === true ? "" : options.debug;
|
||||||
|
|
||||||
var names_to_mangle = Object.create(null);
|
var names_to_mangle = new Dictionary();
|
||||||
var unmangleable = Object.create(reserved);
|
var unmangleable = reserved.clone();
|
||||||
|
|
||||||
// step 1: find candidates to mangle
|
// step 1: find candidates to mangle
|
||||||
ast.walk(new TreeWalker(function(node) {
|
ast.walk(new TreeWalker(function(node) {
|
||||||
@@ -163,6 +165,8 @@ function mangle_properties(ast, options) {
|
|||||||
addStrings(node.args[0], add);
|
addStrings(node.args[0], add);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
} else if (node instanceof AST_ClassProperty) {
|
||||||
|
if (typeof node.key == "string") add(node.key);
|
||||||
} else if (node instanceof AST_Dot) {
|
} else if (node instanceof AST_Dot) {
|
||||||
add(node.property);
|
add(node.property);
|
||||||
} else if (node instanceof AST_ObjectProperty) {
|
} else if (node instanceof AST_ObjectProperty) {
|
||||||
@@ -193,6 +197,8 @@ function mangle_properties(ast, options) {
|
|||||||
mangleStrings(node.args[0]);
|
mangleStrings(node.args[0]);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
} else if (node instanceof AST_ClassProperty) {
|
||||||
|
if (typeof node.key == "string") node.key = mangle(node.key);
|
||||||
} else if (node instanceof AST_Dot) {
|
} else if (node instanceof AST_Dot) {
|
||||||
node.property = mangle(node.property);
|
node.property = mangle(node.property);
|
||||||
} else if (node instanceof AST_ObjectProperty) {
|
} else if (node instanceof AST_ObjectProperty) {
|
||||||
@@ -205,26 +211,24 @@ function mangle_properties(ast, options) {
|
|||||||
// only function declarations after this line
|
// only function declarations after this line
|
||||||
|
|
||||||
function can_mangle(name) {
|
function can_mangle(name) {
|
||||||
if (unmangleable[name]) return false;
|
if (unmangleable.has(name)) return false;
|
||||||
if (/^-?[0-9]+(\.[0-9]+)?(e[+-][0-9]+)?$/.test(name)) return false;
|
if (/^-?[0-9]+(\.[0-9]+)?(e[+-][0-9]+)?$/.test(name)) return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
function should_mangle(name) {
|
function should_mangle(name) {
|
||||||
if (reserved[name]) return false;
|
if (reserved.has(name)) return false;
|
||||||
if (regex && !regex.test(name)) return false;
|
if (regex && !regex.test(name)) return false;
|
||||||
return cache.has(name) || names_to_mangle[name];
|
return cache.has(name) || names_to_mangle.has(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
function add(name) {
|
function add(name) {
|
||||||
if (can_mangle(name)) names_to_mangle[name] = true;
|
if (can_mangle(name)) names_to_mangle.set(name, true);
|
||||||
if (!should_mangle(name)) unmangleable[name] = true;
|
if (!should_mangle(name)) unmangleable.set(name, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
function mangle(name) {
|
function mangle(name) {
|
||||||
if (!should_mangle(name)) {
|
if (!should_mangle(name)) return name;
|
||||||
return name;
|
|
||||||
}
|
|
||||||
var mangled = cache.get(name);
|
var mangled = cache.get(name);
|
||||||
if (!mangled) {
|
if (!mangled) {
|
||||||
if (debug) {
|
if (debug) {
|
||||||
@@ -236,6 +240,7 @@ function mangle_properties(ast, options) {
|
|||||||
if (!mangled) do {
|
if (!mangled) do {
|
||||||
mangled = base54(++cname);
|
mangled = base54(++cname);
|
||||||
} while (!can_mangle(mangled));
|
} while (!can_mangle(mangled));
|
||||||
|
if (/^#/.test(name)) mangled = "#" + mangled;
|
||||||
cache.set(name, mangled);
|
cache.set(name, mangled);
|
||||||
}
|
}
|
||||||
return mangled;
|
return mangled;
|
||||||
|
|||||||
193
lib/scope.js
193
lib/scope.js
@@ -44,9 +44,9 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
function SymbolDef(id, scope, orig, init) {
|
function SymbolDef(id, scope, orig, init) {
|
||||||
|
this._bits = 0;
|
||||||
|
this.defun = undefined;
|
||||||
this.eliminated = 0;
|
this.eliminated = 0;
|
||||||
this.exported = false;
|
|
||||||
this.global = false;
|
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.init = init;
|
this.init = init;
|
||||||
this.mangled_name = null;
|
this.mangled_name = null;
|
||||||
@@ -54,8 +54,8 @@ function SymbolDef(id, scope, orig, init) {
|
|||||||
this.orig = [ orig ];
|
this.orig = [ orig ];
|
||||||
this.references = [];
|
this.references = [];
|
||||||
this.replaced = 0;
|
this.replaced = 0;
|
||||||
|
this.safe_ids = undefined;
|
||||||
this.scope = scope;
|
this.scope = scope;
|
||||||
this.undeclared = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SymbolDef.prototype = {
|
SymbolDef.prototype = {
|
||||||
@@ -80,27 +80,47 @@ SymbolDef.prototype = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
redefined: function() {
|
redefined: function() {
|
||||||
var scope = this.defun;
|
var self = this;
|
||||||
|
var scope = self.defun;
|
||||||
if (!scope) return;
|
if (!scope) return;
|
||||||
var name = this.name;
|
var name = self.name;
|
||||||
var def = scope.variables.get(name)
|
var def = scope.variables.get(name)
|
||||||
|| scope instanceof AST_Toplevel && scope.globals.get(name)
|
|| scope instanceof AST_Toplevel && scope.globals.get(name)
|
||||||
|| this.orig[0] instanceof AST_SymbolConst && find_if(function(def) {
|
|| self.orig[0] instanceof AST_SymbolConst && find_if(function(def) {
|
||||||
return def.name == name;
|
return def.name == name;
|
||||||
}, scope.enclosed);
|
}, scope.enclosed);
|
||||||
if (def && def !== this) return def.redefined() || def;
|
if (def && def !== self) return def.redefined() || def;
|
||||||
},
|
},
|
||||||
unmangleable: function(options) {
|
unmangleable: function(options) {
|
||||||
return this.global && !options.toplevel
|
if (this.exported) return true;
|
||||||
|| this.exported
|
if (this.undeclared) return true;
|
||||||
|| this.undeclared
|
if (!options.eval && this.scope.pinned()) return true;
|
||||||
|| !options.eval && this.scope.pinned()
|
if (options.keep_fargs && is_funarg(this)) return true;
|
||||||
|| options.keep_fnames
|
if (options.keep_fnames) {
|
||||||
&& (this.orig[0] instanceof AST_SymbolLambda
|
var sym = this.orig[0];
|
||||||
|| this.orig[0] instanceof AST_SymbolDefun);
|
if (sym instanceof AST_SymbolClass) return true;
|
||||||
|
if (sym instanceof AST_SymbolDefClass) return true;
|
||||||
|
if (sym instanceof AST_SymbolDefun) return true;
|
||||||
|
if (sym instanceof AST_SymbolLambda) return true;
|
||||||
|
}
|
||||||
|
if (!options.toplevel && this.global) return true;
|
||||||
|
return false;
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
DEF_BITPROPS(SymbolDef, [
|
||||||
|
"const_redefs",
|
||||||
|
"cross_loop",
|
||||||
|
"direct_access",
|
||||||
|
"exported",
|
||||||
|
"global",
|
||||||
|
"undeclared",
|
||||||
|
]);
|
||||||
|
|
||||||
|
function is_funarg(def) {
|
||||||
|
return def.orig[0] instanceof AST_SymbolFunarg || def.orig[1] instanceof AST_SymbolFunarg;
|
||||||
|
}
|
||||||
|
|
||||||
var unary_side_effects = makePredicate("delete ++ --");
|
var unary_side_effects = makePredicate("delete ++ --");
|
||||||
|
|
||||||
function is_lhs(node, parent) {
|
function is_lhs(node, parent) {
|
||||||
@@ -115,7 +135,7 @@ function is_lhs(node, parent) {
|
|||||||
AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
|
AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
|
||||||
options = defaults(options, {
|
options = defaults(options, {
|
||||||
cache: null,
|
cache: null,
|
||||||
ie8: false,
|
ie: false,
|
||||||
});
|
});
|
||||||
|
|
||||||
// pass 1: setup scope chaining and handle definitions
|
// pass 1: setup scope chaining and handle definitions
|
||||||
@@ -202,20 +222,17 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
|
|||||||
} else if (node instanceof AST_SymbolDefun) {
|
} else if (node instanceof AST_SymbolDefun) {
|
||||||
var def = defun.def_function(node, tw.parent());
|
var def = defun.def_function(node, tw.parent());
|
||||||
if (exported) def.exported = true;
|
if (exported) def.exported = true;
|
||||||
entangle(defun, scope);
|
|
||||||
} else if (node instanceof AST_SymbolFunarg) {
|
} else if (node instanceof AST_SymbolFunarg) {
|
||||||
defun.def_variable(node);
|
defun.def_variable(node);
|
||||||
entangle(defun, scope);
|
|
||||||
} else if (node instanceof AST_SymbolLambda) {
|
} else if (node instanceof AST_SymbolLambda) {
|
||||||
var def = defun.def_function(node, node.name == "arguments" ? undefined : defun);
|
var def = defun.def_function(node, node.name == "arguments" ? undefined : defun);
|
||||||
if (options.ie8) def.defun = defun.parent_scope.resolve();
|
if (options.ie && node.name != "arguments") def.defun = defun.parent_scope.resolve();
|
||||||
} else if (node instanceof AST_SymbolLet) {
|
} else if (node instanceof AST_SymbolLet) {
|
||||||
var def = scope.def_variable(node);
|
var def = scope.def_variable(node);
|
||||||
if (exported) def.exported = true;
|
if (exported) def.exported = true;
|
||||||
} else if (node instanceof AST_SymbolVar) {
|
} else if (node instanceof AST_SymbolVar) {
|
||||||
var def = defun.def_variable(node, node instanceof AST_SymbolImport ? undefined : null);
|
var def = defun.def_variable(node, node instanceof AST_SymbolImport ? undefined : null);
|
||||||
if (exported) def.exported = true;
|
if (exported) def.exported = true;
|
||||||
entangle(defun, scope);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function walk_scope(descend) {
|
function walk_scope(descend) {
|
||||||
@@ -228,16 +245,6 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
|
|||||||
scope = save_scope;
|
scope = save_scope;
|
||||||
defun = save_defun;
|
defun = save_defun;
|
||||||
}
|
}
|
||||||
|
|
||||||
function entangle(defun, scope) {
|
|
||||||
if (defun === scope) return;
|
|
||||||
node.mark_enclosed(options);
|
|
||||||
var def = scope.find_variable(node.name);
|
|
||||||
if (node.thedef === def) return;
|
|
||||||
node.thedef = def;
|
|
||||||
def.orig.push(node);
|
|
||||||
node.mark_enclosed(options);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
self.make_def = function(orig, init) {
|
self.make_def = function(orig, init) {
|
||||||
return new SymbolDef(++next_def_id, this, orig, init);
|
return new SymbolDef(++next_def_id, this, orig, init);
|
||||||
@@ -258,6 +265,7 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
|
|||||||
}
|
}
|
||||||
if (node instanceof AST_Lambda) {
|
if (node instanceof AST_Lambda) {
|
||||||
in_arg.push(node);
|
in_arg.push(node);
|
||||||
|
if (node.name) node.name.walk(tw);
|
||||||
node.argnames.forEach(function(argname) {
|
node.argnames.forEach(function(argname) {
|
||||||
argname.walk(tw);
|
argname.walk(tw);
|
||||||
});
|
});
|
||||||
@@ -271,17 +279,29 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (node instanceof AST_SymbolDeclaration) {
|
if (node instanceof AST_SymbolDeclaration) {
|
||||||
|
var def = node.definition();
|
||||||
|
def.preinit = def.references.length;
|
||||||
if (node instanceof AST_SymbolCatch) {
|
if (node instanceof AST_SymbolCatch) {
|
||||||
// ensure mangling works if `catch` reuses a scope variable
|
// ensure mangling works if `catch` reuses a scope variable
|
||||||
var def = node.definition().redefined();
|
var redef = def.redefined();
|
||||||
if (def) for (var s = node.scope; s; s = s.parent_scope) {
|
if (redef) for (var s = node.scope; s; s = s.parent_scope) {
|
||||||
push_uniq(s.enclosed, def);
|
push_uniq(s.enclosed, redef);
|
||||||
if (s === def.scope) break;
|
if (s === redef.scope) break;
|
||||||
}
|
}
|
||||||
} else if (node instanceof AST_SymbolConst) {
|
} else if (node instanceof AST_SymbolConst) {
|
||||||
// ensure compression works if `const` reuses a scope variable
|
// ensure compression works if `const` reuses a scope variable
|
||||||
var redef = node.definition().redefined();
|
var redef = def.redefined();
|
||||||
if (redef) redef.const_redefs = true;
|
if (redef) redef.const_redefs = true;
|
||||||
|
} else if (def.scope !== node.scope && (node instanceof AST_SymbolDefun
|
||||||
|
|| node instanceof AST_SymbolFunarg
|
||||||
|
|| node instanceof AST_SymbolVar)) {
|
||||||
|
node.mark_enclosed(options);
|
||||||
|
var redef = node.scope.find_variable(node.name);
|
||||||
|
if (node.thedef !== redef) {
|
||||||
|
node.thedef = redef;
|
||||||
|
redef.orig.push(node);
|
||||||
|
node.mark_enclosed(options);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (node.name != "arguments") return true;
|
if (node.name != "arguments") return true;
|
||||||
var parent = node instanceof AST_SymbolVar && tw.parent();
|
var parent = node instanceof AST_SymbolVar && tw.parent();
|
||||||
@@ -346,7 +366,7 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
|
|||||||
self.walk(tw);
|
self.walk(tw);
|
||||||
|
|
||||||
// pass 3: fix up any scoping issue with IE8
|
// pass 3: fix up any scoping issue with IE8
|
||||||
if (options.ie8) self.walk(new TreeWalker(function(node) {
|
if (options.ie) self.walk(new TreeWalker(function(node) {
|
||||||
if (node instanceof AST_SymbolCatch) {
|
if (node instanceof AST_SymbolCatch) {
|
||||||
var scope = node.thedef.defun;
|
var scope = node.thedef.defun;
|
||||||
if (scope.name instanceof AST_SymbolLambda && scope.name.name == node.name) {
|
if (scope.name instanceof AST_SymbolLambda && scope.name.name == node.name) {
|
||||||
@@ -358,7 +378,7 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
|
|||||||
if (node instanceof AST_SymbolLambda) {
|
if (node instanceof AST_SymbolLambda) {
|
||||||
var def = node.thedef;
|
var def = node.thedef;
|
||||||
if (!redefine(node, node.scope.parent_scope.resolve())) {
|
if (!redefine(node, node.scope.parent_scope.resolve())) {
|
||||||
delete def.defun;
|
def.defun = undefined;
|
||||||
} else if (typeof node.thedef.init !== "undefined") {
|
} else if (typeof node.thedef.init !== "undefined") {
|
||||||
node.thedef.init = false;
|
node.thedef.init = false;
|
||||||
} else if (def.init) {
|
} else if (def.init) {
|
||||||
@@ -392,13 +412,14 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
|
|||||||
} else {
|
} else {
|
||||||
new_def = scope.def_variable(node);
|
new_def = scope.def_variable(node);
|
||||||
}
|
}
|
||||||
|
if (new_def.undeclared) self.variables.set(name, new_def);
|
||||||
|
if (name == "arguments" && is_arguments(old_def) && node instanceof AST_SymbolLambda) return true;
|
||||||
old_def.defun = new_def.scope;
|
old_def.defun = new_def.scope;
|
||||||
old_def.forEach(function(node) {
|
old_def.forEach(function(node) {
|
||||||
node.redef = old_def;
|
node.redef = old_def;
|
||||||
node.thedef = new_def;
|
node.thedef = new_def;
|
||||||
node.reference(options);
|
node.reference(options);
|
||||||
});
|
});
|
||||||
if (new_def.undeclared) self.variables.set(name, new_def);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -459,9 +480,12 @@ AST_Symbol.DEFMETHOD("mark_enclosed", function(options) {
|
|||||||
for (var s = this.scope; s; s = s.parent_scope) {
|
for (var s = this.scope; s; s = s.parent_scope) {
|
||||||
push_uniq(s.enclosed, def);
|
push_uniq(s.enclosed, def);
|
||||||
if (!options) {
|
if (!options) {
|
||||||
delete s._var_names;
|
s._var_names = undefined;
|
||||||
} else if (options.keep_fnames) {
|
} else {
|
||||||
s.functions.each(function(d) {
|
if (options.keep_fargs && s instanceof AST_Lambda) s.each_argname(function(arg) {
|
||||||
|
push_uniq(def.scope.enclosed, arg.definition());
|
||||||
|
});
|
||||||
|
if (options.keep_fnames) s.functions.each(function(d) {
|
||||||
push_uniq(def.scope.enclosed, d);
|
push_uniq(def.scope.enclosed, d);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -504,12 +528,12 @@ function names_in_use(scope, options) {
|
|||||||
if (!names) {
|
if (!names) {
|
||||||
scope.cname = -1;
|
scope.cname = -1;
|
||||||
scope.cname_holes = [];
|
scope.cname_holes = [];
|
||||||
scope.names_in_use = names = Object.create(null);
|
scope.names_in_use = names = new Dictionary();
|
||||||
var cache = options.cache && options.cache.props;
|
var cache = options.cache && options.cache.props;
|
||||||
scope.enclosed.forEach(function(def) {
|
scope.enclosed.forEach(function(def) {
|
||||||
if (def.unmangleable(options)) names[def.name] = true;
|
if (def.unmangleable(options)) names.set(def.name, true);
|
||||||
if (def.global && cache && cache.has(def.name)) {
|
if (def.global && cache && cache.has(def.name)) {
|
||||||
names[cache.get(def.name)] = true;
|
names.set(cache.get(def.name), true);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -520,34 +544,33 @@ function next_mangled_name(def, options) {
|
|||||||
var scope = def.scope;
|
var scope = def.scope;
|
||||||
var in_use = names_in_use(scope, options);
|
var in_use = names_in_use(scope, options);
|
||||||
var holes = scope.cname_holes;
|
var holes = scope.cname_holes;
|
||||||
var names = Object.create(null);
|
var names = new Dictionary();
|
||||||
var scopes = [ scope ];
|
var scopes = [ scope ];
|
||||||
def.forEach(function(sym) {
|
def.forEach(function(sym) {
|
||||||
var scope = sym.scope;
|
var scope = sym.scope;
|
||||||
do {
|
do {
|
||||||
if (scopes.indexOf(scope) < 0) {
|
if (member(scope, scopes)) break;
|
||||||
for (var name in names_in_use(scope, options)) {
|
names_in_use(scope, options).each(function(marker, name) {
|
||||||
names[name] = true;
|
names.set(name, marker);
|
||||||
}
|
});
|
||||||
scopes.push(scope);
|
scopes.push(scope);
|
||||||
} else break;
|
|
||||||
} while (scope = scope.parent_scope);
|
} while (scope = scope.parent_scope);
|
||||||
});
|
});
|
||||||
var name;
|
var name;
|
||||||
for (var i = 0; i < holes.length; i++) {
|
for (var i = 0; i < holes.length; i++) {
|
||||||
name = base54(holes[i]);
|
name = base54(holes[i]);
|
||||||
if (names[name]) continue;
|
if (names.has(name)) continue;
|
||||||
holes.splice(i, 1);
|
holes.splice(i, 1);
|
||||||
in_use[name] = true;
|
in_use.set(name, true);
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
while (true) {
|
while (true) {
|
||||||
name = base54(++scope.cname);
|
name = base54(++scope.cname);
|
||||||
if (in_use[name] || RESERVED_WORDS[name] || options.reserved.has[name]) continue;
|
if (in_use.has(name) || RESERVED_WORDS[name] || options.reserved.has[name]) continue;
|
||||||
if (!names[name]) break;
|
if (!names.has(name)) break;
|
||||||
holes.push(scope.cname);
|
holes.push(scope.cname);
|
||||||
}
|
}
|
||||||
in_use[name] = true;
|
in_use.set(name, true);
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -566,7 +589,8 @@ AST_Symbol.DEFMETHOD("definition", function() {
|
|||||||
function _default_mangler_options(options) {
|
function _default_mangler_options(options) {
|
||||||
options = defaults(options, {
|
options = defaults(options, {
|
||||||
eval : false,
|
eval : false,
|
||||||
ie8 : false,
|
ie : false,
|
||||||
|
keep_fargs : false,
|
||||||
keep_fnames : false,
|
keep_fnames : false,
|
||||||
reserved : [],
|
reserved : [],
|
||||||
toplevel : false,
|
toplevel : false,
|
||||||
@@ -574,32 +598,30 @@ function _default_mangler_options(options) {
|
|||||||
webkit : false,
|
webkit : false,
|
||||||
});
|
});
|
||||||
if (!Array.isArray(options.reserved)) options.reserved = [];
|
if (!Array.isArray(options.reserved)) options.reserved = [];
|
||||||
// Never mangle arguments
|
// Never mangle `arguments`
|
||||||
push_uniq(options.reserved, "arguments");
|
push_uniq(options.reserved, "arguments");
|
||||||
options.reserved.has = makePredicate(options.reserved);
|
options.reserved.has = makePredicate(options.reserved);
|
||||||
return options;
|
return options;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We only need to mangle declaration nodes. Special logic wired into the code
|
||||||
|
// generator will display the mangled name if it is present (and for
|
||||||
|
// `AST_SymbolRef`s it will use the mangled name of the `AST_SymbolDeclaration`
|
||||||
|
// that it points to).
|
||||||
AST_Toplevel.DEFMETHOD("mangle_names", function(options) {
|
AST_Toplevel.DEFMETHOD("mangle_names", function(options) {
|
||||||
options = _default_mangler_options(options);
|
options = _default_mangler_options(options);
|
||||||
|
|
||||||
// We only need to mangle declaration nodes. Special logic wired
|
|
||||||
// into the code generator will display the mangled name if it's
|
|
||||||
// present (and for AST_SymbolRef-s it'll use the mangled name of
|
|
||||||
// the AST_SymbolDeclaration that it points to).
|
|
||||||
var lname = -1;
|
|
||||||
|
|
||||||
if (options.cache && options.cache.props) {
|
if (options.cache && options.cache.props) {
|
||||||
var mangled_names = names_in_use(this, options);
|
var mangled_names = names_in_use(this, options);
|
||||||
options.cache.props.each(function(mangled_name) {
|
options.cache.props.each(function(mangled_name) {
|
||||||
mangled_names[mangled_name] = true;
|
mangled_names.set(mangled_name, true);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
var cutoff = 36;
|
||||||
|
var lname = -1;
|
||||||
var redefined = [];
|
var redefined = [];
|
||||||
var tw = new TreeWalker(function(node, descend) {
|
var tw = new TreeWalker(function(node, descend) {
|
||||||
if (node instanceof AST_LabeledStatement) {
|
if (node instanceof AST_LabeledStatement) {
|
||||||
// lname is incremented when we get to the AST_Label
|
// `lname` is incremented when we get to the `AST_Label`
|
||||||
var save_nesting = lname;
|
var save_nesting = lname;
|
||||||
descend();
|
descend();
|
||||||
if (!options.v8 || !in_label(tw)) lname = save_nesting;
|
if (!options.v8 || !in_label(tw)) lname = save_nesting;
|
||||||
@@ -621,9 +643,9 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options) {
|
|||||||
});
|
});
|
||||||
}, true);
|
}, true);
|
||||||
}
|
}
|
||||||
node.to_mangle = [];
|
var to_mangle = node.to_mangle = [];
|
||||||
node.variables.each(function(def) {
|
node.variables.each(function(def) {
|
||||||
if (!defer_redef(def)) node.to_mangle.push(def);
|
if (!defer_redef(def)) to_mangle.push(def);
|
||||||
});
|
});
|
||||||
descend();
|
descend();
|
||||||
if (options.cache && node instanceof AST_Toplevel) {
|
if (options.cache && node instanceof AST_Toplevel) {
|
||||||
@@ -634,7 +656,23 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options) {
|
|||||||
sym.scope = node;
|
sym.scope = node;
|
||||||
sym.reference(options);
|
sym.reference(options);
|
||||||
}
|
}
|
||||||
node.to_mangle.forEach(mangle);
|
if (to_mangle.length > cutoff) {
|
||||||
|
var indices = to_mangle.map(function(def, index) {
|
||||||
|
return index;
|
||||||
|
}).sort(function(i, j) {
|
||||||
|
return to_mangle[j].references.length - to_mangle[i].references.length || i - j;
|
||||||
|
});
|
||||||
|
to_mangle = indices.slice(0, cutoff).sort(function(i, j) {
|
||||||
|
return i - j;
|
||||||
|
}).map(function(index) {
|
||||||
|
return to_mangle[index];
|
||||||
|
}).concat(indices.slice(cutoff).sort(function(i, j) {
|
||||||
|
return i - j;
|
||||||
|
}).map(function(index) {
|
||||||
|
return to_mangle[index];
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
to_mangle.forEach(mangle);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (node instanceof AST_Label) {
|
if (node instanceof AST_Label) {
|
||||||
@@ -796,6 +834,7 @@ var base54 = (function() {
|
|||||||
var leading = init("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_");
|
var leading = init("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_");
|
||||||
var chars, frequency;
|
var chars, frequency;
|
||||||
function reset() {
|
function reset() {
|
||||||
|
chars = null;
|
||||||
frequency = Object.create(freq);
|
frequency = Object.create(freq);
|
||||||
}
|
}
|
||||||
base54.consider = function(str, delta) {
|
base54.consider = function(str, delta) {
|
||||||
@@ -807,19 +846,15 @@ var base54 = (function() {
|
|||||||
return frequency[b] - frequency[a];
|
return frequency[b] - frequency[a];
|
||||||
}
|
}
|
||||||
base54.sort = function() {
|
base54.sort = function() {
|
||||||
chars = leading.sort(compare).concat(digits.sort(compare));
|
chars = leading.sort(compare).concat(digits).sort(compare);
|
||||||
};
|
};
|
||||||
base54.reset = reset;
|
base54.reset = reset;
|
||||||
reset();
|
reset();
|
||||||
function base54(num) {
|
function base54(num) {
|
||||||
var ret = "", base = 54;
|
var ret = leading[num % 54];
|
||||||
num++;
|
for (num = Math.floor(num / 54); --num >= 0; num >>= 6) {
|
||||||
do {
|
ret += chars[num & 0x3F];
|
||||||
num--;
|
}
|
||||||
ret += chars[num % base];
|
|
||||||
num = Math.floor(num / base);
|
|
||||||
base = 64;
|
|
||||||
} while (num > 0);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
return base54;
|
return base54;
|
||||||
|
|||||||
@@ -77,21 +77,23 @@ function vlq_encode(num) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function create_array_map() {
|
function create_array_map() {
|
||||||
var map = Object.create(null);
|
var map = new Dictionary();
|
||||||
var array = [];
|
var array = [];
|
||||||
array.index = function(name) {
|
array.index = function(name) {
|
||||||
if (!HOP(map, name)) {
|
var index = map.get(name);
|
||||||
map[name] = array.length;
|
if (!(index >= 0)) {
|
||||||
|
index = array.length;
|
||||||
array.push(name);
|
array.push(name);
|
||||||
|
map.set(name, index);
|
||||||
}
|
}
|
||||||
return map[name];
|
return index;
|
||||||
};
|
};
|
||||||
return array;
|
return array;
|
||||||
}
|
}
|
||||||
|
|
||||||
function SourceMap(options) {
|
function SourceMap(options) {
|
||||||
var sources = create_array_map();
|
var sources = create_array_map();
|
||||||
var sources_content = options.includeSources && Object.create(null);
|
var sources_content = options.includeSources && new Dictionary();
|
||||||
var names = create_array_map();
|
var names = create_array_map();
|
||||||
var mappings = "";
|
var mappings = "";
|
||||||
if (options.orig) Object.keys(options.orig).forEach(function(name) {
|
if (options.orig) Object.keys(options.orig).forEach(function(name) {
|
||||||
@@ -110,7 +112,7 @@ function SourceMap(options) {
|
|||||||
if (!sources_content || !map.sourcesContent) return;
|
if (!sources_content || !map.sourcesContent) return;
|
||||||
for (var i = 0; i < map.sources.length; i++) {
|
for (var i = 0; i < map.sources.length; i++) {
|
||||||
var content = map.sourcesContent[i];
|
var content = map.sourcesContent[i];
|
||||||
if (content) sources_content[map.sources[i]] = content;
|
if (content) sources_content.set(map.sources[i], content);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
var prev_source;
|
var prev_source;
|
||||||
@@ -144,8 +146,8 @@ function SourceMap(options) {
|
|||||||
add(source, gen_line, gen_col, orig_line, orig_col, name);
|
add(source, gen_line, gen_col, orig_line, orig_col, name);
|
||||||
} : add,
|
} : add,
|
||||||
setSourceContent: sources_content ? function(source, content) {
|
setSourceContent: sources_content ? function(source, content) {
|
||||||
if (!(source in sources_content)) {
|
if (!sources_content.has(source)) {
|
||||||
sources_content[source] = content;
|
sources_content.set(source, content);
|
||||||
}
|
}
|
||||||
} : noop,
|
} : noop,
|
||||||
toString: function() {
|
toString: function() {
|
||||||
@@ -155,7 +157,7 @@ function SourceMap(options) {
|
|||||||
sourceRoot: options.root || undefined,
|
sourceRoot: options.root || undefined,
|
||||||
sources: sources,
|
sources: sources,
|
||||||
sourcesContent: sources_content ? sources.map(function(source) {
|
sourcesContent: sources_content ? sources.map(function(source) {
|
||||||
return sources_content[source] || null;
|
return sources_content.get(source) || null;
|
||||||
}) : undefined,
|
}) : undefined,
|
||||||
names: names,
|
names: names,
|
||||||
mappings: mappings,
|
mappings: mappings,
|
||||||
|
|||||||
102
lib/utils.js
102
lib/utils.js
@@ -55,14 +55,6 @@ function find_if(func, array) {
|
|||||||
for (var i = array.length; --i >= 0;) if (func(array[i])) return array[i];
|
for (var i = array.length; --i >= 0;) if (func(array[i])) return array[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
function repeat_string(str, i) {
|
|
||||||
if (i <= 0) return "";
|
|
||||||
if (i == 1) return str;
|
|
||||||
var d = repeat_string(str, i >> 1);
|
|
||||||
d += d;
|
|
||||||
return i & 1 ? d + str : d;
|
|
||||||
}
|
|
||||||
|
|
||||||
function configure_error_stack(fn) {
|
function configure_error_stack(fn) {
|
||||||
Object.defineProperty(fn.prototype, "stack", {
|
Object.defineProperty(fn.prototype, "stack", {
|
||||||
get: function() {
|
get: function() {
|
||||||
@@ -96,15 +88,6 @@ function defaults(args, defs, croak) {
|
|||||||
return defs;
|
return defs;
|
||||||
}
|
}
|
||||||
|
|
||||||
function merge(obj, ext) {
|
|
||||||
var count = 0;
|
|
||||||
for (var i in ext) if (HOP(ext, i)) {
|
|
||||||
obj[i] = ext[i];
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
|
|
||||||
function noop() {}
|
function noop() {}
|
||||||
function return_false() { return false; }
|
function return_false() { return false; }
|
||||||
function return_true() { return true; }
|
function return_true() { return true; }
|
||||||
@@ -143,7 +126,7 @@ function push_uniq(array, el) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function string_template(text, props) {
|
function string_template(text, props) {
|
||||||
return text.replace(/\{([^}]+)\}/g, function(str, p) {
|
return text.replace(/\{([^{}]+)\}/g, function(str, p) {
|
||||||
var value = props[p];
|
var value = props[p];
|
||||||
return value instanceof AST_Node ? value.print_to_string() : value;
|
return value instanceof AST_Node ? value.print_to_string() : value;
|
||||||
});
|
});
|
||||||
@@ -171,63 +154,80 @@ function all(array, predicate) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function Dictionary() {
|
function Dictionary() {
|
||||||
this._values = Object.create(null);
|
this.values = Object.create(null);
|
||||||
this._size = 0;
|
|
||||||
}
|
}
|
||||||
Dictionary.prototype = {
|
Dictionary.prototype = {
|
||||||
set: function(key, val) {
|
set: function(key, val) {
|
||||||
if (!this.has(key)) ++this._size;
|
if (key == "__proto__") {
|
||||||
this._values["$" + key] = val;
|
this.proto_value = val;
|
||||||
|
} else {
|
||||||
|
this.values[key] = val;
|
||||||
|
}
|
||||||
return this;
|
return this;
|
||||||
},
|
},
|
||||||
add: function(key, val) {
|
add: function(key, val) {
|
||||||
if (this.has(key)) {
|
var list = this.get(key);
|
||||||
this.get(key).push(val);
|
if (list) {
|
||||||
|
list.push(val);
|
||||||
} else {
|
} else {
|
||||||
this.set(key, [ val ]);
|
this.set(key, [ val ]);
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
},
|
},
|
||||||
get: function(key) { return this._values["$" + key] },
|
get: function(key) {
|
||||||
|
return key == "__proto__" ? this.proto_value : this.values[key];
|
||||||
|
},
|
||||||
del: function(key) {
|
del: function(key) {
|
||||||
if (this.has(key)) {
|
if (key == "__proto__") {
|
||||||
--this._size;
|
delete this.proto_value;
|
||||||
delete this._values["$" + key];
|
} else {
|
||||||
|
delete this.values[key];
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
},
|
},
|
||||||
has: function(key) { return ("$" + key) in this._values },
|
has: function(key) {
|
||||||
|
return key == "__proto__" ? "proto_value" in this : key in this.values;
|
||||||
|
},
|
||||||
all: function(predicate) {
|
all: function(predicate) {
|
||||||
for (var i in this._values)
|
for (var i in this.values)
|
||||||
if (!predicate(this._values[i], i.substr(1)))
|
if (!predicate(this.values[i], i)) return false;
|
||||||
return false;
|
if ("proto_value" in this && !predicate(this.proto_value, "__proto__")) return false;
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
each: function(f) {
|
each: function(f) {
|
||||||
for (var i in this._values)
|
for (var i in this.values)
|
||||||
f(this._values[i], i.substr(1));
|
f(this.values[i], i);
|
||||||
|
if ("proto_value" in this) f(this.proto_value, "__proto__");
|
||||||
},
|
},
|
||||||
size: function() {
|
size: function() {
|
||||||
return this._size;
|
return Object.keys(this.values).length + ("proto_value" in this);
|
||||||
},
|
},
|
||||||
map: function(f) {
|
map: function(f) {
|
||||||
var ret = [];
|
var ret = [];
|
||||||
for (var i in this._values)
|
for (var i in this.values)
|
||||||
ret.push(f(this._values[i], i.substr(1)));
|
ret.push(f(this.values[i], i));
|
||||||
|
if ("proto_value" in this) ret.push(f(this.proto_value, "__proto__"));
|
||||||
return ret;
|
return ret;
|
||||||
},
|
},
|
||||||
clone: function() {
|
clone: function() {
|
||||||
var ret = new Dictionary();
|
var ret = new Dictionary();
|
||||||
for (var i in this._values)
|
this.each(function(value, i) {
|
||||||
ret._values[i] = this._values[i];
|
ret.set(i, value);
|
||||||
ret._size = this._size;
|
});
|
||||||
return ret;
|
return ret;
|
||||||
},
|
},
|
||||||
toObject: function() { return this._values }
|
toObject: function() {
|
||||||
|
var obj = {};
|
||||||
|
this.each(function(value, i) {
|
||||||
|
obj["$" + i] = value;
|
||||||
|
});
|
||||||
|
return obj;
|
||||||
|
},
|
||||||
};
|
};
|
||||||
Dictionary.fromObject = function(obj) {
|
Dictionary.fromObject = function(obj) {
|
||||||
var dict = new Dictionary();
|
var dict = new Dictionary();
|
||||||
dict._size = merge(dict._values, obj);
|
for (var i in obj)
|
||||||
|
if (HOP(obj, i)) dict.set(i.slice(1), obj[i]);
|
||||||
return dict;
|
return dict;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -265,3 +265,21 @@ function first_in_statement(stack, arrow, export_default) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function DEF_BITPROPS(ctor, props) {
|
||||||
|
if (props.length > 31) throw new Error("Too many properties: " + props.length + "\n" + props.join(", "));
|
||||||
|
props.forEach(function(name, pos) {
|
||||||
|
var mask = 1 << pos;
|
||||||
|
Object.defineProperty(ctor.prototype, name, {
|
||||||
|
get: function() {
|
||||||
|
return !!(this._bits & mask);
|
||||||
|
},
|
||||||
|
set: function(val) {
|
||||||
|
if (val)
|
||||||
|
this._bits |= mask;
|
||||||
|
else
|
||||||
|
this._bits &= ~mask;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"description": "JavaScript parser, mangler/compressor and beautifier toolkit",
|
"description": "JavaScript parser, mangler/compressor and beautifier toolkit",
|
||||||
"author": "Mihai Bazon <mihai.bazon@gmail.com> (http://lisperator.net/)",
|
"author": "Mihai Bazon <mihai.bazon@gmail.com> (http://lisperator.net/)",
|
||||||
"license": "BSD-2-Clause",
|
"license": "BSD-2-Clause",
|
||||||
"version": "3.13.1",
|
"version": "3.15.4",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.8.0"
|
"node": ">=0.8.0"
|
||||||
},
|
},
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
"LICENSE"
|
"LICENSE"
|
||||||
],
|
],
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"acorn": "~7.1.0",
|
"acorn": "~8.2.1",
|
||||||
"semver": "~6.3.0"
|
"semver": "~6.3.0"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -16,7 +16,8 @@ var urls = [
|
|||||||
"https://code.angularjs.org/1.7.8/angular.js",
|
"https://code.angularjs.org/1.7.8/angular.js",
|
||||||
"https://unpkg.com/mathjs@6.2.3/dist/math.js",
|
"https://unpkg.com/mathjs@6.2.3/dist/math.js",
|
||||||
"https://unpkg.com/react@15.3.2/dist/react.js",
|
"https://unpkg.com/react@15.3.2/dist/react.js",
|
||||||
"https://cdnjs.cloudflare.com/ajax/libs/d3/5.12.0/d3.js",
|
"https://cdnjs.cloudflare.com/ajax/libs/d3/6.7.0/d3.js",
|
||||||
|
"https://cdnjs.cloudflare.com/ajax/libs/antd/4.18.7/antd.js",
|
||||||
"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.js",
|
"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.js",
|
||||||
"https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js",
|
"https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js",
|
||||||
"https://cdnjs.cloudflare.com/ajax/libs/ember.js/2.12.2/ember.prod.js",
|
"https://cdnjs.cloudflare.com/ajax/libs/ember.js/2.12.2/ember.prod.js",
|
||||||
|
|||||||
@@ -183,13 +183,11 @@ function parse_test(file) {
|
|||||||
function reminify(orig_options, input_code, input_formatted, stdout) {
|
function reminify(orig_options, input_code, input_formatted, stdout) {
|
||||||
for (var i = 0; i < minify_options.length; i++) {
|
for (var i = 0; i < minify_options.length; i++) {
|
||||||
var options = JSON.parse(minify_options[i]);
|
var options = JSON.parse(minify_options[i]);
|
||||||
if (options.compress) [
|
[
|
||||||
"keep_fargs",
|
"keep_fargs",
|
||||||
"keep_fnames",
|
"keep_fnames",
|
||||||
].forEach(function(name) {
|
].forEach(function(name) {
|
||||||
if (name in orig_options) {
|
if (name in orig_options) options[name] = orig_options[name];
|
||||||
options.compress[name] = orig_options[name];
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
var options_formatted = JSON.stringify(options, null, 4);
|
var options_formatted = JSON.stringify(options, null, 4);
|
||||||
options.validate = true;
|
options.validate = true;
|
||||||
@@ -262,6 +260,7 @@ function test_case(test) {
|
|||||||
var input = to_toplevel(test.input, test.mangle);
|
var input = to_toplevel(test.input, test.mangle);
|
||||||
var input_code = make_code(input);
|
var input_code = make_code(input);
|
||||||
var input_formatted = make_code(test.input, {
|
var input_formatted = make_code(test.input, {
|
||||||
|
annotations: true,
|
||||||
beautify: true,
|
beautify: true,
|
||||||
comments: "all",
|
comments: "all",
|
||||||
keep_quoted_props: true,
|
keep_quoted_props: true,
|
||||||
|
|||||||
474
test/compress/annotations.js
Normal file
474
test/compress/annotations.js
Normal file
@@ -0,0 +1,474 @@
|
|||||||
|
issue_2629_1: {
|
||||||
|
options = {
|
||||||
|
annotations: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
comments: "all",
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
/*@__PURE__*/ a();
|
||||||
|
/*@__PURE__*/ (b());
|
||||||
|
(/*@__PURE__*/ c)();
|
||||||
|
(/*@__PURE__*/ d());
|
||||||
|
}
|
||||||
|
expect_exact: "c();"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2629_2: {
|
||||||
|
options = {
|
||||||
|
annotations: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
comments: "all",
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
/*@__PURE__*/ a(1)(2)(3);
|
||||||
|
/*@__PURE__*/ (b(1))(2)(3);
|
||||||
|
/*@__PURE__*/ (c(1)(2))(3);
|
||||||
|
/*@__PURE__*/ (d(1)(2)(3));
|
||||||
|
(/*@__PURE__*/ e)(1)(2)(3);
|
||||||
|
(/*@__PURE__*/ f(1))(2)(3);
|
||||||
|
(/*@__PURE__*/ g(1)(2))(3);
|
||||||
|
(/*@__PURE__*/ h(1)(2)(3));
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"e(1)(2)(3);",
|
||||||
|
"f(1)(2)(3);",
|
||||||
|
"g(1)(2)(3);",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2629_3: {
|
||||||
|
options = {
|
||||||
|
annotations: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
comments: "all",
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
/*@__PURE__*/ a.x(1).y(2).z(3);
|
||||||
|
/*@__PURE__*/ (b.x)(1).y(2).z(3);
|
||||||
|
/*@__PURE__*/ (c.x(1)).y(2).z(3);
|
||||||
|
/*@__PURE__*/ (d.x(1).y)(2).z(3);
|
||||||
|
/*@__PURE__*/ (e.x(1).y(2)).z(3);
|
||||||
|
/*@__PURE__*/ (f.x(1).y(2).z)(3);
|
||||||
|
/*@__PURE__*/ (g.x(1).y(2).z(3));
|
||||||
|
(/*@__PURE__*/ h).x(1).y(2).z(3);
|
||||||
|
(/*@__PURE__*/ i.x)(1).y(2).z(3);
|
||||||
|
(/*@__PURE__*/ j.x(1)).y(2).z(3);
|
||||||
|
(/*@__PURE__*/ k.x(1).y)(2).z(3);
|
||||||
|
(/*@__PURE__*/ l.x(1).y(2)).z(3);
|
||||||
|
(/*@__PURE__*/ m.x(1).y(2).z)(3);
|
||||||
|
(/*@__PURE__*/ n.x(1).y(2).z(3));
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"h.x(1).y(2).z(3);",
|
||||||
|
"i.x(1).y(2).z(3);",
|
||||||
|
"j.x(1).y(2).z(3);",
|
||||||
|
"k.x(1).y(2).z(3);",
|
||||||
|
"l.x(1).y(2).z(3);",
|
||||||
|
"m.x(1).y(2).z(3);",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2629_4: {
|
||||||
|
options = {
|
||||||
|
annotations: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(/*@__PURE__*/ x(), y());
|
||||||
|
(w(), /*@__PURE__*/ x(), y());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
y();
|
||||||
|
w(), y();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2629_5: {
|
||||||
|
options = {
|
||||||
|
annotations: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
[ /*@__PURE__*/ x() ];
|
||||||
|
[ /*@__PURE__*/ x(), y() ];
|
||||||
|
[ w(), /*@__PURE__*/ x(), y() ];
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
y();
|
||||||
|
w(), y();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2638: {
|
||||||
|
options = {
|
||||||
|
annotations: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
comments: "all",
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
/*@__PURE__*/(g() || h())(x(), y());
|
||||||
|
(/*@__PURE__*/ (a() || b()))(c(), d());
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"x(),y();",
|
||||||
|
"(a()||b())(c(),d());",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2705_1: {
|
||||||
|
options = {
|
||||||
|
annotations: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
comments: "all",
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
/*@__PURE__*/ new a();
|
||||||
|
/*@__PURE__*/ (new b());
|
||||||
|
new (/*@__PURE__*/ c)();
|
||||||
|
(/*@__PURE__*/ new d());
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"new c;",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2705_2: {
|
||||||
|
options = {
|
||||||
|
annotations: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
comments: "all",
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
/*@__PURE__*/ new a(1)(2)(3);
|
||||||
|
/*@__PURE__*/ new (b(1))(2)(3);
|
||||||
|
/*@__PURE__*/ new (c(1)(2))(3);
|
||||||
|
/*@__PURE__*/ new (d(1)(2)(3));
|
||||||
|
new (/*@__PURE__*/ e)(1)(2)(3);
|
||||||
|
(/*@__PURE__*/ new f(1))(2)(3);
|
||||||
|
(/*@__PURE__*/ new g(1)(2))(3);
|
||||||
|
(/*@__PURE__*/ new h(1)(2)(3));
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"new e(1)(2)(3);",
|
||||||
|
"new f(1)(2)(3);",
|
||||||
|
"new g(1)(2)(3);",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2705_3: {
|
||||||
|
options = {
|
||||||
|
annotations: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
comments: "all",
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
/*@__PURE__*/ new a.x(1).y(2).z(3);
|
||||||
|
/*@__PURE__*/ new (b.x)(1).y(2).z(3);
|
||||||
|
/*@__PURE__*/ new (c.x(1)).y(2).z(3);
|
||||||
|
/*@__PURE__*/ new (d.x(1).y)(2).z(3);
|
||||||
|
/*@__PURE__*/ new (e.x(1).y(2)).z(3);
|
||||||
|
/*@__PURE__*/ new (f.x(1).y(2).z)(3);
|
||||||
|
/*@__PURE__*/ new (g.x(1).y(2).z(3));
|
||||||
|
new (/*@__PURE__*/ h).x(1).y(2).z(3);
|
||||||
|
/* */ new (/*@__PURE__*/ i.x)(1).y(2).z(3);
|
||||||
|
(/*@__PURE__*/ new j.x(1)).y(2).z(3);
|
||||||
|
(/*@__PURE__*/ new k.x(1).y)(2).z(3);
|
||||||
|
(/*@__PURE__*/ new l.x(1).y(2)).z(3);
|
||||||
|
(/*@__PURE__*/ new m.x(1).y(2).z)(3);
|
||||||
|
(/*@__PURE__*/ new n.x(1).y(2).z(3));
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"new h.x(1).y(2).z(3);",
|
||||||
|
"/* */new i.x(1).y(2).z(3);",
|
||||||
|
"new j.x(1).y(2).z(3);",
|
||||||
|
"new k.x(1).y(2).z(3);",
|
||||||
|
"new l.x(1).y(2).z(3);",
|
||||||
|
"new m.x(1).y(2).z(3);",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2705_4: {
|
||||||
|
options = {
|
||||||
|
annotations: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(/*@__PURE__*/ new x(), y());
|
||||||
|
(w(), /*@__PURE__*/ new x(), y());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
y();
|
||||||
|
w(), y();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2705_5: {
|
||||||
|
options = {
|
||||||
|
annotations: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
[ /*@__PURE__*/ new x() ];
|
||||||
|
[ /*@__PURE__*/ new x(), y() ];
|
||||||
|
[ w(), /*@__PURE__*/ new x(), y() ];
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
y();
|
||||||
|
w(), y();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2705_6: {
|
||||||
|
options = {
|
||||||
|
annotations: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
comments: "all",
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
/*@__PURE__*/new (g() || h())(x(), y());
|
||||||
|
/* */ new (/*@__PURE__*/ (a() || b()))(c(), d());
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"x(),y();",
|
||||||
|
"/* */new(a()||b())(c(),d());",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3858: {
|
||||||
|
options = {
|
||||||
|
annotations: true,
|
||||||
|
collapse_vars: true,
|
||||||
|
inline: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var f = function(a) {
|
||||||
|
return /*@__PURE__*/ function(b) {
|
||||||
|
console.log(b);
|
||||||
|
}(a);
|
||||||
|
};
|
||||||
|
f("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var f = function(a) {
|
||||||
|
return function() {
|
||||||
|
console.log(a);
|
||||||
|
}();
|
||||||
|
};
|
||||||
|
f("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
inline_pure_call_1: {
|
||||||
|
options = {
|
||||||
|
annotations: true,
|
||||||
|
collapse_vars: true,
|
||||||
|
inline: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var f = function(a) {
|
||||||
|
return /*@__PURE__*/ function(b) {
|
||||||
|
console.log(b);
|
||||||
|
}(a);
|
||||||
|
};
|
||||||
|
f("PASS");
|
||||||
|
}
|
||||||
|
expect: {}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline_pure_call_2: {
|
||||||
|
options = {
|
||||||
|
annotations: true,
|
||||||
|
collapse_vars: true,
|
||||||
|
inline: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var f = function(a) {
|
||||||
|
return /*@__PURE__*/ function(b) {
|
||||||
|
console.log(b);
|
||||||
|
}(a);
|
||||||
|
};
|
||||||
|
var a = f("PASS");
|
||||||
|
}
|
||||||
|
expect: {}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline_pure_call_3: {
|
||||||
|
options = {
|
||||||
|
annotations: true,
|
||||||
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
passes: 2,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var f = function(a) {
|
||||||
|
return /*@__PURE__*/ function(b) {
|
||||||
|
console.log(b);
|
||||||
|
}(a);
|
||||||
|
};
|
||||||
|
var a = f("PASS");
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = function() {
|
||||||
|
console.log("PASS");
|
||||||
|
}();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"PASS",
|
||||||
|
"undefined",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
inline_pure_call_4: {
|
||||||
|
options = {
|
||||||
|
annotations: true,
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = /*@__PURE__*/ function() {
|
||||||
|
return console.log("PASS"), 42;
|
||||||
|
}();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = function() {
|
||||||
|
return console.log("PASS"), 42;
|
||||||
|
}();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"PASS",
|
||||||
|
"42",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
compress_and_output_annotations_enabled: {
|
||||||
|
options = {
|
||||||
|
annotations: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
annotations: true,
|
||||||
|
beautify: true,
|
||||||
|
comments: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var top = /*@__PURE__*/ foo();
|
||||||
|
/*@__PURE__*/ a(1)(2)(3);
|
||||||
|
/*@__PURE__*/ (b(1))(2)(3);
|
||||||
|
/*@__PURE__*/ (c(1)(2))(3);
|
||||||
|
/*@__PURE__*/ (d(1)(2)(3));
|
||||||
|
(/*@__PURE__*/ e)(1)(2)(3);
|
||||||
|
(/*@__PURE__*/ f(1))(2)(3);
|
||||||
|
(/*@__PURE__*/ g(1)(2))(3);
|
||||||
|
(/*@__PURE__*/ h(1)(2)(3));
|
||||||
|
/*@__PURE__*/ l(1).p(2);
|
||||||
|
(/*@__PURE__*/ m(1)).p(2);
|
||||||
|
(/*@__PURE__*/ n(1).p)(2);
|
||||||
|
(/*@__PURE__*/ o(1).p(2));
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"var top = /*@__PURE__*/foo();",
|
||||||
|
"",
|
||||||
|
"e(1)(2)(3);",
|
||||||
|
"",
|
||||||
|
"f(1)(2)(3);",
|
||||||
|
"",
|
||||||
|
"g(1)(2)(3);",
|
||||||
|
"",
|
||||||
|
"m(1).p(2);",
|
||||||
|
"",
|
||||||
|
"n(1).p(2);",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
compress_annotations_disabled_output_annotations_enabled: {
|
||||||
|
options = {
|
||||||
|
annotations: false,
|
||||||
|
evaluate: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
annotations: true,
|
||||||
|
comments: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
/*@__PURE__*/ a(1+2);
|
||||||
|
/*#__PURE__*/ (b(2+3));
|
||||||
|
(/*@__PURE__*/ c)(side_effect);
|
||||||
|
(/*#__PURE__*/ d(effect()));
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"/*@__PURE__*/a(3),",
|
||||||
|
"/*@__PURE__*/b(5),",
|
||||||
|
"c(side_effect),",
|
||||||
|
"/*@__PURE__*/d(effect());",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
compress_and_output_annotations_disabled: {
|
||||||
|
options = {
|
||||||
|
annotations: false,
|
||||||
|
evaluate: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
annotations: false,
|
||||||
|
comments: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
/*@__PURE__*/ a(1+2);
|
||||||
|
/*@__PURE__*/ (b(2+3));
|
||||||
|
(/*@__PURE__*/ c)(side_effect);
|
||||||
|
(/*@__PURE__*/ d(effect()));
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"a(3),",
|
||||||
|
"b(5),",
|
||||||
|
"c(side_effect),",
|
||||||
|
"d(effect());",
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -84,6 +84,7 @@ replace_index_drop_fargs_1: {
|
|||||||
evaluate: true,
|
evaluate: true,
|
||||||
keep_fargs: false,
|
keep_fargs: false,
|
||||||
properties: true,
|
properties: true,
|
||||||
|
reduce_vars: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var arguments = [];
|
var arguments = [];
|
||||||
@@ -119,7 +120,7 @@ replace_index_drop_fargs_1: {
|
|||||||
console.log(b, b, arguments.foo);
|
console.log(b, b, arguments.foo);
|
||||||
})("bar", 42);
|
})("bar", 42);
|
||||||
(function(arguments) {
|
(function(arguments) {
|
||||||
console.log(arguments[1], arguments[1], arguments.foo);
|
console.log("bar"[1], "bar"[1], "bar".foo);
|
||||||
})("bar", 42);
|
})("bar", 42);
|
||||||
(function(argument_0, argument_1) {
|
(function(argument_0, argument_1) {
|
||||||
var arguments;
|
var arguments;
|
||||||
@@ -253,6 +254,25 @@ duplicate_argname: {
|
|||||||
expect_stdout: "bar 42 foo 42 bar"
|
expect_stdout: "bar 42 foo 42 bar"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fraction: {
|
||||||
|
options = {
|
||||||
|
arguments: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
return arguments[0.3];
|
||||||
|
}("FAIL") || "PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function() {
|
||||||
|
return arguments[0.3];
|
||||||
|
}("FAIL") || "PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
issue_3273: {
|
issue_3273: {
|
||||||
options = {
|
options = {
|
||||||
arguments: true,
|
arguments: true,
|
||||||
@@ -649,6 +669,7 @@ issue_3420_1: {
|
|||||||
options = {
|
options = {
|
||||||
arguments: true,
|
arguments: true,
|
||||||
keep_fargs: false,
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(function() {
|
console.log(function() {
|
||||||
@@ -671,6 +692,7 @@ issue_3420_2: {
|
|||||||
options = {
|
options = {
|
||||||
arguments: true,
|
arguments: true,
|
||||||
keep_fargs: false,
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var foo = function() {
|
var foo = function() {
|
||||||
@@ -691,6 +713,7 @@ issue_3420_3: {
|
|||||||
options = {
|
options = {
|
||||||
arguments: true,
|
arguments: true,
|
||||||
keep_fargs: false,
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
"use strict";
|
"use strict";
|
||||||
@@ -713,6 +736,7 @@ issue_3420_4: {
|
|||||||
options = {
|
options = {
|
||||||
arguments: true,
|
arguments: true,
|
||||||
keep_fargs: false,
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
!function() {
|
!function() {
|
||||||
@@ -738,6 +762,7 @@ issue_3420_5: {
|
|||||||
options = {
|
options = {
|
||||||
arguments: true,
|
arguments: true,
|
||||||
keep_fargs: false,
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
"use strict";
|
"use strict";
|
||||||
@@ -765,6 +790,7 @@ issue_3420_6: {
|
|||||||
options = {
|
options = {
|
||||||
arguments: true,
|
arguments: true,
|
||||||
keep_fargs: false,
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(function() {
|
console.log(function() {
|
||||||
@@ -783,6 +809,7 @@ issue_3420_7: {
|
|||||||
options = {
|
options = {
|
||||||
arguments: true,
|
arguments: true,
|
||||||
keep_fargs: false,
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
"use strict";
|
"use strict";
|
||||||
@@ -827,6 +854,7 @@ issue_4291_1: {
|
|||||||
options = {
|
options = {
|
||||||
arguments: true,
|
arguments: true,
|
||||||
keep_fargs: false,
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(function() {
|
console.log(function() {
|
||||||
@@ -847,6 +875,7 @@ issue_4291_2: {
|
|||||||
options = {
|
options = {
|
||||||
arguments: true,
|
arguments: true,
|
||||||
keep_fargs: false,
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var a = function() {
|
var a = function() {
|
||||||
@@ -857,8 +886,8 @@ issue_4291_2: {
|
|||||||
console.log(a[1], a[0], a.length);
|
console.log(a[1], a[0], a.length);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var a = function(argument_0) {
|
var a = function() {
|
||||||
if (argument_0)
|
if (arguments[0])
|
||||||
arguments[1] = "PASS";
|
arguments[1] = "PASS";
|
||||||
return arguments;
|
return arguments;
|
||||||
}(42);
|
}(42);
|
||||||
@@ -871,6 +900,7 @@ issue_4397: {
|
|||||||
options = {
|
options = {
|
||||||
arguments: true,
|
arguments: true,
|
||||||
keep_fargs: false,
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(typeof function() {
|
console.log(typeof function() {
|
||||||
@@ -999,3 +1029,26 @@ issue_4696: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "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"
|
||||||
|
}
|
||||||
|
|||||||
@@ -276,6 +276,7 @@ drop_arguments: {
|
|||||||
options = {
|
options = {
|
||||||
arguments: true,
|
arguments: true,
|
||||||
keep_fargs: false,
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(function() {
|
console.log(function() {
|
||||||
@@ -362,6 +363,28 @@ negate: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
inline_this: {
|
inline_this: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var p = "PASS";
|
||||||
|
console.log({
|
||||||
|
p: "FAIL",
|
||||||
|
q: (() => this.p)(),
|
||||||
|
}.q);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var p = "PASS";
|
||||||
|
console.log({
|
||||||
|
p: "FAIL",
|
||||||
|
q: this.p,
|
||||||
|
}.q);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
dont_inline_this: {
|
||||||
options = {
|
options = {
|
||||||
inline: true,
|
inline: true,
|
||||||
}
|
}
|
||||||
@@ -420,6 +443,7 @@ collapse_value: {
|
|||||||
arrows: true,
|
arrows: true,
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
keep_fargs: false,
|
keep_fargs: false,
|
||||||
|
unsafe: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -484,7 +508,7 @@ drop_value: {
|
|||||||
((a, b) => a + b)(console.log(42));
|
((a, b) => a + b)(console.log(42));
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
((a, b) => {})(console.log(42));
|
void console.log(42);
|
||||||
}
|
}
|
||||||
expect_stdout: "42"
|
expect_stdout: "42"
|
||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
@@ -554,6 +578,75 @@ reduce_iife_3: {
|
|||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
reduce_lambda_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var f = () => {
|
||||||
|
console.log(a, b);
|
||||||
|
};
|
||||||
|
var a = "foo", b = 42;
|
||||||
|
f();
|
||||||
|
b = "bar";
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var f = () => {
|
||||||
|
console.log("foo", b);
|
||||||
|
};
|
||||||
|
var b = 42;
|
||||||
|
f();
|
||||||
|
b = "bar";
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo 42",
|
||||||
|
"foo bar",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
reduce_lambda_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(f, a, b) {
|
||||||
|
f = () => {
|
||||||
|
console.log(a, b);
|
||||||
|
};
|
||||||
|
a = "foo", b = 42;
|
||||||
|
f();
|
||||||
|
b = "bar";
|
||||||
|
f();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(f, a, b) {
|
||||||
|
f = () => {
|
||||||
|
console.log("foo", b);
|
||||||
|
};
|
||||||
|
b = 42;
|
||||||
|
f();
|
||||||
|
b = "bar";
|
||||||
|
f();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo 42",
|
||||||
|
"foo bar",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
single_use_recursive: {
|
single_use_recursive: {
|
||||||
options = {
|
options = {
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
@@ -803,3 +896,125 @@ issue_4687_2: {
|
|||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=4"
|
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"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5251: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(() => {
|
||||||
|
while (console.log(arguments))
|
||||||
|
var arguments = "FAIL";
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(() => {
|
||||||
|
while (console.log(arguments))
|
||||||
|
var arguments = "FAIL";
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5342_1: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
inline: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
for (var a in 0) {
|
||||||
|
(() => {
|
||||||
|
while (1);
|
||||||
|
})(new function(NaN) {
|
||||||
|
a.p;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
console.log(function() {
|
||||||
|
return b;
|
||||||
|
try {
|
||||||
|
b;
|
||||||
|
} catch (e) {
|
||||||
|
var b;
|
||||||
|
}
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
for (var a in 0) {
|
||||||
|
(function(NaN) {
|
||||||
|
a.p;
|
||||||
|
})();
|
||||||
|
while (1);
|
||||||
|
}
|
||||||
|
console.log(b);
|
||||||
|
var b;
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5342_2: {
|
||||||
|
rename = true
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
inline: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
for (var a in 0) {
|
||||||
|
(() => {
|
||||||
|
while (1);
|
||||||
|
})(new function(NaN) {
|
||||||
|
a.p;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
console.log(function() {
|
||||||
|
return b;
|
||||||
|
try {
|
||||||
|
b;
|
||||||
|
} catch (e) {
|
||||||
|
var b;
|
||||||
|
}
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
for (var a in 0) {
|
||||||
|
a.p;
|
||||||
|
while (1);
|
||||||
|
}
|
||||||
|
console.log(c);
|
||||||
|
var c;
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5356: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log((a => a++)(console));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log((a => +a)(console));
|
||||||
|
}
|
||||||
|
expect_stdout: "NaN"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|||||||
@@ -475,3 +475,331 @@ issue_4521: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "42"
|
expect_stdout: "42"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
logical_assignments: {
|
||||||
|
input: {
|
||||||
|
var a = 42, b = null, c;
|
||||||
|
a &&= "foo";
|
||||||
|
b ||= "bar";
|
||||||
|
c ??= "baz";
|
||||||
|
console.log(a, b, c);
|
||||||
|
}
|
||||||
|
expect_exact: 'var a=42,b=null,c;a&&="foo";b||="bar";c??="baz";console.log(a,b,c);'
|
||||||
|
expect_stdout: "foo bar baz"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
logical_collapse_vars_1: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "FAIL", b = false;
|
||||||
|
a = "PASS";
|
||||||
|
b ??= a;
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "FAIL", b = false;
|
||||||
|
a = "PASS";
|
||||||
|
b ??= a;
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
logical_collapse_vars_2: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS";
|
||||||
|
(function(b) {
|
||||||
|
b ||= (a = "FAIL", {});
|
||||||
|
return b;
|
||||||
|
})(console).log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "PASS";
|
||||||
|
(function(b) {
|
||||||
|
return b ||= (a = "FAIL", {});
|
||||||
|
})(console).log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
logical_collapse_vars_3: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 6;
|
||||||
|
a *= 7;
|
||||||
|
a ??= "FAIL";
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 6;
|
||||||
|
a = a * 7 ?? "FAIL";
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
logical_reduce_vars: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS", b = 42;
|
||||||
|
b ??= a = "FAIL";
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "PASS", b = 42;
|
||||||
|
b ??= a = "FAIL";
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
logical_side_effects: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS", b = 42;
|
||||||
|
b ??= a = "FAIL";
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "PASS", b = 42;
|
||||||
|
b ??= a = "FAIL";
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
evaluate_lazy_assignment: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 42;
|
||||||
|
console.log(a &&= "PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4815_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS";
|
||||||
|
42..p &&= a = "FAIL";
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "PASS";
|
||||||
|
42..p &&= a = "FAIL";
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4815_2: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS";
|
||||||
|
42..p &&= a = "FAIL";
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "PASS";
|
||||||
|
42..p &&= a = "FAIL";
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4819: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(void 0 === ([].p &&= 42));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(void 0 === ([].p &&= 42));
|
||||||
|
}
|
||||||
|
expect_stdout: "true"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4827_1: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
A = "FAIL";
|
||||||
|
var a = A, b = "PASS", c;
|
||||||
|
c &&= b = a, console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = A = "FAIL", b = "PASS", c;
|
||||||
|
c &&= b = a, console.log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4827_2: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
inline: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 0, b = "PASS";
|
||||||
|
function f(c) {
|
||||||
|
a++,
|
||||||
|
c &&= b = a;
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 0, b = "PASS";
|
||||||
|
a++,
|
||||||
|
c &&= b = a;
|
||||||
|
var c;
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4827_3: {
|
||||||
|
options = {
|
||||||
|
merge_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 0, b, c;
|
||||||
|
a++;
|
||||||
|
c &&= b = a;
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 0, b, c;
|
||||||
|
a++;
|
||||||
|
c &&= b = a;
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4876: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try {
|
||||||
|
var a = null;
|
||||||
|
var b = a &&= 42;
|
||||||
|
b.p;
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
try {
|
||||||
|
var a = null;
|
||||||
|
var b = a &&= 42;
|
||||||
|
b.p;
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4924_1: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a, b;
|
||||||
|
console.log("PASS");
|
||||||
|
a = function() {};
|
||||||
|
b = function() {}(b ||= a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var b;
|
||||||
|
console.log("PASS");
|
||||||
|
b = void (b ||= function() {});
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4924_2: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
dead_code: true,
|
||||||
|
passes: 2,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a, b;
|
||||||
|
console.log("PASS");
|
||||||
|
a = function() {};
|
||||||
|
b = function() {}(b ||= a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -4,7 +4,7 @@ arithmetic: {
|
|||||||
}
|
}
|
||||||
expect_exact: "console.log((1n+0x2n)*(0o3n- -4n)>>5n-6n);"
|
expect_exact: "console.log((1n+0x2n)*(0o3n- -4n)>>5n-6n);"
|
||||||
expect_stdout: "42n"
|
expect_stdout: "42n"
|
||||||
node_version: ">=10"
|
node_version: ">=10.4.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
minus_dot: {
|
minus_dot: {
|
||||||
@@ -13,7 +13,7 @@ minus_dot: {
|
|||||||
}
|
}
|
||||||
expect_exact: "console.log(typeof-42n.toString(),typeof(-42n).toString());"
|
expect_exact: "console.log(typeof-42n.toString(),typeof(-42n).toString());"
|
||||||
expect_stdout: "number string"
|
expect_stdout: "number string"
|
||||||
node_version: ">=10"
|
node_version: ">=10.4.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
evaluate: {
|
evaluate: {
|
||||||
@@ -28,7 +28,7 @@ evaluate: {
|
|||||||
console.log(0xdeadbeefn.toString(16));
|
console.log(0xdeadbeefn.toString(16));
|
||||||
}
|
}
|
||||||
expect_stdout: "deadbeef"
|
expect_stdout: "deadbeef"
|
||||||
node_version: ">=10"
|
node_version: ">=10.4.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
Number: {
|
Number: {
|
||||||
@@ -42,7 +42,7 @@ Number: {
|
|||||||
console.log(+("" + -0xfeed_dead_beef_badn));
|
console.log(+("" + -0xfeed_dead_beef_badn));
|
||||||
}
|
}
|
||||||
expect_stdout: "-1148098955808013200"
|
expect_stdout: "-1148098955808013200"
|
||||||
node_version: ">=10"
|
node_version: ">=10.4.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_4590: {
|
issue_4590: {
|
||||||
@@ -58,5 +58,35 @@ issue_4590: {
|
|||||||
0n || console.log("PASS");
|
0n || console.log("PASS");
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=10"
|
node_version: ">=10.4.0"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4801: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
collapse_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try {
|
||||||
|
(function(a) {
|
||||||
|
A = 42;
|
||||||
|
a || A;
|
||||||
|
})(!(0 == 42 >> 0o644n));
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
try {
|
||||||
|
(function(a) {
|
||||||
|
0 != (A = 42) >> 0o644n || A;
|
||||||
|
})();
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=10.4.0"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,6 +29,442 @@ iife_boolean_context: {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
de_morgan_1a: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
return a || a;
|
||||||
|
}
|
||||||
|
console.log(f(null), f(42));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a) {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
console.log(f(null), f(42));
|
||||||
|
}
|
||||||
|
expect_stdout: "null 42"
|
||||||
|
}
|
||||||
|
|
||||||
|
de_morgan_1b: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
return a && a;
|
||||||
|
}
|
||||||
|
console.log(f(null), f(42));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a) {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
console.log(f(null), f(42));
|
||||||
|
}
|
||||||
|
expect_stdout: "null 42"
|
||||||
|
}
|
||||||
|
|
||||||
|
de_morgan_1c: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(delete (NaN && NaN));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(delete (0, NaN));
|
||||||
|
}
|
||||||
|
expect_stdout: "true"
|
||||||
|
}
|
||||||
|
|
||||||
|
de_morgan_2a: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b) {
|
||||||
|
return a || (a || b);
|
||||||
|
}
|
||||||
|
console.log(f(null), f(null, {}));
|
||||||
|
console.log(f(42), f(42, {}));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b) {
|
||||||
|
return a || b;
|
||||||
|
}
|
||||||
|
console.log(f(null), f(null, {}));
|
||||||
|
console.log(f(42), f(42, {}));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"undefined {}",
|
||||||
|
"42 42",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
de_morgan_2b: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b) {
|
||||||
|
return a || (a && b);
|
||||||
|
}
|
||||||
|
console.log(f(null), f(null, {}));
|
||||||
|
console.log(f(42), f(42, {}));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b) {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
console.log(f(null), f(null, {}));
|
||||||
|
console.log(f(42), f(42, {}));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"null null",
|
||||||
|
"42 42",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
de_morgan_2c: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b) {
|
||||||
|
return a && (a || b);
|
||||||
|
}
|
||||||
|
console.log(f(null), f(null, {}));
|
||||||
|
console.log(f(42), f(42, {}));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b) {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
console.log(f(null), f(null, {}));
|
||||||
|
console.log(f(42), f(42, {}));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"null null",
|
||||||
|
"42 42",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
de_morgan_2d: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b) {
|
||||||
|
return a && (a && b);
|
||||||
|
}
|
||||||
|
console.log(f(null), f(null, {}));
|
||||||
|
console.log(f(42), f(42, {}));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b) {
|
||||||
|
return a && b;
|
||||||
|
}
|
||||||
|
console.log(f(null), f(null, {}));
|
||||||
|
console.log(f(42), f(42, {}));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"null null",
|
||||||
|
"undefined {}",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
de_morgan_3a: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b, c) {
|
||||||
|
return a || ((a || b) || c);
|
||||||
|
}
|
||||||
|
console.log(f(null, false), f(null, false, {}), f(null, true), f(null, true, {}));
|
||||||
|
console.log(f(42, false), f(42, false, {}), f(42, true), f(42, true, {}));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b, c) {
|
||||||
|
return a || b || c;
|
||||||
|
}
|
||||||
|
console.log(f(null, !1), f(null, !1, {}), f(null, !0), f(null, !0, {}));
|
||||||
|
console.log(f(42, !1), f(42, !1, {}), f(42, !0), f(42, !0, {}));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"undefined {} true true",
|
||||||
|
"42 42 42 42",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
de_morgan_3b: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b, c) {
|
||||||
|
return a || ((a || b) && c);
|
||||||
|
}
|
||||||
|
console.log(f(null, false), f(null, false, {}), f(null, true), f(null, true, {}));
|
||||||
|
console.log(f(42, false), f(42, false, {}), f(42, true), f(42, true, {}));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b, c) {
|
||||||
|
return a || b && c;
|
||||||
|
}
|
||||||
|
console.log(f(null, !1), f(null, !1, {}), f(null, !0), f(null, !0, {}));
|
||||||
|
console.log(f(42, !1), f(42, !1, {}), f(42, !0), f(42, !0, {}));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"false false undefined {}",
|
||||||
|
"42 42 42 42",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
de_morgan_3c: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b, c) {
|
||||||
|
return a || ((a && b) || c);
|
||||||
|
}
|
||||||
|
console.log(f(null, false), f(null, false, {}), f(null, true), f(null, true, {}));
|
||||||
|
console.log(f(42, false), f(42, false, {}), f(42, true), f(42, true, {}));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b, c) {
|
||||||
|
return a || c;
|
||||||
|
}
|
||||||
|
console.log(f(null, !1), f(null, !1, {}), f(null, !0), f(null, !0, {}));
|
||||||
|
console.log(f(42, !1), f(42, !1, {}), f(42, !0), f(42, !0, {}));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"undefined {} undefined {}",
|
||||||
|
"42 42 42 42",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
de_morgan_3d: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b, c) {
|
||||||
|
return a || ((a && b) && c);
|
||||||
|
}
|
||||||
|
console.log(f(null, false), f(null, false, {}), f(null, true), f(null, true, {}));
|
||||||
|
console.log(f(42, false), f(42, false, {}), f(42, true), f(42, true, {}));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b, c) {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
console.log(f(null, !1), f(null, !1, {}), f(null, !0), f(null, !0, {}));
|
||||||
|
console.log(f(42, !1), f(42, !1, {}), f(42, !0), f(42, !0, {}));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"null null null null",
|
||||||
|
"42 42 42 42",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
de_morgan_3e: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b, c) {
|
||||||
|
return a && ((a || b) || c);
|
||||||
|
}
|
||||||
|
console.log(f(null, false), f(null, false, {}), f(null, true), f(null, true, {}));
|
||||||
|
console.log(f(42, false), f(42, false, {}), f(42, true), f(42, true, {}));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b, c) {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
console.log(f(null, !1), f(null, !1, {}), f(null, !0), f(null, !0, {}));
|
||||||
|
console.log(f(42, !1), f(42, !1, {}), f(42, !0), f(42, !0, {}));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"null null null null",
|
||||||
|
"42 42 42 42",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
de_morgan_3f: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b, c) {
|
||||||
|
return a && ((a || b) && c);
|
||||||
|
}
|
||||||
|
console.log(f(null, false), f(null, false, {}), f(null, true), f(null, true, {}));
|
||||||
|
console.log(f(42, false), f(42, false, {}), f(42, true), f(42, true, {}));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b, c) {
|
||||||
|
return a && c;
|
||||||
|
}
|
||||||
|
console.log(f(null, !1), f(null, !1, {}), f(null, !0), f(null, !0, {}));
|
||||||
|
console.log(f(42, !1), f(42, !1, {}), f(42, !0), f(42, !0, {}));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"null null null null",
|
||||||
|
"undefined {} undefined {}",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
de_morgan_3g: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b, c) {
|
||||||
|
return a && ((a && b) || c);
|
||||||
|
}
|
||||||
|
console.log(f(null, false), f(null, false, {}), f(null, true), f(null, true, {}));
|
||||||
|
console.log(f(42, false), f(42, false, {}), f(42, true), f(42, true, {}));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b, c) {
|
||||||
|
return a && (b || c);
|
||||||
|
}
|
||||||
|
console.log(f(null, !1), f(null, !1, {}), f(null, !0), f(null, !0, {}));
|
||||||
|
console.log(f(42, !1), f(42, !1, {}), f(42, !0), f(42, !0, {}));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"null null null null",
|
||||||
|
"undefined {} true true",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
de_morgan_3h: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b, c) {
|
||||||
|
return a && ((a && b) && c);
|
||||||
|
}
|
||||||
|
console.log(f(null, false), f(null, false, {}), f(null, true), f(null, true, {}));
|
||||||
|
console.log(f(42, false), f(42, false, {}), f(42, true), f(42, true, {}));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b, c) {
|
||||||
|
return a && b && c;
|
||||||
|
}
|
||||||
|
console.log(f(null, !1), f(null, !1, {}), f(null, !0), f(null, !0, {}));
|
||||||
|
console.log(f(42, !1), f(42, !1, {}), f(42, !0), f(42, !0, {}));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"null null null null",
|
||||||
|
"false false undefined {}",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
conditional_chain: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b) {
|
||||||
|
return a ? a : b ? b : 42;
|
||||||
|
}
|
||||||
|
console.log(f("PASS", "FAIL"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b) {
|
||||||
|
return a || b || 42;
|
||||||
|
}
|
||||||
|
console.log(f("PASS", "FAIL"));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
negated_if: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(a) {
|
||||||
|
if (!a)
|
||||||
|
return a ? "FAIL" : "PASS";
|
||||||
|
}(!console));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(a) {
|
||||||
|
if (!a)
|
||||||
|
return "PASS";
|
||||||
|
}(!console));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
concat_truthy: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log("foo") + (console.log("bar"), "baz") || console.log("moo");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("foo") + (console.log("bar"), "baz");
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
]
|
||||||
|
expect_warnings: [
|
||||||
|
"WARN: + in boolean context always true [test/compress/booleans.js:1,8]",
|
||||||
|
"WARN: Condition left of || always true [test/compress/booleans.js:1,8]",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
process_returns: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
return 42;
|
||||||
|
})() && console.log("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function() {
|
||||||
|
return 42;
|
||||||
|
})() && console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
issue_3465_1: {
|
issue_3465_1: {
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
booleans: true,
|
||||||
@@ -181,3 +617,148 @@ issue_4374: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "0"
|
expect_stdout: "0"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_5028_1: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
console.log(function() {
|
||||||
|
return a-- ? a-- ? "FAIL 1" : "PASS" : "FAIL 2";
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 1;
|
||||||
|
console.log(function() {
|
||||||
|
return a-- ? a-- ? "FAIL 1" : "PASS" : "FAIL 2";
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5028_2: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
(function() {
|
||||||
|
if (a--)
|
||||||
|
if (a--)
|
||||||
|
a = "FAIL";
|
||||||
|
else
|
||||||
|
return;
|
||||||
|
})();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 1;
|
||||||
|
(function() {
|
||||||
|
a-- && a-- && (a = "FAIL");
|
||||||
|
})();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "-1"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5028_3: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
evaluate: true,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
(function() {
|
||||||
|
if (a--)
|
||||||
|
if (a--)
|
||||||
|
a = "FAIL";
|
||||||
|
else
|
||||||
|
return;
|
||||||
|
})();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 1;
|
||||||
|
(function() {
|
||||||
|
a-- && a-- && (a = "FAIL");
|
||||||
|
})();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "-1"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5041_1: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 42;
|
||||||
|
if (a)
|
||||||
|
if ([ a = null ])
|
||||||
|
if (a)
|
||||||
|
console.log("FAIL");
|
||||||
|
else
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 42;
|
||||||
|
a && [ a = null ] && (a ? console.log("FAIL") : console.log("PASS"));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5041_2: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
if (!a)
|
||||||
|
if (a = 42)
|
||||||
|
if (a)
|
||||||
|
console.log("PASS");
|
||||||
|
else
|
||||||
|
console.log("FAIL");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
a || (a = 42) && (a ? console.log("PASS") : console.log("FAIL"));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5228: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
return !function() {
|
||||||
|
do {
|
||||||
|
return null;
|
||||||
|
} while (console);
|
||||||
|
}();
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function() {
|
||||||
|
do {
|
||||||
|
return !0;
|
||||||
|
} while (console);
|
||||||
|
return !0;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "true"
|
||||||
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -489,7 +489,36 @@ issue_3413: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var b;
|
var b;
|
||||||
void 0 !== ("" < b || void 0) || console.log("PASS");
|
void 0 === ("" < b || void 0) && console.log("PASS");
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nullish_assign: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
void 0 !== (a = "PASS".split("")) && null !== a && console.log(a.join("-"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
null != (a = "PASS".split("")) && console.log(a.join("-"));
|
||||||
|
}
|
||||||
|
expect_stdout: "P-A-S-S"
|
||||||
|
}
|
||||||
|
|
||||||
|
nullish_chain: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
A || B || void 0 === a || null === a || C;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
A || B || null == a || C;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -289,3 +289,18 @@ issue_3689: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "00"
|
expect_stdout: "00"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_5145: {
|
||||||
|
options = {
|
||||||
|
strings: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = [];
|
||||||
|
console.log("" + a + ((a[0] = 4) + "2"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = [];
|
||||||
|
console.log("" + a + (a[0] = 4) + "2");
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
}
|
||||||
|
|||||||
@@ -82,14 +82,14 @@ ifs_3_should_warn: {
|
|||||||
"WARN: Boolean && always false [test/compress/conditionals.js:3,12]",
|
"WARN: Boolean && always false [test/compress/conditionals.js:3,12]",
|
||||||
"WARN: Condition left of && always false [test/compress/conditionals.js:3,12]",
|
"WARN: Condition left of && always false [test/compress/conditionals.js:3,12]",
|
||||||
"WARN: Condition always false [test/compress/conditionals.js:3,12]",
|
"WARN: Condition always false [test/compress/conditionals.js:3,12]",
|
||||||
|
"WARN: Dropping side-effect-free statement [test/compress/conditionals.js:3,12]",
|
||||||
"WARN: Dropping unreachable code [test/compress/conditionals.js:3,34]",
|
"WARN: Dropping unreachable code [test/compress/conditionals.js:3,34]",
|
||||||
"WARN: + in boolean context always true [test/compress/conditionals.js:10,19]",
|
"WARN: + in boolean context always true [test/compress/conditionals.js:10,19]",
|
||||||
"WARN: Boolean || always true [test/compress/conditionals.js:10,12]",
|
"WARN: Boolean || always true [test/compress/conditionals.js:10,12]",
|
||||||
"WARN: Condition left of || always true [test/compress/conditionals.js:10,12]",
|
"WARN: Condition left of || always true [test/compress/conditionals.js:10,12]",
|
||||||
"WARN: Condition always true [test/compress/conditionals.js:10,12]",
|
"WARN: Condition always true [test/compress/conditionals.js:10,12]",
|
||||||
"WARN: Dropping unreachable code [test/compress/conditionals.js:12,15]",
|
|
||||||
"WARN: Dropping side-effect-free statement [test/compress/conditionals.js:3,12]",
|
|
||||||
"WARN: Dropping side-effect-free statement [test/compress/conditionals.js:10,12]",
|
"WARN: Dropping side-effect-free statement [test/compress/conditionals.js:10,12]",
|
||||||
|
"WARN: Dropping unreachable code [test/compress/conditionals.js:12,15]",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -822,6 +822,33 @@ cond_13: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cond_14: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
if (a)
|
||||||
|
if (a)
|
||||||
|
console.log("PASS");
|
||||||
|
else
|
||||||
|
console.log("FAIL");
|
||||||
|
}
|
||||||
|
f(null);
|
||||||
|
f(42);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a) {
|
||||||
|
a && console.log("PASS");
|
||||||
|
}
|
||||||
|
f(null);
|
||||||
|
f(42);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
ternary_boolean_consequent: {
|
ternary_boolean_consequent: {
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
booleans: true,
|
||||||
@@ -1897,3 +1924,141 @@ object_super: {
|
|||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_5232_1: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
if (Math) {
|
||||||
|
function f() {}
|
||||||
|
for (var a in [ 42 ])
|
||||||
|
console.log(typeof f);
|
||||||
|
} else {
|
||||||
|
var b = null;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function() {
|
||||||
|
var b;
|
||||||
|
if (!Math)
|
||||||
|
return b = null, true;
|
||||||
|
function f() {}
|
||||||
|
for (var a in [ 42 ]) console.log(typeof f);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "function"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5232_2: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
if (!Math);
|
||||||
|
else {
|
||||||
|
var b = null;
|
||||||
|
return "PASS";
|
||||||
|
}
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function() {
|
||||||
|
var b;
|
||||||
|
if (Math)
|
||||||
|
return b = null, "PASS";
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5232_3: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
return function() {
|
||||||
|
if (console)
|
||||||
|
console.log("PASS");
|
||||||
|
else {
|
||||||
|
var a = null;
|
||||||
|
return "FAIL";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}()());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function() {
|
||||||
|
return function() {
|
||||||
|
var a;
|
||||||
|
if (!console)
|
||||||
|
return a = null, "FAIL";
|
||||||
|
console.log("PASS");
|
||||||
|
};
|
||||||
|
}()());
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"PASS",
|
||||||
|
"undefined",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5334_1: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
if (console.log("PASS"))
|
||||||
|
var o = true, o = {
|
||||||
|
p: o += console.log("FAIL"),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function() {
|
||||||
|
var o;
|
||||||
|
console.log("PASS") && (o = true, o = {
|
||||||
|
p: o += console.log("FAIL"),
|
||||||
|
});
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5334_2: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
hoist_props: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 3,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
if (console.log("PASS"))
|
||||||
|
var o = true, o = {
|
||||||
|
p: o += console.log("FAIL"),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("PASS") && console.log("FAIL");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|||||||
@@ -220,6 +220,32 @@ merge_vars_3: {
|
|||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
merge_vars_4: {
|
||||||
|
options = {
|
||||||
|
merge_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
console.log(typeof a);
|
||||||
|
{
|
||||||
|
var b = console;
|
||||||
|
console.log(typeof b);
|
||||||
|
const a = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 1;
|
||||||
|
console.log(typeof a);
|
||||||
|
{
|
||||||
|
var b = console;
|
||||||
|
console.log(typeof b);
|
||||||
|
const a = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
use_before_init_1: {
|
use_before_init_1: {
|
||||||
options = {
|
options = {
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
@@ -486,7 +512,7 @@ do_continue: {
|
|||||||
|
|
||||||
catch_ie8_1: {
|
catch_ie8_1: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -506,7 +532,7 @@ catch_ie8_1: {
|
|||||||
catch_ie8_2: {
|
catch_ie8_2: {
|
||||||
options = {
|
options = {
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
ie8: true,
|
ie: true,
|
||||||
passes: 2,
|
passes: 2,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -571,8 +597,7 @@ do_if_continue_1: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
do {
|
do {
|
||||||
if (!console);
|
if (console) {
|
||||||
else {
|
|
||||||
console.log("PASS");
|
console.log("PASS");
|
||||||
{
|
{
|
||||||
const a = 0;
|
const a = 0;
|
||||||
@@ -602,8 +627,7 @@ do_if_continue_2: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
do {
|
do {
|
||||||
if (!console);
|
if (console) {
|
||||||
else {
|
|
||||||
console.log("PASS");
|
console.log("PASS");
|
||||||
{
|
{
|
||||||
const a = 0;
|
const a = 0;
|
||||||
@@ -727,7 +751,7 @@ issue_4193: {
|
|||||||
|
|
||||||
issue_4195: {
|
issue_4195: {
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(function f(a) {
|
console.log(function f(a) {
|
||||||
@@ -838,12 +862,10 @@ issue_4202: {
|
|||||||
expect: {
|
expect: {
|
||||||
{
|
{
|
||||||
const o = {};
|
const o = {};
|
||||||
(function() {
|
function f() {
|
||||||
function f() {
|
o.p = 42;
|
||||||
o.p = 42;
|
}
|
||||||
}
|
f(f);
|
||||||
f(f);
|
|
||||||
})();
|
|
||||||
console.log(o.p++);
|
console.log(o.p++);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1131,7 +1153,7 @@ issue_4225: {
|
|||||||
|
|
||||||
issue_4229: {
|
issue_4229: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -1151,7 +1173,7 @@ issue_4229: {
|
|||||||
|
|
||||||
issue_4231: {
|
issue_4231: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -1219,9 +1241,9 @@ issue_4248: {
|
|||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_4261: {
|
issue_4261_1: {
|
||||||
options = {
|
options = {
|
||||||
inline: true,
|
inline: 3,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
@@ -1259,6 +1281,43 @@ issue_4261: {
|
|||||||
expect_stdout: "42"
|
expect_stdout: "42"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4261_2: {
|
||||||
|
options = {
|
||||||
|
if_return: true,
|
||||||
|
inline: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
{
|
||||||
|
const a = 42;
|
||||||
|
(function() {
|
||||||
|
function f() {
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
function g() {
|
||||||
|
while (f());
|
||||||
|
}
|
||||||
|
(function() {
|
||||||
|
while (g());
|
||||||
|
})();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
{
|
||||||
|
const a = 42;
|
||||||
|
function g() {
|
||||||
|
while (void console.log(a));
|
||||||
|
}
|
||||||
|
while (g());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
}
|
||||||
|
|
||||||
issue_4274_1: {
|
issue_4274_1: {
|
||||||
options = {
|
options = {
|
||||||
loops: true,
|
loops: true,
|
||||||
@@ -1457,6 +1516,7 @@ issue_4689: {
|
|||||||
|
|
||||||
issue_4691: {
|
issue_4691: {
|
||||||
options = {
|
options = {
|
||||||
|
conditionals: true,
|
||||||
if_return: true,
|
if_return: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
@@ -1498,3 +1558,300 @@ issue_4691: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
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"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4954_1: {
|
||||||
|
rename = true
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
(function() {
|
||||||
|
{
|
||||||
|
const a = "foo";
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
const a = "bar";
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
(function() {
|
||||||
|
{
|
||||||
|
const a = "foo";
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
const b = "bar";
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4954_2: {
|
||||||
|
mangle = {}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
const a = null;
|
||||||
|
(function(b) {
|
||||||
|
for (const a in null);
|
||||||
|
for (const a in b)
|
||||||
|
console.log("PASS");
|
||||||
|
})([ null ]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
const a = null;
|
||||||
|
(function(o) {
|
||||||
|
for (const n in null);
|
||||||
|
for (const n in o)
|
||||||
|
console.log("PASS");
|
||||||
|
})([ null ]);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4960: {
|
||||||
|
mangle = {}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
var a;
|
||||||
|
(function() {
|
||||||
|
{
|
||||||
|
const a = console.log("PASS");
|
||||||
|
}
|
||||||
|
try {} catch (e) {
|
||||||
|
const a = console.log("FAIL");
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
var a;
|
||||||
|
(function() {
|
||||||
|
{
|
||||||
|
const o = console.log("PASS");
|
||||||
|
}
|
||||||
|
try {} catch (o) {
|
||||||
|
const c = console.log("FAIL");
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4965_1: {
|
||||||
|
mangle = {}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
try {
|
||||||
|
c;
|
||||||
|
} catch (a) {
|
||||||
|
{
|
||||||
|
const a = 1;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
const a = console.log(typeof c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
try {
|
||||||
|
c;
|
||||||
|
} catch (t) {
|
||||||
|
{
|
||||||
|
const c = 1;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
const t = console.log(typeof c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4965_2: {
|
||||||
|
mangle = {}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (e) {
|
||||||
|
try {
|
||||||
|
{
|
||||||
|
const e = 2;
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
const e = 3;
|
||||||
|
console.log(typeof t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (o) {
|
||||||
|
try {
|
||||||
|
{
|
||||||
|
const t = 2;
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
const o = 3;
|
||||||
|
console.log(typeof t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5254: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
do {
|
||||||
|
(function() {
|
||||||
|
const a = console.log;
|
||||||
|
a && a("foo");
|
||||||
|
})();
|
||||||
|
} while (console.log("bar"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
do {
|
||||||
|
const a = console.log;
|
||||||
|
a && a("foo");
|
||||||
|
} while (console.log("bar"));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5260: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
var a = "foo", o;
|
||||||
|
while (console.log("bar"));
|
||||||
|
o = {
|
||||||
|
baz: function(b) {
|
||||||
|
console.log(a, b);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
for (const a in o)
|
||||||
|
o[a](a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
var a = "foo", o;
|
||||||
|
while (console.log("bar"));
|
||||||
|
o = {
|
||||||
|
baz: function(b) {
|
||||||
|
console.log(a, b);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
for (const a in o)
|
||||||
|
o[a](a);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"bar",
|
||||||
|
"foo baz",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5319: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
merge_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a, c) {
|
||||||
|
var b = a, c = b;
|
||||||
|
{
|
||||||
|
const a = c;
|
||||||
|
console.log(c());
|
||||||
|
}
|
||||||
|
})(function() {
|
||||||
|
return "PASS";
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(a, c) {
|
||||||
|
var b = a, c;
|
||||||
|
{
|
||||||
|
const a = c = b;
|
||||||
|
console.log(c());
|
||||||
|
}
|
||||||
|
})(function() {
|
||||||
|
return "PASS";
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5338: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
const a = a;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
const a = a;
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|||||||
@@ -939,6 +939,185 @@ catch_return_assign: {
|
|||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
catch_return_assign_may_throw: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
try {
|
||||||
|
throw "FAIL";
|
||||||
|
} catch (e) {
|
||||||
|
return e = console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
try {
|
||||||
|
throw "FAIL";
|
||||||
|
} catch (e) {
|
||||||
|
return console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
finally_return_assign: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(a) {
|
||||||
|
try {
|
||||||
|
throw "FAIL";
|
||||||
|
} finally {
|
||||||
|
return a = "PASS";
|
||||||
|
}
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(a) {
|
||||||
|
try {
|
||||||
|
throw "FAIL";
|
||||||
|
} finally {
|
||||||
|
return "PASS";
|
||||||
|
}
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
last_assign_statement: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
a = a("PASS");
|
||||||
|
}
|
||||||
|
f(console.log);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a) {
|
||||||
|
a("PASS");
|
||||||
|
}
|
||||||
|
f(console.log);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
last_assign_if_else: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
if (a)
|
||||||
|
a = console.log("foo");
|
||||||
|
else {
|
||||||
|
console.log("bar");
|
||||||
|
a = console.log("baz");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f(42);
|
||||||
|
f(null);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a) {
|
||||||
|
if (a)
|
||||||
|
console.log("foo");
|
||||||
|
else {
|
||||||
|
console.log("bar");
|
||||||
|
console.log("baz");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f(42);
|
||||||
|
f(null);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
"baz",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
last_assign_catch: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
try {
|
||||||
|
throw "FAIL";
|
||||||
|
} catch (e) {
|
||||||
|
e = console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
try {
|
||||||
|
throw "FAIL";
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
last_assign_finally: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
try {
|
||||||
|
throw a.log;
|
||||||
|
} catch (e) {
|
||||||
|
a = e;
|
||||||
|
} finally {
|
||||||
|
a = a("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f(console);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a) {
|
||||||
|
try {
|
||||||
|
throw a.log;
|
||||||
|
} catch (e) {
|
||||||
|
a = e;
|
||||||
|
} finally {
|
||||||
|
a("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f(console);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
consecutive_assignments: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
while (a = void 0, a = "PASS", console.log(a));
|
||||||
|
var a;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
while (void 0, a = "PASS", console.log(a));
|
||||||
|
var a;
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
issue_3578: {
|
issue_3578: {
|
||||||
options = {
|
options = {
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
@@ -1420,3 +1599,73 @@ issue_4570: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "NaN"
|
expect_stdout: "NaN"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_5030: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a, b) {
|
||||||
|
a = function f() {
|
||||||
|
if (a)
|
||||||
|
if (b--)
|
||||||
|
setImmediate(f);
|
||||||
|
else
|
||||||
|
console.log("FAIL");
|
||||||
|
else
|
||||||
|
console.log("PASS");
|
||||||
|
}();
|
||||||
|
})(42, 1);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(a, b) {
|
||||||
|
a = function f() {
|
||||||
|
if (a)
|
||||||
|
if (b--)
|
||||||
|
setImmediate(f);
|
||||||
|
else
|
||||||
|
console.log("FAIL");
|
||||||
|
else
|
||||||
|
console.log("PASS");
|
||||||
|
}();
|
||||||
|
})(42, 1);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=0.12"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5106_1: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(typeof function(a) {
|
||||||
|
return a = arguments;
|
||||||
|
}("FAIL")[0]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(typeof function(a) {
|
||||||
|
return a = arguments;
|
||||||
|
}("FAIL")[0]);
|
||||||
|
}
|
||||||
|
expect_stdout: "object"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5106_2: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
console.log(function(a) {
|
||||||
|
return a = arguments;
|
||||||
|
}("PASS")[0]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
console.log(function(a) {
|
||||||
|
return arguments;
|
||||||
|
}("PASS")[0]);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ object_shorthand_assign: {
|
|||||||
({ a = "PASS" } = 42);
|
({ a = "PASS" } = 42);
|
||||||
console.log(a);
|
console.log(a);
|
||||||
}
|
}
|
||||||
expect_exact: '({a:a="PASS"}=42);console.log(a);'
|
expect_exact: '({a="PASS"}=42);console.log(a);'
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
@@ -80,7 +80,7 @@ object_shorthand_declaration: {
|
|||||||
var { a = "PASS" } = 42;
|
var { a = "PASS" } = 42;
|
||||||
console.log(a);
|
console.log(a);
|
||||||
}
|
}
|
||||||
expect_exact: 'var{a:a="PASS"}=42;console.log(a);'
|
expect_exact: 'var{a="PASS"}=42;console.log(a);'
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
@@ -91,7 +91,7 @@ object_shorthand_function: {
|
|||||||
console.log(a);
|
console.log(a);
|
||||||
})(42);
|
})(42);
|
||||||
}
|
}
|
||||||
expect_exact: '(function({a:a="PASS"}){console.log(a)})(42);'
|
expect_exact: '(function({a="PASS"}){console.log(a)})(42);'
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
@@ -149,7 +149,7 @@ process_boolean_returns: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
console.log(function(a = console.log("FAIL 1")) {
|
console.log(function(a = console.log("FAIL 1")) {
|
||||||
return a() ? "PASS" : "FAIL 2";
|
return 42 ? "PASS" : "FAIL 2";
|
||||||
}(function() {
|
}(function() {
|
||||||
return 1;
|
return 1;
|
||||||
}));
|
}));
|
||||||
@@ -158,6 +158,28 @@ process_boolean_returns: {
|
|||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
collapse_arg_sequence: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a = (console.log("bar"), console.log)) {
|
||||||
|
a("foo");
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(a = console.log("bar")) {
|
||||||
|
(0, console.log)("foo");
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"bar",
|
||||||
|
"foo",
|
||||||
|
]
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
collapse_value_1: {
|
collapse_value_1: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
@@ -245,21 +267,64 @@ maintain_if: {
|
|||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|
||||||
reduce_value: {
|
reduce_funarg: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
keep_fargs: false,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(function(a = "PASS") {
|
console.log(...function(a = "foo", b = "bar", c = "baz") {
|
||||||
return a;
|
return [ a, b, c ];
|
||||||
}());
|
}(void 0, null));
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
console.log("PASS");
|
console.log(...function() {
|
||||||
|
return [ "foo", null, "baz" ];
|
||||||
|
}());
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "foo null baz"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
reduce_array: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var [ a = "foo", b = "bar", c = "baz" ] = [ void 0, null ];
|
||||||
|
console.log(a, b, c);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var [ c = "baz" ] = [];
|
||||||
|
console.log("foo", null, c);
|
||||||
|
}
|
||||||
|
expect_stdout: "foo null baz"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
reduce_object: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var { a = "foo", b = "bar", c = "baz" } = { a: void 0, b: null };
|
||||||
|
console.log(a, b, c);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var { c = "baz" } = {};
|
||||||
|
console.log("foo", null, c);
|
||||||
|
}
|
||||||
|
expect_stdout: "foo null baz"
|
||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -422,7 +487,9 @@ inline_loop_1: {
|
|||||||
inline_loop_2: {
|
inline_loop_2: {
|
||||||
options = {
|
options = {
|
||||||
inline: true,
|
inline: true,
|
||||||
|
sequences: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
while (function(a = [ "PASS" ]) {
|
while (function(a = [ "PASS" ]) {
|
||||||
@@ -432,10 +499,11 @@ inline_loop_2: {
|
|||||||
}());
|
}());
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
while (a = [ "PASS" ], a = function f(b) {
|
while (a = [ "PASS" ],
|
||||||
console.log(a[b]);
|
b = void 0,
|
||||||
}(0), void 0) ;
|
b = 0,
|
||||||
var a;
|
void (a = void console.log(a[b])));
|
||||||
|
var a, b;
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
@@ -522,6 +590,20 @@ retain_empty_iife: {
|
|||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
drop_new_function: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
new function(a = console.log("PASS")) {}();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
void console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
retain_fargs: {
|
retain_fargs: {
|
||||||
options = {
|
options = {
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -598,6 +680,7 @@ unused_var_1: {
|
|||||||
|
|
||||||
unused_var_2: {
|
unused_var_2: {
|
||||||
options = {
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -609,11 +692,7 @@ unused_var_2: {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var {
|
console.log("PASS");
|
||||||
p: [] = [ console.log("FAIL") ],
|
|
||||||
} = {
|
|
||||||
p: [ console.log("PASS") ],
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
@@ -676,7 +755,7 @@ unused_value_var_2: {
|
|||||||
console.log(a);
|
console.log(a);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var [ a ] = [ "PASS" ];
|
var a = [ "PASS" ][0];
|
||||||
console.log(a);
|
console.log(a);
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
@@ -980,7 +1059,7 @@ mangle_arrow_1: {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=6"
|
node_version: ">=6.9.3"
|
||||||
}
|
}
|
||||||
|
|
||||||
mangle_arrow_1_toplevel: {
|
mangle_arrow_1_toplevel: {
|
||||||
@@ -1016,7 +1095,7 @@ mangle_arrow_1_toplevel: {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=6"
|
node_version: ">=6.9.3"
|
||||||
}
|
}
|
||||||
|
|
||||||
mangle_arrow_2: {
|
mangle_arrow_2: {
|
||||||
@@ -1052,7 +1131,7 @@ mangle_arrow_2: {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=6"
|
node_version: ">=6.9.3"
|
||||||
}
|
}
|
||||||
|
|
||||||
mangle_arrow_2_toplevel: {
|
mangle_arrow_2_toplevel: {
|
||||||
@@ -1088,7 +1167,7 @@ mangle_arrow_2_toplevel: {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=6"
|
node_version: ">=6.9.3"
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_4444: {
|
issue_4444: {
|
||||||
@@ -1257,7 +1336,7 @@ issue_4468: {
|
|||||||
expect: {
|
expect: {
|
||||||
(function() {
|
(function() {
|
||||||
var {
|
var {
|
||||||
[console.log("PASS")]: b = 0,
|
[console.log("PASS")]: b,
|
||||||
} = 0;
|
} = 0;
|
||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
@@ -1416,6 +1495,7 @@ issue_4502_1: {
|
|||||||
expect: {
|
expect: {
|
||||||
(function() {
|
(function() {
|
||||||
var a = "PASS";
|
var a = "PASS";
|
||||||
|
void 0,
|
||||||
console.log(a),
|
console.log(a),
|
||||||
a++,
|
a++,
|
||||||
void 0;
|
void 0;
|
||||||
@@ -1439,6 +1519,7 @@ issue_4502_2: {
|
|||||||
expect: {
|
expect: {
|
||||||
(function() {
|
(function() {
|
||||||
var a = "PASS";
|
var a = "PASS";
|
||||||
|
void 0,
|
||||||
console.log(a),
|
console.log(a),
|
||||||
a++,
|
a++,
|
||||||
void 0;
|
void 0;
|
||||||
@@ -1528,7 +1609,7 @@ issue_4510_2: {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=8"
|
node_version: ">=8.3.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_4523: {
|
issue_4523: {
|
||||||
@@ -1661,3 +1742,500 @@ issue_4588_2_evaluate: {
|
|||||||
expect_stdout: "1"
|
expect_stdout: "1"
|
||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4817: {
|
||||||
|
options = {
|
||||||
|
ie: true,
|
||||||
|
inline: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function f(a = console.log(typeof f)) {
|
||||||
|
return 42;
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function f(a = console.log(typeof f)) {
|
||||||
|
return 42;
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "function"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4854: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
inline: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(a) {
|
||||||
|
(function(b = a = "foo") {
|
||||||
|
[] = "foo";
|
||||||
|
})();
|
||||||
|
a;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(void 0);
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4916: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var log = console.log;
|
||||||
|
(function(b = "foo") {
|
||||||
|
b.value = "FAIL";
|
||||||
|
b;
|
||||||
|
log(b.value);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var log = console.log;
|
||||||
|
(function(b = "foo") {
|
||||||
|
b.value = "FAIL";
|
||||||
|
b;
|
||||||
|
log(b.value);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4994: {
|
||||||
|
options = {
|
||||||
|
loops: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "FAIL";
|
||||||
|
(function(b = function() {
|
||||||
|
for (a in { PASS: 42 });
|
||||||
|
}()) {
|
||||||
|
var a;
|
||||||
|
})();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "FAIL";
|
||||||
|
(function(b = function() {
|
||||||
|
for (a in { PASS: 42 });
|
||||||
|
}()) {})();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5057_1: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
inline: true,
|
||||||
|
sequences: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 42;
|
||||||
|
(function() {
|
||||||
|
var b = function(c = (console.log("foo"), b = a)) {
|
||||||
|
a && console.log("bar");
|
||||||
|
}();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 42;
|
||||||
|
console.log("foo"),
|
||||||
|
void (a && console.log("bar"));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
]
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5057_2: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function f(a) {
|
||||||
|
(function(b = console.log("FAIL")) {})(a);
|
||||||
|
})(42);
|
||||||
|
console.log(typeof b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(a) {
|
||||||
|
[ b = console.log("FAIL") ] = [ a ],
|
||||||
|
void 0;
|
||||||
|
var b;
|
||||||
|
})(42);
|
||||||
|
console.log(typeof b);
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5057_3: {
|
||||||
|
options = {
|
||||||
|
inline: 3,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a) {
|
||||||
|
(function f(b) {
|
||||||
|
(function(a = console.log("FAIL 1")) {})(b);
|
||||||
|
console.log(a);
|
||||||
|
})("FAIL 2");
|
||||||
|
})("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(a) {
|
||||||
|
(function(b) {
|
||||||
|
(function(a = console.log("FAIL 1")) {})(b);
|
||||||
|
console.log(a);
|
||||||
|
})("FAIL 2");
|
||||||
|
})("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5057_4: {
|
||||||
|
options = {
|
||||||
|
if_return: true,
|
||||||
|
inline: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a) {
|
||||||
|
(function f(b) {
|
||||||
|
(function(a = console.log("FAIL 1")) {})(b);
|
||||||
|
console.log(a);
|
||||||
|
})("FAIL 2");
|
||||||
|
})("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(a) {
|
||||||
|
var b = "FAIL 2";
|
||||||
|
(function(a = console.log("FAIL 1")) {})(b);
|
||||||
|
console.log(a);
|
||||||
|
})("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5065: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var [ a = console.log("PASS") ] = [ (A = 42).p ];
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var [ a = console.log("PASS") ] = [ (A = 42).p ];
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5138_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(a, b = a = "FAIL") {
|
||||||
|
return a;
|
||||||
|
}() && "PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(a, b = a = "FAIL") {
|
||||||
|
return a;
|
||||||
|
}() && "PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5138_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(a, b = a = "FAIL 1") {
|
||||||
|
return a;
|
||||||
|
}(null, "FAIL 2") || "PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log((null, "PASS"));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5192: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
ie: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function a(a, [] = a = "PASS") {
|
||||||
|
console.log(a);
|
||||||
|
})("FAIL");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function a(a, [] = a = "PASS") {
|
||||||
|
console.log(a);
|
||||||
|
})("FAIL");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5246_1: {
|
||||||
|
options = {
|
||||||
|
keep_fargs: false,
|
||||||
|
pure_getters: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function({} = 42) {
|
||||||
|
return "PASS";
|
||||||
|
}("foo"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function() {
|
||||||
|
return "PASS";
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
expect_warnings: [
|
||||||
|
"INFO: Dropping unused default argument {}=42 [test/compress/default-values.js:1,29]",
|
||||||
|
]
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5246_2: {
|
||||||
|
options = {
|
||||||
|
keep_fargs: false,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function f(a = "FAIL", [] = 42) {
|
||||||
|
console.log(a);
|
||||||
|
})("PASS", []);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(a = "FAIL") {
|
||||||
|
console.log(a);
|
||||||
|
})("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5246_3: {
|
||||||
|
options = {
|
||||||
|
default_values: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function f([ , {} ] = null){}([ , {} ]));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function([ {} ]){}([ {} ]));
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5256: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(arguments = console.log) {
|
||||||
|
console;
|
||||||
|
})();
|
||||||
|
console.log(typeof arguments);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
// Syntax error on Node.js v6
|
||||||
|
(function(arguments = console.log) {
|
||||||
|
console;
|
||||||
|
})();
|
||||||
|
console.log(typeof arguments);
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5314_1: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
A = this;
|
||||||
|
new function() {
|
||||||
|
(function(a = console.log(this === A ? "PASS" : "FAIL")) {})();
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
A = this;
|
||||||
|
(function() {
|
||||||
|
(function(a = console.log(this === A ? "PASS" : "FAIL")) {})();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5314_2: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
A = this;
|
||||||
|
new function() {
|
||||||
|
((a = console.log(this === A ? "FAIL" : "PASS")) => {})();
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
A = this;
|
||||||
|
new function() {
|
||||||
|
console.log(this === A ? "FAIL" : "PASS");
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5336: {
|
||||||
|
options = {
|
||||||
|
default_values: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
do {
|
||||||
|
(function f(b = console.log("PASS")) {
|
||||||
|
a = f;
|
||||||
|
})(42);
|
||||||
|
} while (a());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
do {
|
||||||
|
(function f(b = console.log("PASS")) {
|
||||||
|
a = f;
|
||||||
|
})(42);
|
||||||
|
} while (a());
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5340_1: {
|
||||||
|
options = {
|
||||||
|
keep_fargs: true,
|
||||||
|
pure_getters: "strict",
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
(function(b = 42) {})(({ p: a } = true).q);
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
(function(b = 0) {})(({ p: a } = true).q);
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5340_2: {
|
||||||
|
options = {
|
||||||
|
keep_fargs: true,
|
||||||
|
pure_getters: "strict",
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
(function(b = 42) {})(({ p: a } = true).q);
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
[ [].e = 0 ] = [ ({ p: a } = true).q ];
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5340_3: {
|
||||||
|
options = {
|
||||||
|
keep_fargs: false,
|
||||||
|
pure_getters: "strict",
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
(function(b = 42) {})(({ p: a } = true).q);
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
(function() {})(a = true["p"]);
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5407: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a) {
|
||||||
|
for (var i = 0; i < 2; i++)
|
||||||
|
(function(b = 4) {
|
||||||
|
console.log(b);
|
||||||
|
a = 2;
|
||||||
|
})(a);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(a) {
|
||||||
|
for (var i = 0; i < 2; i++)
|
||||||
|
(function(b = 4) {
|
||||||
|
console.log(b);
|
||||||
|
a = 2;
|
||||||
|
})(a);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"4",
|
||||||
|
"2",
|
||||||
|
]
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -129,3 +129,32 @@ valid_after_invalid_2: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "undefined"
|
expect_stdout: "undefined"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_5368_1: {
|
||||||
|
options = {
|
||||||
|
directives: true,
|
||||||
|
expression: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"foo";
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"foo";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5368_2: {
|
||||||
|
options = {
|
||||||
|
directives: true,
|
||||||
|
expression: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"foo";
|
||||||
|
(function() {
|
||||||
|
"bar";
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function() {})();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -795,9 +795,9 @@ issue_1656: {
|
|||||||
beautify: true,
|
beautify: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
for(var a=0;;);
|
for (var a=0;;);
|
||||||
}
|
}
|
||||||
expect_exact: "for (;;) ;"
|
expect_exact: "for (;;);"
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_1709: {
|
issue_1709: {
|
||||||
@@ -1110,7 +1110,7 @@ issue_1838: {
|
|||||||
}
|
}
|
||||||
expect_exact: [
|
expect_exact: [
|
||||||
"function f() {",
|
"function f() {",
|
||||||
" for (a; c; ) ;",
|
" for (a; c; );",
|
||||||
"}",
|
"}",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -1233,8 +1233,11 @@ issue_2105_2: {
|
|||||||
issue_2105_3: {
|
issue_2105_3: {
|
||||||
options = {
|
options = {
|
||||||
inline: true,
|
inline: true,
|
||||||
passes: 2,
|
join_vars: true,
|
||||||
|
passes: 3,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
sequences: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -1258,12 +1261,12 @@ issue_2105_3: {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
!void void {
|
({
|
||||||
prop: function() {
|
prop: function() {
|
||||||
console.log;
|
console.log,
|
||||||
void console.log("PASS");
|
console.log("PASS");
|
||||||
}
|
},
|
||||||
}.prop();
|
}).prop();
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
@@ -1557,9 +1560,9 @@ issue_2665: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var a = 1;
|
var a = 1;
|
||||||
!function g() {
|
(function g() {
|
||||||
a-- && g();
|
a-- && g();
|
||||||
}();
|
})();
|
||||||
console.log(a);
|
console.log(a);
|
||||||
}
|
}
|
||||||
expect_stdout: "-1"
|
expect_stdout: "-1"
|
||||||
@@ -1728,7 +1731,8 @@ issue_2768: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var a = "FAIL";
|
var a = "FAIL";
|
||||||
var c = (d = a, void (d && (a = "PASS")));
|
d = a;
|
||||||
|
var c = void (d && (a = "PASS"));
|
||||||
var d;
|
var d;
|
||||||
console.log(a, typeof c);
|
console.log(a, typeof c);
|
||||||
}
|
}
|
||||||
@@ -1765,7 +1769,7 @@ issue_2846: {
|
|||||||
issue_805_1: {
|
issue_805_1: {
|
||||||
options = {
|
options = {
|
||||||
inline: true,
|
inline: true,
|
||||||
passes: 2,
|
passes: 3,
|
||||||
pure_getters: "strict",
|
pure_getters: "strict",
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
@@ -1798,7 +1802,7 @@ issue_805_1: {
|
|||||||
issue_805_2: {
|
issue_805_2: {
|
||||||
options = {
|
options = {
|
||||||
inline: true,
|
inline: true,
|
||||||
passes: 2,
|
passes: 3,
|
||||||
pure_getters: "strict",
|
pure_getters: "strict",
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
@@ -2345,7 +2349,7 @@ function_argument_reference: {
|
|||||||
|
|
||||||
function_parameter_ie8: {
|
function_parameter_ie8: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -2371,6 +2375,7 @@ function_parameter_ie8: {
|
|||||||
issue_3664: {
|
issue_3664: {
|
||||||
options = {
|
options = {
|
||||||
pure_getters: "strict",
|
pure_getters: "strict",
|
||||||
|
side_effects: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -2381,7 +2386,8 @@ issue_3664: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
console.log(function() {
|
console.log(function() {
|
||||||
var b = ([ b && console.log("FAIL") ].p = 0, 0);
|
a = (a = [ b && console.log("FAIL") ]).p = 0;
|
||||||
|
var a, b = 0;
|
||||||
return "PASS";
|
return "PASS";
|
||||||
}());
|
}());
|
||||||
}
|
}
|
||||||
@@ -2391,6 +2397,7 @@ issue_3664: {
|
|||||||
issue_3673: {
|
issue_3673: {
|
||||||
options = {
|
options = {
|
||||||
pure_getters: "strict",
|
pure_getters: "strict",
|
||||||
|
sequences: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -2401,8 +2408,6 @@ issue_3673: {
|
|||||||
console.log("PASS");
|
console.log("PASS");
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var a;
|
|
||||||
(a = [ a ]).p = 42;
|
|
||||||
console.log("PASS");
|
console.log("PASS");
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
@@ -2551,10 +2556,9 @@ issue_3899: {
|
|||||||
console.log(typeof a);
|
console.log(typeof a);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function a() {
|
console.log(typeof function() {
|
||||||
return 2;
|
return 2;
|
||||||
}
|
});
|
||||||
console.log(typeof a);
|
|
||||||
}
|
}
|
||||||
expect_stdout: "function"
|
expect_stdout: "function"
|
||||||
}
|
}
|
||||||
@@ -2652,7 +2656,7 @@ issue_3956: {
|
|||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
passes: 2,
|
passes: 3,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
@@ -2783,7 +2787,7 @@ issue_3986: {
|
|||||||
expect_stdout: "0"
|
expect_stdout: "0"
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_4017: {
|
issue_4017_1: {
|
||||||
options = {
|
options = {
|
||||||
pure_getters: "strict",
|
pure_getters: "strict",
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
@@ -2801,7 +2805,31 @@ issue_4017: {
|
|||||||
var a = 0;
|
var a = 0;
|
||||||
console.log(function() {
|
console.log(function() {
|
||||||
c &= 0;
|
c &= 0;
|
||||||
var c;
|
var c = a++ + (A = a);
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4017_2: {
|
||||||
|
options = {
|
||||||
|
passes: 2,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 0;
|
||||||
|
console.log(function f() {
|
||||||
|
var b = c &= 0;
|
||||||
|
var c = a++ + (A = a);
|
||||||
|
var d = c && c[f];
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 0;
|
||||||
|
console.log(function() {
|
||||||
|
0;
|
||||||
a++,
|
a++,
|
||||||
A = a;
|
A = a;
|
||||||
}());
|
}());
|
||||||
@@ -2916,7 +2944,7 @@ issue_4133: {
|
|||||||
console.log(a);
|
console.log(a);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var b = 1;
|
var a = 1;
|
||||||
console.log(0);
|
console.log(0);
|
||||||
}
|
}
|
||||||
expect_stdout: "0"
|
expect_stdout: "0"
|
||||||
@@ -3062,7 +3090,7 @@ issue_4184: {
|
|||||||
expect_stdout: "42"
|
expect_stdout: "42"
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_4235: {
|
issue_4235_1: {
|
||||||
options = {
|
options = {
|
||||||
inline: true,
|
inline: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
@@ -3080,12 +3108,35 @@ issue_4235: {
|
|||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
|
void function() {
|
||||||
|
var f = console.log(f);
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4235_2: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
varify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
(function() {
|
(function() {
|
||||||
f = console.log(f),
|
{
|
||||||
void 0;
|
const f = 0;
|
||||||
var f;
|
}
|
||||||
|
(function f() {
|
||||||
|
var f = console.log(f);
|
||||||
|
})();
|
||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(void 0);
|
||||||
|
}
|
||||||
expect_stdout: "undefined"
|
expect_stdout: "undefined"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3221,7 +3272,7 @@ issue_4558_1: {
|
|||||||
expect: {
|
expect: {
|
||||||
var a = 0;
|
var a = 0;
|
||||||
var b = c >>>= a;
|
var b = c >>>= a;
|
||||||
var c;
|
var c = 0;
|
||||||
b && a++,
|
b && a++,
|
||||||
console.log(a);
|
console.log(a);
|
||||||
}
|
}
|
||||||
@@ -3231,7 +3282,7 @@ issue_4558_1: {
|
|||||||
issue_4558_2: {
|
issue_4558_2: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
ie8: true,
|
ie: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -3274,3 +3325,293 @@ issue_4662: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "1 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,
|
||||||
|
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_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 {
|
||||||
|
b.p;
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
var b;
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4912_1: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = A = function() {};
|
||||||
|
A;
|
||||||
|
a.prototype = {
|
||||||
|
f: function() {
|
||||||
|
console.log("PASS");
|
||||||
|
},
|
||||||
|
};
|
||||||
|
new A().f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = A = function() {};
|
||||||
|
A;
|
||||||
|
a.prototype = {
|
||||||
|
f: function() {
|
||||||
|
console.log("PASS");
|
||||||
|
},
|
||||||
|
};
|
||||||
|
new A().f();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4912_2: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
var g, f = function() {};
|
||||||
|
f.p = {};
|
||||||
|
(g = f.p.q = function() {}).r = "PASS";
|
||||||
|
return f;
|
||||||
|
}().p.q.r);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function() {
|
||||||
|
var g, f = function() {};
|
||||||
|
f.p = {};
|
||||||
|
(f.p.q = function() {}).r = "PASS";
|
||||||
|
return f;
|
||||||
|
}().p.q.r);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4912_3: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(f, g) {
|
||||||
|
f = function() {};
|
||||||
|
f.p = {};
|
||||||
|
g = f.p.q = function() {};
|
||||||
|
g.r = "PASS";
|
||||||
|
return f;
|
||||||
|
}().p.q.r);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(f, g) {
|
||||||
|
f = function() {};
|
||||||
|
f.p = {};
|
||||||
|
g = f.p.q = function() {};
|
||||||
|
g.r = "PASS";
|
||||||
|
return f;
|
||||||
|
}().p.q.r);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5079: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
do {
|
||||||
|
(a = 123456).p = a;
|
||||||
|
a.q = null;
|
||||||
|
} while (console.log("PASS"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
do {
|
||||||
|
0, 0, null;
|
||||||
|
} while (console.log("PASS"));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5224: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
try {
|
||||||
|
var b = function() {
|
||||||
|
var a = "FAIL 1";
|
||||||
|
null && a;
|
||||||
|
a = console.log(a);
|
||||||
|
}(new function(c, d) {
|
||||||
|
console.log(d);
|
||||||
|
a;
|
||||||
|
}("FAIL 2", Infinity));
|
||||||
|
} finally {
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function f() {
|
||||||
|
try {
|
||||||
|
(function() {
|
||||||
|
var a = "FAIL 1";
|
||||||
|
null;
|
||||||
|
a = console.log(a);
|
||||||
|
})(function() {
|
||||||
|
console.log(1 / 0);
|
||||||
|
a;
|
||||||
|
}());
|
||||||
|
} finally {
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "Infinity"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5271: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
do {
|
||||||
|
var a = b = 0 ^ f, b = b;
|
||||||
|
} while (console.log(42 - b));
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function f() {
|
||||||
|
do {
|
||||||
|
var b;
|
||||||
|
b = 0 ^ f;
|
||||||
|
} while (console.log(42 - b));
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
}
|
||||||
|
|||||||
@@ -684,26 +684,47 @@ prototype_function: {
|
|||||||
side_effects: true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var a = ({valueOf: 0}) < 1;
|
function v() {
|
||||||
var b = ({toString: 0}) < 1;
|
return this.valueOf === v ? "PASS" : "FAIL";
|
||||||
var c = ({valueOf: 0}) + "";
|
}
|
||||||
var d = ({toString: 0}) + "";
|
console.log(({ valueOf: v }) < 1);
|
||||||
var e = (({valueOf: 0}) + "")[2];
|
console.log(({ valueOf: v }) + "");
|
||||||
var f = (({toString: 0}) + "")[2];
|
console.log((( {valueOf: v }) + "")[2]);
|
||||||
var g = ({valueOf: 0}).valueOf();
|
console.log(({ valueOf: v }).valueOf());
|
||||||
var h = ({toString: 0}).toString();
|
function t() {
|
||||||
|
return this.toString === t ? "PASS" : "FAIL";
|
||||||
|
}
|
||||||
|
console.log(({ toString: t }) < 1);
|
||||||
|
console.log(({ toString: t }) + "");
|
||||||
|
console.log((( {toString: t }) + "")[2]);
|
||||||
|
console.log(({ toString: t }).toString());
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var a = ({valueOf: 0}) < 1;
|
function v() {
|
||||||
var b = ({toString: 0}) < 1;
|
return this.valueOf === v ? "PASS" : "FAIL";
|
||||||
var c = ({valueOf: 0}) + "";
|
}
|
||||||
var d = ({toString: 0}) + "";
|
console.log(({ valueOf: v }) < 1);
|
||||||
var e = (({valueOf: 0}) + "")[2];
|
console.log(({ valueOf: v }) + "");
|
||||||
var f = (({toString: 0}) + "")[2];
|
console.log((( {valueOf: v }) + "")[2]);
|
||||||
var g = 0();
|
console.log(({ valueOf: v }).valueOf());
|
||||||
var h = 0();
|
function t() {
|
||||||
|
return this.toString === t ? "PASS" : "FAIL";
|
||||||
|
}
|
||||||
|
console.log(({ toString: t }) < 1);
|
||||||
|
console.log(({ toString: t }) + "");
|
||||||
|
console.log((( {toString: t }) + "")[2]);
|
||||||
|
console.log(({ toString: t }).toString());
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: [
|
||||||
|
"false",
|
||||||
|
"PASS",
|
||||||
|
"S",
|
||||||
|
"PASS",
|
||||||
|
"false",
|
||||||
|
"PASS",
|
||||||
|
"S",
|
||||||
|
"PASS",
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
call_args: {
|
call_args: {
|
||||||
@@ -724,7 +745,7 @@ call_args: {
|
|||||||
expect: {
|
expect: {
|
||||||
var a = 1;
|
var a = 1;
|
||||||
console.log(1);
|
console.log(1);
|
||||||
+(1, 1);
|
1, 1;
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
@@ -748,7 +769,7 @@ call_args_drop_param: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
console.log(1);
|
console.log(1);
|
||||||
+(b, 1);
|
b, 1;
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
@@ -867,6 +888,25 @@ unsafe_charAt_noop: {
|
|||||||
expect_stdout: "f n"
|
expect_stdout: "f n"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
chained_side_effects: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log("foo") || (console.log("bar"), "baz") || console.log("moo");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("foo") || (console.log("bar"), "baz");
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
]
|
||||||
|
expect_warnings: [
|
||||||
|
"WARN: Condition left of || always true [test/compress/evaluate.js:1,8]",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
issue_1649: {
|
issue_1649: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
@@ -2731,8 +2771,7 @@ issue_3944: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
void function f() {
|
void function f() {
|
||||||
while (a = 0 == (a = void 0), console.log(a), void 0);
|
while (0 == void 0, console.log(false), void 0);
|
||||||
var a;
|
|
||||||
f;
|
f;
|
||||||
}();
|
}();
|
||||||
}
|
}
|
||||||
@@ -3181,3 +3220,159 @@ issue_4552: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "NaN"
|
expect_stdout: "NaN"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4886_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log("length" in {
|
||||||
|
__proto__: function() {},
|
||||||
|
length: void 0,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("length" in {
|
||||||
|
__proto__: function() {},
|
||||||
|
length: void 0,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect_stdout: "true"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4886_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log("foo" in {
|
||||||
|
"foo": null,
|
||||||
|
__proto__: 42,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("foo" in {
|
||||||
|
"foo": null,
|
||||||
|
__proto__: 42,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect_stdout: "true"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5354: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
return +a.toExponential(1);
|
||||||
|
}
|
||||||
|
function g(b) {
|
||||||
|
return 0 + b.toFixed(2);
|
||||||
|
}
|
||||||
|
function h(c) {
|
||||||
|
return 1 * c.toPrecision(3);
|
||||||
|
}
|
||||||
|
console.log(typeof f(45), typeof g(67), typeof h(89));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a) {
|
||||||
|
return +a.toExponential(1);
|
||||||
|
}
|
||||||
|
function g(b) {
|
||||||
|
return 0 + b.toFixed(2);
|
||||||
|
}
|
||||||
|
function h(c) {
|
||||||
|
return +c.toPrecision(3);
|
||||||
|
}
|
||||||
|
console.log(typeof f(45), typeof g(67), typeof h(89));
|
||||||
|
}
|
||||||
|
expect_stdout: "number string number"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5356: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
return a++;
|
||||||
|
var a = a;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(+a);
|
||||||
|
var a;
|
||||||
|
}
|
||||||
|
expect_stdout: "NaN"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5362_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = -console;
|
||||||
|
console.log(delete +a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = -console;
|
||||||
|
console.log((+a, true));
|
||||||
|
}
|
||||||
|
expect_stdout: "true"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5362_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = -console;
|
||||||
|
console.log(delete +a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(true);
|
||||||
|
}
|
||||||
|
expect_stdout: "true"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5380: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
keep_fnames: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = function f(b) {
|
||||||
|
return function g() {
|
||||||
|
for (b in { PASS: 42 });
|
||||||
|
}(), b;
|
||||||
|
}("FAIL");
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = function f(b) {
|
||||||
|
return function g() {
|
||||||
|
for (b in { PASS: 42 });
|
||||||
|
}(), b;
|
||||||
|
}("FAIL");
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|||||||
@@ -43,6 +43,28 @@ await: {
|
|||||||
node_version: ">=8"
|
node_version: ">=8"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
assignment_1: {
|
||||||
|
input: {
|
||||||
|
var a = 2;
|
||||||
|
a **= 5;
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: "var a=2;a**=5;console.log(a);"
|
||||||
|
expect_stdout: "32"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
assignment_2: {
|
||||||
|
input: {
|
||||||
|
var a = 8n;
|
||||||
|
a **= a;
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: "var a=8n;a**=a;console.log(a);"
|
||||||
|
expect_stdout: "16777216n"
|
||||||
|
node_version: ">=10.4.0"
|
||||||
|
}
|
||||||
|
|
||||||
evaluate: {
|
evaluate: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
@@ -78,7 +100,7 @@ issue_4664: {
|
|||||||
(function f() {
|
(function f() {
|
||||||
new function(a) {
|
new function(a) {
|
||||||
console.log(typeof f, 2 ** 30, typeof this);
|
console.log(typeof f, 2 ** 30, typeof this);
|
||||||
}(0, A = 0);
|
}(A = 0);
|
||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
expect_stdout: "function 1073741824 object"
|
expect_stdout: "function 1073741824 object"
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ refs: {
|
|||||||
export {};
|
export {};
|
||||||
export { a, b as B, c as case, d as default };
|
export { a, b as B, c as case, d as default };
|
||||||
}
|
}
|
||||||
expect_exact: "export{};export{a as 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: {
|
var_defs: {
|
||||||
@@ -12,7 +12,7 @@ var_defs: {
|
|||||||
export let b = 2, c = 3;
|
export let b = 2, c = 3;
|
||||||
export var { d, e: [] } = f;
|
export var { d, e: [] } = f;
|
||||||
}
|
}
|
||||||
expect_exact: "export const a=1;export let b=2,c=3;export var{d:d,e:[]}=f;"
|
expect_exact: "export const a=1;export let b=2,c=3;export var{d,e:[]}=f;"
|
||||||
}
|
}
|
||||||
|
|
||||||
defuns: {
|
defuns: {
|
||||||
@@ -35,7 +35,7 @@ defaults: {
|
|||||||
export default function*(a, b) {};
|
export default function*(a, b) {};
|
||||||
export default async function f({ c }, ...[ d ]) {};
|
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: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: {
|
defaults_parentheses_1: {
|
||||||
@@ -91,6 +91,13 @@ defaults_parentheses_6: {
|
|||||||
expect_exact: 'export default(function(){while(!console);})()?"FAIL":"PASS";'
|
expect_exact: 'export default(function(){while(!console);})()?"FAIL":"PASS";'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
defaults_regexp: {
|
||||||
|
input: {
|
||||||
|
export default /foo/;
|
||||||
|
}
|
||||||
|
expect_exact: "export default/foo/;"
|
||||||
|
}
|
||||||
|
|
||||||
foreign: {
|
foreign: {
|
||||||
input: {
|
input: {
|
||||||
export * from "foo";
|
export * from "foo";
|
||||||
@@ -242,15 +249,15 @@ hoist_exports_2: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
let f, { foo: o } = 42;
|
let e, a = 42["foo"];
|
||||||
function c(t, { [f]: a }) {
|
function f(t, { [e]: o }) {
|
||||||
t(a, c);
|
t(o, f);
|
||||||
}
|
}
|
||||||
export default 42;
|
export default 42;
|
||||||
export default async function e(t, ...{ [o]: a }) {
|
export default async function n(t, ...{ [a]: o }) {
|
||||||
(await t)(e, a);
|
(await t)(n, o);
|
||||||
};
|
};
|
||||||
export { f as bbb, o as ccc, c as fff };
|
export { e as bbb, a as ccc, f as fff };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -399,6 +406,17 @@ single_use_class_default: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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: {
|
issue_4742_join_vars_1: {
|
||||||
options = {
|
options = {
|
||||||
join_vars: true,
|
join_vars: true,
|
||||||
@@ -464,3 +482,17 @@ issue_4761: {
|
|||||||
}
|
}
|
||||||
expect_exact: '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
@@ -217,7 +217,8 @@ name_collision_1: {
|
|||||||
var obj_foo = 1;
|
var obj_foo = 1;
|
||||||
var obj_bar = 2;
|
var obj_bar = 2;
|
||||||
function f() {
|
function f() {
|
||||||
var obj_foo$0 = 3,
|
var obj,
|
||||||
|
obj_foo$0 = 3,
|
||||||
obj_bar = 4,
|
obj_bar = 4,
|
||||||
obj_b_r = 5,
|
obj_b_r = 5,
|
||||||
obj_b_r$0 = 6,
|
obj_b_r$0 = 6,
|
||||||
@@ -249,7 +250,8 @@ name_collision_2: {
|
|||||||
console.log(o.p === o.p, o["+"](4), o["-"](5), o__$0, o__$1);
|
console.log(o.p === o.p, o["+"](4), o["-"](5), o__$0, o__$1);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var o_p = 1,
|
var o,
|
||||||
|
o_p = 1,
|
||||||
o__ = function(x) {
|
o__ = function(x) {
|
||||||
return x;
|
return x;
|
||||||
},
|
},
|
||||||
@@ -283,7 +285,8 @@ name_collision_3: {
|
|||||||
console.log(o.p === o.p, o["+"](4), o["-"](5));
|
console.log(o.p === o.p, o["+"](4), o["-"](5));
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var o_p = 1,
|
var o,
|
||||||
|
o_p = 1,
|
||||||
o__ = function(x) {
|
o__ = function(x) {
|
||||||
return x;
|
return x;
|
||||||
},
|
},
|
||||||
@@ -315,7 +318,7 @@ name_collision_4: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
console.log(function() {
|
console.log(function() {
|
||||||
var o_p$0 = 0, o_q = "PASS";
|
var o, o_p$0 = 0, o_q = "PASS";
|
||||||
return function(o_p) {
|
return function(o_p) {
|
||||||
if (!o_p$0) return o_p;
|
if (!o_p$0) return o_p;
|
||||||
}(o_q);
|
}(o_q);
|
||||||
@@ -768,7 +771,7 @@ issue_3046: {
|
|||||||
expect: {
|
expect: {
|
||||||
console.log(function(a) {
|
console.log(function(a) {
|
||||||
do {
|
do {
|
||||||
var b_c = a++;
|
var b, b_c = a++;
|
||||||
} while (b_c && a);
|
} while (b_c && a);
|
||||||
return a;
|
return a;
|
||||||
}(0));
|
}(0));
|
||||||
@@ -777,6 +780,32 @@ issue_3046: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
issue_3071_1: {
|
issue_3071_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
hoist_props: true,
|
||||||
|
inline: true,
|
||||||
|
join_vars: true,
|
||||||
|
passes: 3,
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
var obj = {};
|
||||||
|
obj.one = 1;
|
||||||
|
obj.two = 2;
|
||||||
|
console.log(obj.one, obj.two);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(1, 2);
|
||||||
|
}
|
||||||
|
expect_stdout: "1 2"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3071_1_toplevel: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
hoist_props: true,
|
hoist_props: true,
|
||||||
@@ -905,7 +934,7 @@ issue_3411: {
|
|||||||
expect: {
|
expect: {
|
||||||
var c = 1;
|
var c = 1;
|
||||||
!function f() {
|
!function f() {
|
||||||
var o_p = --c && f();
|
var o, o_p = --c && f();
|
||||||
+{} || console.log("PASS");
|
+{} || console.log("PASS");
|
||||||
}();
|
}();
|
||||||
}
|
}
|
||||||
@@ -1016,9 +1045,7 @@ issue_3945_1: {
|
|||||||
expect: {
|
expect: {
|
||||||
function f() {
|
function f() {
|
||||||
o.p;
|
o.p;
|
||||||
var o = {
|
var o, o_q = 0;
|
||||||
q: 0,
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1037,9 +1064,7 @@ issue_3945_2: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
console.log(typeof o);
|
console.log(typeof o);
|
||||||
var o = {
|
var o, o_p = 0;
|
||||||
p: 0,
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
expect_stdout: "undefined"
|
expect_stdout: "undefined"
|
||||||
}
|
}
|
||||||
@@ -1094,3 +1119,60 @@ object_super: {
|
|||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4985: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = { p: 42 };
|
||||||
|
console.log(function() {
|
||||||
|
a;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a, a_p = 42;
|
||||||
|
console.log(function() {
|
||||||
|
({});
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5182: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
merge_vars: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = console;
|
||||||
|
log = o.log;
|
||||||
|
o = {
|
||||||
|
p: function(a) {
|
||||||
|
console.log(a ? "PASS" : "FAIL");
|
||||||
|
return a;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
log(o.p(42));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = console;
|
||||||
|
log = o.log;
|
||||||
|
o = function(a) {
|
||||||
|
console.log(a ? "PASS" : "FAIL");
|
||||||
|
return a;
|
||||||
|
};
|
||||||
|
log(o(42));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"PASS",
|
||||||
|
"42",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|||||||
@@ -135,7 +135,31 @@ issue_2295: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_4487: {
|
issue_4487_1: {
|
||||||
|
options = {
|
||||||
|
functions: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
keep_fnames: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = function f() {
|
||||||
|
var f = console.log(typeof f);
|
||||||
|
};
|
||||||
|
var b = a();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = function f() {
|
||||||
|
var f = console.log(typeof f);
|
||||||
|
};
|
||||||
|
a();
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4487_2: {
|
||||||
options = {
|
options = {
|
||||||
functions: true,
|
functions: true,
|
||||||
hoist_vars: true,
|
hoist_vars: true,
|
||||||
@@ -153,13 +177,37 @@ issue_4487: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function a() {
|
function a() {
|
||||||
var a = console.log(typeof a);
|
var f = console.log(typeof f);
|
||||||
}
|
}
|
||||||
a();
|
a();
|
||||||
}
|
}
|
||||||
expect_stdout: "undefined"
|
expect_stdout: "undefined"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4487_3: {
|
||||||
|
options = {
|
||||||
|
functions: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
keep_fnames: true,
|
||||||
|
passes: 3,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = function f() {
|
||||||
|
var f = console.log(typeof f);
|
||||||
|
};
|
||||||
|
var b = a();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function a() {
|
||||||
|
console.log(typeof void 0);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
issue_4489: {
|
issue_4489: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
@@ -176,8 +224,7 @@ issue_4489: {
|
|||||||
console.log(k);
|
console.log(k);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
!(A = 0);
|
for (var k in !(A = 0));
|
||||||
for (var k in true);
|
|
||||||
console.log(k);
|
console.log(k);
|
||||||
}
|
}
|
||||||
expect_stdout: "undefined"
|
expect_stdout: "undefined"
|
||||||
@@ -202,8 +249,7 @@ issue_4517: {
|
|||||||
expect: {
|
expect: {
|
||||||
console.log(function() {
|
console.log(function() {
|
||||||
var a = 2;
|
var a = 2;
|
||||||
A = a;
|
return (A = a) + typeof !1;
|
||||||
return A + typeof !1;
|
|
||||||
}());
|
}());
|
||||||
}
|
}
|
||||||
expect_stdout: "2boolean"
|
expect_stdout: "2boolean"
|
||||||
@@ -234,9 +280,326 @@ issue_4736: {
|
|||||||
(function() {
|
(function() {
|
||||||
(function() {
|
(function() {
|
||||||
0,
|
0,
|
||||||
console.log(1073741824);
|
console.log(1 << 30);
|
||||||
})();
|
})();
|
||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
expect_stdout: "1073741824"
|
expect_stdout: "1073741824"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4839: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var log = console.log, o = function(a, b) {
|
||||||
|
return b && b;
|
||||||
|
}("foo");
|
||||||
|
for (var k in o)
|
||||||
|
throw "FAIL";
|
||||||
|
log("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var k, log = console.log;
|
||||||
|
for (k in void 0)
|
||||||
|
throw "FAIL";
|
||||||
|
log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4859: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
keep_infinity: true,
|
||||||
|
merge_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
var b = (a = 2, 1 / 0), c = 3;
|
||||||
|
var d = a + b;
|
||||||
|
console.log(d);
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function f(a) {
|
||||||
|
console.log(2 + 1 / 0);
|
||||||
|
return f;
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "Infinity"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4893_1: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
function g() {}
|
||||||
|
var a = null;
|
||||||
|
var b = null;
|
||||||
|
var c = null;
|
||||||
|
b.p += a = 42;
|
||||||
|
f;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
f();
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
try{
|
||||||
|
(function f() {
|
||||||
|
null.p += 42;
|
||||||
|
f;
|
||||||
|
})();
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4893_2: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
function g() {}
|
||||||
|
var a = null;
|
||||||
|
var b = null;
|
||||||
|
var c = null;
|
||||||
|
b.p += a = 42;
|
||||||
|
f;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
f();
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
try{
|
||||||
|
(function() {
|
||||||
|
var a;
|
||||||
|
a = null;
|
||||||
|
a.p += 42;
|
||||||
|
})();
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4898: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
loops: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
do {
|
||||||
|
var b = [ console.log("PASS") ];
|
||||||
|
var c = b;
|
||||||
|
} while (c.p = 0);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var b;
|
||||||
|
b = [ console.log("PASS") ];
|
||||||
|
b.p = 0;
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5187: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
var a = 42;
|
||||||
|
do {
|
||||||
|
var b = { 0: a++ };
|
||||||
|
} while (console.log(b[b ^= 0]));
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function() {
|
||||||
|
var b, a = 42;
|
||||||
|
do {
|
||||||
|
b = { 0: a++ };
|
||||||
|
} while (console.log(b[b ^= 0]));
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5195: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
var a;
|
||||||
|
do {
|
||||||
|
var b = { p: a };
|
||||||
|
} while (console.log(b += ""));
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function() {
|
||||||
|
var a, b;
|
||||||
|
do {
|
||||||
|
b = { p: a };
|
||||||
|
} while (console.log(b += ""));
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "[object Object]"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5378: {
|
||||||
|
options = {
|
||||||
|
hoist_vars: true,
|
||||||
|
inline: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 2;
|
||||||
|
while (a--)
|
||||||
|
(function() {
|
||||||
|
var b;
|
||||||
|
var c;
|
||||||
|
while (console.log(b));
|
||||||
|
--b;
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 2;
|
||||||
|
while (a--) {
|
||||||
|
b = void 0;
|
||||||
|
var b, c;
|
||||||
|
while (console.log(b));
|
||||||
|
--b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"undefined",
|
||||||
|
"undefined",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5411_1: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
dead_code: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS";
|
||||||
|
b++;
|
||||||
|
b = a;
|
||||||
|
var b = b, c = c && c[b];
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var b, c, a = "PASS";
|
||||||
|
b++;
|
||||||
|
b = a;
|
||||||
|
c = c && c[b];
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5411_2: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS";
|
||||||
|
b++;
|
||||||
|
b = a;
|
||||||
|
var b = b, c = c && c[b];
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var b, c;
|
||||||
|
b++;
|
||||||
|
b = "PASS",
|
||||||
|
c = c && c[b];
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5411_3: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = console;
|
||||||
|
a++;
|
||||||
|
var a = A = a;
|
||||||
|
console.log(A);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = console;
|
||||||
|
a = A = ++a;
|
||||||
|
console.log(A);
|
||||||
|
}
|
||||||
|
expect_stdout: "NaN"
|
||||||
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -327,7 +327,7 @@ issue_512: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if_var_return: {
|
if_var_return_1: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
if_return: true,
|
if_return: true,
|
||||||
@@ -373,6 +373,76 @@ if_var_return: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if_var_return_2: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
if_return: true,
|
||||||
|
sequences: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
var a = w();
|
||||||
|
if (x())
|
||||||
|
return y();
|
||||||
|
z();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function() {
|
||||||
|
var a = w();
|
||||||
|
return x() ? y() : (z(), void 0);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if_var_retrn_3: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
if_return: true,
|
||||||
|
sequences: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
f(function() {
|
||||||
|
var a = w();
|
||||||
|
if (x())
|
||||||
|
return y(a);
|
||||||
|
z();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
f(function() {
|
||||||
|
var a = w();
|
||||||
|
if (x())
|
||||||
|
return y(a);
|
||||||
|
z();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if_var_return_4: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
if_return: true,
|
||||||
|
sequences: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
if (u())
|
||||||
|
return v();
|
||||||
|
var a = w();
|
||||||
|
if (x())
|
||||||
|
return y();
|
||||||
|
z();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
return u() ? v() : (a = w(), x() ? y() : (z(), void 0));
|
||||||
|
var a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if_if_return_return: {
|
if_if_return_return: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
@@ -545,7 +615,36 @@ if_body_return_3: {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_3600: {
|
issue_3600_1: {
|
||||||
|
options = {
|
||||||
|
if_return: true,
|
||||||
|
inline: 3,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var c = 0;
|
||||||
|
(function() {
|
||||||
|
if ([ ][c++]); else return;
|
||||||
|
return void function() {
|
||||||
|
var b = --b, a = c = 42;
|
||||||
|
return c;
|
||||||
|
}();
|
||||||
|
})();
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var c = 0;
|
||||||
|
(function() {
|
||||||
|
if ([][c++]) b = --b, c = 42;
|
||||||
|
var b;
|
||||||
|
})();
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect_stdout: "1"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3600_2: {
|
||||||
options = {
|
options = {
|
||||||
if_return: true,
|
if_return: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
@@ -566,7 +665,9 @@ issue_3600: {
|
|||||||
expect: {
|
expect: {
|
||||||
var c = 0;
|
var c = 0;
|
||||||
(function() {
|
(function() {
|
||||||
if ([][c++]) b = --b, c = 42;
|
if ([][c++])
|
||||||
|
b = --b,
|
||||||
|
c = 42;
|
||||||
var b;
|
var b;
|
||||||
})();
|
})();
|
||||||
console.log(c);
|
console.log(c);
|
||||||
@@ -597,7 +698,9 @@ iife_if_return_simple: {
|
|||||||
|
|
||||||
nested_if_break: {
|
nested_if_break: {
|
||||||
options = {
|
options = {
|
||||||
|
conditionals: true,
|
||||||
if_return: true,
|
if_return: true,
|
||||||
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
for (var i = 0; i < 3; i++)
|
for (var i = 0; i < 3; i++)
|
||||||
@@ -608,8 +711,7 @@ nested_if_break: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
for (var i = 0; i < 3; i++)
|
for (var i = 0; i < 3; i++)
|
||||||
L1: if ("number" == typeof i)
|
L1: "number" == typeof i && 0 !== i && console.log(i);
|
||||||
if (0 !== i) console.log(i);
|
|
||||||
}
|
}
|
||||||
expect_stdout: [
|
expect_stdout: [
|
||||||
"1",
|
"1",
|
||||||
@@ -648,11 +750,11 @@ nested_if_continue: {
|
|||||||
function f(n) {
|
function f(n) {
|
||||||
for (var i = 0;
|
for (var i = 0;
|
||||||
"number" == typeof n
|
"number" == typeof n
|
||||||
&& (0 !== n
|
&& (0 === n
|
||||||
? 1 !== n
|
? console.log("even", i)
|
||||||
? i++
|
: 1 === n
|
||||||
: console.log("odd", i)
|
? console.log("odd", i)
|
||||||
: console.log("even", i)),
|
: i++),
|
||||||
0 <= (n -= 2););
|
0 <= (n -= 2););
|
||||||
}
|
}
|
||||||
f(37);
|
f(37);
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ keys_only: {
|
|||||||
input: {
|
input: {
|
||||||
import { as as foo, bar, delete as baz } from "moo";
|
import { as as foo, bar, delete as baz } from "moo";
|
||||||
}
|
}
|
||||||
expect_exact: 'import{as as foo,bar as bar,delete as baz}from"moo";'
|
expect_exact: 'import{as as foo,bar,delete as baz}from"moo";'
|
||||||
}
|
}
|
||||||
|
|
||||||
default_all: {
|
default_all: {
|
||||||
@@ -37,7 +37,7 @@ default_keys: {
|
|||||||
input: {
|
input: {
|
||||||
import foo, { bar } from "baz";
|
import foo, { bar } from "baz";
|
||||||
}
|
}
|
||||||
expect_exact: 'import foo,{bar as bar}from"baz";'
|
expect_exact: 'import foo,{bar}from"baz";'
|
||||||
}
|
}
|
||||||
|
|
||||||
dynamic: {
|
dynamic: {
|
||||||
@@ -54,13 +54,22 @@ dynamic_nought: {
|
|||||||
expect_exact: "import(foo);"
|
expect_exact: "import(foo);"
|
||||||
}
|
}
|
||||||
|
|
||||||
import_meta: {
|
import_meta_1: {
|
||||||
input: {
|
input: {
|
||||||
console.log(import.meta, import.meta.url);
|
console.log(import.meta, import.meta.url);
|
||||||
}
|
}
|
||||||
expect_exact: "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: {
|
same_quotes: {
|
||||||
beautify = {
|
beautify = {
|
||||||
beautify: true,
|
beautify: true,
|
||||||
@@ -85,13 +94,31 @@ drop_unused: {
|
|||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
import a, * as b from "foo";
|
import a, * as b from "foo";
|
||||||
import { c, bar as d } from "baz";
|
import { c } from "bar";
|
||||||
console.log(c);
|
import { d, _ as e } from "baz";
|
||||||
|
console.log(d);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
import "foo";
|
import "foo";
|
||||||
import { c as c } from "baz";
|
import "bar";
|
||||||
console.log(c);
|
import { d as d } from "baz";
|
||||||
|
console.log(d);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_side_effect_free: {
|
||||||
|
options = {
|
||||||
|
imports: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
import foo from "bar";
|
||||||
|
var a = foo;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
import "bar";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
100
test/compress/indentation.js
Normal file
100
test/compress/indentation.js
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
numeric: {
|
||||||
|
beautify = {
|
||||||
|
beautify: true,
|
||||||
|
indent_start: 1,
|
||||||
|
indent_level: 3,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
switch (42) {
|
||||||
|
case null:
|
||||||
|
console.log("FAIL");
|
||||||
|
}
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
" switch (42) {",
|
||||||
|
" case null:",
|
||||||
|
' console.log("FAIL");',
|
||||||
|
" }",
|
||||||
|
"",
|
||||||
|
' console.log("PASS");',
|
||||||
|
]
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
spaces: {
|
||||||
|
beautify = {
|
||||||
|
beautify: true,
|
||||||
|
indent_start: " ",
|
||||||
|
indent_level: " ",
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
switch (42) {
|
||||||
|
case null:
|
||||||
|
console.log("FAIL");
|
||||||
|
}
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
" switch (42) {",
|
||||||
|
" case null:",
|
||||||
|
' console.log("FAIL");',
|
||||||
|
" }",
|
||||||
|
"",
|
||||||
|
' console.log("PASS");',
|
||||||
|
]
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
tabs: {
|
||||||
|
beautify = {
|
||||||
|
beautify: true,
|
||||||
|
indent_start: "\t",
|
||||||
|
indent_level: "\t",
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
switch (42) {
|
||||||
|
case null:
|
||||||
|
console.log("FAIL");
|
||||||
|
}
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"\tswitch (42) {",
|
||||||
|
"\tcase null:",
|
||||||
|
'\t\tconsole.log("FAIL");',
|
||||||
|
"\t}",
|
||||||
|
"",
|
||||||
|
'\tconsole.log("PASS");',
|
||||||
|
]
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mixed: {
|
||||||
|
beautify = {
|
||||||
|
beautify: true,
|
||||||
|
indent_start: "\n",
|
||||||
|
indent_level: " \t",
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
switch (42) {
|
||||||
|
case null:
|
||||||
|
console.log("FAIL");
|
||||||
|
}
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"",
|
||||||
|
"switch (42) {",
|
||||||
|
"",
|
||||||
|
" case null:",
|
||||||
|
"",
|
||||||
|
' \tconsole.log("FAIL");',
|
||||||
|
"",
|
||||||
|
"}",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
'console.log("PASS");',
|
||||||
|
]
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
@@ -4,22 +4,21 @@ multiple_functions: {
|
|||||||
if_return: true,
|
if_return: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
( function() {
|
(function() {
|
||||||
if ( !window ) {
|
if (!window)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
function f() {}
|
function f() {}
|
||||||
function g() {}
|
function g() {}
|
||||||
} )();
|
})();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
( function() {
|
(function() {
|
||||||
// NOTE: other compression steps will reduce this
|
// NOTE: other compression steps will reduce this
|
||||||
// down to just `window`.
|
// down to just `window`.
|
||||||
if ( !window );
|
if (!window);
|
||||||
function f() {}
|
function f() {}
|
||||||
function g() {}
|
function g() {}
|
||||||
} )();
|
})();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -29,18 +28,17 @@ single_function: {
|
|||||||
if_return: true,
|
if_return: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
( function() {
|
(function() {
|
||||||
if ( !window ) {
|
if (!window)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
function f() {}
|
function f() {}
|
||||||
} )();
|
})();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
( function() {
|
(function() {
|
||||||
if ( !window );
|
if (!window);
|
||||||
function f() {}
|
function f() {}
|
||||||
} )();
|
})();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -50,28 +48,26 @@ deeply_nested: {
|
|||||||
if_return: true,
|
if_return: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
( function() {
|
(function() {
|
||||||
if ( !window ) {
|
if (!window)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
function f() {}
|
function f() {}
|
||||||
function g() {}
|
function g() {}
|
||||||
if ( !document ) {
|
if (!document)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
function h() {}
|
function h() {}
|
||||||
} )();
|
})();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
( function() {
|
(function() {
|
||||||
// NOTE: other compression steps will reduce this
|
// NOTE: other compression steps will reduce this
|
||||||
// down to just `window`.
|
// down to just `window`.
|
||||||
if ( window )
|
if (!window);
|
||||||
if ( !document );
|
else if (!document);
|
||||||
function f() {}
|
function f() {}
|
||||||
function g() {}
|
function g() {}
|
||||||
function h() {}
|
function h() {}
|
||||||
} )();
|
})();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -81,18 +77,18 @@ not_hoisted_when_already_nested: {
|
|||||||
if_return: true,
|
if_return: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
( function() {
|
(function() {
|
||||||
if ( !window ) {
|
if (!window)
|
||||||
return;
|
return;
|
||||||
}
|
if (foo) function f() {}
|
||||||
if ( foo ) function f() {}
|
})();
|
||||||
} )();
|
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
( function() {
|
(function() {
|
||||||
if ( window )
|
if (!window);
|
||||||
if ( foo ) function f() {}
|
else if (foo)
|
||||||
} )();
|
function f() {}
|
||||||
|
})();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -104,15 +100,19 @@ defun_if_return: {
|
|||||||
input: {
|
input: {
|
||||||
function e() {
|
function e() {
|
||||||
function f() {}
|
function f() {}
|
||||||
if (!window) return;
|
if (!window)
|
||||||
else function g() {}
|
return;
|
||||||
|
else
|
||||||
|
function g() {}
|
||||||
function h() {}
|
function h() {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function e() {
|
function e() {
|
||||||
function f() {}
|
function f() {}
|
||||||
if (window) function g() {}
|
if (!window);
|
||||||
|
else
|
||||||
|
function g() {}
|
||||||
function h() {}
|
function h() {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -126,8 +126,10 @@ defun_hoist_funs: {
|
|||||||
input: {
|
input: {
|
||||||
function e() {
|
function e() {
|
||||||
function f() {}
|
function f() {}
|
||||||
if (!window) return;
|
if (!window)
|
||||||
else function g() {}
|
return;
|
||||||
|
else
|
||||||
|
function g() {}
|
||||||
function h() {}
|
function h() {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -136,7 +138,7 @@ defun_hoist_funs: {
|
|||||||
function f() {}
|
function f() {}
|
||||||
function g() {}
|
function g() {}
|
||||||
function h() {}
|
function h() {}
|
||||||
if (window);
|
if (!window);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -149,15 +151,18 @@ defun_else_if_return: {
|
|||||||
input: {
|
input: {
|
||||||
function e() {
|
function e() {
|
||||||
function f() {}
|
function f() {}
|
||||||
if (window) function g() {}
|
if (window)
|
||||||
else return;
|
function g() {}
|
||||||
|
else
|
||||||
|
return;
|
||||||
function h() {}
|
function h() {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function e() {
|
function e() {
|
||||||
function f() {}
|
function f() {}
|
||||||
if (window) function g() {}
|
if (window)
|
||||||
|
function g() {}
|
||||||
function h() {}
|
function h() {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ mangle_keep_fnames_false: {
|
|||||||
keep_fnames: true,
|
keep_fnames: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
keep_fnames : false,
|
keep_fnames: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
"use strict";
|
"use strict";
|
||||||
@@ -30,7 +30,7 @@ mangle_keep_fnames_true: {
|
|||||||
keep_fnames: true,
|
keep_fnames: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
keep_fnames : true,
|
keep_fnames: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
pure_function_calls: {
|
pure_function_calls: {
|
||||||
options = {
|
options = {
|
||||||
|
annotations: true,
|
||||||
booleans: true,
|
booleans: true,
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
@@ -60,6 +61,7 @@ pure_function_calls: {
|
|||||||
|
|
||||||
pure_function_calls_toplevel: {
|
pure_function_calls_toplevel: {
|
||||||
options = {
|
options = {
|
||||||
|
annotations: true,
|
||||||
booleans: true,
|
booleans: true,
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
@@ -126,6 +128,7 @@ pure_function_calls_toplevel: {
|
|||||||
|
|
||||||
should_warn: {
|
should_warn: {
|
||||||
options = {
|
options = {
|
||||||
|
annotations: true,
|
||||||
booleans: true,
|
booleans: true,
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ typeof_eq_undefined: {
|
|||||||
typeof_eq_undefined_ie8: {
|
typeof_eq_undefined_ie8: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
ie8: true,
|
ie: true,
|
||||||
typeofs: true,
|
typeofs: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
|
|||||||
@@ -40,6 +40,9 @@ conditional_false_stray_else_in_loop: {
|
|||||||
console.log(i);
|
console.log(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect_exact: "for(var i=1;i<=4;++i)if(!(i<=2))console.log(i);"
|
expect_exact: "for(var i=1;i<=4;++i)if(i<=2);else console.log(i);"
|
||||||
expect_stdout: true
|
expect_stdout: [
|
||||||
|
"3",
|
||||||
|
"4",
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
screw_ie8: {
|
screw_ie8: {
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
try { throw "foo"; } catch (x) { console.log(x); }
|
try { throw "foo"; } catch (x) { console.log(x); }
|
||||||
@@ -16,10 +16,10 @@ screw_ie8: {
|
|||||||
|
|
||||||
support_ie8: {
|
support_ie8: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
try { throw "foo"; } catch (x) { console.log(x); }
|
try { throw "foo"; } catch (x) { console.log(x); }
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
mangle_catch: {
|
mangle_catch: {
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -22,11 +22,11 @@ mangle_catch: {
|
|||||||
|
|
||||||
mangle_catch_ie8: {
|
mangle_catch_ie8: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -44,11 +44,11 @@ mangle_catch_ie8: {
|
|||||||
|
|
||||||
mangle_catch_var: {
|
mangle_catch_var: {
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -66,11 +66,11 @@ mangle_catch_var: {
|
|||||||
|
|
||||||
mangle_catch_var_ie8: {
|
mangle_catch_var_ie8: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -88,11 +88,11 @@ mangle_catch_var_ie8: {
|
|||||||
|
|
||||||
mangle_catch_toplevel: {
|
mangle_catch_toplevel: {
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -110,11 +110,11 @@ mangle_catch_toplevel: {
|
|||||||
|
|
||||||
mangle_catch_ie8_toplevel: {
|
mangle_catch_ie8_toplevel: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -132,11 +132,11 @@ mangle_catch_ie8_toplevel: {
|
|||||||
|
|
||||||
mangle_catch_var_toplevel: {
|
mangle_catch_var_toplevel: {
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -154,11 +154,11 @@ mangle_catch_var_toplevel: {
|
|||||||
|
|
||||||
mangle_catch_var_ie8_toplevel: {
|
mangle_catch_var_ie8_toplevel: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -176,11 +176,11 @@ mangle_catch_var_ie8_toplevel: {
|
|||||||
|
|
||||||
mangle_catch_redef_1: {
|
mangle_catch_redef_1: {
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -198,11 +198,11 @@ mangle_catch_redef_1: {
|
|||||||
|
|
||||||
mangle_catch_redef_1_ie8: {
|
mangle_catch_redef_1_ie8: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -220,11 +220,11 @@ mangle_catch_redef_1_ie8: {
|
|||||||
|
|
||||||
mangle_catch_redef_1_toplevel: {
|
mangle_catch_redef_1_toplevel: {
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -242,11 +242,11 @@ mangle_catch_redef_1_toplevel: {
|
|||||||
|
|
||||||
mangle_catch_redef_1_ie8_toplevel: {
|
mangle_catch_redef_1_ie8_toplevel: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -264,11 +264,11 @@ mangle_catch_redef_1_ie8_toplevel: {
|
|||||||
|
|
||||||
mangle_catch_redef_2: {
|
mangle_catch_redef_2: {
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -285,11 +285,11 @@ mangle_catch_redef_2: {
|
|||||||
|
|
||||||
mangle_catch_redef_2_ie8: {
|
mangle_catch_redef_2_ie8: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -306,11 +306,11 @@ mangle_catch_redef_2_ie8: {
|
|||||||
|
|
||||||
mangle_catch_redef_2_toplevel: {
|
mangle_catch_redef_2_toplevel: {
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -327,11 +327,11 @@ mangle_catch_redef_2_toplevel: {
|
|||||||
|
|
||||||
mangle_catch_redef_2_ie8_toplevel: {
|
mangle_catch_redef_2_ie8_toplevel: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -348,7 +348,7 @@ mangle_catch_redef_2_ie8_toplevel: {
|
|||||||
|
|
||||||
mangle_catch_redef_3: {
|
mangle_catch_redef_3: {
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -356,6 +356,7 @@ mangle_catch_redef_3: {
|
|||||||
try {
|
try {
|
||||||
throw 0;
|
throw 0;
|
||||||
} catch (o) {
|
} catch (o) {
|
||||||
|
// prints "FAIL" if inlined on Node.js v4-
|
||||||
(function() {
|
(function() {
|
||||||
function f() {
|
function f() {
|
||||||
o = "FAIL";
|
o = "FAIL";
|
||||||
@@ -366,12 +367,13 @@ mangle_catch_redef_3: {
|
|||||||
console.log(o);
|
console.log(o);
|
||||||
}
|
}
|
||||||
expect_exact: 'var o="PASS";try{throw 0}catch(o){(function(){function c(){o="FAIL"}c(),c()})()}console.log(o);'
|
expect_exact: 'var o="PASS";try{throw 0}catch(o){(function(){function c(){o="FAIL"}c(),c()})()}console.log(o);'
|
||||||
expect_stdout: true
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|
||||||
mangle_catch_redef_3_toplevel: {
|
mangle_catch_redef_3_toplevel: {
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -379,6 +381,7 @@ mangle_catch_redef_3_toplevel: {
|
|||||||
try {
|
try {
|
||||||
throw 0;
|
throw 0;
|
||||||
} catch (o) {
|
} catch (o) {
|
||||||
|
// prints "FAIL" if inlined on Node.js v4-
|
||||||
(function() {
|
(function() {
|
||||||
function f() {
|
function f() {
|
||||||
o = "FAIL";
|
o = "FAIL";
|
||||||
@@ -389,12 +392,13 @@ mangle_catch_redef_3_toplevel: {
|
|||||||
console.log(o);
|
console.log(o);
|
||||||
}
|
}
|
||||||
expect_exact: 'var c="PASS";try{throw 0}catch(c){(function(){function o(){c="FAIL"}o(),o()})()}console.log(c);'
|
expect_exact: 'var c="PASS";try{throw 0}catch(c){(function(){function o(){c="FAIL"}o(),o()})()}console.log(c);'
|
||||||
expect_stdout: true
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|
||||||
mangle_catch_redef_3_ie8: {
|
mangle_catch_redef_3_ie8: {
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -402,6 +406,7 @@ mangle_catch_redef_3_ie8: {
|
|||||||
try {
|
try {
|
||||||
throw 0;
|
throw 0;
|
||||||
} catch (o) {
|
} catch (o) {
|
||||||
|
// prints "FAIL" if inlined on Node.js v4-
|
||||||
(function() {
|
(function() {
|
||||||
function f() {
|
function f() {
|
||||||
o = "FAIL";
|
o = "FAIL";
|
||||||
@@ -412,12 +417,13 @@ mangle_catch_redef_3_ie8: {
|
|||||||
console.log(o);
|
console.log(o);
|
||||||
}
|
}
|
||||||
expect_exact: 'var o="PASS";try{throw 0}catch(o){(function(){function c(){o="FAIL"}c(),c()})()}console.log(o);'
|
expect_exact: 'var o="PASS";try{throw 0}catch(o){(function(){function c(){o="FAIL"}c(),c()})()}console.log(o);'
|
||||||
expect_stdout: true
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|
||||||
mangle_catch_redef_3_ie8_toplevel: {
|
mangle_catch_redef_3_ie8_toplevel: {
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -425,6 +431,7 @@ mangle_catch_redef_3_ie8_toplevel: {
|
|||||||
try {
|
try {
|
||||||
throw 0;
|
throw 0;
|
||||||
} catch (o) {
|
} catch (o) {
|
||||||
|
// prints "FAIL" if inlined on Node.js v4-
|
||||||
(function() {
|
(function() {
|
||||||
function f() {
|
function f() {
|
||||||
o = "FAIL";
|
o = "FAIL";
|
||||||
@@ -435,5 +442,6 @@ mangle_catch_redef_3_ie8_toplevel: {
|
|||||||
console.log(o);
|
console.log(o);
|
||||||
}
|
}
|
||||||
expect_exact: 'var c="PASS";try{throw 0}catch(c){(function(){function o(){c="FAIL"}o(),o()})()}console.log(c);'
|
expect_exact: 'var c="PASS";try{throw 0}catch(c){(function(){function o(){c="FAIL"}o(),o()})()}console.log(c);'
|
||||||
expect_stdout: true
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
function_iife_catch: {
|
function_iife_catch: {
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(n) {
|
function f(n) {
|
||||||
@@ -21,7 +21,7 @@ function_iife_catch: {
|
|||||||
|
|
||||||
function_iife_catch_ie8: {
|
function_iife_catch_ie8: {
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(n) {
|
function f(n) {
|
||||||
@@ -42,7 +42,7 @@ function_iife_catch_ie8: {
|
|||||||
|
|
||||||
function_catch_catch: {
|
function_catch_catch: {
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var o = 0;
|
var o = 0;
|
||||||
@@ -70,7 +70,7 @@ function_catch_catch: {
|
|||||||
|
|
||||||
function_catch_catch_ie8: {
|
function_catch_catch_ie8: {
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var o = 0;
|
var o = 0;
|
||||||
|
|||||||
@@ -426,6 +426,7 @@ wrap_iife_in_return_call: {
|
|||||||
|
|
||||||
pure_annotation_1: {
|
pure_annotation_1: {
|
||||||
options = {
|
options = {
|
||||||
|
annotations: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
@@ -439,6 +440,7 @@ pure_annotation_1: {
|
|||||||
|
|
||||||
pure_annotation_2: {
|
pure_annotation_2: {
|
||||||
options = {
|
options = {
|
||||||
|
annotations: true,
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
|
|||||||
@@ -317,7 +317,35 @@ iife: {
|
|||||||
typeof function g() {}();
|
typeof function g() {}();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
x = 42, function a() {}(), function b() {}(), function c() {}(),
|
x = 42,
|
||||||
function d() {}(), function e() {}(), function f() {}(), typeof function g() {}();
|
function a() {}(),
|
||||||
|
!function b() {}(),
|
||||||
|
~function c() {}(),
|
||||||
|
+function d() {}(),
|
||||||
|
-function e() {}(),
|
||||||
|
void function f() {}(),
|
||||||
|
typeof function g() {}();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
iife_drop_side_effect_free: {
|
||||||
|
options = {
|
||||||
|
expression: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
x = 42;
|
||||||
|
(function a() {})();
|
||||||
|
!function b() {}();
|
||||||
|
~function c() {}();
|
||||||
|
+function d() {}();
|
||||||
|
-function e() {}();
|
||||||
|
void function f() {}();
|
||||||
|
typeof function g() {}();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
x = 42,
|
||||||
|
typeof void 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
dont_mangle_arguments: {
|
dont_mangle_arguments: {
|
||||||
mangle = {
|
|
||||||
};
|
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
booleans: true,
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
@@ -21,12 +19,13 @@ dont_mangle_arguments: {
|
|||||||
side_effects: true,
|
side_effects: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
|
mangle = {}
|
||||||
input: {
|
input: {
|
||||||
(function(){
|
(function(){
|
||||||
var arguments = arguments, not_arguments = 9;
|
var arguments = arguments, not_arguments = 9;
|
||||||
console.log(not_arguments, arguments);
|
console.log(not_arguments, arguments);
|
||||||
})(5,6,7);
|
})(5, 6, 7);
|
||||||
}
|
}
|
||||||
expect_exact: "(function(){var arguments=arguments,o=9;console.log(o,arguments)})(5,6,7);"
|
expect_exact: "(function(){var arguments,o=9;console.log(o,arguments)})(5,6,7);"
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
issue979_reported: {
|
reported: {
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
booleans: true,
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
@@ -17,29 +17,26 @@ issue979_reported: {
|
|||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f1() {
|
function f1() {
|
||||||
if (a == 1 || b == 2) {
|
if (a == 1 || b == 2)
|
||||||
foo();
|
foo();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
function f2() {
|
function f2() {
|
||||||
if (!(a == 1 || b == 2)) {
|
if (!(a == 1 || b == 2));
|
||||||
}
|
else
|
||||||
else {
|
|
||||||
foo();
|
foo();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function f1() {
|
function f1() {
|
||||||
1!=a&&2!=b||foo();
|
1 != a && 2 != b || foo();
|
||||||
}
|
}
|
||||||
function f2() {
|
function f2() {
|
||||||
1!=a&&2!=b||foo();
|
1 != a && 2 != b || foo();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
issue979_test_negated_is_best: {
|
test_negated_is_best: {
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
booleans: true,
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
@@ -58,53 +55,47 @@ issue979_test_negated_is_best: {
|
|||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f3() {
|
function f3() {
|
||||||
if (a == 1 | b == 2) {
|
if (a == 1 | b == 2)
|
||||||
foo();
|
foo();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
function f4() {
|
function f4() {
|
||||||
if (!(a == 1 | b == 2)) {
|
if (!(a == 1 | b == 2));
|
||||||
}
|
else
|
||||||
else {
|
|
||||||
foo();
|
foo();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
function f5() {
|
function f5() {
|
||||||
if (a == 1 && b == 2) {
|
if (a == 1 && b == 2)
|
||||||
foo();
|
foo();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
function f6() {
|
function f6() {
|
||||||
if (!(a == 1 && b == 2)) {
|
if (!(a == 1 && b == 2));
|
||||||
}
|
else
|
||||||
else {
|
|
||||||
foo();
|
foo();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
function f7() {
|
function f7() {
|
||||||
if (a == 1 || b == 2) {
|
if (a == 1 || b == 2)
|
||||||
foo();
|
foo();
|
||||||
}
|
else
|
||||||
else {
|
|
||||||
return bar();
|
return bar();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function f3() {
|
function f3() {
|
||||||
1==a|2==b&&foo();
|
1 == a | 2 == b && foo();
|
||||||
}
|
}
|
||||||
function f4() {
|
function f4() {
|
||||||
1==a|2==b&&foo();
|
1 == a | 2 == b && foo();
|
||||||
}
|
}
|
||||||
function f5() {
|
function f5() {
|
||||||
1==a&&2==b&&foo();
|
1 == a && 2 == b && foo();
|
||||||
}
|
}
|
||||||
function f6() {
|
function f6() {
|
||||||
1!=a||2!=b||foo();
|
1 == a && 2 == b && foo();
|
||||||
}
|
}
|
||||||
function f7() {
|
function f7() {
|
||||||
if(1!=a&&2!=b)return bar();foo()
|
if (1 != a && 2 != b)
|
||||||
|
return bar();
|
||||||
|
foo();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -489,6 +489,160 @@ join_object_assignments_regex: {
|
|||||||
expect_stdout: "1"
|
expect_stdout: "1"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
chained_assignments: {
|
||||||
|
options = {
|
||||||
|
join_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a, b = a = {};
|
||||||
|
b.p = "PASS";
|
||||||
|
console.log(a.p);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a, b = a = {
|
||||||
|
p: "PASS",
|
||||||
|
};
|
||||||
|
console.log(a.p);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
folded_assignments_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
join_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = {};
|
||||||
|
a[a.PASS = 42] = "PASS";
|
||||||
|
console.log(a[42], a.PASS);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = {
|
||||||
|
PASS: 42,
|
||||||
|
42: "PASS",
|
||||||
|
};
|
||||||
|
console.log(a[42], a.PASS);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS 42"
|
||||||
|
}
|
||||||
|
|
||||||
|
folded_assignments_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
join_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
var a = {};
|
||||||
|
a[42] = "FAIL";
|
||||||
|
a[a.PASS = 42] = "PASS";
|
||||||
|
console.log(a[42], a.PASS);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
var a = {
|
||||||
|
42: "FAIL",
|
||||||
|
PASS: 42,
|
||||||
|
};
|
||||||
|
a[42] = "PASS";
|
||||||
|
console.log(a[42], a.PASS);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS 42"
|
||||||
|
}
|
||||||
|
|
||||||
|
inlined_assignments: {
|
||||||
|
options = {
|
||||||
|
join_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
(a = {}).p = "PASS";
|
||||||
|
console.log(a.p);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = {
|
||||||
|
p: "PASS",
|
||||||
|
};
|
||||||
|
console.log(a.p);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
inilne_for: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
join_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = function() {
|
||||||
|
for (; console.log("PASS"););
|
||||||
|
};
|
||||||
|
a();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
for (; console.log("PASS"););
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
inilne_var: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
join_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
A = "PASS";
|
||||||
|
var a = function() {
|
||||||
|
var b = A;
|
||||||
|
for (b in console.log(b));
|
||||||
|
};
|
||||||
|
a();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
A = "PASS";
|
||||||
|
var b = A;
|
||||||
|
for (b in console.log(b));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
typescript_enum: {
|
||||||
|
rename = true
|
||||||
|
options = {
|
||||||
|
assignments: true,
|
||||||
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_props: true,
|
||||||
|
inline: true,
|
||||||
|
join_vars: true,
|
||||||
|
passes: 4,
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var Enum;
|
||||||
|
(function (Enum) {
|
||||||
|
Enum[Enum.PASS = 42] = "PASS";
|
||||||
|
})(Enum || (Enum = {}));
|
||||||
|
console.log(Enum[42], Enum.PASS);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("PASS", 42);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS 42"
|
||||||
|
}
|
||||||
|
|
||||||
issue_2816: {
|
issue_2816: {
|
||||||
options = {
|
options = {
|
||||||
join_vars: true,
|
join_vars: true,
|
||||||
@@ -990,7 +1144,7 @@ conditional_assignments_3: {
|
|||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_3856: {
|
issue_3856_1: {
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
booleans: true,
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
@@ -1015,16 +1169,53 @@ issue_3856: {
|
|||||||
console.log(function() {
|
console.log(function() {
|
||||||
(function() {
|
(function() {
|
||||||
var a, b;
|
var a, b;
|
||||||
if (a) return !!a;
|
if (a) a;
|
||||||
for (a = 0; !console;);
|
else {
|
||||||
return 0;
|
a = 0;
|
||||||
|
for (; !console;);
|
||||||
|
}
|
||||||
})();
|
})();
|
||||||
}());
|
}());
|
||||||
}
|
}
|
||||||
expect_stdout: "undefined"
|
expect_stdout: "undefined"
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_3916: {
|
issue_3856_2: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
passes: 2,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
(function() {
|
||||||
|
var a;
|
||||||
|
if (!a) {
|
||||||
|
a = 0;
|
||||||
|
for (var b; !console;);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (a) return 1;
|
||||||
|
})();
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function() {
|
||||||
|
(function() {
|
||||||
|
var a, b;
|
||||||
|
if (!a)
|
||||||
|
for (a = 0; !console;);
|
||||||
|
})();
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3916_1: {
|
||||||
options = {
|
options = {
|
||||||
join_vars: true,
|
join_vars: true,
|
||||||
}
|
}
|
||||||
@@ -1044,8 +1235,8 @@ issue_3916: {
|
|||||||
var o = {
|
var o = {
|
||||||
p: "PASS",
|
p: "PASS",
|
||||||
__proto__: 42,
|
__proto__: 42,
|
||||||
q: "FAIL",
|
|
||||||
};
|
};
|
||||||
|
o.q = "FAIL";
|
||||||
o.__proto__ = {
|
o.__proto__ = {
|
||||||
p: "FAIL",
|
p: "FAIL",
|
||||||
q: "PASS",
|
q: "PASS",
|
||||||
@@ -1056,6 +1247,62 @@ issue_3916: {
|
|||||||
expect_stdout: "object PASS true PASS"
|
expect_stdout: "object PASS true PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_3916_2: {
|
||||||
|
options = {
|
||||||
|
join_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var log = console.log, o = {};
|
||||||
|
o.p = "FAIL 1";
|
||||||
|
o.__proto__ = {
|
||||||
|
get p() {
|
||||||
|
return "FAIL 2";
|
||||||
|
},
|
||||||
|
set p(u) {
|
||||||
|
log("FAIL 3");
|
||||||
|
},
|
||||||
|
set q(v) {
|
||||||
|
log("PASS 1");
|
||||||
|
},
|
||||||
|
get q() {
|
||||||
|
return "PASS 3";
|
||||||
|
},
|
||||||
|
};
|
||||||
|
o.p = "PASS 2";
|
||||||
|
o.q = "FAIL 4";
|
||||||
|
log(o.p);
|
||||||
|
log(o.q);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var log = console.log, o = {
|
||||||
|
p: "FAIL 1",
|
||||||
|
__proto__: {
|
||||||
|
get p() {
|
||||||
|
return "FAIL 2";
|
||||||
|
},
|
||||||
|
set p(u) {
|
||||||
|
log("FAIL 3");
|
||||||
|
},
|
||||||
|
set q(v) {
|
||||||
|
log("PASS 1");
|
||||||
|
},
|
||||||
|
get q() {
|
||||||
|
return "PASS 3";
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
o.p = "PASS 2";
|
||||||
|
o.q = "FAIL 4";
|
||||||
|
log(o.p);
|
||||||
|
log(o.q);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"PASS 1",
|
||||||
|
"PASS 2",
|
||||||
|
"PASS 3",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
assign_var: {
|
assign_var: {
|
||||||
options = {
|
options = {
|
||||||
join_vars: true,
|
join_vars: true,
|
||||||
@@ -1116,10 +1363,7 @@ assign_sequence_var: {
|
|||||||
console.log(a, b, c);
|
console.log(a, b, c);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var a = 0, b = 1;
|
var a = 0, b = 1, c = (console.log(a), a++, b = 2, 3);
|
||||||
console.log(a),
|
|
||||||
a++;
|
|
||||||
var b = 2, c = 3;
|
|
||||||
console.log(a, b, c);
|
console.log(a, b, c);
|
||||||
}
|
}
|
||||||
expect_stdout: [
|
expect_stdout: [
|
||||||
@@ -1127,3 +1371,26 @@ assign_sequence_var: {
|
|||||||
"1 2 3",
|
"1 2 3",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_5175: {
|
||||||
|
options = {
|
||||||
|
join_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function log(f) {
|
||||||
|
console.log(f(), A.p);
|
||||||
|
}
|
||||||
|
log(function() {
|
||||||
|
return (A = {}).p = "PASS";
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function log(f) {
|
||||||
|
console.log(f(), A.p);
|
||||||
|
}
|
||||||
|
log(function() {
|
||||||
|
return (A = {}).p = "PASS";
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS PASS"
|
||||||
|
}
|
||||||
|
|||||||
@@ -117,6 +117,7 @@ issue_1858: {
|
|||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
keep_fargs: false,
|
keep_fargs: false,
|
||||||
pure_getters: true,
|
pure_getters: true,
|
||||||
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -180,10 +181,10 @@ issue_2203_2: {
|
|||||||
a: "FAIL",
|
a: "FAIL",
|
||||||
b: function() {
|
b: function() {
|
||||||
return function() {
|
return function() {
|
||||||
return (String, (Object, function() {
|
return (Object, function() {
|
||||||
return this;
|
return this;
|
||||||
}())).a;
|
}()).a;
|
||||||
}();
|
}(String);
|
||||||
}
|
}
|
||||||
}.b());
|
}.b());
|
||||||
}
|
}
|
||||||
@@ -924,6 +925,28 @@ duplicate_lambda_defun_name_2: {
|
|||||||
expect_stdout: "0"
|
expect_stdout: "0"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function_argument_mangle: {
|
||||||
|
mangle = {
|
||||||
|
keep_fargs: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
A = "PASS";
|
||||||
|
var a = A;
|
||||||
|
(function(o) {
|
||||||
|
console.log(a);
|
||||||
|
})("FAIL");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
A = "PASS";
|
||||||
|
var n = A;
|
||||||
|
(function(o) {
|
||||||
|
console.log(n);
|
||||||
|
})("FAIL");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
function_name_mangle: {
|
function_name_mangle: {
|
||||||
options = {
|
options = {
|
||||||
keep_fargs: false,
|
keep_fargs: false,
|
||||||
@@ -950,7 +973,7 @@ function_name_mangle_ie8: {
|
|||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -1157,8 +1180,8 @@ replace_all_var_scope: {
|
|||||||
var a = 100, b = 10;
|
var a = 100, b = 10;
|
||||||
(function(r, a) {
|
(function(r, a) {
|
||||||
switch (~a) {
|
switch (~a) {
|
||||||
case (b += a):
|
case (b += a):
|
||||||
case a++:
|
case a++:
|
||||||
}
|
}
|
||||||
})(--b, a);
|
})(--b, a);
|
||||||
console.log(a, b);
|
console.log(a, b);
|
||||||
@@ -1167,8 +1190,8 @@ replace_all_var_scope: {
|
|||||||
var a = 100, b = 10;
|
var a = 100, b = 10;
|
||||||
(function(c) {
|
(function(c) {
|
||||||
switch (~a) {
|
switch (~a) {
|
||||||
case (b += a):
|
case (b += a):
|
||||||
case c++:
|
case c++:
|
||||||
}
|
}
|
||||||
})((--b, a));
|
})((--b, a));
|
||||||
console.log(a, b);
|
console.log(a, b);
|
||||||
@@ -1216,6 +1239,7 @@ issues_3267_1: {
|
|||||||
evaluate: true,
|
evaluate: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
keep_fargs: false,
|
keep_fargs: false,
|
||||||
|
negate_iife: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
|
|||||||
@@ -83,8 +83,9 @@ labels_5: {
|
|||||||
conditionals: true,
|
conditionals: true,
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
if_return: true,
|
if_return: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
// should keep the break-s in the following
|
// should keep `break`s below
|
||||||
input: {
|
input: {
|
||||||
while (foo) {
|
while (foo) {
|
||||||
if (bar) break;
|
if (bar) break;
|
||||||
@@ -100,8 +101,8 @@ labels_5: {
|
|||||||
if (bar) break;
|
if (bar) break;
|
||||||
console.log("foo");
|
console.log("foo");
|
||||||
}
|
}
|
||||||
out: while (foo) {
|
while (foo) {
|
||||||
if (bar) break out;
|
if (bar) break;
|
||||||
console.log("foo");
|
console.log("foo");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -189,23 +190,22 @@ labels_10: {
|
|||||||
conditionals: true,
|
conditionals: true,
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
if_return: true,
|
if_return: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
out: while (foo) {
|
out: while (42) {
|
||||||
x();
|
console.log("PASS");
|
||||||
y();
|
|
||||||
break out;
|
break out;
|
||||||
z();
|
console.log("FAIL");
|
||||||
k();
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
expect: {
|
expect: {
|
||||||
out: while (foo) {
|
while (42) {
|
||||||
x();
|
console.log("PASS");
|
||||||
y();
|
break;
|
||||||
break out;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_4466_1: {
|
issue_4466_1: {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
retain_block: {
|
retain_block_1: {
|
||||||
options = {}
|
options = {}
|
||||||
input: {
|
input: {
|
||||||
"use strict";
|
"use strict";
|
||||||
@@ -20,6 +20,127 @@ retain_block: {
|
|||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
retain_block_2: {
|
||||||
|
options = {
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
{
|
||||||
|
var a;
|
||||||
|
let a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
{
|
||||||
|
var a;
|
||||||
|
let a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
retain_block_2_mangle: {
|
||||||
|
rename = true
|
||||||
|
mangle = {
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
{
|
||||||
|
var a;
|
||||||
|
let a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
{
|
||||||
|
var t;
|
||||||
|
let t;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
retain_block_3: {
|
||||||
|
options = {
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
{
|
||||||
|
let a;
|
||||||
|
var a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
{
|
||||||
|
let a;
|
||||||
|
var a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
retain_block_3_mangle: {
|
||||||
|
rename = true
|
||||||
|
mangle = {
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
{
|
||||||
|
let a;
|
||||||
|
var a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
{
|
||||||
|
let t;
|
||||||
|
var t;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
retain_assignment: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
function f() {
|
||||||
|
return a = 0;
|
||||||
|
let a;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
f();
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
function f() {
|
||||||
|
return a = 0;
|
||||||
|
let a;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
f();
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
retain_catch: {
|
retain_catch: {
|
||||||
options = {
|
options = {
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
@@ -149,8 +270,8 @@ merge_vars_3: {
|
|||||||
var b = console;
|
var b = console;
|
||||||
console.log(typeof b);
|
console.log(typeof b);
|
||||||
}
|
}
|
||||||
var a = 1;
|
var b = 1;
|
||||||
console.log(typeof a);
|
console.log(typeof b);
|
||||||
}
|
}
|
||||||
expect_stdout: [
|
expect_stdout: [
|
||||||
"object",
|
"object",
|
||||||
@@ -159,6 +280,38 @@ merge_vars_3: {
|
|||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
merge_vars_4: {
|
||||||
|
options = {
|
||||||
|
merge_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
var a = 1;
|
||||||
|
console.log(typeof a);
|
||||||
|
{
|
||||||
|
var b = console;
|
||||||
|
console.log(typeof b);
|
||||||
|
let a = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
var a = 1;
|
||||||
|
console.log(typeof a);
|
||||||
|
{
|
||||||
|
var b = console;
|
||||||
|
console.log(typeof b);
|
||||||
|
let a = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"number",
|
||||||
|
"object",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
use_before_init_1: {
|
use_before_init_1: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
@@ -359,7 +512,7 @@ reduce_block_2_toplevel: {
|
|||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
reduce_vars: {
|
reduce_vars_1: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
@@ -381,6 +534,121 @@ reduce_vars: {
|
|||||||
node_version: ">=4"
|
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"
|
||||||
|
}
|
||||||
|
|
||||||
|
reduce_lambda: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
functions: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
let f = function() {
|
||||||
|
console.log(a, b);
|
||||||
|
};
|
||||||
|
let a = "foo", b = 42;
|
||||||
|
f();
|
||||||
|
b = "bar";
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
function f() {
|
||||||
|
console.log("foo", b);
|
||||||
|
}
|
||||||
|
let b = 42;
|
||||||
|
f();
|
||||||
|
b = "bar";
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo 42",
|
||||||
|
"foo bar",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
hoist_props: {
|
hoist_props: {
|
||||||
options = {
|
options = {
|
||||||
hoist_props: true,
|
hoist_props: true,
|
||||||
@@ -456,6 +724,38 @@ loop_block_2: {
|
|||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
do_break: {
|
||||||
|
options = {
|
||||||
|
loops: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
try {
|
||||||
|
do {
|
||||||
|
if (a)
|
||||||
|
break;
|
||||||
|
let a;
|
||||||
|
} while (!console);
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
try {
|
||||||
|
do {
|
||||||
|
if (a)
|
||||||
|
break;
|
||||||
|
let a;
|
||||||
|
} while (!console);
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
do_continue: {
|
do_continue: {
|
||||||
options = {
|
options = {
|
||||||
loops: true,
|
loops: true,
|
||||||
@@ -516,6 +816,82 @@ dead_block_after_return: {
|
|||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if_return_1: {
|
||||||
|
options = {
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
function f(a) {
|
||||||
|
function g() {
|
||||||
|
return b = "PASS";
|
||||||
|
}
|
||||||
|
if (a)
|
||||||
|
return g();
|
||||||
|
let b;
|
||||||
|
return g();
|
||||||
|
};
|
||||||
|
console.log(f());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
function f(a) {
|
||||||
|
function g() {
|
||||||
|
return b = "PASS";
|
||||||
|
}
|
||||||
|
if (a)
|
||||||
|
return g();
|
||||||
|
let b;
|
||||||
|
return g();
|
||||||
|
};
|
||||||
|
console.log(f());
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
if_return_2: {
|
||||||
|
options = {
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
function f(a) {
|
||||||
|
function g() {
|
||||||
|
return b = "FAIL";
|
||||||
|
}
|
||||||
|
if (a)
|
||||||
|
return g();
|
||||||
|
let b;
|
||||||
|
return g();
|
||||||
|
};
|
||||||
|
try {
|
||||||
|
console.log(f(42));
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
function f(a) {
|
||||||
|
function g() {
|
||||||
|
return b = "FAIL";
|
||||||
|
}
|
||||||
|
if (a)
|
||||||
|
return g();
|
||||||
|
let b;
|
||||||
|
return g();
|
||||||
|
};
|
||||||
|
try {
|
||||||
|
console.log(f(42));
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
do_if_continue_1: {
|
do_if_continue_1: {
|
||||||
options = {
|
options = {
|
||||||
if_return: true,
|
if_return: true,
|
||||||
@@ -536,8 +912,7 @@ do_if_continue_1: {
|
|||||||
expect: {
|
expect: {
|
||||||
"use strict";
|
"use strict";
|
||||||
do {
|
do {
|
||||||
if (!console);
|
if (console) {
|
||||||
else {
|
|
||||||
console.log("PASS");
|
console.log("PASS");
|
||||||
{
|
{
|
||||||
let a = 0;
|
let a = 0;
|
||||||
@@ -570,8 +945,7 @@ do_if_continue_2: {
|
|||||||
expect: {
|
expect: {
|
||||||
"use strict";
|
"use strict";
|
||||||
do {
|
do {
|
||||||
if (!console);
|
if (console) {
|
||||||
else {
|
|
||||||
console.log("FAIL");
|
console.log("FAIL");
|
||||||
{
|
{
|
||||||
let a = 0;
|
let a = 0;
|
||||||
@@ -710,12 +1084,10 @@ issue_4202: {
|
|||||||
"use strict";
|
"use strict";
|
||||||
{
|
{
|
||||||
let o = {};
|
let o = {};
|
||||||
(function() {
|
function f() {
|
||||||
function f() {
|
o.p = 42;
|
||||||
o.p = 42;
|
}
|
||||||
}
|
f(f);
|
||||||
f(f);
|
|
||||||
})();
|
|
||||||
console.log(o.p++);
|
console.log(o.p++);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -817,6 +1189,7 @@ issue_4210: {
|
|||||||
issue_4212_1: {
|
issue_4212_1: {
|
||||||
options = {
|
options = {
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
|
reduce_vars: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
"use strict";
|
"use strict";
|
||||||
@@ -907,7 +1280,7 @@ issue_4225: {
|
|||||||
|
|
||||||
issue_4229: {
|
issue_4229: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -938,7 +1311,7 @@ issue_4229: {
|
|||||||
|
|
||||||
issue_4231: {
|
issue_4231: {
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -1292,11 +1665,9 @@ issue_4438: {
|
|||||||
expect: {
|
expect: {
|
||||||
"use strict";
|
"use strict";
|
||||||
function f() {
|
function f() {
|
||||||
if (!console)
|
if (console) {
|
||||||
;
|
|
||||||
else {
|
|
||||||
let a = console.log;
|
let a = console.log;
|
||||||
a("PASS");
|
void a("PASS");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
f();
|
f();
|
||||||
@@ -1307,7 +1678,7 @@ issue_4438: {
|
|||||||
|
|
||||||
issue_4531_1: {
|
issue_4531_1: {
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -1333,11 +1704,11 @@ issue_4531_1: {
|
|||||||
issue_4531_2: {
|
issue_4531_2: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -1382,6 +1753,7 @@ issue_4689: {
|
|||||||
|
|
||||||
issue_4691: {
|
issue_4691: {
|
||||||
options = {
|
options = {
|
||||||
|
conditionals: true,
|
||||||
if_return: true,
|
if_return: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
@@ -1426,3 +1798,225 @@ issue_4691: {
|
|||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=4"
|
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"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4985: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
let a = { p: 42 };
|
||||||
|
console.log(function() {
|
||||||
|
a;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
let a = { p: 42 };
|
||||||
|
console.log(function() {
|
||||||
|
a;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5240: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
function f() {
|
||||||
|
if (console) {
|
||||||
|
let g = function() {
|
||||||
|
e;
|
||||||
|
}, e;
|
||||||
|
(function() {
|
||||||
|
if (console) {
|
||||||
|
console.log(e);
|
||||||
|
var e = "FAIL";
|
||||||
|
}
|
||||||
|
})(console.log(e));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
function f() {
|
||||||
|
if (console) {
|
||||||
|
let g = function() {
|
||||||
|
e;
|
||||||
|
}, e;
|
||||||
|
(function() {
|
||||||
|
if (console) {
|
||||||
|
console.log(e);
|
||||||
|
var e = "FAIL";
|
||||||
|
}
|
||||||
|
})(console.log(e));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"undefined",
|
||||||
|
"undefined",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5254: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
do {
|
||||||
|
(function() {
|
||||||
|
let a = console.log;
|
||||||
|
a && a("foo");
|
||||||
|
})();
|
||||||
|
} while (console.log("bar"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
do {
|
||||||
|
let a = console.log;
|
||||||
|
a && a("foo");
|
||||||
|
} while (console.log("bar"));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5260: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
var a = "foo", o;
|
||||||
|
while (console.log("bar"));
|
||||||
|
o = {
|
||||||
|
baz: function(b) {
|
||||||
|
console.log(a, b);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
for (let a in o)
|
||||||
|
o[a](a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
var a = "foo", o;
|
||||||
|
while (console.log("bar"));
|
||||||
|
o = {
|
||||||
|
baz: function(b) {
|
||||||
|
console.log(a, b);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
for (let a in o)
|
||||||
|
o[a](a);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"bar",
|
||||||
|
"foo baz",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5319: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
merge_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
(function(a, c) {
|
||||||
|
var b = a, c = b;
|
||||||
|
{
|
||||||
|
let a = c;
|
||||||
|
console.log(c());
|
||||||
|
}
|
||||||
|
})(function() {
|
||||||
|
return "PASS";
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
(function(a, c) {
|
||||||
|
var b = a, c;
|
||||||
|
{
|
||||||
|
let a = c = b;
|
||||||
|
console.log(c());
|
||||||
|
}
|
||||||
|
})(function() {
|
||||||
|
return "PASS";
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5338: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
let a = a;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
a;
|
||||||
|
let a;
|
||||||
|
}
|
||||||
|
expect_stdout: ReferenceError("a is not defined")
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|||||||
@@ -193,9 +193,9 @@ evaluate: {
|
|||||||
} while (false);
|
} while (false);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
for(;;)
|
for (;;)
|
||||||
a();
|
a();
|
||||||
for(;;)
|
for (;;)
|
||||||
c();
|
c();
|
||||||
d();
|
d();
|
||||||
}
|
}
|
||||||
@@ -265,7 +265,7 @@ issue_1532_2: {
|
|||||||
issue_186: {
|
issue_186: {
|
||||||
beautify = {
|
beautify = {
|
||||||
beautify: false,
|
beautify: false,
|
||||||
ie8: false,
|
ie: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = 3;
|
var x = 3;
|
||||||
@@ -284,7 +284,7 @@ issue_186: {
|
|||||||
issue_186_ie8: {
|
issue_186_ie8: {
|
||||||
beautify = {
|
beautify = {
|
||||||
beautify: false,
|
beautify: false,
|
||||||
ie8: true,
|
ie: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = 3;
|
var x = 3;
|
||||||
@@ -303,7 +303,7 @@ issue_186_ie8: {
|
|||||||
issue_186_beautify: {
|
issue_186_beautify: {
|
||||||
beautify = {
|
beautify = {
|
||||||
beautify: true,
|
beautify: true,
|
||||||
ie8: false,
|
ie: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = 3;
|
var x = 3;
|
||||||
@@ -330,7 +330,7 @@ issue_186_beautify: {
|
|||||||
issue_186_beautify_ie8: {
|
issue_186_beautify_ie8: {
|
||||||
beautify = {
|
beautify = {
|
||||||
beautify: true,
|
beautify: true,
|
||||||
ie8: true,
|
ie: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = 3;
|
var x = 3;
|
||||||
@@ -360,7 +360,7 @@ issue_186_braces: {
|
|||||||
beautify = {
|
beautify = {
|
||||||
beautify: false,
|
beautify: false,
|
||||||
braces: true,
|
braces: true,
|
||||||
ie8: false,
|
ie: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = 3;
|
var x = 3;
|
||||||
@@ -380,7 +380,7 @@ issue_186_braces_ie8: {
|
|||||||
beautify = {
|
beautify = {
|
||||||
beautify: false,
|
beautify: false,
|
||||||
braces: true,
|
braces: true,
|
||||||
ie8: true,
|
ie: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = 3;
|
var x = 3;
|
||||||
@@ -400,7 +400,7 @@ issue_186_beautify_braces: {
|
|||||||
beautify = {
|
beautify = {
|
||||||
beautify: true,
|
beautify: true,
|
||||||
braces: true,
|
braces: true,
|
||||||
ie8: false,
|
ie: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = 3;
|
var x = 3;
|
||||||
@@ -432,7 +432,7 @@ issue_186_beautify_braces_ie8: {
|
|||||||
beautify = {
|
beautify = {
|
||||||
beautify: true,
|
beautify: true,
|
||||||
braces: true,
|
braces: true,
|
||||||
ie8: true,
|
ie: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = 3;
|
var x = 3;
|
||||||
@@ -829,6 +829,18 @@ empty_for_in_prop_init: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for_of: {
|
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: {
|
input: {
|
||||||
var async = [ "PASS", 42 ];
|
var async = [ "PASS", 42 ];
|
||||||
async.p = "FAIL";
|
async.p = "FAIL";
|
||||||
@@ -836,11 +848,22 @@ for_of: {
|
|||||||
console.log(async);
|
console.log(async);
|
||||||
}
|
}
|
||||||
expect_exact: '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: [
|
expect_stdout: true
|
||||||
"PASS",
|
node_version: ">=0.12 <16"
|
||||||
"42",
|
}
|
||||||
]
|
|
||||||
node_version: ">=0.12"
|
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: {
|
issue_3631_1: {
|
||||||
|
|||||||
@@ -37,6 +37,51 @@ just_enough: {
|
|||||||
expect_warnings: []
|
expect_warnings: []
|
||||||
}
|
}
|
||||||
|
|
||||||
|
drop_semicolon: {
|
||||||
|
beautify = {
|
||||||
|
max_line_len: 5,
|
||||||
|
semicolons: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
console.log(a || 42);
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"var a",
|
||||||
|
"console.log(",
|
||||||
|
"a||42",
|
||||||
|
");",
|
||||||
|
]
|
||||||
|
expect_stdout: "42"
|
||||||
|
expect_warnings: [
|
||||||
|
"WARN: Output exceeds 5 characters",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
template_newline: {
|
||||||
|
beautify = {
|
||||||
|
max_line_len: 2,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(`foo
|
||||||
|
bar`);
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"console.log(",
|
||||||
|
"`foo",
|
||||||
|
"bar`",
|
||||||
|
");",
|
||||||
|
]
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
]
|
||||||
|
expect_warnings: [
|
||||||
|
"WARN: Output exceeds 2 characters",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
issue_304: {
|
issue_304: {
|
||||||
beautify = {
|
beautify = {
|
||||||
max_line_len: 10,
|
max_line_len: 10,
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -122,13 +122,41 @@ negate_iife_4: {
|
|||||||
sequences: true,
|
sequences: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
(function(){ return t })() ? console.log(true) : console.log(false);
|
(function() {
|
||||||
(function(){
|
return t;
|
||||||
|
})() ? console.log(true) : console.log(false);
|
||||||
|
(function() {
|
||||||
console.log("something");
|
console.log("something");
|
||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
!function(){ return t }() ? console.log(false) : console.log(true), function(){
|
!function() {
|
||||||
|
return t;
|
||||||
|
}() ? console.log(false) : console.log(true), !function() {
|
||||||
|
console.log("something");
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
negate_iife_4_drop_side_effect_free: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
negate_iife: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
return t;
|
||||||
|
})() ? console.log(true) : console.log(false);
|
||||||
|
(function() {
|
||||||
|
console.log("something");
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
!function() {
|
||||||
|
return t;
|
||||||
|
}() ? console.log(false) : console.log(true), function() {
|
||||||
console.log("something");
|
console.log("something");
|
||||||
}();
|
}();
|
||||||
}
|
}
|
||||||
@@ -176,17 +204,49 @@ negate_iife_5: {
|
|||||||
sequences: true,
|
sequences: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
if ((function(){ return t })()) {
|
if (function() {
|
||||||
|
return t;
|
||||||
|
}()) {
|
||||||
foo(true);
|
foo(true);
|
||||||
} else {
|
} else {
|
||||||
bar(false);
|
bar(false);
|
||||||
}
|
}
|
||||||
(function(){
|
(function() {
|
||||||
console.log("something");
|
console.log("something");
|
||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
!function(){ return t }() ? bar(false) : foo(true), function(){
|
!function() {
|
||||||
|
return t;
|
||||||
|
}() ? bar(false) : foo(true), !function() {
|
||||||
|
console.log("something");
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
negate_iife_5_drop_side_effect_free: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
negate_iife: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
if (function() {
|
||||||
|
return t;
|
||||||
|
}()) {
|
||||||
|
foo(true);
|
||||||
|
} else {
|
||||||
|
bar(false);
|
||||||
|
}
|
||||||
|
(function() {
|
||||||
|
console.log("something");
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
!function() {
|
||||||
|
return t;
|
||||||
|
}() ? bar(false) : foo(true), function() {
|
||||||
console.log("something");
|
console.log("something");
|
||||||
}();
|
}();
|
||||||
}
|
}
|
||||||
@@ -389,6 +449,7 @@ issue_1288_side_effects: {
|
|||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
|
sequences: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -409,10 +470,10 @@ issue_1288_side_effects: {
|
|||||||
})(0);
|
})(0);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
w;
|
w,
|
||||||
x || function() {
|
x || function() {
|
||||||
x = {};
|
x = {};
|
||||||
}();
|
}(),
|
||||||
y;
|
y;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -110,10 +110,186 @@ conditional_assignment_4: {
|
|||||||
node_version: ">=14"
|
node_version: ">=14"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
de_morgan_1: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
return a ?? a;
|
||||||
|
}
|
||||||
|
console.log(f(null), f(42));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a) {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
console.log(f(null), f(42));
|
||||||
|
}
|
||||||
|
expect_stdout: "null 42"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
de_morgan_2a: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b) {
|
||||||
|
return a || (a ?? b);
|
||||||
|
}
|
||||||
|
console.log(f(null), f(null, {}));
|
||||||
|
console.log(f(42), f(42, {}));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b) {
|
||||||
|
return a || (a ?? b);
|
||||||
|
}
|
||||||
|
console.log(f(null), f(null, {}));
|
||||||
|
console.log(f(42), f(42, {}));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"undefined {}",
|
||||||
|
"42 42",
|
||||||
|
]
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
de_morgan_2b: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b) {
|
||||||
|
return a && (a ?? b);
|
||||||
|
}
|
||||||
|
console.log(f(null), f(null, {}));
|
||||||
|
console.log(f(42), f(42, {}));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b) {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
console.log(f(null), f(null, {}));
|
||||||
|
console.log(f(42), f(42, {}));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"null null",
|
||||||
|
"42 42",
|
||||||
|
]
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
de_morgan_2c: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b) {
|
||||||
|
return a ?? (a || b);
|
||||||
|
}
|
||||||
|
console.log(f(null), f(null, {}));
|
||||||
|
console.log(f(42), f(42, {}));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b) {
|
||||||
|
return a ?? b;
|
||||||
|
}
|
||||||
|
console.log(f(null), f(null, {}));
|
||||||
|
console.log(f(42), f(42, {}));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"undefined {}",
|
||||||
|
"42 42",
|
||||||
|
]
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
de_morgan_2d: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b) {
|
||||||
|
return a ?? (a && b);
|
||||||
|
}
|
||||||
|
console.log(f(null), f(null, {}));
|
||||||
|
console.log(f(42), f(42, {}));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b) {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
console.log(f(null), f(null, {}));
|
||||||
|
console.log(f(42), f(42, {}));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"null null",
|
||||||
|
"42 42",
|
||||||
|
]
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
de_morgan_2e: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b) {
|
||||||
|
return a ?? (a ?? b);
|
||||||
|
}
|
||||||
|
console.log(f(null), f(null, {}));
|
||||||
|
console.log(f(42), f(42, {}));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b) {
|
||||||
|
return a ?? b;
|
||||||
|
}
|
||||||
|
console.log(f(null), f(null, {}));
|
||||||
|
console.log(f(42), f(42, {}));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"undefined {}",
|
||||||
|
"42 42",
|
||||||
|
]
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
inline_binary_nullish: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
while (console.log("foo"));
|
||||||
|
})() ?? (function() {
|
||||||
|
while (console.log("bar"));
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
if (null == function() {
|
||||||
|
while (console.log("foo"));
|
||||||
|
}())
|
||||||
|
while (console.log("bar"));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
]
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
issue_4679: {
|
issue_4679: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
ie8: true,
|
ie: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var a;
|
var a;
|
||||||
@@ -128,3 +304,42 @@ issue_4679: {
|
|||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=14"
|
node_version: ">=14"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_5266: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
[
|
||||||
|
42,
|
||||||
|
null,
|
||||||
|
false,
|
||||||
|
void 0,
|
||||||
|
"FAIL",
|
||||||
|
].forEach(function (a) {
|
||||||
|
a ?? function() {
|
||||||
|
while (console.log(a));
|
||||||
|
}();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
[
|
||||||
|
42,
|
||||||
|
null,
|
||||||
|
false,
|
||||||
|
void 0,
|
||||||
|
"FAIL",
|
||||||
|
].forEach(function (a) {
|
||||||
|
if (null == a) {
|
||||||
|
while (console.log(a));
|
||||||
|
return;
|
||||||
|
} else
|
||||||
|
return;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"null",
|
||||||
|
"undefined",
|
||||||
|
]
|
||||||
|
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: {
|
parentheses_for_prototype_functions: {
|
||||||
beautify = {
|
beautify = {
|
||||||
beautify: true,
|
beautify: true,
|
||||||
@@ -97,6 +104,40 @@ parentheses_for_prototype_functions_galio: {
|
|||||||
expect_stdout: true
|
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: {
|
comparisons: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
@@ -801,9 +842,9 @@ unary_binary_parentheses: {
|
|||||||
v.forEach(function(x) {
|
v.forEach(function(x) {
|
||||||
v.forEach(function(y) {
|
v.forEach(function(y) {
|
||||||
console.log(
|
console.log(
|
||||||
+x*y,
|
x*y,
|
||||||
+x/y,
|
x/y,
|
||||||
+x%y,
|
x%y,
|
||||||
-x*y,
|
-x*y,
|
||||||
-x/y,
|
-x/y,
|
||||||
-x%y
|
-x%y
|
||||||
@@ -1356,7 +1397,7 @@ issue_3695: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var a = [];
|
var a = [];
|
||||||
console.log(+(a * (a[0] = false)));
|
console.log(a * (a[0] = false));
|
||||||
}
|
}
|
||||||
expect_stdout: "NaN"
|
expect_stdout: "NaN"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -521,3 +521,25 @@ issue_4415: {
|
|||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_5213: {
|
||||||
|
options = {
|
||||||
|
objects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "FAIL";
|
||||||
|
console.log({
|
||||||
|
p: a = "PASS",
|
||||||
|
0: a,
|
||||||
|
p: null,
|
||||||
|
}[0]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "FAIL";
|
||||||
|
console.log({
|
||||||
|
p: (a = "PASS", null),
|
||||||
|
0: a,
|
||||||
|
}[0]);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|||||||
619
test/compress/optional-chains.js
Normal file
619
test/compress/optional-chains.js
Normal file
@@ -0,0 +1,619 @@
|
|||||||
|
call: {
|
||||||
|
input: {
|
||||||
|
console.log?.(undefined?.(console.log("FAIL")));
|
||||||
|
}
|
||||||
|
expect_exact: 'console.log?.((void 0)?.(console.log("FAIL")));'
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
dot: {
|
||||||
|
input: {
|
||||||
|
console?.log((void 0)?.p);
|
||||||
|
}
|
||||||
|
expect_exact: "console?.log((void 0)?.p);"
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
dot_in: {
|
||||||
|
input: {
|
||||||
|
var o = { in: 42 };
|
||||||
|
console.log(o.in, o?.in);
|
||||||
|
}
|
||||||
|
expect_exact: "var o={in:42};console.log(o.in,o?.in);"
|
||||||
|
expect_stdout: "42 42"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
sub: {
|
||||||
|
input: {
|
||||||
|
console?.["log"](null?.[console.log("FAIL")]);
|
||||||
|
}
|
||||||
|
expect_exact: 'console?.["log"](null?.[console.log("FAIL")]);'
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
ternary_decimal: {
|
||||||
|
input: {
|
||||||
|
null ? .42 : console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_exact: 'null?.42:console.log("PASS");'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
assign_parentheses_call: {
|
||||||
|
input: {
|
||||||
|
var o = {};
|
||||||
|
((() => o)?.()).p = "PASS";
|
||||||
|
console.log(o.p);
|
||||||
|
}
|
||||||
|
expect_exact: 'var o={};((()=>o)?.()).p="PASS";console.log(o.p);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
assign_parentheses_dot: {
|
||||||
|
input: {
|
||||||
|
(console?.log).name.p = console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_exact: '(console?.log).name.p=console.log("PASS");'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
assign_no_parentheses: {
|
||||||
|
input: {
|
||||||
|
console[console.log?.("PASS")] = 42;
|
||||||
|
}
|
||||||
|
expect_exact: 'console[console.log?.("PASS")]=42;'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
call_parentheses: {
|
||||||
|
input: {
|
||||||
|
(function(o) {
|
||||||
|
console.log(o.f("FAIL"), (o.f)("FAIL"), (0, o.f)(42));
|
||||||
|
console.log(o?.f("FAIL"), (o?.f)("FAIL"), (0, o?.f)(42));
|
||||||
|
})({
|
||||||
|
a: "PASS",
|
||||||
|
f(b) {
|
||||||
|
return this.a || b;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect_exact: '(function(o){console.log(o.f("FAIL"),o.f("FAIL"),(0,o.f)(42));console.log(o?.f("FAIL"),(o?.f)("FAIL"),(0,o?.f)(42))})({a:"PASS",f(b){return this.a||b}});'
|
||||||
|
expect_stdout: [
|
||||||
|
"PASS PASS 42",
|
||||||
|
"PASS PASS 42",
|
||||||
|
]
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
unary_parentheses: {
|
||||||
|
input: {
|
||||||
|
var o = { p: 41 };
|
||||||
|
(function() {
|
||||||
|
return o;
|
||||||
|
}?.()).p++;
|
||||||
|
console.log(o.p);
|
||||||
|
}
|
||||||
|
expect_exact: "var o={p:41};(function(){return o}?.()).p++;console.log(o.p);"
|
||||||
|
expect_stdout: "42"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
collapse_vars_1: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
A = 42;
|
||||||
|
a?.[42];
|
||||||
|
console.log(typeof A);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
A = 42;
|
||||||
|
a?.[42];
|
||||||
|
console.log(typeof A);
|
||||||
|
}
|
||||||
|
expect_stdout: "number"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
collapse_vars_2: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
A = 42;
|
||||||
|
a?.(42);
|
||||||
|
console.log(typeof A);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
A = 42;
|
||||||
|
a?.(42);
|
||||||
|
console.log(typeof A);
|
||||||
|
}
|
||||||
|
expect_stdout: "number"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
properties: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
properties: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
console.log(a?.["FAIL"]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
console.log(a?.FAIL);
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
reduce_vars_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
null?.[a = 0];
|
||||||
|
console.log(a ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 1;
|
||||||
|
null?.[a = 0];
|
||||||
|
console.log(a ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
reduce_vars_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
null?.(a = 0);
|
||||||
|
console.log(a ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 1;
|
||||||
|
null?.(a = 0);
|
||||||
|
console.log(a ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
side_effects: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
a?.[a = "FAIL"];
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
a?.[a = "FAIL"];
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
trim_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
optional_chains: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a, b) {
|
||||||
|
console?.log?.(a?.p, b?.[console.log("FAIL")]);
|
||||||
|
})?.({ p: "PASS" });
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(a, b) {
|
||||||
|
console?.log?.(a.p, void 0);
|
||||||
|
})({ p: "PASS" });
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS undefined"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
trim_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
optional_chains: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(void console.log("PASS"))?.[console.log("FAIL")];
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
trim_dot_call_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
optional_chains: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(null?.f());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(void 0);
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
trim_dot_call_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
optional_chains: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try {
|
||||||
|
(null?.p)();
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
try {
|
||||||
|
(void 0)();
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
trim_dot_call_3: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
optional_chains: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try {
|
||||||
|
({ p: null })?.p();
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
try {
|
||||||
|
null();
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
trim_dot_sub: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
optional_chains: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(null?.p[42]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(void 0);
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
trim_sub_call_call: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
optional_chains: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(null?.[42]()());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(void 0);
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4906: {
|
||||||
|
options = {
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
do {
|
||||||
|
var a = a?.[42];
|
||||||
|
} while (console.log("PASS"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
do {
|
||||||
|
var a = a?.[42];
|
||||||
|
} while (console.log("PASS"));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4928: {
|
||||||
|
options = {
|
||||||
|
ie: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = a?.[function f() {
|
||||||
|
f(a);
|
||||||
|
}];
|
||||||
|
console.log(typeof f);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = a?.[function f() {
|
||||||
|
f(a);
|
||||||
|
}];
|
||||||
|
console.log(typeof f);
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4947_1: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(console.foo ? 42..p : console.bar?.p);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(console.foo ? 42..p : console.bar?.p);
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4947_2: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var log = console.log, fail;
|
||||||
|
log("PASS") ? log(42) : fail?.(42);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var log = console.log, fail;
|
||||||
|
log("PASS") ? log(42) : fail?.(42);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5039: {
|
||||||
|
options = {
|
||||||
|
ie: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = a?.[function f() {
|
||||||
|
f;
|
||||||
|
a;
|
||||||
|
}];
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = a?.[function f() {}];
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5091: {
|
||||||
|
options = {
|
||||||
|
merge_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
var b = a.p;
|
||||||
|
var c;
|
||||||
|
b?.[c = "FAIL 2"];
|
||||||
|
return b || c;
|
||||||
|
}
|
||||||
|
console.log(f("FAIL 1") || "PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a) {
|
||||||
|
var a = a.p;
|
||||||
|
var c;
|
||||||
|
a?.[c = "FAIL 2"];
|
||||||
|
return a || c;
|
||||||
|
}
|
||||||
|
console.log(f("FAIL 1") || "PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5292_dot: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
get p() {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
o?.p;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {
|
||||||
|
get p() {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
o?.p;
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5292_dot_pure_getters: {
|
||||||
|
options = {
|
||||||
|
pure_getters: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
get p() {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
o?.p;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {
|
||||||
|
get p() {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5292_dot_pure_getters_strict: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
get p() {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
o?.p;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {
|
||||||
|
get p() {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
o?.p;
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5292_sub: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
get p() {
|
||||||
|
console.log("foo");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
o?.[console.log("bar"), "p"];
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {
|
||||||
|
get p() {
|
||||||
|
console.log("foo");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
o?.[console.log("bar"), "p"];
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"bar",
|
||||||
|
"foo",
|
||||||
|
]
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5292_sub_pure_getters: {
|
||||||
|
options = {
|
||||||
|
pure_getters: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
get p() {
|
||||||
|
console.log("foo");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
o?.[console.log("bar"), "p"];
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {
|
||||||
|
get p() {
|
||||||
|
console.log("foo");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
console.log("bar");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5292_sub_pure_getters_strict: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
get p() {
|
||||||
|
console.log("foo");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
o?.[console.log("bar"), "p"];
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {
|
||||||
|
get p() {
|
||||||
|
console.log("foo");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
o?.[console.log("bar"), "p"];
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"bar",
|
||||||
|
"foo",
|
||||||
|
]
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
@@ -97,10 +97,10 @@ return_5: {
|
|||||||
}
|
}
|
||||||
expect_exact: [
|
expect_exact: [
|
||||||
"_is_selected=function(tags,slug){",
|
"_is_selected=function(tags,slug){",
|
||||||
"var ref",
|
"var ref;",
|
||||||
"",
|
"",
|
||||||
"",
|
"",
|
||||||
";return null!=(ref=_.find(tags,{slug:slug}))?ref.selected:void 0};",
|
"return null!=(ref=_.find(tags,{slug:slug}))?ref.selected:void 0};",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -146,10 +146,10 @@ return_7: {
|
|||||||
}
|
}
|
||||||
expect_exact: [
|
expect_exact: [
|
||||||
"_is_selected=function(e,l){",
|
"_is_selected=function(e,l){",
|
||||||
"var n",
|
"var n;",
|
||||||
"",
|
"",
|
||||||
"",
|
"",
|
||||||
";return null!=(n=_.find(e,{slug:l}))?n.selected:void 0};",
|
"return null!=(n=_.find(e,{slug:l}))?n.selected:void 0};",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ dot_properties: {
|
|||||||
properties: true,
|
properties: true,
|
||||||
}
|
}
|
||||||
beautify = {
|
beautify = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
a["foo"] = "bar";
|
a["foo"] = "bar";
|
||||||
@@ -43,7 +43,7 @@ dot_properties_es5: {
|
|||||||
properties: true,
|
properties: true,
|
||||||
}
|
}
|
||||||
beautify = {
|
beautify = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
a["foo"] = "bar";
|
a["foo"] = "bar";
|
||||||
@@ -1400,3 +1400,181 @@ object_super: {
|
|||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=4"
|
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"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4888: {
|
||||||
|
options = {
|
||||||
|
properties: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(typeof {
|
||||||
|
__proto__: 42,
|
||||||
|
}.__proto__);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(typeof {
|
||||||
|
__proto__: 42,
|
||||||
|
}.__proto__);
|
||||||
|
}
|
||||||
|
expect_stdout: "object"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5093: {
|
||||||
|
beautify = {
|
||||||
|
keep_quoted_props: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log({
|
||||||
|
a: true,
|
||||||
|
'42': "PASS",
|
||||||
|
"null": [],
|
||||||
|
}[6 * 7]);
|
||||||
|
}
|
||||||
|
expect_exact: 'console.log({a:true,"42":"PASS","null":[]}[6*7]);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5093_quote_keys: {
|
||||||
|
beautify = {
|
||||||
|
keep_quoted_props: true,
|
||||||
|
quote_keys: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log({
|
||||||
|
a: true,
|
||||||
|
'42': "PASS",
|
||||||
|
"null": [],
|
||||||
|
}[6 * 7]);
|
||||||
|
}
|
||||||
|
expect_exact: 'console.log({"a":true,"42":"PASS","null":[]}[6*7]);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5093_quote_style: {
|
||||||
|
beautify = {
|
||||||
|
keep_quoted_props: true,
|
||||||
|
quote_style: 3,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log({
|
||||||
|
a: true,
|
||||||
|
'42': "PASS",
|
||||||
|
"null": [],
|
||||||
|
}[6 * 7]);
|
||||||
|
}
|
||||||
|
expect_exact: 'console.log({a:true,\'42\':"PASS","null":[]}[6*7]);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
object_methods: {
|
||||||
|
options = {
|
||||||
|
properties: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
({
|
||||||
|
p() {
|
||||||
|
console.log("FAIL 1");
|
||||||
|
},
|
||||||
|
*q() {
|
||||||
|
console.log("FAIL 2");
|
||||||
|
},
|
||||||
|
async r() {
|
||||||
|
console.log("FAIL 3");
|
||||||
|
},
|
||||||
|
async *s() {
|
||||||
|
console.log("PASS");
|
||||||
|
},
|
||||||
|
}).s().next();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
[
|
||||||
|
() => {
|
||||||
|
console.log("FAIL 1");
|
||||||
|
},
|
||||||
|
function*() {
|
||||||
|
console.log("FAIL 2");
|
||||||
|
},
|
||||||
|
async () => {
|
||||||
|
console.log("FAIL 3");
|
||||||
|
},
|
||||||
|
async function*() {
|
||||||
|
console.log("PASS");
|
||||||
|
},
|
||||||
|
][3]().next();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=10"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5177: {
|
||||||
|
options = {
|
||||||
|
properties: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "FAIL";
|
||||||
|
var o = { a: "PASS" };
|
||||||
|
o.p = {
|
||||||
|
q() {
|
||||||
|
return this.a;
|
||||||
|
},
|
||||||
|
}.q;
|
||||||
|
console.log(o.p());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "FAIL";
|
||||||
|
var o = { a: "PASS" };
|
||||||
|
o.p = {
|
||||||
|
q() {
|
||||||
|
return this.a;
|
||||||
|
},
|
||||||
|
}.q;
|
||||||
|
console.log(o.p());
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|||||||
@@ -133,7 +133,7 @@ conditional: {
|
|||||||
relational: {
|
relational: {
|
||||||
options = {
|
options = {
|
||||||
pure_funcs: [ "foo" ],
|
pure_funcs: [ "foo" ],
|
||||||
side_effects :true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
foo() in new foo();
|
foo() in new foo();
|
||||||
@@ -158,7 +158,7 @@ relational: {
|
|||||||
arithmetic: {
|
arithmetic: {
|
||||||
options = {
|
options = {
|
||||||
pure_funcs: [ "foo" ],
|
pure_funcs: [ "foo" ],
|
||||||
side_effects :true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
foo() + foo();
|
foo() + foo();
|
||||||
@@ -183,7 +183,7 @@ arithmetic: {
|
|||||||
boolean_and: {
|
boolean_and: {
|
||||||
options = {
|
options = {
|
||||||
pure_funcs: [ "foo" ],
|
pure_funcs: [ "foo" ],
|
||||||
side_effects :true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
foo() && foo();
|
foo() && foo();
|
||||||
@@ -208,7 +208,7 @@ boolean_and: {
|
|||||||
boolean_or: {
|
boolean_or: {
|
||||||
options = {
|
options = {
|
||||||
pure_funcs: [ "foo" ],
|
pure_funcs: [ "foo" ],
|
||||||
side_effects :true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
foo() || foo();
|
foo() || foo();
|
||||||
@@ -233,7 +233,7 @@ boolean_or: {
|
|||||||
assign: {
|
assign: {
|
||||||
options = {
|
options = {
|
||||||
pure_funcs: [ "foo" ],
|
pure_funcs: [ "foo" ],
|
||||||
side_effects :true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var a;
|
var a;
|
||||||
@@ -256,7 +256,7 @@ assign: {
|
|||||||
unary: {
|
unary: {
|
||||||
options = {
|
options = {
|
||||||
pure_funcs: [ "foo" ],
|
pure_funcs: [ "foo" ],
|
||||||
side_effects :true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
typeof foo();
|
typeof foo();
|
||||||
@@ -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: {
|
issue_3065_1: {
|
||||||
options = {
|
options = {
|
||||||
inline: true,
|
inline: true,
|
||||||
@@ -680,130 +438,3 @@ issue_3325_2: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_3858: {
|
|
||||||
options = {
|
|
||||||
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 = {
|
|
||||||
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 = {
|
|
||||||
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 = {
|
|
||||||
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 = {
|
|
||||||
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",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1289,6 +1289,7 @@ issue_2878: {
|
|||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
pure_getters: true,
|
pure_getters: true,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var c = 0;
|
var c = 0;
|
||||||
@@ -1321,10 +1322,10 @@ issue_2878: {
|
|||||||
issue_3427: {
|
issue_3427: {
|
||||||
options = {
|
options = {
|
||||||
assignments: true,
|
assignments: true,
|
||||||
collapse_vars: true,
|
evaluate: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
passes: 2,
|
|
||||||
pure_getters: "strict",
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
@@ -1363,9 +1364,8 @@ issue_3490_1: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var b = 42, c = "FAIL";
|
var b = 42, c = "FAIL";
|
||||||
if (function() {
|
var a;
|
||||||
var a;
|
if (c = "PASS", b) while ("" == typeof d);
|
||||||
}(), c = "PASS", b) while ("" == typeof d);
|
|
||||||
console.log(c, b);
|
console.log(c, b);
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS 42"
|
expect_stdout: "PASS 42"
|
||||||
@@ -1490,3 +1490,198 @@ issue_4751: {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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"
|
||||||
|
}
|
||||||
|
|
||||||
|
nested_property_assignments_4: {
|
||||||
|
options = {
|
||||||
|
pure_getters: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var n, o = { p: { q: { r: "PASS" } } };
|
||||||
|
(n = o.p).r = n.q.r;
|
||||||
|
console.log(o.p.r);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var n, o = { p: { q: { r: "PASS" } } };
|
||||||
|
(n = o.p).r = n.q.r;
|
||||||
|
console.log(o.p.r);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4939: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
({
|
||||||
|
__proto__: {
|
||||||
|
get p() {
|
||||||
|
console.log("PASS");
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}).p;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
({
|
||||||
|
__proto__: {
|
||||||
|
get p() {
|
||||||
|
console.log("PASS");
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}).p;
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ reduce_vars: {
|
|||||||
C: 0,
|
C: 0,
|
||||||
},
|
},
|
||||||
inline: true,
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
@@ -41,10 +42,8 @@ reduce_vars: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var A = 1;
|
var A = 1;
|
||||||
(function() {
|
console.log(-3);
|
||||||
console.log(-3);
|
console.log(A - 5);
|
||||||
console.log(A - 5);
|
|
||||||
})();
|
|
||||||
(function f1() {
|
(function f1() {
|
||||||
var a = 2;
|
var a = 2;
|
||||||
console.log(a - 5);
|
console.log(a - 5);
|
||||||
@@ -905,7 +904,7 @@ use_before_var: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function f(){
|
function f(){
|
||||||
console.log(void 0);
|
console.log(t);
|
||||||
var t = 1;
|
var t = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -981,7 +980,7 @@ inner_var_for_1: {
|
|||||||
expect: {
|
expect: {
|
||||||
function f() {
|
function f() {
|
||||||
var a = 1;
|
var a = 1;
|
||||||
x(1, void 0, d);
|
x(1, b, d);
|
||||||
for (var b = 2, c = 3; x(1, 2, 3, d); x(1, 2, 3, d)) {
|
for (var b = 2, c = 3; x(1, 2, 3, d); x(1, 2, 3, d)) {
|
||||||
var d = 4, e = 5;
|
var d = 4, e = 5;
|
||||||
x(1, 2, 3, d, e);
|
x(1, 2, 3, d, e);
|
||||||
@@ -1292,6 +1291,7 @@ toplevel_on_loops_3: {
|
|||||||
loops: true,
|
loops: true,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -2071,72 +2071,6 @@ issue_1670_2: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
issue_1670_3: {
|
issue_1670_3: {
|
||||||
options = {
|
|
||||||
comparisons: true,
|
|
||||||
conditionals: true,
|
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
switches: true,
|
|
||||||
typeofs: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function f() {
|
|
||||||
switch (1) {
|
|
||||||
case 0:
|
|
||||||
var a = true;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
if (typeof a === "undefined") console.log("PASS");
|
|
||||||
else console.log("FAIL");
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(function() {
|
|
||||||
var a;
|
|
||||||
void 0 === a ? console.log("PASS") : console.log("FAIL");
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1670_4: {
|
|
||||||
options = {
|
|
||||||
conditionals: true,
|
|
||||||
dead_code: true,
|
|
||||||
evaluate: true,
|
|
||||||
passes: 2,
|
|
||||||
reduce_funcs: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
switches: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(function f() {
|
|
||||||
switch (1) {
|
|
||||||
case 0:
|
|
||||||
var a = true;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
if (typeof a === "undefined") console.log("PASS");
|
|
||||||
else console.log("FAIL");
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(function() {
|
|
||||||
console.log("PASS");
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_1670_5: {
|
|
||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
@@ -2168,7 +2102,7 @@ issue_1670_5: {
|
|||||||
expect_stdout: "1"
|
expect_stdout: "1"
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_1670_6: {
|
issue_1670_4: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
@@ -3158,7 +3092,7 @@ accessor_1: {
|
|||||||
a = 2;
|
a = 2;
|
||||||
return a;
|
return a;
|
||||||
},
|
},
|
||||||
b: 1
|
b: 1,
|
||||||
}.b, a);
|
}.b, a);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
@@ -3168,7 +3102,7 @@ accessor_1: {
|
|||||||
a = 2;
|
a = 2;
|
||||||
return a;
|
return a;
|
||||||
},
|
},
|
||||||
b: 1
|
b: 1,
|
||||||
}.b, a);
|
}.b, a);
|
||||||
}
|
}
|
||||||
expect_stdout: "1 1"
|
expect_stdout: "1 1"
|
||||||
@@ -3188,7 +3122,7 @@ accessor_2: {
|
|||||||
var B = {
|
var B = {
|
||||||
get c() {
|
get c() {
|
||||||
console.log(A);
|
console.log(A);
|
||||||
}
|
},
|
||||||
};
|
};
|
||||||
B.c;
|
B.c;
|
||||||
}
|
}
|
||||||
@@ -3196,7 +3130,7 @@ accessor_2: {
|
|||||||
({
|
({
|
||||||
get c() {
|
get c() {
|
||||||
console.log(1);
|
console.log(1);
|
||||||
}
|
},
|
||||||
}).c;
|
}).c;
|
||||||
}
|
}
|
||||||
expect_stdout: "1"
|
expect_stdout: "1"
|
||||||
@@ -3242,7 +3176,7 @@ obj_var_1: {
|
|||||||
var obj = {
|
var obj = {
|
||||||
bar: function() {
|
bar: function() {
|
||||||
return C + C;
|
return C + C;
|
||||||
}
|
},
|
||||||
};
|
};
|
||||||
console.log(obj.bar());
|
console.log(obj.bar());
|
||||||
}
|
}
|
||||||
@@ -3250,7 +3184,7 @@ obj_var_1: {
|
|||||||
console.log({
|
console.log({
|
||||||
bar: function() {
|
bar: function() {
|
||||||
return 2;
|
return 2;
|
||||||
}
|
},
|
||||||
}.bar());
|
}.bar());
|
||||||
}
|
}
|
||||||
expect_stdout: "2"
|
expect_stdout: "2"
|
||||||
@@ -3274,7 +3208,7 @@ obj_var_2: {
|
|||||||
var obj = {
|
var obj = {
|
||||||
bar: function() {
|
bar: function() {
|
||||||
return C + C;
|
return C + C;
|
||||||
}
|
},
|
||||||
};
|
};
|
||||||
console.log(obj.bar());
|
console.log(obj.bar());
|
||||||
}
|
}
|
||||||
@@ -4488,6 +4422,7 @@ perf_2: {
|
|||||||
|
|
||||||
perf_3: {
|
perf_3: {
|
||||||
options = {
|
options = {
|
||||||
|
passes: 2,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
@@ -4496,10 +4431,10 @@ perf_3: {
|
|||||||
input: {
|
input: {
|
||||||
var foo = function(x, y, z) {
|
var foo = function(x, y, z) {
|
||||||
return x < y ? x * y + z : x * z - y;
|
return x < y ? x * y + z : x * z - y;
|
||||||
}
|
};
|
||||||
var indirect_foo = function(x, y, z) {
|
var indirect_foo = function(x, y, z) {
|
||||||
return foo(x, y, z);
|
return foo(x, y, z);
|
||||||
}
|
};
|
||||||
var sum = 0;
|
var sum = 0;
|
||||||
for (var i = 0; i < 100; ++i)
|
for (var i = 0; i < 100; ++i)
|
||||||
sum += indirect_foo(i, i + 1, 3 * i);
|
sum += indirect_foo(i, i + 1, 3 * i);
|
||||||
@@ -4528,10 +4463,10 @@ perf_4: {
|
|||||||
input: {
|
input: {
|
||||||
var foo = function(x, y, z) {
|
var foo = function(x, y, z) {
|
||||||
return x < y ? x * y + z : x * z - y;
|
return x < y ? x * y + z : x * z - y;
|
||||||
}
|
};
|
||||||
var indirect_foo = function(x, y, z) {
|
var indirect_foo = function(x, y, z) {
|
||||||
return foo(x, y, z);
|
return foo(x, y, z);
|
||||||
}
|
};
|
||||||
var sum = 0;
|
var sum = 0;
|
||||||
for (var i = 0; i < 100; ++i)
|
for (var i = 0; i < 100; ++i)
|
||||||
sum += indirect_foo(i, i + 1, 3 * i);
|
sum += indirect_foo(i, i + 1, 3 * i);
|
||||||
@@ -4540,10 +4475,10 @@ perf_4: {
|
|||||||
expect: {
|
expect: {
|
||||||
var foo = function(x, y, z) {
|
var foo = function(x, y, z) {
|
||||||
return x < y ? x * y + z : x * z - y;
|
return x < y ? x * y + z : x * z - y;
|
||||||
}
|
};
|
||||||
var indirect_foo = function(x, y, z) {
|
var indirect_foo = function(x, y, z) {
|
||||||
return foo(x, y, z);
|
return foo(x, y, z);
|
||||||
}
|
};
|
||||||
var sum = 0;
|
var sum = 0;
|
||||||
for (var i = 0; i < 100; ++i)
|
for (var i = 0; i < 100; ++i)
|
||||||
sum += indirect_foo(i, i + 1, 3 * i);
|
sum += indirect_foo(i, i + 1, 3 * i);
|
||||||
@@ -4632,9 +4567,9 @@ perf_7: {
|
|||||||
var indirect_foo = function(x, y, z) {
|
var indirect_foo = function(x, y, z) {
|
||||||
var foo = function(x, y, z) {
|
var foo = function(x, y, z) {
|
||||||
return x < y ? x * y + z : x * z - y;
|
return x < y ? x * y + z : x * z - y;
|
||||||
}
|
};
|
||||||
return foo(x, y, z);
|
return foo(x, y, z);
|
||||||
}
|
};
|
||||||
var sum = 0;
|
var sum = 0;
|
||||||
for (var i = 0; i < 100; ++i)
|
for (var i = 0; i < 100; ++i)
|
||||||
sum += indirect_foo(i, i + 1, 3 * i);
|
sum += indirect_foo(i, i + 1, 3 * i);
|
||||||
@@ -4664,9 +4599,9 @@ perf_8: {
|
|||||||
var indirect_foo = function(x, y, z) {
|
var indirect_foo = function(x, y, z) {
|
||||||
var foo = function(x, y, z) {
|
var foo = function(x, y, z) {
|
||||||
return x < y ? x * y + z : x * z - y;
|
return x < y ? x * y + z : x * z - y;
|
||||||
}
|
};
|
||||||
return foo(x, y, z);
|
return foo(x, y, z);
|
||||||
}
|
};
|
||||||
var sum = 0;
|
var sum = 0;
|
||||||
for (var i = 0; i < 100; ++i)
|
for (var i = 0; i < 100; ++i)
|
||||||
sum += indirect_foo(i, i + 1, 3 * i);
|
sum += indirect_foo(i, i + 1, 3 * i);
|
||||||
@@ -4677,7 +4612,7 @@ perf_8: {
|
|||||||
return function(x, y, z) {
|
return function(x, y, z) {
|
||||||
return x < y ? x * y + z : x * z - y;
|
return x < y ? x * y + z : x * z - y;
|
||||||
}(x, y, z);
|
}(x, y, z);
|
||||||
}
|
};
|
||||||
var sum = 0;
|
var sum = 0;
|
||||||
for (var i = 0; i < 100; ++i)
|
for (var i = 0; i < 100; ++i)
|
||||||
sum += indirect_foo(i, i + 1, 3 * i);
|
sum += indirect_foo(i, i + 1, 3 * i);
|
||||||
@@ -6735,6 +6670,7 @@ issues_3267_1: {
|
|||||||
dead_code: true,
|
dead_code: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
|
negate_iife: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
@@ -6752,7 +6688,7 @@ issues_3267_1: {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
!function(i) {
|
!function(x) {
|
||||||
if (Object())
|
if (Object())
|
||||||
return console.log("PASS");
|
return console.log("PASS");
|
||||||
throw "FAIL";
|
throw "FAIL";
|
||||||
@@ -6769,6 +6705,7 @@ issues_3267_2: {
|
|||||||
evaluate: true,
|
evaluate: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
keep_fargs: false,
|
keep_fargs: false,
|
||||||
|
negate_iife: true,
|
||||||
passes: 2,
|
passes: 2,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
@@ -7384,6 +7321,64 @@ local_assignment_loop: {
|
|||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
local_assignment_modified: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
(a = a || {}).p = 42;
|
||||||
|
console.log(a.p);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
(a = {}).p = 42;
|
||||||
|
console.log(a.p);
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
}
|
||||||
|
|
||||||
|
local_declaration: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
a || console.log(a = "PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
local_definition_modified: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = a || {};
|
||||||
|
a.p = 42;
|
||||||
|
console.log(a.p);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = {};
|
||||||
|
a.p = 42;
|
||||||
|
console.log(a.p);
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
}
|
||||||
|
|
||||||
issue_3957_1: {
|
issue_3957_1: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
@@ -7499,6 +7494,7 @@ issue_4030: {
|
|||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -7631,3 +7627,237 @@ issue_4568: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4937: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
while (console.log("PASS"));
|
||||||
|
}
|
||||||
|
do {
|
||||||
|
function g() {
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
} while (!g);
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
while (console.log("PASS"));
|
||||||
|
}
|
||||||
|
do {
|
||||||
|
function g() {
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
} while (!g);
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4943_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a, b = 1;
|
||||||
|
(function f() {
|
||||||
|
a = "foo";
|
||||||
|
b-- && f();
|
||||||
|
console.log(a);
|
||||||
|
a = "bar";
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a, b = 1;
|
||||||
|
(function f() {
|
||||||
|
a = "foo";
|
||||||
|
b-- && f();
|
||||||
|
console.log(a);
|
||||||
|
a = "bar";
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4943_2: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a, b = 1;
|
||||||
|
(function f() {
|
||||||
|
a = "foo";
|
||||||
|
b-- && f();
|
||||||
|
console.log(a);
|
||||||
|
a = "bar";
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a, b = 1;
|
||||||
|
(function f() {
|
||||||
|
a = "foo";
|
||||||
|
b-- && f();
|
||||||
|
console.log(a);
|
||||||
|
a = "bar";
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4949: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function f(a) {
|
||||||
|
a = 0;
|
||||||
|
console.log(a++, arguments[0]);
|
||||||
|
})(0);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(a) {
|
||||||
|
a = 0;
|
||||||
|
console.log(a++, arguments[0]);
|
||||||
|
})(0);
|
||||||
|
}
|
||||||
|
expect_stdout: "0 1"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5048: {
|
||||||
|
options = {
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
var a = function() {
|
||||||
|
return a + 42;
|
||||||
|
};
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function() {}());
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5050: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
this;
|
||||||
|
var a = 1;
|
||||||
|
f(console.log(2), f(), a = 3);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
this;
|
||||||
|
var a = 1;
|
||||||
|
f(console.log(2), f(), a = 3);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"2",
|
||||||
|
"1",
|
||||||
|
"3",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5055_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS";
|
||||||
|
function f() {
|
||||||
|
console.log(a || "FAIL");
|
||||||
|
}
|
||||||
|
f(0 && (a = 0)(f(this)));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "PASS";
|
||||||
|
function f() {
|
||||||
|
console.log(a || "FAIL");
|
||||||
|
}
|
||||||
|
f(0);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5055_2: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS";
|
||||||
|
function f() {
|
||||||
|
console.log(a || "FAIL");
|
||||||
|
}
|
||||||
|
f(0 && (a = 0)(f(this)));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "PASS";
|
||||||
|
function f() {
|
||||||
|
console.log(a || "FAIL");
|
||||||
|
}
|
||||||
|
f(0 && (a = 0)(f()));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5324: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
merge_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
A = 0;
|
||||||
|
do {
|
||||||
|
var a, b = A;
|
||||||
|
for (a in b)
|
||||||
|
var c = b;
|
||||||
|
} while (function() {
|
||||||
|
var d;
|
||||||
|
console.log(d *= A);
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
A = 0;
|
||||||
|
do {
|
||||||
|
var a, b = A;
|
||||||
|
for (a in b);
|
||||||
|
} while (b = void 0, void console.log(b *= A));
|
||||||
|
}
|
||||||
|
expect_stdout: "NaN"
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
mangle_catch: {
|
mangle_catch: {
|
||||||
rename = true
|
rename = true
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -24,11 +24,11 @@ mangle_catch: {
|
|||||||
mangle_catch_ie8: {
|
mangle_catch_ie8: {
|
||||||
rename = true
|
rename = true
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -47,11 +47,11 @@ mangle_catch_ie8: {
|
|||||||
mangle_catch_var: {
|
mangle_catch_var: {
|
||||||
rename = true
|
rename = true
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -70,11 +70,11 @@ mangle_catch_var: {
|
|||||||
mangle_catch_var_ie8: {
|
mangle_catch_var_ie8: {
|
||||||
rename = true
|
rename = true
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -93,11 +93,11 @@ mangle_catch_var_ie8: {
|
|||||||
mangle_catch_toplevel: {
|
mangle_catch_toplevel: {
|
||||||
rename = true
|
rename = true
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -116,11 +116,11 @@ mangle_catch_toplevel: {
|
|||||||
mangle_catch_ie8_toplevel: {
|
mangle_catch_ie8_toplevel: {
|
||||||
rename = true
|
rename = true
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -139,11 +139,11 @@ mangle_catch_ie8_toplevel: {
|
|||||||
mangle_catch_var_toplevel: {
|
mangle_catch_var_toplevel: {
|
||||||
rename = true
|
rename = true
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -162,11 +162,11 @@ mangle_catch_var_toplevel: {
|
|||||||
mangle_catch_var_ie8_toplevel: {
|
mangle_catch_var_ie8_toplevel: {
|
||||||
rename = true
|
rename = true
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -185,11 +185,11 @@ mangle_catch_var_ie8_toplevel: {
|
|||||||
mangle_catch_redef_1: {
|
mangle_catch_redef_1: {
|
||||||
rename = true
|
rename = true
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -208,11 +208,11 @@ mangle_catch_redef_1: {
|
|||||||
mangle_catch_redef_1_ie8: {
|
mangle_catch_redef_1_ie8: {
|
||||||
rename = true
|
rename = true
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -231,11 +231,11 @@ mangle_catch_redef_1_ie8: {
|
|||||||
mangle_catch_redef_1_toplevel: {
|
mangle_catch_redef_1_toplevel: {
|
||||||
rename = true
|
rename = true
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -254,11 +254,11 @@ mangle_catch_redef_1_toplevel: {
|
|||||||
mangle_catch_redef_1_ie8_toplevel: {
|
mangle_catch_redef_1_ie8_toplevel: {
|
||||||
rename = true
|
rename = true
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -277,11 +277,11 @@ mangle_catch_redef_1_ie8_toplevel: {
|
|||||||
mangle_catch_redef_2: {
|
mangle_catch_redef_2: {
|
||||||
rename = true
|
rename = true
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -299,11 +299,11 @@ mangle_catch_redef_2: {
|
|||||||
mangle_catch_redef_2_ie8: {
|
mangle_catch_redef_2_ie8: {
|
||||||
rename = true
|
rename = true
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -321,11 +321,11 @@ mangle_catch_redef_2_ie8: {
|
|||||||
mangle_catch_redef_2_toplevel: {
|
mangle_catch_redef_2_toplevel: {
|
||||||
rename = true
|
rename = true
|
||||||
options = {
|
options = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -343,11 +343,11 @@ mangle_catch_redef_2_toplevel: {
|
|||||||
mangle_catch_redef_2_ie8_toplevel: {
|
mangle_catch_redef_2_ie8_toplevel: {
|
||||||
rename = true
|
rename = true
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -365,7 +365,7 @@ mangle_catch_redef_2_ie8_toplevel: {
|
|||||||
issue_2120_1: {
|
issue_2120_1: {
|
||||||
rename = true
|
rename = true
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
"aaaaaaaa";
|
"aaaaaaaa";
|
||||||
@@ -401,7 +401,7 @@ issue_2120_1: {
|
|||||||
issue_2120_2: {
|
issue_2120_2: {
|
||||||
rename = true
|
rename = true
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
"aaaaaaaa";
|
"aaaaaaaa";
|
||||||
@@ -436,7 +436,7 @@ issue_2120_2: {
|
|||||||
function_iife_catch: {
|
function_iife_catch: {
|
||||||
rename = true
|
rename = true
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(n) {
|
function f(n) {
|
||||||
@@ -458,7 +458,7 @@ function_iife_catch: {
|
|||||||
function_iife_catch_ie8: {
|
function_iife_catch_ie8: {
|
||||||
rename = true
|
rename = true
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(n) {
|
function f(n) {
|
||||||
@@ -480,7 +480,7 @@ function_iife_catch_ie8: {
|
|||||||
function_catch_catch: {
|
function_catch_catch: {
|
||||||
rename = true
|
rename = true
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var o = 0;
|
var o = 0;
|
||||||
@@ -509,7 +509,7 @@ function_catch_catch: {
|
|||||||
function_catch_catch_ie8: {
|
function_catch_catch_ie8: {
|
||||||
rename = true
|
rename = true
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var o = 0;
|
var o = 0;
|
||||||
@@ -538,12 +538,12 @@ function_catch_catch_ie8: {
|
|||||||
function_do_catch_ie8: {
|
function_do_catch_ie8: {
|
||||||
rename = true
|
rename = true
|
||||||
options = {
|
options = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -615,7 +615,7 @@ function_do_catch_ie8: {
|
|||||||
issue_3480: {
|
issue_3480: {
|
||||||
rename = true,
|
rename = true,
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -647,7 +647,7 @@ issue_3480: {
|
|||||||
issue_3480_ie8: {
|
issue_3480_ie8: {
|
||||||
rename = true,
|
rename = true,
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -679,7 +679,7 @@ issue_3480_ie8: {
|
|||||||
issue_3480_toplevel: {
|
issue_3480_toplevel: {
|
||||||
rename = true,
|
rename = true,
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: false,
|
ie: false,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -711,7 +711,7 @@ issue_3480_toplevel: {
|
|||||||
issue_3480_ie8_toplevel: {
|
issue_3480_ie8_toplevel: {
|
||||||
rename = true,
|
rename = true,
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ arrow_destructured_object_1: {
|
|||||||
}
|
}
|
||||||
expect_exact: "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"
|
expect_stdout: "PASS 42"
|
||||||
node_version: ">=8"
|
node_version: ">=8.3.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
arrow_destructured_object_2: {
|
arrow_destructured_object_2: {
|
||||||
@@ -62,7 +62,7 @@ arrow_destructured_object_2: {
|
|||||||
}
|
}
|
||||||
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_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"
|
expect_stdout: "PASS 42"
|
||||||
node_version: ">=8"
|
node_version: ">=8.3.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
arrow_destructured_object_3: {
|
arrow_destructured_object_3: {
|
||||||
@@ -79,7 +79,7 @@ arrow_destructured_object_3: {
|
|||||||
"2 S",
|
"2 S",
|
||||||
"3 S",
|
"3 S",
|
||||||
]
|
]
|
||||||
node_version: ">=8"
|
node_version: ">=8.3.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
funarg_1: {
|
funarg_1: {
|
||||||
@@ -131,7 +131,7 @@ destructured_object_1: {
|
|||||||
}
|
}
|
||||||
expect_exact: '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"
|
expect_stdout: "PASS 42"
|
||||||
node_version: ">=8"
|
node_version: ">=8.3.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
destructured_object_2: {
|
destructured_object_2: {
|
||||||
@@ -141,7 +141,7 @@ destructured_object_2: {
|
|||||||
}
|
}
|
||||||
expect_exact: '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"
|
expect_stdout: "PASS 42"
|
||||||
node_version: ">=8"
|
node_version: ">=8.3.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
drop_fargs: {
|
drop_fargs: {
|
||||||
@@ -231,7 +231,7 @@ reduce_destructured_object: {
|
|||||||
console.log(a[0]);
|
console.log(a[0]);
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=8"
|
node_version: ">=8.3.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
retain_destructured_array: {
|
retain_destructured_array: {
|
||||||
@@ -244,7 +244,7 @@ retain_destructured_array: {
|
|||||||
console.log.apply(console, b);
|
console.log.apply(console, b);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var [ , ...b ] = [ "FAIL", "PASS", 42 ];
|
var [ ...b ] = [ "PASS", 42 ];
|
||||||
console.log.apply(console, b);
|
console.log.apply(console, b);
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS 42"
|
expect_stdout: "PASS 42"
|
||||||
@@ -270,7 +270,7 @@ retain_destructured_object_1: {
|
|||||||
"1 PASS",
|
"1 PASS",
|
||||||
"2 42",
|
"2 42",
|
||||||
]
|
]
|
||||||
node_version: ">=8"
|
node_version: ">=8.3.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
retain_destructured_object_2: {
|
retain_destructured_object_2: {
|
||||||
@@ -284,7 +284,7 @@ retain_destructured_object_2: {
|
|||||||
console.log(k, b[k]);
|
console.log(k, b[k]);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var { foo: [], ...b } = { foo: [ "FAIL" ], bar: "PASS", baz: 42 };
|
var { foo: {}, ...b } = { foo: 0, bar: "PASS", baz: 42 };
|
||||||
for (var k in b)
|
for (var k in b)
|
||||||
console.log(k, b[k]);
|
console.log(k, b[k]);
|
||||||
}
|
}
|
||||||
@@ -292,7 +292,7 @@ retain_destructured_object_2: {
|
|||||||
"bar PASS",
|
"bar PASS",
|
||||||
"baz 42",
|
"baz 42",
|
||||||
]
|
]
|
||||||
node_version: ">=8"
|
node_version: ">=8.3.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
retain_funarg_destructured_array_1: {
|
retain_funarg_destructured_array_1: {
|
||||||
@@ -344,11 +344,12 @@ retain_funarg_destructured_object_1: {
|
|||||||
console.log((({ ...a }) => a)([ "PASS" ])[0]);
|
console.log((({ ...a }) => a)([ "PASS" ])[0]);
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=8"
|
node_version: ">=8.3.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
retain_funarg_destructured_object_2: {
|
retain_funarg_destructured_object_2: {
|
||||||
options = {
|
options = {
|
||||||
|
keep_fargs: false,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -359,10 +360,10 @@ retain_funarg_destructured_object_2: {
|
|||||||
expect: {
|
expect: {
|
||||||
console.log(function({ p: a, ... b }) {
|
console.log(function({ p: a, ... b }) {
|
||||||
return b;
|
return b;
|
||||||
}({ p: "FAIL" }).p || "PASS");
|
}({}).p || "PASS");
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=8"
|
node_version: ">=8.3.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
drop_unused_call_args_1: {
|
drop_unused_call_args_1: {
|
||||||
@@ -407,6 +408,24 @@ drop_unused_call_args_2: {
|
|||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
maintain_position: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
A = "FAIL";
|
||||||
|
var [ , ...a ] = [ A, "PASS" ];
|
||||||
|
console.log(a[0]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
A = "FAIL";
|
||||||
|
var [ , ...a ] = [ A, "PASS" ];
|
||||||
|
console.log(a[0]);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
merge_funarg: {
|
merge_funarg: {
|
||||||
options = {
|
options = {
|
||||||
merge_vars: true,
|
merge_vars: true,
|
||||||
@@ -418,9 +437,9 @@ merge_funarg: {
|
|||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
(function(...b) {
|
(function(...a) {
|
||||||
var b = b.length;
|
var a = a.length;
|
||||||
console.log(b);
|
console.log(a);
|
||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
expect_stdout: "0"
|
expect_stdout: "0"
|
||||||
@@ -438,9 +457,9 @@ merge_funarg_destructured_array: {
|
|||||||
})([]);
|
})([]);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
(function([ ...b ]) {
|
(function([ ...a ]) {
|
||||||
var b = b.length;
|
var a = a.length;
|
||||||
console.log(b);
|
console.log(a);
|
||||||
})([]);
|
})([]);
|
||||||
}
|
}
|
||||||
expect_stdout: "0"
|
expect_stdout: "0"
|
||||||
@@ -458,13 +477,13 @@ merge_funarg_destructured_object: {
|
|||||||
})([ "PASS" ]);
|
})([ "PASS" ]);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
(function({ ...b }) {
|
(function({ ...a }) {
|
||||||
var b = b[0];
|
var a = a[0];
|
||||||
console.log(b);
|
console.log(a);
|
||||||
})([ "PASS" ]);
|
})([ "PASS" ]);
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=8"
|
node_version: ">=8.3.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
keep_arguments: {
|
keep_arguments: {
|
||||||
@@ -491,7 +510,7 @@ drop_rest_array: {
|
|||||||
rests: true,
|
rests: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var [ ...[ a ]] = [ "PASS" ];
|
var [ ...[ a ] ] = [ "PASS" ];
|
||||||
console.log(a);
|
console.log(a);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
@@ -542,6 +561,100 @@ drop_rest_lambda: {
|
|||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
keep_rest_array: {
|
||||||
|
options = {
|
||||||
|
rests: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var [ ...[ ...a ] ] = "PASS";
|
||||||
|
console.log(a.join(""));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var [ ...a ] = "PASS";
|
||||||
|
console.log(a.join(""));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
keep_rest_arrow: {
|
||||||
|
options = {
|
||||||
|
arrows: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
|
rests: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(((...[ ...a ]) => a.join(""))("PASS"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(((...a) => a.join(""))("PASS"));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
keep_rest_lambda_1: {
|
||||||
|
options = {
|
||||||
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
|
rests: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(...[ ...a ]) {
|
||||||
|
return a.join("");
|
||||||
|
}
|
||||||
|
console.log(f("PASS"), f([ 42 ]));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(...a) {
|
||||||
|
return a.join("");
|
||||||
|
}
|
||||||
|
console.log(f("PASS"), f([ 42 ]));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS 42"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
keep_rest_lambda_2: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(...[ ...a ]) {
|
||||||
|
return a.join("");
|
||||||
|
}
|
||||||
|
console.log(f("PASS"), f([ 42 ]));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(...[ ...a ]) {
|
||||||
|
return a.join("");
|
||||||
|
}
|
||||||
|
console.log(f("PASS"), f([ 42 ]));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS 42"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_new_function: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
new function(...{
|
||||||
|
[console.log("PASS")]: a,
|
||||||
|
}) {}();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
void ([ ... {
|
||||||
|
[console.log("PASS")]: [].e,
|
||||||
|
}] = []);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
issue_4525_1: {
|
issue_4525_1: {
|
||||||
options = {
|
options = {
|
||||||
arguments: true,
|
arguments: true,
|
||||||
@@ -647,6 +760,78 @@ issue_4544_2: {
|
|||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4560_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 0;
|
||||||
|
(function(...{
|
||||||
|
[a++]: {},
|
||||||
|
}) {})(2);
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 0;
|
||||||
|
(function(...{
|
||||||
|
[a++]: {},
|
||||||
|
}) {})(2);
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "1"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4560_2: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 0;
|
||||||
|
(function(...{
|
||||||
|
[a++]: {},
|
||||||
|
}) {})(2);
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 0;
|
||||||
|
(function(...{
|
||||||
|
[a++]: {},
|
||||||
|
}) {})(2);
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "1"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4560_3: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 0, b;
|
||||||
|
[ ...{
|
||||||
|
[a++]: b,
|
||||||
|
} ] = [ "PASS" ];
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 0, b;
|
||||||
|
[ ...{
|
||||||
|
[a++]: b,
|
||||||
|
} ] = [ "PASS" ];
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
issue_4562: {
|
issue_4562: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
@@ -667,7 +852,7 @@ issue_4562: {
|
|||||||
issue_4575: {
|
issue_4575: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
ie8: true,
|
ie: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
rests: true,
|
rests: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -682,9 +867,9 @@ issue_4575: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
(function(a) {
|
(function(a) {
|
||||||
(function a(...d) {
|
(function(d) {
|
||||||
console.log(d.length);
|
console.log(d.length);
|
||||||
})();
|
})([]);
|
||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
expect_stdout: "0"
|
expect_stdout: "0"
|
||||||
@@ -777,10 +962,404 @@ issue_4666: {
|
|||||||
expect: {
|
expect: {
|
||||||
var a = 0, b = 0;
|
var a = 0, b = 0;
|
||||||
var o = (c => +a + c)([ b ]);
|
var o = (c => +a + c)([ b ]);
|
||||||
for(var k in o)
|
for (var k in o)
|
||||||
b++;
|
b++;
|
||||||
console.log(1, b);
|
console.log(1, b);
|
||||||
}
|
}
|
||||||
expect_stdout: "1 2"
|
expect_stdout: "1 2"
|
||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_5089_1: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var {
|
||||||
|
p: [] = 42,
|
||||||
|
...o
|
||||||
|
} = {
|
||||||
|
p: [],
|
||||||
|
};
|
||||||
|
console.log(o.p);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var {
|
||||||
|
p: {},
|
||||||
|
...o
|
||||||
|
} = {
|
||||||
|
p: 0,
|
||||||
|
};
|
||||||
|
console.log(o.p);
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=8.3.0"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5089_2: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var {
|
||||||
|
p: {} = null,
|
||||||
|
...o
|
||||||
|
} = {
|
||||||
|
p: {},
|
||||||
|
};
|
||||||
|
console.log(o.p);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var {
|
||||||
|
p: {},
|
||||||
|
...o
|
||||||
|
} = {
|
||||||
|
p: 0,
|
||||||
|
};
|
||||||
|
console.log(o.p);
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=8.3.0"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5100_1: {
|
||||||
|
options = {
|
||||||
|
passes: 2,
|
||||||
|
pure_getters: "strict",
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
[ {
|
||||||
|
p: {},
|
||||||
|
...a
|
||||||
|
} ] = [ {
|
||||||
|
p: {
|
||||||
|
q: a,
|
||||||
|
} = 42,
|
||||||
|
r: "PASS",
|
||||||
|
} ];
|
||||||
|
console.log(a.r);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
({
|
||||||
|
p: {},
|
||||||
|
...a
|
||||||
|
} = [ {
|
||||||
|
p: {
|
||||||
|
q: a,
|
||||||
|
} = 42,
|
||||||
|
r: "PASS",
|
||||||
|
} ][0]);
|
||||||
|
console.log(a.r);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=8.3.0"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5100_2: {
|
||||||
|
options = {
|
||||||
|
passes: 2,
|
||||||
|
pure_getters: "strict",
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
[ {
|
||||||
|
p: {},
|
||||||
|
...a
|
||||||
|
} ] = [ {
|
||||||
|
p: (console.log("PASS"), {
|
||||||
|
q: a,
|
||||||
|
} = 42),
|
||||||
|
} ];
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
({
|
||||||
|
p: {},
|
||||||
|
...a
|
||||||
|
} = [ {
|
||||||
|
p: (console.log("PASS"), {
|
||||||
|
q: a,
|
||||||
|
} = 42),
|
||||||
|
} ][0]);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=10.22.0"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5108: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
|
rests: true,
|
||||||
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function([ ...[ a ] ]) {
|
||||||
|
return a;
|
||||||
|
}([ "PASS", "FAIL" ]));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5128_1: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
return function f(...[ a ]) {
|
||||||
|
return a;
|
||||||
|
}("PASS");
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function f(...[ a ]) {
|
||||||
|
return a;
|
||||||
|
}("PASS"));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5128_2: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
keep_fnames: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
return function f(...[ a ]) {
|
||||||
|
return a;
|
||||||
|
}("PASS");
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function f(...[ a ]) {
|
||||||
|
return a;
|
||||||
|
}("PASS"));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5165_1: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
rests: true,
|
||||||
|
side_effects: true,
|
||||||
|
switches: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function([ ...a ]) {
|
||||||
|
switch (a) {
|
||||||
|
case a:
|
||||||
|
return "PASS";
|
||||||
|
}
|
||||||
|
}([]));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function([ ...a ]) {
|
||||||
|
return "PASS";
|
||||||
|
}([]));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5165_2: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
rests: true,
|
||||||
|
side_effects: true,
|
||||||
|
switches: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(...a) {
|
||||||
|
switch (a) {
|
||||||
|
case a:
|
||||||
|
return "PASS";
|
||||||
|
}
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5246_1: {
|
||||||
|
options = {
|
||||||
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
|
rests: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(typeof function([ , ...a ]) {
|
||||||
|
return this && a;
|
||||||
|
}([ , function(){} ])[0]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(typeof function() {
|
||||||
|
return this && [ function(){} ];
|
||||||
|
}()[0]);
|
||||||
|
}
|
||||||
|
expect_stdout: "function"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5246_2: {
|
||||||
|
options = {
|
||||||
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
|
rests: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
A = [ , "PASS", "FAIL" ];
|
||||||
|
var [ , ...a ] = [ ... A ];
|
||||||
|
console.log(a[0]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
A = [ , "PASS", "FAIL" ];
|
||||||
|
var [ , ...a ] = [ ... A ];
|
||||||
|
console.log(a[0]);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5246_3: {
|
||||||
|
options = {
|
||||||
|
keep_fargs: false,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function f(...[ [ a ] ]) {
|
||||||
|
console.log(a);
|
||||||
|
})([ "PASS" ]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(...[ a ]) {
|
||||||
|
console.log(a);
|
||||||
|
})([ "PASS" ][0]);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5360: {
|
||||||
|
options = {
|
||||||
|
keep_fargs: false,
|
||||||
|
pure_getters: "strict",
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
console.log(function({ p: {}, ...b }) {
|
||||||
|
return b.q;
|
||||||
|
}({
|
||||||
|
p: ~a && ([ a ] = []),
|
||||||
|
q: "PASS",
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
console.log(function({ p: {}, ...b }) {
|
||||||
|
return b.q;
|
||||||
|
}({
|
||||||
|
p: ~a && ([ a ] = []),
|
||||||
|
q: "PASS",
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=8.3.0"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5370: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
ie: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function arguments(...a) {
|
||||||
|
return arguments;
|
||||||
|
try {} catch (e) {
|
||||||
|
var arguments;
|
||||||
|
}
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function arguments(...a) {
|
||||||
|
return arguments;
|
||||||
|
var arguments;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5391: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
objects: true,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a, b = function f({
|
||||||
|
p: {},
|
||||||
|
...c
|
||||||
|
}) {
|
||||||
|
while (c.q);
|
||||||
|
}({
|
||||||
|
p: {
|
||||||
|
r: a++,
|
||||||
|
r: 0,
|
||||||
|
}
|
||||||
|
});
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function({
|
||||||
|
p: {},
|
||||||
|
...c
|
||||||
|
}) {
|
||||||
|
while (c.q);
|
||||||
|
})({
|
||||||
|
p: 0,
|
||||||
|
});
|
||||||
|
console.log(NaN);
|
||||||
|
}
|
||||||
|
expect_stdout: "NaN"
|
||||||
|
node_version: ">=8.3.0"
|
||||||
|
}
|
||||||
|
|||||||
@@ -172,3 +172,49 @@ issue_4054: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "{ p: [Setter] }"
|
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"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5197: {
|
||||||
|
rename = true
|
||||||
|
input: {
|
||||||
|
function f(async) {
|
||||||
|
async(")=>{}");
|
||||||
|
}
|
||||||
|
console.log("" + this.__proto__);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a) {
|
||||||
|
a(")=>{}");
|
||||||
|
}
|
||||||
|
console.log("" + this.__proto__);
|
||||||
|
}
|
||||||
|
expect_stdout: "[object global]"
|
||||||
|
}
|
||||||
|
|||||||
@@ -289,8 +289,34 @@ iife: {
|
|||||||
typeof function g() {}();
|
typeof function g() {}();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
x = 42, function a() {}(), function b() {}(), function c() {}(),
|
x = 42,
|
||||||
function d() {}(), function e() {}(), function f() {}(), function g() {}();
|
function a() {}(),
|
||||||
|
!function b() {}(),
|
||||||
|
~function c() {}(),
|
||||||
|
+function d() {}(),
|
||||||
|
-function e() {}(),
|
||||||
|
void function f() {}(),
|
||||||
|
typeof function g() {}();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
iife_drop_side_effect_free: {
|
||||||
|
options = {
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
x = 42;
|
||||||
|
(function a() {})();
|
||||||
|
!function b() {}();
|
||||||
|
~function c() {}();
|
||||||
|
+function d() {}();
|
||||||
|
-function e() {}();
|
||||||
|
void function f() {}();
|
||||||
|
typeof function g() {}();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
x = 42;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -564,6 +590,34 @@ delete_seq_3: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
delete_seq_4: {
|
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 = {
|
options = {
|
||||||
booleans: true,
|
booleans: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
@@ -592,6 +646,35 @@ delete_seq_4: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
delete_seq_5: {
|
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 = {
|
options = {
|
||||||
booleans: true,
|
booleans: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
@@ -717,7 +800,7 @@ side_effects_cascade_3: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function f(a, b) {
|
function f(a, b) {
|
||||||
(b += a) || (b = a) || (b -= a, b ^= a),
|
(b += a) || (b = a) || (b = b - a ^ a),
|
||||||
a--;
|
a--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -853,9 +936,7 @@ hoist_decl: {
|
|||||||
var d;
|
var d;
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var a;
|
var a, b = (w(), x()), c, d;
|
||||||
w();
|
|
||||||
var b = x(), c, d;
|
|
||||||
for (y(); 0;) z();
|
for (y(); 0;) z();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -990,11 +1071,102 @@ call: {
|
|||||||
b.c = function() {
|
b.c = function() {
|
||||||
console.log(this === b ? "bar" : "baz");
|
console.log(this === b ? "bar" : "baz");
|
||||||
},
|
},
|
||||||
|
a,
|
||||||
b(),
|
b(),
|
||||||
|
a,
|
||||||
b.c(),
|
b.c(),
|
||||||
(a, b.c)(),
|
(a, b.c)(),
|
||||||
|
a,
|
||||||
b["c"](),
|
b["c"](),
|
||||||
(a, b["c"])(),
|
(a, b["c"])(),
|
||||||
|
a,
|
||||||
|
function() {
|
||||||
|
console.log(this === a);
|
||||||
|
}(),
|
||||||
|
a,
|
||||||
|
new b(),
|
||||||
|
a,
|
||||||
|
new b.c(),
|
||||||
|
a,
|
||||||
|
new b.c(),
|
||||||
|
a,
|
||||||
|
new b["c"](),
|
||||||
|
a,
|
||||||
|
new b["c"](),
|
||||||
|
a,
|
||||||
|
new function() {
|
||||||
|
console.log(this === a);
|
||||||
|
}(),
|
||||||
|
console.log((a, typeof b.c)),
|
||||||
|
console.log((a, typeof b["c"]));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
"baz",
|
||||||
|
"bar",
|
||||||
|
"baz",
|
||||||
|
"true",
|
||||||
|
"foo",
|
||||||
|
"baz",
|
||||||
|
"baz",
|
||||||
|
"baz",
|
||||||
|
"baz",
|
||||||
|
"false",
|
||||||
|
"function",
|
||||||
|
"function",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
call_drop_side_effect_free: {
|
||||||
|
options = {
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = function() {
|
||||||
|
return this;
|
||||||
|
}();
|
||||||
|
function b() {
|
||||||
|
console.log("foo");
|
||||||
|
}
|
||||||
|
b.c = function() {
|
||||||
|
console.log(this === b ? "bar" : "baz");
|
||||||
|
};
|
||||||
|
(a, b)();
|
||||||
|
(a, b).c();
|
||||||
|
(a, b.c)();
|
||||||
|
(a, b)["c"]();
|
||||||
|
(a, b["c"])();
|
||||||
|
(a, function() {
|
||||||
|
console.log(this === a);
|
||||||
|
})();
|
||||||
|
new (a, b)();
|
||||||
|
new (a, b).c();
|
||||||
|
new (a, b.c)();
|
||||||
|
new (a, b)["c"]();
|
||||||
|
new (a, b["c"])();
|
||||||
|
new (a, function() {
|
||||||
|
console.log(this === a);
|
||||||
|
})();
|
||||||
|
console.log(typeof (a, b).c);
|
||||||
|
console.log(typeof (a, b)["c"]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = function() {
|
||||||
|
return this;
|
||||||
|
}();
|
||||||
|
function b() {
|
||||||
|
console.log("foo");
|
||||||
|
}
|
||||||
|
b.c = function() {
|
||||||
|
console.log(this === b ? "bar" : "baz");
|
||||||
|
},
|
||||||
|
b(),
|
||||||
|
b.c(),
|
||||||
|
(0, b.c)(),
|
||||||
|
b["c"](),
|
||||||
|
(0, b["c"])(),
|
||||||
function() {
|
function() {
|
||||||
console.log(this === a);
|
console.log(this === a);
|
||||||
}(),
|
}(),
|
||||||
@@ -1006,8 +1178,8 @@ call: {
|
|||||||
new function() {
|
new function() {
|
||||||
console.log(this === a);
|
console.log(this === a);
|
||||||
}(),
|
}(),
|
||||||
console.log((a, typeof b.c)),
|
console.log(typeof b.c),
|
||||||
console.log((a, typeof b["c"]));
|
console.log(typeof b["c"]);
|
||||||
}
|
}
|
||||||
expect_stdout: [
|
expect_stdout: [
|
||||||
"foo",
|
"foo",
|
||||||
@@ -1042,6 +1214,26 @@ missing_link: {
|
|||||||
expect: {
|
expect: {
|
||||||
var a = 100;
|
var a = 100;
|
||||||
a,
|
a,
|
||||||
|
a++ + (0, 1),
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
missing_link_drop_side_effect_free: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
evaluate: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 100;
|
||||||
|
a;
|
||||||
|
a++ + (0 ? 2 : 1);
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 100;
|
||||||
a++,
|
a++,
|
||||||
console.log(a);
|
console.log(a);
|
||||||
}
|
}
|
||||||
@@ -1105,10 +1297,8 @@ issue_3490_1: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var b = 42, c = "FAIL";
|
var b = 42, c = "FAIL";
|
||||||
if (function() {
|
var a;
|
||||||
var a;
|
if (a && a.p, c = "PASS", b) while ("" == typeof d);
|
||||||
a && a.p;
|
|
||||||
}(), c = "PASS", b) while ("" == typeof d);
|
|
||||||
console.log(c, b);
|
console.log(c, b);
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS 42"
|
expect_stdout: "PASS 42"
|
||||||
@@ -1138,9 +1328,8 @@ issue_3490_2: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var b = 42, c = "FAIL";
|
var b = 42, c = "FAIL";
|
||||||
for (function() {
|
var a;
|
||||||
var a;
|
for (c = "PASS"; "" == typeof d;);
|
||||||
}(), c = "PASS", b; "" == typeof d;);
|
|
||||||
console.log(c, b);
|
console.log(c, b);
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS 42"
|
expect_stdout: "PASS 42"
|
||||||
|
|||||||
@@ -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: {
|
unsafe_builtin_1: {
|
||||||
options = {
|
options = {
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
@@ -587,7 +617,7 @@ issue_4730_2: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var a;
|
var a;
|
||||||
!console.log("PASS") || a && a[a.p];
|
console.log("PASS") && a && a[a.p];
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ collapse_vars_4: {
|
|||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|
||||||
conditionals_farg: {
|
conditionals_farg_1: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
}
|
}
|
||||||
@@ -107,6 +107,28 @@ conditionals_farg: {
|
|||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
conditionals_farg_2: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var log = console.log;
|
||||||
|
(function(a) {
|
||||||
|
return a.length ? log(...a) : log("FAIL");
|
||||||
|
})([ "PASS" ]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var log = console.log;
|
||||||
|
(function(a) {
|
||||||
|
return a.length ? log(...a) : log("FAIL");
|
||||||
|
})([ "PASS" ]);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
dont_inline: {
|
dont_inline: {
|
||||||
options = {
|
options = {
|
||||||
inline: true,
|
inline: true,
|
||||||
@@ -125,7 +147,7 @@ dont_inline: {
|
|||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|
||||||
do_inline: {
|
do_inline_1: {
|
||||||
options = {
|
options = {
|
||||||
inline: true,
|
inline: true,
|
||||||
spreads: true,
|
spreads: true,
|
||||||
@@ -142,6 +164,46 @@ do_inline: {
|
|||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
do_inline_2: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
(function() {
|
||||||
|
console.log("PASS");
|
||||||
|
})(..."");
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
[] = [ ..."" ],
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
do_inline_3: {
|
||||||
|
options = {
|
||||||
|
if_return: true,
|
||||||
|
inline: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
(function() {
|
||||||
|
while (console.log("PASS"));
|
||||||
|
})(..."");
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var [] = [ ..."" ];
|
||||||
|
while (console.log("PASS"));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
drop_empty_call_1: {
|
drop_empty_call_1: {
|
||||||
options = {
|
options = {
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
@@ -179,7 +241,29 @@ drop_empty_call_2: {
|
|||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|
||||||
convert_hole: {
|
convert_hole_array: {
|
||||||
|
options = {
|
||||||
|
spreads: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
[ ...[ "PASS", , 42 ] ].forEach(function(a) {
|
||||||
|
console.log(a);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
[ "PASS", void 0, 42 ].forEach(function(a) {
|
||||||
|
console.log(a);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"PASS",
|
||||||
|
"undefined",
|
||||||
|
"42",
|
||||||
|
]
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
convert_hole_call: {
|
||||||
options = {
|
options = {
|
||||||
spreads: true,
|
spreads: true,
|
||||||
}
|
}
|
||||||
@@ -272,6 +356,31 @@ reduce_vars_2: {
|
|||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
reduce_vars_3: {
|
||||||
|
options = {
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {}
|
||||||
|
function g() {
|
||||||
|
return (a => a)(...[ f ]);
|
||||||
|
}
|
||||||
|
console.log(g() === g() ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {}
|
||||||
|
function g() {
|
||||||
|
return (a => a)(...[ f ]);
|
||||||
|
}
|
||||||
|
console.log(g() === g() ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
convert_setter: {
|
convert_setter: {
|
||||||
options = {
|
options = {
|
||||||
objects: true,
|
objects: true,
|
||||||
@@ -294,7 +403,7 @@ convert_setter: {
|
|||||||
console.log(k, o[k]);
|
console.log(k, o[k]);
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS undefined"
|
expect_stdout: "PASS undefined"
|
||||||
node_version: ">=8"
|
node_version: ">=8.3.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
keep_getter_1: {
|
keep_getter_1: {
|
||||||
@@ -323,7 +432,7 @@ keep_getter_1: {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=8"
|
node_version: ">=8.3.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
keep_getter_2: {
|
keep_getter_2: {
|
||||||
@@ -352,7 +461,7 @@ keep_getter_2: {
|
|||||||
"foo",
|
"foo",
|
||||||
"bar",
|
"bar",
|
||||||
]
|
]
|
||||||
node_version: ">=8"
|
node_version: ">=8.3.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
keep_getter_3: {
|
keep_getter_3: {
|
||||||
@@ -382,7 +491,7 @@ keep_getter_3: {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=8"
|
node_version: ">=8.3.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
keep_getter_4: {
|
keep_getter_4: {
|
||||||
@@ -413,7 +522,7 @@ keep_getter_4: {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=8"
|
node_version: ">=8.3.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
keep_accessor: {
|
keep_accessor: {
|
||||||
@@ -461,7 +570,7 @@ keep_accessor: {
|
|||||||
"q undefined",
|
"q undefined",
|
||||||
"r null",
|
"r null",
|
||||||
]
|
]
|
||||||
node_version: ">=8"
|
node_version: ">=8.3.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
object_key_order_1: {
|
object_key_order_1: {
|
||||||
@@ -491,7 +600,7 @@ object_key_order_1: {
|
|||||||
"a 3",
|
"a 3",
|
||||||
"b 2",
|
"b 2",
|
||||||
]
|
]
|
||||||
node_version: ">=8 <=10"
|
node_version: ">=8.3.0 <=10"
|
||||||
}
|
}
|
||||||
|
|
||||||
object_key_order_2: {
|
object_key_order_2: {
|
||||||
@@ -521,7 +630,7 @@ object_key_order_2: {
|
|||||||
"a 3",
|
"a 3",
|
||||||
"b 2",
|
"b 2",
|
||||||
]
|
]
|
||||||
node_version: ">=8"
|
node_version: ">=8.3.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
object_key_order_3: {
|
object_key_order_3: {
|
||||||
@@ -551,7 +660,7 @@ object_key_order_3: {
|
|||||||
"a 3",
|
"a 3",
|
||||||
"b 2",
|
"b 2",
|
||||||
]
|
]
|
||||||
node_version: ">=8"
|
node_version: ">=8.3.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
object_key_order_4: {
|
object_key_order_4: {
|
||||||
@@ -581,7 +690,7 @@ object_key_order_4: {
|
|||||||
"a 3",
|
"a 3",
|
||||||
"b 2",
|
"b 2",
|
||||||
]
|
]
|
||||||
node_version: ">=8"
|
node_version: ">=8.3.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
object_spread_array: {
|
object_spread_array: {
|
||||||
@@ -607,7 +716,7 @@ object_spread_array: {
|
|||||||
"0 foo",
|
"0 foo",
|
||||||
"1 bar",
|
"1 bar",
|
||||||
]
|
]
|
||||||
node_version: ">=8"
|
node_version: ">=8.3.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
object_spread_string: {
|
object_spread_string: {
|
||||||
@@ -634,7 +743,7 @@ object_spread_string: {
|
|||||||
"1 o",
|
"1 o",
|
||||||
"2 o",
|
"2 o",
|
||||||
]
|
]
|
||||||
node_version: ">=8"
|
node_version: ">=8.3.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
unused_var_side_effects: {
|
unused_var_side_effects: {
|
||||||
@@ -664,7 +773,58 @@ unused_var_side_effects: {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=8"
|
node_version: ">=8.3.0"
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe_join_1: {
|
||||||
|
options = {
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log([ ..."foo" ].join());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log([ ..."foo" ].join());
|
||||||
|
}
|
||||||
|
expect_stdout: "f,o,o"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe_join_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log([ "foo", ..."bar" ].join(""));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log([ "foo", ..."bar" ].join(""));
|
||||||
|
}
|
||||||
|
expect_stdout: "foobar"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe_join_3: {
|
||||||
|
options = {
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try {
|
||||||
|
[].join(...console);
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
try {
|
||||||
|
[].join(...console);
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_4329: {
|
issue_4329: {
|
||||||
@@ -695,7 +855,7 @@ issue_4329: {
|
|||||||
}[0]);
|
}[0]);
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=8"
|
node_version: ">=8.3.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_4331: {
|
issue_4331: {
|
||||||
@@ -773,7 +933,7 @@ issue_4345: {
|
|||||||
}[42]);
|
}[42]);
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=8"
|
node_version: ">=8.3.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_4361: {
|
issue_4361: {
|
||||||
@@ -803,7 +963,7 @@ issue_4361: {
|
|||||||
"foo",
|
"foo",
|
||||||
"undefined",
|
"undefined",
|
||||||
]
|
]
|
||||||
node_version: ">=8"
|
node_version: ">=8.3.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_4363: {
|
issue_4363: {
|
||||||
@@ -824,7 +984,7 @@ issue_4363: {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=8"
|
node_version: ">=8.3.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_4556: {
|
issue_4556: {
|
||||||
@@ -847,78 +1007,6 @@ issue_4556: {
|
|||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_4560_1: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 0;
|
|
||||||
(function(...{
|
|
||||||
[a++]: {},
|
|
||||||
}) {})(2);
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 0;
|
|
||||||
(function(...{
|
|
||||||
[a++]: {},
|
|
||||||
}) {})(2);
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_stdout: "1"
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_4560_2: {
|
|
||||||
options = {
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 0;
|
|
||||||
(function(...{
|
|
||||||
[a++]: {},
|
|
||||||
}) {})(2);
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 0;
|
|
||||||
(function(...{
|
|
||||||
[a++]: {},
|
|
||||||
}) {})(2);
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_stdout: "1"
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_4560_3: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = 0, b;
|
|
||||||
[ ...{
|
|
||||||
[a++]: b,
|
|
||||||
} ] = [ "PASS" ];
|
|
||||||
console.log(b);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = 0, b;
|
|
||||||
[ ...{
|
|
||||||
[a++]: b,
|
|
||||||
} ] = [ "PASS" ];
|
|
||||||
console.log(b);
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
node_version: ">=6"
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_4614: {
|
issue_4614: {
|
||||||
options = {
|
options = {
|
||||||
pure_getters: "strict",
|
pure_getters: "strict",
|
||||||
@@ -947,3 +1035,162 @@ issue_4614: {
|
|||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4849: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
while (function() {
|
||||||
|
while (!console);
|
||||||
|
}(new function(a) {
|
||||||
|
console.log(typeof { ...a });
|
||||||
|
}(function() {})));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
while (function() {
|
||||||
|
while (!console);
|
||||||
|
}(function(a) {
|
||||||
|
console.log(typeof { ...function() {} });
|
||||||
|
}()));
|
||||||
|
}
|
||||||
|
expect_stdout: "object"
|
||||||
|
node_version: ">=8.3.0"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4882_1: {
|
||||||
|
options = {
|
||||||
|
objects: true,
|
||||||
|
spreads: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
p: "PASS",
|
||||||
|
... {
|
||||||
|
__proto__: {
|
||||||
|
p: "FAIL 1",
|
||||||
|
q: "FAIL 2",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
console.log(o.p);
|
||||||
|
console.log(o.q);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {
|
||||||
|
p: "PASS",
|
||||||
|
};
|
||||||
|
console.log(o.p);
|
||||||
|
console.log(o.q);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"PASS",
|
||||||
|
"undefined",
|
||||||
|
]
|
||||||
|
node_version: ">=8.3.0"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4882_2: {
|
||||||
|
options = {
|
||||||
|
objects: true,
|
||||||
|
spreads: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(null == Object.getPrototypeOf({
|
||||||
|
... {
|
||||||
|
__proto__: (console.log(42), null),
|
||||||
|
},
|
||||||
|
}) ? "FAIL" : "PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(null == Object.getPrototypeOf({
|
||||||
|
... {
|
||||||
|
__proto__: (console.log(42), null),
|
||||||
|
},
|
||||||
|
}) ? "FAIL" : "PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"42",
|
||||||
|
"PASS",
|
||||||
|
]
|
||||||
|
node_version: ">=8.3.0"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4882_3: {
|
||||||
|
options = {
|
||||||
|
objects: true,
|
||||||
|
spreads: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
__proto__: { p: 42 },
|
||||||
|
... {
|
||||||
|
set __proto__(v) {},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
console.log(o.__proto__ === Object.getPrototypeOf(o) ? "FAIL" : "PASS");
|
||||||
|
console.log(o.p);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {
|
||||||
|
__proto__: { p: 42 },
|
||||||
|
["__proto__"]: void 0,
|
||||||
|
};
|
||||||
|
console.log(o.__proto__ === Object.getPrototypeOf(o) ? "FAIL" : "PASS");
|
||||||
|
console.log(o.p);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"PASS",
|
||||||
|
"42",
|
||||||
|
]
|
||||||
|
node_version: ">=8.3.0"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5006: {
|
||||||
|
options = {
|
||||||
|
arguments: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(b, c) {
|
||||||
|
c = "FAIL 2";
|
||||||
|
return arguments[1];
|
||||||
|
}(...[], "FAIL 1") || "PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(b, c) {
|
||||||
|
c = "FAIL 2";
|
||||||
|
return arguments[1];
|
||||||
|
}(...[], "FAIL 1") || "PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5382: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
({
|
||||||
|
f() {
|
||||||
|
({ ...this });
|
||||||
|
},
|
||||||
|
get p() {
|
||||||
|
console.log("PASS");
|
||||||
|
},
|
||||||
|
}).f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
({
|
||||||
|
f() {
|
||||||
|
({ ...this });
|
||||||
|
},
|
||||||
|
get p() {
|
||||||
|
console.log("PASS");
|
||||||
|
},
|
||||||
|
}).f();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=8.3.0"
|
||||||
|
}
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ constant_switch_5: {
|
|||||||
// the break inside the if ruins our job
|
// the break inside the if ruins our job
|
||||||
// we can still get rid of irrelevant cases.
|
// we can still get rid of irrelevant cases.
|
||||||
switch (1) {
|
switch (1) {
|
||||||
case 1:
|
default:
|
||||||
x();
|
x();
|
||||||
if (foo) break;
|
if (foo) break;
|
||||||
y();
|
y();
|
||||||
@@ -300,6 +300,37 @@ drop_default_2: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
drop_default_3: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
console.log("PASS");
|
||||||
|
return 42;
|
||||||
|
}
|
||||||
|
switch (42) {
|
||||||
|
case f():
|
||||||
|
break;
|
||||||
|
case void console.log("FAIL"):
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
console.log("PASS");
|
||||||
|
return 42;
|
||||||
|
}
|
||||||
|
switch (42) {
|
||||||
|
case f():
|
||||||
|
case void console.log("FAIL"):
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
keep_default: {
|
keep_default: {
|
||||||
options = {
|
options = {
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
@@ -423,7 +454,6 @@ drop_case_3: {
|
|||||||
switch ({}.p) {
|
switch ({}.p) {
|
||||||
default:
|
default:
|
||||||
case void 0:
|
case void 0:
|
||||||
break;
|
|
||||||
case c = "FAIL":
|
case c = "FAIL":
|
||||||
}
|
}
|
||||||
console.log(c);
|
console.log(c);
|
||||||
@@ -454,7 +484,168 @@ drop_case_4: {
|
|||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
keep_case: {
|
drop_case_5: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
switch (42) {
|
||||||
|
case void console.log("PASS 1"):
|
||||||
|
console.log("FAIL 1");
|
||||||
|
case 42:
|
||||||
|
case console.log("FAIL 2"):
|
||||||
|
console.log("PASS 2");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
switch (42) {
|
||||||
|
default:
|
||||||
|
void console.log("PASS 1");
|
||||||
|
console.log("PASS 2");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"PASS 1",
|
||||||
|
"PASS 2",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_case_6: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
switch (console.log("PASS 1"), 2) {
|
||||||
|
case 0:
|
||||||
|
console.log("FAIL 1");
|
||||||
|
case (console.log("PASS 2"), 1):
|
||||||
|
console.log("FAIL 2");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
switch (console.log("PASS 1"), 2) {
|
||||||
|
case (console.log("PASS 2"), 1):
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"PASS 1",
|
||||||
|
"PASS 2",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_case_7: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
switch (2) {
|
||||||
|
case 0:
|
||||||
|
console.log("FAIL 1");
|
||||||
|
case (console.log("PASS 1"), 1):
|
||||||
|
console.log("FAIL 2");
|
||||||
|
case 2:
|
||||||
|
console.log("PASS 2");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
switch (2) {
|
||||||
|
default:
|
||||||
|
console.log("PASS 1"), 1;
|
||||||
|
console.log("PASS 2");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"PASS 1",
|
||||||
|
"PASS 2",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_case_8: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function log(msg) {
|
||||||
|
console.log(msg);
|
||||||
|
return msg;
|
||||||
|
}
|
||||||
|
switch (log("foo")) {
|
||||||
|
case "bar":
|
||||||
|
log("moo");
|
||||||
|
break;
|
||||||
|
case log("baz"):
|
||||||
|
log("moo");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
log("moo");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function log(msg) {
|
||||||
|
console.log(msg);
|
||||||
|
return msg;
|
||||||
|
}
|
||||||
|
switch (log("foo")) {
|
||||||
|
case "bar":
|
||||||
|
case log("baz"):
|
||||||
|
default:
|
||||||
|
log("moo");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"baz",
|
||||||
|
"moo",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_case_9: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function log(msg) {
|
||||||
|
console.log(msg);
|
||||||
|
return msg;
|
||||||
|
}
|
||||||
|
switch (log("foo")) {
|
||||||
|
case log("bar"):
|
||||||
|
log("moo");
|
||||||
|
break;
|
||||||
|
case "baz":
|
||||||
|
log("moo");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
log("moo");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function log(msg) {
|
||||||
|
console.log(msg);
|
||||||
|
return msg;
|
||||||
|
}
|
||||||
|
switch (log("foo")) {
|
||||||
|
default:
|
||||||
|
log("bar");
|
||||||
|
log("moo");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
"moo",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
keep_case_1: {
|
||||||
options = {
|
options = {
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
switches: true,
|
switches: true,
|
||||||
@@ -474,6 +665,76 @@ keep_case: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
keep_case_2: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
switch ("foo") {
|
||||||
|
case console.log("bar"):
|
||||||
|
case console.log("baz"), "moo":
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
switch ("foo") {
|
||||||
|
case console.log("bar"):
|
||||||
|
case console.log("baz"), "moo":
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"bar",
|
||||||
|
"baz",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
keep_case_3: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
switch (void console.log("PASS")) {
|
||||||
|
case a:
|
||||||
|
case console.log("FAIL"), 42:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
switch (void console.log("PASS")) {
|
||||||
|
case a:
|
||||||
|
case console.log("FAIL"), 42:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
keep_case_4: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
switch (void console.log("PASS")) {
|
||||||
|
case a:
|
||||||
|
case void console.log("FAIL"):
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
switch (void console.log("PASS")) {
|
||||||
|
case a:
|
||||||
|
case void console.log("FAIL"):
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
issue_376: {
|
issue_376: {
|
||||||
options = {
|
options = {
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
@@ -661,7 +922,7 @@ issue_1680_1: {
|
|||||||
case f(0):
|
case f(0):
|
||||||
case f(1):
|
case f(1):
|
||||||
f(2);
|
f(2);
|
||||||
case 2:
|
default:
|
||||||
f(5);
|
f(5);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -924,7 +1185,6 @@ issue_2535: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
w(), 42;
|
w(), 42;
|
||||||
42;
|
|
||||||
y();
|
y();
|
||||||
z();
|
z();
|
||||||
}
|
}
|
||||||
@@ -950,7 +1210,6 @@ issue_1750: {
|
|||||||
expect: {
|
expect: {
|
||||||
var a = 0, b = 1;
|
var a = 0, b = 1;
|
||||||
true;
|
true;
|
||||||
a, true;
|
|
||||||
b = 2;
|
b = 2;
|
||||||
console.log(a, b);
|
console.log(a, b);
|
||||||
}
|
}
|
||||||
@@ -1088,7 +1347,8 @@ drop_switch_6: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
A === B;
|
A;
|
||||||
|
B;
|
||||||
x();
|
x();
|
||||||
C !== D;
|
C !== D;
|
||||||
y();
|
y();
|
||||||
@@ -1181,3 +1441,170 @@ issue_4059: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_5008_1: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
switches: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function f() {
|
||||||
|
switch (f) {
|
||||||
|
case f:
|
||||||
|
return "PASS";
|
||||||
|
default:
|
||||||
|
return "FAIL";
|
||||||
|
}
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function f() {
|
||||||
|
switch (f) {
|
||||||
|
default:
|
||||||
|
return "PASS";
|
||||||
|
}
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5008_2: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
switches: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(a) {
|
||||||
|
switch (a) {
|
||||||
|
case a:
|
||||||
|
return "PASS";
|
||||||
|
default:
|
||||||
|
return "FAIL";
|
||||||
|
}
|
||||||
|
}([]));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(a) {
|
||||||
|
switch (a) {
|
||||||
|
default:
|
||||||
|
return "PASS";
|
||||||
|
}
|
||||||
|
}([]));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5008_3: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
switches: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(a) {
|
||||||
|
switch (a) {
|
||||||
|
case a:
|
||||||
|
return "PASS";
|
||||||
|
default:
|
||||||
|
return "FAIL";
|
||||||
|
}
|
||||||
|
}({}));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(a) {
|
||||||
|
switch (a) {
|
||||||
|
default:
|
||||||
|
return "PASS";
|
||||||
|
}
|
||||||
|
}({}));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5008_4: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(a) {
|
||||||
|
switch (a) {
|
||||||
|
case a:
|
||||||
|
return "PASS";
|
||||||
|
default:
|
||||||
|
return "FAIL";
|
||||||
|
}
|
||||||
|
}(/foo/));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(a) {
|
||||||
|
switch (a) {
|
||||||
|
default:
|
||||||
|
return "PASS";
|
||||||
|
}
|
||||||
|
}(/foo/));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5010: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
switch (42) {
|
||||||
|
case console.log("PASS"):
|
||||||
|
case a:
|
||||||
|
console.log("FAIL");
|
||||||
|
case 42:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
switch (42) {
|
||||||
|
case console.log("PASS"):
|
||||||
|
case a:
|
||||||
|
console.log("FAIL");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5012: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
switch (void 0) {
|
||||||
|
case console.log("PASS"):
|
||||||
|
break;
|
||||||
|
case void 0:
|
||||||
|
case 42:
|
||||||
|
console.log("FAIL");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
switch (void 0) {
|
||||||
|
case console.log("PASS"):
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
console.log("FAIL");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
@@ -62,6 +62,23 @@ tag_parentheses_arrow: {
|
|||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tag_parentheses_binary: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var f = function() {
|
||||||
|
console.log("PASS");
|
||||||
|
} || console
|
||||||
|
f``;
|
||||||
|
}
|
||||||
|
expect_exact: '(function(){console.log("PASS")}||console)``;'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
tag_parentheses_new: {
|
tag_parentheses_new: {
|
||||||
input: {
|
input: {
|
||||||
(new function() {
|
(new function() {
|
||||||
@@ -73,6 +90,35 @@ tag_parentheses_new: {
|
|||||||
node_version: ">=4"
|
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"
|
||||||
|
}
|
||||||
|
|
||||||
|
tag_parentheses_unary: {
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
try {
|
||||||
|
(~a)``;
|
||||||
|
(a++)``;
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: 'var a;try{(~a)``;(a++)``}catch(e){console.log("PASS")}'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
malformed_escape: {
|
malformed_escape: {
|
||||||
input: {
|
input: {
|
||||||
(function(s) {
|
(function(s) {
|
||||||
@@ -85,6 +131,105 @@ malformed_escape: {
|
|||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
booleans: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true,
|
||||||
|
templates: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
console.log(`$${a}${a}` ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
console.log("$" + a + a ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
escape_placeholder_1: {
|
||||||
|
options = {
|
||||||
|
templates: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(`\${\n`);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(`\${
|
||||||
|
`);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"${",
|
||||||
|
"",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
escape_placeholder_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
templates: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(`\n${"${"}\n`);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(`
|
||||||
|
\${
|
||||||
|
`);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"",
|
||||||
|
"${",
|
||||||
|
"",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
escape_placeholder_3: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
templates: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(`\n$${"{"}\n`);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(`
|
||||||
|
\${
|
||||||
|
`);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"",
|
||||||
|
"${",
|
||||||
|
"",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
escape_placeholder_4: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
templates: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(`\n${"$"}${"{"}\n`);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(`
|
||||||
|
\${
|
||||||
|
`);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"",
|
||||||
|
"${",
|
||||||
|
"",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
evaluate: {
|
evaluate: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
@@ -128,7 +273,7 @@ partial_evaluate: {
|
|||||||
console.log(`${6 * 7} foo ${console ? `PA` + "SS" : `FA` + `IL`}`);
|
console.log(`${6 * 7} foo ${console ? `PA` + "SS" : `FA` + `IL`}`);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
console.log(`42 foo ${console ? "PASS" : "FAIL"}`);
|
console.log("42 foo " + (console ? "PASS" : "FAIL"));
|
||||||
}
|
}
|
||||||
expect_stdout: "42 foo PASS"
|
expect_stdout: "42 foo PASS"
|
||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
@@ -158,7 +303,7 @@ malformed_evaluate_2: {
|
|||||||
console.log(`\u0${0}b${5}`);
|
console.log(`\u0${0}b${5}`);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
console.log(`\u0${0}b5`);
|
console.log(`\u00b` + 5);
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
@@ -192,7 +337,7 @@ malformed_evaluate_4: {
|
|||||||
console.log("\\u00b5");
|
console.log("\\u00b5");
|
||||||
}
|
}
|
||||||
expect_stdout: "\\u00b5"
|
expect_stdout: "\\u00b5"
|
||||||
node_version: ">=8"
|
node_version: ">=8.10.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe_evaluate: {
|
unsafe_evaluate: {
|
||||||
@@ -208,10 +353,10 @@ unsafe_evaluate: {
|
|||||||
console.log("\\uFo");
|
console.log("\\uFo");
|
||||||
}
|
}
|
||||||
expect_stdout: "\\uFo"
|
expect_stdout: "\\uFo"
|
||||||
node_version: ">=8"
|
node_version: ">=8.10.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
side_effects: {
|
side_effects_1: {
|
||||||
options = {
|
options = {
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
@@ -228,6 +373,30 @@ side_effects: {
|
|||||||
node_version: ">=4"
|
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: {
|
unsafe_side_effects: {
|
||||||
options = {
|
options = {
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
@@ -245,6 +414,21 @@ unsafe_side_effects: {
|
|||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pure_funcs: {
|
||||||
|
options = {
|
||||||
|
pure_funcs: "Math.random",
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
Math.random`${console.log("PASS")}`;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
issue_4604: {
|
issue_4604: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
@@ -272,13 +456,14 @@ issue_4604: {
|
|||||||
issue_4606: {
|
issue_4606: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
strings: true,
|
||||||
templates: true,
|
templates: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(`${typeof A} ${"\r"} ${"\\"} ${"`"}`);
|
console.log(`${typeof A} ${"\r"} ${"\\"} ${"`"}`);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
console.log(`${typeof A} \r \\ \``);
|
console.log(typeof A + " \r \\ `");
|
||||||
}
|
}
|
||||||
expect_stdout: "undefined \r \\ `"
|
expect_stdout: "undefined \r \\ `"
|
||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
@@ -305,7 +490,7 @@ issue_4676: {
|
|||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
templates: true,
|
templates: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
unsafe:true,
|
unsafe: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -328,3 +513,259 @@ issue_4676: {
|
|||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4931: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
templates: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(String.raw`${typeof A} ${"\r"}`);
|
||||||
|
console.log(String.raw`${"\\"} ${"`"}`);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(String.raw`${typeof A} ${"\r"}`);
|
||||||
|
console.log("\\ `");
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"undefined \r",
|
||||||
|
"\\ `",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5125_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
strings: true,
|
||||||
|
templates: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(`PASS ${typeof A}`);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("PASS " + typeof A);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS undefined"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5125_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
strings: true,
|
||||||
|
templates: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(`PASS
|
||||||
|
${typeof A}`);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(`PASS
|
||||||
|
` + typeof A);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"PASS",
|
||||||
|
"undefined",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5125_3: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
strings: true,
|
||||||
|
templates: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(`PASS\n${typeof A}`);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(`PASS
|
||||||
|
` + typeof A);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"PASS",
|
||||||
|
"undefined",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5125_4: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
strings: true,
|
||||||
|
templates: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(`PASS
|
||||||
|
|
||||||
|
${typeof A}`);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(`PASS
|
||||||
|
|
||||||
|
` + typeof A);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"PASS",
|
||||||
|
"",
|
||||||
|
"undefined",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5125_5: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
strings: true,
|
||||||
|
templates: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(`PASS\n\n${typeof A}`);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(`PASS
|
||||||
|
|
||||||
|
` + typeof A);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"PASS",
|
||||||
|
"",
|
||||||
|
"undefined",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5125_6: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
strings: true,
|
||||||
|
templates: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(`${typeof A} ${typeof B} PASS`);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(typeof A + ` ${typeof B} PASS`);
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined undefined PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5125_7: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
strings: true,
|
||||||
|
templates: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(`${typeof A} ${typeof B} ${typeof C} PASS`);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(typeof A + ` ${typeof B} ${typeof C} PASS`);
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined undefined undefined PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5125_8: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
strings: true,
|
||||||
|
templates: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(`${typeof A}${typeof B}${typeof C} PASS`);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(typeof A + typeof B + typeof C + " PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "undefinedundefinedundefined PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5136: {
|
||||||
|
options = {
|
||||||
|
templates: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(`${A = []}${A[0] = 42}`);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(`` + (A = []) + (A[0] = 42));
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5145_1: {
|
||||||
|
options = {
|
||||||
|
strings: true,
|
||||||
|
templates: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = [];
|
||||||
|
console.log(`${a}${a[0] = 42}
|
||||||
|
`);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = [];
|
||||||
|
console.log(`${a}${a[0] = 42}
|
||||||
|
`);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"42",
|
||||||
|
"",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5145_2: {
|
||||||
|
options = {
|
||||||
|
strings: true,
|
||||||
|
templates: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = [];
|
||||||
|
console.log(`${a}${a}${a[0] = 42}
|
||||||
|
`);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = [];
|
||||||
|
console.log("" + a + a + (a[0] = 42) + `
|
||||||
|
`);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"42",
|
||||||
|
"",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5199: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = function() {
|
||||||
|
console.log(typeof b);
|
||||||
|
}``;
|
||||||
|
{
|
||||||
|
const b = a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = function() {
|
||||||
|
console.log(typeof b);
|
||||||
|
}``;
|
||||||
|
{
|
||||||
|
const b = a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ while_if_break: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
for(; a && (b && c && d, !e););
|
for (; a && (b && c && d, !e););
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -307,7 +307,7 @@ typeof_defined_1: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
"undefined" == typeof A && A;
|
"undefined" == typeof A && A;
|
||||||
"undefined" != typeof A || A;
|
"undefined" == typeof A && A;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -324,7 +324,7 @@ typeof_defined_2: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
"function" != typeof A && A;
|
"function" != typeof A && A;
|
||||||
"function" == typeof A || A;
|
"function" != typeof A && A;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -355,16 +355,19 @@ typeof_defined_3: {
|
|||||||
"undefined" == typeof A && "undefined" == typeof B && (A, B);
|
"undefined" == typeof A && "undefined" == typeof B && (A, B);
|
||||||
"undefined" == typeof A && "undefined" != typeof B && A;
|
"undefined" == typeof A && "undefined" != typeof B && A;
|
||||||
"undefined" != typeof A && "undefined" == typeof B && B;
|
"undefined" != typeof A && "undefined" == typeof B && B;
|
||||||
|
// dropped
|
||||||
"undefined" == typeof A && "undefined" == typeof B || (A, B);
|
"undefined" == typeof A && "undefined" == typeof B || (A, B);
|
||||||
"undefined" == typeof A && "undefined" != typeof B || (A, B);
|
"undefined" == typeof A && "undefined" != typeof B || (A, B);
|
||||||
"undefined" != typeof A && "undefined" == typeof B || (A, B);
|
"undefined" != typeof A && "undefined" == typeof B || (A, B);
|
||||||
"undefined" != typeof A && "undefined" != typeof B || (A, B);
|
"undefined" != typeof A && "undefined" != typeof B || (A, B);
|
||||||
"undefined" == typeof A || "undefined" == typeof B && B;
|
"undefined" != typeof A && "undefined" == typeof B && B;
|
||||||
"undefined" != typeof A || "undefined" == typeof B && (A, B);
|
// dropped
|
||||||
"undefined" != typeof A || "undefined" != typeof B && A;
|
"undefined" == typeof A && "undefined" == typeof B && (A, B);
|
||||||
"undefined" == typeof A || "undefined" != typeof B || B;
|
"undefined" == typeof A && "undefined" != typeof B && A;
|
||||||
"undefined" != typeof A || "undefined" == typeof B || A;
|
// dropped
|
||||||
"undefined" != typeof A || "undefined" != typeof B || (A, B);
|
"undefined" != typeof A && "undefined" == typeof B && B;
|
||||||
|
"undefined" == typeof A && "undefined" != typeof B && A;
|
||||||
|
"undefined" == typeof A && "undefined" == typeof B && (A, B);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -392,6 +395,7 @@ typeof_defined_4: {
|
|||||||
"object" != typeof A || "object" != typeof B || (A, B);
|
"object" != typeof A || "object" != typeof B || (A, B);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
|
// dropped
|
||||||
"object" == typeof A && "object" != typeof B && B;
|
"object" == typeof A && "object" != typeof B && B;
|
||||||
"object" != typeof A && "object" == typeof B && A;
|
"object" != typeof A && "object" == typeof B && A;
|
||||||
"object" != typeof A && "object" != typeof B && (A, B);
|
"object" != typeof A && "object" != typeof B && (A, B);
|
||||||
@@ -399,12 +403,14 @@ typeof_defined_4: {
|
|||||||
"object" == typeof A && "object" != typeof B || (A, B);
|
"object" == typeof A && "object" != typeof B || (A, B);
|
||||||
"object" != typeof A && "object" == typeof B || (A, B);
|
"object" != typeof A && "object" == typeof B || (A, B);
|
||||||
"object" != typeof A && "object" != typeof B || (A, B);
|
"object" != typeof A && "object" != typeof B || (A, B);
|
||||||
"object" == typeof A || "object" == typeof B && A;
|
"object" != typeof A && "object" == typeof B && A;
|
||||||
"object" == typeof A || "object" != typeof B && (A, B);
|
"object" != typeof A && "object" != typeof B && (A, B);
|
||||||
"object" != typeof A || "object" != typeof B && B;
|
// dropped
|
||||||
"object" == typeof A || "object" == typeof B || (A, B);
|
"object" == typeof A && "object" != typeof B && B;
|
||||||
"object" == typeof A || "object" != typeof B || A;
|
"object" != typeof A && "object" != typeof B && (A, B);
|
||||||
"object" != typeof A || "object" == typeof B || B;
|
"object" != typeof A && "object" == typeof B && A;
|
||||||
|
"object" == typeof A && "object" != typeof B && B;
|
||||||
|
// dropped
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -436,6 +442,245 @@ emberjs_global: {
|
|||||||
expect_stdout: Error("PASS")
|
expect_stdout: Error("PASS")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
reassign: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
conditionals: true,
|
||||||
|
passes: 2,
|
||||||
|
typeofs: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
A = console;
|
||||||
|
if ("undefined" == typeof A)
|
||||||
|
console.log("FAIL 1");
|
||||||
|
else {
|
||||||
|
A = void 0;
|
||||||
|
while (console.log(void 0 === A ? "PASS" : "FAIL 2"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
A = console;
|
||||||
|
if ("undefined" == typeof A)
|
||||||
|
console.log("FAIL 1");
|
||||||
|
else {
|
||||||
|
A = void 0;
|
||||||
|
while (console.log(void 0 === A ? "PASS" : "FAIL 2"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
reassign_call: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
conditionals: true,
|
||||||
|
passes: 2,
|
||||||
|
typeofs: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
A = console;
|
||||||
|
function f() {
|
||||||
|
A = void 0;
|
||||||
|
}
|
||||||
|
if ("undefined" == typeof A)
|
||||||
|
console.log("FAIL 1");
|
||||||
|
else {
|
||||||
|
f();
|
||||||
|
while (console.log(void 0 === A ? "PASS" : "FAIL 2"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
A = console;
|
||||||
|
function f() {
|
||||||
|
A = void 0;
|
||||||
|
}
|
||||||
|
if ("undefined" == typeof A)
|
||||||
|
console.log("FAIL 1");
|
||||||
|
else {
|
||||||
|
f();
|
||||||
|
while (console.log(void 0 === A ? "PASS" : "FAIL 2"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
reassign_conditional: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
conditionals: true,
|
||||||
|
passes: 2,
|
||||||
|
typeofs: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
A = console;
|
||||||
|
if ("undefined" == typeof A)
|
||||||
|
console.log("FAIL 1");
|
||||||
|
else {
|
||||||
|
A &&= void 0;
|
||||||
|
while (console.log(void 0 === A ? "PASS" : "FAIL 2"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
A = console;
|
||||||
|
if ("undefined" == typeof A)
|
||||||
|
console.log("FAIL 1");
|
||||||
|
else {
|
||||||
|
A &&= void 0;
|
||||||
|
while (console.log(void 0 === A ? "PASS" : "FAIL 2"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
reassign_do: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
conditionals: true,
|
||||||
|
if_return: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_vars: true,
|
||||||
|
typeofs: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
A = console;
|
||||||
|
(function() {
|
||||||
|
if ("undefined" == typeof A)
|
||||||
|
return;
|
||||||
|
var a = A, i = 2;
|
||||||
|
do {
|
||||||
|
console.log(void 0 === A, void 0 === a);
|
||||||
|
A = void 0;
|
||||||
|
} while (--i);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
A = console;
|
||||||
|
(function() {
|
||||||
|
if ("undefined" != typeof A) {
|
||||||
|
var a = A, i = 2;
|
||||||
|
do {
|
||||||
|
console.log(void 0 === A, (a, false));
|
||||||
|
A = void 0;
|
||||||
|
} while (--i);
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"false false",
|
||||||
|
"true false",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
reassign_for: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
conditionals: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
typeofs: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
if (A = console, "undefined" != typeof A)
|
||||||
|
for (var a = A, i = 0; i < 2; i++)
|
||||||
|
console.log(void 0 === A, void 0 === a),
|
||||||
|
A = void 0;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
if (A = console, "undefined" != typeof A)
|
||||||
|
for (var a = A, i = 0; i < 2; i++)
|
||||||
|
console.log(void 0 === A, (a, false)),
|
||||||
|
A = void 0;
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"false false",
|
||||||
|
"true false",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
reassign_for_in: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
conditionals: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_vars: true,
|
||||||
|
typeofs: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(A = console) && "undefined" != typeof A && function(a) {
|
||||||
|
for (var k in [ a = A, 42 ]) {
|
||||||
|
console.log(void 0 === A, void 0 === a);
|
||||||
|
A = void 0;
|
||||||
|
}
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(A = console) && "undefined" != typeof A && function(a) {
|
||||||
|
for (var k in [ a = A, 42 ]) {
|
||||||
|
console.log(void 0 === A, (a, false));
|
||||||
|
A = void 0;
|
||||||
|
}
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"false false",
|
||||||
|
"true false",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
reassign_iife: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
conditionals: true,
|
||||||
|
passes: 2,
|
||||||
|
typeofs: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
A = console;
|
||||||
|
if ("undefined" == typeof A)
|
||||||
|
console.log("FAIL 1");
|
||||||
|
else (function() {
|
||||||
|
A = void 0;
|
||||||
|
})(console.log(void 0 === A ? "FAIL 2" : "PASS"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
A = console;
|
||||||
|
"undefined" == typeof A ? console.log("FAIL 1") : function() {
|
||||||
|
A = void 0;
|
||||||
|
}(console.log((A, false) ? "FAIL 2" : "PASS"));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
reassign_property: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
conditionals: true,
|
||||||
|
passes: 2,
|
||||||
|
typeofs: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
A = console;
|
||||||
|
if ("undefined" == typeof A)
|
||||||
|
console.log("FAIL 1");
|
||||||
|
else {
|
||||||
|
A.p = void 0;
|
||||||
|
console.log(void 0 === A ? "FAIL 2" : "PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
A = console;
|
||||||
|
if ("undefined" == typeof A)
|
||||||
|
console.log("FAIL 1");
|
||||||
|
else {
|
||||||
|
A.p = void 0;
|
||||||
|
console.log((A, false) ? "FAIL 2" : "PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
issue_3817: {
|
issue_3817: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ unicode_parse_variables: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unicode_escaped_identifier: {
|
unicode_escaped_identifier_1: {
|
||||||
input: {
|
input: {
|
||||||
var \u0061 = "\ud800\udc00";
|
var \u0061 = "\ud800\udc00";
|
||||||
console.log(a);
|
console.log(a);
|
||||||
@@ -59,6 +59,18 @@ unicode_escaped_identifier: {
|
|||||||
expect_stdout: "\ud800\udc00"
|
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"
|
||||||
|
// non-BMP support is platform-dependent on Node.js v4
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
unicode_identifier_ascii_only: {
|
unicode_identifier_ascii_only: {
|
||||||
beautify = {
|
beautify = {
|
||||||
ascii_only: true,
|
ascii_only: true,
|
||||||
@@ -189,7 +201,8 @@ surrogate_pair: {
|
|||||||
}
|
}
|
||||||
expect_exact: 'var \ud87e\udc00={"\ud87e\udc01":"\udbc0\udc00"};\ud87e\udc00.\ud87e\udc02="\udbc0\udc01";console.log(typeof \ud87e\udc00,\ud87e\udc00.\ud87e\udc01,\ud87e\udc00["\ud87e\udc02"]);'
|
expect_exact: 'var \ud87e\udc00={"\ud87e\udc01":"\udbc0\udc00"};\ud87e\udc00.\ud87e\udc02="\udbc0\udc01";console.log(typeof \ud87e\udc00,\ud87e\udc00.\ud87e\udc01,\ud87e\udc00["\ud87e\udc02"]);'
|
||||||
expect_stdout: "object \udbc0\udc00 \udbc0\udc01"
|
expect_stdout: "object \udbc0\udc00 \udbc0\udc01"
|
||||||
node_version: ">=4"
|
// non-BMP support is platform-dependent on Node.js v4
|
||||||
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|
||||||
surrogate_pair_ascii: {
|
surrogate_pair_ascii: {
|
||||||
@@ -205,5 +218,6 @@ surrogate_pair_ascii: {
|
|||||||
}
|
}
|
||||||
expect_exact: 'var \\u{2f800}={"\\ud87e\\udc01":"\\udbc0\\udc00"};\\u{2f800}.\\u{2f802}="\\udbc0\\udc01";console.log(typeof \\u{2f800},\\u{2f800}.\\u{2f801},\\u{2f800}["\\ud87e\\udc02"]);'
|
expect_exact: 'var \\u{2f800}={"\\ud87e\\udc01":"\\udbc0\\udc00"};\\u{2f800}.\\u{2f802}="\\udbc0\\udc01";console.log(typeof \\u{2f800},\\u{2f800}.\\u{2f801},\\u{2f800}["\\ud87e\\udc02"]);'
|
||||||
expect_stdout: "object \udbc0\udc00 \udbc0\udc01"
|
expect_stdout: "object \udbc0\udc00 \udbc0\udc01"
|
||||||
node_version: ">=4"
|
// non-BMP support is platform-dependent on Node.js v4
|
||||||
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,10 +13,10 @@ reduce_merge_const: {
|
|||||||
console.log(b);
|
console.log(b);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var b = console;
|
var a = console;
|
||||||
console.log(typeof b);
|
console.log(typeof a);
|
||||||
b = typeof b;
|
a = typeof a;
|
||||||
console.log(b);
|
console.log(a);
|
||||||
}
|
}
|
||||||
expect_stdout: [
|
expect_stdout: [
|
||||||
"object",
|
"object",
|
||||||
@@ -41,10 +41,10 @@ reduce_merge_let: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
"use strict";
|
"use strict";
|
||||||
var b = console;
|
var a = console;
|
||||||
console.log(typeof b);
|
console.log(typeof a);
|
||||||
b = typeof b;
|
a = typeof a;
|
||||||
console.log(b);
|
console.log(a);
|
||||||
}
|
}
|
||||||
expect_stdout: [
|
expect_stdout: [
|
||||||
"object",
|
"object",
|
||||||
@@ -111,7 +111,7 @@ hoist_props_const: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var o_p = "PASS";
|
var o = 0, o_p = "PASS";
|
||||||
console.log(o_p);
|
console.log(o_p);
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
@@ -136,7 +136,7 @@ hoist_props_let: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
"use strict";
|
"use strict";
|
||||||
var o_p = "PASS";
|
var o, o_p = "PASS";
|
||||||
console.log(o_p);
|
console.log(o_p);
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
@@ -523,3 +523,93 @@ default_init: {
|
|||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4933_1: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
varify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(f());
|
||||||
|
function f() {
|
||||||
|
var a;
|
||||||
|
for (console in a = [ f ]) {
|
||||||
|
const b = a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function f() {
|
||||||
|
var a;
|
||||||
|
for (console in a = [ f ]) {
|
||||||
|
const b = a;
|
||||||
|
}
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4933_2: {
|
||||||
|
options = {
|
||||||
|
passes: 2,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
varify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(f());
|
||||||
|
function f() {
|
||||||
|
var a;
|
||||||
|
for (console in a = [ f ]) {
|
||||||
|
const b = a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function f() {
|
||||||
|
for (console in [ f ]);
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4954: {
|
||||||
|
options = {
|
||||||
|
functions: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
varify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
(function() {
|
||||||
|
{
|
||||||
|
let a = console;
|
||||||
|
console.log(typeof a);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
let a = function() {};
|
||||||
|
a && console.log(typeof a);
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
(function() {
|
||||||
|
var a = console;
|
||||||
|
console.log(typeof a);
|
||||||
|
{
|
||||||
|
let a = function() {};
|
||||||
|
a && console.log(typeof a);
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"object",
|
||||||
|
"function",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ lambda_name_mangle: {
|
|||||||
|
|
||||||
lambda_name_mangle_ie8: {
|
lambda_name_mangle_ie8: {
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -95,7 +95,7 @@ function_name_mangle_ie8: {
|
|||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ pause_resume: {
|
|||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
arrow_yield: {
|
arrow_yield_1: {
|
||||||
input: {
|
input: {
|
||||||
yield = "PASS";
|
yield = "PASS";
|
||||||
console.log(function*() {
|
console.log(function*() {
|
||||||
@@ -108,6 +108,18 @@ arrow_yield: {
|
|||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
arrow_yield_2: {
|
||||||
|
input: {
|
||||||
|
console.log(typeof function *() {
|
||||||
|
// Syntax error on Node.js v6+
|
||||||
|
return (yield) => {};
|
||||||
|
}().next().value);
|
||||||
|
}
|
||||||
|
expect_exact: "console.log(typeof function*(){return(yield)=>{}}().next().value);"
|
||||||
|
expect_stdout: "function"
|
||||||
|
node_version: "4"
|
||||||
|
}
|
||||||
|
|
||||||
for_of: {
|
for_of: {
|
||||||
input: {
|
input: {
|
||||||
function* f() {
|
function* f() {
|
||||||
@@ -150,6 +162,27 @@ for_await_of: {
|
|||||||
node_version: ">=10"
|
node_version: ">=10"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
comment_newline: {
|
||||||
|
beautify = {
|
||||||
|
comments: "all",
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function*() {
|
||||||
|
yield (
|
||||||
|
/* */
|
||||||
|
"PASS"
|
||||||
|
);
|
||||||
|
}().next().value);
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"console.log(function*(){",
|
||||||
|
"/* */",
|
||||||
|
'yield"PASS"}().next().value);',
|
||||||
|
]
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
collapse_vars_1: {
|
collapse_vars_1: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
@@ -247,6 +280,30 @@ collapse_vars_4: {
|
|||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
collapse_vars_5: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = function* f(b, c) {
|
||||||
|
b = yield c = b;
|
||||||
|
console.log(c);
|
||||||
|
}("PASS");
|
||||||
|
a.next();
|
||||||
|
a.next("FAIL");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = function* f(b, c) {
|
||||||
|
b = yield c = b;
|
||||||
|
console.log(c);
|
||||||
|
}("PASS");
|
||||||
|
a.next();
|
||||||
|
a.next("FAIL");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
collapse_property_lambda: {
|
collapse_property_lambda: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
@@ -388,14 +445,14 @@ functions: {
|
|||||||
function* b() {
|
function* b() {
|
||||||
return !!b;
|
return !!b;
|
||||||
}
|
}
|
||||||
var c = function*(c) {
|
function* c(c) {
|
||||||
return c;
|
return c;
|
||||||
};
|
}
|
||||||
if (yield* c(yield* b(yield* a()))) {
|
if (yield* c(yield* b(yield* a()))) {
|
||||||
function* d() {}
|
var d = function*() {};
|
||||||
function* e() {
|
var e = function* y() {
|
||||||
return typeof e;
|
return typeof y;
|
||||||
}
|
};
|
||||||
var f = function*(f) {
|
var f = function*(f) {
|
||||||
return f;
|
return f;
|
||||||
};
|
};
|
||||||
@@ -446,9 +503,9 @@ functions_use_strict: {
|
|||||||
function* b() {
|
function* b() {
|
||||||
return !!b;
|
return !!b;
|
||||||
}
|
}
|
||||||
var c = function*(c) {
|
function* c(c) {
|
||||||
return c;
|
return c;
|
||||||
};
|
}
|
||||||
if (yield* c(yield* b(yield* a()))) {
|
if (yield* c(yield* b(yield* a()))) {
|
||||||
var d = function*() {};
|
var d = function*() {};
|
||||||
var e = function* y() {
|
var e = function* y() {
|
||||||
@@ -465,6 +522,54 @@ functions_use_strict: {
|
|||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
functions_anonymous: {
|
||||||
|
options = {
|
||||||
|
functions: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var yield = function*() {
|
||||||
|
return "PASS";
|
||||||
|
};
|
||||||
|
console.log(yield().next(yield).value);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function* yield() {
|
||||||
|
return "PASS";
|
||||||
|
}
|
||||||
|
console.log(yield().next(yield).value);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
functions_inner_var: {
|
||||||
|
options = {
|
||||||
|
functions: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var yield = function* a() {
|
||||||
|
var a;
|
||||||
|
console.log(a, a);
|
||||||
|
};
|
||||||
|
yield().next(yield);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function* yield() {
|
||||||
|
var a;
|
||||||
|
console.log(a, a);
|
||||||
|
}
|
||||||
|
yield().next(yield);
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined undefined"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
negate_iife: {
|
negate_iife: {
|
||||||
options = {
|
options = {
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
@@ -644,7 +749,7 @@ lift_sequence: {
|
|||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
inline_nested_yield: {
|
inline_nested: {
|
||||||
options = {
|
options = {
|
||||||
inline: true,
|
inline: true,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
@@ -679,6 +784,118 @@ inline_nested_yield: {
|
|||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline_nested_async: {
|
||||||
|
options = {
|
||||||
|
awaits: true,
|
||||||
|
inline: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
yields: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log("foo");
|
||||||
|
var a = async function*() {
|
||||||
|
console.log(await(yield* async function*() {
|
||||||
|
yield {
|
||||||
|
then: r => r("bar"),
|
||||||
|
};
|
||||||
|
return "baz";
|
||||||
|
}()));
|
||||||
|
}();
|
||||||
|
console.log("moo");
|
||||||
|
a.next().then(function f(b) {
|
||||||
|
console.log(b.value);
|
||||||
|
b.done || a.next().then(f);
|
||||||
|
});
|
||||||
|
console.log("moz");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("foo");
|
||||||
|
var a = async function*() {
|
||||||
|
console.log((yield {
|
||||||
|
then: r => r("bar"),
|
||||||
|
}, await "baz"));
|
||||||
|
}();
|
||||||
|
console.log("moo"),
|
||||||
|
a.next().then(function f(b) {
|
||||||
|
console.log(b.value),
|
||||||
|
b.done || a.next().then(f);
|
||||||
|
}),
|
||||||
|
console.log("moz");
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"moo",
|
||||||
|
"moz",
|
||||||
|
"bar",
|
||||||
|
"baz",
|
||||||
|
"undefined",
|
||||||
|
]
|
||||||
|
node_version: ">=10"
|
||||||
|
}
|
||||||
|
|
||||||
|
inline_nested_block: {
|
||||||
|
options = {
|
||||||
|
if_return: true,
|
||||||
|
inline: true,
|
||||||
|
yields: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = function*() {
|
||||||
|
yield* function*() {
|
||||||
|
for (var a of [ "foo", "bar" ])
|
||||||
|
yield a;
|
||||||
|
return "FAIL";
|
||||||
|
}();
|
||||||
|
}(), b;
|
||||||
|
do {
|
||||||
|
b = a.next();
|
||||||
|
console.log(b.value);
|
||||||
|
} while (!b.done);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = function*() {
|
||||||
|
for (var a of [ "foo", "bar" ])
|
||||||
|
yield a;
|
||||||
|
"FAIL";
|
||||||
|
}(), b;
|
||||||
|
do {
|
||||||
|
b = a.next();
|
||||||
|
console.log(b.value);
|
||||||
|
} while (!b.done);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
"undefined",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
dont_inline_nested: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var yield = "PASS";
|
||||||
|
(function*() {
|
||||||
|
(function() {
|
||||||
|
console.log(yield);
|
||||||
|
})();
|
||||||
|
})().next();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var yield = "PASS";
|
||||||
|
(function*() {
|
||||||
|
(function() {
|
||||||
|
console.log(yield);
|
||||||
|
})();
|
||||||
|
})().next();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
drop_body: {
|
drop_body: {
|
||||||
options = {
|
options = {
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
@@ -759,10 +976,10 @@ issue_4454_2: {
|
|||||||
f("PASS");
|
f("PASS");
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function f(b) {
|
function f(a) {
|
||||||
(function*(c = console.log(b)) {})();
|
(function*(c = console.log(a)) {})();
|
||||||
var b = 42..toString();
|
var a = 42..toString();
|
||||||
console.log(b);
|
console.log(a);
|
||||||
}
|
}
|
||||||
f("PASS");
|
f("PASS");
|
||||||
}
|
}
|
||||||
@@ -865,7 +1082,7 @@ issue_4639_1: {
|
|||||||
}().next().value());
|
}().next().value());
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=4"
|
node_version: ">=4 <7 || >=8.7.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_4639_2: {
|
issue_4639_2: {
|
||||||
@@ -950,3 +1167,361 @@ issue_4641_2: {
|
|||||||
]
|
]
|
||||||
node_version: ">=10"
|
node_version: ">=10"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4769_1: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function*() {
|
||||||
|
(function({} = yield => {}) {})();
|
||||||
|
}().next().done);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function*() {
|
||||||
|
(function({} = yield => {}) {})();
|
||||||
|
}().next().done);
|
||||||
|
}
|
||||||
|
expect_stdout: "true"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4769_2: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function*() {
|
||||||
|
return function({} = yield => {}) {
|
||||||
|
return "PASS";
|
||||||
|
}();
|
||||||
|
}().next().value);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function*() {
|
||||||
|
return function({} = yield => {}) {
|
||||||
|
return "PASS";
|
||||||
|
}();
|
||||||
|
}().next().value);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5019_1: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a) {
|
||||||
|
return a = function*() {
|
||||||
|
console.log(typeof a);
|
||||||
|
}();
|
||||||
|
})().next();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(a) {
|
||||||
|
return a = function*() {
|
||||||
|
console.log(typeof a);
|
||||||
|
}();
|
||||||
|
})().next();
|
||||||
|
}
|
||||||
|
expect_stdout: "object"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5019_2: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = [];
|
||||||
|
for (var b in "foo")
|
||||||
|
a.push(function(c) {
|
||||||
|
return function*() {
|
||||||
|
console.log(c);
|
||||||
|
}();
|
||||||
|
}(b));
|
||||||
|
a.map(function(d) {
|
||||||
|
return d.next();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = [];
|
||||||
|
for (var b in "foo")
|
||||||
|
a.push(function(c) {
|
||||||
|
return function*() {
|
||||||
|
console.log(c);
|
||||||
|
}();
|
||||||
|
}(b));
|
||||||
|
a.map(function(d) {
|
||||||
|
return d.next();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"0",
|
||||||
|
"1",
|
||||||
|
"2",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5032_normal: {
|
||||||
|
options = {
|
||||||
|
merge_vars: true,
|
||||||
|
webkit: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function log(value) {
|
||||||
|
console.log(value);
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
function *f(a) {
|
||||||
|
var b = log(a), c = b;
|
||||||
|
log(b);
|
||||||
|
log(c);
|
||||||
|
}
|
||||||
|
f("PASS").next();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function log(value) {
|
||||||
|
console.log(value);
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
function *f(a) {
|
||||||
|
var a = log(a), c = a;
|
||||||
|
log(a);
|
||||||
|
log(c);
|
||||||
|
}
|
||||||
|
f("PASS").next();
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"PASS",
|
||||||
|
"PASS",
|
||||||
|
"PASS",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5032_webkit: {
|
||||||
|
options = {
|
||||||
|
merge_vars: true,
|
||||||
|
webkit: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function log(value) {
|
||||||
|
console.log(value);
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
function *f(a) {
|
||||||
|
var b = log(a), c = b;
|
||||||
|
log(b);
|
||||||
|
log(c);
|
||||||
|
}
|
||||||
|
f("PASS").next();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function log(value) {
|
||||||
|
console.log(value);
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
function *f(a) {
|
||||||
|
var b = log(a), c = b;
|
||||||
|
log(b);
|
||||||
|
log(c);
|
||||||
|
}
|
||||||
|
f("PASS").next();
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"PASS",
|
||||||
|
"PASS",
|
||||||
|
"PASS",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5034: {
|
||||||
|
options = {
|
||||||
|
functions: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
var yield = function f() {
|
||||||
|
return function*() {
|
||||||
|
return f;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
return yield()().next().value === yield;
|
||||||
|
}() ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function() {
|
||||||
|
var yield = function f() {
|
||||||
|
return function*() {
|
||||||
|
return f;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
return yield()().next().value === yield;
|
||||||
|
}() ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5076_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
pure_getters: "strict",
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
yields: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
console.log("PASS");
|
||||||
|
var b = function*({
|
||||||
|
p: {},
|
||||||
|
}) {}({
|
||||||
|
p: { a } = 42,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
console.log("PASS"),
|
||||||
|
a = 42["a"];
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5076_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
passes: 2,
|
||||||
|
pure_getters: "strict",
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
yields: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
console.log("PASS");
|
||||||
|
var b = function*({
|
||||||
|
p: {},
|
||||||
|
}) {}({
|
||||||
|
p: { a } = 42,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5177: {
|
||||||
|
options = {
|
||||||
|
properties: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(typeof function*() {
|
||||||
|
return {
|
||||||
|
p(yield) {},
|
||||||
|
}.p;
|
||||||
|
}().next().value);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(typeof function*() {
|
||||||
|
return {
|
||||||
|
p(yield) {},
|
||||||
|
}.p;
|
||||||
|
}().next().value);
|
||||||
|
}
|
||||||
|
expect_stdout: "function"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5385_1: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(async function*() {
|
||||||
|
(function() {
|
||||||
|
try {
|
||||||
|
return console.log("foo");
|
||||||
|
} finally {
|
||||||
|
return console.log("bar");
|
||||||
|
}
|
||||||
|
console.log("baz");
|
||||||
|
})();
|
||||||
|
})().next();
|
||||||
|
console.log("moo");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(async function*() {
|
||||||
|
(function() {
|
||||||
|
try {
|
||||||
|
return console.log("foo");
|
||||||
|
} finally {
|
||||||
|
return console.log("bar");
|
||||||
|
}
|
||||||
|
console.log("baz");
|
||||||
|
})();
|
||||||
|
})().next();
|
||||||
|
console.log("moo");
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
"moo",
|
||||||
|
]
|
||||||
|
node_version: ">=10"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5385_2: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(async function*() {
|
||||||
|
return function() {
|
||||||
|
try {
|
||||||
|
return console.log("foo");
|
||||||
|
} finally {
|
||||||
|
return console.log("bar");
|
||||||
|
}
|
||||||
|
}();
|
||||||
|
})().next();
|
||||||
|
console.log("moo");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(async function*() {
|
||||||
|
return function() {
|
||||||
|
try {
|
||||||
|
return console.log("foo");
|
||||||
|
} finally {
|
||||||
|
return console.log("bar");
|
||||||
|
}
|
||||||
|
}();
|
||||||
|
})().next();
|
||||||
|
console.log("moo");
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
"moo",
|
||||||
|
]
|
||||||
|
node_version: ">=10"
|
||||||
|
}
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
++null
|
console.log(4 || (null = 4));
|
||||||
|
|||||||
1
test/input/invalid/assign_5.js
Normal file
1
test/input/invalid/assign_5.js
Normal file
@@ -0,0 +1 @@
|
|||||||
|
console.log(5 || ([]?.length ^= 5));
|
||||||
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););
|
||||||
1
test/input/invalid/optional-template.js
Normal file
1
test/input/invalid/optional-template.js
Normal file
@@ -0,0 +1 @@
|
|||||||
|
console?.log``;
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
{
|
{
|
||||||
"version": 3,
|
"version": 3,
|
||||||
"sources": [
|
"sources": [
|
||||||
"input.js"
|
"input.js"
|
||||||
],
|
],
|
||||||
"names": [],
|
"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",
|
"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": [
|
"sourcesContent": [
|
||||||
"const {foo} = require(\"bar\");\nconst {hello} = require(\"world\");\n\nfoo.x(...foo.y(hello.z));\n"
|
"const {foo} = require(\"bar\");\nconst {hello} = require(\"world\");\n\nfoo.x(...foo.y(hello.z));\n"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"compress": false,
|
"compress": false,
|
||||||
"mangle": {
|
"mangle": {
|
||||||
"properties": {
|
"properties": {
|
||||||
"regex": "/^_/"
|
"regex": "/^_/"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
function test(a){
|
function test(a){
|
||||||
"aaaaaaaaaaaaaaaa"
|
"aaaaaaaaaaaaaaaa";
|
||||||
;a(err,data),a(err,
|
a(err,data),a(err,
|
||||||
data)}
|
data)}
|
||||||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIjAiXSwibmFtZXMiOlsidGVzdCIsImNhbGxiYWNrIiwiZXJyIiwiZGF0YSJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsS0FBS0M7O0NBRVZBLEVBQVNDLElBQUtDLE1BQ2RGLEVBQVNDO0FBQUtDIn0=
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIjAiXSwibmFtZXMiOlsidGVzdCIsImNhbGxiYWNrIiwiZXJyIiwiZGF0YSJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0E7SEFBS0M7QUFFVkE7aEJBQVNDLElBQUtDLE1BQ2RGLEVBQVNDLElBQUtDIn0=
|
||||||
@@ -1,7 +1,5 @@
|
|||||||
// (beautified)
|
// (beautified)
|
||||||
console.log(function() {
|
console.log(1 + .1 + .1);
|
||||||
return 1 + .1 + .1;
|
|
||||||
}());
|
|
||||||
// output: 1.2000000000000002
|
// output: 1.2000000000000002
|
||||||
//
|
//
|
||||||
// minify: 1.2
|
// minify: 1.2
|
||||||
|
|||||||
17
test/input/reduce/export_default.js
Normal file
17
test/input/reduce/export_default.js
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
var unused;
|
||||||
|
export default class {
|
||||||
|
____11111() {
|
||||||
|
a, b, c, d, e;
|
||||||
|
f, g, h, i, j;
|
||||||
|
k, l, m, n, o;
|
||||||
|
p, q, r, s, t;
|
||||||
|
u, v, w, x, y, z;
|
||||||
|
A, B, C, D, E;
|
||||||
|
F, G, H, I, J;
|
||||||
|
K, L, M, N, O;
|
||||||
|
P, Q, R, S, T;
|
||||||
|
U, V, W, X, Y, Z;
|
||||||
|
$, _;
|
||||||
|
unused;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -58,22 +58,31 @@ if (typeof phantom == "undefined") {
|
|||||||
}).listen();
|
}).listen();
|
||||||
server.on("listening", function() {
|
server.on("listening", function() {
|
||||||
var port = server.address().port;
|
var port = server.address().port;
|
||||||
if (debug) {
|
if (debug) return console.log("http://localhost:" + port + "/");
|
||||||
console.log("http://localhost:" + port + "/");
|
var cmd = process.platform == "win32" ? "npm.cmd" : "npm";
|
||||||
} else (function install() {
|
|
||||||
child_process.spawn(process.platform == "win32" ? "npm.cmd" : "npm", [
|
function npm(args, done) {
|
||||||
|
child_process.spawn(cmd, args, { stdio: [ "ignore", 1, 2 ] }).on("exit", done);
|
||||||
|
}
|
||||||
|
|
||||||
|
(function install() {
|
||||||
|
npm([
|
||||||
"install",
|
"install",
|
||||||
|
"graceful-fs@4.2.6",
|
||||||
|
"is-my-json-valid@2.20.5",
|
||||||
"phantomjs-prebuilt@2.1.14",
|
"phantomjs-prebuilt@2.1.14",
|
||||||
"--no-audit",
|
"--no-audit",
|
||||||
"--no-optional",
|
"--no-optional",
|
||||||
"--no-save",
|
"--no-save",
|
||||||
"--no-update-notifier",
|
"--no-update-notifier",
|
||||||
], {
|
], function(code) {
|
||||||
stdio: [ "ignore", 1, 2 ]
|
|
||||||
}).on("exit", function(code) {
|
|
||||||
if (code) {
|
if (code) {
|
||||||
console.log("npm install failed with code", code);
|
console.log("npm install failed with code", code);
|
||||||
return install();
|
return npm([
|
||||||
|
"cache",
|
||||||
|
"clean",
|
||||||
|
"--force",
|
||||||
|
], install);
|
||||||
}
|
}
|
||||||
var program = require("phantomjs-prebuilt").exec(process.argv[1], port);
|
var program = require("phantomjs-prebuilt").exec(process.argv[1], port);
|
||||||
program.stdout.pipe(process.stdout);
|
program.stdout.pipe(process.stdout);
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ describe("async", function() {
|
|||||||
"function await() {}",
|
"function await() {}",
|
||||||
"function(await) {}",
|
"function(await) {}",
|
||||||
"function() { await; }",
|
"function() { await; }",
|
||||||
"function() { await:{} }",
|
"function() { await: {} }",
|
||||||
"function() { var await; }",
|
"function() { var await; }",
|
||||||
"function() { function await() {} }",
|
"function() { function await() {} }",
|
||||||
"function() { try {} catch (await) {} }",
|
"function() { try {} catch (await) {} }",
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user