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) {
|
||||||
|
|||||||
225
lib/ast.js
225
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.SELF_PROPS = self_props;
|
|
||||||
ctor.SUBCLASSES = [];
|
|
||||||
if (type) {
|
|
||||||
ctor.prototype.TYPE = ctor.TYPE = type;
|
ctor.prototype.TYPE = ctor.TYPE = type;
|
||||||
}
|
if (base) {
|
||||||
if (methods) for (var name in methods) if (HOP(methods, name)) {
|
ctor.BASE = base;
|
||||||
if (/^\$/.test(name)) {
|
base.SUBCLASSES.push(ctor);
|
||||||
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
if (parent instanceof AST_Conditional) {
|
||||||
|
if (parent.condition === self) return true;
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
} else {
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|||||||
6185
lib/compress.js
6185
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,7 +47,6 @@ 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] = {};
|
||||||
@@ -55,7 +54,6 @@ function set_shorthand(name, options, keys) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
function init_cache(cache) {
|
function init_cache(cache) {
|
||||||
if (!cache) return;
|
if (!cache) return;
|
||||||
@@ -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*$/, "");
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
615
lib/output.js
615
lib/output.js
File diff suppressed because it is too large
Load Diff
284
lib/parse.js
284
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",
|
} else {
|
||||||
start: start,
|
var exp = expr_atom(false), args;
|
||||||
end: prev(),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
var newexp = expr_atom(false), args;
|
|
||||||
if (is("punc", "(")) {
|
if (is("punc", "(")) {
|
||||||
next();
|
next();
|
||||||
args = expr_list(")", !options.strict);
|
args = expr_list(")", !options.strict);
|
||||||
} else {
|
} else {
|
||||||
args = [];
|
args = [];
|
||||||
}
|
}
|
||||||
var call = new AST_New({
|
call = new AST_New({ expression: exp, args: args });
|
||||||
start : start,
|
}
|
||||||
expression : newexp,
|
call.start = start;
|
||||||
args : args,
|
call.end = prev();
|
||||||
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)) {
|
||||||
|
ret = new AST_Number({ value: value });
|
||||||
|
} else {
|
||||||
|
ret = new AST_Infinity();
|
||||||
|
if (value < 0) ret = new AST_UnaryPrefix({ operator: "-", expression: ret });
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case "bigint":
|
case "bigint":
|
||||||
ret = new AST_BigInt({ start: tok, end: tok, value: tok.value });
|
ret = new AST_BigInt({ value: value });
|
||||||
break;
|
break;
|
||||||
case "string":
|
case "string":
|
||||||
ret = new AST_String({
|
ret = new AST_String({ value : value, quote : tok.quote });
|
||||||
start : tok,
|
|
||||||
end : tok,
|
|
||||||
value : tok.value,
|
|
||||||
quote : tok.quote
|
|
||||||
});
|
|
||||||
break;
|
break;
|
||||||
case "regexp":
|
case "regexp":
|
||||||
ret = new AST_RegExp({ start: tok, end: tok, value: tok.value });
|
ret = new AST_RegExp({ value: value });
|
||||||
break;
|
break;
|
||||||
case "atom":
|
case "atom":
|
||||||
switch (tok.value) {
|
switch (value) {
|
||||||
case "false":
|
case "false":
|
||||||
ret = new AST_False({ start: tok, end: tok });
|
ret = new AST_False();
|
||||||
break;
|
break;
|
||||||
case "true":
|
case "true":
|
||||||
ret = new AST_True({ start: tok, end: tok });
|
ret = new AST_True();
|
||||||
break;
|
break;
|
||||||
case "null":
|
case "null":
|
||||||
ret = new AST_Null({ start: tok, end: tok });
|
ret = new AST_Null();
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
unexpected();
|
||||||
}
|
}
|
||||||
break;
|
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;
|
||||||
|
while (true) {
|
||||||
|
if (is("operator", "?") && is_token(peek(), "punc", ".")) {
|
||||||
next();
|
next();
|
||||||
return subscripts(new AST_Dot({
|
next();
|
||||||
start : start,
|
optional = expr;
|
||||||
expression : expr,
|
|
||||||
property : as_name(),
|
|
||||||
end : prev()
|
|
||||||
}), allow_calls);
|
|
||||||
}
|
}
|
||||||
if (is("punc", "[")) {
|
if (is("punc", "[")) {
|
||||||
next();
|
next();
|
||||||
var prop = expression();
|
var prop = expression();
|
||||||
expect("]");
|
expect("]");
|
||||||
return subscripts(new AST_Sub({
|
expr = new AST_Sub({
|
||||||
start: start,
|
start: start,
|
||||||
|
optional: optional === expr,
|
||||||
expression: expr,
|
expression: expr,
|
||||||
property: prop,
|
property: prop,
|
||||||
end : prev()
|
end: prev(),
|
||||||
}), allow_calls);
|
});
|
||||||
}
|
} else if (allow_calls && is("punc", "(")) {
|
||||||
if (allow_calls && is("punc", "(")) {
|
|
||||||
next();
|
next();
|
||||||
var call = new AST_Call({
|
expr = new AST_Call({
|
||||||
start: start,
|
start: start,
|
||||||
|
optional: optional === expr,
|
||||||
expression: expr,
|
expression: expr,
|
||||||
args: expr_list(")", !options.strict),
|
args: expr_list(")", !options.strict),
|
||||||
end : prev()
|
end: prev(),
|
||||||
});
|
});
|
||||||
mark_pure(call);
|
} else if (optional === expr || is("punc", ".")) {
|
||||||
return subscripts(call, true);
|
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 (optional) expr.terminal = true;
|
||||||
|
if (expr instanceof AST_Call && !expr.pure) {
|
||||||
|
var start = expr.start;
|
||||||
|
var comments = start.comments_before;
|
||||||
|
var i = HOP(start, "comments_before_length") ? start.comments_before_length : comments.length;
|
||||||
|
while (--i >= 0) {
|
||||||
|
if (/[@#]__PURE__/.test(comments[i].value)) {
|
||||||
|
expr.pure = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
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;
|
||||||
|
|||||||
191
lib/scope.js
191
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() {})();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -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,11 +3108,34 @@ 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}) + "";
|
|
||||||
var e = (({valueOf: 0}) + "")[2];
|
|
||||||
var f = (({toString: 0}) + "")[2];
|
|
||||||
var g = 0();
|
|
||||||
var h = 0();
|
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
console.log(({ valueOf: v }) < 1);
|
||||||
|
console.log(({ valueOf: v }) + "");
|
||||||
|
console.log((( {valueOf: v }) + "")[2]);
|
||||||
|
console.log(({ valueOf: v }).valueOf());
|
||||||
|
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: [
|
||||||
|
"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"
|
||||||
|
}
|
||||||
@@ -5,9 +5,8 @@ multiple_functions: {
|
|||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
(function() {
|
(function() {
|
||||||
if ( !window ) {
|
if (!window)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
function f() {}
|
function f() {}
|
||||||
function g() {}
|
function g() {}
|
||||||
})();
|
})();
|
||||||
@@ -30,9 +29,8 @@ single_function: {
|
|||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
(function() {
|
(function() {
|
||||||
if ( !window ) {
|
if (!window)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
function f() {}
|
function f() {}
|
||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
@@ -51,14 +49,12 @@ deeply_nested: {
|
|||||||
}
|
}
|
||||||
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() {}
|
||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
@@ -66,8 +62,8 @@ deeply_nested: {
|
|||||||
(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() {}
|
||||||
@@ -82,16 +78,16 @@ not_hoisted_when_already_nested: {
|
|||||||
}
|
}
|
||||||
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() {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,18 +17,15 @@ 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();
|
||||||
@@ -39,7 +36,7 @@ issue979_reported: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
issue979_test_negated_is_best: {
|
test_negated_is_best: {
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
booleans: true,
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
@@ -58,38 +55,30 @@ 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();
|
||||||
@@ -101,10 +90,12 @@ issue979_test_negated_is_best: {
|
|||||||
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: {
|
||||||
@@ -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"
|
||||||
|
}
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
return t;
|
||||||
|
})() ? console.log(true) : console.log(false);
|
||||||
(function() {
|
(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,7 +204,9 @@ 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);
|
||||||
@@ -186,7 +216,37 @@ negate_iife_5: {
|
|||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
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"
|
||||||
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}(), c = "PASS", b) while ("" == typeof d);
|
if (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: {
|
||||||
@@ -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"
|
||||||
@@ -784,3 +969,397 @@ issue_4666: {
|
|||||||
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;
|
||||||
a && a.p;
|
if (a && a.p, 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"
|
||||||
@@ -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;
|
||||||
}(), c = "PASS", b; "" == typeof d;);
|
for (c = "PASS"; "" == 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"
|
||||||
@@ -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"
|
||||||
|
}
|
||||||
|
|||||||
@@ -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()))) {
|
|
||||||
function* d() {}
|
|
||||||
function* e() {
|
|
||||||
return typeof e;
|
|
||||||
}
|
}
|
||||||
|
if (yield* c(yield* b(yield* a()))) {
|
||||||
|
var d = function*() {};
|
||||||
|
var e = function* y() {
|
||||||
|
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,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);
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ var assert = require("assert");
|
|||||||
var exec = require("child_process").exec;
|
var exec = require("child_process").exec;
|
||||||
var fs = require("fs");
|
var fs = require("fs");
|
||||||
var run_code = require("../sandbox").run_code;
|
var run_code = require("../sandbox").run_code;
|
||||||
|
var semver = require("semver");
|
||||||
var to_ascii = require("../node").to_ascii;
|
var to_ascii = require("../node").to_ascii;
|
||||||
|
|
||||||
function read(path) {
|
function read(path) {
|
||||||
@@ -12,10 +13,13 @@ describe("bin/uglifyjs", function() {
|
|||||||
var uglifyjscmd = '"' + process.argv[0] + '" bin/uglifyjs';
|
var uglifyjscmd = '"' + process.argv[0] + '" bin/uglifyjs';
|
||||||
it("Should produce a functional build when using --self", function(done) {
|
it("Should produce a functional build when using --self", function(done) {
|
||||||
this.timeout(30000);
|
this.timeout(30000);
|
||||||
var command = uglifyjscmd + ' --self -cm --wrap WrappedUglifyJS';
|
var command = [
|
||||||
exec(command, {
|
uglifyjscmd,
|
||||||
maxBuffer: 1048576
|
"--self",
|
||||||
}, function(err, stdout) {
|
semver.satisfies(process.version, "<=0.12") ? "-mc hoist_funs" : "-mc",
|
||||||
|
"--wrap WrappedUglifyJS",
|
||||||
|
].join(" ");
|
||||||
|
exec(command, { maxBuffer: 1048576 }, function(err, stdout) {
|
||||||
if (err) throw err;
|
if (err) throw err;
|
||||||
eval(stdout);
|
eval(stdout);
|
||||||
assert.strictEqual(typeof WrappedUglifyJS, "object");
|
assert.strictEqual(typeof WrappedUglifyJS, "object");
|
||||||
@@ -29,7 +33,7 @@ describe("bin/uglifyjs", function() {
|
|||||||
var command = uglifyjscmd + ' test/input/comments/filter.js --comments all';
|
var command = uglifyjscmd + ' test/input/comments/filter.js --comments all';
|
||||||
exec(command, function(err, stdout) {
|
exec(command, function(err, stdout) {
|
||||||
if (err) throw err;
|
if (err) throw err;
|
||||||
assert.strictEqual(stdout, "// foo\n/*@preserve*/\n// bar\n\n");
|
assert.strictEqual(stdout, "// foo\n/*@preserve*/\n// bar\n");
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -37,7 +41,7 @@ describe("bin/uglifyjs", function() {
|
|||||||
var command = uglifyjscmd + ' test/input/comments/filter.js --comments /r/';
|
var command = uglifyjscmd + ' test/input/comments/filter.js --comments /r/';
|
||||||
exec(command, function(err, stdout) {
|
exec(command, function(err, stdout) {
|
||||||
if (err) throw err;
|
if (err) throw err;
|
||||||
assert.strictEqual(stdout, "/*@preserve*/\n// bar\n\n");
|
assert.strictEqual(stdout, "/*@preserve*/\n// bar\n");
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -45,7 +49,7 @@ describe("bin/uglifyjs", function() {
|
|||||||
var command = uglifyjscmd + ' test/input/comments/filter.js --comments';
|
var command = uglifyjscmd + ' test/input/comments/filter.js --comments';
|
||||||
exec(command, function(err, stdout) {
|
exec(command, function(err, stdout) {
|
||||||
if (err) throw err;
|
if (err) throw err;
|
||||||
assert.strictEqual(stdout, "/*@preserve*/\n\n");
|
assert.strictEqual(stdout, "/*@preserve*/\n");
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -184,6 +188,30 @@ describe("bin/uglifyjs", function() {
|
|||||||
child.stdin.end(read("test/input/issue-3040/input.js"));
|
child.stdin.end(read("test/input/issue-3040/input.js"));
|
||||||
}, 1000);
|
}, 1000);
|
||||||
});
|
});
|
||||||
|
it("Should work with --keep-fargs (mangle only)", function(done) {
|
||||||
|
var command = uglifyjscmd + ' test/input/issue-1431/sample.js --keep-fargs -m';
|
||||||
|
exec(command, function(err, stdout) {
|
||||||
|
if (err) throw err;
|
||||||
|
assert.strictEqual(stdout, "function f(x){return function(){function n(a){return a*a}return x(n)}}function g(op){return op(1)+op(2)}console.log(f(g)()==5);\n");
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it("Should work with --keep-fargs (mangle & compress)", function(done) {
|
||||||
|
var command = uglifyjscmd + ' test/input/issue-1431/sample.js --keep-fargs -m -c';
|
||||||
|
exec(command, function(err, stdout) {
|
||||||
|
if (err) throw err;
|
||||||
|
assert.strictEqual(stdout, "function f(x){return function(){return x(function(a){return a*a})}}function g(op){return op(1)+op(2)}console.log(5==f(g)());\n");
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it("Should work with keep_fargs under mangler options", function(done) {
|
||||||
|
var command = uglifyjscmd + ' test/input/issue-1431/sample.js -m keep_fargs=true';
|
||||||
|
exec(command, function(err, stdout) {
|
||||||
|
if (err) throw err;
|
||||||
|
assert.strictEqual(stdout, "function f(x){return function(){function n(a){return a*a}return x(n)}}function g(op){return op(1)+op(2)}console.log(f(g)()==5);\n");
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
it("Should work with --keep-fnames (mangle only)", function(done) {
|
it("Should work with --keep-fnames (mangle only)", function(done) {
|
||||||
var command = uglifyjscmd + ' test/input/issue-1431/sample.js --keep-fnames -m';
|
var command = uglifyjscmd + ' test/input/issue-1431/sample.js --keep-fnames -m';
|
||||||
exec(command, function(err, stdout) {
|
exec(command, function(err, stdout) {
|
||||||
@@ -193,10 +221,10 @@ describe("bin/uglifyjs", function() {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
it("Should work with --keep-fnames (mangle & compress)", function(done) {
|
it("Should work with --keep-fnames (mangle & compress)", function(done) {
|
||||||
var command = uglifyjscmd + ' test/input/issue-1431/sample.js --keep-fnames -m -c unused=false';
|
var command = uglifyjscmd + ' test/input/issue-1431/sample.js --keep-fnames -m -c';
|
||||||
exec(command, function(err, stdout) {
|
exec(command, function(err, stdout) {
|
||||||
if (err) throw err;
|
if (err) throw err;
|
||||||
assert.strictEqual(stdout, "function f(r){return function(){function n(n){return n*n}return r(n)}}function g(n){return n(1)+n(2)}console.log(5==f(g)());\n");
|
assert.strictEqual(stdout, "function f(n){return function(){return n(function n(r){return r*r})}}function g(n){return n(1)+n(2)}console.log(5==f(g)());\n");
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -427,16 +455,30 @@ describe("bin/uglifyjs", function() {
|
|||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it("Should throw syntax error (++null)", function(done) {
|
it("Should throw syntax error (null = 4)", function(done) {
|
||||||
var command = uglifyjscmd + " test/input/invalid/assign_4.js";
|
var command = uglifyjscmd + " test/input/invalid/assign_4.js";
|
||||||
exec(command, function(err, stdout, stderr) {
|
exec(command, function(err, stdout, stderr) {
|
||||||
assert.ok(err);
|
assert.ok(err);
|
||||||
assert.strictEqual(stdout, "");
|
assert.strictEqual(stdout, "");
|
||||||
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
||||||
"Parse error at test/input/invalid/assign_4.js:1,0",
|
"Parse error at test/input/invalid/assign_4.js:1,23",
|
||||||
"++null",
|
"console.log(4 || (null = 4));",
|
||||||
" ^",
|
" ^",
|
||||||
"ERROR: Invalid use of ++ operator",
|
"ERROR: Invalid assignment",
|
||||||
|
].join("\n"));
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it("Should throw syntax error ([]?.length ^= 5)", function(done) {
|
||||||
|
var command = uglifyjscmd + " test/input/invalid/assign_5.js";
|
||||||
|
exec(command, function(err, stdout, stderr) {
|
||||||
|
assert.ok(err);
|
||||||
|
assert.strictEqual(stdout, "");
|
||||||
|
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
||||||
|
"Parse error at test/input/invalid/assign_5.js:1,29",
|
||||||
|
"console.log(5 || ([]?.length ^= 5));",
|
||||||
|
" ^",
|
||||||
|
"ERROR: Invalid assignment",
|
||||||
].join("\n"));
|
].join("\n"));
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
@@ -679,6 +721,20 @@ describe("bin/uglifyjs", function() {
|
|||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
it("Should throw syntax error (for-await)", function(done) {
|
||||||
|
var command = uglifyjscmd + " test/input/invalid/for-await.js";
|
||||||
|
exec(command, function(err, stdout, stderr) {
|
||||||
|
assert.ok(err);
|
||||||
|
assert.strictEqual(stdout, "");
|
||||||
|
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
||||||
|
"Parse error at test/input/invalid/for-await.js:1,11",
|
||||||
|
"for await (; console.log(42););",
|
||||||
|
" ^",
|
||||||
|
"ERROR: Unexpected token: punc «;»",
|
||||||
|
].join("\n"));
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
it("Should throw syntax error (switch defaults)", function(done) {
|
it("Should throw syntax error (switch defaults)", function(done) {
|
||||||
var command = uglifyjscmd + " test/input/invalid/switch.js";
|
var command = uglifyjscmd + " test/input/invalid/switch.js";
|
||||||
exec(command, function(err, stdout, stderr) {
|
exec(command, function(err, stdout, stderr) {
|
||||||
@@ -693,6 +749,20 @@ describe("bin/uglifyjs", function() {
|
|||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
it("Should throw syntax error (console?.log``)", function(done) {
|
||||||
|
var command = uglifyjscmd + " test/input/invalid/optional-template.js";
|
||||||
|
exec(command, function(err, stdout, stderr) {
|
||||||
|
assert.ok(err);
|
||||||
|
assert.strictEqual(stdout, "");
|
||||||
|
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
||||||
|
"Parse error at test/input/invalid/optional-template.js:1,12",
|
||||||
|
"console?.log``;",
|
||||||
|
" ^",
|
||||||
|
"ERROR: Invalid template on optional chain",
|
||||||
|
].join("\n"));
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
it("Should handle literal string as source map input", function(done) {
|
it("Should handle literal string as source map input", function(done) {
|
||||||
var command = [
|
var command = [
|
||||||
uglifyjscmd,
|
uglifyjscmd,
|
||||||
|
|||||||
@@ -191,7 +191,7 @@ describe("comments", function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("Should correctly preserve new lines around comments", function() {
|
it("Should correctly preserve new lines around comments", function() {
|
||||||
var tests = [
|
[
|
||||||
[
|
[
|
||||||
"// foo",
|
"// foo",
|
||||||
"// bar",
|
"// bar",
|
||||||
@@ -392,12 +392,12 @@ describe("comments", function() {
|
|||||||
describe("comment filters", function() {
|
describe("comment filters", function() {
|
||||||
it("Should be able to filter comments by passing regexp", function() {
|
it("Should be able to filter comments by passing regexp", function() {
|
||||||
var ast = UglifyJS.parse("/*!test1*/\n/*test2*/\n//!test3\n//test4\n<!--test5\n<!--!test6\n-->test7\n-->!test8");
|
var ast = UglifyJS.parse("/*!test1*/\n/*test2*/\n//!test3\n//test4\n<!--test5\n<!--!test6\n-->test7\n-->!test8");
|
||||||
assert.strictEqual(ast.print_to_string({comments: /^!/}), "/*!test1*/\n//!test3\n//!test6\n//!test8\n");
|
assert.strictEqual(ast.print_to_string({comments: /^!/}), "/*!test1*/\n//!test3\n//!test6\n//!test8");
|
||||||
});
|
});
|
||||||
|
|
||||||
it("Should be able to filter comments with the 'all' option", function() {
|
it("Should be able to filter comments with the 'all' option", function() {
|
||||||
var ast = UglifyJS.parse("/*!test1*/\n/*test2*/\n//!test3\n//test4\n<!--test5\n<!--!test6\n-->test7\n-->!test8");
|
var ast = UglifyJS.parse("/*!test1*/\n/*test2*/\n//!test3\n//test4\n<!--test5\n<!--!test6\n-->test7\n-->!test8");
|
||||||
assert.strictEqual(ast.print_to_string({comments: "all"}), "/*!test1*/\n/*test2*/\n//!test3\n//test4\n//test5\n//!test6\n//test7\n//!test8\n");
|
assert.strictEqual(ast.print_to_string({comments: "all"}), "/*!test1*/\n/*test2*/\n//!test3\n//test4\n//test5\n//!test6\n//test7\n//!test8");
|
||||||
});
|
});
|
||||||
|
|
||||||
it("Should be able to filter commments with the 'some' option", function() {
|
it("Should be able to filter commments with the 'some' option", function() {
|
||||||
@@ -410,13 +410,12 @@ describe("comments", function() {
|
|||||||
var f = function(node, comment) {
|
var f = function(node, comment) {
|
||||||
return comment.value.length === 8;
|
return comment.value.length === 8;
|
||||||
};
|
};
|
||||||
|
assert.strictEqual(ast.print_to_string({comments: f}), "/*TEST 123*/\n//8 chars.");
|
||||||
assert.strictEqual(ast.print_to_string({comments: f}), "/*TEST 123*/\n//8 chars.\n");
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it("Should be able to filter comments by passing regex in string format", function() {
|
it("Should be able to filter comments by passing regex in string format", function() {
|
||||||
var ast = UglifyJS.parse("/*!test1*/\n/*test2*/\n//!test3\n//test4\n<!--test5\n<!--!test6\n-->test7\n-->!test8");
|
var ast = UglifyJS.parse("/*!test1*/\n/*test2*/\n//!test3\n//test4\n<!--test5\n<!--!test6\n-->test7\n-->!test8");
|
||||||
assert.strictEqual(ast.print_to_string({comments: "/^!/"}), "/*!test1*/\n//!test3\n//!test6\n//!test8\n");
|
assert.strictEqual(ast.print_to_string({comments: "/^!/"}), "/*!test1*/\n//!test3\n//!test6\n//!test8");
|
||||||
});
|
});
|
||||||
|
|
||||||
it("Should be able to get the comment and comment type when using a function", function() {
|
it("Should be able to get the comment and comment type when using a function", function() {
|
||||||
@@ -424,14 +423,12 @@ describe("comments", function() {
|
|||||||
var f = function(node, comment) {
|
var f = function(node, comment) {
|
||||||
return comment.type == "comment1" || comment.type == "comment3";
|
return comment.type == "comment1" || comment.type == "comment3";
|
||||||
};
|
};
|
||||||
|
assert.strictEqual(ast.print_to_string({comments: f}), "//!test3\n//test4\n//test5\n//!test6");
|
||||||
assert.strictEqual(ast.print_to_string({comments: f}), "//!test3\n//test4\n//test5\n//!test6\n");
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it("Should be able to filter comments by passing a boolean", function() {
|
it("Should be able to filter comments by passing a boolean", function() {
|
||||||
var ast = UglifyJS.parse("/*!test1*/\n/*test2*/\n//!test3\n//test4\n<!--test5\n<!--!test6\n-->test7\n-->!test8");
|
var ast = UglifyJS.parse("/*!test1*/\n/*test2*/\n//!test3\n//test4\n<!--test5\n<!--!test6\n-->test7\n-->!test8");
|
||||||
|
assert.strictEqual(ast.print_to_string({comments: true}), "/*!test1*/\n/*test2*/\n//!test3\n//test4\n//test5\n//!test6\n//test7\n//!test8");
|
||||||
assert.strictEqual(ast.print_to_string({comments: true}), "/*!test1*/\n/*test2*/\n//!test3\n//test4\n//test5\n//!test6\n//test7\n//!test8\n");
|
|
||||||
assert.strictEqual(ast.print_to_string({comments: false}), "");
|
assert.strictEqual(ast.print_to_string({comments: false}), "");
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -439,10 +436,8 @@ describe("comments", function() {
|
|||||||
var ast = UglifyJS.parse("#!Random comment\n//test1\n/*test2*/");
|
var ast = UglifyJS.parse("#!Random comment\n//test1\n/*test2*/");
|
||||||
var f = function(node, comment) {
|
var f = function(node, comment) {
|
||||||
assert.strictEqual(comment.type === "comment5", false);
|
assert.strictEqual(comment.type === "comment5", false);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
assert.strictEqual(ast.print_to_string({comments: f}), "#!Random comment\n//test1\n/*test2*/");
|
assert.strictEqual(ast.print_to_string({comments: f}), "#!Random comment\n//test1\n/*test2*/");
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -453,9 +448,8 @@ describe("comments", function() {
|
|||||||
|
|
||||||
it("Should have no problem on multiple calls", function() {
|
it("Should have no problem on multiple calls", function() {
|
||||||
const options = {
|
const options = {
|
||||||
comments: /ok/
|
comments: /ok/,
|
||||||
};
|
};
|
||||||
|
|
||||||
assert.strictEqual(UglifyJS.parse("/* ok */ function a(){}").print_to_string(options), "/* ok */function a(){}");
|
assert.strictEqual(UglifyJS.parse("/* ok */ function a(){}").print_to_string(options), "/* ok */function a(){}");
|
||||||
assert.strictEqual(UglifyJS.parse("/* ok */ function a(){}").print_to_string(options), "/* ok */function a(){}");
|
assert.strictEqual(UglifyJS.parse("/* ok */ function a(){}").print_to_string(options), "/* ok */function a(){}");
|
||||||
assert.strictEqual(UglifyJS.parse("/* ok */ function a(){}").print_to_string(options), "/* ok */function a(){}");
|
assert.strictEqual(UglifyJS.parse("/* ok */ function a(){}").print_to_string(options), "/* ok */function a(){}");
|
||||||
@@ -463,14 +457,14 @@ describe("comments", function() {
|
|||||||
|
|
||||||
it("Should handle shebang and preamble correctly", function() {
|
it("Should handle shebang and preamble correctly", function() {
|
||||||
var code = UglifyJS.minify("#!/usr/bin/node\nvar x = 10;", {
|
var code = UglifyJS.minify("#!/usr/bin/node\nvar x = 10;", {
|
||||||
output: { preamble: "/* Build */" }
|
output: { preamble: "/* Build */" },
|
||||||
}).code;
|
}).code;
|
||||||
assert.strictEqual(code, "#!/usr/bin/node\n/* Build */\nvar x=10;");
|
assert.strictEqual(code, "#!/usr/bin/node\n/* Build */\nvar x=10;");
|
||||||
});
|
});
|
||||||
|
|
||||||
it("Should handle preamble without shebang correctly", function() {
|
it("Should handle preamble without shebang correctly", function() {
|
||||||
var code = UglifyJS.minify("var x = 10;", {
|
var code = UglifyJS.minify("var x = 10;", {
|
||||||
output: { preamble: "/* Build */" }
|
output: { preamble: "/* Build */" },
|
||||||
}).code;
|
}).code;
|
||||||
assert.strictEqual(code, "/* Build */\nvar x=10;");
|
assert.strictEqual(code, "/* Build */\nvar x=10;");
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
var assert = require("assert");
|
var assert = require("assert");
|
||||||
var exec = require("child_process").exec;
|
var exec = require("child_process").exec;
|
||||||
var path = require("path");
|
var path = require("path");
|
||||||
var readFileSync = require("fs").readFileSync;
|
|
||||||
|
|
||||||
describe("bin/uglifyjs with input file globs", function() {
|
describe("bin/uglifyjs with input file globs", function() {
|
||||||
var uglifyjscmd = '"' + process.argv[0] + '" bin/uglifyjs';
|
var uglifyjscmd = '"' + process.argv[0] + '" bin/uglifyjs';
|
||||||
|
|||||||
@@ -1,21 +0,0 @@
|
|||||||
var assert = require("assert");
|
|
||||||
var UglifyJS = require("../..");
|
|
||||||
|
|
||||||
describe("ie8", function() {
|
|
||||||
it("Should be able to minify() with undefined as catch parameter in a try...catch statement", function() {
|
|
||||||
assert.strictEqual(
|
|
||||||
UglifyJS.minify([
|
|
||||||
"function a(b){",
|
|
||||||
" try {",
|
|
||||||
" throw 'Stuff';",
|
|
||||||
" } catch (undefined) {",
|
|
||||||
" console.log('caught: ' + undefined);",
|
|
||||||
" }",
|
|
||||||
" console.log('undefined is ' + undefined);",
|
|
||||||
" return b === undefined;",
|
|
||||||
"};",
|
|
||||||
].join("\n")).code,
|
|
||||||
'function a(o){try{throw"Stuff"}catch(o){console.log("caught: "+o)}return console.log("undefined is "+void 0),void 0===o}'
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
var assert = require("assert");
|
var assert = require("assert");
|
||||||
var UglifyJS = require("../..");
|
var UglifyJS = require("../node");
|
||||||
|
|
||||||
describe("let", function() {
|
describe("let", function() {
|
||||||
this.timeout(30000);
|
this.timeout(30000);
|
||||||
@@ -7,11 +7,11 @@ describe("let", function() {
|
|||||||
// Produce a lot of variables in a function and run it through mangle.
|
// Produce a lot of variables in a function and run it through mangle.
|
||||||
var s = '"dddddeeeeelllllooooottttt"; function foo() {';
|
var s = '"dddddeeeeelllllooooottttt"; function foo() {';
|
||||||
for (var i = 0; i < 18000; i++) {
|
for (var i = 0; i < 18000; i++) {
|
||||||
s += "var v" + i + "=0;";
|
s += "var v" + i + "=[];";
|
||||||
}
|
}
|
||||||
s += '}';
|
s += '}';
|
||||||
var result = UglifyJS.minify(s, {
|
var result = UglifyJS.minify(s, {
|
||||||
compress: false
|
compress: false,
|
||||||
}).code;
|
}).code;
|
||||||
|
|
||||||
// Verify that select keywords and reserved keywords not produced
|
// Verify that select keywords and reserved keywords not produced
|
||||||
@@ -41,7 +41,7 @@ describe("let", function() {
|
|||||||
}
|
}
|
||||||
var result = UglifyJS.minify(s, {
|
var result = UglifyJS.minify(s, {
|
||||||
compress: false,
|
compress: false,
|
||||||
ie8: true,
|
ie: true,
|
||||||
mangle: {
|
mangle: {
|
||||||
properties: true,
|
properties: true,
|
||||||
}
|
}
|
||||||
@@ -54,4 +54,43 @@ describe("let", function() {
|
|||||||
assert.notStrictEqual(result.indexOf('v["' + name + '"]'), -1);
|
assert.notStrictEqual(result.indexOf('v["' + name + '"]'), -1);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
it("Should parse `let` as name correctly", function() {
|
||||||
|
[
|
||||||
|
"for(var let;let;let)let;",
|
||||||
|
"function let(let){let}",
|
||||||
|
].forEach(function(code) {
|
||||||
|
var ast = UglifyJS.parse(code);
|
||||||
|
assert.strictEqual(ast.print_to_string(), code);
|
||||||
|
assert.throws(function() {
|
||||||
|
UglifyJS.parse('"use strict";' + code);
|
||||||
|
}, function(e) {
|
||||||
|
return e instanceof UglifyJS.JS_Parse_Error && e.message == "Unexpected let in strict mode";
|
||||||
|
}, code);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it("Should throw on ambiguous use of `let`", function() {
|
||||||
|
[
|
||||||
|
"export let",
|
||||||
|
[
|
||||||
|
"let",
|
||||||
|
"console.log(42)",
|
||||||
|
].join("\n"),
|
||||||
|
[
|
||||||
|
"let",
|
||||||
|
"[ console.log(42) ]",
|
||||||
|
].join("\n"),
|
||||||
|
[
|
||||||
|
"let",
|
||||||
|
"{",
|
||||||
|
" console.log(42)",
|
||||||
|
"}",
|
||||||
|
].join("\n"),
|
||||||
|
].forEach(function(code) {
|
||||||
|
assert.throws(function() {
|
||||||
|
UglifyJS.parse(code);
|
||||||
|
}, function(e) {
|
||||||
|
return e instanceof UglifyJS.JS_Parse_Error;
|
||||||
|
}, code);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user