Compare commits
988 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
787dfbed64 | ||
|
|
6b23899ef3 | ||
|
|
8c5a899986 | ||
|
|
ed36c1ec5c | ||
|
|
ce8ef52e2b | ||
|
|
6669ea19ef | ||
|
|
205a1d1f19 | ||
|
|
95d3ede664 | ||
|
|
8195a664fd | ||
|
|
9c80456634 | ||
|
|
dc7aa32172 | ||
|
|
23d74bedeb | ||
|
|
f31311e439 | ||
|
|
87c9edbbc7 | ||
|
|
8dc99fa25f | ||
|
|
dc51a23d31 | ||
|
|
0934c0e431 | ||
|
|
ca4185a0fd | ||
|
|
e7b9b4aafb | ||
|
|
3dfb379486 | ||
|
|
2cb6454b1f | ||
|
|
09910771a1 | ||
|
|
c21a8eee7b | ||
|
|
34b6143306 | ||
|
|
ffe0fe7762 | ||
|
|
aa7c3389e6 | ||
|
|
30fd331bf1 | ||
|
|
f0ca9cfbe6 | ||
|
|
a437a61518 | ||
|
|
57dd3f6a2c | ||
|
|
f07dc5cfba | ||
|
|
358faaacaa | ||
|
|
c9117041fa | ||
|
|
f2b6f1def0 | ||
|
|
797184f587 | ||
|
|
78242ff21d | ||
|
|
dd88f3866b | ||
|
|
17c3ae6cba | ||
|
|
0cbd5ea64a | ||
|
|
404794f5db | ||
|
|
650e63c8aa | ||
|
|
59e385591c | ||
|
|
574ca47666 | ||
|
|
548f0938e8 | ||
|
|
2352909c3d | ||
|
|
4e7744af2d | ||
|
|
aef7065262 | ||
|
|
24c3db11e6 | ||
|
|
e5cbd3e0f3 | ||
|
|
68d62a8a31 | ||
|
|
21aff996a5 | ||
|
|
1d400f1a25 | ||
|
|
7f424a55c5 | ||
|
|
e37a1489d4 | ||
|
|
2b1c321ac8 | ||
|
|
8d28052182 | ||
|
|
f40dbd6e33 | ||
|
|
7270671687 | ||
|
|
30bf068768 | ||
|
|
fb1bff2c0a | ||
|
|
19c471c16a | ||
|
|
8319badea8 | ||
|
|
5a5200d657 | ||
|
|
5411360829 | ||
|
|
7edd10e5e5 | ||
|
|
bccb1c3bd9 | ||
|
|
ed7051b9bb | ||
|
|
a391897388 | ||
|
|
4a1da492dd | ||
|
|
94a954c3d1 | ||
|
|
be8ccc3ab5 | ||
|
|
58d997a3d6 | ||
|
|
dabcc39b51 | ||
|
|
140e4e0da8 | ||
|
|
80fc862547 | ||
|
|
6cdc035b2f | ||
|
|
e1e3516397 | ||
|
|
bd5fc4cb1b | ||
|
|
a570c00251 | ||
|
|
3fa2086681 | ||
|
|
8e65413b99 | ||
|
|
8ca40070a4 | ||
|
|
f9b811ce83 | ||
|
|
9ac3879b06 | ||
|
|
37d3e4feaa | ||
|
|
43ec350cd2 | ||
|
|
63b04a687a | ||
|
|
9efa02afb6 | ||
|
|
3a6e58109e | ||
|
|
5ac6ec5496 | ||
|
|
eb22f0101e | ||
|
|
e4bff315eb | ||
|
|
001f6f9719 | ||
|
|
e0b302d651 | ||
|
|
fa2511f71c | ||
|
|
edf1bf1106 | ||
|
|
88dfc49683 | ||
|
|
9dec612cd5 | ||
|
|
02d966d914 | ||
|
|
5b5f6e329c | ||
|
|
4e4a2f8ed3 | ||
|
|
32bd65a87f | ||
|
|
318206d41d | ||
|
|
535212c69e | ||
|
|
1d42e9ad55 | ||
|
|
78f354beb8 | ||
|
|
e012f046bc | ||
|
|
f63b7b079d | ||
|
|
d530f9332c | ||
|
|
10bc86ba10 | ||
|
|
15b608f74c | ||
|
|
7c52af0dec | ||
|
|
cd97237c59 | ||
|
|
965e9767e5 | ||
|
|
41a7000745 | ||
|
|
9cdc1ef6c2 | ||
|
|
4db81065ee | ||
|
|
4653e8aec0 | ||
|
|
ac002b6338 | ||
|
|
9eea3a673a | ||
|
|
d6d2f5ced2 | ||
|
|
887e086890 | ||
|
|
8602d1ba17 | ||
|
|
dd90135944 | ||
|
|
612701a706 | ||
|
|
503532cf77 | ||
|
|
6c0e522922 | ||
|
|
9d37276986 | ||
|
|
5a4cd09938 | ||
|
|
c32fe26b8d | ||
|
|
2c3c4ec323 | ||
|
|
f451a7ad79 | ||
|
|
07953b36b0 | ||
|
|
387c69b194 | ||
|
|
a9d9af53e9 | ||
|
|
8a07f1202c | ||
|
|
41b65af6e2 | ||
|
|
884842cd6c | ||
|
|
8076d66ae5 | ||
|
|
64e3ceec3b | ||
|
|
672cdfa57a | ||
|
|
e39f33e41b | ||
|
|
6667440aaf | ||
|
|
ab5c7e6863 | ||
|
|
08c386f363 | ||
|
|
937a672879 | ||
|
|
513995f57d | ||
|
|
db6fd6db3e | ||
|
|
da930affd2 | ||
|
|
996836b67e | ||
|
|
fc7678c115 | ||
|
|
b371dc2d1e | ||
|
|
56e9454f1f | ||
|
|
d67daa8314 | ||
|
|
f0120e90b6 | ||
|
|
ec4558be29 | ||
|
|
685ab357cc | ||
|
|
5792f30175 | ||
|
|
24443b6764 | ||
|
|
154edf0427 | ||
|
|
4778cf88e2 | ||
|
|
38bd4f65d0 | ||
|
|
0b808f6428 | ||
|
|
b2bc2e1173 | ||
|
|
80787ff7ef | ||
|
|
b92a89f325 | ||
|
|
902292f776 | ||
|
|
3dcf098468 | ||
|
|
d89f0965aa | ||
|
|
c8d98f4787 | ||
|
|
0207b46d70 | ||
|
|
aa2a9fbedb | ||
|
|
3596b4feda | ||
|
|
51deeff72e | ||
|
|
4c227cc6bd | ||
|
|
2426657daa | ||
|
|
e1b03d0235 | ||
|
|
f1b3e9df1e | ||
|
|
fcc87edb71 | ||
|
|
8b464331ba | ||
|
|
9f57920566 | ||
|
|
933ca9ddd8 | ||
|
|
74e36e4456 | ||
|
|
4382bfe848 | ||
|
|
b6f250f5c9 | ||
|
|
5d69545299 | ||
|
|
139fad0c05 | ||
|
|
99946a3993 | ||
|
|
053cb27fe3 | ||
|
|
25017978e7 | ||
|
|
f749863cb2 | ||
|
|
123f9cf987 | ||
|
|
a758b40e3f | ||
|
|
44e5e99aae | ||
|
|
be53c4838b | ||
|
|
0c7b016fa7 | ||
|
|
00665766da | ||
|
|
88b4283200 | ||
|
|
d2bd0d1c1c | ||
|
|
25441d44f6 | ||
|
|
a025392a30 | ||
|
|
ad5f5ef2a3 | ||
|
|
40e669eacb | ||
|
|
ad3a331ca3 | ||
|
|
3c9e1693d5 | ||
|
|
8bc03dc6c4 | ||
|
|
2152f00de2 | ||
|
|
94aae05d45 | ||
|
|
0dbf2b1d3c | ||
|
|
59b23b8c13 | ||
|
|
5979b195fe | ||
|
|
a1cff23377 | ||
|
|
c82fc1ef71 | ||
|
|
740f93f5a9 | ||
|
|
d4caa97b88 | ||
|
|
c2ca7b7659 | ||
|
|
59edda6ca5 | ||
|
|
1668bc33c3 | ||
|
|
01f1e3fef8 | ||
|
|
27aa85f84b | ||
|
|
33c9c48318 | ||
|
|
63f16e4616 | ||
|
|
cb6dd34b98 | ||
|
|
27727e6926 | ||
|
|
a968ddc78c | ||
|
|
f70462aeb2 | ||
|
|
3aa92c76cc | ||
|
|
fc6a66836a | ||
|
|
31167da1a9 | ||
|
|
7db2ada880 | ||
|
|
e31bbe329a | ||
|
|
8946c87011 | ||
|
|
a9ef659bcb | ||
|
|
35c2149dbd | ||
|
|
89a35f9fcd | ||
|
|
1a4e99dc2d | ||
|
|
cb870f6fd6 | ||
|
|
a0c0c294c5 | ||
|
|
fbdb7eeda3 | ||
|
|
1bc0fccc8c | ||
|
|
20252c6483 | ||
|
|
e396912ea2 | ||
|
|
5ebfa78f56 | ||
|
|
950609f578 | ||
|
|
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 | ||
|
|
24b73a95fa | ||
|
|
862b1b77b5 | ||
|
|
b4944a31a4 | ||
|
|
58362d5ec7 | ||
|
|
01fa430a3e | ||
|
|
f4ee0f651c | ||
|
|
077512d151 | ||
|
|
e4848a7f5a | ||
|
|
f52b0e7c31 | ||
|
|
31e7d25cad | ||
|
|
12babdfe20 | ||
|
|
397e48b97e | ||
|
|
c7520b4b97 | ||
|
|
ad903e9240 | ||
|
|
83c3838b07 | ||
|
|
fa09f87589 | ||
|
|
2db1a141ab | ||
|
|
dd30ed6a9b | ||
|
|
cb50a2d192 | ||
|
|
20be5209c0 | ||
|
|
2a49760032 | ||
|
|
04ed818f0a | ||
|
|
10ca578ee5 | ||
|
|
955411e065 | ||
|
|
adcafce048 | ||
|
|
b1e05fd48a | ||
|
|
23b51287aa | ||
|
|
74dee5c445 | ||
|
|
ee27d87a08 | ||
|
|
62887f2c66 | ||
|
|
68b2dadc58 | ||
|
|
bd73720061 | ||
|
|
ec0440f264 | ||
|
|
81254f67e4 | ||
|
|
c549ee89b9 | ||
|
|
7924a3ae8b | ||
|
|
13ad10a6b5 | ||
|
|
e6ebf827ce | ||
|
|
0a42457df6 | ||
|
|
ba4a771bbc | ||
|
|
ac26993b5a | ||
|
|
ea52339502 | ||
|
|
992952d8f6 | ||
|
|
6d7ab63a66 | ||
|
|
822b1da5d2 | ||
|
|
72805ea73a | ||
|
|
a5e6946f74 | ||
|
|
b8672b55b2 | ||
|
|
a5a958beda | ||
|
|
c885660347 | ||
|
|
d68d155f93 | ||
|
|
e535f19189 | ||
|
|
f9a2a9d78e | ||
|
|
960668ccdb | ||
|
|
55b59407e4 | ||
|
|
b726e364c1 | ||
|
|
bfe3a8b516 | ||
|
|
ae09773ba0 | ||
|
|
8d668c2963 | ||
|
|
5f60c1b830 | ||
|
|
10de27ca3d | ||
|
|
7b4fd858ba | ||
|
|
a7bcd4d613 | ||
|
|
6a2bda52f3 | ||
|
|
fa8aa204a0 | ||
|
|
76b27891c6 | ||
|
|
203ca2586a | ||
|
|
c21f096ab8 | ||
|
|
b7219ac489 | ||
|
|
a6bb66931b | ||
|
|
766742e1d3 | ||
|
|
94e8944f67 | ||
|
|
83197ffdb3 | ||
|
|
952765be66 | ||
|
|
083679bcad | ||
|
|
f5659f292b | ||
|
|
c6e287331d | ||
|
|
a98ec7e4df | ||
|
|
5ec82e5801 | ||
|
|
c76481341c | ||
|
|
5e6307974f | ||
|
|
228cdf8e7e | ||
|
|
14fedbf123 | ||
|
|
fcee32527b | ||
|
|
e13d1e9969 | ||
|
|
aedc1e7fc9 | ||
|
|
353f654038 | ||
|
|
357d861246 | ||
|
|
fd4caf7a9c | ||
|
|
c44b6399c3 | ||
|
|
522cceeccf | ||
|
|
5c84dfa151 | ||
|
|
5359900b78 | ||
|
|
739fa266f8 | ||
|
|
da24dfb59e | ||
|
|
a2f27c7640 | ||
|
|
3c556b8689 | ||
|
|
7110c6923b | ||
|
|
b27b6807cb | ||
|
|
ba6e29d6fd | ||
|
|
d4685640a0 | ||
|
|
ac7b5c07d7 | ||
|
|
0cd4a199b0 | ||
|
|
35435d4bd3 | ||
|
|
d0bb147639 | ||
|
|
4723b4541e | ||
|
|
9d23ba0a22 | ||
|
|
a08d42555a | ||
|
|
fd7ad8e779 | ||
|
|
a36c5472d2 | ||
|
|
8bfd891c09 | ||
|
|
ef9f7ca3e7 | ||
|
|
acc443b2cf | ||
|
|
f87e7be12c | ||
|
|
c0614654d9 | ||
|
|
0358637725 | ||
|
|
63b5b6d2b3 | ||
|
|
e675262d51 | ||
|
|
c1e771a89a | ||
|
|
bc7a88baea | ||
|
|
018e0350f8 | ||
|
|
d37ee4d41c | ||
|
|
7793c6c389 | ||
|
|
90ec468240 | ||
|
|
994293e972 | ||
|
|
b57bae4b9e | ||
|
|
e23a10f7f9 | ||
|
|
884ec4e8a5 | ||
|
|
e616916de5 | ||
|
|
8d21516623 | ||
|
|
74368c3dba | ||
|
|
18dbceb36f | ||
|
|
65d39a3702 | ||
|
|
24917e7084 | ||
|
|
e84957e3da | ||
|
|
c11a748908 | ||
|
|
90017051f2 | ||
|
|
fc816628c1 | ||
|
|
46ad273df4 | ||
|
|
b689028e87 | ||
|
|
1e831df1f6 | ||
|
|
c12486bab4 | ||
|
|
52e94a0723 | ||
|
|
16b97f9558 | ||
|
|
dbfa5d4d14 | ||
|
|
ba54d074d8 | ||
|
|
0818d396c5 | ||
|
|
770f3ba5fe | ||
|
|
553034fe52 | ||
|
|
7fe8c9150a | ||
|
|
6c419bc083 | ||
|
|
25321df959 | ||
|
|
cf1b0165af | ||
|
|
c3d358a5b8 | ||
|
|
68497d0258 | ||
|
|
71c3d04681 | ||
|
|
4c89550c43 | ||
|
|
7ebfb22d16 | ||
|
|
6eceac0966 | ||
|
|
fc5aee662d | ||
|
|
5fbbb43839 | ||
|
|
df2cfcb5fc | ||
|
|
623a0d920f | ||
|
|
e8c04f8cb6 | ||
|
|
110c1ac097 | ||
|
|
15ef272790 | ||
|
|
b3a706114c | ||
|
|
cc2d7acaf0 | ||
|
|
dfb86ccdd1 | ||
|
|
0417a69c3e | ||
|
|
2dbafbb4ee | ||
|
|
311c074622 | ||
|
|
a10c7793bb | ||
|
|
0b7d65d331 | ||
|
|
8b954b022b | ||
|
|
0013cbf91f | ||
|
|
1956edd503 | ||
|
|
560ccc1221 | ||
|
|
10a71c182b | ||
|
|
ddc0ed7072 | ||
|
|
c00efe56f4 | ||
|
|
28bcdbd7df | ||
|
|
6a8aed2049 | ||
|
|
a8785fb694 | ||
|
|
dd6d7b3d88 | ||
|
|
94f3819dc6 | ||
|
|
be1f5199f4 | ||
|
|
95aea0e33c | ||
|
|
a1b2735dd8 | ||
|
|
f345175bc2 | ||
|
|
bb45f48ab7 | ||
|
|
b2f27fd873 | ||
|
|
ced32f9bd8 | ||
|
|
dfc3ec9cef | ||
|
|
1896694532 | ||
|
|
5f269cd573 | ||
|
|
6988cd9558 | ||
|
|
2390fae5c4 | ||
|
|
56fce2131c | ||
|
|
7e575e9d7f | ||
|
|
cb4a02949e | ||
|
|
f85a206b9e | ||
|
|
bba7cd0a70 | ||
|
|
e1b2026929 | ||
|
|
c319030373 | ||
|
|
47b63ed1a0 | ||
|
|
7aefe97083 | ||
|
|
89198e0ad4 | ||
|
|
caea6aac81 | ||
|
|
f5224ca1f5 | ||
|
|
b7c49b72b3 | ||
|
|
8ce3c7d70f | ||
|
|
87cf715213 | ||
|
|
2c9c72e06c | ||
|
|
882968c68c | ||
|
|
acc2d7d845 | ||
|
|
9a5aede941 | ||
|
|
e6dd471f8f | ||
|
|
0f55bd92f1 | ||
|
|
7d9dad0289 | ||
|
|
44e494f16f | ||
|
|
2415a72e75 | ||
|
|
9c0718b162 | ||
|
|
d2c50ace99 | ||
|
|
1b646d3bc4 | ||
|
|
82d2aa4acf | ||
|
|
c1256c399a | ||
|
|
2c637fea8a | ||
|
|
4fa54b075c | ||
|
|
ab82be82b2 | ||
|
|
02fdcfde01 | ||
|
|
a96f087ac3 | ||
|
|
75e9fd8417 | ||
|
|
f68e267830 | ||
|
|
8b10b93ee1 | ||
|
|
549de028b6 | ||
|
|
f579f1aa47 | ||
|
|
fcc40d0502 | ||
|
|
b309527264 | ||
|
|
5d19bb8d5d | ||
|
|
af97629912 | ||
|
|
8c000033d3 | ||
|
|
fd0d28e465 | ||
|
|
2123f38394 | ||
|
|
58dff9ada3 | ||
|
|
4fdec765bc | ||
|
|
1020d37256 | ||
|
|
076739db07 | ||
|
|
515e93d88a | ||
|
|
57105b299e | ||
|
|
77e1bda426 | ||
|
|
a59593cac8 | ||
|
|
046bbde9d4 | ||
|
|
fea9da9866 | ||
|
|
4733159782 | ||
|
|
5fba98608c | ||
|
|
c587d7917d | ||
|
|
336336f53f | ||
|
|
4bde50ce85 | ||
|
|
fbecedf94c | ||
|
|
2f31f95095 | ||
|
|
6b603e1a62 | ||
|
|
499f8d89ff | ||
|
|
9eb65f3af3 | ||
|
|
2cbbf5c375 | ||
|
|
3c384cf9a8 | ||
|
|
37f4f56752 | ||
|
|
1e4985ed9e | ||
|
|
d2d56e301e | ||
|
|
9d34f8428b | ||
|
|
f045e2b460 | ||
|
|
8791f258e3 | ||
|
|
af1cca25bf | ||
|
|
9b3a363604 | ||
|
|
1e8fa1aa1d | ||
|
|
9f67866147 | ||
|
|
645d5a348b | ||
|
|
cf120c7cea | ||
|
|
8d30902ba9 | ||
|
|
02459cddf9 | ||
|
|
1b579779be | ||
|
|
b18b70f63b | ||
|
|
641406d491 | ||
|
|
134ef0b1eb | ||
|
|
db87dcf13e | ||
|
|
aecbabc587 | ||
|
|
fd6544b340 | ||
|
|
f6a83f7944 | ||
|
|
35283e5dd1 | ||
|
|
7a51c17ff0 | ||
|
|
aff842f2f9 | ||
|
|
0bedd031da | ||
|
|
caa92aea5d | ||
|
|
383163afa6 | ||
|
|
8a83c8dd46 | ||
|
|
2a612fd472 | ||
|
|
b9798a01a8 | ||
|
|
6dbacb5e3f | ||
|
|
e5f80afc53 | ||
|
|
42e34c870a | ||
|
|
e390e7e124 | ||
|
|
6fd5b5b371 | ||
|
|
fba27bfb71 | ||
|
|
41310e6404 | ||
|
|
91fc1c82b5 | ||
|
|
810cd40356 | ||
|
|
1cbd07e789 | ||
|
|
b82de04775 | ||
|
|
4bbeb09f7c | ||
|
|
c2f6fd5fde | ||
|
|
af4ea3ff69 | ||
|
|
e7643248a3 | ||
|
|
68091dbf69 | ||
|
|
cbf7269296 | ||
|
|
d8563caba7 | ||
|
|
2e0ad40fe6 | ||
|
|
5d12abc41b | ||
|
|
79e5c3f564 | ||
|
|
607f87c5cd | ||
|
|
b2775746a7 | ||
|
|
e478da24c7 | ||
|
|
c5df8355ba | ||
|
|
ff38d2471f | ||
|
|
8e86d05c32 | ||
|
|
9e40abeded | ||
|
|
23ca7d675f | ||
|
|
fd8c0212b8 | ||
|
|
256950c2c0 | ||
|
|
8ecaa40c6e | ||
|
|
96bf7fceab | ||
|
|
6c7226c10e | ||
|
|
dc575919e2 | ||
|
|
4298201938 | ||
|
|
4f833937fe | ||
|
|
3d71e97dd1 | ||
|
|
7f35d9cee0 | ||
|
|
9f8106e1d8 | ||
|
|
b7b8435721 | ||
|
|
c0c04c33bb | ||
|
|
0e234a25c5 | ||
|
|
3096f6fdad | ||
|
|
176c09c6a5 | ||
|
|
9272f662c0 | ||
|
|
4d33cb2f94 | ||
|
|
00d0eda85b | ||
|
|
1cdf810f0b | ||
|
|
b512726cf3 | ||
|
|
9b7a13c8c7 | ||
|
|
74ff6ce261 | ||
|
|
b1b8898e7c | ||
|
|
55451e7b78 |
25
.github/ISSUE_TEMPLATE.md
vendored
25
.github/ISSUE_TEMPLATE.md
vendored
@@ -1,25 +0,0 @@
|
|||||||
**Bug report or feature request?**
|
|
||||||
|
|
||||||
<!-- Note: sub-optimal but correct code is not a bug -->
|
|
||||||
|
|
||||||
**Uglify version (`uglifyjs -V`)**
|
|
||||||
|
|
||||||
**JavaScript input**
|
|
||||||
|
|
||||||
<!--
|
|
||||||
A complete parsable JS program exhibiting the issue with
|
|
||||||
UglifyJS alone - without third party tools or libraries.
|
|
||||||
Ideally the input should be as small as possible.
|
|
||||||
Post a link to a gist if necessary.
|
|
||||||
|
|
||||||
Issues without a reproducible test case will be closed.
|
|
||||||
-->
|
|
||||||
|
|
||||||
**The `uglifyjs` CLI command executed or `minify()` options used.**
|
|
||||||
|
|
||||||
**JavaScript output or error produced.**
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Note: `uglify-js` only supports JavaScript.
|
|
||||||
Those wishing to minify ES6+ should transpile first.
|
|
||||||
-->
|
|
||||||
51
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
51
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
---
|
||||||
|
name: Bug report
|
||||||
|
about: Create a report to help us improve
|
||||||
|
title: ''
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- Note: sub-optimal but correct code is not a bug -->
|
||||||
|
|
||||||
|
**Uglify version (`uglifyjs -V`)**
|
||||||
|
|
||||||
|
**JavaScript input**
|
||||||
|
|
||||||
|
<!--
|
||||||
|
A complete parsable JS program exhibiting the issue with UglifyJS alone
|
||||||
|
- without third party tools or libraries.
|
||||||
|
|
||||||
|
Ideally the input should be as small as possible, but may be large if isolating
|
||||||
|
the problem proves to be difficult. The most important thing is that the
|
||||||
|
standalone program reliably exhibits the bug when minified. Provide a link to a
|
||||||
|
gist if necessary.
|
||||||
|
|
||||||
|
Solely providing minified output without the original uglify JS input is not
|
||||||
|
useful in determining the cause of the problem. Issues without a reproducible
|
||||||
|
test case will be closed.
|
||||||
|
-->
|
||||||
|
|
||||||
|
**The `uglifyjs` CLI command executed or `minify()` options used.**
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Command-line or API call to UglifyJS without third party tools or libraries.
|
||||||
|
|
||||||
|
For users using bundlers or transpilers, you may be able to gather the required
|
||||||
|
information through setting the `UGLIFY_BUG_REPORT` environment variable:
|
||||||
|
|
||||||
|
export UGLIFY_BUG_REPORT=1 (bash)
|
||||||
|
set UGLIFY_BUG_REPORT=1 (Command Prompt)
|
||||||
|
$Env:UGLIFY_BUG_REPORT=1 (PowerShell)
|
||||||
|
|
||||||
|
before running your usual build process. The resulting "minified" output should
|
||||||
|
contain the necessary details for this report.
|
||||||
|
-->
|
||||||
|
|
||||||
|
**JavaScript output or error produced.**
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Only minified code that produces different output (or error) from the original
|
||||||
|
upon execution would be considered a bug.
|
||||||
|
-->
|
||||||
58
.github/workflows/build.yml
vendored
Normal file
58
.github/workflows/build.yml
vendored
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
name: Build testing
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
push:
|
||||||
|
branches: [ master ]
|
||||||
|
jobs:
|
||||||
|
ufuzz:
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
options:
|
||||||
|
- '--ie -c'
|
||||||
|
- '-mb braces'
|
||||||
|
- '--toplevel -mc'
|
||||||
|
- '-p acorn -mco spidermonkey'
|
||||||
|
- '-mc passes=3,pure_getters,unsafe'
|
||||||
|
script:
|
||||||
|
- acorn.sh
|
||||||
|
- bootstrap.sh
|
||||||
|
- buble.sh
|
||||||
|
- butternut.sh
|
||||||
|
- mathjs.sh
|
||||||
|
- rollup-es.sh
|
||||||
|
- rollup-ts.sh
|
||||||
|
- sucrase.sh
|
||||||
|
- web-tooling-benchmark.sh
|
||||||
|
include:
|
||||||
|
- node: '14'
|
||||||
|
script: acorn.sh
|
||||||
|
- node: '14'
|
||||||
|
script: bootstrap.sh
|
||||||
|
- node: '14'
|
||||||
|
script: buble.sh
|
||||||
|
- node: '14'
|
||||||
|
script: butternut.sh
|
||||||
|
- node: '14'
|
||||||
|
script: mathjs.sh
|
||||||
|
- node: '8'
|
||||||
|
script: rollup-es.sh
|
||||||
|
- node: '14'
|
||||||
|
script: rollup-ts.sh
|
||||||
|
- node: '14'
|
||||||
|
script: sucrase.sh
|
||||||
|
- node: '14'
|
||||||
|
script: web-tooling-benchmark.sh
|
||||||
|
name: ${{ matrix.script }} ${{ matrix.options }}
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
env:
|
||||||
|
NODE: ${{ matrix.node }}
|
||||||
|
OPTIONS: ${{ matrix.options }}
|
||||||
|
SCRIPT: ${{ matrix.script }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Perform uglify, build & test
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
. ./test/release/install.sh
|
||||||
|
./test/release/$SCRIPT $OPTIONS
|
||||||
29
.github/workflows/ci.yml
vendored
29
.github/workflows/ci.yml
vendored
@@ -7,42 +7,23 @@ jobs:
|
|||||||
test:
|
test:
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
node: [ "0.8", "0.10", "0.12", "4", "6", "8", "10", "12", latest ]
|
node: [ '0.10', '0.12', '4', '6', '8', '10', '12', '14', '16', '18', '20' ]
|
||||||
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:
|
||||||
NODE: ${{ matrix.node }}
|
NODE: ${{ matrix.node }}
|
||||||
TYPE: ${{ matrix.script }}
|
TYPE: ${{ matrix.script }}
|
||||||
|
UGLIFY_GITHUB_LAG: 10000
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v4
|
||||||
- uses: actions/cache@v2
|
- uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: tmp
|
path: tmp
|
||||||
key: tmp ${{ matrix.script }}
|
key: tmp ${{ matrix.script }}
|
||||||
- name: Perform tests
|
- name: Perform tests
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
git clone --branch v1.5.4 --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
|
||||||
|
|||||||
18
.github/workflows/moz.yml
vendored
Normal file
18
.github/workflows/moz.yml
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
name: ESTree
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
push:
|
||||||
|
branches: [ master ]
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
name: fuzzing
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
env:
|
||||||
|
NODE: latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Perform tests
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
. ./test/release/install.sh
|
||||||
|
node test/mozilla-ast.js 5000
|
||||||
50
.github/workflows/ufuzz.yml
vendored
50
.github/workflows/ufuzz.yml
vendored
@@ -2,43 +2,43 @@ 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:
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
os: [ ubuntu-latest, windows-latest ]
|
include:
|
||||||
name: ${{ matrix.os }}
|
- node: '16'
|
||||||
|
os: macos-latest
|
||||||
|
- node: '12'
|
||||||
|
os: ubuntu-latest
|
||||||
|
- node: '8'
|
||||||
|
os: ubuntu-latest
|
||||||
|
- node: '12'
|
||||||
|
os: windows-latest
|
||||||
|
- node: '8'
|
||||||
|
os: windows-latest
|
||||||
|
name: ${{ matrix.node }} ${{ matrix.os }}
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
|
env:
|
||||||
|
NODE: ${{ matrix.node }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v4
|
||||||
- name: Perform fuzzing
|
- name: Perform fuzzing
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
git clone --branch v1.5.4 --depth 1 https://github.com/jasongin/nvs.git ~/.nvs
|
. ./test/release/install.sh
|
||||||
while ! timeout 60 bash -c '. ~/.nvs/nvs.sh add 8 && nvs use 8'; 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 8
|
|
||||||
node --version
|
|
||||||
npm config set audit false
|
|
||||||
npm config set optional false
|
|
||||||
npm config set save false
|
|
||||||
npm config set strict-ssl false
|
|
||||||
npm config set update-notifier false
|
|
||||||
npm --version
|
|
||||||
while !(npm install); do echo "'npm install' failed - retrying..."; done
|
|
||||||
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
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ Contributing
|
|||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
|
||||||
Every new feature and API change should be accompanied by a README additon.
|
Every new feature and API change should be accompanied by a README addition.
|
||||||
|
|
||||||
## Testing
|
## Testing
|
||||||
|
|
||||||
|
|||||||
2
LICENSE
2
LICENSE
@@ -1,6 +1,6 @@
|
|||||||
UglifyJS is released under the BSD license:
|
UglifyJS is released under the BSD license:
|
||||||
|
|
||||||
Copyright 2012-2019 (c) Mihai Bazon <mihai.bazon@gmail.com>
|
Copyright 2012-2024 (c) Mihai Bazon <mihai.bazon@gmail.com>
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
Redistribution and use in source and binary forms, with or without
|
||||||
modification, are permitted provided that the following conditions
|
modification, are permitted provided that the following conditions
|
||||||
|
|||||||
605
README.md
605
README.md
@@ -4,10 +4,11 @@ UglifyJS 3
|
|||||||
UglifyJS is a JavaScript parser, minifier, compressor and beautifier toolkit.
|
UglifyJS is a JavaScript parser, minifier, compressor and beautifier toolkit.
|
||||||
|
|
||||||
#### Note:
|
#### Note:
|
||||||
- **`uglify-js@3` has a simplified [API](#api-reference) and [CLI](#command-line-usage) that is not backwards compatible with [`uglify-js@2`](https://github.com/mishoo/UglifyJS/tree/v2.x)**.
|
- `uglify-js` supports JavaScript and most language features in ECMAScript.
|
||||||
- **Documentation for UglifyJS `2.x` releases can be found [here](https://github.com/mishoo/UglifyJS/tree/v2.x)**.
|
- For more exotic parts of ECMAScript, process your source file with transpilers
|
||||||
- `uglify-js` only supports JavaScript (ECMAScript 5).
|
like [Babel](https://babeljs.io/) before passing onto `uglify-js`.
|
||||||
- To minify ECMAScript 2015 or above, transpile using tools like [Babel](https://babeljs.io/).
|
- `uglify-js@3` has a simplified [API](#api-reference) and [CLI](#command-line-usage)
|
||||||
|
that is not backwards compatible with [`uglify-js@2`](https://github.com/mishoo/UglifyJS/tree/v2.x).
|
||||||
|
|
||||||
Install
|
Install
|
||||||
-------
|
-------
|
||||||
@@ -53,8 +54,6 @@ a double dash to prevent input files being used as option arguments:
|
|||||||
modules and Userscripts that may
|
modules and Userscripts that may
|
||||||
be anonymous function wrapped (IIFE)
|
be anonymous function wrapped (IIFE)
|
||||||
by the .user.js engine `caller`.
|
by the .user.js engine `caller`.
|
||||||
`expression` Parse a single expression, rather than
|
|
||||||
a program (for parsing JSON).
|
|
||||||
`spidermonkey` Assume input files are SpiderMonkey
|
`spidermonkey` Assume input files are SpiderMonkey
|
||||||
AST format (as JSON).
|
AST format (as JSON).
|
||||||
-c, --compress [options] Enable compressor/specify compressor options:
|
-c, --compress [options] Enable compressor/specify compressor options:
|
||||||
@@ -84,13 +83,16 @@ a double dash to prevent input files being used as option arguments:
|
|||||||
1 - single
|
1 - single
|
||||||
2 - double
|
2 - double
|
||||||
3 - original
|
3 - original
|
||||||
`wrap_iife` Wrap IIFEs in parenthesis. Note: you may
|
`wrap_iife` Wrap IIFEs in parentheses. Note: you may
|
||||||
want to disable `negate_iife` under
|
want to disable `negate_iife` under
|
||||||
compressor options.
|
compressor options.
|
||||||
-O, --output-opts [options] Specify output options (`beautify` disabled by default).
|
-O, --output-opts [options] Specify output options (`beautify` disabled by default).
|
||||||
-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
|
||||||
@@ -107,12 +109,18 @@ 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.
|
--expression Parse a single expression, rather than a program
|
||||||
Equivalent to setting `ie8: true` in `minify()`
|
(for parsing JSON).
|
||||||
|
--ie Support non-standard Internet Explorer.
|
||||||
|
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.
|
||||||
|
--module Process input as ES module (implies --toplevel)
|
||||||
|
--no-module Avoid optimizations which may alter runtime behavior
|
||||||
|
under prior versions of JavaScript.
|
||||||
--name-cache <file> File to hold mangled name mappings.
|
--name-cache <file> File to hold mangled name mappings.
|
||||||
--self Build UglifyJS as a library (implies --wrap UglifyJS)
|
--self Build UglifyJS as a library (implies --wrap UglifyJS)
|
||||||
--source-map [options] Enable source map/specify source map options:
|
--source-map [options] Enable source map/specify source map options:
|
||||||
@@ -133,8 +141,16 @@ a double dash to prevent input files being used as option arguments:
|
|||||||
`//# sourceMappingURL`.
|
`//# sourceMappingURL`.
|
||||||
--timings Display operations run time on STDERR.
|
--timings Display operations run time on STDERR.
|
||||||
--toplevel Compress and/or mangle variables in top level scope.
|
--toplevel Compress and/or mangle variables in top level scope.
|
||||||
|
--v8 Support non-standard Chrome & Node.js
|
||||||
|
Equivalent to setting `v8: true` in `minify()`
|
||||||
|
for `mangle` and `output` options.
|
||||||
|
By default UglifyJS will not try to be v8-proof.
|
||||||
--verbose Print diagnostic messages.
|
--verbose Print diagnostic messages.
|
||||||
--warn Print warning messages.
|
--warn Print warning messages.
|
||||||
|
--webkit Support non-standard Safari/Webkit.
|
||||||
|
Equivalent to setting `webkit: true` in `minify()`
|
||||||
|
for `compress`, `mangle` and `output` options.
|
||||||
|
By default UglifyJS will not try to be Safari-proof.
|
||||||
--wrap <name> Embed everything in a big function, making the
|
--wrap <name> Embed everything in a big function, making the
|
||||||
“exports” and “global” variables available. You
|
“exports” and “global” variables available. You
|
||||||
need to pass an argument to this option to
|
need to pass an argument to this option to
|
||||||
@@ -212,10 +228,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:
|
||||||
|
|
||||||
@@ -313,7 +329,7 @@ unquoted style (`o.foo`). Example:
|
|||||||
// stuff.js
|
// stuff.js
|
||||||
var o = {
|
var o = {
|
||||||
"foo": 1,
|
"foo": 1,
|
||||||
bar: 3
|
bar: 3,
|
||||||
};
|
};
|
||||||
o.foo += o.bar;
|
o.foo += o.bar;
|
||||||
console.log(o.foo);
|
console.log(o.foo);
|
||||||
@@ -325,6 +341,16 @@ $ uglifyjs stuff.js --mangle-props keep_quoted -c -m
|
|||||||
var o={foo:1,o:3};o.foo+=o.o,console.log(o.foo);
|
var o={foo:1,o:3};o.foo+=o.o,console.log(o.foo);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
If the minified output will be processed again by UglifyJS, consider specifying
|
||||||
|
`keep_quoted_props` so the same property names are preserved:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ uglifyjs stuff.js --mangle-props keep_quoted -c -m -O keep_quoted_props
|
||||||
|
```
|
||||||
|
```javascript
|
||||||
|
var o={"foo":1,o:3};o.foo+=o.o,console.log(o.foo);
|
||||||
|
```
|
||||||
|
|
||||||
### Debugging property name mangling
|
### Debugging property name mangling
|
||||||
|
|
||||||
You can also pass `--mangle-props debug` in order to mangle property names
|
You can also pass `--mangle-props debug` in order to mangle property names
|
||||||
@@ -482,43 +508,62 @@ 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.
|
- `expression` (default: `false`) — parse as a single expression, e.g. JSON.
|
||||||
|
|
||||||
- `keep_fnames` (default: `false`) -- pass `true` to prevent discarding or mangling
|
- `ie` (default: `false`) — enable workarounds for Internet Explorer bugs.
|
||||||
|
|
||||||
|
- `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
|
- `module` (default: `true`) — process input as ES module, i.e. implicit
|
||||||
|
`"use strict";` and support for top-level `await`. When explicitly specified,
|
||||||
|
also enables `toplevel`.
|
||||||
|
|
||||||
|
- `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.
|
||||||
|
|
||||||
- `warnings` (default `false`) — pass `true` to return compressor warnings
|
- `v8` (default: `false`) — enable workarounds for Chrome & Node.js bugs.
|
||||||
|
|
||||||
|
- `warnings` (default: `false`) — pass `true` to return compressor warnings
|
||||||
in `result.warnings`. Use the value `"verbose"` for more detailed warnings.
|
in `result.warnings`. Use the value `"verbose"` for more detailed warnings.
|
||||||
|
|
||||||
|
- `webkit` (default: `false`) — enable workarounds for Safari/WebKit bugs.
|
||||||
|
PhantomJS users should set this option to `true`.
|
||||||
|
|
||||||
## Minify options structure
|
## Minify options structure
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
@@ -544,7 +589,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,
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -601,109 +645,129 @@ 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`) — process HTML comment as workaround for
|
||||||
|
browsers which do not recognize `<script>` tags
|
||||||
|
|
||||||
- `shebang` (default `true`) -- support `#!command` as the first line
|
- `module` (default: `false`) — set to `true` if you wish to process input as
|
||||||
|
ES module, i.e. implicit `"use strict";` and support for top-level `await`.
|
||||||
|
|
||||||
|
- `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.
|
||||||
|
|
||||||
- `assignments` (default: `true`) -- apply optimizations to assignment expressions.
|
- `arrows` (default: `true`) — apply optimizations to arrow functions
|
||||||
|
|
||||||
- `booleans` (default: `true`) -- various optimizations for boolean context,
|
- `assignments` (default: `true`) — apply optimizations to assignment expressions
|
||||||
|
|
||||||
|
- `awaits` (default: `true`) — apply optimizations to `await` expressions
|
||||||
|
|
||||||
|
- `booleans` (default: `true`) — various optimizations for boolean context,
|
||||||
for example `!!a ? b : c → a ? b : c`
|
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
|
||||||
|
|
||||||
- `directives` (default: `true`) -- remove redundant or non-standard directives
|
- `default_values` (default: `true`) — drop overshadowed default values
|
||||||
|
|
||||||
- `drop_console` (default: `false`) -- Pass `true` to discard calls to
|
- `directives` (default: `true`) — remove redundant or non-standard directives
|
||||||
|
|
||||||
|
- `drop_console` (default: `false`) — Pass `true` to discard calls to
|
||||||
`console.*` functions. If you wish to drop a specific function call
|
`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_funs` (default: `false`) -- hoist function declarations
|
- `hoist_exports` (default: `true`) — hoist `export` statements to facilitate
|
||||||
|
various `compress` and `mangle` optimizations.
|
||||||
|
|
||||||
- `hoist_props` (default: `true`) -- hoist properties from constant object and
|
- `hoist_funs` (default: `false`) — hoist function declarations
|
||||||
|
|
||||||
|
- `hoist_props` (default: `true`) — hoist properties from constant object and
|
||||||
array literals into regular variables subject to a set of constraints. For example:
|
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
|
||||||
|
|
||||||
- `inline` (default: `true`) -- inline calls to function with simple/`return` statement:
|
- `imports` (default: `true`) — drop unreferenced import symbols when used with `unused`
|
||||||
- `false` -- same as `0`
|
|
||||||
- `0` -- disabled inlining
|
|
||||||
- `1` -- inline simple functions
|
|
||||||
- `2` -- inline functions with arguments
|
|
||||||
- `3` -- inline functions with arguments and variables
|
|
||||||
- `true` -- same as `3`
|
|
||||||
|
|
||||||
- `join_vars` (default: `true`) -- join consecutive `var` statements
|
- `inline` (default: `true`) — inline calls to function with simple/`return` statement:
|
||||||
|
- `false` — same as `0`
|
||||||
|
- `0` — disabled inlining
|
||||||
|
- `1` — inline simple functions
|
||||||
|
- `2` — inline functions with arguments
|
||||||
|
- `3` — inline functions with arguments and variables
|
||||||
|
- `4` — inline functions with arguments, variables and statements
|
||||||
|
- `true` — same as `4`
|
||||||
|
|
||||||
- `keep_fargs` (default: `strict`) -- Discard unused function arguments. Code
|
- `join_vars` (default: `true`) — join consecutive `var` statements
|
||||||
which relies on `Function.length` will break if this is done indiscriminately,
|
|
||||||
i.e. when passing `true`. Pass `false` to always retain function arguments.
|
|
||||||
|
|
||||||
- `keep_fnames` (default: `false`) -- Pass `true` to prevent the
|
- `keep_fargs` (default: `false`) — discard unused function arguments except
|
||||||
compressor from discarding function names. Useful for code relying on
|
when unsafe to do so, e.g. code which relies on `Function.prototype.length`.
|
||||||
`Function.prototype.name`. See also: the `keep_fnames` [mangle option](#mangle-options).
|
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"
|
- `module` (default: `false`) — set to `true` if you wish to process input as
|
||||||
where the return value is discarded, to avoid the parens that the
|
ES module, i.e. implicit `"use strict";`.
|
||||||
|
|
||||||
|
- `negate_iife` (default: `true`) — negate "Immediately-Called Function Expressions"
|
||||||
|
where the return value is discarded, to avoid the parentheses 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
|
||||||
@@ -715,22 +779,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"`) — Pass `true` for UglifyJS to assume that
|
||||||
this, UglifyJS will assume that object property access
|
object property access (e.g. `foo.bar` or `a[42]`) does not throw exception or
|
||||||
(e.g. `foo.bar` or `foo["bar"]`) doesn't have any side effects.
|
alter program states via getter function. Pass `"strict"` to allow dropping or
|
||||||
Specify `"strict"` to treat `foo.bar` as side-effect-free only when
|
reordering `foo.bar` only if `foo` is not `null` or `undefined` and is safe to
|
||||||
`foo` is certain to not throw, i.e. not `null` or `undefined`.
|
access as a variable. Pass `false` to retain all property accesses.
|
||||||
|
|
||||||
- `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.
|
||||||
|
|
||||||
- `sequences` (default: `true`) -- join consecutive simple statements using the
|
- `rests` (default: `true`) — apply optimizations to rest parameters
|
||||||
|
|
||||||
|
- `sequences` (default: `true`) — join consecutive simple statements using the
|
||||||
comma operator. May be set to a positive integer to specify the maximum number
|
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`
|
||||||
@@ -739,64 +805,68 @@ 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();`
|
|
||||||
|
|
||||||
- `strings` (default: `true`) -- compact string concatenations.
|
- `spreads` (default: `true`) — flatten spread expressions.
|
||||||
|
|
||||||
- `switches` (default: `true`) -- de-duplicate and remove unreachable `switch` branches
|
- `strings` (default: `true`) — compact string concatenations.
|
||||||
|
|
||||||
- `toplevel` (default: `false`) -- drop unreferenced functions (`"funcs"`) and/or
|
- `switches` (default: `true`) — de-duplicate and remove unreachable `switch` branches
|
||||||
variables (`"vars"`) in the top level scope (`false` by default, `true` to drop
|
|
||||||
both unreferenced functions and variables)
|
|
||||||
|
|
||||||
- `top_retain` (default: `null`) -- prevent specific toplevel functions and
|
- `templates` (default: `true`) — compact template literals by embedding expressions
|
||||||
|
and/or converting to string literals, e.g. `` `foo ${42}` → "foo 42"``
|
||||||
|
|
||||||
|
- `top_retain` (default: `null`) — prevent specific toplevel functions and
|
||||||
variables from `unused` removal (can be array, comma-separated, RegExp or
|
variables from `unused` removal (can be array, comma-separated, RegExp or
|
||||||
function. Implies `toplevel`)
|
function. Implies `toplevel`)
|
||||||
|
|
||||||
- `typeofs` (default: `true`) -- Transforms `typeof foo == "undefined"` into
|
- `toplevel` (default: `false`) — drop unreferenced functions (`"funcs"`) and/or
|
||||||
`foo === void 0`. Note: recommend to set this value to `false` for IE10 and
|
variables (`"vars"`) in the top level scope (`false` by default, `true` to drop
|
||||||
earlier versions due to known issues.
|
both unreferenced functions and variables)
|
||||||
|
|
||||||
- `unsafe` (default: `false`) -- apply "unsafe" transformations (discussion below)
|
- `typeofs` (default: `true`) — compress `typeof` expressions, e.g.
|
||||||
|
`typeof foo == "undefined" → void 0 === foo`
|
||||||
|
|
||||||
- `unsafe_comps` (default: `false`) -- compress expressions like `a <= b` assuming
|
- `unsafe` (default: `false`) — apply "unsafe" transformations (discussion below)
|
||||||
none of the operands can be (coerced to) `NaN`.
|
|
||||||
|
|
||||||
- `unsafe_Function` (default: `false`) -- compress and mangle `Function(args, code)`
|
- `unsafe_comps` (default: `false`) — assume operands cannot be (coerced to) `NaN`
|
||||||
|
in numeric comparisons, e.g. `a <= b`. In addition, expressions involving `in`
|
||||||
|
or `instanceof` would never throw.
|
||||||
|
|
||||||
|
- `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 declarations into `var`
|
||||||
|
whenever safe to do so
|
||||||
|
|
||||||
|
- `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.
|
||||||
|
|
||||||
- `keep_fnames` (default `false`) -- Pass `true` to not mangle function names.
|
- `reserved` (default: `[]`) — Pass an array of identifiers that should be
|
||||||
Useful for code relying on `Function.prototype.name`. See also: the `keep_fnames`
|
|
||||||
[compress option](#compress-options).
|
|
||||||
|
|
||||||
- `reserved` (default `[]`) -- Pass an array of identifiers that should be
|
|
||||||
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:
|
||||||
@@ -823,18 +893,24 @@ 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 built-in
|
||||||
DOM properties. Not recommended to override this setting.
|
properties of JavaScript API. 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.
|
- `domprops` (default: `false`) — Use `true` to allow the mangling of properties
|
||||||
|
commonly found in Document Object Model. Not recommended to override this setting.
|
||||||
|
|
||||||
- `regex` (default: `null`) -— Pass a RegExp literal to only mangle property
|
- `keep_fargs` (default: `false`) — Use `true` to prevent mangling of function
|
||||||
|
arguments.
|
||||||
|
|
||||||
|
- `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
|
||||||
@@ -843,76 +919,83 @@ 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. Use `-O` if you want to generate minified
|
||||||
when you want to generate minified code, in order to specify additional
|
code and specify additional arguments.
|
||||||
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.
|
||||||
```js
|
```javascript
|
||||||
function(node, comment) {
|
function(node, comment) {
|
||||||
return comment.value.indexOf("@type " + node.TYPE) >= 0;
|
return comment.value.indexOf("@type " + node.TYPE) >= 0;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
- `indent_level` (default `4`)
|
- `extendscript` (default: `false`) — enable workarounds for Adobe ExtendScript
|
||||||
|
bugs
|
||||||
|
|
||||||
- `indent_start` (default `0`) -- prefix all lines by that many spaces
|
- `galio` (default: `false`) — enable workarounds for ANT Galio bugs
|
||||||
|
|
||||||
- `inline_script` (default `true`) -- escape HTML comments and the slash in
|
- `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 whitespace sequence
|
||||||
|
specified in the same format as `indent_level`.
|
||||||
|
|
||||||
|
- `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)
|
||||||
|
|
||||||
- `webkit` (default `false`) -- enable workarounds for WebKit bugs.
|
- `width` (default: `80`) — only takes effect when beautification is on, this
|
||||||
PhantomJS users should set this option to `true`.
|
|
||||||
|
|
||||||
- `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.
|
||||||
|
|
||||||
@@ -1113,29 +1196,25 @@ in total it's a bit more than just using UglifyJS's own parser.
|
|||||||
It's not well known, but whitespace removal and symbol mangling accounts
|
It's not well known, but whitespace removal and symbol mangling accounts
|
||||||
for 95% of the size reduction in minified code for most JavaScript - not
|
for 95% of the size reduction in minified code for most JavaScript - not
|
||||||
elaborate code transforms. One can simply disable `compress` to speed up
|
elaborate code transforms. One can simply disable `compress` to speed up
|
||||||
Uglify builds by 3 to 4 times. In this fast `mangle`-only mode Uglify has
|
Uglify builds by 3 to 5 times.
|
||||||
comparable minify speeds and gzip sizes to
|
|
||||||
[`butternut`](https://www.npmjs.com/package/butternut):
|
|
||||||
|
|
||||||
| d3.js | minify size | gzip size | minify time (seconds) |
|
| d3.js | minify size | gzip size | minify time (seconds) |
|
||||||
| --- | ---: | ---: | ---: |
|
| --- | ---: | ---: | ---: |
|
||||||
| original | 451,131 | 108,733 | - |
|
| original | 511,371 | 119,932 | - |
|
||||||
| uglify-js@3.0.24 mangle=false, compress=false | 316,600 | 85,245 | 0.70 |
|
| uglify-js@3.13.0 mangle=false, compress=false | 363,988 | 95,695 | 0.56 |
|
||||||
| uglify-js@3.0.24 mangle=true, compress=false | 220,216 | 72,730 | 1.13 |
|
| uglify-js@3.13.0 mangle=true, compress=false | 253,305 | 81,281 | 0.99 |
|
||||||
| butternut@0.4.6 | 217,568 | 72,738 | 1.41 |
|
| uglify-js@3.13.0 mangle=true, compress=true | 244,436 | 79,854 | 5.30 |
|
||||||
| uglify-js@3.0.24 mangle=true, compress=true | 212,511 | 71,560 | 3.36 |
|
|
||||||
| babili@0.1.4 | 210,713 | 72,140 | 12.64 |
|
|
||||||
|
|
||||||
To enable fast minify mode from the CLI use:
|
To enable fast minify mode from the CLI use:
|
||||||
```
|
```
|
||||||
uglifyjs file.js -m
|
uglifyjs file.js -m
|
||||||
```
|
```
|
||||||
To enable fast minify mode with the API use:
|
To enable fast minify mode with the API use:
|
||||||
```js
|
```javascript
|
||||||
UglifyJS.minify(code, { compress: false, mangle: true });
|
UglifyJS.minify(code, { compress: false, mangle: true });
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Source maps and debugging
|
### Source maps and debugging
|
||||||
|
|
||||||
Various `compress` transforms that simplify, rearrange, inline and remove code
|
Various `compress` transforms that simplify, rearrange, inline and remove code
|
||||||
are known to have an adverse effect on debugging with source maps. This is
|
are known to have an adverse effect on debugging with source maps. This is
|
||||||
@@ -1147,6 +1226,10 @@ disable the Uglify `compress` option and just use `mangle`.
|
|||||||
|
|
||||||
To allow for better optimizations, the compiler makes various assumptions:
|
To allow for better optimizations, the compiler makes various assumptions:
|
||||||
|
|
||||||
|
- The code does not rely on preserving its runtime performance characteristics.
|
||||||
|
Typically uglified code will run faster due to less instructions and easier
|
||||||
|
inlining, but may be slower on rare occasions for a specific platform, e.g.
|
||||||
|
see [`reduce_funcs`](#compress-options).
|
||||||
- `.toString()` and `.valueOf()` don't have side effects, and for built-in
|
- `.toString()` and `.valueOf()` don't have side effects, and for built-in
|
||||||
objects they have not been overridden.
|
objects they have not been overridden.
|
||||||
- `undefined`, `NaN` and `Infinity` have not been externally redefined.
|
- `undefined`, `NaN` and `Infinity` have not been externally redefined.
|
||||||
@@ -1158,9 +1241,32 @@ 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:
|
||||||
|
```javascript
|
||||||
|
({
|
||||||
|
p: 42,
|
||||||
|
get p() {},
|
||||||
|
});
|
||||||
|
// SyntaxError: Object literal may not have data and accessor property with
|
||||||
|
// the same name
|
||||||
|
```
|
||||||
|
UglifyJS may modify the input which in turn may suppress those errors.
|
||||||
|
- Iteration order of keys over an object which contains spread syntax in later
|
||||||
|
versions of Chrome and Node.js may be altered.
|
||||||
- When `toplevel` is enabled, UglifyJS effectively assumes input code is wrapped
|
- When `toplevel` is enabled, UglifyJS effectively assumes input code is wrapped
|
||||||
within `function(){ ... }`, thus forbids aliasing of declared global variables:
|
within `function(){ ... }`, thus forbids aliasing of declared global variables:
|
||||||
```js
|
```javascript
|
||||||
A = "FAIL";
|
A = "FAIL";
|
||||||
var B = "FAIL";
|
var B = "FAIL";
|
||||||
// can be `global`, `self`, `window` etc.
|
// can be `global`, `self`, `window` etc.
|
||||||
@@ -1174,3 +1280,200 @@ To allow for better optimizations, the compiler makes various assumptions:
|
|||||||
top.B = "PASS";
|
top.B = "PASS";
|
||||||
console.log(B);
|
console.log(B);
|
||||||
```
|
```
|
||||||
|
- Use of `arguments` alongside destructuring as function parameters, e.g.
|
||||||
|
`function({}, arguments) {}` will result in `SyntaxError` in earlier versions
|
||||||
|
of Chrome and Node.js - UglifyJS may modify the input which in turn may
|
||||||
|
suppress those errors.
|
||||||
|
- Earlier versions of Chrome and Node.js will throw `ReferenceError` with the
|
||||||
|
following:
|
||||||
|
```javascript
|
||||||
|
var a;
|
||||||
|
try {
|
||||||
|
throw 42;
|
||||||
|
} catch ({
|
||||||
|
[a]: b,
|
||||||
|
// ReferenceError: a is not defined
|
||||||
|
}) {
|
||||||
|
let a;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
UglifyJS may modify the input which in turn may suppress those errors.
|
||||||
|
- Later versions of JavaScript will throw `SyntaxError` with the following:
|
||||||
|
```javascript
|
||||||
|
a => {
|
||||||
|
let a;
|
||||||
|
};
|
||||||
|
// SyntaxError: Identifier 'a' has already been declared
|
||||||
|
```
|
||||||
|
UglifyJS may modify the input which in turn may suppress those errors.
|
||||||
|
- Later versions of JavaScript will throw `SyntaxError` with the following:
|
||||||
|
```javascript
|
||||||
|
try {
|
||||||
|
// ...
|
||||||
|
} catch ({ message: a }) {
|
||||||
|
var a;
|
||||||
|
}
|
||||||
|
// SyntaxError: Identifier 'a' has already been declared
|
||||||
|
```
|
||||||
|
UglifyJS may modify the input which in turn may suppress those errors.
|
||||||
|
- Some versions of Chrome and Node.js will throw `ReferenceError` with the
|
||||||
|
following:
|
||||||
|
```javascript
|
||||||
|
console.log(((a, b = function() {
|
||||||
|
return a;
|
||||||
|
// ReferenceError: a is not defined
|
||||||
|
}()) => b)());
|
||||||
|
```
|
||||||
|
UglifyJS may modify the input which in turn may suppress those errors.
|
||||||
|
- Some arithmetic operations with `BigInt` may throw `TypeError`:
|
||||||
|
```javascript
|
||||||
|
1n + 1;
|
||||||
|
// TypeError: can't convert BigInt to number
|
||||||
|
```
|
||||||
|
UglifyJS may modify the input which in turn may suppress those errors.
|
||||||
|
- Some versions of JavaScript will throw `SyntaxError` with the
|
||||||
|
following:
|
||||||
|
```javascript
|
||||||
|
console.log(String.raw`\uFo`);
|
||||||
|
// SyntaxError: Invalid Unicode escape sequence
|
||||||
|
```
|
||||||
|
UglifyJS may modify the input which in turn may suppress those errors.
|
||||||
|
- Some versions of JavaScript will throw `SyntaxError` with the
|
||||||
|
following:
|
||||||
|
```javascript
|
||||||
|
try {} catch (e) {
|
||||||
|
for (var e of []);
|
||||||
|
}
|
||||||
|
// SyntaxError: Identifier 'e' has already been declared
|
||||||
|
```
|
||||||
|
UglifyJS may modify the input which in turn may suppress those errors.
|
||||||
|
- Some versions of Chrome and Node.js will give incorrect results with the
|
||||||
|
following:
|
||||||
|
```javascript
|
||||||
|
console.log({
|
||||||
|
...{
|
||||||
|
set 42(v) {},
|
||||||
|
42: "PASS",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
// Expected: { '42': 'PASS' }
|
||||||
|
// Actual: { '42': undefined }
|
||||||
|
```
|
||||||
|
UglifyJS may modify the input which in turn may suppress those errors.
|
||||||
|
- Later versions of JavaScript will throw `SyntaxError` with the following:
|
||||||
|
```javascript
|
||||||
|
var await;
|
||||||
|
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.
|
||||||
|
- Some versions of Chrome and Node.js will give incorrect results with the
|
||||||
|
following:
|
||||||
|
```javascript
|
||||||
|
console.log({
|
||||||
|
...console,
|
||||||
|
get 42() {
|
||||||
|
return "FAIL";
|
||||||
|
},
|
||||||
|
[42]: "PASS",
|
||||||
|
}[42], {
|
||||||
|
...console,
|
||||||
|
get 42() {
|
||||||
|
return "FAIL";
|
||||||
|
},
|
||||||
|
42: "PASS",
|
||||||
|
}[42]);
|
||||||
|
// Expected: "PASS PASS"
|
||||||
|
// Actual: "PASS 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.
|
||||||
|
- Later versions of Chrome and Node.js will give incorrect results with the
|
||||||
|
following:
|
||||||
|
```javascript
|
||||||
|
try {
|
||||||
|
class A {
|
||||||
|
static 42;
|
||||||
|
static get 42() {}
|
||||||
|
}
|
||||||
|
console.log("PASS");
|
||||||
|
} catch (e) {
|
||||||
|
console.log("FAIL");
|
||||||
|
}
|
||||||
|
// Expected: "PASS"
|
||||||
|
// Actual: "FAIL"
|
||||||
|
```
|
||||||
|
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
|
||||||
|
(async function(a) {
|
||||||
|
(function() {
|
||||||
|
var b = await => console.log("PASS");
|
||||||
|
b();
|
||||||
|
})();
|
||||||
|
})().catch(console.error);
|
||||||
|
// Expected: "PASS"
|
||||||
|
// Actual: SyntaxError: Unexpected reserved word
|
||||||
|
```
|
||||||
|
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
|
||||||
|
try {
|
||||||
|
f();
|
||||||
|
function f() {
|
||||||
|
throw 42;
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.log(typeof f, e);
|
||||||
|
}
|
||||||
|
// Expected: "function 42"
|
||||||
|
// Actual: "undefined 42"
|
||||||
|
```
|
||||||
|
UglifyJS may modify the input which in turn may suppress those errors.
|
||||||
|
- Later versions of JavaScript will throw `SyntaxError` with the following:
|
||||||
|
```javascript
|
||||||
|
"use strict";
|
||||||
|
console.log(function f() {
|
||||||
|
return f = "PASS";
|
||||||
|
}());
|
||||||
|
// Expected: "PASS"
|
||||||
|
// Actual: TypeError: invalid assignment to const 'f'
|
||||||
|
```
|
||||||
|
UglifyJS may modify the input which in turn may suppress those errors.
|
||||||
|
- Adobe ExtendScript will give incorrect results with the following:
|
||||||
|
```javascript
|
||||||
|
alert(true ? "PASS" : false ? "FAIL" : null);
|
||||||
|
// Expected: "PASS"
|
||||||
|
// Actual: "FAIL"
|
||||||
|
```
|
||||||
|
UglifyJS may modify the input which in turn may suppress those errors.
|
||||||
|
- Adobe ExtendScript will give incorrect results with the following:
|
||||||
|
```javascript
|
||||||
|
alert(42 ? null ? "FAIL" : "PASS" : "FAIL");
|
||||||
|
// Expected: "PASS"
|
||||||
|
// Actual: SyntaxError: Expected: :
|
||||||
|
```
|
||||||
|
UglifyJS may modify the input which in turn may suppress those errors.
|
||||||
|
|||||||
201
bin/uglifyjs
201
bin/uglifyjs
@@ -3,14 +3,16 @@
|
|||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
require("../tools/exit");
|
require("../tools/tty");
|
||||||
|
|
||||||
var fs = require("fs");
|
var fs = require("fs");
|
||||||
var info = require("../package.json");
|
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", "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,12 +98,18 @@ 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.",
|
" --expression Parse a single expression, rather than a program.",
|
||||||
|
" --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.",
|
||||||
|
" --module Process input as ES module (implies --toplevel).",
|
||||||
|
" --no-module Process input with improved JavaScript compatibility.",
|
||||||
" --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.",
|
||||||
" --no-rename Disable symbol expansion.",
|
" --no-rename Disable symbol expansion.",
|
||||||
@@ -108,10 +117,15 @@ 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.",
|
||||||
|
" --webkit Support non-standard Safari/Webkit.",
|
||||||
" --wrap <name> Embed everything as a function with “exports” corresponding to “name” globally.",
|
" --wrap <name> Embed everything as a function with “exports” corresponding to “name” globally.",
|
||||||
|
"",
|
||||||
|
"(internal debug use only)",
|
||||||
|
" --in-situ Warning: replaces original source files with minified output.",
|
||||||
" --reduce-test Reduce a standalone test case (assumes cloned repository).",
|
" --reduce-test Reduce a standalone test case (assumes cloned repository).",
|
||||||
].join("\n"));
|
].join("\n"));
|
||||||
}
|
}
|
||||||
@@ -138,12 +152,23 @@ function process_option(name, no_value) {
|
|||||||
case "enclose":
|
case "enclose":
|
||||||
options[name] = read_value();
|
options[name] = read_value();
|
||||||
break;
|
break;
|
||||||
|
case "annotations":
|
||||||
|
case "expression":
|
||||||
|
case "ie":
|
||||||
case "ie8":
|
case "ie8":
|
||||||
case "timings":
|
case "timings":
|
||||||
case "toplevel":
|
case "toplevel":
|
||||||
|
case "v8":
|
||||||
case "validate":
|
case "validate":
|
||||||
|
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;
|
||||||
@@ -176,6 +201,12 @@ function process_option(name, no_value) {
|
|||||||
if (typeof options.mangle != "object") options.mangle = {};
|
if (typeof options.mangle != "object") options.mangle = {};
|
||||||
options.mangle.properties = parse_js(read_value(), options.mangle.properties);
|
options.mangle.properties = parse_js(read_value(), options.mangle.properties);
|
||||||
break;
|
break;
|
||||||
|
case "module":
|
||||||
|
options.module = true;
|
||||||
|
break;
|
||||||
|
case "no-module":
|
||||||
|
options.module = false;
|
||||||
|
break;
|
||||||
case "name-cache":
|
case "name-cache":
|
||||||
nameCache = read_value(true);
|
nameCache = read_value(true);
|
||||||
options.nameCache = JSON.parse(read_file(nameCache, "{}"));
|
options.nameCache = JSON.parse(read_file(nameCache, "{}"));
|
||||||
@@ -192,6 +223,7 @@ function process_option(name, no_value) {
|
|||||||
case "no-rename":
|
case "no-rename":
|
||||||
options.rename = false;
|
options.rename = false;
|
||||||
break;
|
break;
|
||||||
|
case "in-situ":
|
||||||
case "reduce-test":
|
case "reduce-test":
|
||||||
case "self":
|
case "self":
|
||||||
break;
|
break;
|
||||||
@@ -212,21 +244,11 @@ if (specified["beautify"] && specified["output-opts"]) fatal("--beautify cannot
|
|||||||
[ "compress", "mangle" ].forEach(function(name) {
|
[ "compress", "mangle" ].forEach(function(name) {
|
||||||
if (!(name in options)) options[name] = false;
|
if (!(name in options)) options[name] = false;
|
||||||
});
|
});
|
||||||
if (options.mangle && options.mangle.properties) {
|
if (/^ast|spidermonkey$/.test(output)) {
|
||||||
if (options.mangle.properties.domprops) {
|
if (typeof options.output != "object") options.output = {};
|
||||||
delete options.mangle.properties.domprops;
|
options.output.ast = true;
|
||||||
} else {
|
options.output.code = false;
|
||||||
if (typeof options.mangle.properties != "object") options.mangle.properties = {};
|
|
||||||
if (!Array.isArray(options.mangle.properties.reserved)) options.mangle.properties.reserved = [];
|
|
||||||
require("../tools/domprops").forEach(function(name) {
|
|
||||||
UglifyJS.push_uniq(options.mangle.properties.reserved, name);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (output == "ast") options.output = {
|
|
||||||
ast: true,
|
|
||||||
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");
|
||||||
@@ -251,19 +273,48 @@ if (specified["self"]) {
|
|||||||
if (paths.length) UglifyJS.AST_Node.warn("Ignoring input files since --self was passed");
|
if (paths.length) UglifyJS.AST_Node.warn("Ignoring input files since --self was passed");
|
||||||
if (!options.wrap) options.wrap = "UglifyJS";
|
if (!options.wrap) options.wrap = "UglifyJS";
|
||||||
paths = UglifyJS.FILES;
|
paths = UglifyJS.FILES;
|
||||||
|
} else if (paths.length) {
|
||||||
|
paths = simple_glob(paths);
|
||||||
}
|
}
|
||||||
if (paths.length) {
|
if (specified["in-situ"]) {
|
||||||
simple_glob(paths).forEach(function(name) {
|
if (output && output != "spidermonkey" || specified["reduce-test"] || specified["self"]) {
|
||||||
|
fatal("incompatible options specified");
|
||||||
|
}
|
||||||
|
paths.forEach(function(name) {
|
||||||
|
print(name);
|
||||||
|
if (/^ast|spidermonkey$/.test(name)) fatal("invalid file name specified");
|
||||||
|
files = {};
|
||||||
|
files[convert_path(name)] = read_file(name);
|
||||||
|
output = name;
|
||||||
|
run();
|
||||||
|
});
|
||||||
|
} else if (paths.length) {
|
||||||
|
paths.forEach(function(name) {
|
||||||
files[convert_path(name)] = read_file(name);
|
files[convert_path(name)] = read_file(name);
|
||||||
});
|
});
|
||||||
run();
|
run();
|
||||||
} else {
|
} else {
|
||||||
|
var timerId = process.stdin.isTTY && process.argv.length < 3 && setTimeout(function() {
|
||||||
|
print_error("Waiting for input... (use `--help` to print usage information)");
|
||||||
|
}, 1500);
|
||||||
var chunks = [];
|
var chunks = [];
|
||||||
process.stdin.setEncoding("utf8");
|
process.stdin.setEncoding("utf8");
|
||||||
process.stdin.on("data", function(chunk) {
|
process.stdin.once("data", function() {
|
||||||
|
clearTimeout(timerId);
|
||||||
|
}).on("data", process.stdin.isTTY ? function(chunk) {
|
||||||
|
// emulate console input termination via Ctrl+D / Ctrl+Z
|
||||||
|
var match = /[\x04\x1a]\r?\n?$/.exec(chunk);
|
||||||
|
if (match) {
|
||||||
|
chunks.push(chunk.slice(0, -match[0].length));
|
||||||
|
process.stdin.pause();
|
||||||
|
process.stdin.emit("end");
|
||||||
|
} else {
|
||||||
chunks.push(chunk);
|
chunks.push(chunk);
|
||||||
}).on("end", function() {
|
}
|
||||||
files = [ chunks.join("") ];
|
} : function(chunk) {
|
||||||
|
chunks.push(chunk);
|
||||||
|
}).once("end", function() {
|
||||||
|
files = { STDIN: chunks.join("") };
|
||||||
run();
|
run();
|
||||||
});
|
});
|
||||||
process.stdin.resume();
|
process.stdin.resume();
|
||||||
@@ -276,19 +327,51 @@ function convert_ast(fn) {
|
|||||||
function run() {
|
function run() {
|
||||||
var content = options.sourceMap && options.sourceMap.content;
|
var content = options.sourceMap && options.sourceMap.content;
|
||||||
if (content && content != "inline") {
|
if (content && content != "inline") {
|
||||||
UglifyJS.AST_Node.info("Using input source map: " + content);
|
UglifyJS.AST_Node.info("Using input source map: {content}", {
|
||||||
|
content : content,
|
||||||
|
});
|
||||||
options.sourceMap.content = read_file(content, content);
|
options.sourceMap.content = read_file(content, content);
|
||||||
}
|
}
|
||||||
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]);
|
||||||
@@ -356,16 +439,16 @@ function run() {
|
|||||||
}
|
}
|
||||||
print(JSON.stringify(result.ast, function(key, value) {
|
print(JSON.stringify(result.ast, function(key, value) {
|
||||||
if (value) switch (key) {
|
if (value) switch (key) {
|
||||||
case "thedef":
|
|
||||||
return symdef(value);
|
|
||||||
case "enclosed":
|
case "enclosed":
|
||||||
return value.length ? value.map(symdef) : undefined;
|
return value.length ? value.map(symdef) : undefined;
|
||||||
case "variables":
|
|
||||||
case "functions":
|
case "functions":
|
||||||
case "globals":
|
case "globals":
|
||||||
|
case "variables":
|
||||||
return value.size() ? value.map(symdef) : undefined;
|
return value.size() ? value.map(symdef) : undefined;
|
||||||
|
case "thedef":
|
||||||
|
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) {
|
||||||
@@ -380,16 +463,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);
|
||||||
@@ -412,16 +498,20 @@ function fatal(message) {
|
|||||||
|
|
||||||
// A file glob function that only supports "*" and "?" wildcards in the basename.
|
// A file glob function that only supports "*" and "?" wildcards in the basename.
|
||||||
// Example: "foo/bar/*baz??.*.js"
|
// Example: "foo/bar/*baz??.*.js"
|
||||||
// Argument `glob` may be a string or an array of strings.
|
// Argument `paths` must be an array of strings.
|
||||||
// Returns an array of strings. Garbage in, garbage out.
|
// Returns an array of strings. Garbage in, garbage out.
|
||||||
function simple_glob(glob) {
|
function simple_glob(paths) {
|
||||||
if (Array.isArray(glob)) {
|
return paths.reduce(function(paths, glob) {
|
||||||
return [].concat.apply([], glob.map(simple_glob));
|
if (/\*|\?/.test(glob)) {
|
||||||
}
|
|
||||||
if (glob.match(/\*|\?/)) {
|
|
||||||
var dir = path.dirname(glob);
|
var dir = path.dirname(glob);
|
||||||
try {
|
try {
|
||||||
var entries = fs.readdirSync(dir);
|
var entries = fs.readdirSync(dir).filter(function(name) {
|
||||||
|
try {
|
||||||
|
return fs.statSync(path.join(dir, name)).isFile();
|
||||||
|
} catch (ex) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
} catch (ex) {}
|
} catch (ex) {}
|
||||||
if (entries) {
|
if (entries) {
|
||||||
var pattern = "^" + path.basename(glob)
|
var pattern = "^" + path.basename(glob)
|
||||||
@@ -430,15 +520,20 @@ function simple_glob(glob) {
|
|||||||
.replace(/\?/g, "[^/\\\\]") + "$";
|
.replace(/\?/g, "[^/\\\\]") + "$";
|
||||||
var mod = process.platform === "win32" ? "i" : "";
|
var mod = process.platform === "win32" ? "i" : "";
|
||||||
var rx = new RegExp(pattern, mod);
|
var rx = new RegExp(pattern, mod);
|
||||||
var results = entries.sort().filter(function(name) {
|
var results = entries.filter(function(name) {
|
||||||
return rx.test(name);
|
return rx.test(name);
|
||||||
}).map(function(name) {
|
}).sort().map(function(name) {
|
||||||
return path.join(dir, name);
|
return path.join(dir, name);
|
||||||
});
|
});
|
||||||
if (results.length) return results;
|
if (results.length) {
|
||||||
|
[].push.apply(paths, results);
|
||||||
|
return paths;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return [ glob ];
|
}
|
||||||
|
paths.push(glob);
|
||||||
|
return paths;
|
||||||
|
}, []);
|
||||||
}
|
}
|
||||||
|
|
||||||
function read_file(path, default_value) {
|
function read_file(path, default_value) {
|
||||||
@@ -451,7 +546,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
|
||||||
@@ -491,8 +586,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) {
|
||||||
|
|||||||
1514
lib/ast.js
1514
lib/ast.js
File diff suppressed because it is too large
Load Diff
11279
lib/compress.js
11279
lib/compress.js
File diff suppressed because it is too large
Load Diff
@@ -28,12 +28,14 @@ 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]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
AST_Node.warn("inline source map not found: " + name);
|
AST_Node.warn("inline source map not found: {name}", {
|
||||||
|
name: name,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function parse_source_map(content) {
|
function parse_source_map(content) {
|
||||||
@@ -45,14 +47,12 @@ function parse_source_map(content) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function set_shorthand(name, options, keys) {
|
function set_shorthand(name, options, keys) {
|
||||||
if (options[name]) {
|
|
||||||
keys.forEach(function(key) {
|
keys.forEach(function(key) {
|
||||||
if (options[key]) {
|
if (options[key]) {
|
||||||
if (typeof options[key] != "object") options[key] = {};
|
if (typeof options[key] != "object") options[key] = {};
|
||||||
if (!(name in options[key])) options[key][name] = options[name];
|
if (!(name in options[key])) options[key][name] = options[name];
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function init_cache(cache) {
|
function init_cache(cache) {
|
||||||
@@ -73,42 +73,55 @@ 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,
|
||||||
|
expression: false,
|
||||||
|
ie: false,
|
||||||
ie8: false,
|
ie8: false,
|
||||||
|
keep_fargs: false,
|
||||||
keep_fnames: false,
|
keep_fnames: false,
|
||||||
mangle: {},
|
mangle: {},
|
||||||
|
module: undefined,
|
||||||
nameCache: null,
|
nameCache: null,
|
||||||
output: {},
|
output: {},
|
||||||
parse: {},
|
parse: {},
|
||||||
rename: undefined,
|
rename: undefined,
|
||||||
sourceMap: false,
|
sourceMap: false,
|
||||||
timings: false,
|
timings: false,
|
||||||
toplevel: false,
|
toplevel: options && !options["expression"] && options["module"] ? true : undefined,
|
||||||
|
v8: false,
|
||||||
validate: false,
|
validate: false,
|
||||||
warnings: false,
|
warnings: false,
|
||||||
|
webkit: false,
|
||||||
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.expression) set_shorthand("expression", options, [ "compress", "parse" ]);
|
||||||
if (options.rename === undefined) {
|
if (options.ie8) options.ie = options.ie || options.ie8;
|
||||||
options.rename = options.compress && options.mangle;
|
if (options.ie) set_shorthand("ie", options, [ "compress", "mangle", "output", "rename" ]);
|
||||||
}
|
if (options.keep_fargs) set_shorthand("keep_fargs", options, [ "compress", "mangle", "rename" ]);
|
||||||
set_shorthand("ie8", options, [ "compress", "mangle", "output" ]);
|
if (options.keep_fnames) set_shorthand("keep_fnames", options, [ "compress", "mangle", "rename" ]);
|
||||||
set_shorthand("keep_fnames", options, [ "compress", "mangle" ]);
|
if (options.module === undefined && !options.ie) options.module = true;
|
||||||
set_shorthand("toplevel", options, [ "compress", "mangle" ]);
|
if (options.module) set_shorthand("module", options, [ "compress", "parse" ]);
|
||||||
|
if (options.toplevel !== undefined) set_shorthand("toplevel", options, [ "compress", "mangle", "rename" ]);
|
||||||
|
if (options.v8) set_shorthand("v8", options, [ "mangle", "output", "rename" ]);
|
||||||
|
if (options.webkit) set_shorthand("webkit", options, [ "compress", "mangle", "output", "rename" ]);
|
||||||
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: [],
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
|
v8: false,
|
||||||
|
webkit: false,
|
||||||
}, true);
|
}, true);
|
||||||
if (options.mangle.properties) {
|
if (options.mangle.properties) {
|
||||||
if (typeof options.mangle.properties != "object") {
|
if (typeof options.mangle.properties != "object") {
|
||||||
@@ -126,6 +139,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,
|
||||||
@@ -142,13 +156,11 @@ function minify(files, options) {
|
|||||||
}, options.warnings == "verbose");
|
}, options.warnings == "verbose");
|
||||||
if (timings) timings.parse = Date.now();
|
if (timings) timings.parse = Date.now();
|
||||||
var toplevel;
|
var toplevel;
|
||||||
if (files instanceof AST_Toplevel) {
|
options.parse = options.parse || {};
|
||||||
|
if (files instanceof AST_Node) {
|
||||||
toplevel = files;
|
toplevel = files;
|
||||||
} else {
|
} else {
|
||||||
if (typeof files == "string") {
|
if (typeof files == "string") files = [ files ];
|
||||||
files = [ files ];
|
|
||||||
}
|
|
||||||
options.parse = options.parse || {};
|
|
||||||
options.parse.toplevel = null;
|
options.parse.toplevel = null;
|
||||||
var source_map_content = options.sourceMap && options.sourceMap.content;
|
var source_map_content = options.sourceMap && options.sourceMap.content;
|
||||||
if (typeof source_map_content == "string" && source_map_content != "inline") {
|
if (typeof source_map_content == "string" && source_map_content != "inline") {
|
||||||
@@ -160,17 +172,14 @@ function minify(files, options) {
|
|||||||
options.parse.toplevel = toplevel = parse(files[name], options.parse);
|
options.parse.toplevel = toplevel = parse(files[name], options.parse);
|
||||||
if (source_map_content == "inline") {
|
if (source_map_content == "inline") {
|
||||||
var inlined_content = read_source_map(name, toplevel);
|
var inlined_content = read_source_map(name, toplevel);
|
||||||
if (inlined_content) {
|
if (inlined_content) options.sourceMap.orig[name] = parse_source_map(inlined_content);
|
||||||
options.sourceMap.orig[name] = parse_source_map(inlined_content);
|
|
||||||
}
|
|
||||||
} else if (source_map_content) {
|
} else if (source_map_content) {
|
||||||
options.sourceMap.orig[name] = source_map_content;
|
options.sourceMap.orig[name] = source_map_content;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (quoted_props) {
|
if (options.parse.expression) toplevel = toplevel.wrap_expression();
|
||||||
reserve_quoted_keys(toplevel, quoted_props);
|
if (quoted_props) reserve_quoted_keys(toplevel, quoted_props);
|
||||||
}
|
|
||||||
[ "enclose", "wrap" ].forEach(function(action) {
|
[ "enclose", "wrap" ].forEach(function(action) {
|
||||||
var option = options[action];
|
var option = options[action];
|
||||||
if (!option) return;
|
if (!option) return;
|
||||||
@@ -181,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) {
|
||||||
@@ -197,30 +206,34 @@ function minify(files, options) {
|
|||||||
toplevel.mangle_names(options.mangle);
|
toplevel.mangle_names(options.mangle);
|
||||||
}
|
}
|
||||||
if (timings) timings.properties = Date.now();
|
if (timings) timings.properties = Date.now();
|
||||||
|
if (quoted_props) reserve_quoted_keys(toplevel, quoted_props);
|
||||||
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 (options.parse.expression) toplevel = toplevel.unwrap_expression();
|
||||||
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*$/, "");
|
||||||
@@ -258,6 +271,7 @@ function minify(files, options) {
|
|||||||
} catch (ex) {
|
} catch (ex) {
|
||||||
return { error: ex };
|
return { error: ex };
|
||||||
} finally {
|
} finally {
|
||||||
|
AST_Node.log_function();
|
||||||
AST_Node.disable_validation();
|
AST_Node.disable_validation();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
1071
lib/mozilla-ast.js
1071
lib/mozilla-ast.js
File diff suppressed because it is too large
Load Diff
1231
lib/output.js
1231
lib/output.js
File diff suppressed because it is too large
Load Diff
1677
lib/parse.js
1677
lib/parse.js
File diff suppressed because it is too large
Load Diff
@@ -43,10 +43,11 @@
|
|||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
var builtins = function() {
|
function get_builtins() {
|
||||||
var names = [];
|
var names = new Dictionary();
|
||||||
// NaN will be included due to Number.NaN
|
// constants
|
||||||
[
|
[
|
||||||
|
"NaN",
|
||||||
"null",
|
"null",
|
||||||
"true",
|
"true",
|
||||||
"false",
|
"false",
|
||||||
@@ -54,35 +55,85 @@ var builtins = function() {
|
|||||||
"-Infinity",
|
"-Infinity",
|
||||||
"undefined",
|
"undefined",
|
||||||
].forEach(add);
|
].forEach(add);
|
||||||
|
// global functions
|
||||||
[
|
[
|
||||||
Array,
|
"encodeURI",
|
||||||
Boolean,
|
"encodeURIComponent",
|
||||||
Date,
|
"escape",
|
||||||
Error,
|
"eval",
|
||||||
Function,
|
"decodeURI",
|
||||||
Math,
|
"decodeURIComponent",
|
||||||
Number,
|
"isFinite",
|
||||||
Object,
|
"isNaN",
|
||||||
RegExp,
|
"parseFloat",
|
||||||
String,
|
"parseInt",
|
||||||
].forEach(function(ctor) {
|
"unescape",
|
||||||
|
].forEach(add);
|
||||||
|
// global constructors & objects
|
||||||
|
var global = Function("return this")();
|
||||||
|
[
|
||||||
|
"Array",
|
||||||
|
"ArrayBuffer",
|
||||||
|
"Atomics",
|
||||||
|
"BigInt",
|
||||||
|
"Boolean",
|
||||||
|
"console",
|
||||||
|
"DataView",
|
||||||
|
"Date",
|
||||||
|
"Error",
|
||||||
|
"Function",
|
||||||
|
"Int8Array",
|
||||||
|
"Intl",
|
||||||
|
"JSON",
|
||||||
|
"Map",
|
||||||
|
"Math",
|
||||||
|
"Number",
|
||||||
|
"Object",
|
||||||
|
"Promise",
|
||||||
|
"Proxy",
|
||||||
|
"Reflect",
|
||||||
|
"RegExp",
|
||||||
|
"Set",
|
||||||
|
"String",
|
||||||
|
"Symbol",
|
||||||
|
"WebAssembly",
|
||||||
|
].forEach(function(name) {
|
||||||
|
add(name);
|
||||||
|
var ctor = global[name];
|
||||||
|
if (!ctor) return;
|
||||||
Object.getOwnPropertyNames(ctor).map(add);
|
Object.getOwnPropertyNames(ctor).map(add);
|
||||||
if (ctor.prototype) {
|
if (typeof ctor != "function") return;
|
||||||
|
if (ctor.__proto__) Object.getOwnPropertyNames(ctor.__proto__).map(add);
|
||||||
|
if (ctor.prototype) Object.getOwnPropertyNames(ctor.prototype).map(add);
|
||||||
|
try {
|
||||||
Object.getOwnPropertyNames(new ctor()).map(add);
|
Object.getOwnPropertyNames(new ctor()).map(add);
|
||||||
Object.getOwnPropertyNames(ctor.prototype).map(add);
|
} catch (e) {
|
||||||
|
try {
|
||||||
|
Object.getOwnPropertyNames(ctor()).map(add);
|
||||||
|
} catch (e) {}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return makePredicate(names);
|
return (get_builtins = function() {
|
||||||
|
return names.clone();
|
||||||
|
})();
|
||||||
|
|
||||||
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_ObjectKeyVal) {
|
if (node instanceof AST_ClassProperty
|
||||||
if (node.quote) add(node.key);
|
|| node instanceof AST_DestructuredKeyVal
|
||||||
|
|| node instanceof AST_ObjectProperty) {
|
||||||
|
if (node.key instanceof AST_Node) {
|
||||||
|
addStrings(node.key, add);
|
||||||
|
} else if (node.start && node.start.quote) {
|
||||||
|
add(node.key);
|
||||||
|
}
|
||||||
|
} else if (node instanceof AST_Dot) {
|
||||||
|
if (node.quoted) add(node.property);
|
||||||
} else if (node instanceof AST_Sub) {
|
} else if (node instanceof AST_Sub) {
|
||||||
addStrings(node.property, add);
|
addStrings(node.property, add);
|
||||||
}
|
}
|
||||||
@@ -109,14 +160,18 @@ function mangle_properties(ast, options) {
|
|||||||
builtins: false,
|
builtins: false,
|
||||||
cache: null,
|
cache: null,
|
||||||
debug: false,
|
debug: false,
|
||||||
|
domprops: false,
|
||||||
keep_quoted: false,
|
keep_quoted: false,
|
||||||
regex: null,
|
regex: null,
|
||||||
reserved: null,
|
reserved: null,
|
||||||
}, true);
|
}, true);
|
||||||
|
|
||||||
var reserved = Object.create(options.builtins ? null : builtins);
|
var reserved = options.builtins ? new Dictionary() : get_builtins();
|
||||||
|
if (!options.domprops && typeof domprops !== "undefined") domprops.forEach(function(name) {
|
||||||
|
reserved.set(name, true);
|
||||||
|
});
|
||||||
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 +179,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();
|
||||||
@@ -133,20 +188,18 @@ function mangle_properties(ast, options) {
|
|||||||
var regex = options.regex;
|
var regex = options.regex;
|
||||||
|
|
||||||
// note debug is either false (disabled), or a string of the debug suffix to use (enabled).
|
// note debug is either false (disabled), or a string of the debug suffix to use (enabled).
|
||||||
// note debug may be enabled as an empty string, which is falsey. Also treat passing 'true'
|
// note debug may be enabled as an empty string, which is falsy. Also treat passing 'true'
|
||||||
// the same as passing an empty string.
|
// the same as passing an empty string.
|
||||||
var debug = options.debug !== false;
|
var debug = options.debug !== false;
|
||||||
var debug_suffix;
|
var debug_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) {
|
||||||
if (node instanceof AST_Binary) {
|
if (node.TYPE == "Call") {
|
||||||
if (node.operator == "in") addStrings(node.left, add);
|
|
||||||
} else if (node.TYPE == "Call") {
|
|
||||||
var exp = node.expression;
|
var exp = node.expression;
|
||||||
if (exp instanceof AST_Dot) switch (exp.property) {
|
if (exp instanceof AST_Dot) switch (exp.property) {
|
||||||
case "defineProperty":
|
case "defineProperty":
|
||||||
@@ -163,15 +216,18 @@ function mangle_properties(ast, options) {
|
|||||||
addStrings(node.args[0], add);
|
addStrings(node.args[0], add);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else if (node instanceof AST_Dot) {
|
} else if (node instanceof AST_ClassProperty
|
||||||
add(node.property);
|
|| node instanceof AST_DestructuredKeyVal
|
||||||
} else if (node instanceof AST_ObjectKeyVal) {
|
|| node instanceof AST_ObjectProperty) {
|
||||||
|
if (node.key instanceof AST_Node) {
|
||||||
|
addStrings(node.key, add);
|
||||||
|
} else {
|
||||||
add(node.key);
|
add(node.key);
|
||||||
} else if (node instanceof AST_ObjectProperty) {
|
}
|
||||||
// setter or getter, since KeyVal is handled above
|
} else if (node instanceof AST_Dot) {
|
||||||
add(node.key.name);
|
if (is_lhs(node, this.parent())) add(node.property);
|
||||||
} else if (node instanceof AST_Sub) {
|
} else if (node instanceof AST_Sub) {
|
||||||
addStrings(node.property, add);
|
if (is_lhs(node, this.parent())) addStrings(node.property, add);
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
|
||||||
@@ -196,13 +252,16 @@ function mangle_properties(ast, options) {
|
|||||||
mangleStrings(node.args[0]);
|
mangleStrings(node.args[0]);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
} else if (node instanceof AST_ClassProperty
|
||||||
|
|| node instanceof AST_DestructuredKeyVal
|
||||||
|
|| node instanceof AST_ObjectProperty) {
|
||||||
|
if (node.key instanceof AST_Node) {
|
||||||
|
mangleStrings(node.key);
|
||||||
|
} else {
|
||||||
|
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_ObjectKeyVal) {
|
|
||||||
node.key = mangle(node.key);
|
|
||||||
} else if (node instanceof AST_ObjectProperty) {
|
|
||||||
// setter or getter
|
|
||||||
node.key.name = mangle(node.key.name);
|
|
||||||
} else if (node instanceof AST_Sub) {
|
} else if (node instanceof AST_Sub) {
|
||||||
if (!options.keep_quoted) mangleStrings(node.property);
|
if (!options.keep_quoted) mangleStrings(node.property);
|
||||||
}
|
}
|
||||||
@@ -211,30 +270,34 @@ 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)) {
|
||||||
if (regex && !regex.test(name)) return false;
|
AST_Node.info("Preserving reserved property {this}", name);
|
||||||
return cache.has(name) || names_to_mangle[name];
|
return false;
|
||||||
|
}
|
||||||
|
if (regex && !regex.test(name)) {
|
||||||
|
AST_Node.info("Preserving excluded property {this}", name);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
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) {
|
||||||
// debug mode: use a prefix and suffix to preserve readability, e.g. o.foo -> o._$foo$NNN_.
|
// debug mode: use a prefix and suffix to preserve readability, e.g. o.foo ---> o._$foo$NNN_.
|
||||||
var debug_mangled = "_$" + name + "$" + debug_suffix + "_";
|
var debug_mangled = "_$" + name + "$" + debug_suffix + "_";
|
||||||
if (can_mangle(debug_mangled)) mangled = debug_mangled;
|
if (can_mangle(debug_mangled)) mangled = debug_mangled;
|
||||||
}
|
}
|
||||||
@@ -242,14 +305,19 @@ 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);
|
||||||
}
|
}
|
||||||
|
AST_Node.info("Mapping property {name} to {mangled}", {
|
||||||
|
mangled: mangled,
|
||||||
|
name: name,
|
||||||
|
});
|
||||||
return mangled;
|
return mangled;
|
||||||
}
|
}
|
||||||
|
|
||||||
function mangleStrings(node) {
|
function mangleStrings(node) {
|
||||||
if (node instanceof AST_Sequence) {
|
if (node instanceof AST_Sequence) {
|
||||||
mangleStrings(node.expressions.tail_node());
|
mangleStrings(node.tail_node());
|
||||||
} else if (node instanceof AST_String) {
|
} else if (node instanceof AST_String) {
|
||||||
node.value = mangle(node.value);
|
node.value = mangle(node.value);
|
||||||
} else if (node instanceof AST_Conditional) {
|
} else if (node instanceof AST_Conditional) {
|
||||||
|
|||||||
501
lib/scope.js
501
lib/scope.js
@@ -44,18 +44,18 @@
|
|||||||
"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.global = false;
|
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.init = init;
|
this.init = init;
|
||||||
this.lambda = orig instanceof AST_SymbolLambda;
|
|
||||||
this.mangled_name = null;
|
this.mangled_name = null;
|
||||||
this.name = orig.name;
|
this.name = orig.name;
|
||||||
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 = {
|
||||||
@@ -64,56 +64,132 @@ SymbolDef.prototype = {
|
|||||||
this.references.forEach(fn);
|
this.references.forEach(fn);
|
||||||
},
|
},
|
||||||
mangle: function(options) {
|
mangle: function(options) {
|
||||||
var cache = options.cache && options.cache.props;
|
if (this.mangled_name) return;
|
||||||
if (this.global && cache && cache.has(this.name)) {
|
var cache = this.global && options.cache && options.cache.props;
|
||||||
|
if (cache && cache.has(this.name)) {
|
||||||
this.mangled_name = cache.get(this.name);
|
this.mangled_name = cache.get(this.name);
|
||||||
} else if (!this.mangled_name && !this.unmangleable(options)) {
|
} else if (!this.unmangleable(options)) {
|
||||||
var def;
|
var def = this.redefined();
|
||||||
if (def = this.redefined()) {
|
if (def) {
|
||||||
this.mangled_name = def.mangled_name || def.name;
|
this.mangled_name = def.mangled_name || def.name;
|
||||||
} else {
|
} else {
|
||||||
this.mangled_name = next_mangled_name(this.scope, options, this);
|
this.mangled_name = next_mangled_name(this, options);
|
||||||
}
|
|
||||||
if (this.global && cache) {
|
|
||||||
cache.set(this.name, this.mangled_name);
|
|
||||||
}
|
}
|
||||||
|
if (cache) cache.set(this.name, this.mangled_name);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
redefined: function() {
|
redefined: function() {
|
||||||
return this.defun && this.defun.variables.get(this.name);
|
var self = this;
|
||||||
|
var scope = self.defun;
|
||||||
|
if (!scope) return;
|
||||||
|
var name = self.name;
|
||||||
|
var def = scope.variables.get(name)
|
||||||
|
|| scope instanceof AST_Toplevel && scope.globals.get(name)
|
||||||
|
|| self.orig[0] instanceof AST_SymbolConst && find_if(function(def) {
|
||||||
|
return def.name == name;
|
||||||
|
}, scope.enclosed);
|
||||||
|
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.undeclared
|
if (this.undeclared) return true;
|
||||||
|| !options.eval && this.scope.pinned()
|
if (!options.eval && this.scope.pinned()) return true;
|
||||||
|| options.keep_fnames
|
if (options.keep_fargs && is_funarg(this)) return true;
|
||||||
&& (this.orig[0] instanceof AST_SymbolLambda
|
if (options.keep_fnames) {
|
||||||
|| this.orig[0] instanceof AST_SymbolDefun);
|
var sym = this.orig[0];
|
||||||
|
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 ++ --");
|
||||||
|
|
||||||
|
function is_lhs(node, parent) {
|
||||||
|
if (parent instanceof AST_Assign) return parent.left === node && node;
|
||||||
|
if (parent instanceof AST_DefaultValue) return parent.name === node && node;
|
||||||
|
if (parent instanceof AST_Destructured) return node;
|
||||||
|
if (parent instanceof AST_DestructuredKeyVal) return node;
|
||||||
|
if (parent instanceof AST_ForEnumeration) return parent.init === node && node;
|
||||||
|
if (parent instanceof AST_Unary) return unary_side_effects[parent.operator] && parent.expression;
|
||||||
|
}
|
||||||
|
|
||||||
AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
|
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
|
||||||
var self = this;
|
var self = this;
|
||||||
var defun = null;
|
var defun = null;
|
||||||
|
var exported = false;
|
||||||
var next_def_id = 0;
|
var next_def_id = 0;
|
||||||
var scope = self.parent_scope = null;
|
var scope = self.parent_scope = null;
|
||||||
var tw = new TreeWalker(function(node, descend) {
|
var tw = new TreeWalker(function(node, descend) {
|
||||||
if (node instanceof AST_Defun) {
|
if (node instanceof AST_DefClass) {
|
||||||
|
var save_exported = exported;
|
||||||
|
exported = tw.parent() instanceof AST_ExportDeclaration;
|
||||||
node.name.walk(tw);
|
node.name.walk(tw);
|
||||||
|
exported = save_exported;
|
||||||
|
walk_scope(function() {
|
||||||
|
if (node.extends) node.extends.walk(tw);
|
||||||
|
node.properties.forEach(function(prop) {
|
||||||
|
prop.walk(tw);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (node instanceof AST_Definitions) {
|
||||||
|
var save_exported = exported;
|
||||||
|
exported = tw.parent() instanceof AST_ExportDeclaration;
|
||||||
|
descend();
|
||||||
|
exported = save_exported;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (node instanceof AST_LambdaDefinition) {
|
||||||
|
var save_exported = exported;
|
||||||
|
exported = tw.parent() instanceof AST_ExportDeclaration;
|
||||||
|
node.name.walk(tw);
|
||||||
|
exported = save_exported;
|
||||||
walk_scope(function() {
|
walk_scope(function() {
|
||||||
node.argnames.forEach(function(argname) {
|
node.argnames.forEach(function(argname) {
|
||||||
argname.walk(tw);
|
argname.walk(tw);
|
||||||
});
|
});
|
||||||
|
if (node.rest) node.rest.walk(tw);
|
||||||
walk_body(node, tw);
|
walk_body(node, tw);
|
||||||
});
|
});
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if (node instanceof AST_Switch) {
|
||||||
|
node.expression.walk(tw);
|
||||||
|
walk_scope(function() {
|
||||||
|
walk_body(node, tw);
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (node instanceof AST_SwitchBranch) {
|
||||||
|
node.init_vars(scope);
|
||||||
|
descend();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
if (node instanceof AST_Try) {
|
if (node instanceof AST_Try) {
|
||||||
walk_scope(function() {
|
walk_scope(function() {
|
||||||
walk_body(node, tw);
|
walk_body(node, tw);
|
||||||
@@ -122,10 +198,6 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
|
|||||||
if (node.bfinally) node.bfinally.walk(tw);
|
if (node.bfinally) node.bfinally.walk(tw);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (node instanceof AST_BlockScope) {
|
|
||||||
walk_scope(descend);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (node instanceof AST_With) {
|
if (node instanceof AST_With) {
|
||||||
var s = scope;
|
var s = scope;
|
||||||
do {
|
do {
|
||||||
@@ -133,7 +205,12 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
|
|||||||
if (s.uses_with) break;
|
if (s.uses_with) break;
|
||||||
s.uses_with = true;
|
s.uses_with = true;
|
||||||
} while (s = s.parent_scope);
|
} while (s = s.parent_scope);
|
||||||
return;
|
walk_scope(descend);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (node instanceof AST_BlockScope) {
|
||||||
|
walk_scope(descend);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
if (node instanceof AST_Symbol) {
|
if (node instanceof AST_Symbol) {
|
||||||
node.scope = scope;
|
node.scope = scope;
|
||||||
@@ -144,18 +221,24 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
|
|||||||
}
|
}
|
||||||
if (node instanceof AST_SymbolCatch) {
|
if (node instanceof AST_SymbolCatch) {
|
||||||
scope.def_variable(node).defun = defun;
|
scope.def_variable(node).defun = defun;
|
||||||
|
} else if (node instanceof AST_SymbolConst) {
|
||||||
|
var def = scope.def_variable(node);
|
||||||
|
def.defun = defun;
|
||||||
|
if (exported) def.exported = true;
|
||||||
} else if (node instanceof AST_SymbolDefun) {
|
} else if (node instanceof AST_SymbolDefun) {
|
||||||
defun.def_function(node, tw.parent());
|
var def = defun.def_function(node, tw.parent());
|
||||||
entangle(defun, scope);
|
if (exported) def.exported = true;
|
||||||
} 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) {
|
||||||
|
var def = scope.def_variable(node);
|
||||||
|
if (exported) def.exported = true;
|
||||||
} else if (node instanceof AST_SymbolVar) {
|
} else if (node instanceof AST_SymbolVar) {
|
||||||
defun.def_variable(node, null);
|
var def = defun.def_variable(node, node instanceof AST_SymbolImport ? undefined : null);
|
||||||
entangle(defun, scope);
|
if (exported) def.exported = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
function walk_scope(descend) {
|
function walk_scope(descend) {
|
||||||
@@ -168,16 +251,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);
|
|
||||||
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);
|
||||||
@@ -186,19 +259,91 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
|
|||||||
|
|
||||||
// pass 2: find back references and eval
|
// pass 2: find back references and eval
|
||||||
self.globals = new Dictionary();
|
self.globals = new Dictionary();
|
||||||
|
var in_arg = [];
|
||||||
var tw = new TreeWalker(function(node) {
|
var tw = new TreeWalker(function(node) {
|
||||||
|
if (node instanceof AST_Catch) {
|
||||||
|
if (!(node.argname instanceof AST_Destructured)) return;
|
||||||
|
in_arg.push(node);
|
||||||
|
node.argname.walk(tw);
|
||||||
|
in_arg.pop();
|
||||||
|
walk_body(node, tw);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (node instanceof AST_Lambda) {
|
||||||
|
in_arg.push(node);
|
||||||
|
if (node.name) node.name.walk(tw);
|
||||||
|
node.argnames.forEach(function(argname) {
|
||||||
|
argname.walk(tw);
|
||||||
|
});
|
||||||
|
if (node.rest) node.rest.walk(tw);
|
||||||
|
in_arg.pop();
|
||||||
|
walk_lambda(node, tw);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
if (node instanceof AST_LoopControl) {
|
if (node instanceof AST_LoopControl) {
|
||||||
if (node.label) node.label.thedef.references.push(node);
|
if (node.label) node.label.thedef.references.push(node);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if (node instanceof AST_SymbolDeclaration) {
|
||||||
|
var def = node.definition();
|
||||||
|
def.preinit = def.references.length;
|
||||||
|
if (node instanceof AST_SymbolCatch) {
|
||||||
|
// ensure mangling works if `catch` reuses a scope variable
|
||||||
|
var redef = def.redefined();
|
||||||
|
if (redef) for (var s = node.scope; s; s = s.parent_scope) {
|
||||||
|
if (!push_uniq(s.enclosed, redef)) break;
|
||||||
|
if (s === redef.scope) break;
|
||||||
|
}
|
||||||
|
} else if (node instanceof AST_SymbolConst) {
|
||||||
|
// ensure compression works if `const` reuses a scope variable
|
||||||
|
var redef = def.redefined();
|
||||||
|
if (redef) redef.const_redefs = true;
|
||||||
|
} 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;
|
||||||
|
var parent = node instanceof AST_SymbolVar && tw.parent();
|
||||||
|
if (parent instanceof AST_VarDef && !parent.value) return true;
|
||||||
|
var sym = node.scope.resolve().find_variable("arguments");
|
||||||
|
if (sym && is_arguments(sym)) sym.scope.uses_arguments = 3;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
if (node instanceof AST_SymbolRef) {
|
if (node instanceof AST_SymbolRef) {
|
||||||
var name = node.name;
|
var name = node.name;
|
||||||
var sym = node.scope.find_variable(name);
|
var sym = node.scope.find_variable(name);
|
||||||
|
for (var i = in_arg.length; i > 0 && sym;) {
|
||||||
|
i = in_arg.lastIndexOf(sym.scope, i - 1);
|
||||||
|
if (i < 0) break;
|
||||||
|
var decl = sym.orig[0];
|
||||||
|
if (decl instanceof AST_SymbolCatch
|
||||||
|
|| decl instanceof AST_SymbolFunarg
|
||||||
|
|| decl instanceof AST_SymbolLambda) {
|
||||||
|
node.in_arg = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
sym = sym.scope.parent_scope.find_variable(name);
|
||||||
|
}
|
||||||
if (!sym) {
|
if (!sym) {
|
||||||
sym = self.def_global(node);
|
sym = self.def_global(node);
|
||||||
} else if (name == "arguments" && sym.scope instanceof AST_Lambda) {
|
} else if (name == "arguments" && is_arguments(sym)) {
|
||||||
|
var parent = tw.parent();
|
||||||
|
if (is_lhs(node, parent)) {
|
||||||
|
sym.scope.uses_arguments = 3;
|
||||||
|
} else if (sym.scope.uses_arguments < 2
|
||||||
|
&& !(parent instanceof AST_PropAccess && parent.expression === node)) {
|
||||||
|
sym.scope.uses_arguments = 2;
|
||||||
|
} else if (!sym.scope.uses_arguments) {
|
||||||
sym.scope.uses_arguments = true;
|
sym.scope.uses_arguments = true;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (name == "eval") {
|
if (name == "eval") {
|
||||||
var parent = tw.parent();
|
var parent = tw.parent();
|
||||||
if (parent.TYPE == "Call" && parent.expression === node) {
|
if (parent.TYPE == "Call" && parent.expression === node) {
|
||||||
@@ -212,27 +357,26 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
|
|||||||
self.uses_eval = true;
|
self.uses_eval = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (sym.init instanceof AST_LambdaDefinition && sym.scope !== sym.init.name.scope) {
|
||||||
|
var scope = node.scope;
|
||||||
|
do {
|
||||||
|
if (scope === sym.init.name.scope) break;
|
||||||
|
} while (scope = scope.parent_scope);
|
||||||
|
if (!scope) sym.init = undefined;
|
||||||
|
}
|
||||||
node.thedef = sym;
|
node.thedef = sym;
|
||||||
node.reference(options);
|
node.reference(options);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
// ensure mangling works if catch reuses a scope variable
|
|
||||||
if (node instanceof AST_SymbolCatch) {
|
|
||||||
var def = node.definition().redefined();
|
|
||||||
if (def) for (var s = node.scope; s; s = s.parent_scope) {
|
|
||||||
push_uniq(s.enclosed, def);
|
|
||||||
if (s === def.scope) break;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
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 def = node.thedef;
|
||||||
if (scope.name instanceof AST_SymbolLambda && scope.name.name == node.name) {
|
var scope = def.defun;
|
||||||
|
if (def.name != "arguments" && scope.name instanceof AST_SymbolLambda && scope.name.name == def.name) {
|
||||||
scope = scope.parent_scope.resolve();
|
scope = scope.parent_scope.resolve();
|
||||||
}
|
}
|
||||||
redefine(node, scope);
|
redefine(node, scope);
|
||||||
@@ -240,8 +384,9 @@ 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;
|
||||||
redefine(node, node.scope.parent_scope.resolve());
|
if (!redefine(node, node.scope.parent_scope.resolve())) {
|
||||||
if (typeof node.thedef.init !== "undefined") {
|
def.defun = undefined;
|
||||||
|
} else if (typeof node.thedef.init !== "undefined") {
|
||||||
node.thedef.init = false;
|
node.thedef.init = false;
|
||||||
} else if (def.init) {
|
} else if (def.init) {
|
||||||
node.thedef.init = def.init;
|
node.thedef.init = def.init;
|
||||||
@@ -250,13 +395,22 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
|
|||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
function is_arguments(sym) {
|
||||||
|
return sym.orig[0] instanceof AST_SymbolFunarg
|
||||||
|
&& !(sym.orig[1] instanceof AST_SymbolFunarg || sym.orig[2] instanceof AST_SymbolFunarg)
|
||||||
|
&& !is_arrow(sym.scope);
|
||||||
|
}
|
||||||
|
|
||||||
function redefine(node, scope) {
|
function redefine(node, scope) {
|
||||||
var name = node.name;
|
var name = node.name;
|
||||||
var old_def = node.thedef;
|
var old_def = node.thedef;
|
||||||
|
if (!all(old_def.orig, function(sym) {
|
||||||
|
return !(sym instanceof AST_SymbolConst || sym instanceof AST_SymbolLet);
|
||||||
|
})) return false;
|
||||||
var new_def = scope.find_variable(name);
|
var new_def = scope.find_variable(name);
|
||||||
if (new_def) {
|
if (new_def) {
|
||||||
var redef;
|
var redef = new_def.redefined();
|
||||||
while (redef = new_def.redefined()) new_def = redef;
|
if (redef) new_def = redef;
|
||||||
} else {
|
} else {
|
||||||
new_def = self.globals.get(name);
|
new_def = self.globals.get(name);
|
||||||
}
|
}
|
||||||
@@ -265,14 +419,15 @@ 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 = true;
|
node.redef = old_def;
|
||||||
node.thedef = new_def;
|
node.thedef = new_def;
|
||||||
node.reference(options);
|
node.reference(options);
|
||||||
});
|
});
|
||||||
if (old_def.lambda) new_def.lambda = true;
|
return true;
|
||||||
if (new_def.undeclared) self.variables.set(name, new_def);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -289,32 +444,47 @@ AST_Toplevel.DEFMETHOD("def_global", function(node) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
function init_block_vars(scope, parent) {
|
function init_block_vars(scope, parent, orig) {
|
||||||
scope.cname = -1; // the current index for mangling functions/variables
|
// variables from this or outer scope(s) that are referenced from this or inner scopes
|
||||||
scope.enclosed = []; // variables from this or outer scope(s) that are referenced from this or inner scopes
|
scope.enclosed = orig ? orig.enclosed.slice() : [];
|
||||||
scope.parent_scope = parent; // the parent scope (null if this is the top level)
|
// map name to AST_SymbolDefun (functions defined in this scope)
|
||||||
scope.functions = new Dictionary(); // map name to AST_SymbolDefun (functions defined in this scope)
|
scope.functions = orig ? orig.functions.clone() : new Dictionary();
|
||||||
scope.variables = new Dictionary(); // map name to AST_SymbolVar (variables defined in this scope; includes functions)
|
// map name to AST_SymbolVar (variables defined in this scope; includes functions)
|
||||||
if (parent) scope.make_def = parent.make_def; // top-level tracking of SymbolDef instances
|
scope.variables = orig ? orig.variables.clone() : new Dictionary();
|
||||||
|
if (!parent) return;
|
||||||
|
// top-level tracking of SymbolDef instances
|
||||||
|
scope.make_def = parent.make_def;
|
||||||
|
// the parent scope (null if this is the top level)
|
||||||
|
scope.parent_scope = parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
function init_scope_vars(scope, parent) {
|
function init_scope_vars(scope, parent, orig) {
|
||||||
init_block_vars(scope, parent);
|
init_block_vars(scope, parent, orig);
|
||||||
scope.uses_eval = false; // will be set to true if this or nested scope uses the global `eval`
|
// will be set to true if this or nested scope uses the global `eval`
|
||||||
scope.uses_with = false; // will be set to true if this or some nested scope uses the `with` statement
|
scope.uses_eval = false;
|
||||||
|
// will be set to true if this or some nested scope uses the `with` statement
|
||||||
|
scope.uses_with = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
AST_BlockScope.DEFMETHOD("init_vars", function(parent_scope) {
|
AST_BlockScope.DEFMETHOD("init_vars", function(parent, orig) {
|
||||||
init_block_vars(this, parent_scope);
|
init_block_vars(this, parent, orig);
|
||||||
});
|
});
|
||||||
AST_Scope.DEFMETHOD("init_vars", function(parent_scope) {
|
AST_Scope.DEFMETHOD("init_vars", function(parent, orig) {
|
||||||
init_scope_vars(this, parent_scope);
|
init_scope_vars(this, parent, orig);
|
||||||
});
|
});
|
||||||
AST_Lambda.DEFMETHOD("init_vars", function(parent_scope) {
|
AST_Arrow.DEFMETHOD("init_vars", function(parent, orig) {
|
||||||
init_scope_vars(this, parent_scope);
|
init_scope_vars(this, parent, orig);
|
||||||
|
return this;
|
||||||
|
});
|
||||||
|
AST_AsyncArrow.DEFMETHOD("init_vars", function(parent, orig) {
|
||||||
|
init_scope_vars(this, parent, orig);
|
||||||
|
});
|
||||||
|
AST_Lambda.DEFMETHOD("init_vars", function(parent, orig) {
|
||||||
|
init_scope_vars(this, parent, orig);
|
||||||
this.uses_arguments = false;
|
this.uses_arguments = false;
|
||||||
this.def_variable(new AST_SymbolFunarg({
|
this.def_variable(new AST_SymbolFunarg({
|
||||||
name: "arguments",
|
name: "arguments",
|
||||||
|
scope: this,
|
||||||
start: this.start,
|
start: this.start,
|
||||||
end: this.end,
|
end: this.end,
|
||||||
}));
|
}));
|
||||||
@@ -324,9 +494,14 @@ AST_Lambda.DEFMETHOD("init_vars", function(parent_scope) {
|
|||||||
AST_Symbol.DEFMETHOD("mark_enclosed", function(options) {
|
AST_Symbol.DEFMETHOD("mark_enclosed", function(options) {
|
||||||
var def = this.definition();
|
var def = this.definition();
|
||||||
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);
|
if (!push_uniq(s.enclosed, def)) break;
|
||||||
if (options.keep_fnames) {
|
if (!options) {
|
||||||
s.functions.each(function(d) {
|
s._var_names = undefined;
|
||||||
|
} else {
|
||||||
|
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);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -340,14 +515,13 @@ AST_Symbol.DEFMETHOD("reference", function(options) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
AST_BlockScope.DEFMETHOD("find_variable", function(name) {
|
AST_BlockScope.DEFMETHOD("find_variable", function(name) {
|
||||||
if (name instanceof AST_Symbol) name = name.name;
|
|
||||||
return this.variables.get(name)
|
return this.variables.get(name)
|
||||||
|| (this.parent_scope && this.parent_scope.find_variable(name));
|
|| this.parent_scope && this.parent_scope.find_variable(name);
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_BlockScope.DEFMETHOD("def_function", function(symbol, init) {
|
AST_BlockScope.DEFMETHOD("def_function", function(symbol, init) {
|
||||||
var def = this.def_variable(symbol, init);
|
var def = this.def_variable(symbol, init);
|
||||||
if (!def.init || def.init instanceof AST_Defun) def.init = init;
|
if (!def.init || def.init instanceof AST_LambdaDefinition) def.init = init;
|
||||||
this.functions.set(symbol.name, def);
|
this.functions.set(symbol.name, def);
|
||||||
return def;
|
return def;
|
||||||
});
|
});
|
||||||
@@ -356,7 +530,7 @@ AST_BlockScope.DEFMETHOD("def_variable", function(symbol, init) {
|
|||||||
var def = this.variables.get(symbol.name);
|
var def = this.variables.get(symbol.name);
|
||||||
if (def) {
|
if (def) {
|
||||||
def.orig.push(symbol);
|
def.orig.push(symbol);
|
||||||
if (def.init instanceof AST_Function) def.init = init;
|
if (def.init instanceof AST_LambdaExpression) def.init = init;
|
||||||
} else {
|
} else {
|
||||||
def = this.make_def(symbol, init);
|
def = this.make_def(symbol, init);
|
||||||
this.variables.set(symbol.name, def);
|
this.variables.set(symbol.name, def);
|
||||||
@@ -368,50 +542,51 @@ AST_BlockScope.DEFMETHOD("def_variable", function(symbol, init) {
|
|||||||
function names_in_use(scope, options) {
|
function names_in_use(scope, options) {
|
||||||
var names = scope.names_in_use;
|
var names = scope.names_in_use;
|
||||||
if (!names) {
|
if (!names) {
|
||||||
scope.names_in_use = names = Object.create(null);
|
scope.cname = -1;
|
||||||
scope.cname_holes = [];
|
scope.cname_holes = [];
|
||||||
|
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);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
return names;
|
return names;
|
||||||
}
|
}
|
||||||
|
|
||||||
function next_mangled_name(scope, options, def) {
|
function next_mangled_name(def, options) {
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -430,44 +605,64 @@ 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,
|
||||||
|
v8 : 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) {
|
var save_nesting;
|
||||||
// lname is incremented when we get to the AST_Label
|
if (node instanceof AST_BlockScope) {
|
||||||
var save_nesting = lname;
|
// `lname` is incremented when we get to the `AST_Label`
|
||||||
descend();
|
if (node instanceof AST_LabeledStatement) save_nesting = lname;
|
||||||
lname = save_nesting;
|
if (options.webkit && node instanceof AST_IterationStatement && node.init instanceof AST_Let) {
|
||||||
return true;
|
node.init.definitions.forEach(function(defn) {
|
||||||
|
defn.name.match_symbol(function(sym) {
|
||||||
|
if (!(sym instanceof AST_SymbolLet)) return;
|
||||||
|
var def = sym.definition();
|
||||||
|
var scope = sym.scope.parent_scope;
|
||||||
|
var redef = scope.def_variable(sym);
|
||||||
|
sym.thedef = def;
|
||||||
|
scope.to_mangle.push(redef);
|
||||||
|
def.redefined = function() {
|
||||||
|
return redef;
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}, true);
|
||||||
}
|
}
|
||||||
if (node instanceof AST_Scope) {
|
var to_mangle = node.to_mangle = [];
|
||||||
|
node.variables.each(function(def, name) {
|
||||||
|
if (def.unmangleable(options)) {
|
||||||
|
names_in_use(node, options).set(name, true);
|
||||||
|
} else if (!defer_redef(def)) {
|
||||||
|
to_mangle.push(def);
|
||||||
|
}
|
||||||
|
});
|
||||||
descend();
|
descend();
|
||||||
if (options.cache && node instanceof AST_Toplevel) {
|
if (options.cache && node instanceof AST_Toplevel) {
|
||||||
node.globals.each(mangle);
|
node.globals.each(mangle);
|
||||||
@@ -477,9 +672,24 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options) {
|
|||||||
sym.scope = node;
|
sym.scope = node;
|
||||||
sym.reference(options);
|
sym.reference(options);
|
||||||
}
|
}
|
||||||
node.variables.each(function(def) {
|
if (to_mangle.length > cutoff) {
|
||||||
if (!defer_redef(def)) mangle(def);
|
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);
|
||||||
|
if (node instanceof AST_LabeledStatement && !(options.v8 && in_label(tw))) lname = save_nesting;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (node instanceof AST_Label) {
|
if (node instanceof AST_Label) {
|
||||||
@@ -490,13 +700,6 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options) {
|
|||||||
node.mangled_name = name;
|
node.mangled_name = name;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (!options.ie8 && node instanceof AST_Catch && node.argname) {
|
|
||||||
var def = node.argname.definition();
|
|
||||||
var redef = defer_redef(def, node.argname);
|
|
||||||
descend();
|
|
||||||
if (!redef) mangle(def);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
this.walk(tw);
|
this.walk(tw);
|
||||||
redefined.forEach(mangle);
|
redefined.forEach(mangle);
|
||||||
@@ -506,12 +709,25 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options) {
|
|||||||
def.mangle(options);
|
def.mangle(options);
|
||||||
}
|
}
|
||||||
|
|
||||||
function defer_redef(def, node) {
|
function defer_redef(def) {
|
||||||
|
var sym = def.orig[0];
|
||||||
var redef = def.redefined();
|
var redef = def.redefined();
|
||||||
if (!redef) return false;
|
if (!redef) {
|
||||||
|
if (!(sym instanceof AST_SymbolConst)) return false;
|
||||||
|
var scope = def.scope.resolve();
|
||||||
|
if (def.scope === scope) return false;
|
||||||
|
if (def.scope.parent_scope.find_variable(sym.name)) return false;
|
||||||
|
redef = scope.def_variable(sym);
|
||||||
|
scope.to_mangle.push(redef);
|
||||||
|
}
|
||||||
redefined.push(def);
|
redefined.push(def);
|
||||||
def.references.forEach(reference);
|
def.references.forEach(reference);
|
||||||
if (node) reference(node);
|
if (sym instanceof AST_SymbolCatch || sym instanceof AST_SymbolConst) {
|
||||||
|
reference(sym);
|
||||||
|
def.redefined = function() {
|
||||||
|
return redef;
|
||||||
|
};
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
function reference(sym) {
|
function reference(sym) {
|
||||||
@@ -520,6 +736,14 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options) {
|
|||||||
sym.thedef = def;
|
sym.thedef = def;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function in_label(tw) {
|
||||||
|
var level = 0, parent;
|
||||||
|
while (parent = tw.parent(level++)) {
|
||||||
|
if (parent instanceof AST_Block) return parent instanceof AST_Toplevel && !options.toplevel;
|
||||||
|
if (parent instanceof AST_LabeledStatement) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Toplevel.DEFMETHOD("find_colliding_names", function(options) {
|
AST_Toplevel.DEFMETHOD("find_colliding_names", function(options) {
|
||||||
@@ -632,6 +856,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) {
|
||||||
@@ -643,19 +868,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,7 +146,9 @@ 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) {
|
||||||
sources_content[source] = content;
|
if (!sources_content.has(source)) {
|
||||||
|
sources_content.set(source, content);
|
||||||
|
}
|
||||||
} : noop,
|
} : noop,
|
||||||
toString: function() {
|
toString: function() {
|
||||||
return JSON.stringify({
|
return JSON.stringify({
|
||||||
@@ -153,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,
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ TreeTransformer.prototype = new TreeWalker;
|
|||||||
if (self.step) self.step = self.step.transform(tw);
|
if (self.step) self.step = self.step.transform(tw);
|
||||||
self.body = self.body.transform(tw);
|
self.body = self.body.transform(tw);
|
||||||
});
|
});
|
||||||
DEF(AST_ForIn, function(self, tw) {
|
DEF(AST_ForEnumeration, function(self, tw) {
|
||||||
self.init = self.init.transform(tw);
|
self.init = self.init.transform(tw);
|
||||||
self.object = self.object.transform(tw);
|
self.object = self.object.transform(tw);
|
||||||
self.body = self.body.transform(tw);
|
self.body = self.body.transform(tw);
|
||||||
@@ -126,11 +126,36 @@ TreeTransformer.prototype = new TreeWalker;
|
|||||||
self.name = self.name.transform(tw);
|
self.name = self.name.transform(tw);
|
||||||
if (self.value) self.value = self.value.transform(tw);
|
if (self.value) self.value = self.value.transform(tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_DefaultValue, function(self, tw) {
|
||||||
|
self.name = self.name.transform(tw);
|
||||||
|
self.value = self.value.transform(tw);
|
||||||
|
});
|
||||||
DEF(AST_Lambda, function(self, tw) {
|
DEF(AST_Lambda, function(self, tw) {
|
||||||
if (self.name) self.name = self.name.transform(tw);
|
if (self.name) self.name = self.name.transform(tw);
|
||||||
self.argnames = do_list(self.argnames, tw);
|
self.argnames = do_list(self.argnames, tw);
|
||||||
|
if (self.rest) self.rest = self.rest.transform(tw);
|
||||||
self.body = do_list(self.body, tw);
|
self.body = do_list(self.body, tw);
|
||||||
});
|
});
|
||||||
|
function transform_arrow(self, tw) {
|
||||||
|
self.argnames = do_list(self.argnames, tw);
|
||||||
|
if (self.rest) self.rest = self.rest.transform(tw);
|
||||||
|
if (self.value) {
|
||||||
|
self.value = self.value.transform(tw);
|
||||||
|
} else {
|
||||||
|
self.body = do_list(self.body, tw);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DEF(AST_Arrow, transform_arrow);
|
||||||
|
DEF(AST_AsyncArrow, transform_arrow);
|
||||||
|
DEF(AST_Class, function(self, tw) {
|
||||||
|
if (self.name) self.name = self.name.transform(tw);
|
||||||
|
if (self.extends) self.extends = self.extends.transform(tw);
|
||||||
|
self.properties = do_list(self.properties, tw);
|
||||||
|
});
|
||||||
|
DEF(AST_ClassProperty, function(self, tw) {
|
||||||
|
if (self.key instanceof AST_Node) self.key = self.key.transform(tw);
|
||||||
|
if (self.value) self.value = self.value.transform(tw);
|
||||||
|
});
|
||||||
DEF(AST_Call, function(self, tw) {
|
DEF(AST_Call, function(self, tw) {
|
||||||
self.expression = self.expression.transform(tw);
|
self.expression = self.expression.transform(tw);
|
||||||
self.args = do_list(self.args, tw);
|
self.args = do_list(self.args, tw);
|
||||||
@@ -138,6 +163,12 @@ TreeTransformer.prototype = new TreeWalker;
|
|||||||
DEF(AST_Sequence, function(self, tw) {
|
DEF(AST_Sequence, function(self, tw) {
|
||||||
self.expressions = do_list(self.expressions, tw);
|
self.expressions = do_list(self.expressions, tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_Await, function(self, tw) {
|
||||||
|
self.expression = self.expression.transform(tw);
|
||||||
|
});
|
||||||
|
DEF(AST_Yield, function(self, tw) {
|
||||||
|
if (self.expression) self.expression = self.expression.transform(tw);
|
||||||
|
});
|
||||||
DEF(AST_Dot, function(self, tw) {
|
DEF(AST_Dot, function(self, tw) {
|
||||||
self.expression = self.expression.transform(tw);
|
self.expression = self.expression.transform(tw);
|
||||||
});
|
});
|
||||||
@@ -145,6 +176,9 @@ TreeTransformer.prototype = new TreeWalker;
|
|||||||
self.expression = self.expression.transform(tw);
|
self.expression = self.expression.transform(tw);
|
||||||
self.property = self.property.transform(tw);
|
self.property = self.property.transform(tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_Spread, function(self, tw) {
|
||||||
|
self.expression = self.expression.transform(tw);
|
||||||
|
});
|
||||||
DEF(AST_Unary, function(self, tw) {
|
DEF(AST_Unary, function(self, tw) {
|
||||||
self.expression = self.expression.transform(tw);
|
self.expression = self.expression.transform(tw);
|
||||||
});
|
});
|
||||||
@@ -160,12 +194,43 @@ TreeTransformer.prototype = new TreeWalker;
|
|||||||
DEF(AST_Array, function(self, tw) {
|
DEF(AST_Array, function(self, tw) {
|
||||||
self.elements = do_list(self.elements, tw);
|
self.elements = do_list(self.elements, tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_DestructuredArray, function(self, tw) {
|
||||||
|
self.elements = do_list(self.elements, tw);
|
||||||
|
if (self.rest) self.rest = self.rest.transform(tw);
|
||||||
|
});
|
||||||
|
DEF(AST_DestructuredKeyVal, function(self, tw) {
|
||||||
|
if (self.key instanceof AST_Node) self.key = self.key.transform(tw);
|
||||||
|
self.value = self.value.transform(tw);
|
||||||
|
});
|
||||||
|
DEF(AST_DestructuredObject, function(self, tw) {
|
||||||
|
self.properties = do_list(self.properties, tw);
|
||||||
|
if (self.rest) self.rest = self.rest.transform(tw);
|
||||||
|
});
|
||||||
DEF(AST_Object, function(self, tw) {
|
DEF(AST_Object, function(self, tw) {
|
||||||
self.properties = do_list(self.properties, tw);
|
self.properties = do_list(self.properties, tw);
|
||||||
});
|
});
|
||||||
DEF(AST_ObjectProperty, function(self, tw) {
|
DEF(AST_ObjectProperty, function(self, tw) {
|
||||||
|
if (self.key instanceof AST_Node) self.key = self.key.transform(tw);
|
||||||
self.value = self.value.transform(tw);
|
self.value = self.value.transform(tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_ExportDeclaration, function(self, tw) {
|
||||||
|
self.body = self.body.transform(tw);
|
||||||
|
});
|
||||||
|
DEF(AST_ExportDefault, function(self, tw) {
|
||||||
|
self.body = self.body.transform(tw);
|
||||||
|
});
|
||||||
|
DEF(AST_ExportReferences, function(self, tw) {
|
||||||
|
self.properties = do_list(self.properties, tw);
|
||||||
|
});
|
||||||
|
DEF(AST_Import, function(self, tw) {
|
||||||
|
if (self.all) self.all = self.all.transform(tw);
|
||||||
|
if (self.default) self.default = self.default.transform(tw);
|
||||||
|
if (self.properties) self.properties = do_list(self.properties, tw);
|
||||||
|
});
|
||||||
|
DEF(AST_Template, function(self, tw) {
|
||||||
|
if (self.tag) self.tag = self.tag.transform(tw);
|
||||||
|
self.expressions = do_list(self.expressions, tw);
|
||||||
|
});
|
||||||
})(function(node, descend) {
|
})(function(node, descend) {
|
||||||
node.DEFMETHOD("transform", function(tw, in_list) {
|
node.DEFMETHOD("transform", function(tw, in_list) {
|
||||||
var x, y;
|
var x, y;
|
||||||
|
|||||||
154
lib/utils.js
154
lib/utils.js
@@ -55,36 +55,41 @@ 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) {
|
function configure_error_stack(ex, cause) {
|
||||||
if (i <= 0) return "";
|
var stack = ex.name + ": " + ex.message;
|
||||||
if (i == 1) return str;
|
Object.defineProperty(ex, "stack", {
|
||||||
var d = repeat_string(str, i >> 1);
|
|
||||||
d += d;
|
|
||||||
return i & 1 ? d + str : d;
|
|
||||||
}
|
|
||||||
|
|
||||||
function configure_error_stack(fn) {
|
|
||||||
Object.defineProperty(fn.prototype, "stack", {
|
|
||||||
get: function() {
|
get: function() {
|
||||||
var err = new Error(this.message);
|
if (cause) {
|
||||||
err.name = this.name;
|
cause.name = "" + ex.name;
|
||||||
try {
|
stack = "" + cause.stack;
|
||||||
throw err;
|
var msg = "" + cause.message;
|
||||||
} catch (e) {
|
cause = null;
|
||||||
return e.stack;
|
var index = stack.indexOf(msg);
|
||||||
|
if (index < 0) {
|
||||||
|
index = 0;
|
||||||
|
} else {
|
||||||
|
index += msg.length;
|
||||||
|
index = stack.indexOf("\n", index) + 1;
|
||||||
}
|
}
|
||||||
|
stack = stack.slice(0, index) + stack.slice(stack.indexOf("\n", index) + 1);
|
||||||
}
|
}
|
||||||
|
return stack;
|
||||||
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function DefaultsError(msg, defs) {
|
function DefaultsError(msg, defs) {
|
||||||
this.message = msg;
|
this.message = msg;
|
||||||
this.defs = defs;
|
this.defs = defs;
|
||||||
|
try {
|
||||||
|
throw new Error(msg);
|
||||||
|
} catch (cause) {
|
||||||
|
configure_error_stack(this, cause);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
DefaultsError.prototype = Object.create(Error.prototype);
|
DefaultsError.prototype = Object.create(Error.prototype);
|
||||||
DefaultsError.prototype.constructor = DefaultsError;
|
DefaultsError.prototype.constructor = DefaultsError;
|
||||||
DefaultsError.prototype.name = "DefaultsError";
|
DefaultsError.prototype.name = "DefaultsError";
|
||||||
configure_error_stack(DefaultsError);
|
|
||||||
|
|
||||||
function defaults(args, defs, croak) {
|
function defaults(args, defs, croak) {
|
||||||
if (croak) for (var i in args) {
|
if (croak) for (var i in args) {
|
||||||
@@ -96,15 +101,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,8 +139,11 @@ 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) {
|
||||||
return props && props[p];
|
var value = p == "this" ? props : props[p];
|
||||||
|
if (value instanceof AST_Node) return value.print_to_string();
|
||||||
|
if (value instanceof AST_Token) return value.file + ":" + value.line + "," + value.col;
|
||||||
|
return value;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -170,63 +169,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;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -237,24 +253,48 @@ function HOP(obj, prop) {
|
|||||||
// return true if the node at the top of the stack (that means the
|
// return true if the node at the top of the stack (that means the
|
||||||
// innermost node in the current output) is lexically the first in
|
// innermost node in the current output) is lexically the first in
|
||||||
// a statement.
|
// a statement.
|
||||||
function first_in_statement(stack) {
|
function first_in_statement(stack, arrow, export_default) {
|
||||||
var node = stack.parent(-1);
|
var node = stack.parent(-1);
|
||||||
for (var i = 0, p; p = stack.parent(i++); node = p) {
|
for (var i = 0, p; p = stack.parent(i++); node = p) {
|
||||||
if (p.TYPE == "Call") {
|
if (is_arrow(p)) {
|
||||||
if (p.expression === node) continue;
|
return arrow && p.value === node;
|
||||||
} else if (p instanceof AST_Binary) {
|
} else if (p instanceof AST_Binary) {
|
||||||
if (p.left === node) continue;
|
if (p.left === node) continue;
|
||||||
|
} else if (p.TYPE == "Call") {
|
||||||
|
if (p.expression === node) continue;
|
||||||
} else if (p instanceof AST_Conditional) {
|
} else if (p instanceof AST_Conditional) {
|
||||||
if (p.condition === node) continue;
|
if (p.condition === node) continue;
|
||||||
|
} else if (p instanceof AST_ExportDefault) {
|
||||||
|
return export_default;
|
||||||
} else if (p instanceof AST_PropAccess) {
|
} else if (p instanceof AST_PropAccess) {
|
||||||
if (p.expression === node) continue;
|
if (p.expression === node) continue;
|
||||||
} else if (p instanceof AST_Sequence) {
|
} else if (p instanceof AST_Sequence) {
|
||||||
if (p.expressions[0] === node) continue;
|
if (p.expressions[0] === node) continue;
|
||||||
} else if (p instanceof AST_Statement) {
|
} else if (p instanceof AST_SimpleStatement) {
|
||||||
return p.body === node;
|
return true;
|
||||||
|
} else if (p instanceof AST_Template) {
|
||||||
|
if (p.tag === node) continue;
|
||||||
} else if (p instanceof AST_UnaryPostfix) {
|
} else if (p instanceof AST_UnaryPostfix) {
|
||||||
if (p.expression === node) continue;
|
if (p.expression === node) continue;
|
||||||
}
|
}
|
||||||
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.11.2",
|
"version": "3.18.0",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.8.0"
|
"node": ">=0.8.0"
|
||||||
},
|
},
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
"LICENSE"
|
"LICENSE"
|
||||||
],
|
],
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"acorn": "~7.1.0",
|
"acorn": "~8.7.1",
|
||||||
"semver": "~6.3.0"
|
"semver": "~6.3.0"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
require("../tools/tty");
|
||||||
var createHash = require("crypto").createHash;
|
var createHash = require("crypto").createHash;
|
||||||
var fetch = require("./fetch");
|
var fetch = require("./fetch");
|
||||||
var spawn = require("child_process").spawn;
|
var spawn = require("child_process").spawn;
|
||||||
@@ -16,7 +17,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",
|
||||||
|
|||||||
133
test/compress.js
133
test/compress.js
@@ -1,6 +1,6 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
require("../tools/exit");
|
require("../tools/tty");
|
||||||
|
|
||||||
var assert = require("assert");
|
var assert = require("assert");
|
||||||
var child_process = require("child_process");
|
var child_process = require("child_process");
|
||||||
@@ -10,33 +10,38 @@ var sandbox = require("./sandbox");
|
|||||||
var semver = require("semver");
|
var semver = require("semver");
|
||||||
var U = require("./node");
|
var U = require("./node");
|
||||||
|
|
||||||
var file = process.argv[2];
|
var batch = 50;
|
||||||
var dir = path.resolve(path.dirname(module.filename), "compress");
|
var dir = path.resolve(path.dirname(module.filename), "compress");
|
||||||
if (file) {
|
if (process.argv.length > 3) {
|
||||||
|
var file = process.argv[2];
|
||||||
|
var start = process.argv[3] | 0;
|
||||||
var minify_options = require("./ufuzz/options.json").map(JSON.stringify);
|
var minify_options = require("./ufuzz/options.json").map(JSON.stringify);
|
||||||
log("--- {file}", { file: file });
|
|
||||||
var tests = parse_test(path.resolve(dir, file));
|
var tests = parse_test(path.resolve(dir, file));
|
||||||
process.exit(Object.keys(tests).filter(function(name) {
|
process.exit(Object.keys(tests).slice(start, start + batch).filter(function(name) {
|
||||||
return !test_case(tests[name]);
|
return !test_case(tests[name]);
|
||||||
}).length);
|
}).length);
|
||||||
} else {
|
} else {
|
||||||
var files = fs.readdirSync(dir).filter(function(name) {
|
var files = process.argv.length == 3 ? [ process.argv[2] ] : fs.readdirSync(dir).filter(function(name) {
|
||||||
return /\.js$/i.test(name);
|
return /\.js$/i.test(name);
|
||||||
});
|
});
|
||||||
var failures = 0;
|
var failures = 0;
|
||||||
var failed_files = Object.create(null);
|
var failed_files = Object.create(null);
|
||||||
(function next() {
|
(function next(file, start, length) {
|
||||||
var file = files.shift();
|
if (start < length) {
|
||||||
if (file) {
|
child_process.spawn(process.argv[0], [ process.argv[1], file, start, batch ], {
|
||||||
child_process.spawn(process.argv[0], [ process.argv[1], file ], {
|
|
||||||
stdio: [ "ignore", 1, 2 ]
|
stdio: [ "ignore", 1, 2 ]
|
||||||
}).on("exit", function(code) {
|
}).on("exit", function(code) {
|
||||||
if (code) {
|
if (code) {
|
||||||
failures += code;
|
failures += code;
|
||||||
failed_files[file] = code;
|
failed_files[file] = true;
|
||||||
}
|
}
|
||||||
next();
|
next(file, start + batch, length);
|
||||||
});
|
});
|
||||||
|
} else if (file = files.shift()) {
|
||||||
|
log("--- {file}", { file: file });
|
||||||
|
start = 0;
|
||||||
|
length = Object.keys(parse_test(path.resolve(dir, file))).length;
|
||||||
|
next(file, start, length);
|
||||||
} else if (failures) {
|
} else if (failures) {
|
||||||
console.error();
|
console.error();
|
||||||
console.error("!!! Failed " + failures + " test case(s).");
|
console.error("!!! Failed " + failures + " test case(s).");
|
||||||
@@ -55,19 +60,17 @@ function log() {
|
|||||||
console.log("%s", tmpl.apply(null, arguments));
|
console.log("%s", tmpl.apply(null, arguments));
|
||||||
}
|
}
|
||||||
|
|
||||||
function make_code(ast, options) {
|
function make_code(ast, options, expression) {
|
||||||
var stream = U.OutputStream(options);
|
var stream = U.OutputStream(options);
|
||||||
|
if (expression) ast = ast.clone(true).unwrap_expression();
|
||||||
ast.print(stream);
|
ast.print(stream);
|
||||||
return stream.get();
|
return stream.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
function parse_test(file) {
|
function parse_test(file) {
|
||||||
var script = fs.readFileSync(file, "utf8");
|
var script = fs.readFileSync(file, "utf8");
|
||||||
// TODO try/catch can be removed after fixing https://github.com/mishoo/UglifyJS/issues/348
|
|
||||||
try {
|
try {
|
||||||
var ast = U.parse(script, {
|
var ast = U.parse(script, { filename: file, module: "" });
|
||||||
filename: file
|
|
||||||
});
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error("Caught error while parsing tests in " + file);
|
console.error("Caught error while parsing tests in " + file);
|
||||||
console.error(e);
|
console.error(e);
|
||||||
@@ -94,14 +97,14 @@ function parse_test(file) {
|
|||||||
file: file,
|
file: file,
|
||||||
line: node.start.line,
|
line: node.start.line,
|
||||||
col: node.start.col,
|
col: node.start.col,
|
||||||
code: make_code(node, { beautify: false })
|
code: make_code(node, { beautify: false }),
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
function read_string(stat) {
|
function read_string(stat) {
|
||||||
if (stat.TYPE == "SimpleStatement") {
|
if (stat.TYPE == "SimpleStatement") {
|
||||||
var body = stat.body;
|
var body = stat.body;
|
||||||
switch(body.TYPE) {
|
switch (body.TYPE) {
|
||||||
case "String":
|
case "String":
|
||||||
return body.value;
|
return body.value;
|
||||||
case "Array":
|
case "Array":
|
||||||
@@ -123,6 +126,17 @@ function parse_test(file) {
|
|||||||
croak(node);
|
croak(node);
|
||||||
}
|
}
|
||||||
var name = node.left.name;
|
var name = node.left.name;
|
||||||
|
assert.ok([
|
||||||
|
"beautify",
|
||||||
|
"expression",
|
||||||
|
"mangle",
|
||||||
|
"options",
|
||||||
|
"rename",
|
||||||
|
].indexOf(name) >= 0, tmpl("Unsupported setting {name} [{line},{col}]", {
|
||||||
|
name: name,
|
||||||
|
line: node.start.line,
|
||||||
|
col: node.start.col,
|
||||||
|
}));
|
||||||
test[name] = evaluate(node.right);
|
test[name] = evaluate(node.right);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -138,7 +152,7 @@ function parse_test(file) {
|
|||||||
].indexOf(label.name) >= 0, tmpl("Unsupported label {name} [{line},{col}]", {
|
].indexOf(label.name) >= 0, tmpl("Unsupported label {name} [{line},{col}]", {
|
||||||
name: label.name,
|
name: label.name,
|
||||||
line: label.start.line,
|
line: label.start.line,
|
||||||
col: label.start.col
|
col: label.start.col,
|
||||||
}));
|
}));
|
||||||
var stat = node.body;
|
var stat = node.body;
|
||||||
if (label.name == "expect_exact" || label.name == "node_version") {
|
if (label.name == "expect_exact" || label.name == "node_version") {
|
||||||
@@ -151,12 +165,12 @@ function parse_test(file) {
|
|||||||
var ctor = global[body.expression.name];
|
var ctor = global[body.expression.name];
|
||||||
assert.ok(ctor === Error || ctor.prototype instanceof Error, tmpl("Unsupported expect_stdout format [{line},{col}]", {
|
assert.ok(ctor === Error || ctor.prototype instanceof Error, tmpl("Unsupported expect_stdout format [{line},{col}]", {
|
||||||
line: label.start.line,
|
line: label.start.line,
|
||||||
col: label.start.col
|
col: label.start.col,
|
||||||
}));
|
}));
|
||||||
test[label.name] = ctor.apply(null, body.args.map(function(node) {
|
test[label.name] = ctor.apply(null, body.args.map(function(node) {
|
||||||
assert.ok(node instanceof U.AST_Constant, tmpl("Unsupported expect_stdout format [{line},{col}]", {
|
assert.ok(node instanceof U.AST_Constant, tmpl("Unsupported expect_stdout format [{line},{col}]", {
|
||||||
line: label.start.line,
|
line: label.start.line,
|
||||||
col: label.start.col
|
col: label.start.col,
|
||||||
}));
|
}));
|
||||||
return node.value;
|
return node.value;
|
||||||
}));
|
}));
|
||||||
@@ -176,16 +190,23 @@ function parse_test(file) {
|
|||||||
|
|
||||||
// Try to reminify original input with standard options
|
// Try to reminify original input with standard options
|
||||||
// to see if it matches expect_stdout.
|
// to see if it matches expect_stdout.
|
||||||
function reminify(orig_options, input_code, input_formatted, stdout) {
|
function reminify(expression, 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) [
|
if (expression) {
|
||||||
|
if (!options.parse || typeof options.parse != "object") options.parse = {};
|
||||||
|
options.parse.expression = true;
|
||||||
|
if (options.compress == null) options.compress = {};
|
||||||
|
if (options.compress) {
|
||||||
|
if (typeof options.compress != "object") options.compress = {};
|
||||||
|
options.compress.expression = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
[
|
||||||
"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;
|
||||||
@@ -210,7 +231,7 @@ function reminify(orig_options, input_code, input_formatted, stdout) {
|
|||||||
} else {
|
} else {
|
||||||
var toplevel = sandbox.has_toplevel(options);
|
var toplevel = sandbox.has_toplevel(options);
|
||||||
var expected = stdout[toplevel ? 1 : 0];
|
var expected = stdout[toplevel ? 1 : 0];
|
||||||
var actual = run_code(result.code, toplevel);
|
var actual = run_code(expression, result.code, toplevel);
|
||||||
if (typeof expected != "string" && typeof actual != "string" && expected.name == actual.name) {
|
if (typeof expected != "string" && typeof actual != "string" && expected.name == actual.name) {
|
||||||
actual = expected;
|
actual = expected;
|
||||||
}
|
}
|
||||||
@@ -245,9 +266,8 @@ function reminify(orig_options, input_code, input_formatted, stdout) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
function run_code(code, toplevel) {
|
function run_code(expression, code, toplevel) {
|
||||||
var result = sandbox.run_code(code, toplevel);
|
return sandbox.run_code(expression ? "console.log(" + code + ");" : code, toplevel);
|
||||||
return typeof result == "string" ? result.replace(/\u001b\[\d+m/g, "") : result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function test_case(test) {
|
function test_case(test) {
|
||||||
@@ -256,13 +276,17 @@ function test_case(test) {
|
|||||||
var output_options = test.beautify || {};
|
var output_options = test.beautify || {};
|
||||||
var expect;
|
var expect;
|
||||||
if (test.expect) {
|
if (test.expect) {
|
||||||
expect = make_code(to_toplevel(test.expect, test.mangle), output_options);
|
expect = to_toplevel(test.expect, test.mangle, test.expression);
|
||||||
|
expect = make_code(expect, output_options, test.expression);
|
||||||
} else {
|
} else {
|
||||||
expect = test.expect_exact;
|
expect = test.expect_exact;
|
||||||
}
|
}
|
||||||
var input = to_toplevel(test.input, test.mangle);
|
var input = to_toplevel(test.input, test.mangle, test.expression);
|
||||||
var input_code = make_code(input);
|
var input_code = make_code(input, {
|
||||||
|
keep_quoted_props: true,
|
||||||
|
}, test.expression);
|
||||||
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,
|
||||||
@@ -270,7 +294,7 @@ function test_case(test) {
|
|||||||
});
|
});
|
||||||
try {
|
try {
|
||||||
input.validate_ast();
|
input.validate_ast();
|
||||||
U.parse(input_code);
|
U.parse(input_code, { expression: test.expression });
|
||||||
} catch (ex) {
|
} catch (ex) {
|
||||||
log([
|
log([
|
||||||
"!!! Cannot parse input",
|
"!!! Cannot parse input",
|
||||||
@@ -296,8 +320,9 @@ function test_case(test) {
|
|||||||
warnings_emitted.push(text);
|
warnings_emitted.push(text);
|
||||||
}, /"INFO: /.test(expected_warnings));
|
}, /"INFO: /.test(expected_warnings));
|
||||||
}
|
}
|
||||||
|
var quoted_props;
|
||||||
if (test.mangle && test.mangle.properties && test.mangle.properties.keep_quoted) {
|
if (test.mangle && test.mangle.properties && test.mangle.properties.keep_quoted) {
|
||||||
var quoted_props = test.mangle.properties.reserved;
|
quoted_props = test.mangle.properties.reserved;
|
||||||
if (!Array.isArray(quoted_props)) quoted_props = [];
|
if (!Array.isArray(quoted_props)) quoted_props = [];
|
||||||
test.mangle.properties.reserved = quoted_props;
|
test.mangle.properties.reserved = quoted_props;
|
||||||
U.reserve_quoted_keys(input, quoted_props);
|
U.reserve_quoted_keys(input, quoted_props);
|
||||||
@@ -312,9 +337,11 @@ function test_case(test) {
|
|||||||
if (test.mangle) {
|
if (test.mangle) {
|
||||||
output.compute_char_frequency(test.mangle);
|
output.compute_char_frequency(test.mangle);
|
||||||
output.mangle_names(test.mangle);
|
output.mangle_names(test.mangle);
|
||||||
|
if (quoted_props) U.reserve_quoted_keys(input, quoted_props);
|
||||||
if (test.mangle.properties) U.mangle_properties(output, test.mangle.properties);
|
if (test.mangle.properties) U.mangle_properties(output, test.mangle.properties);
|
||||||
}
|
}
|
||||||
var output_code = make_code(output, output_options);
|
var output_code = make_code(output, output_options, test.expression);
|
||||||
|
U.AST_Node.log_function();
|
||||||
if (expect != output_code) {
|
if (expect != output_code) {
|
||||||
log([
|
log([
|
||||||
"!!! failed",
|
"!!! failed",
|
||||||
@@ -336,7 +363,7 @@ function test_case(test) {
|
|||||||
// expect == output
|
// expect == output
|
||||||
try {
|
try {
|
||||||
output.validate_ast();
|
output.validate_ast();
|
||||||
U.parse(output_code);
|
U.parse(output_code, { expression: test.expression });
|
||||||
} catch (ex) {
|
} catch (ex) {
|
||||||
log([
|
log([
|
||||||
"!!! Test matched expected result but cannot parse output",
|
"!!! Test matched expected result but cannot parse output",
|
||||||
@@ -380,13 +407,13 @@ function test_case(test) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (test.expect_stdout && (!test.node_version || semver.satisfies(process.version, test.node_version))) {
|
if (test.expect_stdout && (!test.node_version || semver.satisfies(process.version, test.node_version))) {
|
||||||
var stdout = [ run_code(input_code), run_code(input_code, true) ];
|
var stdout = [ run_code(test.expression, input_code), run_code(test.expression, input_code, true) ];
|
||||||
var toplevel = sandbox.has_toplevel({
|
var toplevel = sandbox.has_toplevel({
|
||||||
compress: test.options,
|
compress: test.options,
|
||||||
mangle: test.mangle
|
mangle: test.mangle
|
||||||
});
|
});
|
||||||
var actual = stdout[toplevel ? 1 : 0];
|
var actual = stdout[toplevel ? 1 : 0];
|
||||||
if (test.expect_stdout === true) {
|
if (test.expect_stdout === true || test.expect_stdout instanceof Error && test.expect_stdout.name === actual.name) {
|
||||||
test.expect_stdout = actual;
|
test.expect_stdout = actual;
|
||||||
}
|
}
|
||||||
if (!sandbox.same_stdout(test.expect_stdout, actual)) {
|
if (!sandbox.same_stdout(test.expect_stdout, actual)) {
|
||||||
@@ -409,7 +436,7 @@ function test_case(test) {
|
|||||||
});
|
});
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
actual = run_code(output_code, toplevel);
|
actual = run_code(test.expression, output_code, toplevel);
|
||||||
if (!sandbox.same_stdout(test.expect_stdout, actual)) {
|
if (!sandbox.same_stdout(test.expect_stdout, actual)) {
|
||||||
log([
|
log([
|
||||||
"!!! failed",
|
"!!! failed",
|
||||||
@@ -430,7 +457,7 @@ function test_case(test) {
|
|||||||
});
|
});
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!reminify(test.options, input_code, input_formatted, stdout)) {
|
if (!reminify(test.expression, test.options, input_code, input_formatted, stdout)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -441,20 +468,30 @@ function tmpl() {
|
|||||||
return U.string_template.apply(null, arguments);
|
return U.string_template.apply(null, arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
function to_toplevel(input, mangle_options) {
|
function to_toplevel(input, mangle_options, expression) {
|
||||||
if (!(input instanceof U.AST_BlockStatement)) throw new Error("Unsupported input syntax");
|
if (!(input instanceof U.AST_BlockStatement)) throw new Error("Unsupported input syntax");
|
||||||
var directive = true;
|
|
||||||
var offset = input.start.line;
|
var offset = input.start.line;
|
||||||
var tokens = [];
|
var tokens = [];
|
||||||
var toplevel = new U.AST_Toplevel(input.transform(new U.TreeTransformer(function(node) {
|
input.walk(new U.TreeWalker(function(node) {
|
||||||
if (U.push_uniq(tokens, node.start)) node.start.line -= offset;
|
if (U.push_uniq(tokens, node.start)) node.start.line -= offset;
|
||||||
if (!directive || node === input) return;
|
if (U.push_uniq(tokens, node.end)) node.end.line -= offset;
|
||||||
|
}));
|
||||||
|
var toplevel;
|
||||||
|
if (!expression) {
|
||||||
|
var directive = true;
|
||||||
|
toplevel = new U.AST_Toplevel(input.transform(new U.TreeTransformer(function(node) {
|
||||||
|
if (!directive) return node;
|
||||||
|
if (node === input) return;
|
||||||
if (node instanceof U.AST_SimpleStatement && node.body instanceof U.AST_String) {
|
if (node instanceof U.AST_SimpleStatement && node.body instanceof U.AST_String) {
|
||||||
return new U.AST_Directive(node.body);
|
return new U.AST_Directive(node.body);
|
||||||
} else {
|
|
||||||
directive = false;
|
|
||||||
}
|
}
|
||||||
|
directive = false;
|
||||||
})));
|
})));
|
||||||
|
} else if (input.body.length == 1) {
|
||||||
|
toplevel = input.body[0].wrap_expression();
|
||||||
|
} else {
|
||||||
|
throw new Error("Invalid expression");
|
||||||
|
}
|
||||||
toplevel.figure_out_scope(mangle_options);
|
toplevel.figure_out_scope(mangle_options);
|
||||||
return toplevel;
|
return toplevel;
|
||||||
}
|
}
|
||||||
|
|||||||
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());",
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -78,12 +78,13 @@ replace_index_strict: {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
replace_index_keep_fargs: {
|
replace_index_drop_fargs_1: {
|
||||||
options = {
|
options = {
|
||||||
arguments: true,
|
arguments: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
keep_fargs: false,
|
keep_fargs: false,
|
||||||
properties: true,
|
properties: true,
|
||||||
|
reduce_vars: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var arguments = [];
|
var arguments = [];
|
||||||
@@ -101,6 +102,13 @@ replace_index_keep_fargs: {
|
|||||||
var arguments;
|
var arguments;
|
||||||
console.log(arguments[1], arguments["1"], arguments["foo"]);
|
console.log(arguments[1], arguments["1"], arguments["foo"]);
|
||||||
})("bar", 42);
|
})("bar", 42);
|
||||||
|
(function() {
|
||||||
|
var arguments = {
|
||||||
|
1: "foo",
|
||||||
|
foo: "bar",
|
||||||
|
};
|
||||||
|
console.log(arguments[1], arguments["1"], arguments["foo"]);
|
||||||
|
})("bar", 42);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var arguments = [];
|
var arguments = [];
|
||||||
@@ -112,10 +120,17 @@ replace_index_keep_fargs: {
|
|||||||
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);
|
||||||
|
(function(argument_0, argument_1) {
|
||||||
|
var arguments;
|
||||||
|
console.log(argument_1, argument_1, arguments.foo);
|
||||||
})("bar", 42);
|
})("bar", 42);
|
||||||
(function() {
|
(function() {
|
||||||
var arguments;
|
var arguments = {
|
||||||
|
1: "foo",
|
||||||
|
foo: "bar",
|
||||||
|
};
|
||||||
console.log(arguments[1], arguments[1], arguments.foo);
|
console.log(arguments[1], arguments[1], arguments.foo);
|
||||||
})("bar", 42);
|
})("bar", 42);
|
||||||
}
|
}
|
||||||
@@ -125,10 +140,11 @@ replace_index_keep_fargs: {
|
|||||||
"42 42 undefined",
|
"42 42 undefined",
|
||||||
"a a undefined",
|
"a a undefined",
|
||||||
"42 42 undefined",
|
"42 42 undefined",
|
||||||
|
"foo foo bar",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
replace_index_keep_fargs_strict: {
|
replace_index_drop_fargs_2: {
|
||||||
options = {
|
options = {
|
||||||
arguments: true,
|
arguments: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
@@ -238,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,
|
||||||
@@ -412,7 +447,7 @@ issue_3273_global_strict_reduce_vars: {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_3273_keep_fargs_false: {
|
issue_3273_drop_fargs_1: {
|
||||||
options = {
|
options = {
|
||||||
arguments: true,
|
arguments: true,
|
||||||
keep_fargs: false,
|
keep_fargs: false,
|
||||||
@@ -435,10 +470,10 @@ issue_3273_keep_fargs_false: {
|
|||||||
expect_stdout: "1"
|
expect_stdout: "1"
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_3273_keep_fargs_strict: {
|
issue_3273_drop_fargs_2: {
|
||||||
options = {
|
options = {
|
||||||
arguments: true,
|
arguments: true,
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -633,7 +668,8 @@ issue_3282_2_passes: {
|
|||||||
issue_3420_1: {
|
issue_3420_1: {
|
||||||
options = {
|
options = {
|
||||||
arguments: true,
|
arguments: true,
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(function() {
|
console.log(function() {
|
||||||
@@ -655,7 +691,8 @@ issue_3420_1: {
|
|||||||
issue_3420_2: {
|
issue_3420_2: {
|
||||||
options = {
|
options = {
|
||||||
arguments: true,
|
arguments: true,
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var foo = function() {
|
var foo = function() {
|
||||||
@@ -675,7 +712,8 @@ issue_3420_2: {
|
|||||||
issue_3420_3: {
|
issue_3420_3: {
|
||||||
options = {
|
options = {
|
||||||
arguments: true,
|
arguments: true,
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
"use strict";
|
"use strict";
|
||||||
@@ -697,7 +735,8 @@ issue_3420_3: {
|
|||||||
issue_3420_4: {
|
issue_3420_4: {
|
||||||
options = {
|
options = {
|
||||||
arguments: true,
|
arguments: true,
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
!function() {
|
!function() {
|
||||||
@@ -722,7 +761,8 @@ issue_3420_4: {
|
|||||||
issue_3420_5: {
|
issue_3420_5: {
|
||||||
options = {
|
options = {
|
||||||
arguments: true,
|
arguments: true,
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
"use strict";
|
"use strict";
|
||||||
@@ -749,7 +789,8 @@ issue_3420_5: {
|
|||||||
issue_3420_6: {
|
issue_3420_6: {
|
||||||
options = {
|
options = {
|
||||||
arguments: true,
|
arguments: true,
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(function() {
|
console.log(function() {
|
||||||
@@ -767,7 +808,8 @@ issue_3420_6: {
|
|||||||
issue_3420_7: {
|
issue_3420_7: {
|
||||||
options = {
|
options = {
|
||||||
arguments: true,
|
arguments: true,
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
"use strict";
|
"use strict";
|
||||||
@@ -783,3 +825,230 @@ issue_3420_7: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "true"
|
expect_stdout: "true"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4200: {
|
||||||
|
options = {
|
||||||
|
arguments: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
get p() {
|
||||||
|
return arguments[0];
|
||||||
|
},
|
||||||
|
};
|
||||||
|
console.log(o.p);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {
|
||||||
|
get p() {
|
||||||
|
return arguments[0];
|
||||||
|
},
|
||||||
|
};
|
||||||
|
console.log(o.p);
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4291_1: {
|
||||||
|
options = {
|
||||||
|
arguments: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
arguments[0] = "PASS";
|
||||||
|
return arguments;
|
||||||
|
}()[0]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function() {
|
||||||
|
arguments[0] = "PASS";
|
||||||
|
return arguments;
|
||||||
|
}()[0]);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4291_2: {
|
||||||
|
options = {
|
||||||
|
arguments: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = function() {
|
||||||
|
if (arguments[0])
|
||||||
|
arguments[1] = "PASS";
|
||||||
|
return arguments;
|
||||||
|
}(42);
|
||||||
|
console.log(a[1], a[0], a.length);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = function() {
|
||||||
|
if (arguments[0])
|
||||||
|
arguments[1] = "PASS";
|
||||||
|
return arguments;
|
||||||
|
}(42);
|
||||||
|
console.log(a[1], a[0], a.length);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS 42 1"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4397: {
|
||||||
|
options = {
|
||||||
|
arguments: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(typeof function() {
|
||||||
|
arguments += 0;
|
||||||
|
return arguments[0];
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(typeof function() {
|
||||||
|
arguments += 0;
|
||||||
|
return arguments[0];
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "string"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4410_1: {
|
||||||
|
options = {
|
||||||
|
arguments: true,
|
||||||
|
conditionals: true,
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a) {
|
||||||
|
console.log(arguments[0] === (a = 0) ? "FAIL" : "PASS");
|
||||||
|
})(1);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(a) {
|
||||||
|
console.log(a === (a = 0) ? "FAIL" : "PASS");
|
||||||
|
})(1);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4410_2: {
|
||||||
|
options = {
|
||||||
|
arguments: true,
|
||||||
|
conditionals: true,
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function f(a) {
|
||||||
|
console.log(arguments[0] === (a = 0) ? "FAIL" : "PASS");
|
||||||
|
})(1);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function f(a) {
|
||||||
|
console.log(arguments[0] === (a = 0) ? "FAIL" : "PASS");
|
||||||
|
})(1);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4410_3: {
|
||||||
|
options = {
|
||||||
|
arguments: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
(function f(b) {
|
||||||
|
a-- && f();
|
||||||
|
for (var c = 2; c--;)
|
||||||
|
switch (arguments[0]) {
|
||||||
|
case b = 42:
|
||||||
|
case 42:
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
})(null);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 1;
|
||||||
|
(function f(b) {
|
||||||
|
a-- && f();
|
||||||
|
for (var c = 2; c--;)
|
||||||
|
switch (arguments[0]) {
|
||||||
|
case b = 42:
|
||||||
|
case 42:
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
})(null);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4432: {
|
||||||
|
options = {
|
||||||
|
arguments: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(a) {
|
||||||
|
for (a in { FAIL: 42 });
|
||||||
|
return arguments[0];
|
||||||
|
}() || "PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(a) {
|
||||||
|
for (a in { FAIL: 42 });
|
||||||
|
return arguments[0];
|
||||||
|
}() || "PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4696: {
|
||||||
|
options = {
|
||||||
|
arguments: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
for (arguments in [ 42 ]);
|
||||||
|
for (var a in arguments[0])
|
||||||
|
return "PASS";
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function() {
|
||||||
|
for (arguments in [ 42 ]);
|
||||||
|
for (var a in arguments[0])
|
||||||
|
return "PASS";
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4809: {
|
||||||
|
options = {
|
||||||
|
arguments: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
A = 0;
|
||||||
|
(function() {
|
||||||
|
arguments[A] = "PASS";
|
||||||
|
console.log(arguments[0]);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
A = 0;
|
||||||
|
(function() {
|
||||||
|
arguments[A] = "PASS";
|
||||||
|
console.log(arguments[0]);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|||||||
@@ -13,9 +13,10 @@ holes_and_undefined: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
constant_join: {
|
constant_join_1: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
strings: true,
|
strings: true,
|
||||||
unsafe: true,
|
unsafe: true,
|
||||||
}
|
}
|
||||||
@@ -57,7 +58,7 @@ constant_join: {
|
|||||||
var c5 = [ boo() + bar() + "foo", 1, 2, 3, "bar", bar() + "foo" ].join();
|
var c5 = [ boo() + bar() + "foo", 1, 2, 3, "bar", bar() + "foo" ].join();
|
||||||
var c6 = [ "1,2,,,foo,bar", baz() ].join();
|
var c6 = [ "1,2,,,foo,bar", baz() ].join();
|
||||||
var d = "foo-3bar-baz";
|
var d = "foo-3bar-baz";
|
||||||
var e = [].join(foo + bar);
|
var e = (foo, bar, "");
|
||||||
var f = "";
|
var f = "";
|
||||||
var g = "";
|
var g = "";
|
||||||
}
|
}
|
||||||
@@ -354,3 +355,72 @@ constructor_good: {
|
|||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
expect_warnings: []
|
expect_warnings: []
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsafe_evaluate_modified_binary: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a) {
|
||||||
|
(console && a).push(1);
|
||||||
|
if (a.length)
|
||||||
|
console.log("PASS");
|
||||||
|
})([]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(a) {
|
||||||
|
(console && a).push(1);
|
||||||
|
if (a.length)
|
||||||
|
console.log("PASS");
|
||||||
|
})([]);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe_evaluate_modified_conditional: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a) {
|
||||||
|
(console ? a : []).push(1);
|
||||||
|
if (a.length)
|
||||||
|
console.log("PASS");
|
||||||
|
})([]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(a) {
|
||||||
|
(console ? a : []).push(1);
|
||||||
|
if (a.length)
|
||||||
|
console.log("PASS");
|
||||||
|
})([]);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe_evaluate_modified_sequence: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a) {
|
||||||
|
(0, a).push(1);
|
||||||
|
if (a.length)
|
||||||
|
console.log("PASS");
|
||||||
|
})([]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(a) {
|
||||||
|
(0, a).push(1);
|
||||||
|
if (a.length)
|
||||||
|
console.log("PASS");
|
||||||
|
})([]);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|||||||
1320
test/compress/arrows.js
Normal file
1320
test/compress/arrows.js
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,35 +0,0 @@
|
|||||||
ascii_only_true: {
|
|
||||||
options = {}
|
|
||||||
beautify = {
|
|
||||||
ascii_only : true,
|
|
||||||
ie8 : false,
|
|
||||||
beautify : false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {
|
|
||||||
return "\x000\x001\x007\x008\x00" +
|
|
||||||
"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" +
|
|
||||||
"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" +
|
|
||||||
"\x20\x21\x22\x23 ... \x7d\x7e\x7f\x80\x81 ... \xfe\xff\u0fff\uffff";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_exact: 'function f(){return"\\x000\\x001\\x007\\x008\\0"+"\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\b\\t\\n\\v\\f\\r\\x0e\\x0f"+"\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f"+\' !"# ... }~\\x7f\\x80\\x81 ... \\xfe\\xff\\u0fff\\uffff\'}'
|
|
||||||
}
|
|
||||||
|
|
||||||
ascii_only_false: {
|
|
||||||
options = {}
|
|
||||||
beautify = {
|
|
||||||
ascii_only : false,
|
|
||||||
ie8 : false,
|
|
||||||
beautify : false,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
function f() {
|
|
||||||
return "\x000\x001\x007\x008\x00" +
|
|
||||||
"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" +
|
|
||||||
"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" +
|
|
||||||
"\x20\x21\x22\x23 ... \x7d\x7e\x7f\x80\x81 ... \xfe\xff\u0fff\uffff";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect_exact: 'function f(){return"\\x000\\x001\\x007\\x008\\0"+"\\0\x01\x02\x03\x04\x05\x06\x07\\b\\t\\n\\v\\f\\r\x0e\x0f"+"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"+\' !"# ... }~\x7f\x80\x81 ... \xfe\xff\u0fff\uffff\'}'
|
|
||||||
}
|
|
||||||
@@ -76,9 +76,8 @@ asm_mixed: {
|
|||||||
start = start | 0;
|
start = start | 0;
|
||||||
end = end | 0;
|
end = end | 0;
|
||||||
var sum = 0.0, p = 0, q = 0;
|
var sum = 0.0, p = 0, q = 0;
|
||||||
for (p = start << 3, q = end << 3; (p | 0) < (q | 0); p = p + 8 | 0) {
|
for (p = start << 3, q = end << 3; (p | 0) < (q | 0); p = p + 8 | 0)
|
||||||
sum = sum + +log(values[p >> 3]);
|
sum = sum + +log(values[p >> 3]);
|
||||||
}
|
|
||||||
return +sum;
|
return +sum;
|
||||||
}
|
}
|
||||||
function geometricMean(start, end) {
|
function geometricMean(start, end) {
|
||||||
@@ -91,7 +90,8 @@ asm_mixed: {
|
|||||||
function no_asm_GeometricMean(stdlib, foreign, buffer) {
|
function no_asm_GeometricMean(stdlib, foreign, buffer) {
|
||||||
function logSum(start, end) {
|
function logSum(start, end) {
|
||||||
start |= 0, end |= 0;
|
start |= 0, end |= 0;
|
||||||
for (var sum = 0, p = 0, q = 0, p = start << 3, q = end << 3; (0 | p) < (0 | q); p = p + 8 | 0) sum += +log(values[p >> 3]);
|
for (var sum = 0, p = 0, q = 0, p = start << 3, q = end << 3; (0 | p) < (0 | q); p = p + 8 | 0)
|
||||||
|
sum += +log(values[p >> 3]);
|
||||||
return +sum;
|
return +sum;
|
||||||
}
|
}
|
||||||
function geometricMean(start, end) {
|
function geometricMean(start, end) {
|
||||||
|
|||||||
@@ -290,6 +290,45 @@ increment_decrement_2: {
|
|||||||
expect_stdout: "42"
|
expect_stdout: "42"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lazily_chained_assignments: {
|
||||||
|
options = {
|
||||||
|
assignments: true,
|
||||||
|
collapse_vars: true,
|
||||||
|
conditionals: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
if (a = console.log("foo"))
|
||||||
|
a = console.log("bar");
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
function g(b) {
|
||||||
|
if (b = console.log("baz"))
|
||||||
|
;
|
||||||
|
else
|
||||||
|
b = console.log("moo");
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
console.log(f(), g());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a) {
|
||||||
|
return console.log("foo") && console.log("bar");
|
||||||
|
}
|
||||||
|
function g(b) {
|
||||||
|
return console.log("baz") || console.log("moo");
|
||||||
|
}
|
||||||
|
console.log(f(), g());
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"baz",
|
||||||
|
"moo",
|
||||||
|
"undefined undefined",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
issue_3375_1: {
|
issue_3375_1: {
|
||||||
options = {
|
options = {
|
||||||
assignments: true,
|
assignments: true,
|
||||||
@@ -461,3 +500,365 @@ issue_3949_2: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "100"
|
expect_stdout: "100"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4521: {
|
||||||
|
options = {
|
||||||
|
assignments: true,
|
||||||
|
dead_code: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = (a = 42 | a) ? console.log(a) : 0;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = (a |= 42) ? console.log(a) : 0;
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
}
|
||||||
|
|
||||||
|
logical_assignments: {
|
||||||
|
input: {
|
||||||
|
var a = 42, b = null, c;
|
||||||
|
a &&= "foo";
|
||||||
|
b ||= "bar";
|
||||||
|
c ??= "baz";
|
||||||
|
console.log(a, b, c);
|
||||||
|
}
|
||||||
|
expect_exact: 'var a=42,b=null,c;a&&="foo";b||="bar";c??="baz";console.log(a,b,c);'
|
||||||
|
expect_stdout: "foo bar baz"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
logical_collapse_vars_1: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "FAIL", b = false;
|
||||||
|
a = "PASS";
|
||||||
|
b ??= a;
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "FAIL", b = false;
|
||||||
|
a = "PASS";
|
||||||
|
b ??= a;
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
logical_collapse_vars_2: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS";
|
||||||
|
(function(b) {
|
||||||
|
b ||= (a = "FAIL", {});
|
||||||
|
return b;
|
||||||
|
})(console).log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "PASS";
|
||||||
|
(function(b) {
|
||||||
|
return b ||= (a = "FAIL", {});
|
||||||
|
})(console).log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
logical_collapse_vars_3: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 6;
|
||||||
|
a *= 7;
|
||||||
|
a ??= "FAIL";
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 6;
|
||||||
|
a = a * 7 ?? "FAIL";
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
logical_reduce_vars: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS", b = 42;
|
||||||
|
b ??= a = "FAIL";
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "PASS", b = 42;
|
||||||
|
b ??= a = "FAIL";
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
logical_side_effects: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS", b = 42;
|
||||||
|
b ??= a = "FAIL";
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "PASS", b = 42;
|
||||||
|
b ??= a = "FAIL";
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
evaluate_lazy_assignment: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 42;
|
||||||
|
console.log(a &&= "PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4815_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS";
|
||||||
|
42..p &&= a = "FAIL";
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "PASS";
|
||||||
|
42..p &&= a = "FAIL";
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4815_2: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS";
|
||||||
|
42..p &&= a = "FAIL";
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "PASS";
|
||||||
|
42..p &&= a = "FAIL";
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4819: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(void 0 === ([].p &&= 42));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(void 0 === ([].p &&= 42));
|
||||||
|
}
|
||||||
|
expect_stdout: "true"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4827_1: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
A = "FAIL";
|
||||||
|
var a = A, b = "PASS", c;
|
||||||
|
c &&= b = a, console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = A = "FAIL", b = "PASS", c;
|
||||||
|
c &&= b = a, console.log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4827_2: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
inline: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 0, b = "PASS";
|
||||||
|
function f(c) {
|
||||||
|
a++,
|
||||||
|
c &&= b = a;
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 0, b = "PASS";
|
||||||
|
a++,
|
||||||
|
c &&= b = a;
|
||||||
|
var c;
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4827_3: {
|
||||||
|
options = {
|
||||||
|
merge_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 0, b, c;
|
||||||
|
a++;
|
||||||
|
c &&= b = a;
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 0, b, c;
|
||||||
|
a++;
|
||||||
|
c &&= b = a;
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4876: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try {
|
||||||
|
var a = null;
|
||||||
|
var b = a &&= 42;
|
||||||
|
b.p;
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
try {
|
||||||
|
var a = null;
|
||||||
|
var b = a &&= 42;
|
||||||
|
b.p;
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4924_1: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a, b;
|
||||||
|
console.log("PASS");
|
||||||
|
a = function() {};
|
||||||
|
b = function() {}(b ||= a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var b;
|
||||||
|
console.log("PASS");
|
||||||
|
b = void (b ||= function() {});
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4924_2: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
dead_code: true,
|
||||||
|
passes: 2,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a, b;
|
||||||
|
console.log("PASS");
|
||||||
|
a = function() {};
|
||||||
|
b = function() {}(b ||= a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5670: {
|
||||||
|
options = {
|
||||||
|
assignments: true,
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a, b) {
|
||||||
|
a && a && (a = b += "") || console.log("PASS");
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(a, b) {
|
||||||
|
a = a,
|
||||||
|
console.log("PASS");
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|||||||
3707
test/compress/awaits.js
Normal file
3707
test/compress/awaits.js
Normal file
File diff suppressed because it is too large
Load Diff
106
test/compress/bigint.js
Normal file
106
test/compress/bigint.js
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
arithmetic: {
|
||||||
|
input: {
|
||||||
|
console.log(((1n + 0x2n) * (0o3n - -4n)) >> (5n - 6n));
|
||||||
|
}
|
||||||
|
expect_exact: "console.log((1n+0x2n)*(0o3n- -4n)>>5n-6n);"
|
||||||
|
expect_stdout: "42n"
|
||||||
|
node_version: ">=10.4.0"
|
||||||
|
}
|
||||||
|
|
||||||
|
minus_dot: {
|
||||||
|
input: {
|
||||||
|
console.log(typeof -42n.toString(), typeof (-42n).toString());
|
||||||
|
}
|
||||||
|
expect_exact: "console.log(typeof-42n.toString(),typeof(-42n).toString());"
|
||||||
|
expect_stdout: "number string"
|
||||||
|
node_version: ">=10.4.0"
|
||||||
|
}
|
||||||
|
|
||||||
|
evaluate: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log((0xDEAD_BEEFn).toString(16));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(0xdeadbeefn.toString(16));
|
||||||
|
}
|
||||||
|
expect_stdout: "deadbeef"
|
||||||
|
node_version: ">=10.4.0"
|
||||||
|
}
|
||||||
|
|
||||||
|
Number: {
|
||||||
|
options = {
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(Number(-0xfeed_dead_beef_badn));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(+("" + -0xfeed_dead_beef_badn));
|
||||||
|
}
|
||||||
|
expect_stdout: "-1148098955808013200"
|
||||||
|
node_version: ">=10.4.0"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4590: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
A = 1;
|
||||||
|
0n || console.log("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
A = 1;
|
||||||
|
0n || console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=10.4.0"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4801: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
collapse_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try {
|
||||||
|
(function(a) {
|
||||||
|
A = 42;
|
||||||
|
a || A;
|
||||||
|
})(!(0 == 42 >> 0o644n));
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
try {
|
||||||
|
(function(a) {
|
||||||
|
0 != (A = 42) >> 0o644n || A;
|
||||||
|
})();
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=10.4.0"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5728: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log("" + 4n + 2);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("42");
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
node_version: ">=10.4.0"
|
||||||
|
}
|
||||||
@@ -47,3 +47,45 @@ keep_some_blocks: {
|
|||||||
} else stuff();
|
} else stuff();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_1666: {
|
||||||
|
input: {
|
||||||
|
var a = 42;
|
||||||
|
{
|
||||||
|
function a() {}
|
||||||
|
a();
|
||||||
|
}
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 42;
|
||||||
|
{
|
||||||
|
function a() {}
|
||||||
|
a();
|
||||||
|
}
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1666_strict: {
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
var a = 42;
|
||||||
|
{
|
||||||
|
function a() {}
|
||||||
|
a();
|
||||||
|
}
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
var a = 42;
|
||||||
|
{
|
||||||
|
function a() {}
|
||||||
|
a();
|
||||||
|
}
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|||||||
@@ -29,6 +29,486 @@ 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_1d: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
return (a = false) || a;
|
||||||
|
}
|
||||||
|
console.log(f(null), f(42));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a) {
|
||||||
|
return a = !1;
|
||||||
|
}
|
||||||
|
console.log(f(null), f(42));
|
||||||
|
}
|
||||||
|
expect_stdout: "false false"
|
||||||
|
}
|
||||||
|
|
||||||
|
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_2e: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b) {
|
||||||
|
return (a && b) && 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,
|
||||||
@@ -153,3 +633,234 @@ issue_3690: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4374: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
if_return: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
console.log(f());
|
||||||
|
function f(a) {
|
||||||
|
if (null) return 0;
|
||||||
|
if (a) return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function() {
|
||||||
|
console.log(function(a) {
|
||||||
|
return !null && a ? 1 : 0;
|
||||||
|
}());
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "0"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5028_1: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
console.log(function() {
|
||||||
|
return a-- ? a-- ? "FAIL 1" : "PASS" : "FAIL 2";
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 1;
|
||||||
|
console.log(function() {
|
||||||
|
return a-- ? a-- ? "FAIL 1" : "PASS" : "FAIL 2";
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5028_2: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
(function() {
|
||||||
|
if (a--)
|
||||||
|
if (a--)
|
||||||
|
a = "FAIL";
|
||||||
|
else
|
||||||
|
return;
|
||||||
|
})();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 1;
|
||||||
|
(function() {
|
||||||
|
a-- && a-- && (a = "FAIL");
|
||||||
|
})();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "-1"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5028_3: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
evaluate: true,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
(function() {
|
||||||
|
if (a--)
|
||||||
|
if (a--)
|
||||||
|
a = "FAIL";
|
||||||
|
else
|
||||||
|
return;
|
||||||
|
})();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 1;
|
||||||
|
(function() {
|
||||||
|
a-- && a-- && (a = "FAIL");
|
||||||
|
})();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "-1"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5041_1: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 42;
|
||||||
|
if (a)
|
||||||
|
if ([ a = null ])
|
||||||
|
if (a)
|
||||||
|
console.log("FAIL");
|
||||||
|
else
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 42;
|
||||||
|
a && [ a = null ] && (a ? console.log("FAIL") : console.log("PASS"));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5041_2: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
if (!a)
|
||||||
|
if (a = 42)
|
||||||
|
if (a)
|
||||||
|
console.log("PASS");
|
||||||
|
else
|
||||||
|
console.log("FAIL");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
a || (a = 42) && (a ? console.log("PASS") : console.log("FAIL"));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5228: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
return !function() {
|
||||||
|
do {
|
||||||
|
return null;
|
||||||
|
} while (console);
|
||||||
|
}();
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function() {
|
||||||
|
do {
|
||||||
|
return !0;
|
||||||
|
} while (console);
|
||||||
|
return !0;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "true"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5469: {
|
||||||
|
options = {
|
||||||
|
assignments: true,
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
pure_getters: "strict",
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function f(a) {
|
||||||
|
a && 42[a = A && null];
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function f(a) {
|
||||||
|
a && A,
|
||||||
|
0;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5694_1: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var Infinity;
|
||||||
|
// Node.js v0.12~6 (vm): 42
|
||||||
|
console.log((Infinity = 42) && Infinity);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var Infinity;
|
||||||
|
console.log((Infinity = 42) && Infinity);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5694_2: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var undefined;
|
||||||
|
// Node.js v0.12~6 (vm): NaN
|
||||||
|
console.log(("foo", ++undefined) || undefined);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var undefined;
|
||||||
|
console.log(("foo", ++undefined) || undefined);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|||||||
4032
test/compress/classes.js
Normal file
4032
test/compress/classes.js
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -40,6 +40,22 @@ unsafe_comps: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsafe_in_instanceof: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
unsafe_comps: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
42 in a;
|
||||||
|
f() instanceof "foo";
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
dont_change_in_or_instanceof_expressions: {
|
dont_change_in_or_instanceof_expressions: {
|
||||||
input: {
|
input: {
|
||||||
1 in 1;
|
1 in 1;
|
||||||
@@ -259,6 +275,7 @@ issue_2857_3: {
|
|||||||
issue_2857_4: {
|
issue_2857_4: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
|
conditionals: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(a, p) {
|
function f(a, p) {
|
||||||
@@ -289,6 +306,7 @@ issue_2857_4: {
|
|||||||
issue_2857_5: {
|
issue_2857_5: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
|
conditionals: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(a, p) {
|
function f(a, p) {
|
||||||
@@ -489,7 +507,37 @@ 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,
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
A || B || void 0 === a || null === a || C;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
A || B || null == a || C;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ concat_1: {
|
|||||||
|
|
||||||
var e = 1 + x() + 2 + "X" + 3 + "boo";
|
var e = 1 + x() + 2 + "X" + 3 + "boo";
|
||||||
|
|
||||||
// be careful with concatentation with "\0" with octal-looking strings.
|
// be careful with concatenation with "\0" with octal-looking strings.
|
||||||
var f = "\0" + 360 + "\0" + 8 + "\0";
|
var f = "\0" + 360 + "\0" + 8 + "\0";
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
@@ -273,6 +273,23 @@ concat_9: {
|
|||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
concat_sequence: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
strings: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
console.log(12 + (a = null, "34" + a));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(12 + "34" + null);
|
||||||
|
}
|
||||||
|
expect_stdout: "1234null"
|
||||||
|
}
|
||||||
|
|
||||||
issue_3689: {
|
issue_3689: {
|
||||||
options = {
|
options = {
|
||||||
strings: true,
|
strings: true,
|
||||||
@@ -289,3 +306,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"
|
||||||
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
2233
test/compress/const.js
Normal file
2233
test/compress/const.js
Normal file
File diff suppressed because it is too large
Load Diff
@@ -53,13 +53,17 @@ dead_code_2_should_warn: {
|
|||||||
g();
|
g();
|
||||||
x = 10;
|
x = 10;
|
||||||
throw new Error("foo");
|
throw new Error("foo");
|
||||||
|
{
|
||||||
var x;
|
var x;
|
||||||
function g(){};
|
function g(){};
|
||||||
}
|
}
|
||||||
|
}
|
||||||
f();
|
f();
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
node_version: "<=4"
|
expect_warnings: [
|
||||||
|
"WARN: Dropping unreachable code [test/compress/dead-code.js:8,12]",
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
dead_code_constant_boolean_should_warn_more: {
|
dead_code_constant_boolean_should_warn_more: {
|
||||||
@@ -85,15 +89,27 @@ dead_code_constant_boolean_should_warn_more: {
|
|||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
|
{
|
||||||
var foo;
|
var foo;
|
||||||
function bar() {}
|
function bar() {}
|
||||||
|
}
|
||||||
// nothing for the while
|
// nothing for the while
|
||||||
// as for the for, it should keep:
|
// as for the for, it should keep:
|
||||||
var moo;
|
|
||||||
var x = 10, y;
|
var x = 10, y;
|
||||||
|
var moo;
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
|
expect_warnings: [
|
||||||
|
"WARN: + in boolean context always true [test/compress/dead-code.js:1,33]",
|
||||||
|
"WARN: Boolean || always true [test/compress/dead-code.js:1,16]",
|
||||||
|
"WARN: Dropping unreachable code [test/compress/dead-code.js:1,45]",
|
||||||
|
"WARN: Boolean expression always true [test/compress/dead-code.js:6,47]",
|
||||||
|
"WARN: Boolean && always false [test/compress/dead-code.js:6,28]",
|
||||||
|
"WARN: Dropping unreachable code [test/compress/dead-code.js:6,63]",
|
||||||
|
"WARN: Dropping side-effect-free statement [test/compress/dead-code.js:1,15]",
|
||||||
|
"WARN: Dropping side-effect-free statement [test/compress/dead-code.js:6,28]",
|
||||||
|
]
|
||||||
node_version: "<=4"
|
node_version: "<=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -712,7 +728,7 @@ issue_2749: {
|
|||||||
expect: {
|
expect: {
|
||||||
var a = 2, c = "PASS";
|
var a = 2, c = "PASS";
|
||||||
while (a--)
|
while (a--)
|
||||||
b = void 0, b ? c = "FAIL" : b = 1;
|
b = void 0, b ? c = "FAIL" : 1;
|
||||||
var b;
|
var b;
|
||||||
console.log(c);
|
console.log(c);
|
||||||
}
|
}
|
||||||
@@ -923,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,
|
||||||
@@ -1290,8 +1485,6 @@ self_assignments_5: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var i = 0, l = [ "FAIL", "PASS" ];
|
var i = 0, l = [ "FAIL", "PASS" ];
|
||||||
l[0];
|
|
||||||
l[0];
|
|
||||||
l[0] = l[1];
|
l[0] = l[1];
|
||||||
console.log(l[0], 2);
|
console.log(l[0], 2);
|
||||||
}
|
}
|
||||||
@@ -1362,3 +1555,178 @@ issue_4051: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4366: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
return "PASS";
|
||||||
|
({
|
||||||
|
p: 42,
|
||||||
|
get p() {},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
console.log(f());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
return "PASS";
|
||||||
|
}
|
||||||
|
console.log(f());
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4570: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
inline: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = function(b) {
|
||||||
|
return a += b;
|
||||||
|
}() ? 0 : a;
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = (a += void 0) ? 0 : a;
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "NaN"
|
||||||
|
}
|
||||||
|
|
||||||
|
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"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5506: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try {
|
||||||
|
(function(a) {
|
||||||
|
var b = 1;
|
||||||
|
(function f() {
|
||||||
|
try {
|
||||||
|
b-- && f();
|
||||||
|
} catch (c) {}
|
||||||
|
console.log(a);
|
||||||
|
a = 42 in (a = "bar");
|
||||||
|
})();
|
||||||
|
})("foo");
|
||||||
|
} catch (e) {}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
try {
|
||||||
|
(function(a) {
|
||||||
|
var b = 1;
|
||||||
|
(function f() {
|
||||||
|
try {
|
||||||
|
b-- && f();
|
||||||
|
} catch (c) {}
|
||||||
|
console.log(a);
|
||||||
|
a = 42 in (a = "bar");
|
||||||
|
})();
|
||||||
|
})("foo");
|
||||||
|
} catch (e) {}
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5641: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
if (a || b) {
|
||||||
|
var b = "PASS", c = b && console.log(b);
|
||||||
|
} else
|
||||||
|
var d = a || b;
|
||||||
|
}
|
||||||
|
f(42);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a) {
|
||||||
|
var b, c, d;
|
||||||
|
(a || b) && (b = "PASS") && console.log(b);
|
||||||
|
}
|
||||||
|
f(42);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|||||||
3137
test/compress/default-values.js
Normal file
3137
test/compress/default-values.js
Normal file
File diff suppressed because it is too large
Load Diff
4243
test/compress/destructured.js
Normal file
4243
test/compress/destructured.js
Normal file
File diff suppressed because it is too large
Load Diff
@@ -129,3 +129,47 @@ valid_after_invalid_2: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "undefined"
|
expect_stdout: "undefined"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_5368_1: {
|
||||||
|
expression = true
|
||||||
|
options = {
|
||||||
|
directives: true,
|
||||||
|
expression: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"foo"
|
||||||
|
}
|
||||||
|
expect_exact: '"foo"'
|
||||||
|
expect_stdout: "foo"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5368_2: {
|
||||||
|
expression = true
|
||||||
|
options = {
|
||||||
|
directives: true,
|
||||||
|
expression: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
"foo";
|
||||||
|
})()
|
||||||
|
}
|
||||||
|
expect_exact: "function(){}()"
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5368_3: {
|
||||||
|
options = {
|
||||||
|
directives: true,
|
||||||
|
expression: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"foo";
|
||||||
|
(function() {
|
||||||
|
"bar";
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function() {})();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -399,18 +399,18 @@ unsafe_object_accessor: {
|
|||||||
function f() {
|
function f() {
|
||||||
var a = {
|
var a = {
|
||||||
get b() {},
|
get b() {},
|
||||||
set b() {}
|
set b(v) {},
|
||||||
};
|
};
|
||||||
return {a:a};
|
return { a: a };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function f() {
|
function f() {
|
||||||
var a = {
|
var a = {
|
||||||
get b() {},
|
get b() {},
|
||||||
set b() {}
|
set b(v) {},
|
||||||
};
|
};
|
||||||
return {a:a};
|
return { a: a };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -684,25 +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();
|
|
||||||
}
|
}
|
||||||
|
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: {
|
||||||
@@ -723,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
|
||||||
}
|
}
|
||||||
@@ -747,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
|
||||||
}
|
}
|
||||||
@@ -846,6 +868,8 @@ unsafe_charAt_noop: {
|
|||||||
unsafe: true,
|
unsafe: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
|
s = "foo";
|
||||||
|
x = 42;
|
||||||
console.log(
|
console.log(
|
||||||
s.charAt(0),
|
s.charAt(0),
|
||||||
"string".charAt(x),
|
"string".charAt(x),
|
||||||
@@ -853,12 +877,48 @@ unsafe_charAt_noop: {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
|
s = "foo";
|
||||||
|
x = 42;
|
||||||
console.log(
|
console.log(
|
||||||
s[0],
|
s[0] || "",
|
||||||
"string"[0 | x],
|
"string"[0 | x] || "",
|
||||||
(typeof x)[0]
|
(typeof x)[0] || ""
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
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]",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
instanceof_lambda: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(42 instanceof function() {});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(false);
|
||||||
|
}
|
||||||
|
expect_stdout: "false"
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_1649: {
|
issue_1649: {
|
||||||
@@ -2725,8 +2785,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;
|
||||||
}();
|
}();
|
||||||
}
|
}
|
||||||
@@ -2800,7 +2859,7 @@ operator_in: {
|
|||||||
console.log("PASS" in { });
|
console.log("PASS" in { });
|
||||||
console.log("FAIL" in { });
|
console.log("FAIL" in { });
|
||||||
console.log("toString" in { });
|
console.log("toString" in { });
|
||||||
console.log(true);
|
console.log("toString" in { toString: 3 });
|
||||||
}
|
}
|
||||||
expect_stdout: [
|
expect_stdout: [
|
||||||
"true",
|
"true",
|
||||||
@@ -3014,3 +3073,346 @@ issue_4119_4: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4214: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
return function() {
|
||||||
|
try {
|
||||||
|
return a;
|
||||||
|
} finally {
|
||||||
|
var b = 0;
|
||||||
|
}
|
||||||
|
}(a++ && this());
|
||||||
|
}
|
||||||
|
var c = f();
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var c = function(a) {
|
||||||
|
return function() {
|
||||||
|
try {
|
||||||
|
return a;
|
||||||
|
} finally {}
|
||||||
|
}(a++ && this());
|
||||||
|
}();
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect_stdout: "NaN"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4271: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
({
|
||||||
|
p: null,
|
||||||
|
q: (console.log("foo"), 42),
|
||||||
|
p: function() {}
|
||||||
|
})[console.log("bar"), "p"] && console.log("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
({
|
||||||
|
p: null,
|
||||||
|
q: (console.log("foo"), 42),
|
||||||
|
p: function() {}
|
||||||
|
})[console.log("bar"), "p"],
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
"PASS",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4393: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function f(a) {
|
||||||
|
a = "PASS";
|
||||||
|
console.log(arguments[0]);
|
||||||
|
})("FAIL");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function f(a) {
|
||||||
|
a = "PASS";
|
||||||
|
console.log(arguments[0]);
|
||||||
|
})("FAIL");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4422: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function f(a) {
|
||||||
|
a = "FAIL 1";
|
||||||
|
arguments[0] = "PASS";
|
||||||
|
return a;
|
||||||
|
}("FAIL 2"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(a) {
|
||||||
|
a = "FAIL 1";
|
||||||
|
arguments[0] = "PASS";
|
||||||
|
return a;
|
||||||
|
}("FAIL 2"));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4480: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = function f(b) {
|
||||||
|
b = "FAIL";
|
||||||
|
arguments[0] = "PASS";
|
||||||
|
var arguments = 0;
|
||||||
|
console.log(b);
|
||||||
|
}(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = function(b) {
|
||||||
|
b = "FAIL";
|
||||||
|
arguments[0] = "PASS";
|
||||||
|
var arguments = 0;
|
||||||
|
console.log(b);
|
||||||
|
}(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4552: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
keep_fnames: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = function f(b) {
|
||||||
|
return function() {
|
||||||
|
b++;
|
||||||
|
try {
|
||||||
|
return b;
|
||||||
|
} catch (e) {}
|
||||||
|
}();
|
||||||
|
}();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = function f(b) {
|
||||||
|
return function() {
|
||||||
|
b++;
|
||||||
|
try {
|
||||||
|
return b;
|
||||||
|
} catch (e) {}
|
||||||
|
}();
|
||||||
|
}();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "NaN"
|
||||||
|
}
|
||||||
|
|
||||||
|
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"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5558: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 99, b = 0;
|
||||||
|
a++;
|
||||||
|
b++;
|
||||||
|
b += a;
|
||||||
|
b *= a;
|
||||||
|
b += a;
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 99, b = 0;
|
||||||
|
b++,
|
||||||
|
b = (b += ++a) * a + a,
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "100"
|
||||||
|
}
|
||||||
|
|||||||
147
test/compress/exponentiation.js
Normal file
147
test/compress/exponentiation.js
Normal file
@@ -0,0 +1,147 @@
|
|||||||
|
precedence_1: {
|
||||||
|
input: {
|
||||||
|
console.log(-4 ** 3 ** 2);
|
||||||
|
}
|
||||||
|
expect_exact: "console.log((-4)**3**2);"
|
||||||
|
expect_stdout: "-262144"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
precedence_2: {
|
||||||
|
input: {
|
||||||
|
console.log(-4 ** (3 ** 2));
|
||||||
|
}
|
||||||
|
expect_exact: "console.log((-4)**3**2);"
|
||||||
|
expect_stdout: "-262144"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
precedence_3: {
|
||||||
|
input: {
|
||||||
|
console.log(-(4 ** 3) ** 2);
|
||||||
|
}
|
||||||
|
expect_exact: "console.log((-(4**3))**2);"
|
||||||
|
expect_stdout: "4096"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
precedence_4: {
|
||||||
|
input: {
|
||||||
|
console.log((-4 ** 3) ** 2);
|
||||||
|
}
|
||||||
|
expect_exact: "console.log(((-4)**3)**2);"
|
||||||
|
expect_stdout: "4096"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
await: {
|
||||||
|
input: {
|
||||||
|
(async a => a * await a ** ++a % a)(2).then(console.log);
|
||||||
|
}
|
||||||
|
expect_exact: "(async a=>a*(await a)**++a%a)(2).then(console.log);"
|
||||||
|
expect_stdout: "1"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
assignment_1: {
|
||||||
|
input: {
|
||||||
|
var a = 2;
|
||||||
|
a **= 5;
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: "var a=2;a**=5;console.log(a);"
|
||||||
|
expect_stdout: "32"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
assignment_2: {
|
||||||
|
input: {
|
||||||
|
var a = 8n;
|
||||||
|
a **= a;
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: "var a=8n;a**=a;console.log(a);"
|
||||||
|
expect_stdout: "16777216n"
|
||||||
|
node_version: ">=10.4.0"
|
||||||
|
}
|
||||||
|
|
||||||
|
evaluate: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(1 + 2 ** 3 - 4);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(5);
|
||||||
|
}
|
||||||
|
expect_stdout: "5"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4664: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
new function(a) {
|
||||||
|
console.log(typeof f, a, typeof this);
|
||||||
|
}((A = 0, (NaN ^ 1) * 2 ** 30), 0);
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function f() {
|
||||||
|
new function(a) {
|
||||||
|
console.log(typeof f, 2 ** 30, typeof this);
|
||||||
|
}(A = 0);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "function 1073741824 object"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4715: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
A = 1;
|
||||||
|
console.log((-0) ** A + 0);
|
||||||
|
console.log((-0) ** A - 0);
|
||||||
|
console.log((-0) ** A * 1);
|
||||||
|
console.log((-0) ** A / 1);
|
||||||
|
console.log(Math.pow(-0, A) + 0);
|
||||||
|
console.log(Math.pow(-0, A) - 0);
|
||||||
|
console.log(Math.pow(-0, A) * 1);
|
||||||
|
console.log(Math.pow(-0, A) / 1);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
A = 1;
|
||||||
|
console.log((-0) ** A + 0);
|
||||||
|
console.log((-0) ** A);
|
||||||
|
console.log((-0) ** A * 1);
|
||||||
|
console.log((-0) ** A);
|
||||||
|
console.log(Math.pow(-0, A) + 0);
|
||||||
|
console.log(+Math.pow(-0, A));
|
||||||
|
console.log(+Math.pow(-0, A));
|
||||||
|
console.log(+Math.pow(-0, A));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"0",
|
||||||
|
"-0",
|
||||||
|
"-0",
|
||||||
|
"-0",
|
||||||
|
"0",
|
||||||
|
"-0",
|
||||||
|
"-0",
|
||||||
|
"-0",
|
||||||
|
]
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
582
test/compress/exports.js
Normal file
582
test/compress/exports.js
Normal file
@@ -0,0 +1,582 @@
|
|||||||
|
refs: {
|
||||||
|
input: {
|
||||||
|
export {};
|
||||||
|
export { a, b as B, c as case, d as default };
|
||||||
|
}
|
||||||
|
expect_exact: "export{};export{a,b as B,c as case,d as default};"
|
||||||
|
}
|
||||||
|
|
||||||
|
var_defs: {
|
||||||
|
input: {
|
||||||
|
export const a = 1;
|
||||||
|
export let b = 2, c = 3;
|
||||||
|
export var { d, e: [] } = f;
|
||||||
|
}
|
||||||
|
expect_exact: "export const a=1;export let b=2,c=3;export var{d,e:[]}=f;"
|
||||||
|
}
|
||||||
|
|
||||||
|
defuns: {
|
||||||
|
input: {
|
||||||
|
export class A {}
|
||||||
|
export function e() {}
|
||||||
|
export function* f(a) {}
|
||||||
|
export async function g(b, c) {}
|
||||||
|
export async function* h({}, ...[]) {}
|
||||||
|
}
|
||||||
|
expect_exact: "export class A{}export function e(){}export function*f(a){}export async function g(b,c){}export async function*h({},...[]){}"
|
||||||
|
}
|
||||||
|
|
||||||
|
defaults: {
|
||||||
|
input: {
|
||||||
|
export default 42;
|
||||||
|
export default async;
|
||||||
|
export default (x, y) => x * x;
|
||||||
|
export default class {};
|
||||||
|
export default function*(a, b) {};
|
||||||
|
export default async function f({ c }, ...[ d ]) {};
|
||||||
|
}
|
||||||
|
expect_exact: "export default 42;export default async;export default(x,y)=>x*x;export default class{}export default function*(a,b){}export default async function f({c},...[d]){}"
|
||||||
|
}
|
||||||
|
|
||||||
|
defaults_parentheses_1: {
|
||||||
|
input: {
|
||||||
|
export default function() {
|
||||||
|
console.log("FAIL");
|
||||||
|
}(console.log("PASS"));
|
||||||
|
}
|
||||||
|
expect_exact: 'export default function(){console.log("FAIL")}console.log("PASS");'
|
||||||
|
}
|
||||||
|
|
||||||
|
defaults_parentheses_2: {
|
||||||
|
input: {
|
||||||
|
export default (async function() {
|
||||||
|
console.log("PASS");
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_exact: 'export default(async function(){console.log("PASS")})();'
|
||||||
|
}
|
||||||
|
|
||||||
|
defaults_parentheses_3: {
|
||||||
|
input: {
|
||||||
|
export default (42, "PASS");
|
||||||
|
}
|
||||||
|
expect_exact: 'export default(42,"PASS");'
|
||||||
|
}
|
||||||
|
|
||||||
|
defaults_parentheses_4: {
|
||||||
|
input: {
|
||||||
|
export default (function f() {});
|
||||||
|
}
|
||||||
|
expect_exact: "export default(function f(){});"
|
||||||
|
}
|
||||||
|
|
||||||
|
defaults_parentheses_5: {
|
||||||
|
input: {
|
||||||
|
export default (function(a) {
|
||||||
|
console.log(a[0]);
|
||||||
|
}`PASS`);
|
||||||
|
}
|
||||||
|
expect_exact: "export default(function(a){console.log(a[0])})`PASS`;"
|
||||||
|
}
|
||||||
|
|
||||||
|
defaults_parentheses_6: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export default !function() {
|
||||||
|
while (!console);
|
||||||
|
}() ? "PASS" : "FAIL";
|
||||||
|
}
|
||||||
|
expect_exact: 'export default(function(){while(!console);})()?"FAIL":"PASS";'
|
||||||
|
}
|
||||||
|
|
||||||
|
defaults_regexp: {
|
||||||
|
input: {
|
||||||
|
export default /foo/;
|
||||||
|
}
|
||||||
|
expect_exact: "export default/foo/;"
|
||||||
|
}
|
||||||
|
|
||||||
|
foreign: {
|
||||||
|
input: {
|
||||||
|
export * from "foo";
|
||||||
|
export {} from "bar";
|
||||||
|
export * as a from "baz";
|
||||||
|
export { default } from "moo";
|
||||||
|
export { b, c as case, default as delete, d } from "moz";
|
||||||
|
}
|
||||||
|
expect_exact: 'export*from"foo";export{}from"bar";export*as a from"baz";export{default}from"moo";export{b,c as case,default as delete,d}from"moz";'
|
||||||
|
}
|
||||||
|
|
||||||
|
non_identifiers: {
|
||||||
|
beautify = {
|
||||||
|
quote_style: 3,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export * as "42" from 'foo';
|
||||||
|
export { '42', "delete" as 'foo' } from "bar";
|
||||||
|
}
|
||||||
|
expect_exact: "export*as\"42\"from'foo';export{'42',delete as foo}from\"bar\";"
|
||||||
|
}
|
||||||
|
|
||||||
|
same_quotes: {
|
||||||
|
beautify = {
|
||||||
|
beautify: true,
|
||||||
|
quote_style: 3,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export * from 'foo';
|
||||||
|
export {} from "bar";
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"export * from 'foo';",
|
||||||
|
"",
|
||||||
|
'export {} from "bar";',
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_unused: {
|
||||||
|
options = {
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export default 42;
|
||||||
|
export default (x, y) => x * x;
|
||||||
|
export default class A extends B { get p() { h() } }
|
||||||
|
export default function*(a, b) {}
|
||||||
|
export default async function f({ c }, ...[ d ]) {}
|
||||||
|
export var e;
|
||||||
|
export function g(x, [ y ], ...z) {}
|
||||||
|
function h() {}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
export default 42;
|
||||||
|
export default (x, y) => x * x;
|
||||||
|
export default class extends B { get p() { h() } }
|
||||||
|
export default function*(a, b) {}
|
||||||
|
export default async function({}) {}
|
||||||
|
export var e;
|
||||||
|
export function g(x, []) {}
|
||||||
|
function h() {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle: {
|
||||||
|
rename = false
|
||||||
|
mangle = {
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
const a = 42;
|
||||||
|
export let b, { foo: c } = a;
|
||||||
|
export function f(d, { [b]: e }) {
|
||||||
|
d(e, f);
|
||||||
|
}
|
||||||
|
export default a;
|
||||||
|
export default async function g(x, ...{ [c]: y }) {
|
||||||
|
(await x)(g, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
const t = 42;
|
||||||
|
export let b, { foo: c } = t;
|
||||||
|
export function f(t, { [b]: o }) {
|
||||||
|
t(o, f);
|
||||||
|
}
|
||||||
|
export default t;
|
||||||
|
export default async function e(t, ...{ [c]: o}) {
|
||||||
|
(await t)(e, o);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_rename: {
|
||||||
|
rename = true
|
||||||
|
mangle = {
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
const a = 42;
|
||||||
|
export let b, { foo: c } = a;
|
||||||
|
export function f(d, { [b]: e }) {
|
||||||
|
d(e, f);
|
||||||
|
}
|
||||||
|
export default a;
|
||||||
|
export default async function g(x, ...{ [c]: y }) {
|
||||||
|
(await x)(g, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
const t = 42;
|
||||||
|
export let b, { foo: c } = t;
|
||||||
|
export function f(t, { [b]: o }) {
|
||||||
|
t(o, f);
|
||||||
|
}
|
||||||
|
export default t;
|
||||||
|
export default async function e(t, ...{ [c]: o}) {
|
||||||
|
(await t)(e, o);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
hoist_exports_1: {
|
||||||
|
options = {
|
||||||
|
hoist_exports: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export { a };
|
||||||
|
export var b;
|
||||||
|
export function f() {}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var b;
|
||||||
|
function f() {}
|
||||||
|
export { a, b, f };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
hoist_exports_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
hoist_exports: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
const a = 42;
|
||||||
|
export let bbb, { foo: ccc } = a;
|
||||||
|
export function fff(d, { [bbb]: e }) {
|
||||||
|
d(e, fff);
|
||||||
|
}
|
||||||
|
export default a;
|
||||||
|
export default async function g(x, ...{ [ccc]: y }) {
|
||||||
|
(await x)(g, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
let e, a = 42..foo;
|
||||||
|
function f(t, { [e]: o }) {
|
||||||
|
t(o, f);
|
||||||
|
}
|
||||||
|
export default 42;
|
||||||
|
export default async function n(t, ...{ [a]: o }) {
|
||||||
|
(await t)(n, o);
|
||||||
|
};
|
||||||
|
export { e as bbb, a as ccc, f as fff };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
hoist_vars: {
|
||||||
|
options = {
|
||||||
|
hoist_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
export var b = 42;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
export var b = 42;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
keep_return_values: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export default function() {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
export default function f() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
export default function() {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
export default function f() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
in_use: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export function f() {}
|
||||||
|
f.prototype.p = 42;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
export function f() {}
|
||||||
|
f.prototype.p = 42;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
in_use_default: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export default function f() {}
|
||||||
|
f.prototype.p = 42;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
export default function f() {}
|
||||||
|
f.prototype.p = 42;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
single_use: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export function f() {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
export function f() {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
single_use_default: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export default function f() {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
export default function f() {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
single_use_class: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export class A {}
|
||||||
|
A.prototype.p = "PASS";
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
export class A {}
|
||||||
|
A.prototype.p = "PASS";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
single_use_class_default: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export default class A {}
|
||||||
|
A.prototype.p = "PASS";
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
export default class A {}
|
||||||
|
A.prototype.p = "PASS";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
hoist_funs: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export function f() {}
|
||||||
|
export default async function* g() {}
|
||||||
|
}
|
||||||
|
expect_exact: "export function f(){}export default async function*g(){}"
|
||||||
|
}
|
||||||
|
|
||||||
|
instanceof_default_class: {
|
||||||
|
options = {
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export default class A {
|
||||||
|
f(a) {
|
||||||
|
return a instanceof A;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
export default class A {
|
||||||
|
f(a) {
|
||||||
|
return a instanceof A;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
instanceof_default_function: {
|
||||||
|
options = {
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export default function f() {
|
||||||
|
if (!(this instanceof f))
|
||||||
|
throw new Error("must instantiate");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
export default function f() {
|
||||||
|
if (!(this instanceof f))
|
||||||
|
throw new Error("must instantiate");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4742_join_vars_1: {
|
||||||
|
options = {
|
||||||
|
join_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 42;
|
||||||
|
export var a;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 42;
|
||||||
|
export var a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4742_join_vars_2: {
|
||||||
|
options = {
|
||||||
|
join_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export var a = "foo";
|
||||||
|
var b;
|
||||||
|
b = "bar";
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
export var a = "foo";
|
||||||
|
var b, b = "bar";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4742_unused_1: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 42;
|
||||||
|
export var a;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 42;
|
||||||
|
export var a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4742_unused_2: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export var a = "foo";
|
||||||
|
var a = "bar";
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
export var a = "foo";
|
||||||
|
a = "bar";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4761: {
|
||||||
|
input: {
|
||||||
|
export default "function" == 42;
|
||||||
|
}
|
||||||
|
expect_exact: 'export default"function"==42;'
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4766: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "foo";
|
||||||
|
export var a = "bar";
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "foo";
|
||||||
|
export var a = "bar";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5444: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export var a = (console, console);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console;
|
||||||
|
export var a = console;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5628: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
export default function f() {
|
||||||
|
for (a in 42);
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
export default function f() {
|
||||||
|
for (a in 42);
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
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;
|
||||||
},
|
},
|
||||||
@@ -297,6 +300,33 @@ name_collision_3: {
|
|||||||
expect_stdout: "true 4 6"
|
expect_stdout: "true 4 6"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
name_collision_4: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
var o = {
|
||||||
|
p: 0,
|
||||||
|
q: "PASS",
|
||||||
|
};
|
||||||
|
return function(o_p) {
|
||||||
|
if (!o.p) return o_p;
|
||||||
|
}(o.q);
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function() {
|
||||||
|
var o, o_p$0 = 0, o_q = "PASS";
|
||||||
|
return function(o_p) {
|
||||||
|
if (!o_p$0) return o_p;
|
||||||
|
}(o_q);
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
contains_this_1: {
|
contains_this_1: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
@@ -432,6 +462,11 @@ issue_2473_1: {
|
|||||||
var x = {};
|
var x = {};
|
||||||
var y = [];
|
var y = [];
|
||||||
}
|
}
|
||||||
|
expect_warnings: [
|
||||||
|
"INFO: Retaining variable x",
|
||||||
|
"INFO: Retaining variable y",
|
||||||
|
"WARN: Dropping unused variable z [test/compress/hoist_props.js:3,12]",
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_2473_2: {
|
issue_2473_2: {
|
||||||
@@ -454,6 +489,11 @@ issue_2473_2: {
|
|||||||
var x = {};
|
var x = {};
|
||||||
var y = [];
|
var y = [];
|
||||||
}
|
}
|
||||||
|
expect_warnings: [
|
||||||
|
"INFO: Retaining variable x",
|
||||||
|
"INFO: Retaining variable y",
|
||||||
|
"WARN: Dropping unused variable z [test/compress/hoist_props.js:3,12]",
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_2473_3: {
|
issue_2473_3: {
|
||||||
@@ -479,6 +519,9 @@ issue_2473_3: {
|
|||||||
console.log(o.a, o.b);
|
console.log(o.a, o.b);
|
||||||
}
|
}
|
||||||
expect_stdout: "1 2"
|
expect_stdout: "1 2"
|
||||||
|
expect_warnings: [
|
||||||
|
"INFO: Retaining variable o",
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_2473_4: {
|
issue_2473_4: {
|
||||||
@@ -505,6 +548,9 @@ issue_2473_4: {
|
|||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
expect_stdout: "1 2"
|
expect_stdout: "1 2"
|
||||||
|
expect_warnings: [
|
||||||
|
"INFO: Dropping unused variable o [test/compress/hoist_props.js:2,16]",
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_2508_1: {
|
issue_2508_1: {
|
||||||
@@ -741,7 +787,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));
|
||||||
@@ -750,6 +796,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,
|
||||||
@@ -878,7 +950,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");
|
||||||
}();
|
}();
|
||||||
}
|
}
|
||||||
@@ -989,9 +1061,7 @@ issue_3945_1: {
|
|||||||
expect: {
|
expect: {
|
||||||
function f() {
|
function f() {
|
||||||
o.p;
|
o.p;
|
||||||
var o = {
|
var o, o_q = 0;
|
||||||
q: 0,
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1010,9 +1080,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"
|
||||||
}
|
}
|
||||||
@@ -1041,3 +1109,134 @@ issue_4023: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "true"
|
expect_stdout: "true"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
object_super: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
f(a) {
|
||||||
|
return a ? console.log("PASS") : super.log("PASS");
|
||||||
|
},
|
||||||
|
};
|
||||||
|
o.f(42);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {
|
||||||
|
f(a) {
|
||||||
|
return a ? console.log("PASS") : super.log("PASS");
|
||||||
|
},
|
||||||
|
};
|
||||||
|
o.f(42);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
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",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5441: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(a) {
|
||||||
|
(function() {
|
||||||
|
a = { p: this };
|
||||||
|
})();
|
||||||
|
return typeof a;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(a) {
|
||||||
|
(function() {
|
||||||
|
a_p = this;
|
||||||
|
})();
|
||||||
|
var a_p;
|
||||||
|
return typeof {};
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "object"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5498: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
__proto__: 42,
|
||||||
|
};
|
||||||
|
while (console.log(typeof o.__proto__));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {
|
||||||
|
__proto__: 42,
|
||||||
|
};
|
||||||
|
while (console.log(typeof o.__proto__));
|
||||||
|
}
|
||||||
|
expect_stdout: "object"
|
||||||
|
}
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ statements: {
|
|||||||
options = {
|
options = {
|
||||||
hoist_funs: false,
|
hoist_funs: false,
|
||||||
hoist_vars: true,
|
hoist_vars: true,
|
||||||
|
join_vars: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f() {
|
function f() {
|
||||||
@@ -25,6 +27,8 @@ statements_funs: {
|
|||||||
options = {
|
options = {
|
||||||
hoist_funs: true,
|
hoist_funs: true,
|
||||||
hoist_vars: true,
|
hoist_vars: true,
|
||||||
|
join_vars: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f() {
|
function f() {
|
||||||
@@ -48,6 +52,8 @@ sequences: {
|
|||||||
options = {
|
options = {
|
||||||
hoist_funs: false,
|
hoist_funs: false,
|
||||||
hoist_vars: true,
|
hoist_vars: true,
|
||||||
|
join_vars: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f() {
|
function f() {
|
||||||
@@ -71,6 +77,8 @@ sequences_funs: {
|
|||||||
options = {
|
options = {
|
||||||
hoist_funs: true,
|
hoist_funs: true,
|
||||||
hoist_vars: true,
|
hoist_vars: true,
|
||||||
|
join_vars: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f() {
|
function f() {
|
||||||
@@ -89,10 +97,38 @@ sequences_funs: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
catch_var: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS";
|
||||||
|
try {
|
||||||
|
a;
|
||||||
|
} catch (a) {
|
||||||
|
var a = 0;
|
||||||
|
a;
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
a = "PASS";
|
||||||
|
var a;
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
issue_2295: {
|
issue_2295: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
hoist_vars: true,
|
hoist_vars: true,
|
||||||
|
join_vars: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function foo(o) {
|
function foo(o) {
|
||||||
@@ -109,3 +145,659 @@ issue_2295: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4487_1: {
|
||||||
|
options = {
|
||||||
|
functions: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fnames: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = function f() {
|
||||||
|
var f = console.log(typeof f);
|
||||||
|
};
|
||||||
|
var b = a();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = function f() {
|
||||||
|
var f = console.log(typeof f);
|
||||||
|
};
|
||||||
|
a();
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4487_2: {
|
||||||
|
options = {
|
||||||
|
functions: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fnames: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = function f() {
|
||||||
|
var f = console.log(typeof f);
|
||||||
|
};
|
||||||
|
var b = a();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function a() {
|
||||||
|
var f = console.log(typeof f);
|
||||||
|
}
|
||||||
|
a();
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4487_3: {
|
||||||
|
options = {
|
||||||
|
functions: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fnames: true,
|
||||||
|
passes: 3,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = function f() {
|
||||||
|
var f = console.log(typeof f);
|
||||||
|
};
|
||||||
|
var b = a();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function a() {
|
||||||
|
console.log(typeof void 0);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4489: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
A = 0;
|
||||||
|
var o = !0 || null;
|
||||||
|
for (var k in o);
|
||||||
|
console.log(k);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
for (var k in !(A = 0));
|
||||||
|
console.log(k);
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4517: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
join_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
var a = 2;
|
||||||
|
A = a;
|
||||||
|
var b = typeof !1;
|
||||||
|
return A + b;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function() {
|
||||||
|
return (A = 2) + typeof !1;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "2boolean"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4736: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
join_vars: true,
|
||||||
|
merge_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
function f() {
|
||||||
|
(function g() {
|
||||||
|
var b = (a = 0, 1 << 30);
|
||||||
|
var c = (a = 0, console.log(b));
|
||||||
|
var d = c;
|
||||||
|
})(f);
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function() {
|
||||||
|
(function() {
|
||||||
|
0;
|
||||||
|
console.log(1 << 30);
|
||||||
|
})();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "1073741824"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4839: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
join_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,
|
||||||
|
join_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,
|
||||||
|
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() {
|
||||||
|
null.p += 42;
|
||||||
|
})();
|
||||||
|
} 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() {
|
||||||
|
null.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_1: {
|
||||||
|
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 a, b;
|
||||||
|
a = 42;
|
||||||
|
do {
|
||||||
|
b = { 0: a++ };
|
||||||
|
} while (console.log(b[b ^= 0]));
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5187_2: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
join_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 a, b, c;
|
||||||
|
b++;
|
||||||
|
b = a = "PASS";
|
||||||
|
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,
|
||||||
|
sequences: 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,
|
||||||
|
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;
|
||||||
|
a = console;
|
||||||
|
a = A = ++a;
|
||||||
|
console.log(A);
|
||||||
|
}
|
||||||
|
expect_stdout: "NaN"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5411_4: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
join_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: 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"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5626: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = function() {
|
||||||
|
return console.log(arguments[0]), 42;
|
||||||
|
}("PASS") ? null : "foo";
|
||||||
|
for (var b in a)
|
||||||
|
FAIL;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function() {
|
||||||
|
console.log(arguments[0]);
|
||||||
|
}("PASS"));
|
||||||
|
for (var b in null)
|
||||||
|
FAIL;
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5638_1: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "FAIL";
|
||||||
|
var a = [ 42 ];
|
||||||
|
console || FAIL(a);
|
||||||
|
console.log(a++);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
a = "FAIL";
|
||||||
|
a = [ 42 ];
|
||||||
|
console || FAIL(a);
|
||||||
|
console.log(a++);
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5638_2: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "FAIL";
|
||||||
|
var a = [ 6 ];
|
||||||
|
console || FAIL(a);
|
||||||
|
console.log(a *= 7);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
a = "FAIL";
|
||||||
|
a = [ 6 ];
|
||||||
|
console || FAIL(a);
|
||||||
|
console.log(a *= 7);
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5638_3: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var log = console.log;
|
||||||
|
var o = { foo: 42 };
|
||||||
|
for (var k in o) {
|
||||||
|
var v = o[k];
|
||||||
|
log(k || v, v++);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var log, o, k, v;
|
||||||
|
log = console.log;
|
||||||
|
for (k in o = { foo: 42 }) {
|
||||||
|
v = o[k];
|
||||||
|
log(k || v, v++);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "foo 42"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5638_4: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var log = console.log;
|
||||||
|
var o = { foo: 6 };
|
||||||
|
for (var k in o) {
|
||||||
|
var v = o[k];
|
||||||
|
log(k || v, v *= 7);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var log, o, k, v;
|
||||||
|
log = console.log;
|
||||||
|
for (k in o = { foo: 6 }) {
|
||||||
|
v = o[k];
|
||||||
|
log(k || v, v *= 7);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "foo 42"
|
||||||
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
298
test/compress/imports.js
Normal file
298
test/compress/imports.js
Normal file
@@ -0,0 +1,298 @@
|
|||||||
|
nought: {
|
||||||
|
input: {
|
||||||
|
import "foo";
|
||||||
|
}
|
||||||
|
expect_exact: 'import"foo";'
|
||||||
|
}
|
||||||
|
|
||||||
|
default_only: {
|
||||||
|
input: {
|
||||||
|
import foo from "bar";
|
||||||
|
}
|
||||||
|
expect_exact: 'import foo from"bar";'
|
||||||
|
}
|
||||||
|
|
||||||
|
all_only: {
|
||||||
|
input: {
|
||||||
|
import * as foo from "bar";
|
||||||
|
}
|
||||||
|
expect_exact: 'import*as foo from"bar";'
|
||||||
|
}
|
||||||
|
|
||||||
|
keys_only: {
|
||||||
|
input: {
|
||||||
|
import { as as foo, bar, delete as baz } from "moo";
|
||||||
|
}
|
||||||
|
expect_exact: 'import{as as foo,bar,delete as baz}from"moo";'
|
||||||
|
}
|
||||||
|
|
||||||
|
default_all: {
|
||||||
|
input: {
|
||||||
|
import foo, * as bar from "baz";
|
||||||
|
}
|
||||||
|
expect_exact: 'import foo,*as bar from"baz";'
|
||||||
|
}
|
||||||
|
|
||||||
|
default_keys: {
|
||||||
|
input: {
|
||||||
|
import foo, { bar } from "baz";
|
||||||
|
}
|
||||||
|
expect_exact: 'import foo,{bar}from"baz";'
|
||||||
|
}
|
||||||
|
|
||||||
|
non_identifiers: {
|
||||||
|
beautify = {
|
||||||
|
quote_style: 3,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
import { '42' as foo } from "bar";
|
||||||
|
import { "foo" as bar } from 'baz';
|
||||||
|
}
|
||||||
|
expect_exact: "import{'42'as foo}from\"bar\";import{foo as bar}from'baz';"
|
||||||
|
}
|
||||||
|
|
||||||
|
dynamic: {
|
||||||
|
input: {
|
||||||
|
(async a => await import(a))("foo").then(bar);
|
||||||
|
}
|
||||||
|
expect_exact: '(async a=>await import(a))("foo").then(bar);'
|
||||||
|
}
|
||||||
|
|
||||||
|
dynamic_nought: {
|
||||||
|
input: {
|
||||||
|
import(foo);
|
||||||
|
}
|
||||||
|
expect_exact: "import(foo);"
|
||||||
|
}
|
||||||
|
|
||||||
|
import_meta_1: {
|
||||||
|
input: {
|
||||||
|
console.log(import.meta, import.meta.url);
|
||||||
|
}
|
||||||
|
expect_exact: "console.log(import.meta,import.meta.url);"
|
||||||
|
}
|
||||||
|
|
||||||
|
import_meta_2: {
|
||||||
|
input: {
|
||||||
|
import.meta.url.split("/").forEach(function(part, index) {
|
||||||
|
console.log(index, part);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect_exact: 'import.meta.url.split("/").forEach(function(part,index){console.log(index,part)});'
|
||||||
|
}
|
||||||
|
|
||||||
|
same_quotes: {
|
||||||
|
beautify = {
|
||||||
|
beautify: true,
|
||||||
|
quote_style: 3,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
import 'foo';
|
||||||
|
import "bar";
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"import 'foo';",
|
||||||
|
"",
|
||||||
|
'import "bar";',
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_unused: {
|
||||||
|
options = {
|
||||||
|
imports: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
import a, * as b from "foo";
|
||||||
|
import { c } from "bar";
|
||||||
|
import { d, _ as e } from "baz";
|
||||||
|
console.log(d);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
import "foo";
|
||||||
|
import "bar";
|
||||||
|
import { d as d } from "baz";
|
||||||
|
console.log(d);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_side_effect_free: {
|
||||||
|
options = {
|
||||||
|
imports: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
import foo from "bar";
|
||||||
|
var a = foo;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
import "bar";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle: {
|
||||||
|
rename = false
|
||||||
|
mangle = {
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
import foo, { bar } from "baz";
|
||||||
|
console.log(moo);
|
||||||
|
import * as moo from "moz";
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
import o, { bar as m } from "baz";
|
||||||
|
console.log(r);
|
||||||
|
import * as r from "moz";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rename_mangle: {
|
||||||
|
rename = true
|
||||||
|
mangle = {
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
import foo, { bar } from "baz";
|
||||||
|
console.log(moo);
|
||||||
|
import * as moo from "moz";
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
import o, { bar as m } from "baz";
|
||||||
|
console.log(r);
|
||||||
|
import * as r from "moz";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_export_import: {
|
||||||
|
mangle = {
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export let o = A;
|
||||||
|
import { p as A } from "foo";
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
export let o = p;
|
||||||
|
import { p } from "foo";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_import_export: {
|
||||||
|
mangle = {
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
import { p as A } from "foo";
|
||||||
|
export let o = A;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
import { p } from "foo";
|
||||||
|
export let o = p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
keep_ref: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
import foo from "bar";
|
||||||
|
foo();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
import foo from "bar";
|
||||||
|
foo();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
forbid_merge: {
|
||||||
|
options = {
|
||||||
|
merge_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
import A from "foo";
|
||||||
|
export default class extends A {}
|
||||||
|
var f = () => () => {};
|
||||||
|
f();
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
import A from "foo";
|
||||||
|
export default class extends A {}
|
||||||
|
var f = () => () => {};
|
||||||
|
f();
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4708_1: {
|
||||||
|
options = {
|
||||||
|
imports: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
import a from "foo";
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
import a from "foo";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4708_2: {
|
||||||
|
options = {
|
||||||
|
imports: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
console.log(a);
|
||||||
|
import a from "foo";
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
console.log(a);
|
||||||
|
import a from "foo";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pr_5550_1: {
|
||||||
|
input: {
|
||||||
|
if (console)
|
||||||
|
import("foo");
|
||||||
|
else
|
||||||
|
import.meta.url.replace(/bar/g, console.log);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
if (console)
|
||||||
|
import("foo");
|
||||||
|
else
|
||||||
|
import.meta.url.replace(/bar/g, console.log);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pr_5550_2: {
|
||||||
|
input: {
|
||||||
|
L: {
|
||||||
|
import("foo");
|
||||||
|
import.meta.url.replace(/bar/g, console.log);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
L: {
|
||||||
|
import("foo");
|
||||||
|
import.meta.url.replace(/bar/g, console.log);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
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"
|
||||||
|
}
|
||||||
@@ -39,7 +39,7 @@ non_hoisted_function_after_return: {
|
|||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:4,16]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:4,16]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:7,16]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:7,16]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:10,12]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:10,12]",
|
||||||
"WARN: Dropping unused function UnusedFunction [test/compress/issue-1034.js:11,21]"
|
"WARN: Dropping unused function UnusedFunction [test/compress/issue-1034.js:11,21]",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -84,19 +84,16 @@ non_hoisted_function_after_return_2a: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:4,16]",
|
"WARN: Dropping initialization in unreachable code [test/compress/issue-1034.js:4,16]",
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:4,16]",
|
"WARN: Dropping initialization in unreachable code [test/compress/issue-1034.js:7,16]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:7,16]",
|
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:7,16]",
|
|
||||||
"WARN: Dropping unused variable a [test/compress/issue-1034.js:4,20]",
|
"WARN: Dropping unused variable a [test/compress/issue-1034.js:4,20]",
|
||||||
"WARN: Dropping unused function nope [test/compress/issue-1034.js:11,21]",
|
"WARN: Dropping unused function nope [test/compress/issue-1034.js:11,21]",
|
||||||
"INFO: pass 0: last_count: Infinity, count: 36",
|
"INFO: pass 0: last_count: Infinity, count: 35",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:9,12]",
|
"WARN: Dropping initialization in unreachable code [test/compress/issue-1034.js:9,12]",
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:9,12]",
|
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:12,12]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:12,12]",
|
||||||
"INFO: Dropping unused variable b [test/compress/issue-1034.js:7,20]",
|
"INFO: Dropping unused variable b [test/compress/issue-1034.js:7,20]",
|
||||||
"INFO: Dropping unused variable c [test/compress/issue-1034.js:9,16]",
|
"INFO: Dropping unused variable c [test/compress/issue-1034.js:9,16]",
|
||||||
"INFO: pass 1: last_count: 36, count: 18",
|
"INFO: pass 1: last_count: 35, count: 18",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -138,10 +135,7 @@ non_hoisted_function_after_return_2b: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:6,16]",
|
"WARN: Dropping initialization in unreachable code [test/compress/issue-1034.js:8,12]",
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:6,16]",
|
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:8,12]",
|
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:8,12]",
|
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:12,12]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:12,12]",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -242,19 +236,16 @@ non_hoisted_function_after_return_2a_strict: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "5 6"
|
expect_stdout: "5 6"
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:5,16]",
|
"WARN: Dropping initialization in unreachable code [test/compress/issue-1034.js:5,16]",
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:5,16]",
|
"WARN: Dropping initialization in unreachable code [test/compress/issue-1034.js:8,16]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:8,16]",
|
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:8,16]",
|
|
||||||
"WARN: Dropping unused variable a [test/compress/issue-1034.js:5,20]",
|
"WARN: Dropping unused variable a [test/compress/issue-1034.js:5,20]",
|
||||||
"WARN: Dropping unused function nope [test/compress/issue-1034.js:12,21]",
|
"WARN: Dropping unused function nope [test/compress/issue-1034.js:12,21]",
|
||||||
"INFO: pass 0: last_count: Infinity, count: 47",
|
"INFO: pass 0: last_count: Infinity, count: 46",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:10,12]",
|
"WARN: Dropping initialization in unreachable code [test/compress/issue-1034.js:10,12]",
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:10,12]",
|
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:13,12]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:13,12]",
|
||||||
"INFO: Dropping unused variable b [test/compress/issue-1034.js:8,20]",
|
"INFO: Dropping unused variable b [test/compress/issue-1034.js:8,20]",
|
||||||
"INFO: Dropping unused variable c [test/compress/issue-1034.js:10,16]",
|
"INFO: Dropping unused variable c [test/compress/issue-1034.js:10,16]",
|
||||||
"INFO: pass 1: last_count: 47, count: 29",
|
"INFO: pass 1: last_count: 46, count: 29",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -301,10 +292,7 @@ non_hoisted_function_after_return_2b_strict: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "5 6"
|
expect_stdout: "5 6"
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:7,16]",
|
"WARN: Dropping initialization in unreachable code [test/compress/issue-1034.js:9,12]",
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:7,16]",
|
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:9,12]",
|
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:9,12]",
|
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:13,12]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:13,12]",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,22 +4,21 @@ multiple_functions: {
|
|||||||
if_return: true,
|
if_return: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
( function() {
|
(function() {
|
||||||
if ( !window ) {
|
if (!window)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
function f() {}
|
function f() {}
|
||||||
function g() {}
|
function g() {}
|
||||||
} )();
|
})();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
( function() {
|
(function() {
|
||||||
// NOTE: other compression steps will reduce this
|
// NOTE: other compression steps will reduce this
|
||||||
// down to just `window`.
|
// down to just `window`.
|
||||||
if ( !window );
|
if (!window);
|
||||||
function f() {}
|
function f() {}
|
||||||
function g() {}
|
function g() {}
|
||||||
} )();
|
})();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -29,18 +28,17 @@ single_function: {
|
|||||||
if_return: true,
|
if_return: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
( function() {
|
(function() {
|
||||||
if ( !window ) {
|
if (!window)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
function f() {}
|
function f() {}
|
||||||
} )();
|
})();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
( function() {
|
(function() {
|
||||||
if ( !window );
|
if (!window);
|
||||||
function f() {}
|
function f() {}
|
||||||
} )();
|
})();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -50,28 +48,26 @@ deeply_nested: {
|
|||||||
if_return: true,
|
if_return: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
( function() {
|
(function() {
|
||||||
if ( !window ) {
|
if (!window)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
function f() {}
|
function f() {}
|
||||||
function g() {}
|
function g() {}
|
||||||
if ( !document ) {
|
if (!document)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
function h() {}
|
function h() {}
|
||||||
} )();
|
})();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
( function() {
|
(function() {
|
||||||
// NOTE: other compression steps will reduce this
|
// NOTE: other compression steps will reduce this
|
||||||
// down to just `window`.
|
// down to just `window`.
|
||||||
if ( window )
|
if (!window);
|
||||||
if ( !document );
|
else if (!document);
|
||||||
function f() {}
|
function f() {}
|
||||||
function g() {}
|
function g() {}
|
||||||
function h() {}
|
function h() {}
|
||||||
} )();
|
})();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -81,18 +77,18 @@ not_hoisted_when_already_nested: {
|
|||||||
if_return: true,
|
if_return: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
( function() {
|
(function() {
|
||||||
if ( !window ) {
|
if (!window)
|
||||||
return;
|
return;
|
||||||
}
|
if (foo) function f() {}
|
||||||
if ( foo ) function f() {}
|
})();
|
||||||
} )();
|
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
( function() {
|
(function() {
|
||||||
if ( window )
|
if (!window);
|
||||||
if ( foo ) function f() {}
|
else if (foo)
|
||||||
} )();
|
function f() {}
|
||||||
|
})();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -104,15 +100,19 @@ defun_if_return: {
|
|||||||
input: {
|
input: {
|
||||||
function e() {
|
function e() {
|
||||||
function f() {}
|
function f() {}
|
||||||
if (!window) return;
|
if (!window)
|
||||||
else function g() {}
|
return;
|
||||||
|
else
|
||||||
|
function g() {}
|
||||||
function h() {}
|
function h() {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function e() {
|
function e() {
|
||||||
function f() {}
|
function f() {}
|
||||||
if (window) function g() {}
|
if (!window);
|
||||||
|
else
|
||||||
|
function g() {}
|
||||||
function h() {}
|
function h() {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -126,8 +126,10 @@ defun_hoist_funs: {
|
|||||||
input: {
|
input: {
|
||||||
function e() {
|
function e() {
|
||||||
function f() {}
|
function f() {}
|
||||||
if (!window) return;
|
if (!window)
|
||||||
else function g() {}
|
return;
|
||||||
|
else
|
||||||
|
function g() {}
|
||||||
function h() {}
|
function h() {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -136,7 +138,7 @@ defun_hoist_funs: {
|
|||||||
function f() {}
|
function f() {}
|
||||||
function g() {}
|
function g() {}
|
||||||
function h() {}
|
function h() {}
|
||||||
if (window);
|
if (!window);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -149,15 +151,18 @@ defun_else_if_return: {
|
|||||||
input: {
|
input: {
|
||||||
function e() {
|
function e() {
|
||||||
function f() {}
|
function f() {}
|
||||||
if (window) function g() {}
|
if (window)
|
||||||
else return;
|
function g() {}
|
||||||
|
else
|
||||||
|
return;
|
||||||
function h() {}
|
function h() {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function e() {
|
function e() {
|
||||||
function f() {}
|
function f() {}
|
||||||
if (window) function g() {}
|
if (window)
|
||||||
|
function g() {}
|
||||||
function h() {}
|
function h() {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,61 +2,77 @@ keep_name_of_getter: {
|
|||||||
options = {
|
options = {
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: { a = { get foo () {} } }
|
input: {
|
||||||
expect: { a = { get foo () {} } }
|
a = {
|
||||||
|
get foo() {},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
a = {
|
||||||
|
get foo() {},
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
keep_name_of_setter: {
|
keep_name_of_setter: {
|
||||||
options = {
|
options = {
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: { a = { set foo () {} } }
|
input: {
|
||||||
expect: { a = { set foo () {} } }
|
a = {
|
||||||
|
set foo(v) {},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
a = {
|
||||||
|
set foo(v) {},
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
setter_with_operator_keys: {
|
setter_with_operator_keys: {
|
||||||
input: {
|
input: {
|
||||||
var tokenCodes = {
|
var tokenCodes = {
|
||||||
get instanceof(){
|
get instanceof() {
|
||||||
return test0;
|
return test0;
|
||||||
},
|
},
|
||||||
set instanceof(value){
|
set instanceof(value) {
|
||||||
test0 = value;
|
test0 = value;
|
||||||
},
|
},
|
||||||
set typeof(value){
|
set typeof(value) {
|
||||||
test1 = value;
|
test1 = value;
|
||||||
},
|
},
|
||||||
get typeof(){
|
get typeof() {
|
||||||
return test1;
|
return test1;
|
||||||
},
|
},
|
||||||
set else(value){
|
set else(value) {
|
||||||
test2 = value;
|
test2 = value;
|
||||||
},
|
},
|
||||||
get else(){
|
get else() {
|
||||||
return test2;
|
return test2;
|
||||||
}
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var tokenCodes = {
|
var tokenCodes = {
|
||||||
get instanceof(){
|
get instanceof() {
|
||||||
return test0;
|
return test0;
|
||||||
},
|
},
|
||||||
set instanceof(value){
|
set instanceof(value) {
|
||||||
test0 = value;
|
test0 = value;
|
||||||
},
|
},
|
||||||
set typeof(value){
|
set typeof(value) {
|
||||||
test1 = value;
|
test1 = value;
|
||||||
},
|
},
|
||||||
get typeof(){
|
get typeof() {
|
||||||
return test1;
|
return test1;
|
||||||
},
|
},
|
||||||
set else(value){
|
set else(value) {
|
||||||
test2 = value;
|
test2 = value;
|
||||||
},
|
},
|
||||||
get else(){
|
get else() {
|
||||||
return test2;
|
return test2;
|
||||||
}
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4,7 +4,7 @@ mangle_keep_fnames_false: {
|
|||||||
keep_fnames: true,
|
keep_fnames: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
keep_fnames : false,
|
keep_fnames: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
"use strict";
|
"use strict";
|
||||||
@@ -30,7 +30,7 @@ mangle_keep_fnames_true: {
|
|||||||
keep_fnames: true,
|
keep_fnames: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
keep_fnames : true,
|
keep_fnames: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
pure_function_calls: {
|
pure_function_calls: {
|
||||||
options = {
|
options = {
|
||||||
|
annotations: true,
|
||||||
booleans: true,
|
booleans: true,
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
@@ -60,6 +61,7 @@ pure_function_calls: {
|
|||||||
|
|
||||||
pure_function_calls_toplevel: {
|
pure_function_calls_toplevel: {
|
||||||
options = {
|
options = {
|
||||||
|
annotations: true,
|
||||||
booleans: true,
|
booleans: true,
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
@@ -126,6 +128,7 @@ pure_function_calls_toplevel: {
|
|||||||
|
|
||||||
should_warn: {
|
should_warn: {
|
||||||
options = {
|
options = {
|
||||||
|
annotations: true,
|
||||||
booleans: true,
|
booleans: true,
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
issue_1321_no_debug: {
|
issue_1321_no_debug: {
|
||||||
mangle = {
|
mangle = {
|
||||||
properties: {
|
properties: {
|
||||||
|
domprops: true,
|
||||||
keep_quoted: true,
|
keep_quoted: true,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@@ -23,6 +24,7 @@ issue_1321_debug: {
|
|||||||
mangle = {
|
mangle = {
|
||||||
properties: {
|
properties: {
|
||||||
debug: "",
|
debug: "",
|
||||||
|
domprops: true,
|
||||||
keep_quoted: true,
|
keep_quoted: true,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@@ -44,6 +46,7 @@ issue_1321_debug: {
|
|||||||
issue_1321_with_quoted: {
|
issue_1321_with_quoted: {
|
||||||
mangle = {
|
mangle = {
|
||||||
properties: {
|
properties: {
|
||||||
|
domprops: true,
|
||||||
keep_quoted: false,
|
keep_quoted: false,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* There was an incorrect sort behaviour documented in issue #143:
|
* There was an incorrect sort behavior documented in issue #143:
|
||||||
* (x = f(…)) <= x → x >= (x = f(…))
|
* (x = f(…)) <= x → x >= (x = f(…))
|
||||||
*
|
*
|
||||||
* For example, let the equation be:
|
* For example, let the equation be:
|
||||||
@@ -12,37 +12,54 @@
|
|||||||
* a >= (a = parseInt('100')) → 99 >= 100 → false
|
* a >= (a = parseInt('100')) → 99 >= 100 → false
|
||||||
*/
|
*/
|
||||||
|
|
||||||
tranformation_sort_order_equal: {
|
transformation_sort_order_equal: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
}
|
}
|
||||||
|
input: {
|
||||||
input: { (a = parseInt('100')) == a }
|
console.log((a = parseInt("100")) == a);
|
||||||
expect: { (a = parseInt('100')) == a }
|
}
|
||||||
|
expect: {
|
||||||
|
console.log((a = parseInt("100")) == a);
|
||||||
|
}
|
||||||
|
expect_stdout: "true"
|
||||||
}
|
}
|
||||||
|
|
||||||
tranformation_sort_order_unequal: {
|
transformation_sort_order_unequal: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
}
|
}
|
||||||
|
input: {
|
||||||
input: { (a = parseInt('100')) != a }
|
console.log((a = parseInt("100")) != a);
|
||||||
expect: { (a = parseInt('100')) != a }
|
}
|
||||||
|
expect: {
|
||||||
|
console.log((a = parseInt("100")) != a);
|
||||||
|
}
|
||||||
|
expect_stdout: "false"
|
||||||
}
|
}
|
||||||
|
|
||||||
tranformation_sort_order_lesser_or_equal: {
|
transformation_sort_order_lesser_or_equal: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
}
|
}
|
||||||
|
input: {
|
||||||
input: { (a = parseInt('100')) <= a }
|
console.log((a = parseInt("100")) <= a);
|
||||||
expect: { (a = parseInt('100')) <= a }
|
}
|
||||||
|
expect: {
|
||||||
|
console.log((a = parseInt("100")) <= a);
|
||||||
|
}
|
||||||
|
expect_stdout: "true"
|
||||||
}
|
}
|
||||||
tranformation_sort_order_greater_or_equal: {
|
|
||||||
|
transformation_sort_order_greater_or_equal: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
}
|
}
|
||||||
|
input: {
|
||||||
input: { (a = parseInt('100')) >= a }
|
console.log((a = parseInt("100")) >= a);
|
||||||
expect: { (a = parseInt('100')) >= a }
|
}
|
||||||
|
expect: {
|
||||||
|
console.log((a = parseInt("100")) >= a);
|
||||||
|
}
|
||||||
|
expect_stdout: "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;
|
||||||
|
|||||||
@@ -53,11 +53,21 @@ mangle_props: {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
expect_stdout: "1 1 1 2 2 2 3 3 3 4 4 4 5 5"
|
expect_stdout: "1 1 1 2 2 2 3 3 3 4 4 4 5 5"
|
||||||
|
expect_warnings: [
|
||||||
|
"INFO: Preserving reserved property undefined",
|
||||||
|
"INFO: Preserving reserved property NaN",
|
||||||
|
"INFO: Preserving reserved property Infinity",
|
||||||
|
"INFO: Preserving reserved property -Infinity",
|
||||||
|
"INFO: Preserving reserved property null",
|
||||||
|
"INFO: Preserving reserved property log",
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
numeric_literal: {
|
numeric_literal: {
|
||||||
mangle = {
|
mangle = {
|
||||||
properties: true,
|
properties: {
|
||||||
|
domprops: true,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
beautify = {
|
beautify = {
|
||||||
beautify: true,
|
beautify: true,
|
||||||
@@ -106,11 +116,19 @@ numeric_literal: {
|
|||||||
"4 5 4 4",
|
"4 5 4 4",
|
||||||
"8 7 8",
|
"8 7 8",
|
||||||
]
|
]
|
||||||
|
expect_warnings: [
|
||||||
|
"INFO: Mapping property 0x25 to o",
|
||||||
|
"INFO: Mapping property 1E42 to b",
|
||||||
|
"INFO: Preserving reserved property log",
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
identifier: {
|
identifier: {
|
||||||
mangle = {
|
mangle = {
|
||||||
properties: true,
|
properties: {
|
||||||
|
builtins: true,
|
||||||
|
domprops: true,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var obj = {
|
var obj = {
|
||||||
@@ -209,37 +227,37 @@ identifier: {
|
|||||||
B: 28,
|
B: 28,
|
||||||
C: 29,
|
C: 29,
|
||||||
D: 30,
|
D: 30,
|
||||||
F: 31,
|
E: 31,
|
||||||
G: 32,
|
F: 32,
|
||||||
false: 33,
|
G: 33,
|
||||||
null: 34,
|
H: 34,
|
||||||
true: 35,
|
I: 35,
|
||||||
H: 36,
|
J: 36,
|
||||||
I: 37,
|
K: 37,
|
||||||
J: 38,
|
L: 38,
|
||||||
K: 39,
|
M: 39,
|
||||||
L: 40,
|
N: 40,
|
||||||
M: 41,
|
O: 41,
|
||||||
N: 42,
|
P: 42,
|
||||||
O: 43,
|
Q: 43,
|
||||||
P: 44,
|
R: 44,
|
||||||
Q: 45,
|
S: 45,
|
||||||
R: 46,
|
T: 46,
|
||||||
S: 47,
|
U: 47,
|
||||||
T: 48,
|
V: 48,
|
||||||
U: 49,
|
W: 49,
|
||||||
V: 50,
|
X: 50,
|
||||||
W: 51,
|
Y: 51,
|
||||||
X: 52,
|
Z: 52,
|
||||||
Y: 53,
|
$: 53,
|
||||||
Z: 54,
|
_: 54,
|
||||||
$: 55,
|
ee: 55,
|
||||||
_: 56,
|
te: 56,
|
||||||
ee: 57,
|
ne: 57,
|
||||||
te: 58,
|
ae: 58,
|
||||||
ne: 59,
|
ie: 59,
|
||||||
ae: 60,
|
oe: 60,
|
||||||
ie: 61,
|
re: 61,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ issue_269_1: {
|
|||||||
expect: {
|
expect: {
|
||||||
var x = {};
|
var x = {};
|
||||||
console.log(
|
console.log(
|
||||||
x + "", +x, !!x,
|
"" + x, +("" + x), !!x,
|
||||||
"", 0, false
|
"", 0, false
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -108,6 +108,7 @@ safe_undefined: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
negate_iife_3: {
|
negate_iife_3: {
|
||||||
|
expression = true
|
||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
expression: true,
|
expression: true,
|
||||||
@@ -123,6 +124,7 @@ negate_iife_3: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
negate_iife_3_off: {
|
negate_iife_3_off: {
|
||||||
|
expression = true
|
||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
expression: true,
|
expression: true,
|
||||||
@@ -203,6 +205,7 @@ negate_iife_5_off: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
issue_1254_negate_iife_true: {
|
issue_1254_negate_iife_true: {
|
||||||
|
expression = true
|
||||||
options = {
|
options = {
|
||||||
expression: true,
|
expression: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
@@ -215,11 +218,12 @@ issue_1254_negate_iife_true: {
|
|||||||
};
|
};
|
||||||
})()();
|
})()();
|
||||||
}
|
}
|
||||||
expect_exact: 'void console.log("test");'
|
expect_exact: 'void console.log("test")'
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_1254_negate_iife_nested: {
|
issue_1254_negate_iife_nested: {
|
||||||
|
expression = true
|
||||||
options = {
|
options = {
|
||||||
expression: true,
|
expression: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
@@ -232,7 +236,7 @@ issue_1254_negate_iife_nested: {
|
|||||||
};
|
};
|
||||||
})()()()()();
|
})()()()()();
|
||||||
}
|
}
|
||||||
expect_exact: '(void console.log("test"))()()();'
|
expect_exact: '(void console.log("test"))()()()'
|
||||||
}
|
}
|
||||||
|
|
||||||
negate_iife_issue_1073: {
|
negate_iife_issue_1073: {
|
||||||
@@ -426,6 +430,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 +444,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,
|
||||||
@@ -463,15 +469,19 @@ drop_fargs: {
|
|||||||
var a = 1;
|
var a = 1;
|
||||||
!function(a_1) {
|
!function(a_1) {
|
||||||
a++;
|
a++;
|
||||||
}(a++ + (a && a.var));
|
}(a++ + (a && console.log(a)));
|
||||||
console.log(a);
|
console.log(a);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var a = 1;
|
var a = 1;
|
||||||
++a && a.var, a++;
|
++a && console.log(a),
|
||||||
|
a++;
|
||||||
console.log(a);
|
console.log(a);
|
||||||
}
|
}
|
||||||
expect_stdout: "3"
|
expect_stdout: [
|
||||||
|
"2",
|
||||||
|
"3",
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
keep_fargs: {
|
keep_fargs: {
|
||||||
@@ -486,13 +496,17 @@ keep_fargs: {
|
|||||||
var a = 1;
|
var a = 1;
|
||||||
!function(a_1) {
|
!function(a_1) {
|
||||||
a++;
|
a++;
|
||||||
}(a++ + (a && a.var));
|
}(a++ + (a && console.log(a)));
|
||||||
console.log(a);
|
console.log(a);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var a = 1;
|
var a = 1;
|
||||||
++a && a.var, a++;
|
++a && console.log(a),
|
||||||
|
a++;
|
||||||
console.log(a);
|
console.log(a);
|
||||||
}
|
}
|
||||||
expect_stdout: "3"
|
expect_stdout: [
|
||||||
|
"2",
|
||||||
|
"3",
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ collapse: {
|
|||||||
var a;
|
var a;
|
||||||
b = c();
|
b = c();
|
||||||
a = typeof b === 'function' ? b() : b;
|
a = typeof b === 'function' ? b() : b;
|
||||||
return 'stirng' == typeof a && d();
|
return 'string' == typeof a && d();
|
||||||
}
|
}
|
||||||
function f3(c) {
|
function f3(c) {
|
||||||
var a;
|
var a;
|
||||||
@@ -41,7 +41,7 @@ collapse: {
|
|||||||
return void 0 !== ('function' === typeof b ? b() : b) && c();
|
return void 0 !== ('function' === typeof b ? b() : b) && c();
|
||||||
}
|
}
|
||||||
function f2(b) {
|
function f2(b) {
|
||||||
return 'stirng' == typeof ('function' === typeof (b = c()) ? b() : b) && d();
|
return 'string' == typeof ('function' === typeof (b = c()) ? b() : b) && d();
|
||||||
}
|
}
|
||||||
function f3(c) {
|
function f3(c) {
|
||||||
var a;
|
var a;
|
||||||
|
|||||||
195
test/compress/issue-5614.js
Normal file
195
test/compress/issue-5614.js
Normal file
@@ -0,0 +1,195 @@
|
|||||||
|
record_update: {
|
||||||
|
options = {
|
||||||
|
loops: true,
|
||||||
|
passes: 3,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var value = { a: 42, b: "PASS" };
|
||||||
|
var unused = _Utils_update(value, { b: "FAIL" });
|
||||||
|
function _Utils_update(oldRecord, updatedFields) {
|
||||||
|
var newRecord = {};
|
||||||
|
for (var key in oldRecord)
|
||||||
|
newRecord[key] = oldRecord[key];
|
||||||
|
for (var key in updatedFields)
|
||||||
|
newRecord[key] = updatedFields[key];
|
||||||
|
return newRecord;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {}
|
||||||
|
}
|
||||||
|
|
||||||
|
currying: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
passes: 3,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function F(arity, fun, wrapper) {
|
||||||
|
wrapper.a = arity;
|
||||||
|
wrapper.f = fun;
|
||||||
|
return wrapper;
|
||||||
|
}
|
||||||
|
function F2(fun) {
|
||||||
|
return F(2, fun, function(a) {
|
||||||
|
return function(b) {
|
||||||
|
return fun(a, b);
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
function _Utils_eq(x, y) {
|
||||||
|
var pair, stack = [], isEqual = _Utils_eqHelp(x, y, 0, stack);
|
||||||
|
while (isEqual && (pair = stack.pop()))
|
||||||
|
isEqual = _Utils_eqHelp(pair.a, pair.b, 0, stack);
|
||||||
|
return isEqual;
|
||||||
|
}
|
||||||
|
var _Utils_equal = F2(_Utils_eq);
|
||||||
|
}
|
||||||
|
expect: {}
|
||||||
|
}
|
||||||
|
|
||||||
|
conditional_property_write: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
var o = {};
|
||||||
|
if (a)
|
||||||
|
o.p = console.log("foo");
|
||||||
|
else
|
||||||
|
o.q = console.log("bar");
|
||||||
|
o.r = 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",
|
||||||
|
"baz",
|
||||||
|
"bar",
|
||||||
|
"baz",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
reassign_1: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS", b = "FAIL";
|
||||||
|
(b = a).toString();
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var b = "FAIL";
|
||||||
|
(b = "PASS").toString();
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
reassign_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS";
|
||||||
|
if (false) {
|
||||||
|
a = null + 0;
|
||||||
|
a();
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "PASS";
|
||||||
|
if (false) {
|
||||||
|
a = 0;
|
||||||
|
a();
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
reassign_3: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 0;
|
||||||
|
(a = a || "PASS").toString();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 0;
|
||||||
|
(a = (0, "PASS")).toString();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
retain_instance_write: {
|
||||||
|
options = {
|
||||||
|
pure_getters: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
function g() {
|
||||||
|
var o = {};
|
||||||
|
var b = new f(o);
|
||||||
|
if (console)
|
||||||
|
b.p = "PASS";
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
console.log(g().p);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a) {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
function g() {
|
||||||
|
var o = {};
|
||||||
|
var b = new f(o);
|
||||||
|
if (console)
|
||||||
|
b.p = "PASS";
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
console.log(g().p);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
@@ -68,6 +68,7 @@ drop_console_2: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
drop_value: {
|
drop_value: {
|
||||||
|
expression = true
|
||||||
options = {
|
options = {
|
||||||
expression: true,
|
expression: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
@@ -106,6 +107,7 @@ wrongly_optimized: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
negate_iife_1: {
|
negate_iife_1: {
|
||||||
|
expression = true
|
||||||
options = {
|
options = {
|
||||||
expression: true,
|
expression: true,
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
@@ -119,6 +121,7 @@ negate_iife_1: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
negate_iife_3: {
|
negate_iife_3: {
|
||||||
|
expression = true
|
||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
expression: true,
|
expression: true,
|
||||||
@@ -133,6 +136,7 @@ negate_iife_3: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
negate_iife_3_off: {
|
negate_iife_3_off: {
|
||||||
|
expression = true
|
||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
expression: true,
|
expression: true,
|
||||||
@@ -215,6 +219,7 @@ negate_iife_5_off: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
issue_1254_negate_iife_true: {
|
issue_1254_negate_iife_true: {
|
||||||
|
expression = true
|
||||||
options = {
|
options = {
|
||||||
expression: true,
|
expression: true,
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
@@ -226,11 +231,12 @@ issue_1254_negate_iife_true: {
|
|||||||
};
|
};
|
||||||
})()();
|
})()();
|
||||||
}
|
}
|
||||||
expect_exact: '(function(){return function(){console.log("test")}})()();'
|
expect_exact: 'function(){return function(){console.log("test")}}()()'
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_1254_negate_iife_nested: {
|
issue_1254_negate_iife_nested: {
|
||||||
|
expression = true
|
||||||
options = {
|
options = {
|
||||||
expression: true,
|
expression: true,
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
@@ -242,7 +248,7 @@ issue_1254_negate_iife_nested: {
|
|||||||
};
|
};
|
||||||
})()()()()();
|
})()()()()();
|
||||||
}
|
}
|
||||||
expect_exact: '(function(){return function(){console.log("test")}})()()()()();'
|
expect_exact: 'function(){return function(){console.log("test")}}()()()()()'
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -317,7 +323,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,7 @@
|
|||||||
dont_reuse_prop: {
|
dont_reuse_prop: {
|
||||||
mangle = {
|
mangle = {
|
||||||
properties: {
|
properties: {
|
||||||
|
domprops: true,
|
||||||
regex: /asd/,
|
regex: /asd/,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@@ -19,11 +20,17 @@ dont_reuse_prop: {
|
|||||||
console.log(obj.a);
|
console.log(obj.a);
|
||||||
}
|
}
|
||||||
expect_stdout: "123"
|
expect_stdout: "123"
|
||||||
|
expect_warnings: [
|
||||||
|
"INFO: Preserving excluded property a",
|
||||||
|
"INFO: Mapping property asd to b",
|
||||||
|
"INFO: Preserving reserved property log",
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
unmangleable_props_should_always_be_reserved: {
|
unmangleable_props_should_always_be_reserved: {
|
||||||
mangle = {
|
mangle = {
|
||||||
properties: {
|
properties: {
|
||||||
|
domprops: true,
|
||||||
regex: /asd/,
|
regex: /asd/,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@@ -42,4 +49,9 @@ unmangleable_props_should_always_be_reserved: {
|
|||||||
console.log(obj.a);
|
console.log(obj.a);
|
||||||
}
|
}
|
||||||
expect_stdout: "123"
|
expect_stdout: "123"
|
||||||
|
expect_warnings: [
|
||||||
|
"INFO: Preserving excluded property a",
|
||||||
|
"INFO: Mapping property asd to b",
|
||||||
|
"INFO: Preserving reserved property log",
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,17 +1,18 @@
|
|||||||
keep_var_for_in: {
|
keep_var_for_in: {
|
||||||
options = {
|
options = {
|
||||||
hoist_vars: true,
|
hoist_vars: true,
|
||||||
|
join_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
(function(obj){
|
(function(obj) {
|
||||||
var foo = 5;
|
var foo = 5;
|
||||||
for (var i in obj)
|
for (var i in obj)
|
||||||
return foo;
|
return foo;
|
||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
(function(obj){
|
(function(obj) {
|
||||||
var i, foo = 5;
|
var i, foo = 5;
|
||||||
for (i in obj)
|
for (i in obj)
|
||||||
return foo;
|
return foo;
|
||||||
|
|||||||
@@ -63,42 +63,81 @@ eval_unused: {
|
|||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f1(a, eval, c, d, e) {
|
function o(k) {
|
||||||
return a('c') + eval;
|
return { c: 14 }[k];
|
||||||
}
|
|
||||||
function f2(a, b, c, d, e) {
|
|
||||||
return a + eval('c');
|
|
||||||
}
|
|
||||||
function f3(a, eval, c, d, e) {
|
|
||||||
return a + eval('c');
|
|
||||||
}
|
}
|
||||||
|
console.log(function f1(a, eval, c, d, e) {
|
||||||
|
return a("c") + eval;
|
||||||
|
}(o, 28, true));
|
||||||
|
console.log(function f2(a, b, c, d, e) {
|
||||||
|
return a + eval("c");
|
||||||
|
}(14, true, 28));
|
||||||
|
console.log(function f3(a, eval, c, d, e) {
|
||||||
|
return a + eval("c");
|
||||||
|
}(28, o, true));
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function f1(a, eval) {
|
function o(k) {
|
||||||
return a('c') + eval;
|
return { c: 14 }[k];
|
||||||
}
|
|
||||||
function f2(a, b, c, d, e) {
|
|
||||||
return a + eval('c');
|
|
||||||
}
|
|
||||||
function f3(a, eval, c, d, e) {
|
|
||||||
return a + eval('c');
|
|
||||||
}
|
}
|
||||||
|
console.log(function(a, eval) {
|
||||||
|
return a("c") + eval;
|
||||||
|
}(o, 28));
|
||||||
|
console.log(function f2(a, b, c, d, e) {
|
||||||
|
return a + eval("c");
|
||||||
|
}(14, true, 28));
|
||||||
|
console.log(function f3(a, eval, c, d, e) {
|
||||||
|
return a + eval("c");
|
||||||
|
}(28, o, true));
|
||||||
}
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"42",
|
||||||
|
"42",
|
||||||
|
"42",
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
eval_mangle: {
|
eval_mangle: {
|
||||||
mangle = {
|
mangle = {}
|
||||||
};
|
beautify = {
|
||||||
|
beautify: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
function f1(a, eval, c, d, e) {
|
function o(k) {
|
||||||
return a('c') + eval;
|
return { cc: 14 }[k + "c"];
|
||||||
}
|
}
|
||||||
function f2(a, b, c, d, e) {
|
console.log(function f1(a, eval, c, d, e) {
|
||||||
return a + eval('c');
|
return a("c") + eval;
|
||||||
|
}(o, 28, true));
|
||||||
|
console.log(function f2(a, b, c, d, e) {
|
||||||
|
return a + eval("c");
|
||||||
|
}(14, true, 28));
|
||||||
|
console.log(function f3(a, eval, c, d, e) {
|
||||||
|
return a + eval("c");
|
||||||
|
}(28, o, true));
|
||||||
}
|
}
|
||||||
function f3(a, eval, c, d, e) {
|
expect_exact: [
|
||||||
return a + eval('c');
|
"function o(o) {",
|
||||||
}
|
" return {",
|
||||||
}
|
" cc: 14",
|
||||||
expect_exact: 'function f1(n,c,e,a,f){return n("c")+c}function f2(a,b,c,d,e){return a+eval("c")}function f3(a,eval,c,d,e){return a+eval("c")}'
|
' }[o + "c"];',
|
||||||
|
"}",
|
||||||
|
"",
|
||||||
|
"console.log(function o(c, e, n, r, t) {",
|
||||||
|
' return c("c") + e;',
|
||||||
|
"}(o, 28, true));",
|
||||||
|
"",
|
||||||
|
"console.log(function f2(a, b, c, d, e) {",
|
||||||
|
' return a + eval("c");',
|
||||||
|
"}(14, true, 28));",
|
||||||
|
"",
|
||||||
|
"console.log(function f3(a, eval, c, d, e) {",
|
||||||
|
' return a + eval("c");',
|
||||||
|
"}(28, o, true));",
|
||||||
|
]
|
||||||
|
expect_stdout: [
|
||||||
|
"42",
|
||||||
|
"42",
|
||||||
|
"42",
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
issue979_reported: {
|
reported: {
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
booleans: true,
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
@@ -17,29 +17,26 @@ issue979_reported: {
|
|||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f1() {
|
function f1() {
|
||||||
if (a == 1 || b == 2) {
|
if (a == 1 || b == 2)
|
||||||
foo();
|
foo();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
function f2() {
|
function f2() {
|
||||||
if (!(a == 1 || b == 2)) {
|
if (!(a == 1 || b == 2));
|
||||||
}
|
else
|
||||||
else {
|
|
||||||
foo();
|
foo();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
expect: {
|
expect: {
|
||||||
function f1() {
|
function f1() {
|
||||||
1!=a&&2!=b||foo();
|
1 != a && 2 != b || foo();
|
||||||
}
|
}
|
||||||
function f2() {
|
function f2() {
|
||||||
1!=a&&2!=b||foo();
|
1 != a && 2 != b || foo();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
issue979_test_negated_is_best: {
|
test_negated_is_best: {
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
booleans: true,
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
@@ -58,53 +55,47 @@ issue979_test_negated_is_best: {
|
|||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f3() {
|
function f3() {
|
||||||
if (a == 1 | b == 2) {
|
if (a == 1 | b == 2)
|
||||||
foo();
|
foo();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
function f4() {
|
function f4() {
|
||||||
if (!(a == 1 | b == 2)) {
|
if (!(a == 1 | b == 2));
|
||||||
}
|
else
|
||||||
else {
|
|
||||||
foo();
|
foo();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
function f5() {
|
function f5() {
|
||||||
if (a == 1 && b == 2) {
|
if (a == 1 && b == 2)
|
||||||
foo();
|
foo();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
function f6() {
|
function f6() {
|
||||||
if (!(a == 1 && b == 2)) {
|
if (!(a == 1 && b == 2));
|
||||||
}
|
else
|
||||||
else {
|
|
||||||
foo();
|
foo();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
function f7() {
|
function f7() {
|
||||||
if (a == 1 || b == 2) {
|
if (a == 1 || b == 2)
|
||||||
foo();
|
foo();
|
||||||
}
|
else
|
||||||
else {
|
|
||||||
return bar();
|
return bar();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
expect: {
|
expect: {
|
||||||
function f3() {
|
function f3() {
|
||||||
1==a|2==b&&foo();
|
1 == a | 2 == b && foo();
|
||||||
}
|
}
|
||||||
function f4() {
|
function f4() {
|
||||||
1==a|2==b&&foo();
|
1 == a | 2 == b && foo();
|
||||||
}
|
}
|
||||||
function f5() {
|
function f5() {
|
||||||
1==a&&2==b&&foo();
|
1 == a && 2 == b && foo();
|
||||||
}
|
}
|
||||||
function f6() {
|
function f6() {
|
||||||
1!=a||2!=b||foo();
|
1 == a && 2 == b && foo();
|
||||||
}
|
}
|
||||||
function f7() {
|
function f7() {
|
||||||
if(1!=a&&2!=b)return bar();foo()
|
if (1 != a && 2 != b)
|
||||||
|
return bar();
|
||||||
|
foo();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,6 +16,105 @@ join_vars_assign: {
|
|||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
join_array_assignments_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
join_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function () {
|
||||||
|
var a = [ "foo", , "bar" ];
|
||||||
|
a[1] = "baz";
|
||||||
|
a[7] = "moo";
|
||||||
|
a[0] = "moz";
|
||||||
|
return a;
|
||||||
|
}().join());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function () {
|
||||||
|
var a = [ "moz", "baz", "bar", , , , , "moo" ];
|
||||||
|
return a;
|
||||||
|
}().join());
|
||||||
|
}
|
||||||
|
expect_stdout: "moz,baz,bar,,,,,moo"
|
||||||
|
}
|
||||||
|
|
||||||
|
join_array_assignments_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
join_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function () {
|
||||||
|
var a = [ "foo" ];
|
||||||
|
a[1] = "bar";
|
||||||
|
a[7] = "baz";
|
||||||
|
a[2] = "moo";
|
||||||
|
return a;
|
||||||
|
}().join());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function () {
|
||||||
|
var a = [ "foo", "bar" ];
|
||||||
|
a[7] = "baz";
|
||||||
|
a[2] = "moo";
|
||||||
|
return a;
|
||||||
|
}().join());
|
||||||
|
}
|
||||||
|
expect_stdout: "foo,bar,moo,,,,,baz"
|
||||||
|
}
|
||||||
|
|
||||||
|
join_array_assignments_3: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
join_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function () {
|
||||||
|
var a = [ "foo" ];
|
||||||
|
a[1] = "bar";
|
||||||
|
a.b = "baz";
|
||||||
|
a[2] = "moo";
|
||||||
|
return a;
|
||||||
|
}().join());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function () {
|
||||||
|
var a = [ "foo", "bar" ];
|
||||||
|
a.b = "baz";
|
||||||
|
a[2] = "moo";
|
||||||
|
return a;
|
||||||
|
}().join());
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
join_array_assignments_4: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
join_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function () {
|
||||||
|
var a = [ "foo" ];
|
||||||
|
a[0] = "bar";
|
||||||
|
a[1] = a;
|
||||||
|
a[2] = "baz";
|
||||||
|
return a;
|
||||||
|
}().join());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function () {
|
||||||
|
var a = [ "bar" ];
|
||||||
|
a[1] = a;
|
||||||
|
a[2] = "baz";
|
||||||
|
return a;
|
||||||
|
}().join());
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
join_object_assignments_1: {
|
join_object_assignments_1: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
@@ -489,6 +588,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"
|
||||||
|
}
|
||||||
|
|
||||||
|
inline_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"
|
||||||
|
}
|
||||||
|
|
||||||
|
inline_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,
|
||||||
@@ -790,7 +1043,7 @@ issue_3795: {
|
|||||||
dead_code: true,
|
dead_code: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
join_vars: true,
|
join_vars: true,
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
loops: true,
|
loops: true,
|
||||||
passes: 2,
|
passes: 2,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
@@ -990,7 +1243,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 +1268,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 +1334,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",
|
||||||
@@ -1055,3 +1345,185 @@ 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: {
|
||||||
|
options = {
|
||||||
|
join_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
b = "foo";
|
||||||
|
var a = [ , "bar" ];
|
||||||
|
console.log(b);
|
||||||
|
for (var b in a)
|
||||||
|
console.log(b, a[b]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var b = "foo", a = [ , "bar" ], b;
|
||||||
|
console.log(b);
|
||||||
|
for (b in a)
|
||||||
|
console.log(b, a[b]);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"1 bar",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
assign_for_var: {
|
||||||
|
options = {
|
||||||
|
join_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
i = "foo",
|
||||||
|
a = new Array(i, "bar");
|
||||||
|
for (var i = 2; --i >= 0;) {
|
||||||
|
console.log(a[i]);
|
||||||
|
for (var a in i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
for (var i = "foo", a = new Array(i, "bar"), i = 2; --i >= 0;) {
|
||||||
|
console.log(a[i]);
|
||||||
|
for (var a in i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"bar",
|
||||||
|
"foo",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
assign_sequence_var: {
|
||||||
|
options = {
|
||||||
|
join_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 0, b = 1;
|
||||||
|
console.log(a),
|
||||||
|
a++,
|
||||||
|
b = 2;
|
||||||
|
var c = 3;
|
||||||
|
console.log(a, b, c);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 0, b = 1, c = (console.log(a), a++, b = 2, 3);
|
||||||
|
console.log(a, b, c);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"0",
|
||||||
|
"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"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5831: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
join_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = [ console.log("PASS") ];
|
||||||
|
a[0] = 42;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = [ (console.log("PASS"), 42) ];
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5849: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
join_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
a = [ 42 ];
|
||||||
|
a[0] = "PASS";
|
||||||
|
console.log(a.join(""));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a, a = [ "PASS" ];
|
||||||
|
console.log(a.join(""));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|||||||
@@ -18,43 +18,6 @@ keep_fargs_false: {
|
|||||||
function j(e) {}
|
function j(e) {}
|
||||||
console.log(h(), i().length, j.length);
|
console.log(h(), i().length, j.length);
|
||||||
}
|
}
|
||||||
expect: {
|
|
||||||
console.log(function f() {
|
|
||||||
return f.length;
|
|
||||||
}(), function g() {
|
|
||||||
return g;
|
|
||||||
}().length);
|
|
||||||
function h() {
|
|
||||||
return h.length;
|
|
||||||
}
|
|
||||||
function i() {
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
function j() {}
|
|
||||||
console.log(h(), i().length, j.length);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
keep_fargs_strict: {
|
|
||||||
options = {
|
|
||||||
keep_fargs: "strict",
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
console.log(function f(a) {
|
|
||||||
return f.length;
|
|
||||||
}(), function g(b) {
|
|
||||||
return g;
|
|
||||||
}().length);
|
|
||||||
function h(c) {
|
|
||||||
return h.length;
|
|
||||||
}
|
|
||||||
function i(d) {
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
function j(e) {}
|
|
||||||
console.log(h(), i().length, j.length);
|
|
||||||
}
|
|
||||||
expect: {
|
expect: {
|
||||||
console.log(function f(a) {
|
console.log(function f(a) {
|
||||||
return f.length;
|
return f.length;
|
||||||
@@ -117,61 +80,11 @@ keep_fargs_true: {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
replace_index: {
|
|
||||||
options = {
|
|
||||||
arguments: true,
|
|
||||||
evaluate: true,
|
|
||||||
keep_fargs: "strict",
|
|
||||||
properties: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var arguments = [];
|
|
||||||
console.log(arguments[0]);
|
|
||||||
(function() {
|
|
||||||
console.log(arguments[1], arguments["1"], arguments["foo"]);
|
|
||||||
})("bar", 42);
|
|
||||||
(function(a, b) {
|
|
||||||
console.log(arguments[1], arguments["1"], arguments["foo"]);
|
|
||||||
})("bar", 42);
|
|
||||||
(function(arguments) {
|
|
||||||
console.log(arguments[1], arguments["1"], arguments["foo"]);
|
|
||||||
})("bar", 42);
|
|
||||||
(function() {
|
|
||||||
var arguments;
|
|
||||||
console.log(arguments[1], arguments["1"], arguments["foo"]);
|
|
||||||
})("bar", 42);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var arguments = [];
|
|
||||||
console.log(arguments[0]);
|
|
||||||
(function(argument_0, argument_1) {
|
|
||||||
console.log(argument_1, argument_1, arguments.foo);
|
|
||||||
})("bar", 42);
|
|
||||||
(function(a, b) {
|
|
||||||
console.log(b, b, arguments.foo);
|
|
||||||
})("bar", 42);
|
|
||||||
(function(arguments) {
|
|
||||||
console.log(arguments[1], arguments[1], arguments.foo);
|
|
||||||
})("bar", 42);
|
|
||||||
(function() {
|
|
||||||
var arguments;
|
|
||||||
console.log(arguments[1], arguments[1], arguments.foo);
|
|
||||||
})("bar", 42);
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"undefined",
|
|
||||||
"42 42 undefined",
|
|
||||||
"42 42 undefined",
|
|
||||||
"a a undefined",
|
|
||||||
"42 42 undefined",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
replace_index_strict: {
|
replace_index_strict: {
|
||||||
options = {
|
options = {
|
||||||
arguments: true,
|
arguments: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
properties: true,
|
properties: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
}
|
}
|
||||||
@@ -202,8 +115,9 @@ replace_index_strict: {
|
|||||||
issue_1858: {
|
issue_1858: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
pure_getters: true,
|
pure_getters: true,
|
||||||
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -224,7 +138,7 @@ issue_1858: {
|
|||||||
issue_2187_2: {
|
issue_2187_2: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -245,7 +159,7 @@ issue_2187_2: {
|
|||||||
issue_2203_2: {
|
issue_2203_2: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -267,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());
|
||||||
}
|
}
|
||||||
@@ -280,7 +194,7 @@ issue_2203_2: {
|
|||||||
issue_2298: {
|
issue_2298: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
passes: 2,
|
passes: 2,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
@@ -323,7 +237,7 @@ issue_2298: {
|
|||||||
issue_2319_1: {
|
issue_2319_1: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -346,7 +260,7 @@ issue_2319_1: {
|
|||||||
issue_2319_2: {
|
issue_2319_2: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -371,7 +285,7 @@ issue_2319_2: {
|
|||||||
issue_2319_3: {
|
issue_2319_3: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -396,7 +310,7 @@ issue_2319_3: {
|
|||||||
issue_2425_1: {
|
issue_2425_1: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -419,7 +333,7 @@ issue_2425_1: {
|
|||||||
issue_2425_2: {
|
issue_2425_2: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -442,7 +356,7 @@ issue_2425_2: {
|
|||||||
issue_2425_3: {
|
issue_2425_3: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -465,7 +379,7 @@ issue_2425_3: {
|
|||||||
issue_2436_13: {
|
issue_2436_13: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
passes: 2,
|
passes: 2,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -499,7 +413,7 @@ issue_2436_13: {
|
|||||||
issue_2506: {
|
issue_2506: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
passes: 2,
|
passes: 2,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -538,7 +452,7 @@ issue_2506: {
|
|||||||
|
|
||||||
issue_2226_1: {
|
issue_2226_1: {
|
||||||
options = {
|
options = {
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -585,7 +499,7 @@ issue_2226_1: {
|
|||||||
issue_2226_2: {
|
issue_2226_2: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -607,7 +521,7 @@ issue_2226_2: {
|
|||||||
issue_2226_3: {
|
issue_2226_3: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -627,7 +541,7 @@ issue_2226_3: {
|
|||||||
|
|
||||||
issue_3192: {
|
issue_3192: {
|
||||||
options = {
|
options = {
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -657,7 +571,7 @@ issue_3192: {
|
|||||||
if_increment: {
|
if_increment: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -679,7 +593,7 @@ if_increment: {
|
|||||||
try_increment: {
|
try_increment: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -703,7 +617,7 @@ try_increment: {
|
|||||||
issue_2630_3: {
|
issue_2630_3: {
|
||||||
options = {
|
options = {
|
||||||
inline: true,
|
inline: true,
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -740,7 +654,7 @@ issue_2630_3: {
|
|||||||
issue_3364: {
|
issue_3364: {
|
||||||
options = {
|
options = {
|
||||||
functions: true,
|
functions: true,
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -805,7 +719,7 @@ issue_3364: {
|
|||||||
|
|
||||||
defun_label: {
|
defun_label: {
|
||||||
options = {
|
options = {
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
passes: 2,
|
passes: 2,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
@@ -837,7 +751,7 @@ defun_label: {
|
|||||||
|
|
||||||
iife_func_side_effects: {
|
iife_func_side_effects: {
|
||||||
options = {
|
options = {
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -889,7 +803,7 @@ iife_func_side_effects: {
|
|||||||
issue_1595_1: {
|
issue_1595_1: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -909,7 +823,7 @@ issue_1595_1: {
|
|||||||
issue_1595_2: {
|
issue_1595_2: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -929,7 +843,7 @@ issue_1595_2: {
|
|||||||
issue_1595_3: {
|
issue_1595_3: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
passes: 2,
|
passes: 2,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
@@ -950,7 +864,7 @@ issue_1595_3: {
|
|||||||
issue_1595_4: {
|
issue_1595_4: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -972,7 +886,7 @@ issue_1595_4: {
|
|||||||
|
|
||||||
duplicate_lambda_defun_name_1: {
|
duplicate_lambda_defun_name_1: {
|
||||||
options = {
|
options = {
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -992,7 +906,7 @@ duplicate_lambda_defun_name_1: {
|
|||||||
|
|
||||||
duplicate_lambda_defun_name_2: {
|
duplicate_lambda_defun_name_2: {
|
||||||
options = {
|
options = {
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
passes: 2,
|
passes: 2,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -1011,9 +925,31 @@ 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: "strict",
|
keep_fargs: false,
|
||||||
keep_fnames: true,
|
keep_fnames: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -1031,13 +967,13 @@ function_name_mangle: {
|
|||||||
|
|
||||||
function_name_mangle_ie8: {
|
function_name_mangle_ie8: {
|
||||||
options = {
|
options = {
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
keep_fnames: true,
|
keep_fnames: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
ie8: true,
|
ie: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -1052,7 +988,7 @@ function_name_mangle_ie8: {
|
|||||||
|
|
||||||
issue_3420_1: {
|
issue_3420_1: {
|
||||||
options = {
|
options = {
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -1075,7 +1011,7 @@ issue_3420_1: {
|
|||||||
issue_3420_2: {
|
issue_3420_2: {
|
||||||
options = {
|
options = {
|
||||||
inline: true,
|
inline: true,
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -1096,7 +1032,7 @@ issue_3420_2: {
|
|||||||
issue_3420_3: {
|
issue_3420_3: {
|
||||||
options = {
|
options = {
|
||||||
inline: true,
|
inline: true,
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -1118,7 +1054,7 @@ issue_3420_3: {
|
|||||||
|
|
||||||
issue_3423_1: {
|
issue_3423_1: {
|
||||||
options = {
|
options = {
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -1138,7 +1074,7 @@ issue_3423_1: {
|
|||||||
|
|
||||||
issue_3423_2: {
|
issue_3423_2: {
|
||||||
options = {
|
options = {
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -1165,7 +1101,7 @@ collapse_vars_repeated: {
|
|||||||
hoist_funs: true,
|
hoist_funs: true,
|
||||||
if_return: true,
|
if_return: true,
|
||||||
join_vars: true,
|
join_vars: true,
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
loops: true,
|
loops: true,
|
||||||
properties: true,
|
properties: true,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
@@ -1212,7 +1148,7 @@ collapse_vars_repeated: {
|
|||||||
chained_3: {
|
chained_3: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -1236,7 +1172,7 @@ replace_all_var_scope: {
|
|||||||
rename = true
|
rename = true
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
mangle = {}
|
mangle = {}
|
||||||
@@ -1265,7 +1201,7 @@ replace_all_var_scope: {
|
|||||||
|
|
||||||
issue_1583: {
|
issue_1583: {
|
||||||
options = {
|
options = {
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
passes: 2,
|
passes: 2,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
@@ -1302,7 +1238,8 @@ issues_3267_1: {
|
|||||||
dead_code: true,
|
dead_code: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
|
negate_iife: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
@@ -1331,7 +1268,7 @@ issues_3267_1: {
|
|||||||
|
|
||||||
trailing_argument_side_effects: {
|
trailing_argument_side_effects: {
|
||||||
options = {
|
options = {
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -1355,7 +1292,7 @@ trailing_argument_side_effects: {
|
|||||||
|
|
||||||
recursive_iife_1: {
|
recursive_iife_1: {
|
||||||
options = {
|
options = {
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -1374,7 +1311,7 @@ recursive_iife_1: {
|
|||||||
|
|
||||||
recursive_iife_2: {
|
recursive_iife_2: {
|
||||||
options = {
|
options = {
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -1452,3 +1389,37 @@ issue_3619: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4353_1: {
|
||||||
|
options = {
|
||||||
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function f(a) {}.length);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(a) {}.length);
|
||||||
|
}
|
||||||
|
expect_stdout: "1"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4353_2: {
|
||||||
|
options = {
|
||||||
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function f(a) {
|
||||||
|
while (console.log("PASS"));
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function() {
|
||||||
|
while (console.log("PASS"));
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|||||||
@@ -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");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -110,6 +111,7 @@ labels_5: {
|
|||||||
labels_6: {
|
labels_6: {
|
||||||
options = {
|
options = {
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
out: break out;
|
out: break out;
|
||||||
@@ -189,21 +191,243 @@ 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"
|
||||||
|
}
|
||||||
|
|
||||||
|
labels_11: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
if_return: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
L: if (console.log("PASS"))
|
||||||
|
break L;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
labels_12: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
L: try {
|
||||||
|
if (console.log("foo"))
|
||||||
|
break L;
|
||||||
|
throw "bar";
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e);
|
||||||
|
break L;
|
||||||
|
} finally {
|
||||||
|
if (console.log("baz"))
|
||||||
|
break L;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
L: try {
|
||||||
|
if (!console.log("foo"))
|
||||||
|
throw "bar";
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e);
|
||||||
|
} finally {
|
||||||
|
if (console.log("baz"))
|
||||||
|
break L;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
"baz",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4466_1: {
|
||||||
|
mangle = {
|
||||||
|
v8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
A: if (console.log("PASS"))
|
||||||
|
B:;
|
||||||
|
else
|
||||||
|
C:;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
e: if (console.log("PASS"))
|
||||||
|
l:;
|
||||||
|
else
|
||||||
|
l:;
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=12"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4466_1_v8: {
|
||||||
|
mangle = {
|
||||||
|
v8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
A: if (console.log("PASS"))
|
||||||
|
B:;
|
||||||
|
else
|
||||||
|
C:;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
e: if (console.log("PASS"))
|
||||||
|
l:;
|
||||||
|
else
|
||||||
|
o:;
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=12"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4466_2: {
|
||||||
|
mangle = {
|
||||||
|
toplevel: false,
|
||||||
|
v8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
if (console.log("PASS"))
|
||||||
|
A:;
|
||||||
|
else
|
||||||
|
B:;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
if (console.log("PASS"))
|
||||||
|
e:;
|
||||||
|
else
|
||||||
|
e:;
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4466_2_v8: {
|
||||||
|
mangle = {
|
||||||
|
toplevel: false,
|
||||||
|
v8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
if (console.log("PASS"))
|
||||||
|
A:;
|
||||||
|
else
|
||||||
|
B:;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
if (console.log("PASS"))
|
||||||
|
e:;
|
||||||
|
else
|
||||||
|
l:;
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4466_2_toplevel: {
|
||||||
|
mangle = {
|
||||||
|
toplevel: true,
|
||||||
|
v8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
if (console.log("PASS"))
|
||||||
|
A:;
|
||||||
|
else
|
||||||
|
B:;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
if (console.log("PASS"))
|
||||||
|
e:;
|
||||||
|
else
|
||||||
|
e:;
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4466_2_toplevel_v8: {
|
||||||
|
mangle = {
|
||||||
|
toplevel: true,
|
||||||
|
v8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
if (console.log("PASS"))
|
||||||
|
A:;
|
||||||
|
else
|
||||||
|
B:;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
if (console.log("PASS"))
|
||||||
|
e:;
|
||||||
|
else
|
||||||
|
e:;
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5522: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
L: try {
|
||||||
|
return "FAIL";
|
||||||
|
} finally {
|
||||||
|
break L;
|
||||||
|
}
|
||||||
|
return "PASS";
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function() {
|
||||||
|
L: try {
|
||||||
|
return "FAIL";
|
||||||
|
} finally {
|
||||||
|
break L;
|
||||||
|
}
|
||||||
|
return "PASS";
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5524: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
L: try {
|
||||||
|
FAIL;
|
||||||
|
} finally {
|
||||||
|
break L;
|
||||||
|
}
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
L: try {
|
||||||
|
FAIL;
|
||||||
|
} finally {
|
||||||
|
break L;
|
||||||
|
}
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|||||||
2568
test/compress/let.js
Normal file
2568
test/compress/let.js
Normal file
File diff suppressed because it is too large
Load Diff
@@ -193,9 +193,9 @@ evaluate: {
|
|||||||
} while (false);
|
} while (false);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
for(;;)
|
for (;;)
|
||||||
a();
|
a();
|
||||||
for(;;)
|
for (;;)
|
||||||
c();
|
c();
|
||||||
d();
|
d();
|
||||||
}
|
}
|
||||||
@@ -265,7 +265,7 @@ issue_1532_2: {
|
|||||||
issue_186: {
|
issue_186: {
|
||||||
beautify = {
|
beautify = {
|
||||||
beautify: false,
|
beautify: false,
|
||||||
ie8: false,
|
ie: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = 3;
|
var x = 3;
|
||||||
@@ -284,7 +284,7 @@ issue_186: {
|
|||||||
issue_186_ie8: {
|
issue_186_ie8: {
|
||||||
beautify = {
|
beautify = {
|
||||||
beautify: false,
|
beautify: false,
|
||||||
ie8: true,
|
ie: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = 3;
|
var x = 3;
|
||||||
@@ -303,7 +303,7 @@ issue_186_ie8: {
|
|||||||
issue_186_beautify: {
|
issue_186_beautify: {
|
||||||
beautify = {
|
beautify = {
|
||||||
beautify: true,
|
beautify: true,
|
||||||
ie8: false,
|
ie: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = 3;
|
var x = 3;
|
||||||
@@ -330,7 +330,7 @@ issue_186_beautify: {
|
|||||||
issue_186_beautify_ie8: {
|
issue_186_beautify_ie8: {
|
||||||
beautify = {
|
beautify = {
|
||||||
beautify: true,
|
beautify: true,
|
||||||
ie8: true,
|
ie: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = 3;
|
var x = 3;
|
||||||
@@ -360,7 +360,7 @@ issue_186_braces: {
|
|||||||
beautify = {
|
beautify = {
|
||||||
beautify: false,
|
beautify: false,
|
||||||
braces: true,
|
braces: true,
|
||||||
ie8: false,
|
ie: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = 3;
|
var x = 3;
|
||||||
@@ -380,7 +380,7 @@ issue_186_braces_ie8: {
|
|||||||
beautify = {
|
beautify = {
|
||||||
beautify: false,
|
beautify: false,
|
||||||
braces: true,
|
braces: true,
|
||||||
ie8: true,
|
ie: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = 3;
|
var x = 3;
|
||||||
@@ -400,7 +400,7 @@ issue_186_beautify_braces: {
|
|||||||
beautify = {
|
beautify = {
|
||||||
beautify: true,
|
beautify: true,
|
||||||
braces: true,
|
braces: true,
|
||||||
ie8: false,
|
ie: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = 3;
|
var x = 3;
|
||||||
@@ -432,7 +432,7 @@ issue_186_beautify_braces_ie8: {
|
|||||||
beautify = {
|
beautify = {
|
||||||
beautify: true,
|
beautify: true,
|
||||||
braces: true,
|
braces: true,
|
||||||
ie8: true,
|
ie: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = 3;
|
var x = 3;
|
||||||
@@ -501,14 +501,14 @@ do_switch: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
in_parenthesis_1: {
|
in_parentheses_1: {
|
||||||
input: {
|
input: {
|
||||||
for (("foo" in {});0;);
|
for (("foo" in {});0;);
|
||||||
}
|
}
|
||||||
expect_exact: 'for(("foo"in{});0;);'
|
expect_exact: 'for(("foo"in{});0;);'
|
||||||
}
|
}
|
||||||
|
|
||||||
in_parenthesis_2: {
|
in_parentheses_2: {
|
||||||
input: {
|
input: {
|
||||||
for ((function(){ "foo" in {}; });0;);
|
for ((function(){ "foo" in {}; });0;);
|
||||||
}
|
}
|
||||||
@@ -547,8 +547,8 @@ dead_code_condition: {
|
|||||||
console.log(a);
|
console.log(a);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var c;
|
|
||||||
var a = 0, b = 5;
|
var a = 0, b = 5;
|
||||||
|
var c;
|
||||||
a += 1, 0,
|
a += 1, 0,
|
||||||
console.log(a);
|
console.log(a);
|
||||||
}
|
}
|
||||||
@@ -828,6 +828,44 @@ empty_for_in_prop_init: {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for_of: {
|
||||||
|
input: {
|
||||||
|
var a = [ "PASS", 42 ];
|
||||||
|
a.p = "FAIL";
|
||||||
|
for (a of (null, a))
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'var a=["PASS",42];a.p="FAIL";for(a of(null,a))console.log(a);'
|
||||||
|
expect_stdout: true
|
||||||
|
node_version: ">=0.12"
|
||||||
|
}
|
||||||
|
|
||||||
|
for_async_of: {
|
||||||
|
input: {
|
||||||
|
var async = [ "PASS", 42 ];
|
||||||
|
async.p = "FAIL";
|
||||||
|
for (async of (null, async))
|
||||||
|
console.log(async);
|
||||||
|
}
|
||||||
|
expect_exact: 'var async=["PASS",42];async.p="FAIL";for(async of(null,async))console.log(async);'
|
||||||
|
expect_stdout: true
|
||||||
|
node_version: ">=0.12 <16"
|
||||||
|
}
|
||||||
|
|
||||||
|
for_of_regexp: {
|
||||||
|
input: {
|
||||||
|
for (var a of /foo/);
|
||||||
|
}
|
||||||
|
expect_exact: "for(var a of/foo/);"
|
||||||
|
}
|
||||||
|
|
||||||
|
for_await_of_regexp: {
|
||||||
|
input: {
|
||||||
|
for await (var a of /foo/);
|
||||||
|
}
|
||||||
|
expect_exact: "for await(var a of/foo/);"
|
||||||
|
}
|
||||||
|
|
||||||
issue_3631_1: {
|
issue_3631_1: {
|
||||||
options = {
|
options = {
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
@@ -1026,7 +1064,7 @@ issue_4075: {
|
|||||||
|
|
||||||
issue_4082: {
|
issue_4082: {
|
||||||
options = {
|
options = {
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
loops: true,
|
loops: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -1050,7 +1088,7 @@ issue_4082: {
|
|||||||
|
|
||||||
issue_4084: {
|
issue_4084: {
|
||||||
options = {
|
options = {
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
loops: true,
|
loops: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -1197,3 +1235,116 @@ issue_4182_2: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
do_continue: {
|
||||||
|
options = {
|
||||||
|
loops: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try {
|
||||||
|
do {
|
||||||
|
continue;
|
||||||
|
} while ([ A ]);
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
try {
|
||||||
|
do {
|
||||||
|
continue;
|
||||||
|
} while ([ A ]);
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4240: {
|
||||||
|
options = {
|
||||||
|
loops: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a) {
|
||||||
|
function f() {
|
||||||
|
var o = { PASS: 42 };
|
||||||
|
for (a in o);
|
||||||
|
}
|
||||||
|
(function() {
|
||||||
|
if (f());
|
||||||
|
})();
|
||||||
|
console.log(a);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(a) {
|
||||||
|
(function() {
|
||||||
|
if (function() {
|
||||||
|
for (a in { PASS: 42 });
|
||||||
|
}());
|
||||||
|
})();
|
||||||
|
console.log(a);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4355: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
loops: true,
|
||||||
|
passes: 2,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
while (function() {
|
||||||
|
var a;
|
||||||
|
for (a in console.log("PASS"))
|
||||||
|
var b = 0;
|
||||||
|
}())
|
||||||
|
var c;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function() {
|
||||||
|
console.log("PASS");
|
||||||
|
})();
|
||||||
|
var c;
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4564: {
|
||||||
|
options = {
|
||||||
|
loops: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try {
|
||||||
|
throw null;
|
||||||
|
} catch (a) {
|
||||||
|
var a;
|
||||||
|
(function() {
|
||||||
|
for (a in "foo");
|
||||||
|
})();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
try {
|
||||||
|
throw null;
|
||||||
|
} catch (a) {
|
||||||
|
var a;
|
||||||
|
(function() {
|
||||||
|
for (a in "foo");
|
||||||
|
})();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "2"
|
||||||
|
}
|
||||||
|
|||||||
@@ -37,6 +37,51 @@ just_enough: {
|
|||||||
expect_warnings: []
|
expect_warnings: []
|
||||||
}
|
}
|
||||||
|
|
||||||
|
drop_semicolon: {
|
||||||
|
beautify = {
|
||||||
|
max_line_len: 5,
|
||||||
|
semicolons: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
console.log(a || 42);
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"var a",
|
||||||
|
"console.log(",
|
||||||
|
"a||42",
|
||||||
|
");",
|
||||||
|
]
|
||||||
|
expect_stdout: "42"
|
||||||
|
expect_warnings: [
|
||||||
|
"WARN: Output exceeds 5 characters",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
template_newline: {
|
||||||
|
beautify = {
|
||||||
|
max_line_len: 2,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(`foo
|
||||||
|
bar`);
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"console.log(",
|
||||||
|
"`foo",
|
||||||
|
"bar`",
|
||||||
|
");",
|
||||||
|
]
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
]
|
||||||
|
expect_warnings: [
|
||||||
|
"WARN: Output exceeds 2 characters",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
issue_304: {
|
issue_304: {
|
||||||
beautify = {
|
beautify = {
|
||||||
max_line_len: 10,
|
max_line_len: 10,
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -122,13 +122,41 @@ negate_iife_4: {
|
|||||||
sequences: true,
|
sequences: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
(function(){ return t })() ? console.log(true) : console.log(false);
|
(function() {
|
||||||
(function(){
|
return t;
|
||||||
|
})() ? console.log(true) : console.log(false);
|
||||||
|
(function() {
|
||||||
console.log("something");
|
console.log("something");
|
||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
!function(){ return t }() ? console.log(false) : console.log(true), function(){
|
!function() {
|
||||||
|
return t;
|
||||||
|
}() ? console.log(false) : console.log(true), !function() {
|
||||||
|
console.log("something");
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
negate_iife_4_drop_side_effect_free: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
negate_iife: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
return t;
|
||||||
|
})() ? console.log(true) : console.log(false);
|
||||||
|
(function() {
|
||||||
|
console.log("something");
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
!function() {
|
||||||
|
return t;
|
||||||
|
}() ? console.log(false) : console.log(true), function() {
|
||||||
console.log("something");
|
console.log("something");
|
||||||
}();
|
}();
|
||||||
}
|
}
|
||||||
@@ -176,17 +204,49 @@ negate_iife_5: {
|
|||||||
sequences: true,
|
sequences: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
if ((function(){ return t })()) {
|
if (function() {
|
||||||
|
return t;
|
||||||
|
}()) {
|
||||||
foo(true);
|
foo(true);
|
||||||
} else {
|
} else {
|
||||||
bar(false);
|
bar(false);
|
||||||
}
|
}
|
||||||
(function(){
|
(function() {
|
||||||
console.log("something");
|
console.log("something");
|
||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
!function(){ return t }() ? bar(false) : foo(true), function(){
|
!function() {
|
||||||
|
return t;
|
||||||
|
}() ? bar(false) : foo(true), !function() {
|
||||||
|
console.log("something");
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
negate_iife_5_drop_side_effect_free: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
negate_iife: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
if (function() {
|
||||||
|
return t;
|
||||||
|
}()) {
|
||||||
|
foo(true);
|
||||||
|
} else {
|
||||||
|
bar(false);
|
||||||
|
}
|
||||||
|
(function() {
|
||||||
|
console.log("something");
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
!function() {
|
||||||
|
return t;
|
||||||
|
}() ? bar(false) : foo(true), function() {
|
||||||
console.log("something");
|
console.log("something");
|
||||||
}();
|
}();
|
||||||
}
|
}
|
||||||
@@ -389,6 +449,7 @@ issue_1288_side_effects: {
|
|||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
|
sequences: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -409,10 +470,10 @@ issue_1288_side_effects: {
|
|||||||
})(0);
|
})(0);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
w;
|
w,
|
||||||
x || function() {
|
x || function() {
|
||||||
x = {};
|
x = {};
|
||||||
}();
|
}(),
|
||||||
y;
|
y;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ new_with_unary_prefix: {
|
|||||||
expect_exact: 'var bar=(+new Date).toString(32);';
|
expect_exact: 'var bar=(+new Date).toString(32);';
|
||||||
}
|
}
|
||||||
|
|
||||||
dot_parenthesis_1: {
|
dot_parentheses_1: {
|
||||||
input: {
|
input: {
|
||||||
console.log(new (Math.random().constructor) instanceof Number);
|
console.log(new (Math.random().constructor) instanceof Number);
|
||||||
}
|
}
|
||||||
@@ -93,7 +93,7 @@ dot_parenthesis_1: {
|
|||||||
expect_stdout: "true"
|
expect_stdout: "true"
|
||||||
}
|
}
|
||||||
|
|
||||||
dot_parenthesis_2: {
|
dot_parentheses_2: {
|
||||||
input: {
|
input: {
|
||||||
console.log(typeof new function(){Math.random()}.constructor);
|
console.log(typeof new function(){Math.random()}.constructor);
|
||||||
}
|
}
|
||||||
|
|||||||
386
test/compress/nullish.js
Normal file
386
test/compress/nullish.js
Normal file
@@ -0,0 +1,386 @@
|
|||||||
|
parentheses: {
|
||||||
|
input: {
|
||||||
|
(console.log("foo") || console.log("bar") ?? console.log("baz")) && console.log("moo");
|
||||||
|
}
|
||||||
|
expect_exact:'((console.log("foo")||console.log("bar"))??console.log("baz"))&&console.log("moo");'
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
"baz",
|
||||||
|
]
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
evaluate: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
void console.log("foo" ?? "bar") ?? console.log("baz");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("foo"),
|
||||||
|
console.log("baz");
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"baz",
|
||||||
|
]
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
conditional_assignment_1: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(a, b) {
|
||||||
|
b ?? (a = "FAIL");
|
||||||
|
return a;
|
||||||
|
}("PASS", !console));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(a, b) {
|
||||||
|
b ?? (a = "FAIL");
|
||||||
|
return a;
|
||||||
|
}("PASS", !console));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
conditional_assignment_2: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a, b = false;
|
||||||
|
a = "PASS",
|
||||||
|
b ?? (a = "FAIL"),
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a, b = false;
|
||||||
|
a = "PASS",
|
||||||
|
b ?? (a = "FAIL"),
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
conditional_assignment_3: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
join_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a, b = false;
|
||||||
|
a = "PASS",
|
||||||
|
b ?? (a = "FAIL"),
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a, b = false, a = "PASS";
|
||||||
|
b ?? (a = "FAIL"),
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
conditional_assignment_4: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(a) {
|
||||||
|
!console ?? (a = "FAIL");
|
||||||
|
return a;
|
||||||
|
}("PASS"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(a) {
|
||||||
|
!console ?? (a = "FAIL");
|
||||||
|
return a;
|
||||||
|
}("PASS"));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
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: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
ie: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
if (void 0 === (undefined ?? a))
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
if (void 0 === (undefined ?? a))
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5266: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
side_effects: 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"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5829_1: {
|
||||||
|
options = {
|
||||||
|
merge_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function f(a) {
|
||||||
|
var b;
|
||||||
|
(!a ?? (b = 0)) || console.log(b || "PASS");
|
||||||
|
})("FAIL");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function f(a) {
|
||||||
|
var b;
|
||||||
|
(!a ?? (b = 0)) || console.log(b || "PASS");
|
||||||
|
})("FAIL");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5829_2: {
|
||||||
|
options = {
|
||||||
|
merge_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function f(a) {
|
||||||
|
var b;
|
||||||
|
(a ?? (b = 0)) && console.log(b || "PASS");
|
||||||
|
})("FAIL");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function f(a) {
|
||||||
|
var b;
|
||||||
|
(a ?? (b = 0)) && console.log(b || "PASS");
|
||||||
|
})("FAIL");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
@@ -1,49 +1,141 @@
|
|||||||
hex_numbers_in_parentheses_for_prototype_functions: {
|
literal_infinity: {
|
||||||
|
input: {
|
||||||
|
console.log(2e308, -1e2345);
|
||||||
|
}
|
||||||
|
expect_exact: "console.log(1/0,-(1/0));"
|
||||||
|
}
|
||||||
|
|
||||||
|
parentheses_for_prototype_functions: {
|
||||||
beautify = {
|
beautify = {
|
||||||
beautify: true,
|
beautify: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f() {
|
(function() {
|
||||||
(-2);
|
console.log((-2));
|
||||||
(-2).toFixed(0);
|
console.log((-2).toFixed(0));
|
||||||
|
|
||||||
(2);
|
console.log((2));
|
||||||
(2).toFixed(0);
|
console.log((2).toFixed(0));
|
||||||
|
|
||||||
(0.2);
|
console.log((0.2));
|
||||||
(0.2).toFixed(0);
|
console.log((0.2).toFixed(0));
|
||||||
|
|
||||||
(2.34e20);
|
console.log((2.34e20));
|
||||||
(2.34e20).toFixed(0);
|
console.log((2.34e20).toFixed(0));
|
||||||
|
|
||||||
(0.00000002);
|
console.log((0.00000002));
|
||||||
(0.00000002).toFixed(0);
|
console.log((0.00000002).toFixed(0));
|
||||||
|
|
||||||
(1000000000000000128);
|
console.log((1000000000000000128));
|
||||||
(1000000000000000128).toFixed(0);
|
console.log((1000000000000000128).toFixed(0));
|
||||||
|
|
||||||
(-1000000000000000128);
|
console.log((-1000000000000000128));
|
||||||
(-1000000000000000128).toFixed(0);
|
console.log((-1000000000000000128).toFixed(0));
|
||||||
}
|
})();
|
||||||
}
|
}
|
||||||
expect_exact: [
|
expect_exact: [
|
||||||
"function f() {",
|
"(function() {",
|
||||||
" -2;",
|
" console.log(-2);",
|
||||||
" (-2).toFixed(0);",
|
" console.log((-2).toFixed(0));",
|
||||||
" 2;",
|
" console.log(2);",
|
||||||
" 2..toFixed(0);",
|
" console.log(2..toFixed(0));",
|
||||||
" .2;",
|
" console.log(.2);",
|
||||||
" .2.toFixed(0);",
|
" console.log(.2.toFixed(0));",
|
||||||
" 234e18;",
|
" console.log(234e18);",
|
||||||
" 234e18.toFixed(0);",
|
" console.log(234e18.toFixed(0));",
|
||||||
" 2e-8;",
|
" console.log(2e-8);",
|
||||||
" 2e-8.toFixed(0);",
|
" console.log(2e-8.toFixed(0));",
|
||||||
" 0xde0b6b3a7640080;",
|
" console.log(0xde0b6b3a7640080);",
|
||||||
" (0xde0b6b3a7640080).toFixed(0);",
|
" console.log(0xde0b6b3a7640080.toFixed(0));",
|
||||||
" -0xde0b6b3a7640080;",
|
" console.log(-0xde0b6b3a7640080);",
|
||||||
" (-0xde0b6b3a7640080).toFixed(0);",
|
" console.log((-0xde0b6b3a7640080).toFixed(0));",
|
||||||
"}",
|
"})();",
|
||||||
]
|
]
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
parentheses_for_prototype_functions_galio: {
|
||||||
|
beautify = {
|
||||||
|
beautify: true,
|
||||||
|
galio: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
console.log((-2));
|
||||||
|
console.log((-2).toFixed(0));
|
||||||
|
|
||||||
|
console.log((2));
|
||||||
|
console.log((2).toFixed(0));
|
||||||
|
|
||||||
|
console.log((0.2));
|
||||||
|
console.log((0.2).toFixed(0));
|
||||||
|
|
||||||
|
console.log((2.34e20));
|
||||||
|
console.log((2.34e20).toFixed(0));
|
||||||
|
|
||||||
|
console.log((0.00000002));
|
||||||
|
console.log((0.00000002).toFixed(0));
|
||||||
|
|
||||||
|
console.log((1000000000000000128));
|
||||||
|
console.log((1000000000000000128).toFixed(0));
|
||||||
|
|
||||||
|
console.log((-1000000000000000128));
|
||||||
|
console.log((-1000000000000000128).toFixed(0));
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"(function() {",
|
||||||
|
" console.log(-2);",
|
||||||
|
" console.log((-2).toFixed(0));",
|
||||||
|
" console.log(2);",
|
||||||
|
" console.log(2..toFixed(0));",
|
||||||
|
" console.log(.2);",
|
||||||
|
" console.log(.2.toFixed(0));",
|
||||||
|
" console.log(234e18);",
|
||||||
|
" console.log(234e18.toFixed(0));",
|
||||||
|
" console.log(2e-8);",
|
||||||
|
" console.log(2e-8.toFixed(0));",
|
||||||
|
" console.log(0xde0b6b3a7640080);",
|
||||||
|
" console.log((0xde0b6b3a7640080).toFixed(0));",
|
||||||
|
" console.log(-0xde0b6b3a7640080);",
|
||||||
|
" console.log((-0xde0b6b3a7640080).toFixed(0));",
|
||||||
|
"})();",
|
||||||
|
]
|
||||||
|
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: {
|
||||||
@@ -287,7 +379,7 @@ evaluate_3: {
|
|||||||
console.log(1 + Number(x) + 2);
|
console.log(1 + Number(x) + 2);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
console.log(+x + 3);
|
console.log(+("" + x) + 3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -726,7 +818,7 @@ issue_1710: {
|
|||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
unary_binary_parenthesis: {
|
unary_binary_parentheses: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
}
|
}
|
||||||
@@ -750,9 +842,9 @@ unary_binary_parenthesis: {
|
|||||||
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
|
||||||
@@ -1305,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"
|
||||||
}
|
}
|
||||||
@@ -1335,3 +1427,75 @@ issue_4142: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "0"
|
expect_stdout: "0"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4542_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
unsafe_math: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(a) {
|
||||||
|
return a / (1 / (a[0] = 2));
|
||||||
|
}([ 3 ]));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(a) {
|
||||||
|
return a / (1 / (a[0] = 2));
|
||||||
|
}([ 3 ]));
|
||||||
|
}
|
||||||
|
expect_stdout: "4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4542_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
unsafe_math: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(a) {
|
||||||
|
return a / (1 / --a[0]);
|
||||||
|
}([ 3 ]));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(a) {
|
||||||
|
return a / (1 / --a[0]);
|
||||||
|
}([ 3 ]));
|
||||||
|
}
|
||||||
|
expect_stdout: "4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4542_3: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
unsafe_math: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(a) {
|
||||||
|
return a / (0 / (a[0] = 0, 1));
|
||||||
|
}([ 1 ]));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(a) {
|
||||||
|
return a / (0 / (a[0] = 0, 1));
|
||||||
|
}([ 1 ]));
|
||||||
|
}
|
||||||
|
expect_stdout: "NaN"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4542_4: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
unsafe_math: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(a) {
|
||||||
|
return a / (1 / (a.length = 1));
|
||||||
|
}([ 2, 3 ]));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(a) {
|
||||||
|
return a / (1 / (a.length = 1));
|
||||||
|
}([ 2, 3 ]));
|
||||||
|
}
|
||||||
|
expect_stdout: "2"
|
||||||
|
}
|
||||||
|
|||||||
@@ -45,8 +45,8 @@ duplicate_key_strict: {
|
|||||||
"use strict";
|
"use strict";
|
||||||
var o = {
|
var o = {
|
||||||
a: 1,
|
a: 1,
|
||||||
b: 2,
|
|
||||||
a: 3,
|
a: 3,
|
||||||
|
b: 2,
|
||||||
};
|
};
|
||||||
for (var k in o)
|
for (var k in o)
|
||||||
console.log(k, o[k]);
|
console.log(k, o[k]);
|
||||||
@@ -173,7 +173,9 @@ numeric_literal: {
|
|||||||
side_effects: true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
properties: true,
|
properties: {
|
||||||
|
domprops: true,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
beautify = {
|
beautify = {
|
||||||
beautify: true,
|
beautify: true,
|
||||||
@@ -221,3 +223,325 @@ numeric_literal: {
|
|||||||
"8 7 8",
|
"8 7 8",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
evaluate_computed_key: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
objects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log({
|
||||||
|
["foo" + "bar"]: "PASS",
|
||||||
|
}.foobar);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log({
|
||||||
|
foobar: "PASS",
|
||||||
|
}.foobar);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
keep_computed_key: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
({
|
||||||
|
[console.log("PASS")]: 42,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
shorthand_keywords: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var async = 1, get = 2, set = 3, o = {
|
||||||
|
async,
|
||||||
|
get,
|
||||||
|
set,
|
||||||
|
};
|
||||||
|
console.log(o.async, o.get, o.set);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(1, 2, 3);
|
||||||
|
}
|
||||||
|
expect_stdout: "1 2 3"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
object_super: {
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
f() {
|
||||||
|
return super.p;
|
||||||
|
},
|
||||||
|
p: "FAIL",
|
||||||
|
};
|
||||||
|
Object.setPrototypeOf(o, { p: "PASS" });
|
||||||
|
console.log(o.f());
|
||||||
|
}
|
||||||
|
expect_exact: 'var o={f(){return super.p},p:"FAIL"};Object.setPrototypeOf(o,{p:"PASS"});console.log(o.f());'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
object_super_async: {
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
async f() {
|
||||||
|
return super.p;
|
||||||
|
},
|
||||||
|
p: "FAIL",
|
||||||
|
};
|
||||||
|
Object.setPrototypeOf(o, { p: "PASS" });
|
||||||
|
o.f().then(console.log);
|
||||||
|
}
|
||||||
|
expect_exact: 'var o={async f(){return super.p},p:"FAIL"};Object.setPrototypeOf(o,{p:"PASS"});o.f().then(console.log);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
object_super_generator: {
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
*f() {
|
||||||
|
yield super.p;
|
||||||
|
},
|
||||||
|
p: "FAIL",
|
||||||
|
};
|
||||||
|
Object.setPrototypeOf(o, { p: "PASS" });
|
||||||
|
console.log(o.f().next().value);
|
||||||
|
}
|
||||||
|
expect_exact: 'var o={*f(){yield super.p},p:"FAIL"};Object.setPrototypeOf(o,{p:"PASS"});console.log(o.f().next().value);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
object_super_async_generator: {
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
async *f() {
|
||||||
|
return super.p;
|
||||||
|
},
|
||||||
|
p: "FAIL",
|
||||||
|
};
|
||||||
|
Object.setPrototypeOf(o, { p: "PASS" });
|
||||||
|
o.f().next().then(function(v) {
|
||||||
|
console.log(v.value, v.done);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect_exact: 'var o={async*f(){return super.p},p:"FAIL"};Object.setPrototypeOf(o,{p:"PASS"});o.f().next().then(function(v){console.log(v.value,v.done)});'
|
||||||
|
expect_stdout: "PASS true"
|
||||||
|
node_version: ">=10"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4269_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
objects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log({
|
||||||
|
get 0() {
|
||||||
|
return "FAIL";
|
||||||
|
},
|
||||||
|
[0]: "PASS",
|
||||||
|
}[0]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log({
|
||||||
|
get 0() {
|
||||||
|
return "FAIL";
|
||||||
|
},
|
||||||
|
[0]: "PASS",
|
||||||
|
}[0]);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4269_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
objects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log({
|
||||||
|
get [0]() {
|
||||||
|
return "FAIL";
|
||||||
|
},
|
||||||
|
0: "PASS",
|
||||||
|
}[0]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log({
|
||||||
|
get [0]() {
|
||||||
|
return "FAIL";
|
||||||
|
},
|
||||||
|
0: "PASS",
|
||||||
|
}[0]);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4269_3: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
objects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log({
|
||||||
|
["foo"]: "bar",
|
||||||
|
get 42() {
|
||||||
|
return "FAIL";
|
||||||
|
},
|
||||||
|
42: "PASS",
|
||||||
|
}[42]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log({
|
||||||
|
foo: "bar",
|
||||||
|
get [42]() {
|
||||||
|
return "FAIL";
|
||||||
|
},
|
||||||
|
42: "PASS",
|
||||||
|
}[42]);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4269_4: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
objects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log({
|
||||||
|
get 42() {
|
||||||
|
return "FAIL";
|
||||||
|
},
|
||||||
|
["foo"]: "bar",
|
||||||
|
42: "PASS",
|
||||||
|
}[42]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log({
|
||||||
|
get 42() {
|
||||||
|
return "FAIL";
|
||||||
|
},
|
||||||
|
foo: "bar",
|
||||||
|
[42]: "PASS",
|
||||||
|
}[42]);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4269_5: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
objects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log({
|
||||||
|
get 42() {
|
||||||
|
return "FAIL";
|
||||||
|
},
|
||||||
|
[console]: "bar",
|
||||||
|
42: "PASS",
|
||||||
|
}[42]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log({
|
||||||
|
get 42() {
|
||||||
|
return "FAIL";
|
||||||
|
},
|
||||||
|
[console]: "bar",
|
||||||
|
42: "PASS",
|
||||||
|
}[42]);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4380: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
objects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log({
|
||||||
|
get 0() {
|
||||||
|
return "FAIL 1";
|
||||||
|
},
|
||||||
|
0: "FAIL 2",
|
||||||
|
[0]: "PASS",
|
||||||
|
}[0]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log({
|
||||||
|
get 0() {
|
||||||
|
return "FAIL 1";
|
||||||
|
},
|
||||||
|
[0]: ("FAIL 2", "PASS"),
|
||||||
|
}[0]);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4415: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
objects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log({
|
||||||
|
["00"]: "FAIL",
|
||||||
|
}[0] || "PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log({
|
||||||
|
"00": "FAIL",
|
||||||
|
}[0] || "PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
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"
|
||||||
|
}
|
||||||
|
|||||||
649
test/compress/optional-chains.js
Normal file
649
test/compress/optional-chains.js
Normal file
@@ -0,0 +1,649 @@
|
|||||||
|
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"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5856: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try {
|
||||||
|
var a;
|
||||||
|
a?.p;
|
||||||
|
a.q;
|
||||||
|
console.log("FAIL");
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
try {
|
||||||
|
var a;
|
||||||
|
a?.p;
|
||||||
|
a.q;
|
||||||
|
console.log("FAIL");
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
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";
|
||||||
@@ -133,6 +133,7 @@ evaluate_string_length: {
|
|||||||
mangle_properties_1: {
|
mangle_properties_1: {
|
||||||
mangle = {
|
mangle = {
|
||||||
properties: {
|
properties: {
|
||||||
|
domprops: true,
|
||||||
keep_quoted: false,
|
keep_quoted: false,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@@ -147,17 +148,18 @@ mangle_properties_1: {
|
|||||||
a["a"] = "bar";
|
a["a"] = "bar";
|
||||||
a.b = "red";
|
a.b = "red";
|
||||||
x = {o: 10};
|
x = {o: 10};
|
||||||
a.r(x.o, a.a);
|
a.run(x.o, a.a);
|
||||||
a['r']({b: "blue", a: "baz"});
|
a['run']({b: "blue", a: "baz"});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mangle_properties_2: {
|
mangle_properties_2: {
|
||||||
mangle = {
|
mangle = {
|
||||||
properties: {
|
properties: {
|
||||||
|
domprops: true,
|
||||||
reserved: [
|
reserved: [
|
||||||
"value",
|
"value",
|
||||||
]
|
],
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -199,6 +201,24 @@ mangle_properties_2: {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mangle_properties_3: {
|
||||||
|
mangle = {
|
||||||
|
properties: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log({
|
||||||
|
[(console, "foo")]: "PASS",
|
||||||
|
}.foo);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log({
|
||||||
|
[(console, "o")]: "PASS",
|
||||||
|
}.o);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
mangle_unquoted_properties: {
|
mangle_unquoted_properties: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
@@ -206,6 +226,8 @@ mangle_unquoted_properties: {
|
|||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
properties: {
|
properties: {
|
||||||
|
builtins: true,
|
||||||
|
domprops: true,
|
||||||
keep_quoted: true,
|
keep_quoted: true,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@@ -305,7 +327,9 @@ mangle_debug_suffix_keep_quoted: {
|
|||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
properties: {
|
properties: {
|
||||||
|
builtins: true,
|
||||||
debug: "XYZ",
|
debug: "XYZ",
|
||||||
|
domprops: true,
|
||||||
keep_quoted: true,
|
keep_quoted: true,
|
||||||
reserved: [],
|
reserved: [],
|
||||||
},
|
},
|
||||||
@@ -351,6 +375,68 @@ mangle_debug_suffix_keep_quoted: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
keep_substituted_property: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
properties: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
properties: {
|
||||||
|
keep_quoted: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = { p: [] };
|
||||||
|
function f(b) {
|
||||||
|
return o[b];
|
||||||
|
}
|
||||||
|
function g() {
|
||||||
|
var a = "p";
|
||||||
|
return o[a] === f(a);
|
||||||
|
}
|
||||||
|
console.log(g() ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = { p: [] };
|
||||||
|
function f(n) {
|
||||||
|
return o[n];
|
||||||
|
}
|
||||||
|
function g() {
|
||||||
|
var n = "p";
|
||||||
|
return o.p === f(n);
|
||||||
|
}
|
||||||
|
console.log(g() ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
keep_substituted_property_quotes: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
properties: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
keep_quoted_props: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(o) {
|
||||||
|
var a = "p";
|
||||||
|
return o[a];
|
||||||
|
}
|
||||||
|
console.log(f({ p: "PASS" }));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(o) {
|
||||||
|
var a = "p";
|
||||||
|
return o["p"];
|
||||||
|
}
|
||||||
|
console.log(f({ p: "PASS" }));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
first_256_chars_as_properties: {
|
first_256_chars_as_properties: {
|
||||||
beautify = {
|
beautify = {
|
||||||
ascii_only: true,
|
ascii_only: true,
|
||||||
@@ -897,12 +983,15 @@ issue_2256: {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
({ "keep": 1 });
|
({ "keep": 42 });
|
||||||
g.keep = g.change;
|
global.keep = global.change = "PASS";
|
||||||
|
console.log(keep);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
g.keep = g.g;
|
global.keep = global.l = "PASS";
|
||||||
|
console.log(keep);
|
||||||
}
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
lhs_prop_1: {
|
lhs_prop_1: {
|
||||||
@@ -1378,3 +1467,363 @@ issue_3389: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
object_super: {
|
||||||
|
options = {
|
||||||
|
properties: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
({
|
||||||
|
f(a) {
|
||||||
|
return a ? console.log("PASS") : super.log("PASS");
|
||||||
|
},
|
||||||
|
}).f(console);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
({
|
||||||
|
f(a) {
|
||||||
|
return a ? console.log("PASS") : super.log("PASS");
|
||||||
|
},
|
||||||
|
}).f(console);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4831_1: {
|
||||||
|
options = {
|
||||||
|
properties: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log({
|
||||||
|
f() {
|
||||||
|
return arguments;
|
||||||
|
},
|
||||||
|
}.f("PASS")[0]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log([
|
||||||
|
function() {
|
||||||
|
return arguments;
|
||||||
|
},
|
||||||
|
][0]("PASS")[0]);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4831_2: {
|
||||||
|
options = {
|
||||||
|
properties: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var f = {
|
||||||
|
f() {
|
||||||
|
return arguments;
|
||||||
|
},
|
||||||
|
}.f;
|
||||||
|
console.log(f("PASS")[0]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var f = {
|
||||||
|
f() {
|
||||||
|
return arguments;
|
||||||
|
},
|
||||||
|
}.f;
|
||||||
|
console.log(f("PASS")[0]);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
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"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5682_in_1: {
|
||||||
|
mangle = {
|
||||||
|
properties: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
return "foo" in a;
|
||||||
|
}
|
||||||
|
var o = {};
|
||||||
|
var p = "foo";
|
||||||
|
o[p] = 42;
|
||||||
|
console.log(f(o) ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(o) {
|
||||||
|
return "foo" in o;
|
||||||
|
}
|
||||||
|
var o = {};
|
||||||
|
var p = "foo";
|
||||||
|
o[p] = 42;
|
||||||
|
console.log(f(o) ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5682_in_2: {
|
||||||
|
mangle = {
|
||||||
|
properties: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
return "foo" in a;
|
||||||
|
}
|
||||||
|
var o = { foo: 42 };
|
||||||
|
console.log(f(o) ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(o) {
|
||||||
|
return "o" in o;
|
||||||
|
}
|
||||||
|
var o = { o: 42 };
|
||||||
|
console.log(f(o) ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5682_dot_1: {
|
||||||
|
mangle = {
|
||||||
|
properties: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
return a.foo;
|
||||||
|
}
|
||||||
|
var o = {};
|
||||||
|
var p = "foo";
|
||||||
|
o[p] = "PASS";
|
||||||
|
console.log(f(o));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(o) {
|
||||||
|
return o.foo;
|
||||||
|
}
|
||||||
|
var o = {};
|
||||||
|
var p = "foo";
|
||||||
|
o[p] = "PASS";
|
||||||
|
console.log(f(o));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5682_dot_2: {
|
||||||
|
mangle = {
|
||||||
|
properties: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
return a.foo;
|
||||||
|
}
|
||||||
|
var o = { foo: "PASS" };
|
||||||
|
console.log(f(o));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(o) {
|
||||||
|
return o.o;
|
||||||
|
}
|
||||||
|
var o = { o: "PASS" };
|
||||||
|
console.log(f(o));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5682_dot_2_computed: {
|
||||||
|
mangle = {
|
||||||
|
properties: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
return a.foo;
|
||||||
|
}
|
||||||
|
var o = { ["foo"]: "PASS" };
|
||||||
|
console.log(f(o));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(o) {
|
||||||
|
return o.o;
|
||||||
|
}
|
||||||
|
var o = { ["o"]: "PASS" };
|
||||||
|
console.log(f(o));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5682_sub_1: {
|
||||||
|
mangle = {
|
||||||
|
properties: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
return a["foo"];
|
||||||
|
}
|
||||||
|
var o = {};
|
||||||
|
var p = "foo";
|
||||||
|
o[p] = "PASS";
|
||||||
|
console.log(f(o));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(o) {
|
||||||
|
return o["foo"];
|
||||||
|
}
|
||||||
|
var o = {};
|
||||||
|
var p = "foo";
|
||||||
|
o[p] = "PASS";
|
||||||
|
console.log(f(o));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5682_sub_2: {
|
||||||
|
mangle = {
|
||||||
|
properties: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
return a["foo"];
|
||||||
|
}
|
||||||
|
var o = { foo: "PASS" };
|
||||||
|
console.log(f(o));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(o) {
|
||||||
|
return o["o"];
|
||||||
|
}
|
||||||
|
var o = { o: "PASS" };
|
||||||
|
console.log(f(o));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|||||||
@@ -133,7 +133,7 @@ conditional: {
|
|||||||
relational: {
|
relational: {
|
||||||
options = {
|
options = {
|
||||||
pure_funcs: [ "foo" ],
|
pure_funcs: [ "foo" ],
|
||||||
side_effects :true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
foo() in new foo();
|
foo() in new foo();
|
||||||
@@ -147,7 +147,7 @@ relational: {
|
|||||||
"bar" >= "bar";
|
"bar" >= "bar";
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
bar();
|
[] instanceof bar();
|
||||||
bar();
|
bar();
|
||||||
bar(), bar();
|
bar(), bar();
|
||||||
bar();
|
bar();
|
||||||
@@ -158,7 +158,7 @@ relational: {
|
|||||||
arithmetic: {
|
arithmetic: {
|
||||||
options = {
|
options = {
|
||||||
pure_funcs: [ "foo" ],
|
pure_funcs: [ "foo" ],
|
||||||
side_effects :true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
foo() + foo();
|
foo() + foo();
|
||||||
@@ -183,7 +183,7 @@ arithmetic: {
|
|||||||
boolean_and: {
|
boolean_and: {
|
||||||
options = {
|
options = {
|
||||||
pure_funcs: [ "foo" ],
|
pure_funcs: [ "foo" ],
|
||||||
side_effects :true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
foo() && foo();
|
foo() && foo();
|
||||||
@@ -208,7 +208,7 @@ boolean_and: {
|
|||||||
boolean_or: {
|
boolean_or: {
|
||||||
options = {
|
options = {
|
||||||
pure_funcs: [ "foo" ],
|
pure_funcs: [ "foo" ],
|
||||||
side_effects :true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
foo() || foo();
|
foo() || foo();
|
||||||
@@ -233,7 +233,7 @@ boolean_or: {
|
|||||||
assign: {
|
assign: {
|
||||||
options = {
|
options = {
|
||||||
pure_funcs: [ "foo" ],
|
pure_funcs: [ "foo" ],
|
||||||
side_effects :true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var a;
|
var a;
|
||||||
@@ -256,7 +256,7 @@ assign: {
|
|||||||
unary: {
|
unary: {
|
||||||
options = {
|
options = {
|
||||||
pure_funcs: [ "foo" ],
|
pure_funcs: [ "foo" ],
|
||||||
side_effects :true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
typeof foo();
|
typeof foo();
|
||||||
@@ -294,248 +294,6 @@ unary: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_2629_1: {
|
|
||||||
options = {
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
comments: "all",
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
/*@__PURE__*/ a();
|
|
||||||
/*@__PURE__*/ (b());
|
|
||||||
(/*@__PURE__*/ c)();
|
|
||||||
(/*@__PURE__*/ d());
|
|
||||||
}
|
|
||||||
expect_exact: [
|
|
||||||
"/* */c();",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2629_2: {
|
|
||||||
options = {
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
comments: "all",
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
/*@__PURE__*/ a(1)(2)(3);
|
|
||||||
/*@__PURE__*/ (b(1))(2)(3);
|
|
||||||
/*@__PURE__*/ (c(1)(2))(3);
|
|
||||||
/*@__PURE__*/ (d(1)(2)(3));
|
|
||||||
(/*@__PURE__*/ e)(1)(2)(3);
|
|
||||||
(/*@__PURE__*/ f(1))(2)(3);
|
|
||||||
(/*@__PURE__*/ g(1)(2))(3);
|
|
||||||
(/*@__PURE__*/ h(1)(2)(3));
|
|
||||||
}
|
|
||||||
expect_exact: [
|
|
||||||
"/* */e(1)(2)(3);",
|
|
||||||
"/* */f(1)(2)(3);",
|
|
||||||
"/* */g(1)(2)(3);",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2629_3: {
|
|
||||||
options = {
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
comments: "all",
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
/*@__PURE__*/ a.x(1).y(2).z(3);
|
|
||||||
/*@__PURE__*/ (b.x)(1).y(2).z(3);
|
|
||||||
/*@__PURE__*/ (c.x(1)).y(2).z(3);
|
|
||||||
/*@__PURE__*/ (d.x(1).y)(2).z(3);
|
|
||||||
/*@__PURE__*/ (e.x(1).y(2)).z(3);
|
|
||||||
/*@__PURE__*/ (f.x(1).y(2).z)(3);
|
|
||||||
/*@__PURE__*/ (g.x(1).y(2).z(3));
|
|
||||||
(/*@__PURE__*/ h).x(1).y(2).z(3);
|
|
||||||
(/*@__PURE__*/ i.x)(1).y(2).z(3);
|
|
||||||
(/*@__PURE__*/ j.x(1)).y(2).z(3);
|
|
||||||
(/*@__PURE__*/ k.x(1).y)(2).z(3);
|
|
||||||
(/*@__PURE__*/ l.x(1).y(2)).z(3);
|
|
||||||
(/*@__PURE__*/ m.x(1).y(2).z)(3);
|
|
||||||
(/*@__PURE__*/ n.x(1).y(2).z(3));
|
|
||||||
}
|
|
||||||
expect_exact: [
|
|
||||||
"/* */h.x(1).y(2).z(3);",
|
|
||||||
"/* */i.x(1).y(2).z(3);",
|
|
||||||
"/* */j.x(1).y(2).z(3);",
|
|
||||||
"/* */k.x(1).y(2).z(3);",
|
|
||||||
"/* */l.x(1).y(2).z(3);",
|
|
||||||
"/* */m.x(1).y(2).z(3);",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2629_4: {
|
|
||||||
options = {
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(/*@__PURE__*/ x(), y());
|
|
||||||
(w(), /*@__PURE__*/ x(), y());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
y();
|
|
||||||
w(), y();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2629_5: {
|
|
||||||
options = {
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
[ /*@__PURE__*/ x() ];
|
|
||||||
[ /*@__PURE__*/ x(), y() ];
|
|
||||||
[ w(), /*@__PURE__*/ x(), y() ];
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
y();
|
|
||||||
w(), y();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2638: {
|
|
||||||
options = {
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
comments: "all",
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
/*@__PURE__*/(g() || h())(x(), y());
|
|
||||||
(/*@__PURE__*/ (a() || b()))(c(), d());
|
|
||||||
}
|
|
||||||
expect_exact: [
|
|
||||||
"/* */x(),y();",
|
|
||||||
"/* */(a()||b())(c(),d());",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2705_1: {
|
|
||||||
options = {
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
comments: "all",
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
/*@__PURE__*/ new a();
|
|
||||||
/*@__PURE__*/ (new b());
|
|
||||||
new (/*@__PURE__*/ c)();
|
|
||||||
(/*@__PURE__*/ new d());
|
|
||||||
}
|
|
||||||
expect_exact: [
|
|
||||||
"new/* */c;",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2705_2: {
|
|
||||||
options = {
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
comments: "all",
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
/*@__PURE__*/ new a(1)(2)(3);
|
|
||||||
/*@__PURE__*/ new (b(1))(2)(3);
|
|
||||||
/*@__PURE__*/ new (c(1)(2))(3);
|
|
||||||
/*@__PURE__*/ new (d(1)(2)(3));
|
|
||||||
new (/*@__PURE__*/ e)(1)(2)(3);
|
|
||||||
(/*@__PURE__*/ new f(1))(2)(3);
|
|
||||||
(/*@__PURE__*/ new g(1)(2))(3);
|
|
||||||
(/*@__PURE__*/ new h(1)(2)(3));
|
|
||||||
}
|
|
||||||
expect_exact: [
|
|
||||||
"new/* */e(1)(2)(3);",
|
|
||||||
"/* */new f(1)(2)(3);",
|
|
||||||
"/* */new g(1)(2)(3);",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2705_3: {
|
|
||||||
options = {
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
comments: "all",
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
/*@__PURE__*/ new a.x(1).y(2).z(3);
|
|
||||||
/*@__PURE__*/ new (b.x)(1).y(2).z(3);
|
|
||||||
/*@__PURE__*/ new (c.x(1)).y(2).z(3);
|
|
||||||
/*@__PURE__*/ new (d.x(1).y)(2).z(3);
|
|
||||||
/*@__PURE__*/ new (e.x(1).y(2)).z(3);
|
|
||||||
/*@__PURE__*/ new (f.x(1).y(2).z)(3);
|
|
||||||
/*@__PURE__*/ new (g.x(1).y(2).z(3));
|
|
||||||
new (/*@__PURE__*/ h).x(1).y(2).z(3);
|
|
||||||
/* */ new (/*@__PURE__*/ i.x)(1).y(2).z(3);
|
|
||||||
(/*@__PURE__*/ new j.x(1)).y(2).z(3);
|
|
||||||
(/*@__PURE__*/ new k.x(1).y)(2).z(3);
|
|
||||||
(/*@__PURE__*/ new l.x(1).y(2)).z(3);
|
|
||||||
(/*@__PURE__*/ new m.x(1).y(2).z)(3);
|
|
||||||
(/*@__PURE__*/ new n.x(1).y(2).z(3));
|
|
||||||
}
|
|
||||||
expect_exact: [
|
|
||||||
"new/* */h.x(1).y(2).z(3);",
|
|
||||||
"/* */new/* */i.x(1).y(2).z(3);",
|
|
||||||
"/* */new j.x(1).y(2).z(3);",
|
|
||||||
"/* */new k.x(1).y(2).z(3);",
|
|
||||||
"/* */new l.x(1).y(2).z(3);",
|
|
||||||
"/* */new m.x(1).y(2).z(3);",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2705_4: {
|
|
||||||
options = {
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
(/*@__PURE__*/ new x(), y());
|
|
||||||
(w(), /*@__PURE__*/ new x(), y());
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
y();
|
|
||||||
w(), y();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2705_5: {
|
|
||||||
options = {
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
[ /*@__PURE__*/ new x() ];
|
|
||||||
[ /*@__PURE__*/ new x(), y() ];
|
|
||||||
[ w(), /*@__PURE__*/ new x(), y() ];
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
y();
|
|
||||||
w(), y();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_2705_6: {
|
|
||||||
options = {
|
|
||||||
side_effects: true,
|
|
||||||
}
|
|
||||||
beautify = {
|
|
||||||
comments: "all",
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
/*@__PURE__*/new (g() || h())(x(), y());
|
|
||||||
/* */ new (/*@__PURE__*/ (a() || b()))(c(), d());
|
|
||||||
}
|
|
||||||
expect_exact: [
|
|
||||||
"/* */x(),y();",
|
|
||||||
"/* */new(/* */a()||b())(c(),d());",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_3065_1: {
|
issue_3065_1: {
|
||||||
options = {
|
options = {
|
||||||
inline: true,
|
inline: true,
|
||||||
@@ -680,130 +438,3 @@ issue_3325_2: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_3858: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
inline: true,
|
|
||||||
keep_fargs: "strict",
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var f = function(a) {
|
|
||||||
return /*@__PURE__*/ function(b) {
|
|
||||||
console.log(b);
|
|
||||||
}(a);
|
|
||||||
};
|
|
||||||
f("PASS");
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var f = function(a) {
|
|
||||||
return function() {
|
|
||||||
console.log(a);
|
|
||||||
}();
|
|
||||||
};
|
|
||||||
f("PASS");
|
|
||||||
}
|
|
||||||
expect_stdout: "PASS"
|
|
||||||
}
|
|
||||||
|
|
||||||
inline_pure_call_1: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
inline: true,
|
|
||||||
keep_fargs: "strict",
|
|
||||||
reduce_vars: true,
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var f = function(a) {
|
|
||||||
return /*@__PURE__*/ function(b) {
|
|
||||||
console.log(b);
|
|
||||||
}(a);
|
|
||||||
};
|
|
||||||
f("PASS");
|
|
||||||
}
|
|
||||||
expect: {}
|
|
||||||
}
|
|
||||||
|
|
||||||
inline_pure_call_2: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
inline: true,
|
|
||||||
keep_fargs: "strict",
|
|
||||||
reduce_vars: true,
|
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var f = function(a) {
|
|
||||||
return /*@__PURE__*/ function(b) {
|
|
||||||
console.log(b);
|
|
||||||
}(a);
|
|
||||||
};
|
|
||||||
var a = f("PASS");
|
|
||||||
}
|
|
||||||
expect: {}
|
|
||||||
}
|
|
||||||
|
|
||||||
inline_pure_call_3: {
|
|
||||||
options = {
|
|
||||||
collapse_vars: true,
|
|
||||||
evaluate: true,
|
|
||||||
inline: true,
|
|
||||||
keep_fargs: "strict",
|
|
||||||
passes: 2,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var f = function(a) {
|
|
||||||
return /*@__PURE__*/ function(b) {
|
|
||||||
console.log(b);
|
|
||||||
}(a);
|
|
||||||
};
|
|
||||||
var a = f("PASS");
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = function() {
|
|
||||||
console.log("PASS");
|
|
||||||
}();
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"PASS",
|
|
||||||
"undefined",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
inline_pure_call_4: {
|
|
||||||
options = {
|
|
||||||
evaluate: true,
|
|
||||||
reduce_vars: true,
|
|
||||||
toplevel: true,
|
|
||||||
unused: true,
|
|
||||||
}
|
|
||||||
input: {
|
|
||||||
var a = /*@__PURE__*/ function() {
|
|
||||||
return console.log("PASS"), 42;
|
|
||||||
}();
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var a = function() {
|
|
||||||
return console.log("PASS"), 42;
|
|
||||||
}();
|
|
||||||
console.log(a);
|
|
||||||
}
|
|
||||||
expect_stdout: [
|
|
||||||
"PASS",
|
|
||||||
"42",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -248,6 +248,35 @@ issue_2110_2: {
|
|||||||
expect_stdout: "function"
|
expect_stdout: "function"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_2110_3: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function g() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
console.log(typeof function() {
|
||||||
|
function f() {}
|
||||||
|
f.g = g;
|
||||||
|
return f.g();
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function g() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
console.log(typeof function() {
|
||||||
|
function f() {}
|
||||||
|
f.g = g;
|
||||||
|
return f.g();
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "function"
|
||||||
|
}
|
||||||
|
|
||||||
set_immutable_1: {
|
set_immutable_1: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
@@ -848,11 +877,10 @@ collapse_vars_1_true: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function f(a, b) {
|
function f(a, b) {
|
||||||
for (;;) {
|
for (;;)
|
||||||
if (a.g() || b.p) break;
|
if (a.g() || b.p) break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
collapse_vars_1_false: {
|
collapse_vars_1_false: {
|
||||||
@@ -980,6 +1008,7 @@ collapse_vars_2_strict: {
|
|||||||
collapse_rhs_true: {
|
collapse_rhs_true: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
pure_getters: true,
|
pure_getters: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -1016,6 +1045,7 @@ collapse_rhs_true: {
|
|||||||
collapse_rhs_false: {
|
collapse_rhs_false: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
pure_getters: false,
|
pure_getters: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -1052,6 +1082,7 @@ collapse_rhs_false: {
|
|||||||
collapse_rhs_strict: {
|
collapse_rhs_strict: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
pure_getters: "strict",
|
pure_getters: "strict",
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -1088,6 +1119,7 @@ collapse_rhs_strict: {
|
|||||||
collapse_rhs_setter: {
|
collapse_rhs_setter: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
pure_getters: "strict",
|
pure_getters: "strict",
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -1188,13 +1220,112 @@ drop_arguments: {
|
|||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lvalues_def: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
pure_getters: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 0, b = 1;
|
||||||
|
var a = b++, b = +function() {}();
|
||||||
|
a && a[a++];
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 0, b = 1;
|
||||||
|
a = b++, b = +void 0;
|
||||||
|
a && a++;
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
side_effects_assign: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
pure_getters: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = typeof void (a && a.in == 1, 0);
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "undefined";
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2062: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
collapse_vars: true,
|
||||||
|
conditionals: true,
|
||||||
|
pure_getters: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
if ([ a || a++ + a--, a++ + a--, a && a.var ]);
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 1;
|
||||||
|
a || (a++, a--), a++, a--;
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "1"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2878: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
pure_getters: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var c = 0;
|
||||||
|
(function(a, b) {
|
||||||
|
function f2() {
|
||||||
|
if (a) c++;
|
||||||
|
}
|
||||||
|
b = f2();
|
||||||
|
a = 1;
|
||||||
|
b && b.b;
|
||||||
|
f2();
|
||||||
|
})();
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var c = 0;
|
||||||
|
(function(a, b) {
|
||||||
|
function f2() {
|
||||||
|
if (a) c++;
|
||||||
|
}
|
||||||
|
b = f2(),
|
||||||
|
a = 1,
|
||||||
|
f2();
|
||||||
|
})(),
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect_stdout: "1"
|
||||||
|
}
|
||||||
|
|
||||||
issue_3427: {
|
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,
|
||||||
@@ -1209,3 +1340,378 @@ issue_3427: {
|
|||||||
expect: {}
|
expect: {}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_3490_1: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
inline: true,
|
||||||
|
pure_getters: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var b = 42, c = "FAIL";
|
||||||
|
if ({
|
||||||
|
3: function() {
|
||||||
|
var a;
|
||||||
|
return (a && a.p) < this;
|
||||||
|
}(),
|
||||||
|
}) c = "PASS";
|
||||||
|
if (b) while ("" == typeof d);
|
||||||
|
console.log(c, b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var b = 42, c = "FAIL";
|
||||||
|
var a;
|
||||||
|
if (c = "PASS", b) while ("" == typeof d);
|
||||||
|
console.log(c, b);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS 42"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4135: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
merge_vars: true,
|
||||||
|
pure_getters: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 0, b = 0;
|
||||||
|
--b;
|
||||||
|
a++;
|
||||||
|
if (!a)
|
||||||
|
var c = function() {
|
||||||
|
var d = 0;
|
||||||
|
function f() {
|
||||||
|
d && d.p;
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
this;
|
||||||
|
}(a++);
|
||||||
|
console.log(a, b, c);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 0;
|
||||||
|
0;
|
||||||
|
a++;
|
||||||
|
if (!a)
|
||||||
|
var c = void a++;
|
||||||
|
console.log(a, -1, c);
|
||||||
|
}
|
||||||
|
expect_stdout: "1 -1 undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4440: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try {
|
||||||
|
(function() {
|
||||||
|
arguments = null;
|
||||||
|
console.log(arguments.p = "FAIL");
|
||||||
|
})();
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
try {
|
||||||
|
(function() {
|
||||||
|
arguments = null;
|
||||||
|
console.log(arguments.p = "FAIL");
|
||||||
|
})();
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4730_1: {
|
||||||
|
options = {
|
||||||
|
pure_getters: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
console.log("PASS") + (a && a[a.p]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4730_2: {
|
||||||
|
options = {
|
||||||
|
pure_getters: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
!console.log("PASS") || a && a[a.p];
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4751: {
|
||||||
|
options = {
|
||||||
|
pure_getters: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
get p() {
|
||||||
|
console.log("PASS");
|
||||||
|
},
|
||||||
|
};
|
||||||
|
o && o.p;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {
|
||||||
|
get p() {
|
||||||
|
console.log("PASS");
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
super_toString: {
|
||||||
|
options = {
|
||||||
|
pure_getters: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log({
|
||||||
|
f() {
|
||||||
|
return super.toString();
|
||||||
|
},
|
||||||
|
}.f());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log({
|
||||||
|
f() {
|
||||||
|
return super.toString();
|
||||||
|
},
|
||||||
|
}.f());
|
||||||
|
}
|
||||||
|
expect_stdout: "[object Object]"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
this_toString: {
|
||||||
|
options = {
|
||||||
|
pure_getters: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log({
|
||||||
|
f() {
|
||||||
|
return this.toString();
|
||||||
|
},
|
||||||
|
}.f());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log({
|
||||||
|
f() {
|
||||||
|
return "" + this;
|
||||||
|
},
|
||||||
|
}.f());
|
||||||
|
}
|
||||||
|
expect_stdout: "[object Object]"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4803: {
|
||||||
|
options = {
|
||||||
|
hoist_vars: true,
|
||||||
|
join_vars: true,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: 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"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5856: {
|
||||||
|
options = {
|
||||||
|
pure_getters: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = [ "FAIL", "PASS" ];
|
||||||
|
(function(b) {
|
||||||
|
var c = b[0];
|
||||||
|
b[0] = b[1];
|
||||||
|
b[1] = c;
|
||||||
|
})(a);
|
||||||
|
console.log(a[0]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = [ "FAIL", "PASS" ];
|
||||||
|
(function(b) {
|
||||||
|
var c = b[0];
|
||||||
|
b[0] = b[1];
|
||||||
|
b[1] = c;
|
||||||
|
})(a);
|
||||||
|
console.log(a[0]);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -50,6 +50,22 @@ regexp_properties: {
|
|||||||
expect_stdout: "abc true false 0 false"
|
expect_stdout: "abc true false 0 false"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
instanceof_1: {
|
||||||
|
input: {
|
||||||
|
console.log(/foo/ instanceof RegExp);
|
||||||
|
}
|
||||||
|
expect_exact: "console.log(/foo/ instanceof RegExp);"
|
||||||
|
expect_stdout: "true"
|
||||||
|
}
|
||||||
|
|
||||||
|
instanceof_2: {
|
||||||
|
input: {
|
||||||
|
console.log(42 + /foo/ instanceof Object);
|
||||||
|
}
|
||||||
|
expect_exact: "console.log(42+/foo/ instanceof Object);"
|
||||||
|
expect_stdout: "false"
|
||||||
|
}
|
||||||
|
|
||||||
issue_3434_1: {
|
issue_3434_1: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
|||||||
@@ -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: {
|
||||||
@@ -739,3 +739,55 @@ issue_3480_ie8_toplevel: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_5787_1: {
|
||||||
|
rename = true
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
const a = 42;
|
||||||
|
switch (a) {
|
||||||
|
case 42:
|
||||||
|
const a = "PASS";
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function() {
|
||||||
|
const a = 42;
|
||||||
|
switch (a) {
|
||||||
|
case 42:
|
||||||
|
const a = "PASS";
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5787_2: {
|
||||||
|
rename = true
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
let a = 42;
|
||||||
|
switch (a) {
|
||||||
|
case 42:
|
||||||
|
// Node.js v4 (vm): SyntaxError: Identifier 'a' has already been declared
|
||||||
|
let a = "PASS";
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function() {
|
||||||
|
let a = 42;
|
||||||
|
switch (a) {
|
||||||
|
case 42:
|
||||||
|
let b = "PASS";
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|||||||
1644
test/compress/rests.js
Normal file
1644
test/compress/rests.js
Normal file
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user