Compare commits
661 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8aa650bcf9 | ||
|
|
d576495e5a | ||
|
|
a06e20304b | ||
|
|
4cccc01f3e | ||
|
|
97bd56b7e8 | ||
|
|
acf951a5bc | ||
|
|
324587f769 | ||
|
|
80efaa2f33 | ||
|
|
a1a212f639 | ||
|
|
a2b1b96752 | ||
|
|
c296a63fb3 | ||
|
|
10dd9d4eaf | ||
|
|
9b8deff64d | ||
|
|
f46209b7e5 | ||
|
|
bddb5a0102 | ||
|
|
3c161a6662 | ||
|
|
c58e174647 | ||
|
|
c53af3dfb1 | ||
|
|
f1f4a4dd82 | ||
|
|
ca49f6f41a | ||
|
|
8a82822654 | ||
|
|
ebe4e1ad28 | ||
|
|
a37ca558dd | ||
|
|
73a564343b | ||
|
|
4870747306 | ||
|
|
b179a2459f | ||
|
|
231c3d7c84 | ||
|
|
aed758ed5c | ||
|
|
0df028187d | ||
|
|
10fbf8e295 | ||
|
|
cf38b52afa | ||
|
|
e755d01a0b | ||
|
|
4084948d3b | ||
|
|
cea1fb5c58 | ||
|
|
1947a21824 | ||
|
|
6335b5fd8a | ||
|
|
daa8319b8a | ||
|
|
d5599604e8 | ||
|
|
072933f1d5 | ||
|
|
39df3a1680 | ||
|
|
03c5ecb2e3 | ||
|
|
40ef074cb3 | ||
|
|
78e3936cd4 | ||
|
|
e7be38b42a | ||
|
|
44394e61c9 | ||
|
|
f9055df44d | ||
|
|
51bdb7281b | ||
|
|
9c01511f84 | ||
|
|
9faee3b66a | ||
|
|
8ea1ced389 | ||
|
|
24619daf68 | ||
|
|
b89cc84c3a | ||
|
|
3016a78d85 | ||
|
|
2508481e33 | ||
|
|
48c46fa9a7 | ||
|
|
7da49b5709 | ||
|
|
d837a46ebd | ||
|
|
d4303b62cc | ||
|
|
7d595e2eac | ||
|
|
9fc0ff5953 | ||
|
|
997d09bb33 | ||
|
|
b244b4ec21 | ||
|
|
b872ffee01 | ||
|
|
9a9543013c | ||
|
|
b98ce6c84f | ||
|
|
7b43b6396f | ||
|
|
67f8fcb103 | ||
|
|
352a944868 | ||
|
|
77c9116c91 | ||
|
|
e821787095 | ||
|
|
aa6e33e208 | ||
|
|
176581d732 | ||
|
|
01aa078e9c | ||
|
|
149d75c092 | ||
|
|
2619bff3cf | ||
|
|
4fb54b066f | ||
|
|
e124ef57e3 | ||
|
|
73e6b2550b | ||
|
|
241113200e | ||
|
|
6f3ab09319 | ||
|
|
3b5d5014e0 | ||
|
|
c36c3cb470 | ||
|
|
24b73a95fa | ||
|
|
862b1b77b5 | ||
|
|
b4944a31a4 | ||
|
|
58362d5ec7 | ||
|
|
01fa430a3e | ||
|
|
f4ee0f651c | ||
|
|
077512d151 | ||
|
|
e4848a7f5a | ||
|
|
f52b0e7c31 | ||
|
|
31e7d25cad | ||
|
|
12babdfe20 | ||
|
|
397e48b97e | ||
|
|
c7520b4b97 | ||
|
|
ad903e9240 | ||
|
|
83c3838b07 | ||
|
|
fa09f87589 | ||
|
|
2db1a141ab | ||
|
|
dd30ed6a9b | ||
|
|
cb50a2d192 | ||
|
|
20be5209c0 | ||
|
|
2a49760032 | ||
|
|
04ed818f0a | ||
|
|
10ca578ee5 | ||
|
|
955411e065 | ||
|
|
adcafce048 | ||
|
|
b1e05fd48a | ||
|
|
23b51287aa | ||
|
|
74dee5c445 | ||
|
|
ee27d87a08 | ||
|
|
62887f2c66 | ||
|
|
68b2dadc58 | ||
|
|
bd73720061 | ||
|
|
ec0440f264 | ||
|
|
81254f67e4 | ||
|
|
c549ee89b9 | ||
|
|
7924a3ae8b | ||
|
|
13ad10a6b5 | ||
|
|
e6ebf827ce | ||
|
|
0a42457df6 | ||
|
|
ba4a771bbc | ||
|
|
ac26993b5a | ||
|
|
ea52339502 | ||
|
|
992952d8f6 | ||
|
|
6d7ab63a66 | ||
|
|
822b1da5d2 | ||
|
|
72805ea73a | ||
|
|
a5e6946f74 | ||
|
|
b8672b55b2 | ||
|
|
a5a958beda | ||
|
|
c885660347 | ||
|
|
d68d155f93 | ||
|
|
e535f19189 | ||
|
|
f9a2a9d78e | ||
|
|
960668ccdb | ||
|
|
55b59407e4 | ||
|
|
b726e364c1 | ||
|
|
bfe3a8b516 | ||
|
|
ae09773ba0 | ||
|
|
8d668c2963 | ||
|
|
5f60c1b830 | ||
|
|
10de27ca3d | ||
|
|
7b4fd858ba | ||
|
|
a7bcd4d613 | ||
|
|
6a2bda52f3 | ||
|
|
fa8aa204a0 | ||
|
|
76b27891c6 | ||
|
|
203ca2586a | ||
|
|
c21f096ab8 | ||
|
|
b7219ac489 | ||
|
|
a6bb66931b | ||
|
|
766742e1d3 | ||
|
|
94e8944f67 | ||
|
|
83197ffdb3 | ||
|
|
952765be66 | ||
|
|
083679bcad | ||
|
|
f5659f292b | ||
|
|
c6e287331d | ||
|
|
a98ec7e4df | ||
|
|
5ec82e5801 | ||
|
|
c76481341c | ||
|
|
5e6307974f | ||
|
|
228cdf8e7e | ||
|
|
14fedbf123 | ||
|
|
fcee32527b | ||
|
|
e13d1e9969 | ||
|
|
aedc1e7fc9 | ||
|
|
353f654038 | ||
|
|
357d861246 | ||
|
|
fd4caf7a9c | ||
|
|
c44b6399c3 | ||
|
|
522cceeccf | ||
|
|
5c84dfa151 | ||
|
|
5359900b78 | ||
|
|
739fa266f8 | ||
|
|
da24dfb59e | ||
|
|
a2f27c7640 | ||
|
|
3c556b8689 | ||
|
|
7110c6923b | ||
|
|
b27b6807cb | ||
|
|
ba6e29d6fd | ||
|
|
d4685640a0 | ||
|
|
ac7b5c07d7 | ||
|
|
0cd4a199b0 | ||
|
|
35435d4bd3 | ||
|
|
d0bb147639 | ||
|
|
4723b4541e | ||
|
|
9d23ba0a22 | ||
|
|
a08d42555a | ||
|
|
fd7ad8e779 | ||
|
|
a36c5472d2 | ||
|
|
8bfd891c09 | ||
|
|
ef9f7ca3e7 | ||
|
|
acc443b2cf | ||
|
|
f87e7be12c | ||
|
|
c0614654d9 | ||
|
|
0358637725 | ||
|
|
63b5b6d2b3 | ||
|
|
e675262d51 | ||
|
|
c1e771a89a | ||
|
|
bc7a88baea | ||
|
|
018e0350f8 | ||
|
|
d37ee4d41c | ||
|
|
7793c6c389 | ||
|
|
90ec468240 | ||
|
|
994293e972 | ||
|
|
b57bae4b9e | ||
|
|
e23a10f7f9 | ||
|
|
884ec4e8a5 | ||
|
|
e616916de5 | ||
|
|
8d21516623 | ||
|
|
74368c3dba | ||
|
|
18dbceb36f | ||
|
|
65d39a3702 | ||
|
|
24917e7084 | ||
|
|
e84957e3da | ||
|
|
c11a748908 | ||
|
|
90017051f2 | ||
|
|
fc816628c1 | ||
|
|
46ad273df4 | ||
|
|
b689028e87 | ||
|
|
1e831df1f6 | ||
|
|
c12486bab4 | ||
|
|
52e94a0723 | ||
|
|
16b97f9558 | ||
|
|
dbfa5d4d14 | ||
|
|
ba54d074d8 | ||
|
|
0818d396c5 | ||
|
|
770f3ba5fe | ||
|
|
553034fe52 | ||
|
|
7fe8c9150a | ||
|
|
6c419bc083 | ||
|
|
25321df959 | ||
|
|
cf1b0165af | ||
|
|
c3d358a5b8 | ||
|
|
68497d0258 | ||
|
|
71c3d04681 | ||
|
|
4c89550c43 | ||
|
|
7ebfb22d16 | ||
|
|
6eceac0966 | ||
|
|
fc5aee662d | ||
|
|
5fbbb43839 | ||
|
|
df2cfcb5fc | ||
|
|
623a0d920f | ||
|
|
e8c04f8cb6 | ||
|
|
110c1ac097 | ||
|
|
15ef272790 | ||
|
|
b3a706114c | ||
|
|
cc2d7acaf0 | ||
|
|
dfb86ccdd1 | ||
|
|
0417a69c3e | ||
|
|
2dbafbb4ee | ||
|
|
311c074622 | ||
|
|
a10c7793bb | ||
|
|
0b7d65d331 | ||
|
|
8b954b022b | ||
|
|
0013cbf91f | ||
|
|
1956edd503 | ||
|
|
560ccc1221 | ||
|
|
10a71c182b | ||
|
|
ddc0ed7072 | ||
|
|
c00efe56f4 | ||
|
|
28bcdbd7df | ||
|
|
6a8aed2049 | ||
|
|
a8785fb694 | ||
|
|
dd6d7b3d88 | ||
|
|
94f3819dc6 | ||
|
|
be1f5199f4 | ||
|
|
95aea0e33c | ||
|
|
a1b2735dd8 | ||
|
|
f345175bc2 | ||
|
|
bb45f48ab7 | ||
|
|
b2f27fd873 | ||
|
|
ced32f9bd8 | ||
|
|
dfc3ec9cef | ||
|
|
1896694532 | ||
|
|
5f269cd573 | ||
|
|
6988cd9558 | ||
|
|
2390fae5c4 | ||
|
|
56fce2131c | ||
|
|
7e575e9d7f | ||
|
|
cb4a02949e | ||
|
|
f85a206b9e | ||
|
|
bba7cd0a70 | ||
|
|
e1b2026929 | ||
|
|
c319030373 | ||
|
|
47b63ed1a0 | ||
|
|
7aefe97083 | ||
|
|
89198e0ad4 | ||
|
|
caea6aac81 | ||
|
|
f5224ca1f5 | ||
|
|
b7c49b72b3 | ||
|
|
8ce3c7d70f | ||
|
|
87cf715213 | ||
|
|
2c9c72e06c | ||
|
|
882968c68c | ||
|
|
acc2d7d845 | ||
|
|
9a5aede941 | ||
|
|
e6dd471f8f | ||
|
|
0f55bd92f1 | ||
|
|
7d9dad0289 | ||
|
|
44e494f16f | ||
|
|
2415a72e75 | ||
|
|
9c0718b162 | ||
|
|
d2c50ace99 | ||
|
|
1b646d3bc4 | ||
|
|
82d2aa4acf | ||
|
|
c1256c399a | ||
|
|
2c637fea8a | ||
|
|
4fa54b075c | ||
|
|
ab82be82b2 | ||
|
|
02fdcfde01 | ||
|
|
a96f087ac3 | ||
|
|
75e9fd8417 | ||
|
|
f68e267830 | ||
|
|
8b10b93ee1 | ||
|
|
549de028b6 | ||
|
|
f579f1aa47 | ||
|
|
fcc40d0502 | ||
|
|
b309527264 | ||
|
|
5d19bb8d5d | ||
|
|
af97629912 | ||
|
|
8c000033d3 | ||
|
|
fd0d28e465 | ||
|
|
2123f38394 | ||
|
|
58dff9ada3 | ||
|
|
4fdec765bc | ||
|
|
1020d37256 | ||
|
|
076739db07 | ||
|
|
515e93d88a | ||
|
|
57105b299e | ||
|
|
77e1bda426 | ||
|
|
a59593cac8 | ||
|
|
046bbde9d4 | ||
|
|
fea9da9866 | ||
|
|
4733159782 | ||
|
|
5fba98608c | ||
|
|
c587d7917d | ||
|
|
336336f53f | ||
|
|
4bde50ce85 | ||
|
|
fbecedf94c | ||
|
|
2f31f95095 | ||
|
|
6b603e1a62 | ||
|
|
499f8d89ff | ||
|
|
9eb65f3af3 | ||
|
|
2cbbf5c375 | ||
|
|
3c384cf9a8 | ||
|
|
37f4f56752 | ||
|
|
1e4985ed9e | ||
|
|
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 | ||
|
|
ffcce28ce1 | ||
|
|
9c0feb69e5 | ||
|
|
bc6e105174 | ||
|
|
b91a2459c0 | ||
|
|
b7a57fc69d | ||
|
|
2dbe40b01b | ||
|
|
813ac3ba96 | ||
|
|
220dc95c0d | ||
|
|
8f0521d51d | ||
|
|
f9946767c9 | ||
|
|
58ac5b9bd5 | ||
|
|
66140b459e | ||
|
|
1786c69070 | ||
|
|
95ef4d5377 | ||
|
|
04017215cc | ||
|
|
142bd1bd1a | ||
|
|
8cb509d50e | ||
|
|
baf4903aa7 | ||
|
|
35465d590e | ||
|
|
ccd91b9952 | ||
|
|
47a5e6e17a | ||
|
|
090ee895e1 | ||
|
|
1cd1a1e5ee | ||
|
|
1d835ac17d | ||
|
|
9e07ac4102 | ||
|
|
92d1391e5e | ||
|
|
b4ff6d0f2d | ||
|
|
9882a9f4af | ||
|
|
40f36b9e01 | ||
|
|
6e105c5ca6 | ||
|
|
af35cd32f2 | ||
|
|
7de8daa4b1 | ||
|
|
305a4bdcee | ||
|
|
3472cf1a90 | ||
|
|
6d4c0fa6fa | ||
|
|
3cca0d6249 | ||
|
|
12ac49b970 | ||
|
|
8c670cae93 | ||
|
|
0e3da27727 | ||
|
|
13cdc167a2 | ||
|
|
51803cdcb2 | ||
|
|
8fa470c17c | ||
|
|
90410f9fc3 | ||
|
|
ef3831437d | ||
|
|
171c544705 | ||
|
|
3c609e2f4a | ||
|
|
f0ae03ed39 | ||
|
|
31c6b45036 | ||
|
|
3ac533e644 | ||
|
|
38a46c86d7 | ||
|
|
0f0759ec15 | ||
|
|
7f501f9fed | ||
|
|
72844eb5a4 | ||
|
|
09d93cc6c8 | ||
|
|
dd1374aa8a | ||
|
|
fdf2e8c5b0 | ||
|
|
a9d934ab4e | ||
|
|
2a053710bd | ||
|
|
219aac6a84 | ||
|
|
2039185051 | ||
|
|
ad27c14202 | ||
|
|
a62b086184 | ||
|
|
335456cf77 | ||
|
|
d64d0b0bec | ||
|
|
3ac575f2e8 | ||
|
|
d33a3a3253 | ||
|
|
d7456a2dc2 | ||
|
|
d97672613d | ||
|
|
30761eede5 | ||
|
|
fb30aeccaf | ||
|
|
226aa1f76b | ||
|
|
6e235602fb | ||
|
|
980fcbb56b | ||
|
|
375ebe316d | ||
|
|
2500930234 | ||
|
|
2f0da2ff05 | ||
|
|
83a3cbf151 | ||
|
|
da8d154571 | ||
|
|
e33c727e8b | ||
|
|
f886b3fb2b | ||
|
|
b1cc15e85b | ||
|
|
3aa765e429 | ||
|
|
93d084a1d1 | ||
|
|
c7a3e09407 | ||
|
|
09525c7530 | ||
|
|
a7e15fe73c | ||
|
|
a31c27c7cf | ||
|
|
1caf7c7bd2 | ||
|
|
0eb0c9b388 | ||
|
|
7dc61cdc89 | ||
|
|
af1b2f30c9 | ||
|
|
37b4fc7e31 | ||
|
|
da85d102e3 | ||
|
|
35fe1092d3 | ||
|
|
f2d486e771 | ||
|
|
fee677786e | ||
|
|
aa83ecdb3b | ||
|
|
a153176469 | ||
|
|
1c6384b6a5 | ||
|
|
e8db526f51 | ||
|
|
fa13ed4391 | ||
|
|
23f0dca992 | ||
|
|
45ab3b51d8 | ||
|
|
49670d216b | ||
|
|
e2237d8cd2 | ||
|
|
91f078fe35 | ||
|
|
a546cb881d | ||
|
|
84d5dffd9f | ||
|
|
a8e286f7e1 | ||
|
|
9b05494ebc | ||
|
|
30ef20a208 | ||
|
|
a4002ef467 | ||
|
|
9d758a216b | ||
|
|
af13f8dd2c | ||
|
|
88423f2574 | ||
|
|
ee632a5519 | ||
|
|
dfe47bcc42 | ||
|
|
6d3dcaa59e | ||
|
|
1bc0df1569 | ||
|
|
a98ba994bd | ||
|
|
cd671221c5 | ||
|
|
bce3919748 | ||
|
|
61b66e83f1 | ||
|
|
a5db8cd14c | ||
|
|
2021c2fa3e | ||
|
|
484d3fd8c7 | ||
|
|
3bf8699f95 | ||
|
|
58c24f8007 | ||
|
|
e61bc34eb1 | ||
|
|
8b2cfd45fa | ||
|
|
ae9f56be10 | ||
|
|
9aed0e3a73 | ||
|
|
88850a6e05 | ||
|
|
9e881407bd | ||
|
|
3188db7b90 | ||
|
|
a82ca62b66 | ||
|
|
e9465717ab | ||
|
|
e89031f1af | ||
|
|
596fad182e | ||
|
|
ed69adedcd | ||
|
|
1dbf7d4a3a | ||
|
|
2a9d0fc6fb | ||
|
|
45db96679e | ||
|
|
1d15f51238 | ||
|
|
ed7c82fa5e | ||
|
|
3b273cecac | ||
|
|
d764b6cc3b | ||
|
|
08c4729eb4 | ||
|
|
5561d3e7f3 | ||
|
|
491d6ce1d5 | ||
|
|
cd55eeb77c | ||
|
|
3230952d57 | ||
|
|
df3bb8028a | ||
|
|
28b7b15da1 | ||
|
|
aa37b19698 | ||
|
|
02e889e449 | ||
|
|
486ce00b8e | ||
|
|
eb481cee8c | ||
|
|
fbc9d8009b | ||
|
|
04fd3d90f8 | ||
|
|
a489f8cb5e | ||
|
|
e2e4b7fb37 | ||
|
|
c97ad98f92 | ||
|
|
b24eb22c6b | ||
|
|
06ba4e2ce8 | ||
|
|
0eb4577a82 | ||
|
|
43498769f0 | ||
|
|
60c0bc1e6b | ||
|
|
6a5c63e1e3 | ||
|
|
d47ea77811 | ||
|
|
7840746bd9 | ||
|
|
49ea629f3f | ||
|
|
13c72a986c | ||
|
|
08af3eae44 | ||
|
|
27bdcbbd83 | ||
|
|
2c4d7d66ef | ||
|
|
d1cc5270a3 | ||
|
|
75c5b6029b | ||
|
|
fa14a9cfcd | ||
|
|
aeb9ea5ac2 | ||
|
|
798841be82 | ||
|
|
cc6eb4b15f | ||
|
|
14eee81dc6 | ||
|
|
55ebb27878 | ||
|
|
87046410ef | ||
|
|
f9b3198714 | ||
|
|
48b62393a4 | ||
|
|
a00f8dade7 | ||
|
|
9daa2fb6f5 | ||
|
|
8d81d264f4 | ||
|
|
5ef7060098 | ||
|
|
938368ba21 | ||
|
|
fe2f1965d6 | ||
|
|
30ed8f5580 | ||
|
|
dc9e7cd1fe | ||
|
|
76f40e2528 | ||
|
|
8024f7f7a8 | ||
|
|
eb7fa25270 | ||
|
|
ee7647dc67 | ||
|
|
bd2f53bc8b | ||
|
|
e8a7956b6f | ||
|
|
2b24dc25fb | ||
|
|
35cc5aa06f | ||
|
|
c1dd49e075 | ||
|
|
c76ee4b868 | ||
|
|
e23bf48052 | ||
|
|
7e0ad232b0 | ||
|
|
63adfb1590 | ||
|
|
f9806b43c3 | ||
|
|
c4c9c6d37d | ||
|
|
33f3b0c1d9 | ||
|
|
abb8ae02a5 | ||
|
|
97728c4f0b | ||
|
|
f74b7f7401 | ||
|
|
b06fd8a933 | ||
|
|
1bb0804d60 | ||
|
|
998245ffd6 | ||
|
|
7a033bb825 | ||
|
|
a441b00951 | ||
|
|
88985a46ed | ||
|
|
34ead0430b | ||
|
|
66ab2df97f | ||
|
|
b656f7c083 | ||
|
|
873db281e8 | ||
|
|
6bf1486935 | ||
|
|
ffa1943177 | ||
|
|
ac429dc8e1 | ||
|
|
3766d5c962 |
25
.github/ISSUE_TEMPLATE.md
vendored
25
.github/ISSUE_TEMPLATE.md
vendored
@@ -1,25 +0,0 @@
|
|||||||
**Bug report or feature request?**
|
|
||||||
|
|
||||||
<!-- Note: sub-optimal but correct code is not a bug -->
|
|
||||||
|
|
||||||
**Uglify version (`uglifyjs -V`)**
|
|
||||||
|
|
||||||
**JavaScript input**
|
|
||||||
|
|
||||||
<!--
|
|
||||||
A complete parsable JS program exhibiting the issue with
|
|
||||||
UglifyJS alone - without third party tools or libraries.
|
|
||||||
Ideally the input should be as small as possible.
|
|
||||||
Post a link to a gist if necessary.
|
|
||||||
|
|
||||||
Issues without a reproducible test case will be closed.
|
|
||||||
-->
|
|
||||||
|
|
||||||
**The `uglifyjs` CLI command executed or `minify()` options used.**
|
|
||||||
|
|
||||||
**JavaScript output or error produced.**
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Note: `uglify-js` only supports JavaScript.
|
|
||||||
Those wishing to minify ES6+ should transpile first.
|
|
||||||
-->
|
|
||||||
51
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
51
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
---
|
||||||
|
name: Bug report
|
||||||
|
about: Create a report to help us improve
|
||||||
|
title: ''
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- Note: sub-optimal but correct code is not a bug -->
|
||||||
|
|
||||||
|
**Uglify version (`uglifyjs -V`)**
|
||||||
|
|
||||||
|
**JavaScript input**
|
||||||
|
|
||||||
|
<!--
|
||||||
|
A complete parsable JS program exhibiting the issue with UglifyJS alone
|
||||||
|
- without third party tools or libraries.
|
||||||
|
|
||||||
|
Ideally the input should be as small as possible, but may be large if isolating
|
||||||
|
the problem proves to be difficult. The most important thing is that the
|
||||||
|
standalone program reliably exhibits the bug when minified. Provide a link to a
|
||||||
|
gist if necessary.
|
||||||
|
|
||||||
|
Solely providing minified output without the original uglify JS input is not
|
||||||
|
useful in determining the cause of the problem. Issues without a reproducible
|
||||||
|
test case will be closed.
|
||||||
|
-->
|
||||||
|
|
||||||
|
**The `uglifyjs` CLI command executed or `minify()` options used.**
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Command-line or API call to UglifyJS without third party tools or libraries.
|
||||||
|
|
||||||
|
For users using bundlers or transpilers, you may be able to gather the required
|
||||||
|
information through setting the `UGLIFY_BUG_REPORT` environment variable:
|
||||||
|
|
||||||
|
export UGLIFY_BUG_REPORT=1 (bash)
|
||||||
|
set UGLIFY_BUG_REPORT=1 (Command Prompt)
|
||||||
|
$Env:UGLIFY_BUG_REPORT=1 (PowerShell)
|
||||||
|
|
||||||
|
before running your usual build process. The resulting "minified" output should
|
||||||
|
contain the necessary details for this report.
|
||||||
|
-->
|
||||||
|
|
||||||
|
**JavaScript output or error produced.**
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Only minified code that produces different output (or error) from the original
|
||||||
|
upon execution would be considered a bug.
|
||||||
|
-->
|
||||||
58
.github/workflows/build.yml
vendored
Normal file
58
.github/workflows/build.yml
vendored
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
name: Build testing
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
push:
|
||||||
|
branches: [ master ]
|
||||||
|
jobs:
|
||||||
|
ufuzz:
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
options:
|
||||||
|
- '-mb braces'
|
||||||
|
- '--ie8 -c'
|
||||||
|
- '-mc'
|
||||||
|
- '-p acorn --toplevel -mco spidermonkey'
|
||||||
|
- '--toplevel -mc passes=3,pure_getters,unsafe'
|
||||||
|
script:
|
||||||
|
- acorn.sh
|
||||||
|
- bootstrap.sh
|
||||||
|
- buble.sh
|
||||||
|
- butternut.sh
|
||||||
|
- mathjs.sh
|
||||||
|
- rollup-es.sh
|
||||||
|
- rollup-ts.sh
|
||||||
|
- sucrase.sh
|
||||||
|
- web-tooling-benchmark.sh
|
||||||
|
include:
|
||||||
|
- node: '14'
|
||||||
|
script: acorn.sh
|
||||||
|
- node: '14'
|
||||||
|
script: bootstrap.sh
|
||||||
|
- node: '14'
|
||||||
|
script: buble.sh
|
||||||
|
- node: '14'
|
||||||
|
script: butternut.sh
|
||||||
|
- node: '14'
|
||||||
|
script: mathjs.sh
|
||||||
|
- node: '8'
|
||||||
|
script: rollup-es.sh
|
||||||
|
- node: '14'
|
||||||
|
script: rollup-ts.sh
|
||||||
|
- node: '14'
|
||||||
|
script: sucrase.sh
|
||||||
|
- node: '14'
|
||||||
|
script: web-tooling-benchmark.sh
|
||||||
|
name: ${{ matrix.script }} ${{ matrix.options }}
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
env:
|
||||||
|
NODE: ${{ matrix.node }}
|
||||||
|
OPTIONS: ${{ matrix.options }}
|
||||||
|
SCRIPT: ${{ matrix.script }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- name: Perform uglify, build & test
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
. ./test/release/install.sh
|
||||||
|
./test/release/$SCRIPT $OPTIONS
|
||||||
30
.github/workflows/ci.yml
vendored
30
.github/workflows/ci.yml
vendored
@@ -1,14 +1,19 @@
|
|||||||
name: CI
|
name: CI
|
||||||
on: [ push, pull_request ]
|
on:
|
||||||
|
pull_request:
|
||||||
|
push:
|
||||||
|
branches: [ master ]
|
||||||
jobs:
|
jobs:
|
||||||
test:
|
test:
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
node: [ "0.8", "0.10", "0.12", "4", "6", "8", "10", "12", latest ]
|
node: [ '0.8', '0.10', '0.12', '4', '6', '8', '10', '12', '14', latest ]
|
||||||
os: [ ubuntu-latest, windows-latest ]
|
os: [ ubuntu-latest, windows-latest ]
|
||||||
script: [ compress, mocha, release/benchmark, release/jetstream ]
|
script: [ compress, mocha, release/benchmark, release/jetstream ]
|
||||||
exclude:
|
exclude:
|
||||||
- node: "0.8"
|
- node: '0.8'
|
||||||
|
script: release/benchmark
|
||||||
|
- node: '0.8'
|
||||||
script: release/jetstream
|
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 }}
|
||||||
@@ -17,27 +22,12 @@ jobs:
|
|||||||
TYPE: ${{ matrix.script }}
|
TYPE: ${{ matrix.script }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- uses: actions/cache@v1
|
- uses: actions/cache@v2
|
||||||
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
|
|
||||||
git clean -xdf
|
|
||||||
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
|
||||||
|
|||||||
47
.github/workflows/ufuzz.yml
vendored
47
.github/workflows/ufuzz.yml
vendored
@@ -1,34 +1,41 @@
|
|||||||
name: Fuzzing
|
name: Fuzzing
|
||||||
on:
|
on:
|
||||||
|
pull_request:
|
||||||
schedule:
|
schedule:
|
||||||
- cron: "*/8 * * * *"
|
- cron: '*/5 * * * *'
|
||||||
|
env:
|
||||||
|
BASE_URL: https://api.github.com/repos/${{ github.repository }}
|
||||||
|
CAUSE: ${{ github.event_name }}
|
||||||
|
RUN_NUM: ${{ github.run_number }}
|
||||||
|
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: latest
|
||||||
|
os: macos-latest
|
||||||
|
- node: '8'
|
||||||
|
os: ubuntu-latest
|
||||||
|
- node: '8'
|
||||||
|
os: ubuntu-latest
|
||||||
|
- node: '8'
|
||||||
|
os: windows-latest
|
||||||
|
- node: '8'
|
||||||
|
os: windows-latest
|
||||||
|
name: ${{ matrix.node }} ${{ matrix.os }}
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
|
env:
|
||||||
|
NODE: ${{ matrix.node }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- 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 10 && nvs use 10'; do
|
if [[ $CAUSE == "schedule" ]]; then
|
||||||
cd ~/.nvs
|
node test/ufuzz/job $BASE_URL $TOKEN $RUN_NUM
|
||||||
git clean -xdf
|
else
|
||||||
cd -
|
node test/ufuzz/job 5000
|
||||||
done
|
fi
|
||||||
. ~/.nvs/nvs.sh --version
|
|
||||||
nvs use 10
|
|
||||||
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/ufuzz/job 3600000
|
|
||||||
|
|||||||
454
README.md
454
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/UglifyJS2/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/UglifyJS2/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
|
||||||
-------
|
-------
|
||||||
@@ -84,13 +85,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
|
||||||
@@ -133,8 +137,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 `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,17 +224,16 @@ 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:
|
||||||
|
|
||||||
- `toplevel` (default `false`) -- mangle names declared in the top level scope.
|
- `eval` (default: `false`) — mangle names visible in scopes where `eval` or
|
||||||
|
`with` are used.
|
||||||
|
|
||||||
- `eval` (default `false`) -- mangle names visible in scopes where `eval` or `with` are used.
|
- `reserved` (default: `[]`) — when mangling is enabled but you want to
|
||||||
|
prevent certain names from being mangled, you can declare those names with
|
||||||
|
`--mangle reserved` — pass a comma-separated list of names. For example:
|
||||||
|
|
||||||
When mangling is enabled but you want to prevent certain names from being
|
uglifyjs ... -m reserved=['$','require','exports']
|
||||||
mangled, you can declare those names with `--mangle reserved` — pass a
|
|
||||||
comma-separated list of names. For example:
|
|
||||||
|
|
||||||
uglifyjs ... -m reserved=['$','require','exports']
|
to prevent the `require`, `exports` and `$` names from being changed.
|
||||||
|
|
||||||
to prevent the `require`, `exports` and `$` names from being changed.
|
|
||||||
|
|
||||||
### CLI mangling property names (`--mangle-props`)
|
### CLI mangling property names (`--mangle-props`)
|
||||||
|
|
||||||
@@ -483,43 +494,53 @@ 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.
|
- `ie8` (default: `false`) — set to `true` to support IE8.
|
||||||
|
|
||||||
- `keep_fnames` (default: `false`) -- pass `true` to prevent discarding or mangling
|
- `keep_fnames` (default: `false`) — pass `true` to prevent discarding or mangling
|
||||||
of function names. Useful for code relying on `Function.prototype.name`.
|
of function names. Useful for code relying on `Function.prototype.name`.
|
||||||
|
|
||||||
- `mangle` (default `true`) — pass `false` to skip mangling names, or pass
|
- `mangle` (default: `true`) — pass `false` to skip mangling names, or pass
|
||||||
an object to specify [mangle options](#mangle-options) (see below).
|
an object to specify [mangle options](#mangle-options) (see below).
|
||||||
|
|
||||||
- `mangle.properties` (default `false`) — a subcategory of the mangle option.
|
- `mangle.properties` (default: `false`) — a subcategory of the mangle option.
|
||||||
Pass an object to specify custom [mangle property options](#mangle-properties-options).
|
Pass an object to specify custom [mangle property options](#mangle-properties-options).
|
||||||
|
|
||||||
- `nameCache` (default `null`) -- pass an empty object `{}` or a previously
|
- `nameCache` (default: `null`) — pass an empty object `{}` or a previously
|
||||||
used `nameCache` object if you wish to cache mangled variable and
|
used `nameCache` object if you wish to cache mangled variable and
|
||||||
property names across multiple invocations of `minify()`. Note: this is
|
property names across multiple invocations of `minify()`. Note: this is
|
||||||
a read/write property. `minify()` will read the name cache state of this
|
a read/write property. `minify()` will read the name cache state of this
|
||||||
object and update it during minification so that it may be
|
object and update it during minification so that it may be
|
||||||
reused or externally persisted by the user.
|
reused or externally persisted by the user.
|
||||||
|
|
||||||
- `output` (default `null`) — pass an object if you wish to specify
|
- `output` (default: `null`) — pass an object if you wish to specify
|
||||||
additional [output options](#output-options). The defaults are optimized
|
additional [output options](#output-options). The defaults are optimized
|
||||||
for best compression.
|
for best compression.
|
||||||
|
|
||||||
- `parse` (default `{}`) — pass an object if you wish to specify some
|
- `parse` (default: `{}`) — pass an object if you wish to specify some
|
||||||
additional [parse options](#parse-options).
|
additional [parse options](#parse-options).
|
||||||
|
|
||||||
- `sourceMap` (default `false`) -- pass an object if you wish to specify
|
- `sourceMap` (default: `false`) — pass an object if you wish to specify
|
||||||
[source map options](#source-map-options).
|
[source map options](#source-map-options).
|
||||||
|
|
||||||
- `toplevel` (default `false`) -- set to `true` if you wish to enable top level
|
- `toplevel` (default: `false`) — set to `true` if you wish to enable top level
|
||||||
variable and function name mangling and to drop unused variables and functions.
|
variable and function name mangling and to drop unused variables and functions.
|
||||||
|
|
||||||
- `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
|
||||||
@@ -602,107 +623,121 @@ to be `false` and all symbol names will be omitted.
|
|||||||
|
|
||||||
## Parse options
|
## Parse options
|
||||||
|
|
||||||
- `bare_returns` (default `false`) -- support top level `return` statements
|
- `bare_returns` (default: `false`) — support top level `return` statements
|
||||||
|
|
||||||
- `html5_comments` (default `true`)
|
- `html5_comments` (default: `true`)
|
||||||
|
|
||||||
- `shebang` (default `true`) -- support `#!command` as the first line
|
- `shebang` (default: `true`) — support `#!command` as the first line
|
||||||
|
|
||||||
## Compress options
|
## Compress options
|
||||||
|
|
||||||
- `arguments` (default: `true`) -- replace `arguments[index]` with function
|
- `annotations` (default: `true`) — Pass `false` to disable potentially dropping
|
||||||
|
functions marked as "pure". A function call is marked as "pure" if a comment
|
||||||
|
annotation `/*@__PURE__*/` or `/*#__PURE__*/` immediately precedes the call. For
|
||||||
|
example: `/*@__PURE__*/foo();`
|
||||||
|
|
||||||
|
- `arguments` (default: `true`) — replace `arguments[index]` with function
|
||||||
parameter name whenever possible.
|
parameter name whenever possible.
|
||||||
|
|
||||||
- `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 `mangle` enabled, the `compress` option `passes` set to `2` or higher,
|
works best with `toplevel` and `mangle` enabled, alongside with `compress` option
|
||||||
and the `compress` option `toplevel` enabled.
|
`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
|
||||||
|
- `true` — same as `3`
|
||||||
|
|
||||||
- `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.
|
||||||
|
|
||||||
- `negate_iife` (default: `true`) -- negate "Immediately-Called Function Expressions"
|
- `merge_vars` (default: `true`) — combine and reuse variables.
|
||||||
|
|
||||||
|
- `negate_iife` (default: `true`) — negate "Immediately-Called Function Expressions"
|
||||||
where the return value is discarded, to avoid the parens that the
|
where the return value is discarded, to avoid the parens that the
|
||||||
code generator would insert.
|
code generator would insert.
|
||||||
|
|
||||||
- `objects` (default: `true`) -- compact duplicate keys in object literals.
|
- `objects` (default: `true`) — compact duplicate keys in object literals.
|
||||||
|
|
||||||
- `passes` (default: `1`) -- The maximum number of times to run compress.
|
- `passes` (default: `1`) — The maximum number of times to run compress.
|
||||||
In some cases more than one pass leads to further compressed code. Keep in
|
In some cases more than one pass leads to further compressed code. Keep in
|
||||||
mind more passes will take more time.
|
mind more passes will take more time.
|
||||||
|
|
||||||
- `properties` (default: `true`) -- rewrite property access using the dot notation, for
|
- `properties` (default: `true`) — rewrite property access using the dot notation, for
|
||||||
example `foo["bar"] → foo.bar`
|
example `foo["bar"] → foo.bar`
|
||||||
|
|
||||||
- `pure_funcs` (default: `null`) -- You can pass an array of names and
|
- `pure_funcs` (default: `null`) — You can pass an array of names and
|
||||||
UglifyJS will assume that those functions do not produce side
|
UglifyJS will assume that those functions do not produce side
|
||||||
effects. DANGER: will not check if the name is redefined in scope.
|
effects. DANGER: will not check if the name is redefined in scope.
|
||||||
An example case here, for instance `var q = Math.floor(a/b)`. If
|
An example case here, for instance `var q = Math.floor(a/b)`. If
|
||||||
@@ -714,22 +749,24 @@ to be `false` and all symbol names will be omitted.
|
|||||||
overhead (compression will be slower). Make sure symbols under `pure_funcs`
|
overhead (compression will be slower). Make sure symbols under `pure_funcs`
|
||||||
are also under `mangle.reserved` to avoid mangling.
|
are also under `mangle.reserved` to avoid mangling.
|
||||||
|
|
||||||
- `pure_getters` (default: `"strict"`) -- If you pass `true` for
|
- `pure_getters` (default: `"strict"`) — If you pass `true` for
|
||||||
this, UglifyJS will assume that object property access
|
this, UglifyJS will assume that object property access
|
||||||
(e.g. `foo.bar` or `foo["bar"]`) doesn't have any side effects.
|
(e.g. `foo.bar` or `foo["bar"]`) doesn't have any side effects.
|
||||||
Specify `"strict"` to treat `foo.bar` as side-effect-free only when
|
Specify `"strict"` to treat `foo.bar` as side-effect-free only when
|
||||||
`foo` is certain to not throw, i.e. not `null` or `undefined`.
|
`foo` is certain to not throw, i.e. not `null` or `undefined`.
|
||||||
|
|
||||||
- `reduce_funcs` (default: `true`) -- Allows single-use functions to be
|
- `reduce_funcs` (default: `true`) — Allows single-use functions to be
|
||||||
inlined as function expressions when permissible allowing further
|
inlined as function expressions when permissible allowing further
|
||||||
optimization. Enabled by default. Option depends on `reduce_vars`
|
optimization. Enabled by default. Option depends on `reduce_vars`
|
||||||
being enabled. Some code runs faster in the Chrome V8 engine if this
|
being enabled. Some code runs faster in the Chrome V8 engine if this
|
||||||
option is disabled. Does not negatively impact other major browsers.
|
option is disabled. Does not negatively impact other major browsers.
|
||||||
|
|
||||||
- `reduce_vars` (default: `true`) -- Improve optimization on variables assigned with and
|
- `reduce_vars` (default: `true`) — Improve optimization on variables assigned with and
|
||||||
used as constant values.
|
used as constant values.
|
||||||
|
|
||||||
- `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`
|
||||||
@@ -738,64 +775,68 @@ to be `false` and all symbol names will be omitted.
|
|||||||
occasions the default sequences limit leads to very slow compress times in which
|
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
|
||||||
|
variables (`"vars"`) in the top level scope (`false` by default, `true` to drop
|
||||||
|
both unreferenced functions and variables)
|
||||||
|
|
||||||
|
- `typeofs` (default: `true`) — Transforms `typeof foo == "undefined"` into
|
||||||
`foo === void 0`. Note: recommend to set this value to `false` for IE10 and
|
`foo === void 0`. Note: recommend to set this value to `false` for IE10 and
|
||||||
earlier versions due to known issues.
|
earlier versions due to known issues.
|
||||||
|
|
||||||
- `unsafe` (default: `false`) -- apply "unsafe" transformations (discussion below)
|
- `unsafe` (default: `false`) — apply "unsafe" transformations (discussion below)
|
||||||
|
|
||||||
- `unsafe_comps` (default: `false`) -- compress expressions like `a <= b` assuming
|
- `unsafe_comps` (default: `false`) — compress expressions like `a <= b` assuming
|
||||||
none of the operands can be (coerced to) `NaN`.
|
none of the operands can be (coerced to) `NaN`.
|
||||||
|
|
||||||
- `unsafe_Function` (default: `false`) -- compress and mangle `Function(args, code)`
|
- `unsafe_Function` (default: `false`) — compress and mangle `Function(args, code)`
|
||||||
when both `args` and `code` are string literals.
|
when both `args` and `code` are string literals.
|
||||||
|
|
||||||
- `unsafe_math` (default: `false`) -- optimize numerical expressions like
|
- `unsafe_math` (default: `false`) — optimize numerical expressions like
|
||||||
`2 * x * 3` into `6 * x`, which may give imprecise floating point results.
|
`2 * x * 3` into `6 * x`, which may give imprecise floating point results.
|
||||||
|
|
||||||
- `unsafe_proto` (default: `false`) -- optimize expressions like
|
- `unsafe_proto` (default: `false`) — optimize expressions like
|
||||||
`Array.prototype.slice.call(a)` into `[].slice.call(a)`
|
`Array.prototype.slice.call(a)` into `[].slice.call(a)`
|
||||||
|
|
||||||
- `unsafe_regexp` (default: `false`) -- enable substitutions of variables with
|
- `unsafe_regexp` (default: `false`) — enable substitutions of variables with
|
||||||
`RegExp` values the same way as if they are constants.
|
`RegExp` values the same way as if they are constants.
|
||||||
|
|
||||||
- `unsafe_undefined` (default: `false`) -- substitute `void 0` if there is a
|
- `unsafe_undefined` (default: `false`) — substitute `void 0` if there is a
|
||||||
variable named `undefined` in scope (variable name will be mangled, typically
|
variable named `undefined` in scope (variable name will be mangled, typically
|
||||||
reduced to a single character)
|
reduced to a single character)
|
||||||
|
|
||||||
- `unused` (default: `true`) -- drop unreferenced functions and variables (simple
|
- `unused` (default: `true`) — drop unreferenced functions and variables (simple
|
||||||
direct variable assignments do not count as references unless set to `"keep_assign"`)
|
direct variable assignments do not count as references unless set to `"keep_assign"`)
|
||||||
|
|
||||||
|
- `varify` (default: `true`) — convert block-scoped declaractions into `var`
|
||||||
|
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:
|
||||||
@@ -822,18 +863,18 @@ UglifyJS.minify(code, { mangle: { toplevel: true } }).code;
|
|||||||
|
|
||||||
### Mangle properties options
|
### Mangle properties options
|
||||||
|
|
||||||
- `builtins` (default: `false`) -- Use `true` to allow the mangling of builtin
|
- `builtins` (default: `false`) — Use `true` to allow the mangling of builtin
|
||||||
DOM properties. Not recommended to override this setting.
|
DOM properties. Not recommended to override this setting.
|
||||||
|
|
||||||
- `debug` (default: `false`) -— Mangle names with the original name still present.
|
- `debug` (default: `false`) — Mangle names with the original name still present.
|
||||||
Pass an empty string `""` to enable, or a non-empty string to set the debug suffix.
|
Pass an empty string `""` to enable, or a non-empty string to set the debug suffix.
|
||||||
|
|
||||||
- `keep_quoted` (default: `false`) -— Only mangle unquoted property names.
|
- `keep_quoted` (default: `false`) — Only mangle unquoted property names.
|
||||||
|
|
||||||
- `regex` (default: `null`) -— Pass a RegExp literal to only mangle property
|
- `regex` (default: `null`) — Pass a RegExp literal to only mangle property
|
||||||
names matching the regular expression.
|
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
|
||||||
@@ -842,78 +883,81 @@ The code generator tries to output shortest code possible by default. In
|
|||||||
case you want beautified output, pass `--beautify` (`-b`). Optionally you
|
case you want beautified output, pass `--beautify` (`-b`). Optionally you
|
||||||
can pass additional arguments that control the code output:
|
can pass additional arguments that control the code output:
|
||||||
|
|
||||||
- `ascii_only` (default `false`) -- escape Unicode characters in strings and
|
- `annotations` (default: `false`) — pass `true` to retain comment annotations
|
||||||
|
`/*@__PURE__*/` or `/*#__PURE__*/`, otherwise they will be discarded even if
|
||||||
|
`comments` is set.
|
||||||
|
|
||||||
|
- `ascii_only` (default: `false`) — escape Unicode characters in strings and
|
||||||
regexps (affects directives with non-ascii characters becoming invalid)
|
regexps (affects directives with non-ascii characters becoming invalid)
|
||||||
|
|
||||||
- `beautify` (default `true`) -- whether to actually beautify the output.
|
- `beautify` (default: `true`) — whether to actually beautify the output.
|
||||||
Passing `-b` will set this to true, but you might need to pass `-b` even
|
Passing `-b` will set this to true, but you might need to pass `-b` even
|
||||||
when you want to generate minified code, in order to specify additional
|
when you want to generate minified code, in order to specify additional
|
||||||
arguments, so you can use `-b beautify=false` to override it.
|
arguments, so you can use `-b beautify=false` to override it.
|
||||||
|
|
||||||
- `braces` (default `false`) -- always insert braces in `if`, `for`,
|
- `braces` (default: `false`) — always insert braces in `if`, `for`,
|
||||||
`do`, `while` or `with` statements, even if their body is a single
|
`do`, `while` or `with` statements, even if their body is a single
|
||||||
statement.
|
statement.
|
||||||
|
|
||||||
- `comments` (default `false`) -- pass `true` or `"all"` to preserve all
|
- `comments` (default: `false`) — pass `true` or `"all"` to preserve all
|
||||||
comments, `"some"` to preserve multi-line comments that contain `@cc_on`,
|
comments, `"some"` to preserve multi-line comments that contain `@cc_on`,
|
||||||
`@license`, or `@preserve` (case-insensitive), a regular expression string
|
`@license`, or `@preserve` (case-insensitive), a regular expression string
|
||||||
(e.g. `/^!/`), or a function which returns `boolean`, e.g.
|
(e.g. `/^!/`), or a function which returns `boolean`, e.g.
|
||||||
```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`)
|
- `galio` (default: `false`) — enable workarounds for ANT Galio bugs
|
||||||
|
|
||||||
- `indent_start` (default `0`) -- prefix all lines by that many spaces
|
- `indent_level` (default: `4`)
|
||||||
|
|
||||||
- `inline_script` (default `true`) -- escape HTML comments and the slash in
|
- `indent_start` (default: `0`) — prefix all lines by that many spaces
|
||||||
|
|
||||||
|
- `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/UglifyJS2/issues/640) for more details.
|
[#640](https://github.com/mishoo/UglifyJS/issues/640) for more details.
|
||||||
|
|
||||||
# Miscellaneous
|
# Miscellaneous
|
||||||
|
|
||||||
@@ -1072,8 +1116,8 @@ var result = UglifyJS.minify(ast, {
|
|||||||
### Working with Uglify AST
|
### Working with Uglify AST
|
||||||
|
|
||||||
Transversal and transformation of the native AST can be performed through
|
Transversal and transformation of the native AST can be performed through
|
||||||
[`TreeWalker`](https://github.com/mishoo/UglifyJS2/blob/master/lib/ast.js) and
|
[`TreeWalker`](https://github.com/mishoo/UglifyJS/blob/master/lib/ast.js) and
|
||||||
[`TreeTransformer`](https://github.com/mishoo/UglifyJS2/blob/master/lib/transform.js)
|
[`TreeTransformer`](https://github.com/mishoo/UglifyJS/blob/master/lib/transform.js)
|
||||||
respectively.
|
respectively.
|
||||||
|
|
||||||
### ESTree / SpiderMonkey AST
|
### ESTree / SpiderMonkey AST
|
||||||
@@ -1112,29 +1156,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
|
||||||
@@ -1146,6 +1186,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.
|
||||||
@@ -1157,3 +1201,129 @@ 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()`).
|
||||||
|
- Earlier versions of JavaScript will throw `SyntaxError` with the following:
|
||||||
|
```javascript
|
||||||
|
({
|
||||||
|
p: 42,
|
||||||
|
get p() {},
|
||||||
|
});
|
||||||
|
// SyntaxError: Object literal may not have data and accessor property with
|
||||||
|
// the same name
|
||||||
|
```
|
||||||
|
UglifyJS may modify the input which in turn may suppress those errors.
|
||||||
|
- Iteration order of keys over an object which contains spread syntax in later
|
||||||
|
versions of Chrome and Node.js may be altered.
|
||||||
|
- When `toplevel` is enabled, UglifyJS effectively assumes input code is wrapped
|
||||||
|
within `function(){ ... }`, thus forbids aliasing of declared global variables:
|
||||||
|
```javascript
|
||||||
|
A = "FAIL";
|
||||||
|
var B = "FAIL";
|
||||||
|
// can be `global`, `self`, `window` etc.
|
||||||
|
var top = function() {
|
||||||
|
return this;
|
||||||
|
}();
|
||||||
|
// "PASS"
|
||||||
|
top.A = "PASS";
|
||||||
|
console.log(A);
|
||||||
|
// "FAIL" after compress and/or mangle
|
||||||
|
top.B = "PASS";
|
||||||
|
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;
|
||||||
|
async function f() {
|
||||||
|
class A {
|
||||||
|
static p = await;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// SyntaxError: Unexpected reserved word
|
||||||
|
```
|
||||||
|
UglifyJS may modify the input which in turn may suppress those errors.
|
||||||
|
- Later versions of JavaScript will throw `SyntaxError` with the following:
|
||||||
|
```javascript
|
||||||
|
var async;
|
||||||
|
for (async of []);
|
||||||
|
// SyntaxError: The left-hand side of a for-of loop may not be 'async'.
|
||||||
|
```
|
||||||
|
UglifyJS may modify the input which in turn may suppress those errors.
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
build: off
|
|
||||||
matrix:
|
|
||||||
fast_finish: true
|
|
||||||
test_script:
|
|
||||||
- echo No longer in use
|
|
||||||
588
bin/uglifyjs
588
bin/uglifyjs
@@ -3,198 +3,297 @@
|
|||||||
|
|
||||||
"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 program = require("commander");
|
|
||||||
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", "inlined", "parent_scope", "scope", "uses_eval", "uses_with" ];
|
||||||
var files = {};
|
var files = {};
|
||||||
var options = {
|
var options = {};
|
||||||
compress: false,
|
var short_forms = {
|
||||||
mangle: false
|
b: "beautify",
|
||||||
|
c: "compress",
|
||||||
|
d: "define",
|
||||||
|
e: "enclose",
|
||||||
|
h: "help",
|
||||||
|
m: "mangle",
|
||||||
|
o: "output",
|
||||||
|
O: "output-opts",
|
||||||
|
p: "parse",
|
||||||
|
v: "version",
|
||||||
|
V: "version",
|
||||||
};
|
};
|
||||||
program.version(info.name + " " + info.version);
|
var args = process.argv.slice(2);
|
||||||
program.parseArgv = program.parse;
|
var paths = [];
|
||||||
program.parse = undefined;
|
var output, nameCache;
|
||||||
if (process.argv.indexOf("ast") >= 0) program.helpInformation = UglifyJS.describe_ast;
|
var specified = {};
|
||||||
else if (process.argv.indexOf("options") >= 0) program.helpInformation = function() {
|
while (args.length) {
|
||||||
var text = [];
|
var arg = args.shift();
|
||||||
var toplevels = [];
|
if (arg[0] != "-") {
|
||||||
var padding = "";
|
paths.push(arg);
|
||||||
var options = UglifyJS.default_options();
|
} else if (arg == "--") {
|
||||||
for (var name in options) {
|
paths = paths.concat(args);
|
||||||
var option = options[name];
|
break;
|
||||||
if (option && typeof option == "object") {
|
} else if (arg[1] == "-") {
|
||||||
text.push("--" + ({
|
process_option(arg.slice(2));
|
||||||
output: "beautify",
|
} else [].forEach.call(arg.slice(1), function(letter, index, arg) {
|
||||||
sourceMap: "source-map",
|
if (!(letter in short_forms)) fatal("invalid option -" + letter);
|
||||||
}[name] || name) + " options:");
|
process_option(short_forms[letter], index + 1 < arg.length);
|
||||||
text.push(format_object(option));
|
|
||||||
text.push("");
|
|
||||||
} else {
|
|
||||||
if (padding.length < name.length) padding = Array(name.length + 1).join(" ");
|
|
||||||
toplevels.push([ {
|
|
||||||
keep_fnames: "keep-fnames",
|
|
||||||
nameCache: "name-cache",
|
|
||||||
}[name] || name, option ]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
toplevels.forEach(function(tokens) {
|
|
||||||
text.push("--" + tokens[0] + padding.slice(tokens[0].length - 2) + tokens[1]);
|
|
||||||
});
|
});
|
||||||
return text.join("\n");
|
}
|
||||||
};
|
|
||||||
program.option("-p, --parse <options>", "Specify parser options.", parse_js());
|
function process_option(name, no_value) {
|
||||||
program.option("-c, --compress [options]", "Enable compressor/specify compressor options.", parse_js());
|
specified[name] = true;
|
||||||
program.option("-m, --mangle [options]", "Mangle names/specify mangler options.", parse_js());
|
switch (name) {
|
||||||
program.option("--mangle-props [options]", "Mangle properties/specify mangler options.", parse_js());
|
case "help":
|
||||||
program.option("-b, --beautify [options]", "Beautify output/specify output options.", parse_js());
|
switch (read_value()) {
|
||||||
program.option("-O, --output-opts [options]", "Output options (beautify disabled).", parse_js());
|
case "ast":
|
||||||
program.option("-o, --output <file>", "Output file (default STDOUT).");
|
print(UglifyJS.describe_ast());
|
||||||
program.option("--comments [filter]", "Preserve copyright comments in the output.");
|
break;
|
||||||
program.option("--config-file <file>", "Read minify() options from JSON file.");
|
case "options":
|
||||||
program.option("-d, --define <expr>[=value]", "Global definitions.", parse_js("define"));
|
var text = [];
|
||||||
program.option("-e, --enclose [arg[,...][:value[,...]]]", "Embed everything in a big function, with configurable argument(s) & value(s).");
|
var toplevels = [];
|
||||||
program.option("--ie8", "Support non-standard Internet Explorer 8.");
|
var padding = "";
|
||||||
program.option("--keep-fnames", "Do not mangle/drop function names. Useful for code relying on Function.prototype.name.");
|
var defaults = UglifyJS.default_options();
|
||||||
program.option("--name-cache <file>", "File to hold mangled name mappings.");
|
for (var name in defaults) {
|
||||||
program.option("--rename", "Force symbol expansion.");
|
var option = defaults[name];
|
||||||
program.option("--no-rename", "Disable symbol expansion.");
|
if (option && typeof option == "object") {
|
||||||
program.option("--self", "Build UglifyJS as a library (implies --wrap UglifyJS)");
|
text.push("--" + ({
|
||||||
program.option("--source-map [options]", "Enable source map/specify source map options.", parse_js());
|
output: "beautify",
|
||||||
program.option("--timings", "Display operations run time on STDERR.");
|
sourceMap: "source-map",
|
||||||
program.option("--toplevel", "Compress and/or mangle variables in toplevel scope.");
|
}[name] || name) + " options:");
|
||||||
program.option("--verbose", "Print diagnostic messages.");
|
text.push(format_object(option));
|
||||||
program.option("--warn", "Print warning messages.");
|
text.push("");
|
||||||
program.option("--wrap <name>", "Embed everything as a function with “exports” corresponding to “name” globally.");
|
} else {
|
||||||
program.option("--reduce-test", "Reduce a standalone `console.log` based test case.");
|
if (padding.length < name.length) padding = Array(name.length + 1).join(" ");
|
||||||
program.arguments("[files...]").parseArgv(process.argv);
|
toplevels.push([ {
|
||||||
if (program.configFile) {
|
keep_fnames: "keep-fnames",
|
||||||
options = JSON.parse(read_file(program.configFile));
|
nameCache: "name-cache",
|
||||||
if (options.mangle && options.mangle.properties && options.mangle.properties.regex) {
|
}[name] || name, option ]);
|
||||||
options.mangle.properties.regex = UglifyJS.parse(options.mangle.properties.regex, {
|
}
|
||||||
expression: true
|
}
|
||||||
}).value;
|
toplevels.forEach(function(tokens) {
|
||||||
|
text.push("--" + tokens[0] + padding.slice(tokens[0].length - 2) + tokens[1]);
|
||||||
|
});
|
||||||
|
print(text.join("\n"));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
print([
|
||||||
|
"Usage: uglifyjs [files...] [options]",
|
||||||
|
"",
|
||||||
|
"Options:",
|
||||||
|
" -h, --help Print usage information.",
|
||||||
|
" `--help options` for details on available options.",
|
||||||
|
" -v, -V, --version Print version number.",
|
||||||
|
" -p, --parse <options> Specify parser options.",
|
||||||
|
" -c, --compress [options] Enable compressor/specify compressor options.",
|
||||||
|
" -m, --mangle [options] Mangle names/specify mangler options.",
|
||||||
|
" --mangle-props [options] Mangle properties/specify mangler options.",
|
||||||
|
" -b, --beautify [options] Beautify output/specify output options.",
|
||||||
|
" -O, --output-opts <options> Output options (beautify disabled).",
|
||||||
|
" -o, --output <file> Output file (default STDOUT).",
|
||||||
|
" --annotations Process and preserve comment annotations.",
|
||||||
|
" --no-annotations Ignore and discard comment annotations.",
|
||||||
|
" --comments [filter] Preserve copyright comments in the output.",
|
||||||
|
" --config-file <file> Read minify() options from JSON file.",
|
||||||
|
" -d, --define <expr>[=value] Global definitions.",
|
||||||
|
" -e, --enclose [arg[,...][:value[,...]]] Embed everything in a big function, with configurable argument(s) & value(s).",
|
||||||
|
" --ie8 Support non-standard Internet Explorer 8.",
|
||||||
|
" --keep-fnames Do not mangle/drop function names. Useful for code relying on Function.prototype.name.",
|
||||||
|
" --name-cache <file> File to hold mangled name mappings.",
|
||||||
|
" --rename Force symbol expansion.",
|
||||||
|
" --no-rename Disable symbol expansion.",
|
||||||
|
" --self Build UglifyJS as a library (implies --wrap UglifyJS)",
|
||||||
|
" --source-map [options] Enable source map/specify source map options.",
|
||||||
|
" --timings Display operations run time on STDERR.",
|
||||||
|
" --toplevel Compress and/or mangle variables in toplevel scope.",
|
||||||
|
" --validate Perform validation during AST manipulations.",
|
||||||
|
" --verbose Print diagnostic messages.",
|
||||||
|
" --warn Print warning messages.",
|
||||||
|
" --webkit Support non-standard Safari/Webkit.",
|
||||||
|
" --wrap <name> Embed everything as a function with “exports” corresponding to “name” globally.",
|
||||||
|
"",
|
||||||
|
"(internal debug use only)",
|
||||||
|
" --in-situ Warning: replaces original source files with minified output.",
|
||||||
|
" --reduce-test Reduce a standalone test case (assumes cloned repository).",
|
||||||
|
].join("\n"));
|
||||||
|
}
|
||||||
|
process.exit();
|
||||||
|
case "version":
|
||||||
|
print(info.name + " " + info.version);
|
||||||
|
process.exit();
|
||||||
|
case "config-file":
|
||||||
|
var config = JSON.parse(read_file(read_value(true)));
|
||||||
|
if (config.mangle && config.mangle.properties && config.mangle.properties.regex) {
|
||||||
|
config.mangle.properties.regex = UglifyJS.parse(config.mangle.properties.regex, {
|
||||||
|
expression: true,
|
||||||
|
}).value;
|
||||||
|
}
|
||||||
|
for (var key in config) if (!(key in options)) options[key] = config[key];
|
||||||
|
break;
|
||||||
|
case "compress":
|
||||||
|
case "mangle":
|
||||||
|
options[name] = parse_js(read_value(), options[name]);
|
||||||
|
break;
|
||||||
|
case "source-map":
|
||||||
|
options.sourceMap = parse_js(read_value(), options.sourceMap);
|
||||||
|
break;
|
||||||
|
case "enclose":
|
||||||
|
options[name] = read_value();
|
||||||
|
break;
|
||||||
|
case "annotations":
|
||||||
|
case "ie8":
|
||||||
|
case "timings":
|
||||||
|
case "toplevel":
|
||||||
|
case "validate":
|
||||||
|
case "webkit":
|
||||||
|
options[name] = true;
|
||||||
|
break;
|
||||||
|
case "no-annotations":
|
||||||
|
options.annotations = false;
|
||||||
|
break;
|
||||||
|
case "keep-fnames":
|
||||||
|
options.keep_fnames = true;
|
||||||
|
break;
|
||||||
|
case "wrap":
|
||||||
|
options[name] = read_value(true);
|
||||||
|
break;
|
||||||
|
case "verbose":
|
||||||
|
options.warnings = "verbose";
|
||||||
|
break;
|
||||||
|
case "warn":
|
||||||
|
if (!options.warnings) options.warnings = true;
|
||||||
|
break;
|
||||||
|
case "beautify":
|
||||||
|
options.output = parse_js(read_value(), options.output);
|
||||||
|
if (!("beautify" in options.output)) options.output.beautify = true;
|
||||||
|
break;
|
||||||
|
case "output-opts":
|
||||||
|
options.output = parse_js(read_value(true), options.output);
|
||||||
|
break;
|
||||||
|
case "comments":
|
||||||
|
if (typeof options.output != "object") options.output = {};
|
||||||
|
options.output.comments = read_value();
|
||||||
|
if (options.output.comments === true) options.output.comments = "some";
|
||||||
|
break;
|
||||||
|
case "define":
|
||||||
|
if (typeof options.compress != "object") options.compress = {};
|
||||||
|
options.compress.global_defs = parse_js(read_value(true), options.compress.global_defs, "define");
|
||||||
|
break;
|
||||||
|
case "mangle-props":
|
||||||
|
if (typeof options.mangle != "object") options.mangle = {};
|
||||||
|
options.mangle.properties = parse_js(read_value(), options.mangle.properties);
|
||||||
|
break;
|
||||||
|
case "name-cache":
|
||||||
|
nameCache = read_value(true);
|
||||||
|
options.nameCache = JSON.parse(read_file(nameCache, "{}"));
|
||||||
|
break;
|
||||||
|
case "output":
|
||||||
|
output = read_value(true);
|
||||||
|
break;
|
||||||
|
case "parse":
|
||||||
|
options.parse = parse_js(read_value(true), options.parse);
|
||||||
|
break;
|
||||||
|
case "rename":
|
||||||
|
options.rename = true;
|
||||||
|
break;
|
||||||
|
case "no-rename":
|
||||||
|
options.rename = false;
|
||||||
|
break;
|
||||||
|
case "in-situ":
|
||||||
|
case "reduce-test":
|
||||||
|
case "self":
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fatal("invalid option --" + name);
|
||||||
|
}
|
||||||
|
|
||||||
|
function read_value(required) {
|
||||||
|
if (no_value || !args.length || args[0][0] == "-") {
|
||||||
|
if (required) fatal("missing option argument for --" + name);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return args.shift();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!program.output && program.sourceMap && program.sourceMap.url != "inline") {
|
if (!output && options.sourceMap && options.sourceMap.url != "inline") fatal("cannot write source map to STDOUT");
|
||||||
fatal("cannot write source map to STDOUT");
|
if (specified["beautify"] && specified["output-opts"]) fatal("--beautify cannot be used with --output-opts");
|
||||||
}
|
[ "compress", "mangle" ].forEach(function(name) {
|
||||||
[
|
if (!(name in options)) options[name] = false;
|
||||||
"compress",
|
|
||||||
"enclose",
|
|
||||||
"ie8",
|
|
||||||
"mangle",
|
|
||||||
"sourceMap",
|
|
||||||
"toplevel",
|
|
||||||
"wrap"
|
|
||||||
].forEach(function(name) {
|
|
||||||
if (name in program) {
|
|
||||||
options[name] = program[name];
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
if (program.verbose) {
|
if (options.mangle && options.mangle.properties) {
|
||||||
options.warnings = "verbose";
|
if (options.mangle.properties.domprops) {
|
||||||
} else if (program.warn) {
|
delete options.mangle.properties.domprops;
|
||||||
options.warnings = true;
|
} else {
|
||||||
|
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 (/^ast|spidermonkey$/.test(output)) {
|
||||||
|
if (typeof options.output != "object") options.output = {};
|
||||||
|
options.output.ast = true;
|
||||||
|
options.output.code = false;
|
||||||
|
}
|
||||||
|
if (options.parse && (options.parse.acorn || options.parse.spidermonkey)
|
||||||
|
&& options.sourceMap && options.sourceMap.content == "inline") {
|
||||||
|
fatal("inline source map only works with built-in parser");
|
||||||
}
|
}
|
||||||
if (options.warnings) {
|
if (options.warnings) {
|
||||||
UglifyJS.AST_Node.log_function(print_error, options.warnings == "verbose");
|
UglifyJS.AST_Node.log_function(print_error, options.warnings == "verbose");
|
||||||
delete options.warnings;
|
delete options.warnings;
|
||||||
}
|
}
|
||||||
if (program.beautify) {
|
|
||||||
options.output = typeof program.beautify == "object" ? program.beautify : {};
|
|
||||||
if (!("beautify" in options.output)) {
|
|
||||||
options.output.beautify = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (program.outputOpts) {
|
|
||||||
if (program.beautify) fatal("--beautify cannot be used with --output-opts");
|
|
||||||
options.output = typeof program.outputOpts == "object" ? program.outputOpts : {};
|
|
||||||
}
|
|
||||||
if (program.comments) {
|
|
||||||
if (typeof options.output != "object") options.output = {};
|
|
||||||
options.output.comments = typeof program.comments == "string" ? program.comments : "some";
|
|
||||||
}
|
|
||||||
if (program.define) {
|
|
||||||
if (typeof options.compress != "object") options.compress = {};
|
|
||||||
if (typeof options.compress.global_defs != "object") options.compress.global_defs = {};
|
|
||||||
for (var expr in program.define) {
|
|
||||||
options.compress.global_defs[expr] = program.define[expr];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (program.keepFnames) {
|
|
||||||
options.keep_fnames = true;
|
|
||||||
}
|
|
||||||
if (program.mangleProps) {
|
|
||||||
if (program.mangleProps.domprops) {
|
|
||||||
delete program.mangleProps.domprops;
|
|
||||||
} else {
|
|
||||||
if (typeof program.mangleProps != "object") program.mangleProps = {};
|
|
||||||
if (!Array.isArray(program.mangleProps.reserved)) program.mangleProps.reserved = [];
|
|
||||||
require("../tools/domprops").forEach(function(name) {
|
|
||||||
UglifyJS.push_uniq(program.mangleProps.reserved, name);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (typeof options.mangle != "object") options.mangle = {};
|
|
||||||
options.mangle.properties = program.mangleProps;
|
|
||||||
}
|
|
||||||
if (program.nameCache) {
|
|
||||||
options.nameCache = JSON.parse(read_file(program.nameCache, "{}"));
|
|
||||||
}
|
|
||||||
if (program.output == "ast") {
|
|
||||||
options.output = {
|
|
||||||
ast: true,
|
|
||||||
code: false
|
|
||||||
};
|
|
||||||
}
|
|
||||||
if (program.parse) {
|
|
||||||
if (!program.parse.acorn && !program.parse.spidermonkey) {
|
|
||||||
options.parse = program.parse;
|
|
||||||
} else if (program.sourceMap && program.sourceMap.content == "inline") {
|
|
||||||
fatal("inline source map only works with built-in parser");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (~program.rawArgs.indexOf("--rename")) {
|
|
||||||
options.rename = true;
|
|
||||||
} else if (!program.rename) {
|
|
||||||
options.rename = false;
|
|
||||||
}
|
|
||||||
var convert_path = function(name) {
|
var convert_path = function(name) {
|
||||||
return name;
|
return name;
|
||||||
};
|
};
|
||||||
if (typeof program.sourceMap == "object" && "base" in program.sourceMap) {
|
if (typeof options.sourceMap == "object" && "base" in options.sourceMap) {
|
||||||
convert_path = function() {
|
convert_path = function() {
|
||||||
var base = program.sourceMap.base;
|
var base = options.sourceMap.base;
|
||||||
delete options.sourceMap.base;
|
delete options.sourceMap.base;
|
||||||
return function(name) {
|
return function(name) {
|
||||||
return path.relative(base, name);
|
return path.relative(base, name);
|
||||||
};
|
};
|
||||||
}();
|
}();
|
||||||
}
|
}
|
||||||
if (program.self) {
|
if (specified["self"]) {
|
||||||
if (program.args.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";
|
||||||
simple_glob(UglifyJS.FILES).forEach(function(name) {
|
paths = UglifyJS.FILES;
|
||||||
|
}
|
||||||
|
if (specified["in-situ"]) {
|
||||||
|
if (output && output != "spidermonkey" || specified["reduce-test"] || specified["self"]) {
|
||||||
|
fatal("incompatible options specified");
|
||||||
|
}
|
||||||
|
paths.forEach(function(name) {
|
||||||
|
print(name);
|
||||||
|
if (/^ast|spidermonkey$/.test(name)) fatal("invalid file name specified");
|
||||||
|
files = {};
|
||||||
files[convert_path(name)] = read_file(name);
|
files[convert_path(name)] = read_file(name);
|
||||||
|
output = name;
|
||||||
|
run();
|
||||||
});
|
});
|
||||||
run();
|
} else if (paths.length) {
|
||||||
} else if (program.args.length) {
|
simple_glob(paths).forEach(function(name) {
|
||||||
simple_glob(program.args).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", function(chunk) {
|
||||||
chunks.push(chunk);
|
chunks.push(chunk);
|
||||||
}).on("end", function() {
|
}).on("end", function() {
|
||||||
files = [ chunks.join("") ];
|
files = { STDIN: chunks.join("") };
|
||||||
run();
|
run();
|
||||||
});
|
});
|
||||||
process.stdin.resume();
|
process.stdin.resume();
|
||||||
@@ -205,23 +304,54 @@ function convert_ast(fn) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function run() {
|
function run() {
|
||||||
var content = program.sourceMap && program.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);
|
||||||
}
|
}
|
||||||
if (program.timings) options.timings = true;
|
|
||||||
try {
|
try {
|
||||||
if (program.parse) {
|
if (options.parse) {
|
||||||
if (program.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",
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
} else if (program.parse.spidermonkey) {
|
files.walk(new UglifyJS.TreeWalker(function(node) {
|
||||||
|
if (!(node instanceof UglifyJS.AST_Call)) return;
|
||||||
|
var list = annotations[node.start.file];
|
||||||
|
var pure = list[node.start.pos];
|
||||||
|
if (!pure) {
|
||||||
|
var pos = node.start.parens;
|
||||||
|
if (pos) for (var i = 0; !pure && i < pos.length; i++) {
|
||||||
|
pure = list[pos[i]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (pure) node.pure = pure;
|
||||||
|
}));
|
||||||
|
} else if (options.parse.spidermonkey) {
|
||||||
files = convert_ast(function(toplevel, name) {
|
files = convert_ast(function(toplevel, name) {
|
||||||
var obj = JSON.parse(files[name]);
|
var obj = JSON.parse(files[name]);
|
||||||
if (!toplevel) return obj;
|
if (!toplevel) return obj;
|
||||||
@@ -233,17 +363,17 @@ function run() {
|
|||||||
} catch (ex) {
|
} catch (ex) {
|
||||||
fatal(ex);
|
fatal(ex);
|
||||||
}
|
}
|
||||||
if (program.reduceTest) {
|
var result;
|
||||||
// load on demand - assumes dev tree checked out
|
if (specified["reduce-test"]) {
|
||||||
|
// load on demand - assumes cloned repository
|
||||||
var reduce_test = require("../test/reduce");
|
var reduce_test = require("../test/reduce");
|
||||||
var testcase = files[0] || files[Object.keys(files)[0]];
|
if (Object.keys(files).length != 1) fatal("can only test on a single file");
|
||||||
var result = reduce_test(testcase, options, {
|
result = reduce_test(files[Object.keys(files)[0]], options, {
|
||||||
log: print_error,
|
log: print_error,
|
||||||
verbose: true,
|
verbose: true,
|
||||||
});
|
});
|
||||||
}
|
} else {
|
||||||
else {
|
result = UglifyJS.minify(files, options);
|
||||||
var result = UglifyJS.minify(files, options);
|
|
||||||
}
|
}
|
||||||
if (result.error) {
|
if (result.error) {
|
||||||
var ex = result.error;
|
var ex = result.error;
|
||||||
@@ -273,20 +403,29 @@ function run() {
|
|||||||
print_error(format_object(ex.defs));
|
print_error(format_object(ex.defs));
|
||||||
}
|
}
|
||||||
fatal(ex);
|
fatal(ex);
|
||||||
} else if (program.output == "ast") {
|
} else if (output == "ast") {
|
||||||
if (!options.compress && !options.mangle) {
|
if (!options.compress && !options.mangle) {
|
||||||
result.ast.figure_out_scope({});
|
var toplevel = result.ast;
|
||||||
|
if (!(toplevel instanceof UglifyJS.AST_Toplevel)) {
|
||||||
|
if (!(toplevel instanceof UglifyJS.AST_Statement)) toplevel = new UglifyJS.AST_SimpleStatement({
|
||||||
|
body: toplevel,
|
||||||
|
});
|
||||||
|
toplevel = new UglifyJS.AST_Toplevel({
|
||||||
|
body: [ toplevel ],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
toplevel.figure_out_scope({});
|
||||||
}
|
}
|
||||||
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_key(key)) return;
|
||||||
if (value instanceof UglifyJS.AST_Token) return;
|
if (value instanceof UglifyJS.AST_Token) return;
|
||||||
@@ -302,26 +441,25 @@ function run() {
|
|||||||
}
|
}
|
||||||
return value;
|
return value;
|
||||||
}, 2));
|
}, 2));
|
||||||
} else if (program.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,
|
} else if (output) {
|
||||||
mangle: false,
|
var code;
|
||||||
output: {
|
if (result.ast) {
|
||||||
ast: true,
|
var opts = {};
|
||||||
code: false
|
for (var name in options.output) {
|
||||||
|
if (!/^ast|code$/.test(name)) opts[name] = options.output[name];
|
||||||
}
|
}
|
||||||
}).ast.to_mozilla_ast(), null, 2));
|
code = UglifyJS.AST_Node.from_mozilla_ast(result.ast.to_mozilla_ast()).print_to_string(opts);
|
||||||
} else if (program.output) {
|
} else {
|
||||||
fs.writeFileSync(program.output, result.code);
|
code = result.code;
|
||||||
if (result.map) {
|
|
||||||
fs.writeFileSync(program.output + ".map", result.map);
|
|
||||||
}
|
}
|
||||||
|
fs.writeFileSync(output, code);
|
||||||
|
if (result.map) fs.writeFileSync(output + ".map", result.map);
|
||||||
} else {
|
} else {
|
||||||
print(result.code);
|
print(result.code);
|
||||||
}
|
}
|
||||||
if (program.nameCache) {
|
if (nameCache) fs.writeFileSync(nameCache, JSON.stringify(options.nameCache));
|
||||||
fs.writeFileSync(program.nameCache, JSON.stringify(options.nameCache));
|
|
||||||
}
|
|
||||||
if (result.timings) for (var phase in result.timings) {
|
if (result.timings) for (var phase in result.timings) {
|
||||||
print_error("- " + phase + ": " + result.timings[phase].toFixed(3) + "s");
|
print_error("- " + phase + ": " + result.timings[phase].toFixed(3) + "s");
|
||||||
}
|
}
|
||||||
@@ -377,47 +515,45 @@ function read_file(path, default_value) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function parse_js(flag) {
|
function parse_js(value, options, flag) {
|
||||||
return function(value, options) {
|
if (!options || typeof options != "object") options = {};
|
||||||
options = options || {};
|
if (typeof value == "string") try {
|
||||||
try {
|
UglifyJS.parse(value, {
|
||||||
UglifyJS.parse(value, {
|
expression: true
|
||||||
expression: true
|
}).walk(new UglifyJS.TreeWalker(function(node) {
|
||||||
}).walk(new UglifyJS.TreeWalker(function(node) {
|
if (node instanceof UglifyJS.AST_Assign) {
|
||||||
if (node instanceof UglifyJS.AST_Assign) {
|
var name = node.left.print_to_string();
|
||||||
var name = node.left.print_to_string();
|
var value = node.right;
|
||||||
var value = node.right;
|
if (flag) {
|
||||||
if (flag) {
|
options[name] = value;
|
||||||
options[name] = value;
|
} else if (value instanceof UglifyJS.AST_Array) {
|
||||||
} else if (value instanceof UglifyJS.AST_Array) {
|
options[name] = value.elements.map(to_string);
|
||||||
options[name] = value.elements.map(to_string);
|
} else {
|
||||||
} else {
|
options[name] = to_string(value);
|
||||||
options[name] = to_string(value);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
if (node instanceof UglifyJS.AST_Symbol || node instanceof UglifyJS.AST_PropAccess) {
|
return true;
|
||||||
var name = node.print_to_string();
|
|
||||||
options[name] = true;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (!(node instanceof UglifyJS.AST_Sequence)) throw node;
|
|
||||||
|
|
||||||
function to_string(value) {
|
|
||||||
return value instanceof UglifyJS.AST_Constant ? value.value : value.print_to_string({
|
|
||||||
quote_keys: true
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
} catch (ex) {
|
|
||||||
if (flag) {
|
|
||||||
fatal("cannot parse arguments for '" + flag + "': " + value);
|
|
||||||
} else {
|
|
||||||
options[value] = null;
|
|
||||||
}
|
}
|
||||||
|
if (node instanceof UglifyJS.AST_Symbol || node instanceof UglifyJS.AST_PropAccess) {
|
||||||
|
var name = node.print_to_string();
|
||||||
|
options[name] = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (!(node instanceof UglifyJS.AST_Sequence)) throw node;
|
||||||
|
|
||||||
|
function to_string(value) {
|
||||||
|
return value instanceof UglifyJS.AST_Constant ? value.value : value.print_to_string({
|
||||||
|
quote_keys: true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
} catch (ex) {
|
||||||
|
if (flag) {
|
||||||
|
fatal("cannot parse arguments for '" + flag + "': " + value);
|
||||||
|
} else {
|
||||||
|
options[value] = null;
|
||||||
}
|
}
|
||||||
return options;
|
|
||||||
}
|
}
|
||||||
|
return options;
|
||||||
}
|
}
|
||||||
|
|
||||||
function skip_key(key) {
|
function skip_key(key) {
|
||||||
|
|||||||
1560
lib/ast.js
1560
lib/ast.js
File diff suppressed because it is too large
Load Diff
7113
lib/compress.js
7113
lib/compress.js
File diff suppressed because it is too large
Load Diff
@@ -33,7 +33,9 @@ function read_source_map(name, toplevel) {
|
|||||||
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,6 +73,7 @@ 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,
|
||||||
ie8: false,
|
ie8: false,
|
||||||
@@ -85,18 +86,21 @@ function minify(files, options) {
|
|||||||
sourceMap: false,
|
sourceMap: false,
|
||||||
timings: false,
|
timings: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
|
v8: false,
|
||||||
|
validate: false,
|
||||||
warnings: false,
|
warnings: false,
|
||||||
|
webkit: false,
|
||||||
wrap: false,
|
wrap: false,
|
||||||
}, true);
|
}, true);
|
||||||
var timings = options.timings && {
|
if (options.validate) AST_Node.enable_validation();
|
||||||
start: Date.now()
|
var timings = options.timings && { start: Date.now() };
|
||||||
};
|
if (options.rename === undefined) options.rename = options.compress && options.mangle;
|
||||||
if (options.rename === undefined) {
|
if (options.annotations !== undefined) set_shorthand("annotations", options, [ "compress", "output" ]);
|
||||||
options.rename = options.compress && options.mangle;
|
if (options.ie8) set_shorthand("ie8", options, [ "compress", "mangle", "output" ]);
|
||||||
}
|
if (options.keep_fnames) set_shorthand("keep_fnames", options, [ "compress", "mangle" ]);
|
||||||
set_shorthand("ie8", options, [ "compress", "mangle", "output" ]);
|
if (options.toplevel) set_shorthand("toplevel", options, [ "compress", "mangle" ]);
|
||||||
set_shorthand("keep_fnames", options, [ "compress", "mangle" ]);
|
if (options.v8) set_shorthand("v8", options, [ "mangle", "output" ]);
|
||||||
set_shorthand("toplevel", options, [ "compress", "mangle" ]);
|
if (options.webkit) set_shorthand("webkit", options, [ "mangle", "output" ]);
|
||||||
var quoted_props;
|
var quoted_props;
|
||||||
if (options.mangle) {
|
if (options.mangle) {
|
||||||
options.mangle = defaults(options.mangle, {
|
options.mangle = defaults(options.mangle, {
|
||||||
@@ -107,6 +111,8 @@ function minify(files, options) {
|
|||||||
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") {
|
||||||
@@ -176,13 +182,17 @@ function minify(files, options) {
|
|||||||
toplevel = toplevel[action](option);
|
toplevel = toplevel[action](option);
|
||||||
files[toplevel.start.file] = toplevel.print_to_string().replace(orig, "");
|
files[toplevel.start.file] = toplevel.print_to_string().replace(orig, "");
|
||||||
});
|
});
|
||||||
|
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.mangle);
|
||||||
toplevel.expand_names(options.mangle);
|
toplevel.expand_names(options.mangle);
|
||||||
}
|
}
|
||||||
if (timings) timings.compress = Date.now();
|
if (timings) timings.compress = Date.now();
|
||||||
if (options.compress) toplevel = new Compressor(options.compress).compress(toplevel);
|
if (options.compress) {
|
||||||
|
toplevel = new Compressor(options.compress).compress(toplevel);
|
||||||
|
if (options.validate) toplevel.validate_ast();
|
||||||
|
}
|
||||||
if (timings) timings.scope = Date.now();
|
if (timings) timings.scope = Date.now();
|
||||||
if (options.mangle) toplevel.figure_out_scope(options.mangle);
|
if (options.mangle) toplevel.figure_out_scope(options.mangle);
|
||||||
if (timings) timings.mangle = Date.now();
|
if (timings) timings.mangle = Date.now();
|
||||||
@@ -191,32 +201,32 @@ 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 (options.mangle && options.mangle.properties) {
|
if (options.mangle && options.mangle.properties) mangle_properties(toplevel, options.mangle.properties);
|
||||||
toplevel = mangle_properties(toplevel, options.mangle.properties);
|
|
||||||
}
|
|
||||||
if (timings) timings.output = Date.now();
|
if (timings) timings.output = Date.now();
|
||||||
var result = {};
|
var result = {};
|
||||||
if (options.output.ast) {
|
var output = defaults(options.output, {
|
||||||
result.ast = toplevel;
|
ast: false,
|
||||||
}
|
code: true,
|
||||||
if (!HOP(options.output, "code") || options.output.code) {
|
});
|
||||||
|
if (output.ast) result.ast = toplevel;
|
||||||
|
if (output.code) {
|
||||||
if (options.sourceMap) {
|
if (options.sourceMap) {
|
||||||
options.output.source_map = SourceMap(options.sourceMap);
|
output.source_map = SourceMap(options.sourceMap);
|
||||||
if (options.sourceMap.includeSources) {
|
if (options.sourceMap.includeSources) {
|
||||||
if (files instanceof AST_Toplevel) {
|
if (files instanceof AST_Toplevel) {
|
||||||
throw new Error("original source content unavailable");
|
throw new Error("original source content unavailable");
|
||||||
} else for (var name in files) if (HOP(files, name)) {
|
} else for (var name in files) if (HOP(files, name)) {
|
||||||
options.output.source_map.setSourceContent(name, files[name]);
|
output.source_map.setSourceContent(name, files[name]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
delete options.output.ast;
|
delete output.ast;
|
||||||
delete options.output.code;
|
delete output.code;
|
||||||
var stream = OutputStream(options.output);
|
var stream = OutputStream(output);
|
||||||
toplevel.print(stream);
|
toplevel.print(stream);
|
||||||
result.code = stream.get();
|
result.code = stream.get();
|
||||||
if (options.sourceMap) {
|
if (options.sourceMap) {
|
||||||
result.map = options.output.source_map.toString();
|
result.map = output.source_map.toString();
|
||||||
var url = options.sourceMap.url;
|
var url = options.sourceMap.url;
|
||||||
if (url) {
|
if (url) {
|
||||||
result.code = result.code.replace(/\n\/\/# sourceMappingURL=\S+\s*$/, "");
|
result.code = result.code.replace(/\n\/\/# sourceMappingURL=\S+\s*$/, "");
|
||||||
@@ -253,5 +263,8 @@ function minify(files, options) {
|
|||||||
return result;
|
return result;
|
||||||
} catch (ex) {
|
} catch (ex) {
|
||||||
return { error: ex };
|
return { error: ex };
|
||||||
|
} finally {
|
||||||
|
AST_Node.log_function();
|
||||||
|
AST_Node.disable_validation();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
1336
lib/output.js
1336
lib/output.js
File diff suppressed because it is too large
Load Diff
1583
lib/parse.js
1583
lib/parse.js
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,7 @@
|
|||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
|
||||||
A JavaScript tokenizer / parser / beautifier / compressor.
|
A JavaScript tokenizer / parser / beautifier / compressor.
|
||||||
https://github.com/mishoo/UglifyJS2
|
https://github.com/mishoo/UglifyJS
|
||||||
|
|
||||||
-------------------------------- (C) ---------------------------------
|
-------------------------------- (C) ---------------------------------
|
||||||
|
|
||||||
@@ -43,7 +43,8 @@
|
|||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
function find_builtins(reserved) {
|
var builtins = function() {
|
||||||
|
var names = [];
|
||||||
// NaN will be included due to Number.NaN
|
// NaN will be included due to Number.NaN
|
||||||
[
|
[
|
||||||
"null",
|
"null",
|
||||||
@@ -67,19 +68,23 @@ function find_builtins(reserved) {
|
|||||||
].forEach(function(ctor) {
|
].forEach(function(ctor) {
|
||||||
Object.getOwnPropertyNames(ctor).map(add);
|
Object.getOwnPropertyNames(ctor).map(add);
|
||||||
if (ctor.prototype) {
|
if (ctor.prototype) {
|
||||||
|
Object.getOwnPropertyNames(new ctor()).map(add);
|
||||||
Object.getOwnPropertyNames(ctor.prototype).map(add);
|
Object.getOwnPropertyNames(ctor.prototype).map(add);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
return makePredicate(names);
|
||||||
|
|
||||||
function add(name) {
|
function add(name) {
|
||||||
push_uniq(reserved, name);
|
names.push(name);
|
||||||
}
|
}
|
||||||
}
|
}();
|
||||||
|
|
||||||
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 && node.quote) {
|
if (node instanceof AST_ClassProperty) {
|
||||||
add(node.key);
|
if (node.start && node.start.quote) add(node.key);
|
||||||
|
} else if (node instanceof AST_ObjectProperty) {
|
||||||
|
if (node.start && node.start.quote) add(node.key);
|
||||||
} else if (node instanceof AST_Sub) {
|
} else if (node instanceof AST_Sub) {
|
||||||
addStrings(node.property, add);
|
addStrings(node.property, add);
|
||||||
}
|
}
|
||||||
@@ -91,17 +96,14 @@ function reserve_quoted_keys(ast, reserved) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function addStrings(node, add) {
|
function addStrings(node, add) {
|
||||||
node.walk(new TreeWalker(function(node) {
|
if (node instanceof AST_Conditional) {
|
||||||
if (node instanceof AST_Sequence) {
|
addStrings(node.consequent, add);
|
||||||
addStrings(node.tail_node(), add);
|
addStrings(node.alternative, add);
|
||||||
} else if (node instanceof AST_String) {
|
} else if (node instanceof AST_Sequence) {
|
||||||
add(node.value);
|
addStrings(node.tail_node(), add);
|
||||||
} else if (node instanceof AST_Conditional) {
|
} else if (node instanceof AST_String) {
|
||||||
addStrings(node.consequent, add);
|
add(node.value);
|
||||||
addStrings(node.alternative, add);
|
}
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function mangle_properties(ast, options) {
|
function mangle_properties(ast, options) {
|
||||||
@@ -110,21 +112,21 @@ function mangle_properties(ast, options) {
|
|||||||
cache: null,
|
cache: null,
|
||||||
debug: false,
|
debug: false,
|
||||||
keep_quoted: false,
|
keep_quoted: false,
|
||||||
only_cache: false,
|
|
||||||
regex: null,
|
regex: null,
|
||||||
reserved: null,
|
reserved: null,
|
||||||
}, true);
|
}, true);
|
||||||
|
|
||||||
var reserved = options.reserved;
|
var reserved = Object.create(options.builtins ? null : builtins);
|
||||||
if (!Array.isArray(reserved)) reserved = [];
|
if (Array.isArray(options.reserved)) options.reserved.forEach(function(name) {
|
||||||
if (!options.builtins) find_builtins(reserved);
|
reserved[name] = true;
|
||||||
|
});
|
||||||
|
|
||||||
var cname = -1;
|
var cname = -1;
|
||||||
var cache;
|
var cache;
|
||||||
if (options.cache) {
|
if (options.cache) {
|
||||||
cache = options.cache.props;
|
cache = options.cache.props;
|
||||||
cache.each(function(mangled_name) {
|
cache.each(function(name) {
|
||||||
push_uniq(reserved, mangled_name);
|
reserved[name] = true;
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
cache = new Dictionary();
|
cache = new Dictionary();
|
||||||
@@ -139,72 +141,98 @@ function mangle_properties(ast, options) {
|
|||||||
var debug_suffix;
|
var debug_suffix;
|
||||||
if (debug) debug_suffix = options.debug === true ? "" : options.debug;
|
if (debug) debug_suffix = options.debug === true ? "" : options.debug;
|
||||||
|
|
||||||
var names_to_mangle = [];
|
var names_to_mangle = Object.create(null);
|
||||||
var unmangleable = [];
|
var unmangleable = Object.create(reserved);
|
||||||
|
|
||||||
// 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_ObjectKeyVal) {
|
if (node instanceof AST_Binary) {
|
||||||
add(node.key);
|
if (node.operator == "in") addStrings(node.left, add);
|
||||||
} else if (node instanceof AST_ObjectProperty) {
|
} else if (node.TYPE == "Call") {
|
||||||
// setter or getter, since KeyVal is handled above
|
var exp = node.expression;
|
||||||
add(node.key.name);
|
if (exp instanceof AST_Dot) switch (exp.property) {
|
||||||
|
case "defineProperty":
|
||||||
|
case "getOwnPropertyDescriptor":
|
||||||
|
if (node.args.length < 2) break;
|
||||||
|
exp = exp.expression;
|
||||||
|
if (!(exp instanceof AST_SymbolRef)) break;
|
||||||
|
if (exp.name != "Object") break;
|
||||||
|
if (!exp.definition().undeclared) break;
|
||||||
|
addStrings(node.args[1], add);
|
||||||
|
break;
|
||||||
|
case "hasOwnProperty":
|
||||||
|
if (node.args.length < 1) break;
|
||||||
|
addStrings(node.args[0], add);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if (node instanceof AST_ClassProperty) {
|
||||||
|
if (typeof node.key == "string") add(node.key);
|
||||||
} else if (node instanceof AST_Dot) {
|
} else if (node instanceof AST_Dot) {
|
||||||
add(node.property);
|
add(node.property);
|
||||||
|
} else if (node instanceof AST_ObjectProperty) {
|
||||||
|
if (typeof node.key == "string") add(node.key);
|
||||||
} else if (node instanceof AST_Sub) {
|
} else if (node instanceof AST_Sub) {
|
||||||
addStrings(node.property, add);
|
addStrings(node.property, add);
|
||||||
} else if (node instanceof AST_Call
|
|
||||||
&& node.expression.print_to_string() == "Object.defineProperty") {
|
|
||||||
addStrings(node.args[1], add);
|
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
|
||||||
// step 2: transform the tree, renaming properties
|
// step 2: renaming properties
|
||||||
return ast.transform(new TreeTransformer(function(node) {
|
ast.walk(new TreeWalker(function(node) {
|
||||||
if (node instanceof AST_ObjectKeyVal) {
|
if (node instanceof AST_Binary) {
|
||||||
node.key = mangle(node.key);
|
if (node.operator == "in") mangleStrings(node.left);
|
||||||
} else if (node instanceof AST_ObjectProperty) {
|
} else if (node.TYPE == "Call") {
|
||||||
// setter or getter
|
var exp = node.expression;
|
||||||
node.key.name = mangle(node.key.name);
|
if (exp instanceof AST_Dot) switch (exp.property) {
|
||||||
|
case "defineProperty":
|
||||||
|
case "getOwnPropertyDescriptor":
|
||||||
|
if (node.args.length < 2) break;
|
||||||
|
exp = exp.expression;
|
||||||
|
if (!(exp instanceof AST_SymbolRef)) break;
|
||||||
|
if (exp.name != "Object") break;
|
||||||
|
if (!exp.definition().undeclared) break;
|
||||||
|
mangleStrings(node.args[1]);
|
||||||
|
break;
|
||||||
|
case "hasOwnProperty":
|
||||||
|
if (node.args.length < 1) break;
|
||||||
|
mangleStrings(node.args[0]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if (node instanceof AST_ClassProperty) {
|
||||||
|
if (typeof node.key == "string") node.key = mangle(node.key);
|
||||||
} else if (node instanceof AST_Dot) {
|
} else if (node instanceof AST_Dot) {
|
||||||
node.property = mangle(node.property);
|
node.property = mangle(node.property);
|
||||||
} else if (!options.keep_quoted && node instanceof AST_Sub) {
|
} else if (node instanceof AST_ObjectProperty) {
|
||||||
node.property = mangleStrings(node.property);
|
if (typeof node.key == "string") node.key = mangle(node.key);
|
||||||
} else if (node instanceof AST_Call
|
} else if (node instanceof AST_Sub) {
|
||||||
&& node.expression.print_to_string() == "Object.defineProperty") {
|
if (!options.keep_quoted) mangleStrings(node.property);
|
||||||
node.args[1] = mangleStrings(node.args[1]);
|
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
|
||||||
// only function declarations after this line
|
// only function declarations after this line
|
||||||
|
|
||||||
function can_mangle(name) {
|
function can_mangle(name) {
|
||||||
if (unmangleable.indexOf(name) >= 0) return false;
|
if (unmangleable[name]) return false;
|
||||||
if (reserved.indexOf(name) >= 0) return false;
|
|
||||||
if (options.only_cache) return cache.has(name);
|
|
||||||
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 (regex && !regex.test(name)) return false;
|
if (regex && !regex.test(name)) return false;
|
||||||
if (reserved.indexOf(name) >= 0) return false;
|
return cache.has(name) || names_to_mangle[name];
|
||||||
return cache.has(name) || names_to_mangle.indexOf(name) >= 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function add(name) {
|
function add(name) {
|
||||||
if (can_mangle(name)) push_uniq(names_to_mangle, name);
|
if (can_mangle(name)) names_to_mangle[name] = true;
|
||||||
if (!should_mangle(name)) push_uniq(unmangleable, name);
|
if (!should_mangle(name)) unmangleable[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;
|
||||||
}
|
}
|
||||||
@@ -212,23 +240,20 @@ function mangle_properties(ast, options) {
|
|||||||
if (!mangled) do {
|
if (!mangled) do {
|
||||||
mangled = base54(++cname);
|
mangled = base54(++cname);
|
||||||
} while (!can_mangle(mangled));
|
} while (!can_mangle(mangled));
|
||||||
|
if (/^#/.test(name)) mangled = "#" + mangled;
|
||||||
cache.set(name, mangled);
|
cache.set(name, mangled);
|
||||||
}
|
}
|
||||||
return mangled;
|
return mangled;
|
||||||
}
|
}
|
||||||
|
|
||||||
function mangleStrings(node) {
|
function mangleStrings(node) {
|
||||||
return node.transform(new TreeTransformer(function(node) {
|
if (node instanceof AST_Sequence) {
|
||||||
if (node instanceof AST_Sequence) {
|
mangleStrings(node.expressions.tail_node());
|
||||||
var last = node.expressions.length - 1;
|
} else if (node instanceof AST_String) {
|
||||||
node.expressions[last] = mangleStrings(node.expressions[last]);
|
node.value = mangle(node.value);
|
||||||
} else if (node instanceof AST_String) {
|
} else if (node instanceof AST_Conditional) {
|
||||||
node.value = mangle(node.value);
|
mangleStrings(node.consequent);
|
||||||
} else if (node instanceof AST_Conditional) {
|
mangleStrings(node.alternative);
|
||||||
node.consequent = mangleStrings(node.consequent);
|
}
|
||||||
node.alternative = mangleStrings(node.alternative);
|
|
||||||
}
|
|
||||||
return node;
|
|
||||||
}));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
492
lib/scope.js
492
lib/scope.js
@@ -1,7 +1,7 @@
|
|||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
|
||||||
A JavaScript tokenizer / parser / beautifier / compressor.
|
A JavaScript tokenizer / parser / beautifier / compressor.
|
||||||
https://github.com/mishoo/UglifyJS2
|
https://github.com/mishoo/UglifyJS
|
||||||
|
|
||||||
-------------------------------- (C) ---------------------------------
|
-------------------------------- (C) ---------------------------------
|
||||||
|
|
||||||
@@ -45,10 +45,10 @@
|
|||||||
|
|
||||||
function SymbolDef(id, scope, orig, init) {
|
function SymbolDef(id, scope, orig, init) {
|
||||||
this.eliminated = 0;
|
this.eliminated = 0;
|
||||||
|
this.exported = false;
|
||||||
this.global = false;
|
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 ];
|
||||||
@@ -59,24 +59,20 @@ function SymbolDef(id, scope, orig, init) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SymbolDef.prototype = {
|
SymbolDef.prototype = {
|
||||||
unmangleable: function(options) {
|
forEach: function(fn) {
|
||||||
return this.global && !options.toplevel
|
this.orig.forEach(fn);
|
||||||
|| this.undeclared
|
this.references.forEach(fn);
|
||||||
|| !options.eval && this.scope.pinned()
|
|
||||||
|| options.keep_fnames
|
|
||||||
&& (this.orig[0] instanceof AST_SymbolLambda
|
|
||||||
|| this.orig[0] instanceof AST_SymbolDefun);
|
|
||||||
},
|
},
|
||||||
mangle: function(options) {
|
mangle: function(options) {
|
||||||
var cache = options.cache && options.cache.props;
|
var cache = options.cache && options.cache.props;
|
||||||
if (this.global && cache && cache.has(this.name)) {
|
if (this.global && 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.mangled_name && !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) {
|
if (this.global && cache) {
|
||||||
cache.set(this.name, this.mangled_name);
|
cache.set(this.name, this.mangled_name);
|
||||||
@@ -84,10 +80,40 @@ SymbolDef.prototype = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
redefined: function() {
|
redefined: function() {
|
||||||
return this.defun && this.defun.variables.get(this.name);
|
var scope = this.defun;
|
||||||
}
|
if (!scope) return;
|
||||||
|
var name = this.name;
|
||||||
|
var def = scope.variables.get(name)
|
||||||
|
|| scope instanceof AST_Toplevel && scope.globals.get(name)
|
||||||
|
|| this.orig[0] instanceof AST_SymbolConst && find_if(function(def) {
|
||||||
|
return def.name == name;
|
||||||
|
}, scope.enclosed);
|
||||||
|
if (def && def !== this) return def.redefined() || def;
|
||||||
|
},
|
||||||
|
unmangleable: function(options) {
|
||||||
|
return this.global && !options.toplevel
|
||||||
|
|| this.exported
|
||||||
|
|| this.undeclared
|
||||||
|
|| !options.eval && this.scope.pinned()
|
||||||
|
|| options.keep_fnames
|
||||||
|
&& (this.orig[0] instanceof AST_SymbolClass
|
||||||
|
|| this.orig[0] instanceof AST_SymbolDefClass
|
||||||
|
|| this.orig[0] instanceof AST_SymbolDefun
|
||||||
|
|| this.orig[0] instanceof AST_SymbolLambda);
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var unary_side_effects = makePredicate("delete ++ --");
|
||||||
|
|
||||||
|
function is_lhs(node, parent) {
|
||||||
|
if (parent instanceof AST_Assign) return parent.left === node && node;
|
||||||
|
if (parent instanceof AST_DefaultValue) return parent.name === node && node;
|
||||||
|
if (parent instanceof AST_Destructured) return node;
|
||||||
|
if (parent instanceof AST_DestructuredKeyVal) return node;
|
||||||
|
if (parent instanceof AST_ForEnumeration) return parent.init === node && node;
|
||||||
|
if (parent instanceof AST_Unary) return unary_side_effects[parent.operator] && parent.expression;
|
||||||
|
}
|
||||||
|
|
||||||
AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
|
AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
|
||||||
options = defaults(options, {
|
options = defaults(options, {
|
||||||
cache: null,
|
cache: null,
|
||||||
@@ -96,30 +122,71 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
|
|||||||
|
|
||||||
// pass 1: setup scope chaining and handle definitions
|
// pass 1: setup scope chaining and handle definitions
|
||||||
var self = this;
|
var self = this;
|
||||||
var scope = self.parent_scope = null;
|
|
||||||
var defun = null;
|
var defun = null;
|
||||||
|
var exported = false;
|
||||||
|
var next_def_id = 0;
|
||||||
|
var scope = self.parent_scope = null;
|
||||||
var tw = new TreeWalker(function(node, descend) {
|
var tw = new TreeWalker(function(node, descend) {
|
||||||
if (node instanceof AST_Catch) {
|
if (node instanceof AST_DefClass) {
|
||||||
var save_scope = scope;
|
var save_exported = exported;
|
||||||
scope = new AST_Scope(node);
|
exported = tw.parent() instanceof AST_ExportDeclaration;
|
||||||
scope.init_scope_vars(save_scope);
|
node.name.walk(tw);
|
||||||
descend();
|
exported = save_exported;
|
||||||
scope = save_scope;
|
walk_scope(function() {
|
||||||
|
if (node.extends) node.extends.walk(tw);
|
||||||
|
node.properties.forEach(function(prop) {
|
||||||
|
prop.walk(tw);
|
||||||
|
});
|
||||||
|
});
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (node instanceof AST_Scope) {
|
if (node instanceof AST_Definitions) {
|
||||||
node.init_scope_vars(scope);
|
var save_exported = exported;
|
||||||
var save_scope = scope;
|
exported = tw.parent() instanceof AST_ExportDeclaration;
|
||||||
var save_defun = defun;
|
|
||||||
defun = scope = node;
|
|
||||||
descend();
|
descend();
|
||||||
scope = save_scope;
|
exported = save_exported;
|
||||||
defun = save_defun;
|
return true;
|
||||||
|
}
|
||||||
|
if (node instanceof AST_LambdaDefinition) {
|
||||||
|
var save_exported = exported;
|
||||||
|
exported = tw.parent() instanceof AST_ExportDeclaration;
|
||||||
|
node.name.walk(tw);
|
||||||
|
exported = save_exported;
|
||||||
|
walk_scope(function() {
|
||||||
|
node.argnames.forEach(function(argname) {
|
||||||
|
argname.walk(tw);
|
||||||
|
});
|
||||||
|
if (node.rest) node.rest.walk(tw);
|
||||||
|
walk_body(node, tw);
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (node instanceof AST_SwitchBranch) {
|
||||||
|
node.init_vars(scope);
|
||||||
|
descend();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (node instanceof AST_Try) {
|
||||||
|
walk_scope(function() {
|
||||||
|
walk_body(node, tw);
|
||||||
|
});
|
||||||
|
if (node.bcatch) node.bcatch.walk(tw);
|
||||||
|
if (node.bfinally) node.bfinally.walk(tw);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (node instanceof AST_With) {
|
if (node instanceof AST_With) {
|
||||||
for (var s = scope; s; s = s.parent_scope) s.uses_with = true;
|
var s = scope;
|
||||||
return;
|
do {
|
||||||
|
s = s.resolve();
|
||||||
|
if (s.uses_with) break;
|
||||||
|
s.uses_with = true;
|
||||||
|
} while (s = s.parent_scope);
|
||||||
|
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;
|
||||||
@@ -128,68 +195,157 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
|
|||||||
node.thedef = node;
|
node.thedef = node;
|
||||||
node.references = [];
|
node.references = [];
|
||||||
}
|
}
|
||||||
if (node instanceof AST_SymbolDefun) {
|
if (node instanceof AST_SymbolCatch) {
|
||||||
// This should be defined in the parent scope, as we encounter the
|
scope.def_variable(node).defun = defun;
|
||||||
// AST_Defun node before getting to its AST_Symbol.
|
} else if (node instanceof AST_SymbolConst) {
|
||||||
(node.scope = defun.parent_scope.resolve()).def_function(node, defun);
|
var def = scope.def_variable(node);
|
||||||
|
def.defun = defun;
|
||||||
|
if (exported) def.exported = true;
|
||||||
|
} else if (node instanceof AST_SymbolDefun) {
|
||||||
|
var def = defun.def_function(node, tw.parent());
|
||||||
|
if (exported) def.exported = true;
|
||||||
|
entangle(defun, scope);
|
||||||
|
} else if (node instanceof AST_SymbolFunarg) {
|
||||||
|
defun.def_variable(node);
|
||||||
|
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.ie8) 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, node.TYPE == "SymbolVar" ? null : undefined);
|
var def = defun.def_variable(node, node instanceof AST_SymbolImport ? undefined : null);
|
||||||
if (defun !== scope) {
|
if (exported) def.exported = true;
|
||||||
node.mark_enclosed(options);
|
entangle(defun, scope);
|
||||||
var def = scope.find_variable(node);
|
}
|
||||||
if (node.thedef !== def) {
|
|
||||||
node.thedef = def;
|
function walk_scope(descend) {
|
||||||
}
|
node.init_vars(scope);
|
||||||
node.reference(options);
|
var save_defun = defun;
|
||||||
}
|
var save_scope = scope;
|
||||||
} else if (node instanceof AST_SymbolCatch) {
|
if (node instanceof AST_Scope) defun = node;
|
||||||
scope.def_variable(node).defun = defun;
|
scope = node;
|
||||||
|
descend();
|
||||||
|
scope = save_scope;
|
||||||
|
defun = save_defun;
|
||||||
|
}
|
||||||
|
|
||||||
|
function entangle(defun, scope) {
|
||||||
|
if (defun === scope) return;
|
||||||
|
node.mark_enclosed(options);
|
||||||
|
var def = scope.find_variable(node.name);
|
||||||
|
if (node.thedef === def) return;
|
||||||
|
node.thedef = def;
|
||||||
|
def.orig.push(node);
|
||||||
|
node.mark_enclosed(options);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
self.next_def_id = 0;
|
self.make_def = function(orig, init) {
|
||||||
|
return new SymbolDef(++next_def_id, this, orig, init);
|
||||||
|
};
|
||||||
self.walk(tw);
|
self.walk(tw);
|
||||||
|
|
||||||
// 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);
|
||||||
|
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) {
|
||||||
|
push_uniq(s.enclosed, redef);
|
||||||
|
if (s === redef.scope) break;
|
||||||
|
}
|
||||||
|
} else if (node instanceof AST_SymbolConst) {
|
||||||
|
// ensure compression works if `const` reuses a scope variable
|
||||||
|
var redef = def.redefined();
|
||||||
|
if (redef) redef.const_redefs = true;
|
||||||
|
}
|
||||||
|
if (node.name != "arguments") return true;
|
||||||
|
var parent = node instanceof AST_SymbolVar && tw.parent();
|
||||||
|
if (parent instanceof AST_VarDef && !parent.value) return true;
|
||||||
|
var sym = node.scope.resolve().find_variable("arguments");
|
||||||
|
if (sym && is_arguments(sym)) sym.scope.uses_arguments = 3;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
if (node instanceof AST_SymbolRef) {
|
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 (sym.scope instanceof AST_Lambda && name == "arguments") {
|
} else if (name == "arguments" && is_arguments(sym)) {
|
||||||
sym.scope.uses_arguments = true;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
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) {
|
||||||
for (var s = node.scope; s && !s.uses_eval; s = s.parent_scope) {
|
var s = node.scope;
|
||||||
|
do {
|
||||||
|
s = s.resolve();
|
||||||
|
if (s.uses_eval) break;
|
||||||
s.uses_eval = true;
|
s.uses_eval = true;
|
||||||
}
|
} while (s = s.parent_scope);
|
||||||
} else if (sym.undeclared) {
|
} else if (sym.undeclared) {
|
||||||
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);
|
||||||
|
|
||||||
@@ -205,8 +361,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") {
|
delete def.defun;
|
||||||
|
} 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;
|
||||||
@@ -215,13 +372,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);
|
||||||
}
|
}
|
||||||
@@ -230,21 +396,17 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
|
|||||||
} else {
|
} else {
|
||||||
new_def = scope.def_variable(node);
|
new_def = scope.def_variable(node);
|
||||||
}
|
}
|
||||||
old_def.orig.concat(old_def.references).forEach(function(node) {
|
old_def.defun = new_def.scope;
|
||||||
|
old_def.forEach(function(node) {
|
||||||
|
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;
|
|
||||||
if (new_def.undeclared) self.variables.set(name, new_def);
|
if (new_def.undeclared) self.variables.set(name, new_def);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Scope.DEFMETHOD("make_def", function(orig, init) {
|
|
||||||
var top = this;
|
|
||||||
while (top.parent_scope) top = top.parent_scope;
|
|
||||||
return new SymbolDef(++top.next_def_id, this, orig, init);
|
|
||||||
});
|
|
||||||
|
|
||||||
AST_Toplevel.DEFMETHOD("def_global", function(node) {
|
AST_Toplevel.DEFMETHOD("def_global", function(node) {
|
||||||
var globals = this.globals, name = node.name;
|
var globals = this.globals, name = node.name;
|
||||||
if (globals.has(name)) {
|
if (globals.has(name)) {
|
||||||
@@ -258,31 +420,51 @@ AST_Toplevel.DEFMETHOD("def_global", function(node) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Scope.DEFMETHOD("init_scope_vars", function(parent_scope) {
|
function init_block_vars(scope, parent) {
|
||||||
this.variables = new Dictionary(); // map name to AST_SymbolVar (variables defined in this scope; includes functions)
|
scope.enclosed = []; // variables from this or outer scope(s) that are referenced from this or inner scopes
|
||||||
this.functions = new Dictionary(); // map name to AST_SymbolDefun (functions defined in this scope)
|
scope.parent_scope = parent; // the parent scope (null if this is the top level)
|
||||||
this.uses_with = false; // will be set to true if this or some nested scope uses the `with` statement
|
scope.functions = new Dictionary(); // map name to AST_SymbolDefun (functions defined in this scope)
|
||||||
this.uses_eval = false; // will be set to true if this or nested scope uses the global `eval`
|
scope.variables = new Dictionary(); // map name to AST_SymbolVar (variables defined in this scope; includes functions)
|
||||||
this.parent_scope = parent_scope; // the parent scope
|
if (parent) scope.make_def = parent.make_def; // top-level tracking of SymbolDef instances
|
||||||
this.enclosed = []; // a list of variables from this or outer scope(s) that are referenced from this or inner scopes
|
}
|
||||||
this.cname = -1; // the current index for mangling functions/variables
|
|
||||||
});
|
|
||||||
|
|
||||||
AST_Lambda.DEFMETHOD("init_scope_vars", function() {
|
function init_scope_vars(scope, parent) {
|
||||||
AST_Scope.prototype.init_scope_vars.apply(this, arguments);
|
init_block_vars(scope, parent);
|
||||||
|
scope.uses_eval = false; // 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
|
||||||
|
}
|
||||||
|
|
||||||
|
AST_BlockScope.DEFMETHOD("init_vars", function(parent_scope) {
|
||||||
|
init_block_vars(this, parent_scope);
|
||||||
|
});
|
||||||
|
AST_Scope.DEFMETHOD("init_vars", function(parent_scope) {
|
||||||
|
init_scope_vars(this, parent_scope);
|
||||||
|
});
|
||||||
|
AST_Arrow.DEFMETHOD("init_vars", function(parent_scope) {
|
||||||
|
init_scope_vars(this, parent_scope);
|
||||||
|
return this;
|
||||||
|
});
|
||||||
|
AST_AsyncArrow.DEFMETHOD("init_vars", function(parent_scope) {
|
||||||
|
init_scope_vars(this, parent_scope);
|
||||||
|
});
|
||||||
|
AST_Lambda.DEFMETHOD("init_vars", function(parent_scope) {
|
||||||
|
init_scope_vars(this, parent_scope);
|
||||||
this.uses_arguments = false;
|
this.uses_arguments = false;
|
||||||
this.def_variable(new AST_SymbolFunarg({
|
this.def_variable(new AST_SymbolFunarg({
|
||||||
name: "arguments",
|
name: "arguments",
|
||||||
start: this.start,
|
start: this.start,
|
||||||
end: this.end
|
end: this.end,
|
||||||
}));
|
}));
|
||||||
|
return this;
|
||||||
});
|
});
|
||||||
|
|
||||||
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);
|
push_uniq(s.enclosed, def);
|
||||||
if (options.keep_fnames) {
|
if (!options) {
|
||||||
|
delete s._var_names;
|
||||||
|
} else if (options.keep_fnames) {
|
||||||
s.functions.each(function(d) {
|
s.functions.each(function(d) {
|
||||||
push_uniq(def.scope.enclosed, d);
|
push_uniq(def.scope.enclosed, d);
|
||||||
});
|
});
|
||||||
@@ -296,24 +478,23 @@ AST_Symbol.DEFMETHOD("reference", function(options) {
|
|||||||
this.mark_enclosed(options);
|
this.mark_enclosed(options);
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Scope.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_Scope.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;
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Scope.DEFMETHOD("def_variable", function(symbol, init) {
|
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);
|
||||||
@@ -322,17 +503,12 @@ AST_Scope.DEFMETHOD("def_variable", function(symbol, init) {
|
|||||||
return symbol.thedef = def;
|
return symbol.thedef = def;
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Lambda.DEFMETHOD("resolve", return_this);
|
|
||||||
AST_Scope.DEFMETHOD("resolve", function() {
|
|
||||||
return this.parent_scope.resolve();
|
|
||||||
});
|
|
||||||
AST_Toplevel.DEFMETHOD("resolve", return_this);
|
|
||||||
|
|
||||||
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(scope.mangled_names || null);
|
scope.cname = -1;
|
||||||
scope.cname_holes = [];
|
scope.cname_holes = [];
|
||||||
|
scope.names_in_use = names = Object.create(null);
|
||||||
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[def.name] = true;
|
||||||
@@ -344,12 +520,13 @@ function names_in_use(scope, options) {
|
|||||||
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 = Object.create(null);
|
||||||
var scopes = [ scope ];
|
var scopes = [ scope ];
|
||||||
def.references.forEach(function(sym) {
|
def.forEach(function(sym) {
|
||||||
var scope = sym.scope;
|
var scope = sym.scope;
|
||||||
do {
|
do {
|
||||||
if (scopes.indexOf(scope) < 0) {
|
if (scopes.indexOf(scope) < 0) {
|
||||||
@@ -365,7 +542,7 @@ function next_mangled_name(scope, options, def) {
|
|||||||
name = base54(holes[i]);
|
name = base54(holes[i]);
|
||||||
if (names[name]) continue;
|
if (names[name]) continue;
|
||||||
holes.splice(i, 1);
|
holes.splice(i, 1);
|
||||||
scope.names_in_use[name] = true;
|
in_use[name] = true;
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
while (true) {
|
while (true) {
|
||||||
@@ -374,7 +551,7 @@ function next_mangled_name(scope, options, def) {
|
|||||||
if (!names[name]) break;
|
if (!names[name]) break;
|
||||||
holes.push(scope.cname);
|
holes.push(scope.cname);
|
||||||
}
|
}
|
||||||
scope.names_in_use[name] = true;
|
in_use[name] = true;
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -386,18 +563,10 @@ AST_Symbol.DEFMETHOD("unmangleable", function(options) {
|
|||||||
// labels are always mangleable
|
// labels are always mangleable
|
||||||
AST_Label.DEFMETHOD("unmangleable", return_false);
|
AST_Label.DEFMETHOD("unmangleable", return_false);
|
||||||
|
|
||||||
AST_Symbol.DEFMETHOD("unreferenced", function() {
|
|
||||||
return !this.definition().references.length && !this.scope.pinned();
|
|
||||||
});
|
|
||||||
|
|
||||||
AST_Symbol.DEFMETHOD("definition", function() {
|
AST_Symbol.DEFMETHOD("definition", function() {
|
||||||
return this.thedef;
|
return this.thedef;
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Symbol.DEFMETHOD("global", function() {
|
|
||||||
return this.definition().global;
|
|
||||||
});
|
|
||||||
|
|
||||||
function _default_mangler_options(options) {
|
function _default_mangler_options(options) {
|
||||||
options = defaults(options, {
|
options = defaults(options, {
|
||||||
eval : false,
|
eval : false,
|
||||||
@@ -405,6 +574,8 @@ function _default_mangler_options(options) {
|
|||||||
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
|
||||||
@@ -423,7 +594,7 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options) {
|
|||||||
var lname = -1;
|
var lname = -1;
|
||||||
|
|
||||||
if (options.cache && options.cache.props) {
|
if (options.cache && options.cache.props) {
|
||||||
var mangled_names = this.mangled_names = Object.create(null);
|
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[mangled_name] = true;
|
||||||
});
|
});
|
||||||
@@ -435,10 +606,29 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options) {
|
|||||||
// lname is incremented when we get to the AST_Label
|
// lname is incremented when we get to the AST_Label
|
||||||
var save_nesting = lname;
|
var save_nesting = lname;
|
||||||
descend();
|
descend();
|
||||||
lname = save_nesting;
|
if (!options.v8 || !in_label(tw)) lname = save_nesting;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (node instanceof AST_Scope) {
|
if (node instanceof AST_BlockScope) {
|
||||||
|
if (options.webkit && node instanceof AST_IterationStatement && node.init instanceof AST_Let) {
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
node.to_mangle = [];
|
||||||
|
node.variables.each(function(def) {
|
||||||
|
if (!defer_redef(def)) node.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);
|
||||||
@@ -448,9 +638,7 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options) {
|
|||||||
sym.scope = node;
|
sym.scope = node;
|
||||||
sym.reference(options);
|
sym.reference(options);
|
||||||
}
|
}
|
||||||
node.variables.each(function(def) {
|
node.to_mangle.forEach(mangle);
|
||||||
if (!defer_redef(def)) mangle(def);
|
|
||||||
});
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (node instanceof AST_Label) {
|
if (node instanceof AST_Label) {
|
||||||
@@ -461,13 +649,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) {
|
|
||||||
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);
|
||||||
@@ -477,12 +658,20 @@ 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);
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
function reference(sym) {
|
function reference(sym) {
|
||||||
@@ -491,16 +680,23 @@ 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) {
|
||||||
var cache = options.cache && options.cache.props;
|
var cache = options.cache && options.cache.props;
|
||||||
var avoid = Object.create(null);
|
var avoid = Object.create(RESERVED_WORDS);
|
||||||
options.reserved.forEach(to_avoid);
|
options.reserved.forEach(to_avoid);
|
||||||
this.globals.each(add_def);
|
this.globals.each(add_def);
|
||||||
this.walk(new TreeWalker(function(node) {
|
this.walk(new TreeWalker(function(node) {
|
||||||
if (node instanceof AST_Scope) node.variables.each(add_def);
|
if (node instanceof AST_BlockScope) node.variables.each(add_def);
|
||||||
if (node instanceof AST_SymbolCatch) add_def(node.definition());
|
|
||||||
}));
|
}));
|
||||||
return avoid;
|
return avoid;
|
||||||
|
|
||||||
@@ -524,15 +720,14 @@ AST_Toplevel.DEFMETHOD("expand_names", function(options) {
|
|||||||
var cname = 0;
|
var cname = 0;
|
||||||
this.globals.each(rename);
|
this.globals.each(rename);
|
||||||
this.walk(new TreeWalker(function(node) {
|
this.walk(new TreeWalker(function(node) {
|
||||||
if (node instanceof AST_Scope) node.variables.each(rename);
|
if (node instanceof AST_BlockScope) node.variables.each(rename);
|
||||||
if (node instanceof AST_SymbolCatch) rename(node.definition());
|
|
||||||
}));
|
}));
|
||||||
|
|
||||||
function next_name() {
|
function next_name() {
|
||||||
var name;
|
var name;
|
||||||
do {
|
do {
|
||||||
name = base54(cname++);
|
name = base54(cname++);
|
||||||
} while (avoid[name] || RESERVED_WORDS[name]);
|
} while (avoid[name]);
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -543,11 +738,8 @@ AST_Toplevel.DEFMETHOD("expand_names", function(options) {
|
|||||||
var redef = def.redefined();
|
var redef = def.redefined();
|
||||||
var name = redef ? redef.rename || redef.name : next_name();
|
var name = redef ? redef.rename || redef.name : next_name();
|
||||||
def.rename = name;
|
def.rename = name;
|
||||||
def.orig.forEach(function(sym) {
|
def.forEach(function(sym) {
|
||||||
sym.name = name;
|
if (sym.definition() === def) sym.name = name;
|
||||||
});
|
|
||||||
def.references.forEach(function(sym) {
|
|
||||||
sym.name = name;
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -560,22 +752,24 @@ AST_Sequence.DEFMETHOD("tail_node", function() {
|
|||||||
AST_Toplevel.DEFMETHOD("compute_char_frequency", function(options) {
|
AST_Toplevel.DEFMETHOD("compute_char_frequency", function(options) {
|
||||||
options = _default_mangler_options(options);
|
options = _default_mangler_options(options);
|
||||||
base54.reset();
|
base54.reset();
|
||||||
|
var fn = AST_Symbol.prototype.add_source_map;
|
||||||
try {
|
try {
|
||||||
AST_Node.prototype.print = function(stream, force_parens) {
|
AST_Symbol.prototype.add_source_map = function() {
|
||||||
this._print(stream, force_parens);
|
if (!this.unmangleable(options)) base54.consider(this.name, -1);
|
||||||
if (this instanceof AST_Symbol && !this.unmangleable(options)) {
|
|
||||||
base54.consider(this.name, -1);
|
|
||||||
} else if (options.properties) {
|
|
||||||
if (this instanceof AST_Dot) {
|
|
||||||
base54.consider(this.property, -1);
|
|
||||||
} else if (this instanceof AST_Sub) {
|
|
||||||
skip_string(this.property);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
if (options.properties) {
|
||||||
|
AST_Dot.prototype.add_source_map = function() {
|
||||||
|
base54.consider(this.property, -1);
|
||||||
|
};
|
||||||
|
AST_Sub.prototype.add_source_map = function() {
|
||||||
|
skip_string(this.property);
|
||||||
|
};
|
||||||
|
}
|
||||||
base54.consider(this.print_to_string(), 1);
|
base54.consider(this.print_to_string(), 1);
|
||||||
} finally {
|
} finally {
|
||||||
AST_Node.prototype.print = AST_Node.prototype._print;
|
AST_Symbol.prototype.add_source_map = fn;
|
||||||
|
delete AST_Dot.prototype.add_source_map;
|
||||||
|
delete AST_Sub.prototype.add_source_map;
|
||||||
}
|
}
|
||||||
base54.sort();
|
base54.sort();
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
|
||||||
A JavaScript tokenizer / parser / beautifier / compressor.
|
A JavaScript tokenizer / parser / beautifier / compressor.
|
||||||
https://github.com/mishoo/UglifyJS2
|
https://github.com/mishoo/UglifyJS
|
||||||
|
|
||||||
-------------------------------- (C) ---------------------------------
|
-------------------------------- (C) ---------------------------------
|
||||||
|
|
||||||
@@ -144,7 +144,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 (!(source in sources_content)) {
|
||||||
|
sources_content[source] = content;
|
||||||
|
}
|
||||||
} : noop,
|
} : noop,
|
||||||
toString: function() {
|
toString: function() {
|
||||||
return JSON.stringify({
|
return JSON.stringify({
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
|
||||||
A JavaScript tokenizer / parser / beautifier / compressor.
|
A JavaScript tokenizer / parser / beautifier / compressor.
|
||||||
https://github.com/mishoo/UglifyJS2
|
https://github.com/mishoo/UglifyJS
|
||||||
|
|
||||||
-------------------------------- (C) ---------------------------------
|
-------------------------------- (C) ---------------------------------
|
||||||
|
|
||||||
@@ -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);
|
||||||
@@ -116,7 +116,7 @@ TreeTransformer.prototype = new TreeWalker;
|
|||||||
if (self.bfinally) self.bfinally = self.bfinally.transform(tw);
|
if (self.bfinally) self.bfinally = self.bfinally.transform(tw);
|
||||||
});
|
});
|
||||||
DEF(AST_Catch, function(self, tw) {
|
DEF(AST_Catch, function(self, tw) {
|
||||||
self.argname = self.argname.transform(tw);
|
if (self.argname) self.argname = self.argname.transform(tw);
|
||||||
self.body = do_list(self.body, tw);
|
self.body = do_list(self.body, tw);
|
||||||
});
|
});
|
||||||
DEF(AST_Definitions, function(self, tw) {
|
DEF(AST_Definitions, function(self, 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;
|
||||||
|
|||||||
76
lib/utils.js
76
lib/utils.js
@@ -1,7 +1,7 @@
|
|||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
|
||||||
A JavaScript tokenizer / parser / beautifier / compressor.
|
A JavaScript tokenizer / parser / beautifier / compressor.
|
||||||
https://github.com/mishoo/UglifyJS2
|
https://github.com/mishoo/UglifyJS
|
||||||
|
|
||||||
-------------------------------- (C) ---------------------------------
|
-------------------------------- (C) ---------------------------------
|
||||||
|
|
||||||
@@ -112,48 +112,29 @@ function return_this() { return this; }
|
|||||||
function return_null() { return null; }
|
function return_null() { return null; }
|
||||||
|
|
||||||
var List = (function() {
|
var List = (function() {
|
||||||
function List(a, f, backwards) {
|
function List(a, f) {
|
||||||
var ret = [], top = [], i;
|
var ret = [];
|
||||||
function doit() {
|
for (var i = 0; i < a.length; i++) {
|
||||||
var val = f(a[i], i);
|
var val = f(a[i], i);
|
||||||
var is_last = val instanceof Last;
|
if (val === skip) continue;
|
||||||
if (is_last) val = val.v;
|
if (val instanceof Splice) {
|
||||||
if (val instanceof AtTop) {
|
ret.push.apply(ret, val.v);
|
||||||
val = val.v;
|
|
||||||
if (val instanceof Splice) {
|
|
||||||
top.push.apply(top, backwards ? val.v.slice().reverse() : val.v);
|
|
||||||
} else {
|
|
||||||
top.push(val);
|
|
||||||
}
|
|
||||||
} else if (val !== skip) {
|
|
||||||
if (val instanceof Splice) {
|
|
||||||
ret.push.apply(ret, backwards ? val.v.slice().reverse() : val.v);
|
|
||||||
} else {
|
|
||||||
ret.push(val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return is_last;
|
|
||||||
}
|
|
||||||
if (Array.isArray(a)) {
|
|
||||||
if (backwards) {
|
|
||||||
for (i = a.length; --i >= 0;) if (doit()) break;
|
|
||||||
ret.reverse();
|
|
||||||
top.reverse();
|
|
||||||
} else {
|
} else {
|
||||||
for (i = 0; i < a.length; ++i) if (doit()) break;
|
ret.push(val);
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
for (i in a) if (HOP(a, i)) if (doit()) break;
|
|
||||||
}
|
}
|
||||||
return top.concat(ret);
|
return ret;
|
||||||
}
|
}
|
||||||
List.at_top = function(val) { return new AtTop(val); };
|
List.is_op = function(val) {
|
||||||
List.splice = function(val) { return new Splice(val); };
|
return val === skip || val instanceof Splice;
|
||||||
List.last = function(val) { return new Last(val); };
|
};
|
||||||
|
List.splice = function(val) {
|
||||||
|
return new Splice(val);
|
||||||
|
};
|
||||||
var skip = List.skip = {};
|
var skip = List.skip = {};
|
||||||
function AtTop(val) { this.v = val; }
|
function Splice(val) {
|
||||||
function Splice(val) { this.v = val; }
|
this.v = val;
|
||||||
function Last(val) { this.v = val; }
|
}
|
||||||
return List;
|
return List;
|
||||||
})();
|
})();
|
||||||
|
|
||||||
@@ -162,8 +143,9 @@ 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 = props[p];
|
||||||
|
return value instanceof AST_Node ? value.print_to_string() : value;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -256,21 +238,27 @@ 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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.9.2",
|
"version": "3.13.5",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.8.0"
|
"node": ">=0.8.0"
|
||||||
},
|
},
|
||||||
@@ -11,7 +11,7 @@
|
|||||||
"Alex Lam <alexlamsl@gmail.com>",
|
"Alex Lam <alexlamsl@gmail.com>",
|
||||||
"Mihai Bazon <mihai.bazon@gmail.com> (http://lisperator.net/)"
|
"Mihai Bazon <mihai.bazon@gmail.com> (http://lisperator.net/)"
|
||||||
],
|
],
|
||||||
"repository": "mishoo/UglifyJS2",
|
"repository": "mishoo/UglifyJS",
|
||||||
"main": "tools/node.js",
|
"main": "tools/node.js",
|
||||||
"bin": {
|
"bin": {
|
||||||
"uglifyjs": "bin/uglifyjs"
|
"uglifyjs": "bin/uglifyjs"
|
||||||
@@ -22,11 +22,8 @@
|
|||||||
"tools",
|
"tools",
|
||||||
"LICENSE"
|
"LICENSE"
|
||||||
],
|
],
|
||||||
"dependencies": {
|
|
||||||
"commander": "~2.20.3"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"acorn": "~7.1.0",
|
"acorn": "~8.2.1",
|
||||||
"semver": "~6.3.0"
|
"semver": "~6.3.0"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ var fetch = require("./fetch");
|
|||||||
var spawn = require("child_process").spawn;
|
var spawn = require("child_process").spawn;
|
||||||
var zlib = require("zlib");
|
var zlib = require("zlib");
|
||||||
var args = process.argv.slice(2);
|
var args = process.argv.slice(2);
|
||||||
args.unshift("bin/uglifyjs");
|
|
||||||
if (!args.length) args.push("-mc");
|
if (!args.length) args.push("-mc");
|
||||||
|
args.unshift("bin/uglifyjs");
|
||||||
args.push("--timings");
|
args.push("--timings");
|
||||||
var urls = [
|
var urls = [
|
||||||
"https://code.jquery.com/jquery-3.4.1.js",
|
"https://code.jquery.com/jquery-3.4.1.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).");
|
||||||
@@ -63,7 +68,6 @@ function make_code(ast, options) {
|
|||||||
|
|
||||||
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/UglifyJS2/issues/348
|
|
||||||
try {
|
try {
|
||||||
var ast = U.parse(script, {
|
var ast = U.parse(script, {
|
||||||
filename: file
|
filename: file
|
||||||
@@ -188,6 +192,7 @@ function reminify(orig_options, input_code, input_formatted, stdout) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
var options_formatted = JSON.stringify(options, null, 4);
|
var options_formatted = JSON.stringify(options, null, 4);
|
||||||
|
options.validate = true;
|
||||||
var result = U.minify(input_code, options);
|
var result = U.minify(input_code, options);
|
||||||
if (result.error) {
|
if (result.error) {
|
||||||
log([
|
log([
|
||||||
@@ -209,7 +214,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 = sandbox.run_code(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;
|
||||||
}
|
}
|
||||||
@@ -244,13 +249,9 @@ function reminify(orig_options, input_code, input_formatted, stdout) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
function run_code(code, toplevel) {
|
|
||||||
var result = sandbox.run_code(code, toplevel);
|
|
||||||
return typeof result == "string" ? result.replace(/\u001b\[\d+m/g, "") : result;
|
|
||||||
}
|
|
||||||
|
|
||||||
function test_case(test) {
|
function test_case(test) {
|
||||||
log(" Running test [{name}]", { name: test.name });
|
log(" Running test [{name}]", { name: test.name });
|
||||||
|
U.AST_Node.enable_validation();
|
||||||
var output_options = test.beautify || {};
|
var output_options = test.beautify || {};
|
||||||
var expect;
|
var expect;
|
||||||
if (test.expect) {
|
if (test.expect) {
|
||||||
@@ -261,12 +262,14 @@ function test_case(test) {
|
|||||||
var input = to_toplevel(test.input, test.mangle);
|
var input = to_toplevel(test.input, test.mangle);
|
||||||
var input_code = make_code(input);
|
var input_code = make_code(input);
|
||||||
var input_formatted = make_code(test.input, {
|
var input_formatted = make_code(test.input, {
|
||||||
|
annotations: true,
|
||||||
beautify: true,
|
beautify: true,
|
||||||
comments: "all",
|
comments: "all",
|
||||||
keep_quoted_props: true,
|
keep_quoted_props: true,
|
||||||
quote_style: 3,
|
quote_style: 3,
|
||||||
});
|
});
|
||||||
try {
|
try {
|
||||||
|
input.validate_ast();
|
||||||
U.parse(input_code);
|
U.parse(input_code);
|
||||||
} catch (ex) {
|
} catch (ex) {
|
||||||
log([
|
log([
|
||||||
@@ -309,12 +312,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 (test.mangle.properties) {
|
if (test.mangle.properties) U.mangle_properties(output, test.mangle.properties);
|
||||||
output = U.mangle_properties(output, test.mangle.properties);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
output = make_code(output, output_options);
|
var output_code = make_code(output, output_options);
|
||||||
if (expect != output) {
|
U.AST_Node.log_function();
|
||||||
|
if (expect != output_code) {
|
||||||
log([
|
log([
|
||||||
"!!! failed",
|
"!!! failed",
|
||||||
"---INPUT---",
|
"---INPUT---",
|
||||||
@@ -327,14 +329,15 @@ function test_case(test) {
|
|||||||
"",
|
"",
|
||||||
].join("\n"), {
|
].join("\n"), {
|
||||||
input: input_formatted,
|
input: input_formatted,
|
||||||
output: output,
|
output: output_code,
|
||||||
expected: expect
|
expected: expect
|
||||||
});
|
});
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// expect == output
|
// expect == output
|
||||||
try {
|
try {
|
||||||
U.parse(output);
|
output.validate_ast();
|
||||||
|
U.parse(output_code);
|
||||||
} catch (ex) {
|
} catch (ex) {
|
||||||
log([
|
log([
|
||||||
"!!! Test matched expected result but cannot parse output",
|
"!!! Test matched expected result but cannot parse output",
|
||||||
@@ -348,7 +351,7 @@ function test_case(test) {
|
|||||||
"",
|
"",
|
||||||
].join("\n"), {
|
].join("\n"), {
|
||||||
input: input_formatted,
|
input: input_formatted,
|
||||||
output: output,
|
output: output_code,
|
||||||
error: ex,
|
error: ex,
|
||||||
});
|
});
|
||||||
return false;
|
return false;
|
||||||
@@ -378,13 +381,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 = [ sandbox.run_code(input_code), sandbox.run_code(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)) {
|
||||||
@@ -407,7 +410,7 @@ function test_case(test) {
|
|||||||
});
|
});
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
actual = run_code(output, toplevel);
|
actual = sandbox.run_code(output_code, toplevel);
|
||||||
if (!sandbox.same_stdout(test.expect_stdout, actual)) {
|
if (!sandbox.same_stdout(test.expect_stdout, actual)) {
|
||||||
log([
|
log([
|
||||||
"!!! failed",
|
"!!! failed",
|
||||||
|
|||||||
473
test/compress/annotations.js
Normal file
473
test/compress/annotations.js
Normal file
@@ -0,0 +1,473 @@
|
|||||||
|
issue_2629_1: {
|
||||||
|
options = {
|
||||||
|
annotations: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
comments: "all",
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
/*@__PURE__*/ a();
|
||||||
|
/*@__PURE__*/ (b());
|
||||||
|
(/*@__PURE__*/ c)();
|
||||||
|
(/*@__PURE__*/ d());
|
||||||
|
}
|
||||||
|
expect_exact: "c();"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2629_2: {
|
||||||
|
options = {
|
||||||
|
annotations: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
comments: "all",
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
/*@__PURE__*/ a(1)(2)(3);
|
||||||
|
/*@__PURE__*/ (b(1))(2)(3);
|
||||||
|
/*@__PURE__*/ (c(1)(2))(3);
|
||||||
|
/*@__PURE__*/ (d(1)(2)(3));
|
||||||
|
(/*@__PURE__*/ e)(1)(2)(3);
|
||||||
|
(/*@__PURE__*/ f(1))(2)(3);
|
||||||
|
(/*@__PURE__*/ g(1)(2))(3);
|
||||||
|
(/*@__PURE__*/ h(1)(2)(3));
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"e(1)(2)(3);",
|
||||||
|
"f(1)(2)(3);",
|
||||||
|
"g(1)(2)(3);",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2629_3: {
|
||||||
|
options = {
|
||||||
|
annotations: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
comments: "all",
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
/*@__PURE__*/ a.x(1).y(2).z(3);
|
||||||
|
/*@__PURE__*/ (b.x)(1).y(2).z(3);
|
||||||
|
/*@__PURE__*/ (c.x(1)).y(2).z(3);
|
||||||
|
/*@__PURE__*/ (d.x(1).y)(2).z(3);
|
||||||
|
/*@__PURE__*/ (e.x(1).y(2)).z(3);
|
||||||
|
/*@__PURE__*/ (f.x(1).y(2).z)(3);
|
||||||
|
/*@__PURE__*/ (g.x(1).y(2).z(3));
|
||||||
|
(/*@__PURE__*/ h).x(1).y(2).z(3);
|
||||||
|
(/*@__PURE__*/ i.x)(1).y(2).z(3);
|
||||||
|
(/*@__PURE__*/ j.x(1)).y(2).z(3);
|
||||||
|
(/*@__PURE__*/ k.x(1).y)(2).z(3);
|
||||||
|
(/*@__PURE__*/ l.x(1).y(2)).z(3);
|
||||||
|
(/*@__PURE__*/ m.x(1).y(2).z)(3);
|
||||||
|
(/*@__PURE__*/ n.x(1).y(2).z(3));
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"h.x(1).y(2).z(3);",
|
||||||
|
"i.x(1).y(2).z(3);",
|
||||||
|
"j.x(1).y(2).z(3);",
|
||||||
|
"k.x(1).y(2).z(3);",
|
||||||
|
"l.x(1).y(2).z(3);",
|
||||||
|
"m.x(1).y(2).z(3);",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2629_4: {
|
||||||
|
options = {
|
||||||
|
annotations: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(/*@__PURE__*/ x(), y());
|
||||||
|
(w(), /*@__PURE__*/ x(), y());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
y();
|
||||||
|
w(), y();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2629_5: {
|
||||||
|
options = {
|
||||||
|
annotations: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
[ /*@__PURE__*/ x() ];
|
||||||
|
[ /*@__PURE__*/ x(), y() ];
|
||||||
|
[ w(), /*@__PURE__*/ x(), y() ];
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
y();
|
||||||
|
w(), y();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2638: {
|
||||||
|
options = {
|
||||||
|
annotations: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
comments: "all",
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
/*@__PURE__*/(g() || h())(x(), y());
|
||||||
|
(/*@__PURE__*/ (a() || b()))(c(), d());
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"x(),y();",
|
||||||
|
"(a()||b())(c(),d());",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2705_1: {
|
||||||
|
options = {
|
||||||
|
annotations: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
comments: "all",
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
/*@__PURE__*/ new a();
|
||||||
|
/*@__PURE__*/ (new b());
|
||||||
|
new (/*@__PURE__*/ c)();
|
||||||
|
(/*@__PURE__*/ new d());
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"new c;",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2705_2: {
|
||||||
|
options = {
|
||||||
|
annotations: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
comments: "all",
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
/*@__PURE__*/ new a(1)(2)(3);
|
||||||
|
/*@__PURE__*/ new (b(1))(2)(3);
|
||||||
|
/*@__PURE__*/ new (c(1)(2))(3);
|
||||||
|
/*@__PURE__*/ new (d(1)(2)(3));
|
||||||
|
new (/*@__PURE__*/ e)(1)(2)(3);
|
||||||
|
(/*@__PURE__*/ new f(1))(2)(3);
|
||||||
|
(/*@__PURE__*/ new g(1)(2))(3);
|
||||||
|
(/*@__PURE__*/ new h(1)(2)(3));
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"new e(1)(2)(3);",
|
||||||
|
"new f(1)(2)(3);",
|
||||||
|
"new g(1)(2)(3);",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2705_3: {
|
||||||
|
options = {
|
||||||
|
annotations: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
comments: "all",
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
/*@__PURE__*/ new a.x(1).y(2).z(3);
|
||||||
|
/*@__PURE__*/ new (b.x)(1).y(2).z(3);
|
||||||
|
/*@__PURE__*/ new (c.x(1)).y(2).z(3);
|
||||||
|
/*@__PURE__*/ new (d.x(1).y)(2).z(3);
|
||||||
|
/*@__PURE__*/ new (e.x(1).y(2)).z(3);
|
||||||
|
/*@__PURE__*/ new (f.x(1).y(2).z)(3);
|
||||||
|
/*@__PURE__*/ new (g.x(1).y(2).z(3));
|
||||||
|
new (/*@__PURE__*/ h).x(1).y(2).z(3);
|
||||||
|
/* */ new (/*@__PURE__*/ i.x)(1).y(2).z(3);
|
||||||
|
(/*@__PURE__*/ new j.x(1)).y(2).z(3);
|
||||||
|
(/*@__PURE__*/ new k.x(1).y)(2).z(3);
|
||||||
|
(/*@__PURE__*/ new l.x(1).y(2)).z(3);
|
||||||
|
(/*@__PURE__*/ new m.x(1).y(2).z)(3);
|
||||||
|
(/*@__PURE__*/ new n.x(1).y(2).z(3));
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"new h.x(1).y(2).z(3);",
|
||||||
|
"/* */new i.x(1).y(2).z(3);",
|
||||||
|
"new j.x(1).y(2).z(3);",
|
||||||
|
"new k.x(1).y(2).z(3);",
|
||||||
|
"new l.x(1).y(2).z(3);",
|
||||||
|
"new m.x(1).y(2).z(3);",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2705_4: {
|
||||||
|
options = {
|
||||||
|
annotations: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(/*@__PURE__*/ new x(), y());
|
||||||
|
(w(), /*@__PURE__*/ new x(), y());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
y();
|
||||||
|
w(), y();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2705_5: {
|
||||||
|
options = {
|
||||||
|
annotations: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
[ /*@__PURE__*/ new x() ];
|
||||||
|
[ /*@__PURE__*/ new x(), y() ];
|
||||||
|
[ w(), /*@__PURE__*/ new x(), y() ];
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
y();
|
||||||
|
w(), y();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2705_6: {
|
||||||
|
options = {
|
||||||
|
annotations: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
comments: "all",
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
/*@__PURE__*/new (g() || h())(x(), y());
|
||||||
|
/* */ new (/*@__PURE__*/ (a() || b()))(c(), d());
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"x(),y();",
|
||||||
|
"/* */new(a()||b())(c(),d());",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3858: {
|
||||||
|
options = {
|
||||||
|
annotations: true,
|
||||||
|
collapse_vars: true,
|
||||||
|
inline: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var f = function(a) {
|
||||||
|
return /*@__PURE__*/ function(b) {
|
||||||
|
console.log(b);
|
||||||
|
}(a);
|
||||||
|
};
|
||||||
|
f("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var f = function(a) {
|
||||||
|
return function() {
|
||||||
|
console.log(a);
|
||||||
|
}();
|
||||||
|
};
|
||||||
|
f("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
inline_pure_call_1: {
|
||||||
|
options = {
|
||||||
|
annotations: true,
|
||||||
|
collapse_vars: true,
|
||||||
|
inline: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var f = function(a) {
|
||||||
|
return /*@__PURE__*/ function(b) {
|
||||||
|
console.log(b);
|
||||||
|
}(a);
|
||||||
|
};
|
||||||
|
f("PASS");
|
||||||
|
}
|
||||||
|
expect: {}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline_pure_call_2: {
|
||||||
|
options = {
|
||||||
|
annotations: true,
|
||||||
|
collapse_vars: true,
|
||||||
|
inline: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var f = function(a) {
|
||||||
|
return /*@__PURE__*/ function(b) {
|
||||||
|
console.log(b);
|
||||||
|
}(a);
|
||||||
|
};
|
||||||
|
var a = f("PASS");
|
||||||
|
}
|
||||||
|
expect: {}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline_pure_call_3: {
|
||||||
|
options = {
|
||||||
|
annotations: true,
|
||||||
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
passes: 2,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var f = function(a) {
|
||||||
|
return /*@__PURE__*/ function(b) {
|
||||||
|
console.log(b);
|
||||||
|
}(a);
|
||||||
|
};
|
||||||
|
var a = f("PASS");
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = function() {
|
||||||
|
console.log("PASS");
|
||||||
|
}();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"PASS",
|
||||||
|
"undefined",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
inline_pure_call_4: {
|
||||||
|
options = {
|
||||||
|
annotations: true,
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = /*@__PURE__*/ function() {
|
||||||
|
return console.log("PASS"), 42;
|
||||||
|
}();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = function() {
|
||||||
|
return console.log("PASS"), 42;
|
||||||
|
}();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"PASS",
|
||||||
|
"42",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
compress_and_output_annotations_enabled: {
|
||||||
|
options = {
|
||||||
|
annotations: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
annotations: true,
|
||||||
|
beautify: true,
|
||||||
|
comments: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var top = /*@__PURE__*/ foo();
|
||||||
|
/*@__PURE__*/ a(1)(2)(3);
|
||||||
|
/*@__PURE__*/ (b(1))(2)(3);
|
||||||
|
/*@__PURE__*/ (c(1)(2))(3);
|
||||||
|
/*@__PURE__*/ (d(1)(2)(3));
|
||||||
|
(/*@__PURE__*/ e)(1)(2)(3);
|
||||||
|
(/*@__PURE__*/ f(1))(2)(3);
|
||||||
|
(/*@__PURE__*/ g(1)(2))(3);
|
||||||
|
(/*@__PURE__*/ h(1)(2)(3));
|
||||||
|
/*@__PURE__*/ l(1).p(2);
|
||||||
|
(/*@__PURE__*/ m(1)).p(2);
|
||||||
|
(/*@__PURE__*/ n(1).p)(2);
|
||||||
|
(/*@__PURE__*/ o(1).p(2));
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"var top = /*@__PURE__*/foo();",
|
||||||
|
"",
|
||||||
|
"e(1)(2)(3);",
|
||||||
|
"",
|
||||||
|
"f(1)(2)(3);",
|
||||||
|
"",
|
||||||
|
"g(1)(2)(3);",
|
||||||
|
"",
|
||||||
|
"m(1).p(2);",
|
||||||
|
"",
|
||||||
|
"n(1).p(2);",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
compress_annotations_disabled_output_annotations_enabled: {
|
||||||
|
options = {
|
||||||
|
annotations: false,
|
||||||
|
evaluate: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
annotations: true,
|
||||||
|
comments: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
/*@__PURE__*/ a(1+2);
|
||||||
|
/*#__PURE__*/ (b(2+3));
|
||||||
|
(/*@__PURE__*/ c)(side_effect);
|
||||||
|
(/*#__PURE__*/ d(effect()));
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"/*@__PURE__*/a(3),",
|
||||||
|
"/*#__PURE__*/b(5),",
|
||||||
|
"c(side_effect),",
|
||||||
|
"/*#__PURE__*/d(effect());",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
compress_and_output_annotations_disabled: {
|
||||||
|
options = {
|
||||||
|
annotations: false,
|
||||||
|
evaluate: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
annotations: false,
|
||||||
|
comments: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
/*@__PURE__*/ a(1+2);
|
||||||
|
/*@__PURE__*/ (b(2+3));
|
||||||
|
(/*@__PURE__*/ c)(side_effect);
|
||||||
|
(/*@__PURE__*/ d(effect()));
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"a(3),",
|
||||||
|
"b(5),",
|
||||||
|
"c(side_effect),",
|
||||||
|
"d(effect());",
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -78,12 +78,13 @@ replace_index_strict: {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
replace_index_keep_fargs: {
|
replace_index_drop_fargs_1: {
|
||||||
options = {
|
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,
|
||||||
@@ -243,20 +259,18 @@ issue_3273: {
|
|||||||
arguments: true,
|
arguments: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(a) {
|
(function(a) {
|
||||||
console.log(arguments[0], a);
|
console.log(arguments[0], a);
|
||||||
arguments[0]++;
|
arguments[0]++;
|
||||||
console.log(arguments[0], a);
|
console.log(arguments[0], a);
|
||||||
}
|
})(0);
|
||||||
f(0);
|
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function f(a) {
|
(function(a) {
|
||||||
console.log(a, a);
|
console.log(a, a);
|
||||||
a++;
|
a++;
|
||||||
console.log(a, a);
|
console.log(a, a);
|
||||||
}
|
})(0);
|
||||||
f(0);
|
|
||||||
}
|
}
|
||||||
expect_stdout: [
|
expect_stdout: [
|
||||||
"0 0",
|
"0 0",
|
||||||
@@ -264,26 +278,43 @@ issue_3273: {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_3273_no_call_arg: {
|
||||||
|
options = {
|
||||||
|
arguments: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a) {
|
||||||
|
arguments[0] = "FAIL";
|
||||||
|
console.log(a);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(a) {
|
||||||
|
arguments[0] = "FAIL";
|
||||||
|
console.log(a);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
issue_3273_reduce_vars: {
|
issue_3273_reduce_vars: {
|
||||||
options = {
|
options = {
|
||||||
arguments: true,
|
arguments: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(a) {
|
(function(a) {
|
||||||
console.log(arguments[0], a);
|
console.log(arguments[0], a);
|
||||||
arguments[0]++;
|
arguments[0]++;
|
||||||
console.log(arguments[0], a);
|
console.log(arguments[0], a);
|
||||||
}
|
})(0);
|
||||||
f(0);
|
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function f(a) {
|
(function(a) {
|
||||||
console.log(a, a);
|
console.log(a, a);
|
||||||
a++;
|
a++;
|
||||||
console.log(a, a);
|
console.log(a, a);
|
||||||
}
|
})(0);
|
||||||
f(0);
|
|
||||||
}
|
}
|
||||||
expect_stdout: [
|
expect_stdout: [
|
||||||
"0 0",
|
"0 0",
|
||||||
@@ -296,22 +327,20 @@ issue_3273_local_strict: {
|
|||||||
arguments: true,
|
arguments: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(a) {
|
(function(a) {
|
||||||
"use strict";
|
"use strict";
|
||||||
console.log(arguments[0], a);
|
console.log(arguments[0], a);
|
||||||
arguments[0]++;
|
arguments[0]++;
|
||||||
console.log(arguments[0], a);
|
console.log(arguments[0], a);
|
||||||
}
|
})(0);
|
||||||
f(0);
|
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function f(a) {
|
(function(a) {
|
||||||
"use strict";
|
"use strict";
|
||||||
console.log(arguments[0], a);
|
console.log(arguments[0], a);
|
||||||
arguments[0]++;
|
arguments[0]++;
|
||||||
console.log(arguments[0], a);
|
console.log(arguments[0], a);
|
||||||
}
|
})(0);
|
||||||
f(0);
|
|
||||||
}
|
}
|
||||||
expect_stdout: [
|
expect_stdout: [
|
||||||
"0 0",
|
"0 0",
|
||||||
@@ -325,22 +354,20 @@ issue_3273_local_strict_reduce_vars: {
|
|||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(a) {
|
(function(a) {
|
||||||
"use strict";
|
"use strict";
|
||||||
console.log(arguments[0], a);
|
console.log(arguments[0], a);
|
||||||
arguments[0]++;
|
arguments[0]++;
|
||||||
console.log(arguments[0], a);
|
console.log(arguments[0], a);
|
||||||
}
|
})(0);
|
||||||
f(0);
|
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function f(a) {
|
(function(a) {
|
||||||
"use strict";
|
"use strict";
|
||||||
console.log(arguments[0], a);
|
console.log(arguments[0], a);
|
||||||
arguments[0]++;
|
arguments[0]++;
|
||||||
console.log(arguments[0], a);
|
console.log(arguments[0], a);
|
||||||
}
|
})(0);
|
||||||
f(0);
|
|
||||||
}
|
}
|
||||||
expect_stdout: [
|
expect_stdout: [
|
||||||
"0 0",
|
"0 0",
|
||||||
@@ -354,21 +381,19 @@ issue_3273_global_strict: {
|
|||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
"use strict";
|
"use strict";
|
||||||
function f(a) {
|
(function(a) {
|
||||||
console.log(arguments[0], a);
|
console.log(arguments[0], a);
|
||||||
arguments[0]++;
|
arguments[0]++;
|
||||||
console.log(arguments[0], a);
|
console.log(arguments[0], a);
|
||||||
}
|
})(0);
|
||||||
f(0);
|
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
"use strict";
|
"use strict";
|
||||||
function f(a) {
|
(function(a) {
|
||||||
console.log(arguments[0], a);
|
console.log(arguments[0], a);
|
||||||
arguments[0]++;
|
arguments[0]++;
|
||||||
console.log(arguments[0], a);
|
console.log(arguments[0], a);
|
||||||
}
|
})(0);
|
||||||
f(0);
|
|
||||||
}
|
}
|
||||||
expect_stdout: [
|
expect_stdout: [
|
||||||
"0 0",
|
"0 0",
|
||||||
@@ -383,21 +408,19 @@ issue_3273_global_strict_reduce_vars: {
|
|||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
"use strict";
|
"use strict";
|
||||||
function f(a) {
|
(function(a) {
|
||||||
console.log(arguments[0], a);
|
console.log(arguments[0], a);
|
||||||
arguments[0]++;
|
arguments[0]++;
|
||||||
console.log(arguments[0], a);
|
console.log(arguments[0], a);
|
||||||
}
|
})(0);
|
||||||
f(0);
|
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
"use strict";
|
"use strict";
|
||||||
function f(a) {
|
(function(a) {
|
||||||
console.log(arguments[0], a);
|
console.log(arguments[0], a);
|
||||||
arguments[0]++;
|
arguments[0]++;
|
||||||
console.log(arguments[0], a);
|
console.log(arguments[0], a);
|
||||||
}
|
})(0);
|
||||||
f(0);
|
|
||||||
}
|
}
|
||||||
expect_stdout: [
|
expect_stdout: [
|
||||||
"0 0",
|
"0 0",
|
||||||
@@ -405,7 +428,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,
|
||||||
@@ -428,10 +451,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: {
|
||||||
@@ -626,7 +649,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() {
|
||||||
@@ -648,7 +672,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() {
|
||||||
@@ -668,7 +693,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";
|
||||||
@@ -690,7 +716,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() {
|
||||||
@@ -715,7 +742,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";
|
||||||
@@ -742,7 +770,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() {
|
||||||
@@ -760,7 +789,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";
|
||||||
@@ -776,3 +806,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"
|
||||||
|
}
|
||||||
|
|||||||
816
test/compress/arrows.js
Normal file
816
test/compress/arrows.js
Normal file
@@ -0,0 +1,816 @@
|
|||||||
|
no_funarg: {
|
||||||
|
input: {
|
||||||
|
(() => console.log(42))();
|
||||||
|
}
|
||||||
|
expect_exact: "(()=>console.log(42))();"
|
||||||
|
expect_stdout: "42"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
single_funarg: {
|
||||||
|
input: {
|
||||||
|
(a => console.log(a))(42);
|
||||||
|
}
|
||||||
|
expect_exact: "(a=>console.log(a))(42);"
|
||||||
|
expect_stdout: "42"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
multiple_funargs: {
|
||||||
|
input: {
|
||||||
|
((a, b) => console.log(a, b))("foo", "bar");
|
||||||
|
}
|
||||||
|
expect_exact: '((a,b)=>console.log(a,b))("foo","bar");'
|
||||||
|
expect_stdout: "foo bar"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
destructured_funarg: {
|
||||||
|
input: {
|
||||||
|
(([ a, b, c ]) => console.log(a, b, c))("foo");
|
||||||
|
}
|
||||||
|
expect_exact: '(([a,b,c])=>console.log(a,b,c))("foo");'
|
||||||
|
expect_stdout: "f o o"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
await_parentheses: {
|
||||||
|
input: {
|
||||||
|
async function f() {
|
||||||
|
await (a => a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: "async function f(){await(a=>a)}"
|
||||||
|
}
|
||||||
|
|
||||||
|
for_parentheses_init: {
|
||||||
|
input: {
|
||||||
|
for (a => (a in a); console.log(42););
|
||||||
|
}
|
||||||
|
expect_exact: "for((a=>a in a);console.log(42););"
|
||||||
|
expect_stdout: "42"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
for_parentheses_condition: {
|
||||||
|
input: {
|
||||||
|
for (console.log(42); a => (a in a);)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
expect_exact: "for(console.log(42);a=>a in a;)break;"
|
||||||
|
expect_stdout: "42"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
for_parentheses_step: {
|
||||||
|
input: {
|
||||||
|
for (; console.log(42); a => (a in a));
|
||||||
|
}
|
||||||
|
expect_exact: "for(;console.log(42);a=>a in a);"
|
||||||
|
expect_stdout: "42"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
for_assign_parentheses_init: {
|
||||||
|
input: {
|
||||||
|
for (f = a => (a in a); console.log(42););
|
||||||
|
}
|
||||||
|
expect_exact: "for((f=a=>a in a);console.log(42););"
|
||||||
|
expect_stdout: "42"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
for_assign_parentheses_condition: {
|
||||||
|
input: {
|
||||||
|
for (console.log(42); f = a => (a in a);)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
expect_exact: "for(console.log(42);f=a=>a in a;)break;"
|
||||||
|
expect_stdout: "42"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
for_assign_parentheses_step: {
|
||||||
|
input: {
|
||||||
|
for (; console.log(42); f = a => (a in a));
|
||||||
|
}
|
||||||
|
expect_exact: "for(;console.log(42);f=a=>a in a);"
|
||||||
|
expect_stdout: "42"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
for_declaration_parentheses_init: {
|
||||||
|
input: {
|
||||||
|
for (var f = a => (a in a); console.log(42););
|
||||||
|
}
|
||||||
|
expect_exact: "for(var f=(a=>a in a);console.log(42););"
|
||||||
|
expect_stdout: "42"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
for_statement_parentheses_init: {
|
||||||
|
input: {
|
||||||
|
for (a => {
|
||||||
|
a in a;
|
||||||
|
}; console.log(42););
|
||||||
|
}
|
||||||
|
expect_exact: "for(a=>{a in a};console.log(42););"
|
||||||
|
expect_stdout: "42"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
body_call: {
|
||||||
|
input: {
|
||||||
|
(() => {
|
||||||
|
console.log("foo");
|
||||||
|
console.log("bar");
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_exact: '(()=>{console.log("foo");console.log("bar")})();'
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
body_conditional: {
|
||||||
|
input: {
|
||||||
|
console.log((a => {}) ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect_exact: 'console.log((a=>{})?"PASS":"FAIL");'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
destructured_object_value: {
|
||||||
|
input: {
|
||||||
|
console.log((a => ({} = a))(42));
|
||||||
|
}
|
||||||
|
expect_exact: "console.log((a=>({}=a))(42));"
|
||||||
|
expect_stdout: "42"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
function_value: {
|
||||||
|
input: {
|
||||||
|
console.log((a => function() {
|
||||||
|
return a;
|
||||||
|
})(42)());
|
||||||
|
}
|
||||||
|
expect_exact: "console.log((a=>function(){return a})(42)());"
|
||||||
|
expect_stdout: "42"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
in_value: {
|
||||||
|
input: {
|
||||||
|
console.log((a => a in {
|
||||||
|
foo: 42,
|
||||||
|
})("foo"));
|
||||||
|
}
|
||||||
|
expect_exact: 'console.log((a=>a in{foo:42})("foo"));'
|
||||||
|
expect_stdout: "true"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
object_value: {
|
||||||
|
input: {
|
||||||
|
console.log((() => ({
|
||||||
|
4: 2,
|
||||||
|
}))()[4]);
|
||||||
|
}
|
||||||
|
expect_exact: "console.log((()=>({4:2}))()[4]);"
|
||||||
|
expect_stdout: "2"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
object_first_in_value: {
|
||||||
|
input: {
|
||||||
|
console.log((a => ({
|
||||||
|
p: a,
|
||||||
|
}.p ? "FAIL" : "PASS"))());
|
||||||
|
}
|
||||||
|
expect_exact: 'console.log((a=>({p:a}).p?"FAIL":"PASS")());'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
sequence_value: {
|
||||||
|
input: {
|
||||||
|
console.log((a => (console.log("foo"), a))("bar"));
|
||||||
|
}
|
||||||
|
expect_exact: 'console.log((a=>(console.log("foo"),a))("bar"));'
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
side_effects_value: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log((a => function() {
|
||||||
|
return a;
|
||||||
|
})(42)());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log((a => function() {
|
||||||
|
return a;
|
||||||
|
})(42)());
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
arrow_property: {
|
||||||
|
input: {
|
||||||
|
console.log((a => 42).prototype);
|
||||||
|
}
|
||||||
|
expect_exact: "console.log((a=>42).prototype);"
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
assign_arrow: {
|
||||||
|
input: {
|
||||||
|
var f = a => a;
|
||||||
|
console.log(f(42));
|
||||||
|
}
|
||||||
|
expect_exact: "var f=a=>a;console.log(f(42));"
|
||||||
|
expect_stdout: "42"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
binary_arrow: {
|
||||||
|
input: {
|
||||||
|
console.log(4 || (() => 2));
|
||||||
|
}
|
||||||
|
expect_exact: "console.log(4||(()=>2));"
|
||||||
|
expect_stdout: "4"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
unary_arrow: {
|
||||||
|
input: {
|
||||||
|
console.log(+(() => 42));
|
||||||
|
}
|
||||||
|
expect_exact: "console.log(+(()=>42));"
|
||||||
|
expect_stdout: "NaN"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
trailing_comma: {
|
||||||
|
input: {
|
||||||
|
((a,) => console.log(a))(42);
|
||||||
|
}
|
||||||
|
expect_exact: "(a=>console.log(a))(42);"
|
||||||
|
expect_stdout: "42"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_arguments: {
|
||||||
|
options = {
|
||||||
|
arguments: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
return () => arguments[0];
|
||||||
|
}("PASS")("FAIL"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(argument_0) {
|
||||||
|
return () => argument_0;
|
||||||
|
}("PASS")("FAIL"));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
funarg_arguments: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log((arguments => arguments)(42));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(42);
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
inline_arguments: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
return () => arguments[0];
|
||||||
|
}("PASS")("FAIL"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function() {
|
||||||
|
return () => arguments[0];
|
||||||
|
}("PASS")("FAIL"));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
var_arguments: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
properties: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
return () => {
|
||||||
|
var arguments = [ "PASS" ];
|
||||||
|
return arguments;
|
||||||
|
};
|
||||||
|
}("FAIL 1")("FAIL 2")[0]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
negate: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
if (!console ? 0 : () => 1)
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(console ? () => 1 : 0) && console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
inline_this: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
p: function() {
|
||||||
|
return function() {
|
||||||
|
return () => this.q;
|
||||||
|
}();
|
||||||
|
},
|
||||||
|
q: "FAIL",
|
||||||
|
};
|
||||||
|
q = "PASS";
|
||||||
|
console.log(o.p()());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {
|
||||||
|
p: function() {
|
||||||
|
return function() {
|
||||||
|
return () => this.q;
|
||||||
|
}();
|
||||||
|
},
|
||||||
|
q: "FAIL",
|
||||||
|
};
|
||||||
|
q = "PASS";
|
||||||
|
console.log(o.p()());
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
trim_body: {
|
||||||
|
options = {
|
||||||
|
arrows: true,
|
||||||
|
if_return: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var f = a => {
|
||||||
|
return a;
|
||||||
|
};
|
||||||
|
var g = b => void b;
|
||||||
|
console.log(f("PASS"), g("FAIL"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var f = a => a;
|
||||||
|
var g = b => {};
|
||||||
|
console.log(f("PASS"), g("FAIL"));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS undefined"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
collapse_value: {
|
||||||
|
options = {
|
||||||
|
arrows: true,
|
||||||
|
collapse_vars: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 42;
|
||||||
|
console.log((b => Math.floor(b))(a));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 42;
|
||||||
|
console.log((() => Math.floor(a))());
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
collapse_property_lambda: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
pure_getters: "strict",
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function f() {
|
||||||
|
f.g = () => 42;
|
||||||
|
return f.g();
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function f() {
|
||||||
|
return (f.g = () => 42)();
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_return: {
|
||||||
|
options = {
|
||||||
|
arrows: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(a => {
|
||||||
|
while (!console);
|
||||||
|
return console.log(a);
|
||||||
|
})(42);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(a => {
|
||||||
|
while (!console);
|
||||||
|
console.log(a);
|
||||||
|
})(42);
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_value: {
|
||||||
|
options = {
|
||||||
|
arrows: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
((a, b) => a + b)(console.log(42));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
((a, b) => {})(console.log(42));
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
reduce_iife_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(a => console.log(a + a))(21);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(() => console.log(42))();
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
reduce_iife_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 21;
|
||||||
|
(() => console.log(a + a))();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(() => console.log(42))();
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
reduce_iife_3: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "foo";
|
||||||
|
(() => {
|
||||||
|
console.log(a);
|
||||||
|
console.log(a);
|
||||||
|
})();
|
||||||
|
a = "bar";
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(() => {
|
||||||
|
console.log("foo");
|
||||||
|
console.log("foo");
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"foo",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
single_use_recursive: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
return (() => f)();
|
||||||
|
}
|
||||||
|
console.log(typeof f());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(typeof function f() {
|
||||||
|
return (() => f)();
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "function"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4388: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(arguments => console.log(arguments && arguments))();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(arguments => console.log(arguments && arguments))();
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4390: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function log() {
|
||||||
|
console.log.apply(console, arguments);
|
||||||
|
}
|
||||||
|
var a = 42, b = "FAIL";
|
||||||
|
b = "PASS";
|
||||||
|
(c => log(b, c))(a);
|
||||||
|
log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function log() {
|
||||||
|
console.log.apply(console, arguments);
|
||||||
|
}
|
||||||
|
var a = 42, b = "FAIL";
|
||||||
|
b = "PASS";
|
||||||
|
(c => log(b, c))(a);
|
||||||
|
log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"PASS 42",
|
||||||
|
"PASS",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4401: {
|
||||||
|
options = {
|
||||||
|
merge_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
var a = (b => b(a))(console.log || a);
|
||||||
|
var c = console.log;
|
||||||
|
c && c(typeof b);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function() {
|
||||||
|
var a = (b => b(a))(console.log || a);
|
||||||
|
var c = console.log;
|
||||||
|
c && c(typeof b);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"undefined",
|
||||||
|
"undefined",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4448: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var A;
|
||||||
|
try {
|
||||||
|
(arguments => {
|
||||||
|
arguments[0];
|
||||||
|
})(A);
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var A;
|
||||||
|
try {
|
||||||
|
(arguments => {
|
||||||
|
arguments[0];
|
||||||
|
})(A);
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4476: {
|
||||||
|
options = {
|
||||||
|
arguments: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a, b) {
|
||||||
|
(a => {
|
||||||
|
console.log(arguments[0], a);
|
||||||
|
})(b);
|
||||||
|
})("foo", "bar");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(a, b) {
|
||||||
|
(a => {
|
||||||
|
console.log(arguments[0], a);
|
||||||
|
})(b);
|
||||||
|
})("foo", "bar");
|
||||||
|
}
|
||||||
|
expect_stdout: "foo bar"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4666: {
|
||||||
|
input: {
|
||||||
|
console.log((a => /[0-9]/.test(a))(42));
|
||||||
|
}
|
||||||
|
expect_exact: "console.log((a=>/[0-9]/.test(a))(42));"
|
||||||
|
expect_stdout: "true"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4685_1: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
new function(f) {
|
||||||
|
if (f() !== this)
|
||||||
|
console.log("PASS");
|
||||||
|
}(() => this);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
new function(f) {
|
||||||
|
if (f() !== this)
|
||||||
|
console.log("PASS");
|
||||||
|
}(() => this);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4685_2: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
new function(f) {
|
||||||
|
if (f() !== this)
|
||||||
|
console.log("PASS");
|
||||||
|
}(() => {
|
||||||
|
if (console)
|
||||||
|
return this;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
new function(f) {
|
||||||
|
if (f() !== this)
|
||||||
|
console.log("PASS");
|
||||||
|
}(() => {
|
||||||
|
if (console)
|
||||||
|
return this;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4687_1: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
new function() {
|
||||||
|
console.log(function(f) {
|
||||||
|
return f() === this;
|
||||||
|
}(() => this) || "PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
new function() {
|
||||||
|
console.log(function(f) {
|
||||||
|
return f() === this;
|
||||||
|
}(() => this) || "PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4687_2: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
new function() {
|
||||||
|
console.log(function(f) {
|
||||||
|
return f() === this;
|
||||||
|
}(() => {
|
||||||
|
if (console)
|
||||||
|
return this;
|
||||||
|
}) || "PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
new function() {
|
||||||
|
console.log(function(f) {
|
||||||
|
return f() === this;
|
||||||
|
}(() => {
|
||||||
|
if (console)
|
||||||
|
return this;
|
||||||
|
}) || "PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4772: {
|
||||||
|
input: {
|
||||||
|
var f = a => (a)
|
||||||
|
/**/ console.log(f("PASS"));
|
||||||
|
}
|
||||||
|
expect_exact: 'var f=a=>a;console.log(f("PASS"));'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
@@ -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,11 +90,12 @@ asm_mixed: {
|
|||||||
function no_asm_GeometricMean(stdlib, foreign, buffer) {
|
function no_asm_GeometricMean(stdlib, foreign, buffer) {
|
||||||
function logSum(start, end) {
|
function logSum(start, end) {
|
||||||
start |= 0, end |= 0;
|
start |= 0, end |= 0;
|
||||||
for (var sum = 0, p = 0, q = 0, p = start << 3, q = end << 3; (0 | p) < (0 | q); p = p + 8 | 0) 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) {
|
||||||
return start |= 0, end |= 0, +exp(logSum(start, end) / (end - start | 0));
|
return start |= 0, end |= 0, +exp(+logSum(start, end) / (end - start | 0));
|
||||||
}
|
}
|
||||||
var exp = stdlib.Math.exp, log = stdlib.Math.log, values = new stdlib.Float64Array(buffer);
|
var exp = stdlib.Math.exp, log = stdlib.Math.log, values = new stdlib.Float64Array(buffer);
|
||||||
return { geometricMean: geometricMean };
|
return { geometricMean: geometricMean };
|
||||||
|
|||||||
@@ -407,3 +407,297 @@ issue_3429_2: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "undefined"
|
expect_stdout: "undefined"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_3949_1: {
|
||||||
|
options = {
|
||||||
|
assignments: true,
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 42;
|
||||||
|
function f() {
|
||||||
|
var b = a;
|
||||||
|
b = b >> 2;
|
||||||
|
return 100 + b;
|
||||||
|
}
|
||||||
|
console.log(f());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 42;
|
||||||
|
function f() {
|
||||||
|
var b = a;
|
||||||
|
b >>= 2;
|
||||||
|
return 100 + b;
|
||||||
|
}
|
||||||
|
console.log(f());
|
||||||
|
}
|
||||||
|
expect_stdout: "110"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3949_2: {
|
||||||
|
options = {
|
||||||
|
assignments: true,
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 42;
|
||||||
|
function f() {
|
||||||
|
var b = a;
|
||||||
|
b = 5 & b;
|
||||||
|
return 100 + b;
|
||||||
|
}
|
||||||
|
console.log(f());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 42;
|
||||||
|
function f() {
|
||||||
|
var b = a;
|
||||||
|
b &= 5;
|
||||||
|
return 100 + b;
|
||||||
|
}
|
||||||
|
console.log(f());
|
||||||
|
}
|
||||||
|
expect_stdout: "100"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4521: {
|
||||||
|
options = {
|
||||||
|
assignments: true,
|
||||||
|
dead_code: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = (a = 42 | a) ? console.log(a) : 0;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = (a |= 42) ? console.log(a) : 0;
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
}
|
||||||
|
|
||||||
|
logical_assignments: {
|
||||||
|
input: {
|
||||||
|
var a = 42, b = null, c;
|
||||||
|
a &&= "foo";
|
||||||
|
b ||= "bar";
|
||||||
|
c ??= "baz";
|
||||||
|
console.log(a, b, c);
|
||||||
|
}
|
||||||
|
expect_exact: 'var a=42,b=null,c;a&&="foo";b||="bar";c??="baz";console.log(a,b,c);'
|
||||||
|
expect_stdout: "foo bar baz"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
logical_collapse_vars: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "FAIL", b = false;
|
||||||
|
a = "PASS";
|
||||||
|
b ??= a;
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "FAIL", b = false;
|
||||||
|
a = "PASS";
|
||||||
|
b ??= a;
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
logical_reduce_vars: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS", b = 42;
|
||||||
|
b ??= a = "FAIL";
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "PASS", b = 42;
|
||||||
|
b ??= a = "FAIL";
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
logical_side_effects: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS", b = 42;
|
||||||
|
b ??= a = "FAIL";
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "PASS", b = 42;
|
||||||
|
b ??= a = "FAIL";
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4815_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS";
|
||||||
|
42..p &&= a = "FAIL";
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "PASS";
|
||||||
|
42..p &&= a = "FAIL";
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4815_2: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS";
|
||||||
|
42..p &&= a = "FAIL";
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "PASS";
|
||||||
|
42..p &&= a = "FAIL";
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4819: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(void 0 === ([].p &&= 42));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(void 0 === ([].p &&= 42));
|
||||||
|
}
|
||||||
|
expect_stdout: "true"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4827_1: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
A = "FAIL";
|
||||||
|
var a = A, b = "PASS", c;
|
||||||
|
c &&= b = a, console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
A = "FAIL";
|
||||||
|
var a = A, b = "PASS", c;
|
||||||
|
c &&= b = a, console.log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4827_2: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
inline: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 0, b = "PASS";
|
||||||
|
function f(c) {
|
||||||
|
a++,
|
||||||
|
c &&= b = a;
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 0, b = "PASS";
|
||||||
|
a++,
|
||||||
|
c &&= b = a;
|
||||||
|
var c;
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4827_3: {
|
||||||
|
options = {
|
||||||
|
merge_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 0, b, c;
|
||||||
|
a++;
|
||||||
|
c &&= b = a;
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 0, b, c;
|
||||||
|
a++;
|
||||||
|
c &&= b = a;
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4876: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try {
|
||||||
|
var a = null;
|
||||||
|
var b = a &&= 42;
|
||||||
|
b.p;
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
try {
|
||||||
|
var a = null;
|
||||||
|
var b = a &&= 42;
|
||||||
|
b.p;
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=15"
|
||||||
|
}
|
||||||
1533
test/compress/awaits.js
Normal file
1533
test/compress/awaits.js
Normal file
File diff suppressed because it is too large
Load Diff
92
test/compress/bigint.js
Normal file
92
test/compress/bigint.js
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
arithmetic: {
|
||||||
|
input: {
|
||||||
|
console.log(((1n + 0x2n) * (0o3n - -4n)) >> (5n - 6n));
|
||||||
|
}
|
||||||
|
expect_exact: "console.log((1n+0x2n)*(0o3n- -4n)>>5n-6n);"
|
||||||
|
expect_stdout: "42n"
|
||||||
|
node_version: ">=10"
|
||||||
|
}
|
||||||
|
|
||||||
|
minus_dot: {
|
||||||
|
input: {
|
||||||
|
console.log(typeof -42n.toString(), typeof (-42n).toString());
|
||||||
|
}
|
||||||
|
expect_exact: "console.log(typeof-42n.toString(),typeof(-42n).toString());"
|
||||||
|
expect_stdout: "number string"
|
||||||
|
node_version: ">=10"
|
||||||
|
}
|
||||||
|
|
||||||
|
evaluate: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log((0xDEAD_BEEFn).toString(16));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(0xdeadbeefn.toString(16));
|
||||||
|
}
|
||||||
|
expect_stdout: "deadbeef"
|
||||||
|
node_version: ">=10"
|
||||||
|
}
|
||||||
|
|
||||||
|
Number: {
|
||||||
|
options = {
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(Number(-0xfeed_dead_beef_badn));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(+("" + -0xfeed_dead_beef_badn));
|
||||||
|
}
|
||||||
|
expect_stdout: "-1148098955808013200"
|
||||||
|
node_version: ">=10"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4590: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
A = 1;
|
||||||
|
0n || console.log("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
A = 1;
|
||||||
|
0n || console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=10"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4801: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
collapse_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try {
|
||||||
|
(function(a) {
|
||||||
|
A = 42;
|
||||||
|
a || A;
|
||||||
|
})(!(0 == 42 >> 0o644n));
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
try {
|
||||||
|
(function(a) {
|
||||||
|
0 != (A = 42) >> 0o644n || A;
|
||||||
|
})();
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=10"
|
||||||
|
}
|
||||||
@@ -153,3 +153,31 @@ issue_3690: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4374: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
if_return: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
console.log(f());
|
||||||
|
function f(a) {
|
||||||
|
if (null) return 0;
|
||||||
|
if (a) return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function() {
|
||||||
|
console.log(function(a) {
|
||||||
|
return !null && a ? 1 : 0;
|
||||||
|
}());
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "0"
|
||||||
|
}
|
||||||
|
|||||||
1565
test/compress/classes.js
Normal file
1565
test/compress/classes.js
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -93,6 +93,59 @@ self_comparison_2: {
|
|||||||
expect_stdout: "false true"
|
expect_stdout: "false true"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self_comparison_3: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
function f() {
|
||||||
|
var b = a;
|
||||||
|
a = null;
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
for (var i = 0; i < 2; i++)
|
||||||
|
console.log(f() === f());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
function f() {
|
||||||
|
var b = a;
|
||||||
|
a = null;
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
for (var i = 0; i < 2; i++)
|
||||||
|
console.log(f() === f());
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"false",
|
||||||
|
"true",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
self_comparison_4: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
comparisons: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {};
|
||||||
|
console.log(o == o, o != o);
|
||||||
|
console.log(o === o, o !== o);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(!0, !1);
|
||||||
|
console.log(!0, !1);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"true false",
|
||||||
|
"true false",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
issue_2857_1: {
|
issue_2857_1: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
|
|||||||
@@ -238,6 +238,41 @@ concat_8: {
|
|||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
concat_9: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
strings: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "foo";
|
||||||
|
console.log(
|
||||||
|
12 + (34 + a),
|
||||||
|
null + (34 + a),
|
||||||
|
12 + (null + a),
|
||||||
|
false + (34 + a),
|
||||||
|
12 + (false + a),
|
||||||
|
"bar" + (34 + a),
|
||||||
|
12 + ("bar" + a)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "foo";
|
||||||
|
console.log(
|
||||||
|
"1234" + a,
|
||||||
|
"null34" + a,
|
||||||
|
"12null" + a,
|
||||||
|
!1 + (34 + a),
|
||||||
|
12 + (!1 + a),
|
||||||
|
"bar34" + a,
|
||||||
|
"12bar" + a
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
issue_3689: {
|
issue_3689: {
|
||||||
options = {
|
options = {
|
||||||
strings: true,
|
strings: true,
|
||||||
|
|||||||
@@ -55,14 +55,15 @@ ifs_3_should_warn: {
|
|||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x, y;
|
var x, y;
|
||||||
if (x && !(x + "1") && y) { // 1
|
// 1
|
||||||
|
if (x && !(x + "1") && y) {
|
||||||
var qq;
|
var qq;
|
||||||
foo();
|
foo();
|
||||||
} else {
|
} else {
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
// 2
|
||||||
if (x || !!(x + "1") || y) { // 2
|
if (x || !!(x + "1") || y) {
|
||||||
foo();
|
foo();
|
||||||
} else {
|
} else {
|
||||||
var jj;
|
var jj;
|
||||||
@@ -71,9 +72,25 @@ ifs_3_should_warn: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var x, y;
|
var x, y;
|
||||||
var qq; bar(); // 1
|
// 1
|
||||||
var jj; foo(); // 2
|
var qq; bar();
|
||||||
|
// 2
|
||||||
|
foo(); var jj;
|
||||||
}
|
}
|
||||||
|
expect_warnings: [
|
||||||
|
"WARN: + in boolean context always true [test/compress/conditionals.js:3,18]",
|
||||||
|
"WARN: Boolean && always false [test/compress/conditionals.js:3,12]",
|
||||||
|
"WARN: Condition left of && always false [test/compress/conditionals.js:3,12]",
|
||||||
|
"WARN: Condition always false [test/compress/conditionals.js:3,12]",
|
||||||
|
"WARN: Dropping unreachable code [test/compress/conditionals.js:3,34]",
|
||||||
|
"WARN: + in boolean context always true [test/compress/conditionals.js:10,19]",
|
||||||
|
"WARN: Boolean || always true [test/compress/conditionals.js:10,12]",
|
||||||
|
"WARN: Condition left of || always true [test/compress/conditionals.js:10,12]",
|
||||||
|
"WARN: Condition always true [test/compress/conditionals.js:10,12]",
|
||||||
|
"WARN: Dropping unreachable code [test/compress/conditionals.js:12,15]",
|
||||||
|
"WARN: Dropping side-effect-free statement [test/compress/conditionals.js:3,12]",
|
||||||
|
"WARN: Dropping side-effect-free statement [test/compress/conditionals.js:10,12]",
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
ifs_4: {
|
ifs_4: {
|
||||||
@@ -783,6 +800,28 @@ cond_12: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cond_13: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
x ? y(a) : z(a);
|
||||||
|
x ? y.f(a) : z.f(a);
|
||||||
|
x ? y.f(a) : z.g(a);
|
||||||
|
x ? y.f()(a) : z.g()(a);
|
||||||
|
x ? y.f.u(a) : z.g.u(a);
|
||||||
|
x ? y.f().u(a) : z.g().u(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(x ? y : z)(a);
|
||||||
|
(x ? y : z).f(a);
|
||||||
|
x ? y.f(a) : z.g(a);
|
||||||
|
(x ? y.f() : z.g())(a);
|
||||||
|
(x ? y.f : z.g).u(a);
|
||||||
|
(x ? y.f() : z.g()).u(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ternary_boolean_consequent: {
|
ternary_boolean_consequent: {
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
booleans: true,
|
||||||
@@ -1137,7 +1176,7 @@ issue_1645_2: {
|
|||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
condition_symbol_matches_consequent: {
|
condition_matches_consequent: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
}
|
}
|
||||||
@@ -1166,6 +1205,35 @@ condition_symbol_matches_consequent: {
|
|||||||
expect_stdout: "3 7 true 4"
|
expect_stdout: "3 7 true 4"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
condition_matches_alternative: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function foo(x, y) {
|
||||||
|
return x.p ? y[0] : x.p;
|
||||||
|
}
|
||||||
|
function bar() {
|
||||||
|
return g ? h : g;
|
||||||
|
}
|
||||||
|
var g = 4;
|
||||||
|
var h = 5;
|
||||||
|
console.log(foo({ p: 3 }, [ null ]), foo({ p: 0 }, [ 7 ]), foo({ p: true } , [ false ]), bar());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function foo(x, y) {
|
||||||
|
return x.p && y[0];
|
||||||
|
}
|
||||||
|
function bar() {
|
||||||
|
return g && h;
|
||||||
|
}
|
||||||
|
var g = 4;
|
||||||
|
var h = 5;
|
||||||
|
console.log(foo({ p: 3 }, [ null ]), foo({ p: 0 }, [ 7 ]), foo({ p: true } , [ false ]), bar());
|
||||||
|
}
|
||||||
|
expect_stdout: "null 0 false 5"
|
||||||
|
}
|
||||||
|
|
||||||
delete_conditional_1: {
|
delete_conditional_1: {
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
booleans: true,
|
||||||
@@ -1793,3 +1861,39 @@ issue_3808_2: {
|
|||||||
}
|
}
|
||||||
expect_stdout: " PASS"
|
expect_stdout: " PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
object_super: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
Object.setPrototypeOf({
|
||||||
|
f(a) {
|
||||||
|
a ? this.g("FAIL") : super.g("FAIL");
|
||||||
|
},
|
||||||
|
g(b) {
|
||||||
|
console.log(b);
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
g() {
|
||||||
|
console.log("PASS");
|
||||||
|
},
|
||||||
|
}).f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
Object.setPrototypeOf({
|
||||||
|
f(a) {
|
||||||
|
a ? this.g("FAIL") : super.g("FAIL");
|
||||||
|
},
|
||||||
|
g(b) {
|
||||||
|
console.log(b);
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
g() {
|
||||||
|
console.log("PASS");
|
||||||
|
},
|
||||||
|
}).f();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|||||||
1537
test/compress/const.js
Normal file
1537
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;
|
{
|
||||||
function g(){};
|
var x;
|
||||||
|
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;
|
{
|
||||||
function bar() {}
|
var foo;
|
||||||
|
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"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -236,7 +252,7 @@ collapse_vars_lvalues_drop_assign: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
collapse_vars_misc1: {
|
collapse_vars_misc: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
@@ -1151,3 +1167,256 @@ issue_3830_6: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
redundant_assignments: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = a = "PASS", b = "FAIL";
|
||||||
|
b = b = "PASS";
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "PASS", b = "FAIL";
|
||||||
|
b = "PASS";
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
self_assignments_1: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS";
|
||||||
|
a = a;
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "PASS";
|
||||||
|
a;
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
self_assignments_2: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "q", o = {
|
||||||
|
p: "PASS",
|
||||||
|
};
|
||||||
|
o.p = o.p;
|
||||||
|
o[a] = o[a];
|
||||||
|
console.log(o.p, o[a]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "q", o = {
|
||||||
|
p: "PASS",
|
||||||
|
};
|
||||||
|
console.log(o.p, o[a]);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
self_assignments_3: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "q", o = {
|
||||||
|
p: "FAIL",
|
||||||
|
get q() {
|
||||||
|
return "PASS";
|
||||||
|
},
|
||||||
|
set q(v) {
|
||||||
|
this.p = v;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
o.p = o.p;
|
||||||
|
o[a] = o[a];
|
||||||
|
console.log(o.p, o[a]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "q", o = {
|
||||||
|
p: "FAIL",
|
||||||
|
get q() {
|
||||||
|
return "PASS";
|
||||||
|
},
|
||||||
|
set q(v) {
|
||||||
|
this.p = v;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
o.p = o.p;
|
||||||
|
o[a] = o[a];
|
||||||
|
console.log(o.p, o[a]);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
self_assignments_4: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var i = 0, l = [ "PASS" ];
|
||||||
|
l[0] = l[0];
|
||||||
|
l[i] = l[i];
|
||||||
|
console.log(l[0], i);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var i = 0, l = [ "PASS" ];
|
||||||
|
console.log(l[0], i);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS 0"
|
||||||
|
}
|
||||||
|
|
||||||
|
self_assignments_5: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
passes: 3,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var i = 0, l = [ "FAIL", "PASS" ];
|
||||||
|
l[0] = l[0];
|
||||||
|
l[i] = l[i];
|
||||||
|
l[i++] = l[i++];
|
||||||
|
console.log(l[0], i);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var i = 0, l = [ "FAIL", "PASS" ];
|
||||||
|
l[0];
|
||||||
|
l[0];
|
||||||
|
l[0] = l[1];
|
||||||
|
console.log(l[0], 2);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS 2"
|
||||||
|
}
|
||||||
|
|
||||||
|
self_assignments_6: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
p: "PASS",
|
||||||
|
};
|
||||||
|
console.log(o.p = o.p);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {
|
||||||
|
p: "PASS",
|
||||||
|
};
|
||||||
|
console.log(o.p);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3967: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "FAIL";
|
||||||
|
try {
|
||||||
|
a = 0 in (a = "PASS");
|
||||||
|
} catch (e) {}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "FAIL";
|
||||||
|
try {
|
||||||
|
a = 0 in (a = "PASS");
|
||||||
|
} catch (e) {}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4051: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try {
|
||||||
|
delete (A = A);
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
try {
|
||||||
|
delete (A = A);
|
||||||
|
} catch (e) {
|
||||||
|
console.log("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"
|
||||||
|
}
|
||||||
|
|||||||
1705
test/compress/default-values.js
Normal file
1705
test/compress/default-values.js
Normal file
File diff suppressed because it is too large
Load Diff
2558
test/compress/destructured.js
Normal file
2558
test/compress/destructured.js
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
147
test/compress/exponentiation.js
Normal file
147
test/compress/exponentiation.js
Normal file
@@ -0,0 +1,147 @@
|
|||||||
|
precedence_1: {
|
||||||
|
input: {
|
||||||
|
console.log(-4 ** 3 ** 2);
|
||||||
|
}
|
||||||
|
expect_exact: "console.log((-4)**3**2);"
|
||||||
|
expect_stdout: "-262144"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
precedence_2: {
|
||||||
|
input: {
|
||||||
|
console.log(-4 ** (3 ** 2));
|
||||||
|
}
|
||||||
|
expect_exact: "console.log((-4)**3**2);"
|
||||||
|
expect_stdout: "-262144"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
precedence_3: {
|
||||||
|
input: {
|
||||||
|
console.log(-(4 ** 3) ** 2);
|
||||||
|
}
|
||||||
|
expect_exact: "console.log((-(4**3))**2);"
|
||||||
|
expect_stdout: "4096"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
precedence_4: {
|
||||||
|
input: {
|
||||||
|
console.log((-4 ** 3) ** 2);
|
||||||
|
}
|
||||||
|
expect_exact: "console.log(((-4)**3)**2);"
|
||||||
|
expect_stdout: "4096"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
await: {
|
||||||
|
input: {
|
||||||
|
(async a => a * await a ** ++a % a)(2).then(console.log);
|
||||||
|
}
|
||||||
|
expect_exact: "(async a=>a*(await a)**++a%a)(2).then(console.log);"
|
||||||
|
expect_stdout: "1"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
assignment_1: {
|
||||||
|
input: {
|
||||||
|
var a = 2;
|
||||||
|
a **= 5;
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: "var a=2;a**=5;console.log(a);"
|
||||||
|
expect_stdout: "32"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
assignment_2: {
|
||||||
|
input: {
|
||||||
|
var a = 8n;
|
||||||
|
a **= a;
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: "var a=8n;a**=a;console.log(a);"
|
||||||
|
expect_stdout: "16777216n"
|
||||||
|
node_version: ">=10"
|
||||||
|
}
|
||||||
|
|
||||||
|
evaluate: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(1 + 2 ** 3 - 4);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(5);
|
||||||
|
}
|
||||||
|
expect_stdout: "5"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4664: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
new function(a) {
|
||||||
|
console.log(typeof f, a, typeof this);
|
||||||
|
}((A = 0, (NaN ^ 1) * 2 ** 30), 0);
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function f() {
|
||||||
|
new function(a) {
|
||||||
|
console.log(typeof f, 1073741824, typeof this);
|
||||||
|
}(A = 0);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "function 1073741824 object"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4715: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
A = 1;
|
||||||
|
console.log((-0) ** A + 0);
|
||||||
|
console.log((-0) ** A - 0);
|
||||||
|
console.log((-0) ** A * 1);
|
||||||
|
console.log((-0) ** A / 1);
|
||||||
|
console.log(Math.pow(-0, A) + 0);
|
||||||
|
console.log(Math.pow(-0, A) - 0);
|
||||||
|
console.log(Math.pow(-0, A) * 1);
|
||||||
|
console.log(Math.pow(-0, A) / 1);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
A = 1;
|
||||||
|
console.log((-0) ** A + 0);
|
||||||
|
console.log((-0) ** A);
|
||||||
|
console.log((-0) ** A * 1);
|
||||||
|
console.log((-0) ** A);
|
||||||
|
console.log(Math.pow(-0, A) + 0);
|
||||||
|
console.log(+Math.pow(-0, A));
|
||||||
|
console.log(+Math.pow(-0, A));
|
||||||
|
console.log(+Math.pow(-0, A));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"0",
|
||||||
|
"-0",
|
||||||
|
"-0",
|
||||||
|
"-0",
|
||||||
|
"0",
|
||||||
|
"-0",
|
||||||
|
"-0",
|
||||||
|
"-0",
|
||||||
|
]
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
498
test/compress/exports.js
Normal file
498
test/compress/exports.js
Normal file
@@ -0,0 +1,498 @@
|
|||||||
|
refs: {
|
||||||
|
input: {
|
||||||
|
export {};
|
||||||
|
export { a, b as B, c as case, d as default };
|
||||||
|
}
|
||||||
|
expect_exact: "export{};export{a,b as B,c as case,d as default};"
|
||||||
|
}
|
||||||
|
|
||||||
|
var_defs: {
|
||||||
|
input: {
|
||||||
|
export const a = 1;
|
||||||
|
export let b = 2, c = 3;
|
||||||
|
export var { d, e: [] } = f;
|
||||||
|
}
|
||||||
|
expect_exact: "export const a=1;export let b=2,c=3;export var{d,e:[]}=f;"
|
||||||
|
}
|
||||||
|
|
||||||
|
defuns: {
|
||||||
|
input: {
|
||||||
|
export class A {}
|
||||||
|
export function e() {}
|
||||||
|
export function* f(a) {}
|
||||||
|
export async function g(b, c) {}
|
||||||
|
export async function* h({}, ...[]) {}
|
||||||
|
}
|
||||||
|
expect_exact: "export class A{}export function e(){}export function*f(a){}export async function g(b,c){}export async function*h({},...[]){}"
|
||||||
|
}
|
||||||
|
|
||||||
|
defaults: {
|
||||||
|
input: {
|
||||||
|
export default 42;
|
||||||
|
export default async;
|
||||||
|
export default (x, y) => x * x;
|
||||||
|
export default class {};
|
||||||
|
export default function*(a, b) {};
|
||||||
|
export default async function f({ c }, ...[ d ]) {};
|
||||||
|
}
|
||||||
|
expect_exact: "export default 42;export default async;export default(x,y)=>x*x;export default class{}export default function*(a,b){}export default async function f({c},...[d]){}"
|
||||||
|
}
|
||||||
|
|
||||||
|
defaults_parentheses_1: {
|
||||||
|
input: {
|
||||||
|
export default function() {
|
||||||
|
console.log("FAIL");
|
||||||
|
}(console.log("PASS"));
|
||||||
|
}
|
||||||
|
expect_exact: 'export default function(){console.log("FAIL")}console.log("PASS");'
|
||||||
|
}
|
||||||
|
|
||||||
|
defaults_parentheses_2: {
|
||||||
|
input: {
|
||||||
|
export default (async function() {
|
||||||
|
console.log("PASS");
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_exact: 'export default(async function(){console.log("PASS")})();'
|
||||||
|
}
|
||||||
|
|
||||||
|
defaults_parentheses_3: {
|
||||||
|
input: {
|
||||||
|
export default (42, "PASS");
|
||||||
|
}
|
||||||
|
expect_exact: 'export default(42,"PASS");'
|
||||||
|
}
|
||||||
|
|
||||||
|
defaults_parentheses_4: {
|
||||||
|
input: {
|
||||||
|
export default (function f() {});
|
||||||
|
}
|
||||||
|
expect_exact: "export default(function f(){});"
|
||||||
|
}
|
||||||
|
|
||||||
|
defaults_parentheses_5: {
|
||||||
|
input: {
|
||||||
|
export default (function(a) {
|
||||||
|
console.log(a[0]);
|
||||||
|
}`PASS`);
|
||||||
|
}
|
||||||
|
expect_exact: "export default(function(a){console.log(a[0])})`PASS`;"
|
||||||
|
}
|
||||||
|
|
||||||
|
defaults_parentheses_6: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export default !function() {
|
||||||
|
while (!console);
|
||||||
|
}() ? "PASS" : "FAIL";
|
||||||
|
}
|
||||||
|
expect_exact: 'export default(function(){while(!console);})()?"FAIL":"PASS";'
|
||||||
|
}
|
||||||
|
|
||||||
|
defaults_regexp: {
|
||||||
|
input: {
|
||||||
|
export default /foo/;
|
||||||
|
}
|
||||||
|
expect_exact: "export default/foo/;"
|
||||||
|
}
|
||||||
|
|
||||||
|
foreign: {
|
||||||
|
input: {
|
||||||
|
export * from "foo";
|
||||||
|
export {} from "bar";
|
||||||
|
export * as a from "baz";
|
||||||
|
export { default } from "moo";
|
||||||
|
export { b, c as case, default as delete, d } from "moz";
|
||||||
|
}
|
||||||
|
expect_exact: 'export*from"foo";export{}from"bar";export*as a from"baz";export{default}from"moo";export{b,c as case,default as delete,d}from"moz";'
|
||||||
|
}
|
||||||
|
|
||||||
|
same_quotes: {
|
||||||
|
beautify = {
|
||||||
|
beautify: true,
|
||||||
|
quote_style: 3,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export * from 'foo';
|
||||||
|
export {} from "bar";
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"export * from 'foo';",
|
||||||
|
"",
|
||||||
|
'export {} from "bar";',
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_unused: {
|
||||||
|
options = {
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export default 42;
|
||||||
|
export default (x, y) => x * x;
|
||||||
|
export default class A extends B { get p() { h() } }
|
||||||
|
export default function*(a, b) {}
|
||||||
|
export default async function f({ c }, ...[ d ]) {}
|
||||||
|
export var e;
|
||||||
|
export function g(x, [ y ], ...z) {}
|
||||||
|
function h() {}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
export default 42;
|
||||||
|
export default (x, y) => x * x;
|
||||||
|
export default class extends B { get p() { h() } }
|
||||||
|
export default function*(a, b) {}
|
||||||
|
export default async function({}) {}
|
||||||
|
export var e;
|
||||||
|
export function g(x, []) {}
|
||||||
|
function h() {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle: {
|
||||||
|
rename = false
|
||||||
|
mangle = {
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
const a = 42;
|
||||||
|
export let b, { foo: c } = a;
|
||||||
|
export function f(d, { [b]: e }) {
|
||||||
|
d(e, f);
|
||||||
|
}
|
||||||
|
export default a;
|
||||||
|
export default async function g(x, ...{ [c]: y }) {
|
||||||
|
(await x)(g, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
const t = 42;
|
||||||
|
export let b, { foo: c } = t;
|
||||||
|
export function f(t, { [b]: o }) {
|
||||||
|
t(o, f);
|
||||||
|
}
|
||||||
|
export default t;
|
||||||
|
export default async function e(t, ...{ [c]: o}) {
|
||||||
|
(await t)(e, o);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_rename: {
|
||||||
|
rename = true
|
||||||
|
mangle = {
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
const a = 42;
|
||||||
|
export let b, { foo: c } = a;
|
||||||
|
export function f(d, { [b]: e }) {
|
||||||
|
d(e, f);
|
||||||
|
}
|
||||||
|
export default a;
|
||||||
|
export default async function g(x, ...{ [c]: y }) {
|
||||||
|
(await x)(g, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
const t = 42;
|
||||||
|
export let b, { foo: c } = t;
|
||||||
|
export function f(t, { [b]: o }) {
|
||||||
|
t(o, f);
|
||||||
|
}
|
||||||
|
export default t;
|
||||||
|
export default async function e(t, ...{ [c]: o}) {
|
||||||
|
(await t)(e, o);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
hoist_exports_1: {
|
||||||
|
options = {
|
||||||
|
hoist_exports: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export { a };
|
||||||
|
export var b;
|
||||||
|
export function f() {}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var b;
|
||||||
|
function f() {}
|
||||||
|
export { a, b, f };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
hoist_exports_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
hoist_exports: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
const a = 42;
|
||||||
|
export let bbb, { foo: ccc } = a;
|
||||||
|
export function fff(d, { [bbb]: e }) {
|
||||||
|
d(e, fff);
|
||||||
|
}
|
||||||
|
export default a;
|
||||||
|
export default async function g(x, ...{ [ccc]: y }) {
|
||||||
|
(await x)(g, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
let e, { foo: a } = 42;
|
||||||
|
function f(t, { [e]: o }) {
|
||||||
|
t(o, f);
|
||||||
|
}
|
||||||
|
export default 42;
|
||||||
|
export default async function n(t, ...{ [a]: o }) {
|
||||||
|
(await t)(n, o);
|
||||||
|
};
|
||||||
|
export { e as bbb, a as ccc, f as fff };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
hoist_vars: {
|
||||||
|
options = {
|
||||||
|
hoist_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
export var b = 42;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
export var b = 42;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
keep_return_values: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export default function() {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
export default function f() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
export default function() {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
export default function f() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
in_use: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export function f() {}
|
||||||
|
f.prototype.p = 42;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
export function f() {}
|
||||||
|
f.prototype.p = 42;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
in_use_default: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export default function f() {}
|
||||||
|
f.prototype.p = 42;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
export default function f() {}
|
||||||
|
f.prototype.p = 42;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
single_use: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export function f() {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
export function f() {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
single_use_default: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export default function f() {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
export default function f() {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
single_use_class: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export class A {}
|
||||||
|
A.prototype.p = "PASS";
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
export class A {}
|
||||||
|
A.prototype.p = "PASS";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
single_use_class_default: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export default class A {}
|
||||||
|
A.prototype.p = "PASS";
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
export default class A {}
|
||||||
|
A.prototype.p = "PASS";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
hoist_funs: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export function f() {}
|
||||||
|
export default async function* g() {}
|
||||||
|
}
|
||||||
|
expect_exact: "export function f(){}export default async function*g(){}"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4742_join_vars_1: {
|
||||||
|
options = {
|
||||||
|
join_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 42;
|
||||||
|
export var a;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 42;
|
||||||
|
export var a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4742_join_vars_2: {
|
||||||
|
options = {
|
||||||
|
join_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export var a = "foo";
|
||||||
|
var b;
|
||||||
|
b = "bar";
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
export var a = "foo";
|
||||||
|
var b, b = "bar";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4742_unused_1: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 42;
|
||||||
|
export var a;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 42;
|
||||||
|
export var a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4742_unused_2: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export var a = "foo";
|
||||||
|
var a = "bar";
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
export var a = "foo";
|
||||||
|
a = "bar";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4761: {
|
||||||
|
input: {
|
||||||
|
export default "function" == 42;
|
||||||
|
}
|
||||||
|
expect_exact: 'export default"function"==42;'
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4766: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "foo";
|
||||||
|
export var a = "bar";
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "foo";
|
||||||
|
export var a = "bar";
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -12,6 +12,20 @@ must_replace: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
repeated_nodes: {
|
||||||
|
options = {
|
||||||
|
global_defs: {
|
||||||
|
"@N": "rand()",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(N, N);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(rand(), rand());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
keyword: {
|
keyword: {
|
||||||
options = {
|
options = {
|
||||||
global_defs: {
|
global_defs: {
|
||||||
|
|||||||
@@ -297,6 +297,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_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,
|
||||||
@@ -912,3 +939,158 @@ issue_3440: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_3868: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(t) {
|
||||||
|
t = {};
|
||||||
|
({
|
||||||
|
get p() {},
|
||||||
|
q: (console.log("PASS"), +t),
|
||||||
|
}).r;
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(t) {
|
||||||
|
t = {};
|
||||||
|
({
|
||||||
|
get p() {},
|
||||||
|
q: (console.log("PASS"), +t),
|
||||||
|
}).r;
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3871: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
do {
|
||||||
|
var b = {
|
||||||
|
get null() {
|
||||||
|
c;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} while (!b);
|
||||||
|
return "PASS";
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function() {
|
||||||
|
do {
|
||||||
|
var b = {
|
||||||
|
get null() {
|
||||||
|
c;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} while (!b);
|
||||||
|
return "PASS";
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3945_1: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
o.p;
|
||||||
|
var o = {
|
||||||
|
q: 0,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
o.p;
|
||||||
|
var o = {
|
||||||
|
q: 0,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3945_2: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(typeof o);
|
||||||
|
var o = {
|
||||||
|
p: 0,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(typeof o);
|
||||||
|
var o = {
|
||||||
|
p: 0,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4023: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
hoist_props: true,
|
||||||
|
inline: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
typeofs: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
var a = function() {
|
||||||
|
return { p: 0 };
|
||||||
|
}();
|
||||||
|
return console.log("undefined" != typeof a);
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(void 0 !== {});
|
||||||
|
}
|
||||||
|
expect_stdout: "true"
|
||||||
|
}
|
||||||
|
|
||||||
|
object_super: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
f(a) {
|
||||||
|
return a ? console.log("PASS") : super.log("PASS");
|
||||||
|
},
|
||||||
|
};
|
||||||
|
o.f(42);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {
|
||||||
|
f(a) {
|
||||||
|
return a ? console.log("PASS") : super.log("PASS");
|
||||||
|
},
|
||||||
|
};
|
||||||
|
o.f(42);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|||||||
@@ -89,6 +89,31 @@ sequences_funs: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
catch_var: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS";
|
||||||
|
try {
|
||||||
|
a;
|
||||||
|
} catch (a) {
|
||||||
|
var a = 0;
|
||||||
|
a;
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "PASS";
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
issue_2295: {
|
issue_2295: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
@@ -109,3 +134,163 @@ issue_2295: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4487: {
|
||||||
|
options = {
|
||||||
|
functions: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
keep_fnames: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = function f() {
|
||||||
|
var f = console.log(typeof f);
|
||||||
|
};
|
||||||
|
var b = a();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function a() {
|
||||||
|
var f = console.log(typeof f);
|
||||||
|
}
|
||||||
|
a();
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4489: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
A = 0;
|
||||||
|
var o = !0 || null;
|
||||||
|
for (var k in o);
|
||||||
|
console.log(k);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
!(A = 0);
|
||||||
|
for (var k in true);
|
||||||
|
console.log(k);
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4517: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
join_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
var a = 2;
|
||||||
|
A = a;
|
||||||
|
var b = typeof !1;
|
||||||
|
return A + b;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function() {
|
||||||
|
var a = 2;
|
||||||
|
A = a;
|
||||||
|
return A + typeof !1;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "2boolean"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4736: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
merge_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
function f() {
|
||||||
|
(function g() {
|
||||||
|
var b = (a = 0, 1 << 30);
|
||||||
|
var c = (a = 0, console.log(b));
|
||||||
|
var d = c;
|
||||||
|
})(f);
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function() {
|
||||||
|
(function() {
|
||||||
|
0,
|
||||||
|
console.log(1073741824);
|
||||||
|
})();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "1073741824"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4839: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = function(a, b) {
|
||||||
|
return b && b;
|
||||||
|
}("foo");
|
||||||
|
for (var k in o)
|
||||||
|
throw "FAIL";
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var k, o = void 0;
|
||||||
|
for (k in o)
|
||||||
|
throw "FAIL";
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4859: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
keep_infinity: true,
|
||||||
|
merge_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
var b = (a = 2, 1 / 0), c = 3;
|
||||||
|
var d = a + b;
|
||||||
|
console.log(d);
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function f(a) {
|
||||||
|
var d = 1 / 0, d = Infinity;
|
||||||
|
console.log(d);
|
||||||
|
return f;
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "Infinity"
|
||||||
|
}
|
||||||
|
|||||||
@@ -588,7 +588,6 @@ issue_3197_1: {
|
|||||||
ie8: false,
|
ie8: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var window = {};
|
|
||||||
!function() {
|
!function() {
|
||||||
function Foo() {
|
function Foo() {
|
||||||
console.log(this instanceof Foo);
|
console.log(this instanceof Foo);
|
||||||
@@ -598,7 +597,6 @@ issue_3197_1: {
|
|||||||
new window.Foo();
|
new window.Foo();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var window = {};
|
|
||||||
window.Foo = function o() {
|
window.Foo = function o() {
|
||||||
console.log(this instanceof o);
|
console.log(this instanceof o);
|
||||||
};
|
};
|
||||||
@@ -619,7 +617,6 @@ issue_3197_1_ie8: {
|
|||||||
ie8: true,
|
ie8: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var window = {};
|
|
||||||
!function() {
|
!function() {
|
||||||
function Foo() {
|
function Foo() {
|
||||||
console.log(this instanceof Foo);
|
console.log(this instanceof Foo);
|
||||||
@@ -629,7 +626,6 @@ issue_3197_1_ie8: {
|
|||||||
new window.Foo();
|
new window.Foo();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var window = {};
|
|
||||||
window.Foo = function Foo() {
|
window.Foo = function Foo() {
|
||||||
console.log(this instanceof Foo);
|
console.log(this instanceof Foo);
|
||||||
};
|
};
|
||||||
@@ -2223,13 +2219,13 @@ issue_3523_rename_ie8: {
|
|||||||
expect: {
|
expect: {
|
||||||
var a = 0, b, c = "FAIL";
|
var a = 0, b, c = "FAIL";
|
||||||
(function() {
|
(function() {
|
||||||
var c, n, t, o, a, r, f, i, u, e, h, l, v, y;
|
var c, n, t, o, a, r, e, f, i, u, h, l, v, y;
|
||||||
})();
|
})();
|
||||||
try {
|
try {
|
||||||
throw 0;
|
throw 0;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
(function() {
|
(function() {
|
||||||
(function n() {
|
(function e() {
|
||||||
c = "PASS";
|
c = "PASS";
|
||||||
})();
|
})();
|
||||||
})();
|
})();
|
||||||
@@ -2389,7 +2385,7 @@ issue_3703: {
|
|||||||
var a = "PASS";
|
var a = "PASS";
|
||||||
(function() {
|
(function() {
|
||||||
var b;
|
var b;
|
||||||
var c = function g() {
|
var c = function() {
|
||||||
a = "FAIL";
|
a = "FAIL";
|
||||||
};
|
};
|
||||||
a ? b |= c : b.p;
|
a ? b |= c : b.p;
|
||||||
@@ -2460,3 +2456,492 @@ issue_3825: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "undefined"
|
expect_stdout: "undefined"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_3889: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
ie8: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
a = 0;
|
||||||
|
(function a() {
|
||||||
|
var a;
|
||||||
|
console.log(a);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a) {
|
||||||
|
a = 0;
|
||||||
|
(function a() {
|
||||||
|
var a;
|
||||||
|
console.log(a);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3918: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
ie8: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
if (console.log("PASS")) {
|
||||||
|
var a = function f() {
|
||||||
|
f.p;
|
||||||
|
try {
|
||||||
|
console.log("FAIL");
|
||||||
|
} catch (e) {}
|
||||||
|
}, b = a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
console.log("PASS") && (a = function f() {
|
||||||
|
f.p;
|
||||||
|
try {
|
||||||
|
console.log("FAIL");
|
||||||
|
} catch (o) {}
|
||||||
|
}, a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3999: {
|
||||||
|
rename = true
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
(function f() {
|
||||||
|
for (var i = 0; i < 2; i++)
|
||||||
|
try {
|
||||||
|
f[0];
|
||||||
|
} catch (f) {
|
||||||
|
var f = 0;
|
||||||
|
console.log(i);
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
})(typeof f);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function() {
|
||||||
|
(function f() {
|
||||||
|
for (var o = 0; o < 2; o++)
|
||||||
|
try {
|
||||||
|
f[0];
|
||||||
|
} catch (f) {
|
||||||
|
var f = 0;
|
||||||
|
console.log(o);
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
})(typeof f);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"0",
|
||||||
|
"1",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4001: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
ie8: true,
|
||||||
|
inline: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(a) {
|
||||||
|
function f() {
|
||||||
|
return a;
|
||||||
|
var b;
|
||||||
|
}
|
||||||
|
var c = f();
|
||||||
|
(function g() {
|
||||||
|
c[42];
|
||||||
|
f;
|
||||||
|
})();
|
||||||
|
(function a() {});
|
||||||
|
}(42));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
var a;
|
||||||
|
console.log((a = 42, void f()[42], void function a() {}));
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4015: {
|
||||||
|
rename = true
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var n, a = 0, b;
|
||||||
|
function f() {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (b) {
|
||||||
|
(function g() {
|
||||||
|
(function b() {
|
||||||
|
a++;
|
||||||
|
})();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var n, o = 0, c;
|
||||||
|
function t() {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (c) {
|
||||||
|
(function n() {
|
||||||
|
(function c() {
|
||||||
|
o++;
|
||||||
|
})();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
t();
|
||||||
|
console.log(o);
|
||||||
|
}
|
||||||
|
expect_stdout: "1"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4019: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = function() {
|
||||||
|
try {
|
||||||
|
console.log("FAIL");
|
||||||
|
} catch (b) {}
|
||||||
|
}, a = (console.log(a.length), ++a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = function() {
|
||||||
|
try {
|
||||||
|
console.log("FAIL");
|
||||||
|
} catch (o) {}
|
||||||
|
}, o = (console.log(o.length), ++o);
|
||||||
|
}
|
||||||
|
expect_stdout: "0"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4028: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function a() {
|
||||||
|
try {
|
||||||
|
A;
|
||||||
|
} catch (e) {}
|
||||||
|
}
|
||||||
|
var b = a += a;
|
||||||
|
console.log(typeof b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function a() {
|
||||||
|
try {
|
||||||
|
A;
|
||||||
|
} catch (a) {}
|
||||||
|
}
|
||||||
|
var b = a += a;
|
||||||
|
console.log(typeof b);
|
||||||
|
}
|
||||||
|
expect_stdout: "string"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2737: {
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a) {
|
||||||
|
a();
|
||||||
|
})(function f() {
|
||||||
|
console.log(typeof f);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(a) {
|
||||||
|
a();
|
||||||
|
})(function f() {
|
||||||
|
console.log(typeof f);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect_stdout: "function"
|
||||||
|
}
|
||||||
|
|
||||||
|
single_use_catch_redefined: {
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
try {
|
||||||
|
throw 2;
|
||||||
|
} catch (a) {
|
||||||
|
function g() {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(g());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 1;
|
||||||
|
try {
|
||||||
|
throw 2;
|
||||||
|
} catch (a) {
|
||||||
|
function g() {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(g());
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
single_use_inline_catch_redefined: {
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
inline: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
try {
|
||||||
|
throw 2;
|
||||||
|
} catch (a) {
|
||||||
|
function g() {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(g());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 1;
|
||||||
|
try {
|
||||||
|
throw 2;
|
||||||
|
} catch (a) {
|
||||||
|
function g() {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(g());
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
direct_inline_catch_redefined: {
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
inline: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
function f() {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
throw 2;
|
||||||
|
} catch (a) {
|
||||||
|
function g() {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
console.log(a, f(), g());
|
||||||
|
}
|
||||||
|
console.log(a, f(), g());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 1;
|
||||||
|
function f() {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
throw 2;
|
||||||
|
} catch (a) {
|
||||||
|
function g() {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
console.log(a, f(), g());
|
||||||
|
}
|
||||||
|
console.log(a, a, g());
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4186: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
ie8: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
(function NaN() {
|
||||||
|
var a = 1;
|
||||||
|
while (a--)
|
||||||
|
try {} finally {
|
||||||
|
console.log(0/0);
|
||||||
|
var b;
|
||||||
|
}
|
||||||
|
})(f);
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
NaN;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function() {
|
||||||
|
(function NaN() {
|
||||||
|
var n = 1;
|
||||||
|
while (n--)
|
||||||
|
console.log(0/0);
|
||||||
|
})();
|
||||||
|
})();
|
||||||
|
NaN;
|
||||||
|
}
|
||||||
|
expect_stdout: "NaN"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4235: {
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try {} catch (e) {}
|
||||||
|
console.log(function e() {
|
||||||
|
var e = 0;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
try {} catch (e) {}
|
||||||
|
console.log(function e() {}());
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4250: {
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
loops: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function f() {
|
||||||
|
(function() {
|
||||||
|
for (f in "f");
|
||||||
|
})();
|
||||||
|
return f;
|
||||||
|
var f;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function f() {
|
||||||
|
(function() {
|
||||||
|
for (f in "f");
|
||||||
|
})();
|
||||||
|
return f;
|
||||||
|
var f;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "0"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4568: {
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(typeof f, function(a) {
|
||||||
|
return a.length;
|
||||||
|
}([ function f() {} ]));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(typeof f, function(a) {
|
||||||
|
return a.length;
|
||||||
|
}([ function f() {} ]));
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined 1"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4729: {
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
pure_getters: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try {
|
||||||
|
f;
|
||||||
|
} catch (e) {
|
||||||
|
var a = a && a[function f() {}];
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
try {
|
||||||
|
f;
|
||||||
|
} catch (e) {
|
||||||
|
(function f() {});
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|||||||
@@ -573,3 +573,178 @@ issue_3600: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "1"
|
expect_stdout: "1"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
iife_if_return_simple: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
if_return: true,
|
||||||
|
inline: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
if (console)
|
||||||
|
return console.log("PASS");
|
||||||
|
console.log("FAIL");
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console ? console.log("PASS") : console.log("FAIL");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
nested_if_break: {
|
||||||
|
options = {
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
for (var i = 0; i < 3; i++)
|
||||||
|
L1: if ("number" == typeof i) {
|
||||||
|
if (0 === i) break L1;
|
||||||
|
console.log(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
for (var i = 0; i < 3; i++)
|
||||||
|
L1: if ("number" == typeof i)
|
||||||
|
if (0 !== i) console.log(i);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"1",
|
||||||
|
"2",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
nested_if_continue: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
loops: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(n) {
|
||||||
|
var i = 0;
|
||||||
|
do {
|
||||||
|
if ("number" == typeof n) {
|
||||||
|
if (0 === n) {
|
||||||
|
console.log("even", i);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (1 === n) {
|
||||||
|
console.log("odd", i);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
} while (0 <= (n -= 2));
|
||||||
|
}
|
||||||
|
f(37);
|
||||||
|
f(42);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(n) {
|
||||||
|
for (var i = 0;
|
||||||
|
"number" == typeof n
|
||||||
|
&& (0 !== n
|
||||||
|
? 1 !== n
|
||||||
|
? i++
|
||||||
|
: console.log("odd", i)
|
||||||
|
: console.log("even", i)),
|
||||||
|
0 <= (n -= 2););
|
||||||
|
}
|
||||||
|
f(37);
|
||||||
|
f(42);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"odd 18",
|
||||||
|
"even 21",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
nested_if_return: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
if (A) {
|
||||||
|
if (B)
|
||||||
|
return B;
|
||||||
|
if (C)
|
||||||
|
return D;
|
||||||
|
if (E)
|
||||||
|
return F;
|
||||||
|
if (G)
|
||||||
|
return H;
|
||||||
|
if (I) {
|
||||||
|
if (J)
|
||||||
|
return K;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (L) {
|
||||||
|
if (M)
|
||||||
|
return;
|
||||||
|
return N;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
if (A)
|
||||||
|
return B || (C ? D : E ? F : G ? H : I ? J ? K : void 0 : L && !M ? N : void 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_866_1: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
if_return: true,
|
||||||
|
sequences: false,
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
if (a)
|
||||||
|
return "";
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a) {
|
||||||
|
if (a)
|
||||||
|
return "";
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_866_2: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
if_return: true,
|
||||||
|
sequences: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
if (a)
|
||||||
|
if (b)
|
||||||
|
c;
|
||||||
|
else
|
||||||
|
return d;
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function() {
|
||||||
|
if (a) {
|
||||||
|
if (!b)
|
||||||
|
return d;
|
||||||
|
c;
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
211
test/compress/imports.js
Normal file
211
test/compress/imports.js
Normal file
@@ -0,0 +1,211 @@
|
|||||||
|
nought: {
|
||||||
|
input: {
|
||||||
|
import "foo";
|
||||||
|
}
|
||||||
|
expect_exact: 'import"foo";'
|
||||||
|
}
|
||||||
|
|
||||||
|
default_only: {
|
||||||
|
input: {
|
||||||
|
import foo from "bar";
|
||||||
|
}
|
||||||
|
expect_exact: 'import foo from"bar";'
|
||||||
|
}
|
||||||
|
|
||||||
|
all_only: {
|
||||||
|
input: {
|
||||||
|
import * as foo from "bar";
|
||||||
|
}
|
||||||
|
expect_exact: 'import*as foo from"bar";'
|
||||||
|
}
|
||||||
|
|
||||||
|
keys_only: {
|
||||||
|
input: {
|
||||||
|
import { as as foo, bar, delete as baz } from "moo";
|
||||||
|
}
|
||||||
|
expect_exact: 'import{as as foo,bar,delete as baz}from"moo";'
|
||||||
|
}
|
||||||
|
|
||||||
|
default_all: {
|
||||||
|
input: {
|
||||||
|
import foo, * as bar from "baz";
|
||||||
|
}
|
||||||
|
expect_exact: 'import foo,*as bar from"baz";'
|
||||||
|
}
|
||||||
|
|
||||||
|
default_keys: {
|
||||||
|
input: {
|
||||||
|
import foo, { bar } from "baz";
|
||||||
|
}
|
||||||
|
expect_exact: 'import foo,{bar}from"baz";'
|
||||||
|
}
|
||||||
|
|
||||||
|
dynamic: {
|
||||||
|
input: {
|
||||||
|
(async a => await import(a))("foo").then(bar);
|
||||||
|
}
|
||||||
|
expect_exact: '(async a=>await import(a))("foo").then(bar);'
|
||||||
|
}
|
||||||
|
|
||||||
|
dynamic_nought: {
|
||||||
|
input: {
|
||||||
|
import(foo);
|
||||||
|
}
|
||||||
|
expect_exact: "import(foo);"
|
||||||
|
}
|
||||||
|
|
||||||
|
import_meta_1: {
|
||||||
|
input: {
|
||||||
|
console.log(import.meta, import.meta.url);
|
||||||
|
}
|
||||||
|
expect_exact: "console.log(import.meta,import.meta.url);"
|
||||||
|
}
|
||||||
|
|
||||||
|
import_meta_2: {
|
||||||
|
input: {
|
||||||
|
import.meta.url.split("/").forEach(function(part, index) {
|
||||||
|
console.log(index, part);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect_exact: 'import.meta.url.split("/").forEach(function(part,index){console.log(index,part)});'
|
||||||
|
}
|
||||||
|
|
||||||
|
same_quotes: {
|
||||||
|
beautify = {
|
||||||
|
beautify: true,
|
||||||
|
quote_style: 3,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
import 'foo';
|
||||||
|
import "bar";
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"import 'foo';",
|
||||||
|
"",
|
||||||
|
'import "bar";',
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_unused: {
|
||||||
|
options = {
|
||||||
|
imports: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
import a, * as b from "foo";
|
||||||
|
import { c, bar as d } from "baz";
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
import "foo";
|
||||||
|
import { c as c } from "baz";
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle: {
|
||||||
|
rename = false
|
||||||
|
mangle = {
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
import foo, { bar } from "baz";
|
||||||
|
consoe.log(moo);
|
||||||
|
import * as moo from "moz";
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
import o, { bar as m } from "baz";
|
||||||
|
consoe.log(r);
|
||||||
|
import * as r from "moz";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rename_mangle: {
|
||||||
|
rename = true
|
||||||
|
mangle = {
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
import foo, { bar } from "baz";
|
||||||
|
consoe.log(moo);
|
||||||
|
import * as moo from "moz";
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
import o, { bar as m } from "baz";
|
||||||
|
consoe.log(r);
|
||||||
|
import * as r from "moz";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
keep_ref: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
import foo from "bar";
|
||||||
|
foo();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
import foo from "bar";
|
||||||
|
foo();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
forbid_merge: {
|
||||||
|
options = {
|
||||||
|
merge_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
import A from "foo";
|
||||||
|
export default class extends A {}
|
||||||
|
var f = () => () => {};
|
||||||
|
f();
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
import A from "foo";
|
||||||
|
export default class extends A {}
|
||||||
|
var f = () => () => {};
|
||||||
|
f();
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4708_1: {
|
||||||
|
options = {
|
||||||
|
imports: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
import a from "foo";
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
import a from "foo";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4708_2: {
|
||||||
|
options = {
|
||||||
|
imports: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
console.log(a);
|
||||||
|
import a from "foo";
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
console.log(a);
|
||||||
|
import a from "foo";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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]",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ multiple_functions: {
|
|||||||
( 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() {}
|
||||||
} )();
|
} )();
|
||||||
@@ -38,7 +38,7 @@ single_function: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
( function() {
|
( function() {
|
||||||
if ( window );
|
if ( !window );
|
||||||
function f() {}
|
function f() {}
|
||||||
} )();
|
} )();
|
||||||
}
|
}
|
||||||
@@ -67,7 +67,7 @@ deeply_nested: {
|
|||||||
// 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);
|
if ( !document );
|
||||||
function f() {}
|
function f() {}
|
||||||
function g() {}
|
function g() {}
|
||||||
function h() {}
|
function h() {}
|
||||||
|
|||||||
@@ -151,15 +151,18 @@ Infinity_not_in_with_scope: {
|
|||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var o = { Infinity: 'oInfinity' };
|
var o = { Infinity: "FAIL" };
|
||||||
var vInfinity = "Infinity";
|
var vInfinity = "Infinity";
|
||||||
vInfinity = Infinity;
|
vInfinity = Infinity;
|
||||||
|
console.log(vInfinity);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var o = { Infinity: 'oInfinity' }
|
var o = { Infinity: "FAIL" };
|
||||||
var vInfinity = "Infinity"
|
var vInfinity = "Infinity";
|
||||||
vInfinity = 1/0
|
vInfinity = 1/0;
|
||||||
|
console.log(vInfinity);
|
||||||
}
|
}
|
||||||
|
expect_stdout: "Infinity"
|
||||||
}
|
}
|
||||||
|
|
||||||
Infinity_in_with_scope: {
|
Infinity_in_with_scope: {
|
||||||
@@ -167,15 +170,18 @@ Infinity_in_with_scope: {
|
|||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var o = { Infinity: 'oInfinity' };
|
var o = { Infinity: "PASS" };
|
||||||
var vInfinity = "Infinity";
|
var vInfinity = "Infinity";
|
||||||
with (o) { vInfinity = Infinity; }
|
with (o) { vInfinity = Infinity; }
|
||||||
|
console.log(vInfinity);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var o = { Infinity: 'oInfinity' }
|
var o = { Infinity: "PASS" };
|
||||||
var vInfinity = "Infinity"
|
var vInfinity = "Infinity";
|
||||||
with (o) vInfinity = Infinity
|
with (o) vInfinity = Infinity;
|
||||||
|
console.log(vInfinity);
|
||||||
}
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
assorted_Infinity_NaN_undefined_in_with_scope: {
|
assorted_Infinity_NaN_undefined_in_with_scope: {
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -35,11 +35,7 @@ f7: {
|
|||||||
console.log(a, b);
|
console.log(a, b);
|
||||||
}
|
}
|
||||||
expect_exact: [
|
expect_exact: [
|
||||||
"var b = 10;",
|
"console.log(100, 100);",
|
||||||
"",
|
|
||||||
"!function() {",
|
|
||||||
" b = 100;",
|
|
||||||
"}(), console.log(100, b);",
|
|
||||||
]
|
]
|
||||||
expect_stdout: true
|
expect_stdout: "100 100"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -426,6 +426,7 @@ wrap_iife_in_return_call: {
|
|||||||
|
|
||||||
pure_annotation_1: {
|
pure_annotation_1: {
|
||||||
options = {
|
options = {
|
||||||
|
annotations: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
@@ -439,6 +440,7 @@ pure_annotation_1: {
|
|||||||
|
|
||||||
pure_annotation_2: {
|
pure_annotation_2: {
|
||||||
options = {
|
options = {
|
||||||
|
annotations: true,
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
@@ -463,15 +465,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 +492,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",
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 = {
|
||||||
input: {
|
beautify: true,
|
||||||
function f1(a, eval, c, d, e) {
|
|
||||||
return a('c') + eval;
|
|
||||||
}
|
|
||||||
function f2(a, b, c, d, e) {
|
|
||||||
return a + eval('c');
|
|
||||||
}
|
|
||||||
function f3(a, eval, c, d, e) {
|
|
||||||
return a + eval('c');
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
expect_exact: 'function f1(n,c,e,a,f){return n("c")+c}function f2(a,b,c,d,e){return a+eval("c")}function f3(a,eval,c,d,e){return a+eval("c")}'
|
input: {
|
||||||
|
function o(k) {
|
||||||
|
return { cc: 14 }[k + "c"];
|
||||||
|
}
|
||||||
|
console.log(function f1(a, eval, c, d, e) {
|
||||||
|
return a("c") + eval;
|
||||||
|
}(o, 28, true));
|
||||||
|
console.log(function f2(a, b, c, d, e) {
|
||||||
|
return a + eval("c");
|
||||||
|
}(14, true, 28));
|
||||||
|
console.log(function f3(a, eval, c, d, e) {
|
||||||
|
return a + eval("c");
|
||||||
|
}(28, o, true));
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"function o(o) {",
|
||||||
|
" return {",
|
||||||
|
" cc: 14",
|
||||||
|
' }[o + "c"];',
|
||||||
|
"}",
|
||||||
|
"",
|
||||||
|
"console.log(function o(c, e, n, r, t) {",
|
||||||
|
' return c("c") + e;',
|
||||||
|
"}(o, 28, true));",
|
||||||
|
"",
|
||||||
|
"console.log(function f2(a, b, c, d, e) {",
|
||||||
|
' return a + eval("c");',
|
||||||
|
"}(14, true, 28));",
|
||||||
|
"",
|
||||||
|
"console.log(function f3(a, eval, c, d, e) {",
|
||||||
|
' return a + eval("c");',
|
||||||
|
"}(28, o, true));",
|
||||||
|
]
|
||||||
|
expect_stdout: [
|
||||||
|
"42",
|
||||||
|
"42",
|
||||||
|
"42",
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -277,8 +277,8 @@ join_object_assignments_forin: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
console.log(function() {
|
console.log(function() {
|
||||||
var o = { a: "PASS" };
|
var o = { a: "PASS" }, a;
|
||||||
for (var a in o)
|
for (a in o)
|
||||||
return o[a];
|
return o[a];
|
||||||
}());
|
}());
|
||||||
}
|
}
|
||||||
@@ -785,11 +785,12 @@ issue_3791_2: {
|
|||||||
|
|
||||||
issue_3795: {
|
issue_3795: {
|
||||||
options = {
|
options = {
|
||||||
|
booleans: true,
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
conditionals: true,
|
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
join_vars: true,
|
join_vars: true,
|
||||||
|
keep_fargs: false,
|
||||||
loops: true,
|
loops: true,
|
||||||
passes: 2,
|
passes: 2,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
@@ -798,22 +799,21 @@ issue_3795: {
|
|||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var a = "FAIL";
|
var a = "FAIL";
|
||||||
function f(b) {
|
function f(b, c) {
|
||||||
for (var i = 1; b && i; --i) return 0;
|
for (var i = 5; c && i; --i) return -1;
|
||||||
a = "PASS";
|
a = "PASS";
|
||||||
}
|
}
|
||||||
var c = f(a = "");
|
var d = f(a = 42, d);
|
||||||
console.log(a);
|
console.log(a, d);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var a = "FAIL";
|
var a = "FAIL", d = function() {
|
||||||
(function(b) {
|
if (void 0) return -1;
|
||||||
a = "";
|
|
||||||
a = "PASS";
|
a = "PASS";
|
||||||
})();
|
}(a = 42);
|
||||||
console.log(a);
|
console.log(a, d);
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS undefined"
|
||||||
}
|
}
|
||||||
|
|
||||||
if_body: {
|
if_body: {
|
||||||
@@ -989,3 +989,141 @@ conditional_assignments_3: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_3856: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
sequences: 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) return !!a;
|
||||||
|
for (a = 0; !console;);
|
||||||
|
return 0;
|
||||||
|
})();
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3916: {
|
||||||
|
options = {
|
||||||
|
join_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {};
|
||||||
|
o.p = "PASS";
|
||||||
|
o.__proto__ = 42;
|
||||||
|
o.q = "FAIL";
|
||||||
|
o.__proto__ = {
|
||||||
|
p: "FAIL",
|
||||||
|
q: "PASS",
|
||||||
|
};
|
||||||
|
o.__proto__ = "foo";
|
||||||
|
console.log(typeof o.__proto__, o.p, delete o.q, o.q);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {
|
||||||
|
p: "PASS",
|
||||||
|
__proto__: 42,
|
||||||
|
q: "FAIL",
|
||||||
|
};
|
||||||
|
o.__proto__ = {
|
||||||
|
p: "FAIL",
|
||||||
|
q: "PASS",
|
||||||
|
};
|
||||||
|
o.__proto__ = "foo";
|
||||||
|
console.log(typeof o.__proto__, o.p, delete o.q, o.q);
|
||||||
|
}
|
||||||
|
expect_stdout: "object PASS true PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
assign_var: {
|
||||||
|
options = {
|
||||||
|
join_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
b = "foo";
|
||||||
|
var a = [ , "bar" ];
|
||||||
|
console.log(b);
|
||||||
|
for (var b in a)
|
||||||
|
console.log(b, a[b]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var b = "foo", a = [ , "bar" ], b;
|
||||||
|
console.log(b);
|
||||||
|
for (b in a)
|
||||||
|
console.log(b, a[b]);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"1 bar",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
assign_for_var: {
|
||||||
|
options = {
|
||||||
|
join_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
i = "foo",
|
||||||
|
a = new Array(i, "bar");
|
||||||
|
for (var i = 2; --i >= 0;) {
|
||||||
|
console.log(a[i]);
|
||||||
|
for (var a in i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
for (var i = "foo", a = new Array(i, "bar"), i = 2; --i >= 0;) {
|
||||||
|
console.log(a[i]);
|
||||||
|
for (var a in i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"bar",
|
||||||
|
"foo",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
assign_sequence_var: {
|
||||||
|
options = {
|
||||||
|
join_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 0, b = 1;
|
||||||
|
console.log(a),
|
||||||
|
a++,
|
||||||
|
b = 2;
|
||||||
|
var c = 3;
|
||||||
|
console.log(a, b, c);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 0, b = 1;
|
||||||
|
console.log(a),
|
||||||
|
a++;
|
||||||
|
var b = 2, c = 3;
|
||||||
|
console.log(a, b, c);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"0",
|
||||||
|
"1 2 3",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|||||||
@@ -18,43 +18,6 @@ keep_fargs_false: {
|
|||||||
function j(e) {}
|
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,7 +115,7 @@ 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,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -224,7 +137,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 +158,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: {
|
||||||
@@ -280,7 +193,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,
|
||||||
@@ -306,8 +219,6 @@ issue_2298: {
|
|||||||
expect: {
|
expect: {
|
||||||
!function() {
|
!function() {
|
||||||
(function() {
|
(function() {
|
||||||
var a = undefined;
|
|
||||||
var undefined = a++;
|
|
||||||
try {
|
try {
|
||||||
!function() {
|
!function() {
|
||||||
(void 0)[1] = "foo";
|
(void 0)[1] = "foo";
|
||||||
@@ -325,7 +236,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: {
|
||||||
@@ -348,7 +259,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: {
|
||||||
@@ -373,7 +284,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: {
|
||||||
@@ -398,7 +309,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: {
|
||||||
@@ -421,7 +332,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: {
|
||||||
@@ -444,7 +355,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: {
|
||||||
@@ -467,7 +378,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,
|
||||||
@@ -501,7 +412,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,
|
||||||
@@ -540,7 +451,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,
|
||||||
}
|
}
|
||||||
@@ -587,7 +498,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,
|
||||||
@@ -609,7 +520,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,
|
||||||
}
|
}
|
||||||
@@ -629,7 +540,7 @@ issue_2226_3: {
|
|||||||
|
|
||||||
issue_3192: {
|
issue_3192: {
|
||||||
options = {
|
options = {
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -659,7 +570,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,
|
||||||
}
|
}
|
||||||
@@ -681,7 +592,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,
|
||||||
}
|
}
|
||||||
@@ -705,7 +616,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,
|
||||||
}
|
}
|
||||||
@@ -742,7 +653,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,
|
||||||
@@ -807,7 +718,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,
|
||||||
@@ -839,7 +750,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,
|
||||||
@@ -891,7 +802,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,
|
||||||
@@ -911,7 +822,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,
|
||||||
@@ -931,7 +842,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,
|
||||||
@@ -952,7 +863,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,
|
||||||
@@ -974,7 +885,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: {
|
||||||
@@ -994,7 +905,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,
|
||||||
@@ -1015,7 +926,7 @@ duplicate_lambda_defun_name_2: {
|
|||||||
|
|
||||||
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,
|
||||||
@@ -1033,7 +944,7 @@ 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,
|
||||||
@@ -1054,7 +965,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: {
|
||||||
@@ -1077,7 +988,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: {
|
||||||
@@ -1098,7 +1009,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,
|
||||||
}
|
}
|
||||||
@@ -1120,7 +1031,7 @@ issue_3420_3: {
|
|||||||
|
|
||||||
issue_3423_1: {
|
issue_3423_1: {
|
||||||
options = {
|
options = {
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -1140,7 +1051,7 @@ issue_3423_1: {
|
|||||||
|
|
||||||
issue_3423_2: {
|
issue_3423_2: {
|
||||||
options = {
|
options = {
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -1167,7 +1078,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,
|
||||||
@@ -1214,7 +1125,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: {
|
||||||
@@ -1238,7 +1149,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 = {}
|
||||||
@@ -1267,7 +1178,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,
|
||||||
@@ -1304,7 +1215,7 @@ issues_3267_1: {
|
|||||||
dead_code: true,
|
dead_code: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
keep_fargs: "strict",
|
keep_fargs: false,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
@@ -1333,7 +1244,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: {
|
||||||
@@ -1357,7 +1268,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,
|
||||||
}
|
}
|
||||||
@@ -1376,7 +1287,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,
|
||||||
}
|
}
|
||||||
@@ -1454,3 +1365,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"
|
||||||
|
}
|
||||||
|
|||||||
@@ -207,3 +207,123 @@ labels_10: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4466_1: {
|
||||||
|
mangle = {
|
||||||
|
v8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
A: if (console.log("PASS"))
|
||||||
|
B:;
|
||||||
|
else
|
||||||
|
C:;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
e: if (console.log("PASS"))
|
||||||
|
l:;
|
||||||
|
else
|
||||||
|
l:;
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=12"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4466_1_v8: {
|
||||||
|
mangle = {
|
||||||
|
v8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
A: if (console.log("PASS"))
|
||||||
|
B:;
|
||||||
|
else
|
||||||
|
C:;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
e: if (console.log("PASS"))
|
||||||
|
l:;
|
||||||
|
else
|
||||||
|
o:;
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=12"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4466_2: {
|
||||||
|
mangle = {
|
||||||
|
toplevel: false,
|
||||||
|
v8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
if (console.log("PASS"))
|
||||||
|
A:;
|
||||||
|
else
|
||||||
|
B:;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
if (console.log("PASS"))
|
||||||
|
e:;
|
||||||
|
else
|
||||||
|
e:;
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4466_2_v8: {
|
||||||
|
mangle = {
|
||||||
|
toplevel: false,
|
||||||
|
v8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
if (console.log("PASS"))
|
||||||
|
A:;
|
||||||
|
else
|
||||||
|
B:;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
if (console.log("PASS"))
|
||||||
|
e:;
|
||||||
|
else
|
||||||
|
l:;
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4466_2_toplevel: {
|
||||||
|
mangle = {
|
||||||
|
toplevel: true,
|
||||||
|
v8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
if (console.log("PASS"))
|
||||||
|
A:;
|
||||||
|
else
|
||||||
|
B:;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
if (console.log("PASS"))
|
||||||
|
e:;
|
||||||
|
else
|
||||||
|
e:;
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4466_2_toplevel_v8: {
|
||||||
|
mangle = {
|
||||||
|
toplevel: true,
|
||||||
|
v8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
if (console.log("PASS"))
|
||||||
|
A:;
|
||||||
|
else
|
||||||
|
B:;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
if (console.log("PASS"))
|
||||||
|
e:;
|
||||||
|
else
|
||||||
|
e:;
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|||||||
1548
test/compress/let.js
Normal file
1548
test/compress/let.js
Normal file
File diff suppressed because it is too large
Load Diff
@@ -201,7 +201,7 @@ evaluate: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_1532: {
|
issue_1532_1: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
loops: true,
|
loops: true,
|
||||||
@@ -210,18 +210,56 @@ issue_1532: {
|
|||||||
function f(x, y) {
|
function f(x, y) {
|
||||||
do {
|
do {
|
||||||
if (x) break;
|
if (x) break;
|
||||||
foo();
|
console.log(y);
|
||||||
} while (false);
|
} while (false);
|
||||||
}
|
}
|
||||||
|
f(null, "PASS");
|
||||||
|
f(42, "FAIL");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(x, y) {
|
||||||
|
for (; !x && (console.log(y), false););
|
||||||
|
}
|
||||||
|
f(null, "PASS");
|
||||||
|
f(42, "FAIL");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1532_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
loops: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(x, y) {
|
||||||
|
do {
|
||||||
|
if (x) {
|
||||||
|
console.log(x);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
console.log(y);
|
||||||
|
} while (false);
|
||||||
|
}
|
||||||
|
f(null, "PASS");
|
||||||
|
f(42, "FAIL");
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function f(x, y) {
|
function f(x, y) {
|
||||||
do {
|
do {
|
||||||
if (x) break;
|
if (x) {
|
||||||
foo();
|
console.log(x);
|
||||||
} while (false);
|
break;
|
||||||
|
}
|
||||||
|
} while (console.log(y), false);
|
||||||
}
|
}
|
||||||
|
f(null, "PASS");
|
||||||
|
f(42, "FAIL");
|
||||||
}
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"PASS",
|
||||||
|
"42",
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_186: {
|
issue_186: {
|
||||||
@@ -463,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;);
|
||||||
}
|
}
|
||||||
@@ -509,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);
|
||||||
}
|
}
|
||||||
@@ -756,10 +794,78 @@ empty_for_in_side_effects: {
|
|||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
"WARN: Dropping unused variable b [test/compress/loops.js:4,16]",
|
"WARN: Dropping unused variable b [test/compress/loops.js:4,16]",
|
||||||
"INFO: Dropping unused loop variable a [test/compress/loops.js:1,17]",
|
"INFO: Dropping unused loop variable a [test/compress/loops.js:1,17]",
|
||||||
"WARN: Side effects in object of for-in loop [test/compress/loops.js:1,17]",
|
"WARN: Side effects in object of for-in loop [test/compress/loops.js:2,17]",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
empty_for_in_prop_init: {
|
||||||
|
options = {
|
||||||
|
loops: true,
|
||||||
|
pure_getters: "strict",
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function f() {
|
||||||
|
var a = "bar";
|
||||||
|
for ((a, f)[a] in console.log("foo"));
|
||||||
|
return a;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function() {
|
||||||
|
var a = "bar";
|
||||||
|
console.log("foo");
|
||||||
|
return a;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
]
|
||||||
|
expect_warnings: [
|
||||||
|
"INFO: Dropping unused loop variable f [test/compress/loops.js:3,21]",
|
||||||
|
"WARN: Side effects in object of for-in loop [test/compress/loops.js:3,30]",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
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,
|
||||||
@@ -933,3 +1039,312 @@ issue_3634_2: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "1"
|
expect_stdout: "1"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4075: {
|
||||||
|
options = {
|
||||||
|
loops: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "FAIL";
|
||||||
|
(function() {
|
||||||
|
for (a in { PASS: 0 });
|
||||||
|
})()
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "FAIL";
|
||||||
|
(function() {
|
||||||
|
for (a in { PASS: 0 });
|
||||||
|
})()
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4082: {
|
||||||
|
options = {
|
||||||
|
keep_fargs: false,
|
||||||
|
loops: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS";
|
||||||
|
(function(a) {
|
||||||
|
for (a in "foo")
|
||||||
|
var b;
|
||||||
|
})();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "PASS";
|
||||||
|
(function(a) {
|
||||||
|
for (a in "foo");
|
||||||
|
})();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4084: {
|
||||||
|
options = {
|
||||||
|
keep_fargs: false,
|
||||||
|
loops: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
function f(a) {
|
||||||
|
var b = a++;
|
||||||
|
for (a in "foo");
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
return typeof a;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function() {
|
||||||
|
(function() {
|
||||||
|
0;
|
||||||
|
})();
|
||||||
|
return typeof a;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4091_1: {
|
||||||
|
options = {
|
||||||
|
loops: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try {
|
||||||
|
throw "FAIL";
|
||||||
|
} catch (e) {
|
||||||
|
for (var e in 42);
|
||||||
|
}
|
||||||
|
console.log(e && e);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
try {
|
||||||
|
throw "FAIL";
|
||||||
|
} catch (e) {
|
||||||
|
var e;
|
||||||
|
}
|
||||||
|
console.log(e && e);
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4091_2: {
|
||||||
|
options = {
|
||||||
|
loops: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try {
|
||||||
|
throw "FAIL";
|
||||||
|
} catch (e) {
|
||||||
|
for (e in 42);
|
||||||
|
var e;
|
||||||
|
}
|
||||||
|
console.log(e && e);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
try {
|
||||||
|
throw "FAIL";
|
||||||
|
} catch (e) {
|
||||||
|
var e;
|
||||||
|
}
|
||||||
|
console.log(e && e);
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4182_1: {
|
||||||
|
options = {
|
||||||
|
loops: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
do {
|
||||||
|
try {
|
||||||
|
return;
|
||||||
|
} finally {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
console.log("FAIL");
|
||||||
|
} while (0);
|
||||||
|
console.log("PASS");
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function() {
|
||||||
|
do {
|
||||||
|
try {
|
||||||
|
return;
|
||||||
|
} finally {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
console.log("FAIL");
|
||||||
|
} while (0);
|
||||||
|
console.log("PASS");
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4182_2: {
|
||||||
|
options = {
|
||||||
|
loops: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
L: do {
|
||||||
|
do {
|
||||||
|
try {
|
||||||
|
return;
|
||||||
|
} finally {
|
||||||
|
continue L;
|
||||||
|
}
|
||||||
|
console.log("FAIL");
|
||||||
|
} while (0);
|
||||||
|
console.log("FAIL");
|
||||||
|
} while (0);
|
||||||
|
console.log("PASS");
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function() {
|
||||||
|
L: do {
|
||||||
|
do {
|
||||||
|
try {
|
||||||
|
return;
|
||||||
|
} finally {
|
||||||
|
continue L;
|
||||||
|
}
|
||||||
|
} while (console.log("FAIL"), 0);
|
||||||
|
console.log("FAIL");
|
||||||
|
} while (0);
|
||||||
|
console.log("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"
|
||||||
|
}
|
||||||
|
|||||||
3303
test/compress/merge_vars.js
Normal file
3303
test/compress/merge_vars.js
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
130
test/compress/nullish.js
Normal file
130
test/compress/nullish.js
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
parentheses: {
|
||||||
|
input: {
|
||||||
|
(console.log("foo") || console.log("bar") ?? console.log("baz")) && console.log("moo");
|
||||||
|
}
|
||||||
|
expect_exact:'((console.log("foo")||console.log("bar"))??console.log("baz"))&&console.log("moo");'
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
"baz",
|
||||||
|
]
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
evaluate: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
void console.log("foo" ?? "bar") ?? console.log("baz");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("foo"),
|
||||||
|
console.log("baz");
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"baz",
|
||||||
|
]
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
conditional_assignment_1: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(a, b) {
|
||||||
|
b ?? (a = "FAIL");
|
||||||
|
return a;
|
||||||
|
}("PASS", !console));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(a, b) {
|
||||||
|
b ?? (a = "FAIL");
|
||||||
|
return a;
|
||||||
|
}("PASS", !console));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
conditional_assignment_2: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a, b = false;
|
||||||
|
a = "PASS",
|
||||||
|
b ?? (a = "FAIL"),
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a, b = false;
|
||||||
|
a = "PASS",
|
||||||
|
b ?? (a = "FAIL"),
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
conditional_assignment_3: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
join_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a, b = false;
|
||||||
|
a = "PASS",
|
||||||
|
b ?? (a = "FAIL"),
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a, b = false, a = "PASS";
|
||||||
|
b ?? (a = "FAIL"),
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
conditional_assignment_4: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(a) {
|
||||||
|
!console ?? (a = "FAIL");
|
||||||
|
return a;
|
||||||
|
}("PASS"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(a) {
|
||||||
|
!console ?? (a = "FAIL");
|
||||||
|
return a;
|
||||||
|
}("PASS"));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4679: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
if (void 0 === (undefined ?? a))
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
if (void 0 === (undefined ?? a))
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=14"
|
||||||
|
}
|
||||||
@@ -1,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: {
|
||||||
@@ -91,7 +183,7 @@ evaluate_1: {
|
|||||||
expect: {
|
expect: {
|
||||||
console.log(
|
console.log(
|
||||||
x + 1 + 2,
|
x + 1 + 2,
|
||||||
2 * x,
|
2 * +x,
|
||||||
+x + 1 + 2,
|
+x + 1 + 2,
|
||||||
1 + x + 2 + 3,
|
1 + x + 2 + 3,
|
||||||
3 | x,
|
3 | x,
|
||||||
@@ -130,7 +222,7 @@ evaluate_1_unsafe_math: {
|
|||||||
expect: {
|
expect: {
|
||||||
console.log(
|
console.log(
|
||||||
x + 1 + 2,
|
x + 1 + 2,
|
||||||
2 * x,
|
2 * +x,
|
||||||
+x + 3,
|
+x + 3,
|
||||||
1 + x + 2 + 3,
|
1 + x + 2 + 3,
|
||||||
3 | x,
|
3 | x,
|
||||||
@@ -148,45 +240,52 @@ evaluate_1_unsafe_math: {
|
|||||||
evaluate_2: {
|
evaluate_2: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
unsafe_math: false,
|
unsafe_math: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = "42", y = null;
|
function f(num) {
|
||||||
[
|
var x = "" + num, y = null;
|
||||||
x + 1 + 2,
|
[
|
||||||
x * 1 * 2,
|
x + 1 + 2,
|
||||||
+x + 1 + 2,
|
x * 1 * 2,
|
||||||
1 + x + 2 + 3,
|
+x + 1 + 2,
|
||||||
1 | x | 2 | 3,
|
1 + x + 2 + 3,
|
||||||
1 + x-- + 2 + 3,
|
1 | x | 2 | 3,
|
||||||
1 + (x*y + 2) + 3,
|
1 + x-- + 2 + 3,
|
||||||
1 + (2 + x + 3),
|
1 + (x*y + 2) + 3,
|
||||||
1 + (2 + ~x + 3),
|
1 + (2 + x + 3),
|
||||||
-y + (2 + ~x + 3),
|
1 + (2 + ~x + 3),
|
||||||
1 & (2 & x & 3),
|
-y + (2 + ~x + 3),
|
||||||
1 + (2 + (x |= 0) + 3),
|
1 & (2 & x & 3),
|
||||||
].forEach(function(n) {
|
1 + (2 + (x |= 0) + 3),
|
||||||
console.log(typeof n, n);
|
].forEach(function(n) {
|
||||||
});
|
console.log(typeof n, n);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
f(42);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var x = "42", y = null;
|
function f(num) {
|
||||||
[
|
var x = "" + num, y = null;
|
||||||
x + 1 + 2,
|
[
|
||||||
2 * x,
|
x + "12",
|
||||||
+x + 1 + 2,
|
2 * x,
|
||||||
1 + x + 2 + 3,
|
+x + 1 + 2,
|
||||||
3 | x,
|
1 + x + "23",
|
||||||
1 + x-- + 2 + 3,
|
3 | x,
|
||||||
x*y + 2 + 1 + 3,
|
1 + x-- + 2 + 3,
|
||||||
1 + (2 + x + 3),
|
x*y + 2 + 1 + 3,
|
||||||
2 + ~x + 3 + 1,
|
2 + x + 3 + 1,
|
||||||
2 + ~x + 3 - y,
|
2 + ~x + 3 + 1,
|
||||||
0 & x,
|
2 + ~x + 3,
|
||||||
2 + (x |= 0) + 3 + 1,
|
0 & x,
|
||||||
].forEach(function(n) {
|
2 + (x |= 0) + 3 + 1,
|
||||||
console.log(typeof n, n);
|
].forEach(function(n) {
|
||||||
});
|
console.log(typeof n, n);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
f(42);
|
||||||
}
|
}
|
||||||
expect_stdout: [
|
expect_stdout: [
|
||||||
"string 4212",
|
"string 4212",
|
||||||
@@ -207,45 +306,52 @@ evaluate_2: {
|
|||||||
evaluate_2_unsafe_math: {
|
evaluate_2_unsafe_math: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
unsafe_math: true,
|
unsafe_math: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = "42", y = null;
|
function f(num) {
|
||||||
[
|
var x = "" + num, y = null;
|
||||||
x + 1 + 2,
|
[
|
||||||
x * 1 * 2,
|
x + 1 + 2,
|
||||||
+x + 1 + 2,
|
x * 1 * 2,
|
||||||
1 + x + 2 + 3,
|
+x + 1 + 2,
|
||||||
1 | x | 2 | 3,
|
1 + x + 2 + 3,
|
||||||
1 + x-- + 2 + 3,
|
1 | x | 2 | 3,
|
||||||
1 + (x*y + 2) + 3,
|
1 + x-- + 2 + 3,
|
||||||
1 + (2 + x + 3),
|
1 + (x*y + 2) + 3,
|
||||||
1 + (2 + ~x + 3),
|
1 + (2 + x + 3),
|
||||||
-y + (2 + ~x + 3),
|
1 + (2 + ~x + 3),
|
||||||
1 & (2 & x & 3),
|
-y + (2 + ~x + 3),
|
||||||
1 + (2 + (x |= 0) + 3),
|
1 & (2 & x & 3),
|
||||||
].forEach(function(n) {
|
1 + (2 + (x |= 0) + 3),
|
||||||
console.log(typeof n, n);
|
].forEach(function(n) {
|
||||||
});
|
console.log(typeof n, n);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
f(42);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var x = "42", y = null;
|
function f(num) {
|
||||||
[
|
var x = "" + num, y = null;
|
||||||
x + 1 + 2,
|
[
|
||||||
2 * x,
|
x + "12",
|
||||||
+x + 3,
|
2 * x,
|
||||||
1 + x + 2 + 3,
|
+x + 3,
|
||||||
3 | x,
|
1 + x + "23",
|
||||||
6 + x--,
|
3 | x,
|
||||||
x*y + 6,
|
6 + x--,
|
||||||
1 + (2 + x + 3),
|
x*y + 6,
|
||||||
6 + ~x,
|
6 + x,
|
||||||
5 + ~x - y,
|
6 + ~x,
|
||||||
0 & x,
|
5 + ~x,
|
||||||
6 + (x |= 0),
|
0 & x,
|
||||||
].forEach(function(n) {
|
6 + (x |= 0),
|
||||||
console.log(typeof n, n);
|
].forEach(function(n) {
|
||||||
});
|
console.log(typeof n, n);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
f(42);
|
||||||
}
|
}
|
||||||
expect_stdout: [
|
expect_stdout: [
|
||||||
"string 4212",
|
"string 4212",
|
||||||
@@ -273,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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -310,45 +416,52 @@ evaluate_4: {
|
|||||||
evaluate_5: {
|
evaluate_5: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
unsafe_math: false,
|
unsafe_math: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var a = "1";
|
function f(num) {
|
||||||
[
|
var a = "" + num;
|
||||||
+a + 2 + 3,
|
[
|
||||||
+a + 2 - 3,
|
+a + 2 + 3,
|
||||||
+a - 2 + 3,
|
+a + 2 - 3,
|
||||||
+a - 2 - 3,
|
+a - 2 + 3,
|
||||||
2 + +a + 3,
|
+a - 2 - 3,
|
||||||
2 + +a - 3,
|
2 + +a + 3,
|
||||||
2 - +a + 3,
|
2 + +a - 3,
|
||||||
2 - +a - 3,
|
2 - +a + 3,
|
||||||
2 + 3 + +a,
|
2 - +a - 3,
|
||||||
2 + 3 - +a,
|
2 + 3 + +a,
|
||||||
2 - 3 + +a,
|
2 + 3 - +a,
|
||||||
2 - 3 - +a,
|
2 - 3 + +a,
|
||||||
].forEach(function(n) {
|
2 - 3 - +a,
|
||||||
console.log(typeof n, n);
|
].forEach(function(n) {
|
||||||
});
|
console.log(typeof n, n);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
f(1);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var a = "1";
|
function f(num) {
|
||||||
[
|
var a = "" + num;
|
||||||
+a + 2 + 3,
|
[
|
||||||
+a + 2 - 3,
|
+a + 2 + 3,
|
||||||
a - 2 + 3,
|
+a + 2 - 3,
|
||||||
a - 2 - 3,
|
a - 2 + 3,
|
||||||
+a + 2 + 3,
|
a - 2 - 3,
|
||||||
+a + 2 - 3,
|
+a + 2 + 3,
|
||||||
2 - a + 3,
|
+a + 2 - 3,
|
||||||
2 - a - 3,
|
2 - a + 3,
|
||||||
+a + 5,
|
2 - a - 3,
|
||||||
5 - a,
|
+a + 5,
|
||||||
+a - 1,
|
5 - a,
|
||||||
-1 - a,
|
+a - 1,
|
||||||
].forEach(function(n) {
|
-1 - a,
|
||||||
console.log(typeof n, n);
|
].forEach(function(n) {
|
||||||
});
|
console.log(typeof n, n);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
f(1);
|
||||||
}
|
}
|
||||||
expect_stdout: [
|
expect_stdout: [
|
||||||
"number 6",
|
"number 6",
|
||||||
@@ -369,45 +482,52 @@ evaluate_5: {
|
|||||||
evaluate_5_unsafe_math: {
|
evaluate_5_unsafe_math: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
unsafe_math: true,
|
unsafe_math: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var a = "1";
|
function f(num) {
|
||||||
[
|
var a = "" + num;
|
||||||
+a + 2 + 3,
|
[
|
||||||
+a + 2 - 3,
|
+a + 2 + 3,
|
||||||
+a - 2 + 3,
|
+a + 2 - 3,
|
||||||
+a - 2 - 3,
|
+a - 2 + 3,
|
||||||
2 + +a + 3,
|
+a - 2 - 3,
|
||||||
2 + +a - 3,
|
2 + +a + 3,
|
||||||
2 - +a + 3,
|
2 + +a - 3,
|
||||||
2 - +a - 3,
|
2 - +a + 3,
|
||||||
2 + 3 + +a,
|
2 - +a - 3,
|
||||||
2 + 3 - +a,
|
2 + 3 + +a,
|
||||||
2 - 3 + +a,
|
2 + 3 - +a,
|
||||||
2 - 3 - +a,
|
2 - 3 + +a,
|
||||||
].forEach(function(n) {
|
2 - 3 - +a,
|
||||||
console.log(typeof n, n);
|
].forEach(function(n) {
|
||||||
});
|
console.log(typeof n, n);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
f(1);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var a = "1";
|
function f(num) {
|
||||||
[
|
var a = "" + num;
|
||||||
+a + 5,
|
[
|
||||||
+a + -1,
|
+a + 5,
|
||||||
a - -1,
|
+a + -1,
|
||||||
a - 5,
|
a - -1,
|
||||||
+a + 5,
|
a - 5,
|
||||||
+a + -1,
|
+a + 5,
|
||||||
5 - a,
|
+a + -1,
|
||||||
-1 - a,
|
5 - a,
|
||||||
+a + 5,
|
-1 - a,
|
||||||
5 - a,
|
+a + 5,
|
||||||
+a - 1,
|
5 - a,
|
||||||
-1 - a,
|
+a - 1,
|
||||||
].forEach(function(n) {
|
-1 - a,
|
||||||
console.log(typeof n, n);
|
].forEach(function(n) {
|
||||||
});
|
console.log(typeof n, n);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
f(1);
|
||||||
}
|
}
|
||||||
expect_stdout: [
|
expect_stdout: [
|
||||||
"number 6",
|
"number 6",
|
||||||
@@ -546,37 +666,44 @@ evaluate_6_unsafe_math: {
|
|||||||
evaluate_7: {
|
evaluate_7: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
unsafe_math: false,
|
unsafe_math: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = "42", y;
|
function f(num, y) {
|
||||||
[
|
var x = "" + num;
|
||||||
+x + 2 + (3 + !y),
|
[
|
||||||
+x + 2 + (3 - !y),
|
+x + 2 + (3 + !y),
|
||||||
+x + 2 - (3 + !y),
|
+x + 2 + (3 - !y),
|
||||||
+x + 2 - (3 - !y),
|
+x + 2 - (3 + !y),
|
||||||
+x - 2 + (3 + !y),
|
+x + 2 - (3 - !y),
|
||||||
+x - 2 + (3 - !y),
|
+x - 2 + (3 + !y),
|
||||||
+x - 2 - (3 + !y),
|
+x - 2 + (3 - !y),
|
||||||
+x - 2 - (3 - !y),
|
+x - 2 - (3 + !y),
|
||||||
].forEach(function(n) {
|
+x - 2 - (3 - !y),
|
||||||
console.log(typeof n, n);
|
].forEach(function(n) {
|
||||||
});
|
console.log(typeof n, n);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
f(42);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var x = "42", y;
|
function f(num, y) {
|
||||||
[
|
var x = "" + num;
|
||||||
+x + 2 + (3 + !y),
|
[
|
||||||
+x + 2 + (3 - !y),
|
+x + 2 + (3 + !y),
|
||||||
+x + 2 - (3 + !y),
|
+x + 2 + (3 - !y),
|
||||||
+x + 2 - (3 - !y),
|
+x + 2 - (3 + !y),
|
||||||
x - 2 + (3 + !y),
|
+x + 2 - (3 - !y),
|
||||||
x - 2 + (3 - !y),
|
x - 2 + (3 + !y),
|
||||||
x - 2 - (3 + !y),
|
x - 2 + (3 - !y),
|
||||||
x - 2 - (3 - !y),
|
x - 2 - (3 + !y),
|
||||||
].forEach(function(n) {
|
x - 2 - (3 - !y),
|
||||||
console.log(typeof n, n);
|
].forEach(function(n) {
|
||||||
});
|
console.log(typeof n, n);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
f(42);
|
||||||
}
|
}
|
||||||
expect_stdout: [
|
expect_stdout: [
|
||||||
"number 48",
|
"number 48",
|
||||||
@@ -593,37 +720,44 @@ evaluate_7: {
|
|||||||
evaluate_7_unsafe_math: {
|
evaluate_7_unsafe_math: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
unsafe_math: true,
|
unsafe_math: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = "42", y;
|
function f(num, y) {
|
||||||
[
|
var x = "" + num;
|
||||||
+x + 2 + (3 + !y),
|
[
|
||||||
+x + 2 + (3 - !y),
|
+x + 2 + (3 + !y),
|
||||||
+x + 2 - (3 + !y),
|
+x + 2 + (3 - !y),
|
||||||
+x + 2 - (3 - !y),
|
+x + 2 - (3 + !y),
|
||||||
+x - 2 + (3 + !y),
|
+x + 2 - (3 - !y),
|
||||||
+x - 2 + (3 - !y),
|
+x - 2 + (3 + !y),
|
||||||
+x - 2 - (3 + !y),
|
+x - 2 + (3 - !y),
|
||||||
+x - 2 - (3 - !y),
|
+x - 2 - (3 + !y),
|
||||||
].forEach(function(n) {
|
+x - 2 - (3 - !y),
|
||||||
console.log(typeof n, n);
|
].forEach(function(n) {
|
||||||
});
|
console.log(typeof n, n);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
f(42);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var x = "42", y;
|
function f(num, y) {
|
||||||
[
|
var x = "" + num;
|
||||||
+x + 5 + !y,
|
[
|
||||||
+x + 5 - !y,
|
+x + 5 + !y,
|
||||||
+x + -1 - !y,
|
+x + 5 - !y,
|
||||||
+x + -1 + !y,
|
+x + -1 - !y,
|
||||||
x - -1 + !y,
|
+x + -1 + !y,
|
||||||
x - -1 - !y,
|
x - -1 + !y,
|
||||||
x - 5 - !y,
|
x - -1 - !y,
|
||||||
x - 5 + !y,
|
x - 5 - !y,
|
||||||
].forEach(function(n) {
|
x - 5 + !y,
|
||||||
console.log(typeof n, n);
|
].forEach(function(n) {
|
||||||
});
|
console.log(typeof n, n);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
f(42);
|
||||||
}
|
}
|
||||||
expect_stdout: [
|
expect_stdout: [
|
||||||
"number 48",
|
"number 48",
|
||||||
@@ -637,6 +771,22 @@ evaluate_7_unsafe_math: {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
evaluate_8_unsafe_math: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
unsafe_math: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = [ "42" ];
|
||||||
|
console.log(a * (1 / 7));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = [ "42" ];
|
||||||
|
console.log(+a / 7);
|
||||||
|
}
|
||||||
|
expect_stdout: "6"
|
||||||
|
}
|
||||||
|
|
||||||
NaN_redefined: {
|
NaN_redefined: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
@@ -668,7 +818,7 @@ issue_1710: {
|
|||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
unary_binary_parenthesis: {
|
unary_binary_parentheses: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
}
|
}
|
||||||
@@ -1251,3 +1401,101 @@ issue_3695: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "NaN"
|
expect_stdout: "NaN"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4137: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(+(A = []) * (A[0] = 1));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(+(A = []) * (A[0] = 1));
|
||||||
|
}
|
||||||
|
expect_stdout: "0"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4142: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log("" + +(0 === console));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("" + +(0 === console));
|
||||||
|
}
|
||||||
|
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]);
|
||||||
@@ -221,3 +221,303 @@ 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"
|
||||||
|
}
|
||||||
|
|||||||
@@ -130,7 +130,7 @@ evaluate_string_length: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mangle_properties: {
|
mangle_properties_1: {
|
||||||
mangle = {
|
mangle = {
|
||||||
properties: {
|
properties: {
|
||||||
keep_quoted: false,
|
keep_quoted: false,
|
||||||
@@ -152,6 +152,53 @@ mangle_properties: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mangle_properties_2: {
|
||||||
|
mangle = {
|
||||||
|
properties: {
|
||||||
|
reserved: [
|
||||||
|
"value",
|
||||||
|
]
|
||||||
|
},
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
prop1: 1,
|
||||||
|
};
|
||||||
|
Object.defineProperty(o, "prop2", {
|
||||||
|
value: 2,
|
||||||
|
});
|
||||||
|
Object.defineProperties(o, {
|
||||||
|
prop3: {
|
||||||
|
value: 3,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
console.log("prop1", o.prop1, "prop1" in o);
|
||||||
|
console.log("prop2", o.prop2, o.hasOwnProperty("prop2"));
|
||||||
|
console.log("prop3", o.prop3, Object.getOwnPropertyDescriptor(o, "prop3").value);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {
|
||||||
|
o: 1,
|
||||||
|
};
|
||||||
|
Object.defineProperty(o, "p", {
|
||||||
|
value: 2,
|
||||||
|
});
|
||||||
|
Object.defineProperties(o, {
|
||||||
|
r: {
|
||||||
|
value: 3,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
console.log("prop1", o.o, "o" in o);
|
||||||
|
console.log("prop2", o.p, o.hasOwnProperty("p"));
|
||||||
|
console.log("prop3", o.r, Object.getOwnPropertyDescriptor(o, "r").value);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"prop1 1 true",
|
||||||
|
"prop2 2 true",
|
||||||
|
"prop3 3 3",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
mangle_unquoted_properties: {
|
mangle_unquoted_properties: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
@@ -1046,16 +1093,22 @@ array_hole: {
|
|||||||
side_effects: true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
Array.prototype[2] = "PASS";
|
||||||
[ 1, 2, , 3][1],
|
console.log([ 1, 2, , 3 ][1]);
|
||||||
[ 1, 2, , 3][2],
|
console.log([ 1, 2, , 3 ][2]);
|
||||||
[ 1, 2, , 3][3]
|
console.log([ 1, 2, , 3 ][3]);
|
||||||
);
|
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
console.log(2, void 0, 3);
|
Array.prototype[2] = "PASS";
|
||||||
|
console.log(2);
|
||||||
|
console.log([ , , , ][2]);
|
||||||
|
console.log(3);
|
||||||
}
|
}
|
||||||
expect_stdout: "2 undefined 3"
|
expect_stdout: [
|
||||||
|
"2",
|
||||||
|
"PASS",
|
||||||
|
"3",
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
new_this: {
|
new_this: {
|
||||||
@@ -1070,11 +1123,7 @@ new_this: {
|
|||||||
}
|
}
|
||||||
}.f(42);
|
}.f(42);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {}
|
||||||
new function(a) {
|
|
||||||
this.a = a;
|
|
||||||
}(42);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_2513: {
|
issue_2513: {
|
||||||
@@ -1329,3 +1378,71 @@ 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"
|
||||||
|
}
|
||||||
|
|||||||
@@ -136,7 +136,7 @@ relational: {
|
|||||||
side_effects :true,
|
side_effects :true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
foo() in foo();
|
foo() in new foo();
|
||||||
foo() instanceof bar();
|
foo() instanceof bar();
|
||||||
foo() < "bar";
|
foo() < "bar";
|
||||||
bar() > foo();
|
bar() > 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,
|
||||||
|
|||||||
@@ -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,9 +877,8 @@ 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;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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,110 @@ 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,
|
||||||
|
}
|
||||||
|
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,
|
evaluate: true,
|
||||||
collapse_vars: 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 +1338,303 @@ 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";
|
||||||
|
if (function() {
|
||||||
|
var a;
|
||||||
|
}(), c = "PASS", b) while ("" == typeof d);
|
||||||
|
console.log(c, b);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS 42"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4135: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
merge_vars: true,
|
||||||
|
pure_getters: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 0, b = 0;
|
||||||
|
--b;
|
||||||
|
a++;
|
||||||
|
if (!a)
|
||||||
|
var c = function() {
|
||||||
|
var d = 0;
|
||||||
|
function f() {
|
||||||
|
d && d.p;
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
this;
|
||||||
|
}(a++);
|
||||||
|
console.log(a, b, c);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 0;
|
||||||
|
0;
|
||||||
|
a++;
|
||||||
|
if (!a)
|
||||||
|
var c = void a++;
|
||||||
|
console.log(a, -1, c);
|
||||||
|
}
|
||||||
|
expect_stdout: "1 -1 undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4440: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try {
|
||||||
|
(function() {
|
||||||
|
arguments = null;
|
||||||
|
console.log(arguments.p = "FAIL");
|
||||||
|
})();
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
try {
|
||||||
|
(function() {
|
||||||
|
arguments = null;
|
||||||
|
console.log(arguments.p = "FAIL");
|
||||||
|
})();
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4730_1: {
|
||||||
|
options = {
|
||||||
|
pure_getters: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
console.log("PASS") + (a && a[a.p]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4730_2: {
|
||||||
|
options = {
|
||||||
|
pure_getters: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
!console.log("PASS") || a && a[a.p];
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4751: {
|
||||||
|
options = {
|
||||||
|
pure_getters: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
get p() {
|
||||||
|
console.log("PASS");
|
||||||
|
},
|
||||||
|
};
|
||||||
|
o && o.p;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {
|
||||||
|
get p() {
|
||||||
|
console.log("PASS");
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
super_toString: {
|
||||||
|
options = {
|
||||||
|
pure_getters: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log({
|
||||||
|
f() {
|
||||||
|
return super.toString();
|
||||||
|
},
|
||||||
|
}.f());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log({
|
||||||
|
f() {
|
||||||
|
return super.toString();
|
||||||
|
},
|
||||||
|
}.f());
|
||||||
|
}
|
||||||
|
expect_stdout: "[object Object]"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
this_toString: {
|
||||||
|
options = {
|
||||||
|
pure_getters: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log({
|
||||||
|
f() {
|
||||||
|
return this.toString();
|
||||||
|
},
|
||||||
|
}.f());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log({
|
||||||
|
f() {
|
||||||
|
return "" + this;
|
||||||
|
},
|
||||||
|
}.f());
|
||||||
|
}
|
||||||
|
expect_stdout: "[object Object]"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4803: {
|
||||||
|
options = {
|
||||||
|
hoist_vars: true,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
get f() {
|
||||||
|
console.log("PASS");
|
||||||
|
},
|
||||||
|
} || 42;
|
||||||
|
for (var k in o)
|
||||||
|
o[k];
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var k, o = {
|
||||||
|
get f() {
|
||||||
|
console.log("PASS");
|
||||||
|
},
|
||||||
|
} || 42;
|
||||||
|
for (k in o)
|
||||||
|
o[k];
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
nested_property_assignments_1: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var f;
|
||||||
|
((f = function() {
|
||||||
|
console.log("FAIL");
|
||||||
|
}).p = f).q = console.log("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
nested_property_assignments_2: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {};
|
||||||
|
(function() {
|
||||||
|
var a;
|
||||||
|
(o.p = a = {}).q = "PASS";
|
||||||
|
})();
|
||||||
|
console.log(o.p.q);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {};
|
||||||
|
(function() {
|
||||||
|
(o.p = {}).q = "PASS";
|
||||||
|
})();
|
||||||
|
console.log(o.p.q);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
nested_property_assignments_3: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
pure_getters: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = { p: {} };
|
||||||
|
(function(a) {
|
||||||
|
console && a;
|
||||||
|
if (console) {
|
||||||
|
a = a.p;
|
||||||
|
a.q = a;
|
||||||
|
}
|
||||||
|
})(o);
|
||||||
|
console.log(o.p.q === o.p ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = { p: {} };
|
||||||
|
(function(a) {
|
||||||
|
console;
|
||||||
|
if (console)
|
||||||
|
(a = a.p).q = a;
|
||||||
|
})(o);
|
||||||
|
console.log(o.p.q === o.p ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
786
test/compress/rests.js
Normal file
786
test/compress/rests.js
Normal file
@@ -0,0 +1,786 @@
|
|||||||
|
arrow_1: {
|
||||||
|
input: {
|
||||||
|
console.log.apply(console, ((...a) => a)("PASS", 42));
|
||||||
|
}
|
||||||
|
expect_exact: 'console.log.apply(console,((...a)=>a)("PASS",42));'
|
||||||
|
expect_stdout: "PASS 42"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
arrow_2: {
|
||||||
|
input: {
|
||||||
|
console.log.apply(console, ((a, ...b) => b)("FAIL", "PASS", 42));
|
||||||
|
}
|
||||||
|
expect_exact: 'console.log.apply(console,((a,...b)=>b)("FAIL","PASS",42));'
|
||||||
|
expect_stdout: "PASS 42"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
arrow_destructured_array_1: {
|
||||||
|
input: {
|
||||||
|
console.log.apply(console, (([ ...a ]) => a)("PASS"));
|
||||||
|
}
|
||||||
|
expect_exact: 'console.log.apply(console,(([...a])=>a)("PASS"));'
|
||||||
|
expect_stdout: "P A S S"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
arrow_destructured_array_2: {
|
||||||
|
input: {
|
||||||
|
console.log.apply(console, (([ a, ...b ]) => b)([ "FAIL", "PASS", 42 ]));
|
||||||
|
}
|
||||||
|
expect_exact: 'console.log.apply(console,(([a,...b])=>b)(["FAIL","PASS",42]));'
|
||||||
|
expect_stdout: "PASS 42"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
arrow_destructured_array_3: {
|
||||||
|
input: {
|
||||||
|
console.log((([ [ ...a ] = "FAIL" ]) => a)([ "PASS" ]).join("|"));
|
||||||
|
}
|
||||||
|
expect_exact: 'console.log((([[...a]="FAIL"])=>a)(["PASS"]).join("|"));'
|
||||||
|
expect_stdout: "P|A|S|S"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
arrow_destructured_object_1: {
|
||||||
|
input: {
|
||||||
|
var f = ({ ...a }) => a, o = f({ PASS: 42 });
|
||||||
|
for (var k in o)
|
||||||
|
console.log(k, o[k]);
|
||||||
|
}
|
||||||
|
expect_exact: "var f=({...a})=>a,o=f({PASS:42});for(var k in o)console.log(k,o[k]);"
|
||||||
|
expect_stdout: "PASS 42"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
arrow_destructured_object_2: {
|
||||||
|
input: {
|
||||||
|
var f = ({ FAIL: a, ...b }) => b, o = f({ PASS: 42, FAIL: null });
|
||||||
|
for (var k in o)
|
||||||
|
console.log(k, o[k]);
|
||||||
|
}
|
||||||
|
expect_exact: "var f=({FAIL:a,...b})=>b,o=f({PASS:42,FAIL:null});for(var k in o)console.log(k,o[k]);"
|
||||||
|
expect_stdout: "PASS 42"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
arrow_destructured_object_3: {
|
||||||
|
input: {
|
||||||
|
var f = ([ { ...a } = [ "FAIL" ] ]) => a;
|
||||||
|
var o = f([ "PASS" ]);
|
||||||
|
for (var k in o)
|
||||||
|
console.log(k, o[k]);
|
||||||
|
}
|
||||||
|
expect_exact: 'var f=([{...a}=["FAIL"]])=>a;var o=f(["PASS"]);for(var k in o)console.log(k,o[k]);'
|
||||||
|
expect_stdout: [
|
||||||
|
"0 P",
|
||||||
|
"1 A",
|
||||||
|
"2 S",
|
||||||
|
"3 S",
|
||||||
|
]
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
funarg_1: {
|
||||||
|
input: {
|
||||||
|
console.log.apply(console, function(...a) {
|
||||||
|
return a;
|
||||||
|
}("PASS", 42));
|
||||||
|
}
|
||||||
|
expect_exact: 'console.log.apply(console,function(...a){return a}("PASS",42));'
|
||||||
|
expect_stdout: "PASS 42"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
funarg_2: {
|
||||||
|
input: {
|
||||||
|
console.log.apply(console, function(a, ...b) {
|
||||||
|
return b;
|
||||||
|
}("FAIL", "PASS", 42));
|
||||||
|
}
|
||||||
|
expect_exact: 'console.log.apply(console,function(a,...b){return b}("FAIL","PASS",42));'
|
||||||
|
expect_stdout: "PASS 42"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
destructured_array_1: {
|
||||||
|
input: {
|
||||||
|
var [ ...a ] = [ "PASS", 42 ];
|
||||||
|
console.log.apply(console, a);
|
||||||
|
}
|
||||||
|
expect_exact: 'var[...a]=["PASS",42];console.log.apply(console,a);'
|
||||||
|
expect_stdout: "PASS 42"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
destructured_array_2: {
|
||||||
|
input: {
|
||||||
|
var [ a, ...b ] = [ "FAIL", "PASS", 42 ];
|
||||||
|
console.log.apply(console, b);
|
||||||
|
}
|
||||||
|
expect_exact: 'var[a,...b]=["FAIL","PASS",42];console.log.apply(console,b);'
|
||||||
|
expect_stdout: "PASS 42"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
destructured_object_1: {
|
||||||
|
input: {
|
||||||
|
var { ...a } = [ "FAIL", "PASS", 42 ];
|
||||||
|
console.log(a[1], a[2]);
|
||||||
|
}
|
||||||
|
expect_exact: 'var{...a}=["FAIL","PASS",42];console.log(a[1],a[2]);'
|
||||||
|
expect_stdout: "PASS 42"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
destructured_object_2: {
|
||||||
|
input: {
|
||||||
|
var { 0: a, ...b } = [ "FAIL", "PASS", 42 ];
|
||||||
|
console.log(b[1], b[2]);
|
||||||
|
}
|
||||||
|
expect_exact: 'var{0:a,...b}=["FAIL","PASS",42];console.log(b[1],b[2]);'
|
||||||
|
expect_stdout: "PASS 42"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_fargs: {
|
||||||
|
options = {
|
||||||
|
keep_fargs: false,
|
||||||
|
rests: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(a, ...b) {
|
||||||
|
return b[0];
|
||||||
|
}("FAIL", "PASS"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(b) {
|
||||||
|
return b[0];
|
||||||
|
}([ "PASS" ]));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
inline: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(a, ...[ b, c ]) {
|
||||||
|
return c + b + a;
|
||||||
|
}("SS", "A", "P"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(([ a, ...[ b, c ] ] = [ "SS", "A", "P" ], c + b + a));
|
||||||
|
var a, b, c;
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
retain_var: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var [ ...a ] = [ "PASS" ];
|
||||||
|
console.log(a[0]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var [ ...a ] = [ "PASS" ];
|
||||||
|
console.log(a[0]);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
reduce_destructured_array: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
rests: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var [ ...a ] = [ "PASS" ];
|
||||||
|
console.log(a[0]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log([ "PASS" ][0]);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
reduce_destructured_object: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var { ...a } = [ "PASS" ];
|
||||||
|
console.log(a[0]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var { ...a } = [ "PASS" ];
|
||||||
|
console.log(a[0]);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
retain_destructured_array: {
|
||||||
|
options = {
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var [ a, ...b ] = [ "FAIL", "PASS", 42 ];
|
||||||
|
console.log.apply(console, b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var [ , ...b ] = [ "FAIL", "PASS", 42 ];
|
||||||
|
console.log.apply(console, b);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS 42"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
retain_destructured_object_1: {
|
||||||
|
options = {
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var { 0: a, ...b } = [ "FAIL", "PASS", 42 ];
|
||||||
|
for (var k in b)
|
||||||
|
console.log(k, b[k]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var { 0: a, ...b } = [ "FAIL", "PASS", 42 ];
|
||||||
|
for (var k in b)
|
||||||
|
console.log(k, b[k]);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"1 PASS",
|
||||||
|
"2 42",
|
||||||
|
]
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
retain_destructured_object_2: {
|
||||||
|
options = {
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var { foo: [ a ], ...b } = { foo: [ "FAIL" ], bar: "PASS", baz: 42 };
|
||||||
|
for (var k in b)
|
||||||
|
console.log(k, b[k]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var { foo: [], ...b } = { foo: [ "FAIL" ], bar: "PASS", baz: 42 };
|
||||||
|
for (var k in b)
|
||||||
|
console.log(k, b[k]);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"bar PASS",
|
||||||
|
"baz 42",
|
||||||
|
]
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
retain_funarg_destructured_array_1: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
pure_getters: "strict",
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log((([ ...a ]) => a)([ "PASS" ])[0]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log((([ ...a ]) => a)([ "PASS" ])[0]);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
retain_funarg_destructured_array_2: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function([ a, ...b ]) {
|
||||||
|
return b;
|
||||||
|
}("bar")[1]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function([ , ...b ]) {
|
||||||
|
return b;
|
||||||
|
}("bar")[1]);
|
||||||
|
}
|
||||||
|
expect_stdout: "r"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
retain_funarg_destructured_object_1: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
pure_getters: "strict",
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log((({ ...a }) => a)([ "PASS" ])[0]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log((({ ...a }) => a)([ "PASS" ])[0]);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
retain_funarg_destructured_object_2: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function({ p: a, ... b }) {
|
||||||
|
return b;
|
||||||
|
}({ p: "FAIL" }).p || "PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function({ p: a, ... b }) {
|
||||||
|
return b;
|
||||||
|
}({ p: "FAIL" }).p || "PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_unused_call_args_1: {
|
||||||
|
options = {
|
||||||
|
rests: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(...a) {
|
||||||
|
console.log(a[0]);
|
||||||
|
})(42, console.log("PASS"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(a) {
|
||||||
|
console.log(a[0]);
|
||||||
|
})([ 42, console.log("PASS") ]);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"PASS",
|
||||||
|
"42",
|
||||||
|
]
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_unused_call_args_2: {
|
||||||
|
options = {
|
||||||
|
keep_fargs: false,
|
||||||
|
rests: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(a, ...b) {
|
||||||
|
return b;
|
||||||
|
}(console).length);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(b) {
|
||||||
|
return b;
|
||||||
|
}((console, [])).length);
|
||||||
|
}
|
||||||
|
expect_stdout: "0"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
merge_funarg: {
|
||||||
|
options = {
|
||||||
|
merge_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(...a) {
|
||||||
|
var b = a.length;
|
||||||
|
console.log(b);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(...b) {
|
||||||
|
var b = b.length;
|
||||||
|
console.log(b);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "0"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
merge_funarg_destructured_array: {
|
||||||
|
options = {
|
||||||
|
merge_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function([ ...a ]) {
|
||||||
|
var b = a.length;
|
||||||
|
console.log(b);
|
||||||
|
})([]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function([ ...b ]) {
|
||||||
|
var b = b.length;
|
||||||
|
console.log(b);
|
||||||
|
})([]);
|
||||||
|
}
|
||||||
|
expect_stdout: "0"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
merge_funarg_destructured_object: {
|
||||||
|
options = {
|
||||||
|
merge_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function({ ...a }) {
|
||||||
|
var b = a[0];
|
||||||
|
console.log(b);
|
||||||
|
})([ "PASS" ]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function({ ...b }) {
|
||||||
|
var b = b[0];
|
||||||
|
console.log(b);
|
||||||
|
})([ "PASS" ]);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
keep_arguments: {
|
||||||
|
options = {
|
||||||
|
arguments: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(...[ {} ]) {
|
||||||
|
console.log(arguments[0]);
|
||||||
|
})("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(...[ {} ]) {
|
||||||
|
console.log(arguments[0]);
|
||||||
|
})("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_rest_array: {
|
||||||
|
options = {
|
||||||
|
rests: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var [ ...[ a ]] = [ "PASS" ];
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var [ a ] = [ "PASS" ];
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_rest_arrow: {
|
||||||
|
options = {
|
||||||
|
arrows: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
|
rests: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(((...[ a ]) => a)("PASS"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log((a => a)("PASS"));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_rest_lambda: {
|
||||||
|
options = {
|
||||||
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
|
rests: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(...[ a ]) {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
console.log(f("PASS"), f(42));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a) {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
console.log(f("PASS"), f(42));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS 42"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4525_1: {
|
||||||
|
options = {
|
||||||
|
arguments: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(a, ...[]) {
|
||||||
|
a = "FAIL";
|
||||||
|
return arguments[0];
|
||||||
|
}("PASS"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(a, ...[]) {
|
||||||
|
a = "FAIL";
|
||||||
|
return arguments[0];
|
||||||
|
}("PASS"));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4525_2: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(a, ...[]) {
|
||||||
|
a = "FAIL";
|
||||||
|
return arguments[0];
|
||||||
|
}("PASS"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(a, ...[]) {
|
||||||
|
a = "FAIL";
|
||||||
|
return arguments[0];
|
||||||
|
}("PASS"));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4538: {
|
||||||
|
options = {
|
||||||
|
rests: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(typeof function f(...a) {
|
||||||
|
return a.p, f;
|
||||||
|
}()());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(typeof function f(...a) {
|
||||||
|
return a.p, f;
|
||||||
|
}()());
|
||||||
|
}
|
||||||
|
expect_stdout: "function"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4544_1: {
|
||||||
|
options = {
|
||||||
|
keep_fnames: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try {
|
||||||
|
(function f(...[ {} ]) {})();
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
try {
|
||||||
|
[ ...[ {} ] ] = [];
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4544_2: {
|
||||||
|
options = {
|
||||||
|
keep_fnames: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try {
|
||||||
|
(function f(a, ...[ {} ]) {})([]);
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
try {
|
||||||
|
[ , ...[ {} ] ] = [ [] ];
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4562: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
rests: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log((([ ...[ a ] ]) => a)("foo"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log((([ a ]) => a)("foo"));
|
||||||
|
}
|
||||||
|
expect_stdout: "f"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4575: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
ie8: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
rests: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a) {
|
||||||
|
var b = a;
|
||||||
|
var c = function a(...d) {
|
||||||
|
console.log(d.length);
|
||||||
|
}();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(a) {
|
||||||
|
(function a(...d) {
|
||||||
|
console.log(d.length);
|
||||||
|
})();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "0"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4621: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function f(a, ...{
|
||||||
|
[console.log(a)]: b,
|
||||||
|
}) {})("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function f(a, ...{
|
||||||
|
[console.log(a)]: b,
|
||||||
|
}) {})("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4644_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "FAIL";
|
||||||
|
(function f(b, ...{
|
||||||
|
[a = "PASS"]: c,
|
||||||
|
}) {
|
||||||
|
return b;
|
||||||
|
})();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "FAIL";
|
||||||
|
(function f(b, ...{
|
||||||
|
[a = "PASS"]: c,
|
||||||
|
}) {
|
||||||
|
return b;
|
||||||
|
})();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4644_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(...a) {
|
||||||
|
return a[1];
|
||||||
|
}("FAIL", "PASS"), function(...b) {
|
||||||
|
return b.length;
|
||||||
|
}(), function(c, ...d) {
|
||||||
|
return d[0];
|
||||||
|
}("FAIL"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("PASS", 0, function(c, ...d) {
|
||||||
|
return d[0];
|
||||||
|
}("FAIL"));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS 0 undefined"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4666: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
rests: true,
|
||||||
|
toplevel: true,
|
||||||
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 0, b = 0;
|
||||||
|
var o = ((...c) => a++ + c)(b);
|
||||||
|
for (var k in o)
|
||||||
|
b++;
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 0, b = 0;
|
||||||
|
var o = (c => +a + c)([ b ]);
|
||||||
|
for(var k in o)
|
||||||
|
b++;
|
||||||
|
console.log(1, b);
|
||||||
|
}
|
||||||
|
expect_stdout: "1 2"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
@@ -13,6 +13,23 @@ console_log: {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
console_log_console: {
|
||||||
|
input: {
|
||||||
|
var log = console.log;
|
||||||
|
log(console);
|
||||||
|
log(typeof console.log);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var log = console.log;
|
||||||
|
log(console);
|
||||||
|
log(typeof console.log);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"{ log: 'function(){}' }",
|
||||||
|
"function",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
typeof_arguments: {
|
typeof_arguments: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
@@ -80,3 +97,107 @@ log_global: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "[object global]"
|
expect_stdout: "[object global]"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log_nested: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = { p: 42 };
|
||||||
|
for (var i = 0; i < 10; i++)
|
||||||
|
o = {
|
||||||
|
p: o,
|
||||||
|
q: function foo() {},
|
||||||
|
};
|
||||||
|
console.log(o);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = { p: 42 };
|
||||||
|
for (var i = 0; i < 10; i++)
|
||||||
|
o = {
|
||||||
|
p: o,
|
||||||
|
q: function() {},
|
||||||
|
};
|
||||||
|
console.log(o);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
timers: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var count = 0, interval = 1000, duration = 3210;
|
||||||
|
var timer = setInterval(function() {
|
||||||
|
console.log(++count);
|
||||||
|
}, interval);
|
||||||
|
setTimeout(function() {
|
||||||
|
clearInterval(timer);
|
||||||
|
}, duration);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var count = 0;
|
||||||
|
var timer = setInterval(function() {
|
||||||
|
console.log(++count);
|
||||||
|
}, 1000);
|
||||||
|
setTimeout(function() {
|
||||||
|
clearInterval(timer);
|
||||||
|
}, 3210);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"1",
|
||||||
|
"2",
|
||||||
|
"3",
|
||||||
|
]
|
||||||
|
node_version: ">=0.12"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4054: {
|
||||||
|
input: {
|
||||||
|
console.log({
|
||||||
|
set p(v) {
|
||||||
|
throw "FAIL";
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log({
|
||||||
|
set p(v) {
|
||||||
|
throw "FAIL";
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect_stdout: "{ p: [Setter] }"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4811_1: {
|
||||||
|
input: {
|
||||||
|
for (var PASS in this);
|
||||||
|
console.log(PASS, this, {} < this);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
for (var PASS in this);
|
||||||
|
console.log(PASS, this, {} < this);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS [object global] true"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4811_2: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(async function() {});
|
||||||
|
for (var PASS in this);
|
||||||
|
console.log(PASS, this, {} < this);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
for (var PASS in this);
|
||||||
|
console.log(PASS, this, {} < this);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS [object global] true"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|||||||
@@ -564,6 +564,34 @@ delete_seq_3: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
delete_seq_4: {
|
delete_seq_4: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: false,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {}
|
||||||
|
console.log(delete (f(), undefined));
|
||||||
|
console.log(delete (f(), void 0));
|
||||||
|
console.log(delete (f(), Infinity));
|
||||||
|
console.log(delete (f(), 1 / 0));
|
||||||
|
console.log(delete (f(), NaN));
|
||||||
|
console.log(delete (f(), 0 / 0));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {}
|
||||||
|
console.log(delete void f()),
|
||||||
|
console.log(delete void f()),
|
||||||
|
console.log((f(), delete (1 / 0))),
|
||||||
|
console.log((f(), delete (1 / 0))),
|
||||||
|
console.log(delete (f(), NaN)),
|
||||||
|
console.log((f(), delete(0 / 0)));
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
delete_seq_4_evaluate: {
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
booleans: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
@@ -592,6 +620,35 @@ delete_seq_4: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
delete_seq_5: {
|
delete_seq_5: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: false,
|
||||||
|
keep_infinity: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {}
|
||||||
|
console.log(delete (f(), undefined));
|
||||||
|
console.log(delete (f(), void 0));
|
||||||
|
console.log(delete (f(), Infinity));
|
||||||
|
console.log(delete (f(), 1 / 0));
|
||||||
|
console.log(delete (f(), NaN));
|
||||||
|
console.log(delete (f(), 0 / 0));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {}
|
||||||
|
console.log(delete void f()),
|
||||||
|
console.log(delete void f()),
|
||||||
|
console.log(delete (f(), Infinity)),
|
||||||
|
console.log((f(), delete (1 / 0))),
|
||||||
|
console.log(delete (f(), NaN)),
|
||||||
|
console.log((f(), delete (0 / 0)));
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
delete_seq_5_evaluate: {
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
booleans: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
@@ -663,12 +720,21 @@ side_effects_cascade_1: {
|
|||||||
if (a < 0) a = 0;
|
if (a < 0) a = 0;
|
||||||
b.a = a;
|
b.a = a;
|
||||||
}
|
}
|
||||||
|
var m = {}, n = {};
|
||||||
|
f(13, m);
|
||||||
|
f("foo", n);
|
||||||
|
console.log(m.a, n.a);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function f(a, b) {
|
function f(a, b) {
|
||||||
(a -= 42) < 0 && (a = 0), b.a = a;
|
b.a = a = (a -= 42) < 0 ? 0 : a;
|
||||||
}
|
}
|
||||||
|
var m = {}, n = {};
|
||||||
|
f(13, m),
|
||||||
|
f("foo", n),
|
||||||
|
console.log(m.a, n.a);
|
||||||
}
|
}
|
||||||
|
expect_stdout: "0 NaN"
|
||||||
}
|
}
|
||||||
|
|
||||||
side_effects_cascade_2: {
|
side_effects_cascade_2: {
|
||||||
@@ -877,7 +943,7 @@ for_init_var: {
|
|||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
forin: {
|
forin_1: {
|
||||||
options = {
|
options = {
|
||||||
sequences: true,
|
sequences: true,
|
||||||
}
|
}
|
||||||
@@ -895,6 +961,49 @@ forin: {
|
|||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
forin_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
p: 1,
|
||||||
|
q: 2,
|
||||||
|
};
|
||||||
|
var k = "k";
|
||||||
|
for ((console.log("exp"), o)[function() {
|
||||||
|
console.log("prop");
|
||||||
|
return k;
|
||||||
|
}()] in function() {
|
||||||
|
console.log("obj");
|
||||||
|
return o;
|
||||||
|
}())
|
||||||
|
console.log(o.k, o[o.k]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {
|
||||||
|
p: 1,
|
||||||
|
q: 2,
|
||||||
|
};
|
||||||
|
for ((console.log("exp"), o)[console.log("prop"), "k"] in console.log("obj"), o)
|
||||||
|
console.log(o.k, o[o.k]);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"obj",
|
||||||
|
"exp",
|
||||||
|
"prop",
|
||||||
|
"p 1",
|
||||||
|
"exp",
|
||||||
|
"prop",
|
||||||
|
"q 2",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
call: {
|
call: {
|
||||||
options = {
|
options = {
|
||||||
sequences: true,
|
sequences: true,
|
||||||
@@ -1112,3 +1221,25 @@ issue_3703: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4079: {
|
||||||
|
options = {
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try {
|
||||||
|
typeof (0, A);
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
try {
|
||||||
|
A;
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|||||||
@@ -97,9 +97,8 @@ issue_2233_2: {
|
|||||||
var RegExp;
|
var RegExp;
|
||||||
UndeclaredGlobal;
|
UndeclaredGlobal;
|
||||||
function foo() {
|
function foo() {
|
||||||
var Number;
|
|
||||||
AnotherUndeclaredGlobal;
|
AnotherUndeclaredGlobal;
|
||||||
Number.isNaN;
|
(void 0).isNaN;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -199,6 +198,36 @@ global_fns: {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
global_constructors: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
Map;
|
||||||
|
new Map(console.log("foo"));
|
||||||
|
Set;
|
||||||
|
new Set(console.log("bar"));
|
||||||
|
WeakMap;
|
||||||
|
new WeakMap(console.log("baz"));
|
||||||
|
WeakSet;
|
||||||
|
new WeakSet(console.log("moo"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("foo");
|
||||||
|
console.log("bar");
|
||||||
|
console.log("baz");
|
||||||
|
console.log("moo");
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
"baz",
|
||||||
|
"moo",
|
||||||
|
]
|
||||||
|
node_version: ">=0.12"
|
||||||
|
}
|
||||||
|
|
||||||
unsafe_builtin_1: {
|
unsafe_builtin_1: {
|
||||||
options = {
|
options = {
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
@@ -246,6 +275,31 @@ unsafe_builtin_2: {
|
|||||||
expect_stdout: "object PASS PASS"
|
expect_stdout: "object PASS PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsafe_builtin_3: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {};
|
||||||
|
if (42 < Math.random())
|
||||||
|
o.p = "FAIL";
|
||||||
|
else
|
||||||
|
o.p = "PASS";
|
||||||
|
for (var k in o)
|
||||||
|
console.log(k, o[k]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {};
|
||||||
|
o.p = 42 < Math.random() ? "FAIL" : "PASS";
|
||||||
|
for (var k in o)
|
||||||
|
console.log(k, o[k]);
|
||||||
|
}
|
||||||
|
expect_stdout: "p PASS"
|
||||||
|
}
|
||||||
|
|
||||||
unsafe_string_replace: {
|
unsafe_string_replace: {
|
||||||
options = {
|
options = {
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
@@ -275,3 +329,319 @@ drop_value: {
|
|||||||
foo(), bar();
|
foo(), bar();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
operator_in: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try {
|
||||||
|
"foo" in true;
|
||||||
|
console.log("FAIL");
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
try {
|
||||||
|
0 in true;
|
||||||
|
console.log("FAIL");
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3983_1: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
conditionals: true,
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS";
|
||||||
|
function f() {
|
||||||
|
g && g();
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
function g() {
|
||||||
|
0 ? a : 0;
|
||||||
|
}
|
||||||
|
var b = a;
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "PASS";
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3983_2: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
conditionals: true,
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS";
|
||||||
|
function f() {
|
||||||
|
g && g();
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
function g() {
|
||||||
|
0 ? a : 0;
|
||||||
|
}
|
||||||
|
var b = a;
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4008: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS";
|
||||||
|
function f(b, b) {
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
f && f(a && a[a]);
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "PASS";
|
||||||
|
function f(b, b) {
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
f(a[a]);
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"undefined",
|
||||||
|
"PASS",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
trim_new: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
new function(a) {
|
||||||
|
console.log(a);
|
||||||
|
}("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(a) {
|
||||||
|
console.log(a);
|
||||||
|
})("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4325: {
|
||||||
|
options = {
|
||||||
|
keep_fargs: false,
|
||||||
|
passes: 2,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function f() {
|
||||||
|
(function(b, c) {
|
||||||
|
try {
|
||||||
|
c.p = 0;
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
c;
|
||||||
|
})(f++);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function() {
|
||||||
|
(function(c) {
|
||||||
|
try {
|
||||||
|
c.p = 0;
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
})(void 0);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4366_1: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
({
|
||||||
|
p: 42,
|
||||||
|
get p() {},
|
||||||
|
q: console.log("PASS"),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4366_2: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
({
|
||||||
|
set p(v) {},
|
||||||
|
q: console.log("PASS"),
|
||||||
|
p: 42,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4668: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
keep_fnames: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
var b, c;
|
||||||
|
function g() {
|
||||||
|
return a = 0 + a, !d || (a = 0);
|
||||||
|
}
|
||||||
|
c = g();
|
||||||
|
}
|
||||||
|
console.log(f());
|
||||||
|
var d = 0;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function f() {
|
||||||
|
(function g() {
|
||||||
|
0;
|
||||||
|
})();
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_side_effect_free_call: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
return "PA" + a;
|
||||||
|
}
|
||||||
|
f(42);
|
||||||
|
console.log(f("SS"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a) {
|
||||||
|
return "PA" + a;
|
||||||
|
}
|
||||||
|
console.log(f("SS"));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4730_1: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
console.log("PASS") + (a && a[a.p]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
console.log("PASS"),
|
||||||
|
a && a[a.p];
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4730_2: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
!console.log("PASS") || a && a[a.p];
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
!console.log("PASS") || a && a[a.p];
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4751: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
get p() {
|
||||||
|
console.log("PASS");
|
||||||
|
},
|
||||||
|
};
|
||||||
|
o && o.p;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {
|
||||||
|
get p() {
|
||||||
|
console.log("PASS");
|
||||||
|
},
|
||||||
|
};
|
||||||
|
o && o.p;
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|||||||
1070
test/compress/spreads.js
Normal file
1070
test/compress/spreads.js
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,6 @@
|
|||||||
constant_switch_1: {
|
constant_switch_1: {
|
||||||
options = {
|
options = {
|
||||||
|
conditionals: true,
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
@@ -19,6 +20,7 @@ constant_switch_1: {
|
|||||||
|
|
||||||
constant_switch_2: {
|
constant_switch_2: {
|
||||||
options = {
|
options = {
|
||||||
|
conditionals: true,
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
@@ -39,6 +41,7 @@ constant_switch_2: {
|
|||||||
|
|
||||||
constant_switch_3: {
|
constant_switch_3: {
|
||||||
options = {
|
options = {
|
||||||
|
conditionals: true,
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
@@ -60,6 +63,7 @@ constant_switch_3: {
|
|||||||
|
|
||||||
constant_switch_4: {
|
constant_switch_4: {
|
||||||
options = {
|
options = {
|
||||||
|
conditionals: true,
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
@@ -86,6 +90,7 @@ constant_switch_4: {
|
|||||||
|
|
||||||
constant_switch_5: {
|
constant_switch_5: {
|
||||||
options = {
|
options = {
|
||||||
|
conditionals: true,
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
@@ -120,6 +125,7 @@ constant_switch_5: {
|
|||||||
|
|
||||||
constant_switch_6: {
|
constant_switch_6: {
|
||||||
options = {
|
options = {
|
||||||
|
conditionals: true,
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
@@ -154,6 +160,7 @@ constant_switch_6: {
|
|||||||
|
|
||||||
constant_switch_7: {
|
constant_switch_7: {
|
||||||
options = {
|
options = {
|
||||||
|
conditionals: true,
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
@@ -197,6 +204,7 @@ constant_switch_7: {
|
|||||||
|
|
||||||
constant_switch_8: {
|
constant_switch_8: {
|
||||||
options = {
|
options = {
|
||||||
|
conditionals: true,
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
@@ -226,6 +234,7 @@ constant_switch_8: {
|
|||||||
|
|
||||||
constant_switch_9: {
|
constant_switch_9: {
|
||||||
options = {
|
options = {
|
||||||
|
conditionals: true,
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
@@ -315,6 +324,7 @@ keep_default: {
|
|||||||
|
|
||||||
issue_1663: {
|
issue_1663: {
|
||||||
options = {
|
options = {
|
||||||
|
conditionals: true,
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
@@ -551,6 +561,7 @@ issue_441_2: {
|
|||||||
|
|
||||||
issue_1674: {
|
issue_1674: {
|
||||||
options = {
|
options = {
|
||||||
|
conditionals: true,
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
@@ -876,6 +887,7 @@ beautify: {
|
|||||||
|
|
||||||
issue_1758: {
|
issue_1758: {
|
||||||
options = {
|
options = {
|
||||||
|
conditionals: true,
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
switches: true,
|
switches: true,
|
||||||
}
|
}
|
||||||
@@ -898,15 +910,16 @@ issue_1758: {
|
|||||||
|
|
||||||
issue_2535: {
|
issue_2535: {
|
||||||
options = {
|
options = {
|
||||||
|
conditionals: true,
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
switches: true,
|
switches: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
switch(w(), 42) {
|
switch(w(), 42) {
|
||||||
case 13: x();
|
case 13: x();
|
||||||
case 42: y();
|
case 42: y();
|
||||||
default: z();
|
default: z();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
@@ -919,6 +932,7 @@ issue_2535: {
|
|||||||
|
|
||||||
issue_1750: {
|
issue_1750: {
|
||||||
options = {
|
options = {
|
||||||
|
conditionals: true,
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
switches: true,
|
switches: true,
|
||||||
@@ -963,6 +977,7 @@ drop_switch_1: {
|
|||||||
|
|
||||||
drop_switch_2: {
|
drop_switch_2: {
|
||||||
options = {
|
options = {
|
||||||
|
conditionals: true,
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
switches: true,
|
switches: true,
|
||||||
}
|
}
|
||||||
@@ -1007,6 +1022,7 @@ drop_switch_3: {
|
|||||||
|
|
||||||
drop_switch_4: {
|
drop_switch_4: {
|
||||||
options = {
|
options = {
|
||||||
|
conditionals: true,
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
switches: true,
|
switches: true,
|
||||||
}
|
}
|
||||||
@@ -1028,3 +1044,140 @@ drop_switch_4: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
drop_switch_5: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
switch (A) {
|
||||||
|
case B:
|
||||||
|
x();
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
switch (C) {
|
||||||
|
default:
|
||||||
|
y();
|
||||||
|
case D:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
A === B && x();
|
||||||
|
C !== D && y();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_switch_6: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
switch (A) {
|
||||||
|
case B:
|
||||||
|
default:
|
||||||
|
x();
|
||||||
|
}
|
||||||
|
switch (C) {
|
||||||
|
default:
|
||||||
|
case D:
|
||||||
|
y();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
A === B;
|
||||||
|
x();
|
||||||
|
C !== D;
|
||||||
|
y();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_switch_7: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
switch (A) {
|
||||||
|
case B:
|
||||||
|
w();
|
||||||
|
default:
|
||||||
|
x();
|
||||||
|
}
|
||||||
|
switch (C) {
|
||||||
|
default:
|
||||||
|
y();
|
||||||
|
case D:
|
||||||
|
z();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
A === B && w();
|
||||||
|
x();
|
||||||
|
C !== D && y();
|
||||||
|
z();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_switch_8: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
switch (A) {
|
||||||
|
case B:
|
||||||
|
w();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
x();
|
||||||
|
}
|
||||||
|
switch (C) {
|
||||||
|
default:
|
||||||
|
y();
|
||||||
|
break;
|
||||||
|
case D:
|
||||||
|
z();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(A === B ? w : x)();
|
||||||
|
(C !== D ? y : z)();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4059: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
switch (0) {
|
||||||
|
default:
|
||||||
|
case 1:
|
||||||
|
break;
|
||||||
|
case a:
|
||||||
|
break;
|
||||||
|
var a;
|
||||||
|
}
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
switch (0) {
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
case a:
|
||||||
|
break;
|
||||||
|
var a;
|
||||||
|
}
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|||||||
368
test/compress/templates.js
Normal file
368
test/compress/templates.js
Normal file
@@ -0,0 +1,368 @@
|
|||||||
|
simple: {
|
||||||
|
input: {
|
||||||
|
console.log(`foo
|
||||||
|
bar\nbaz`);
|
||||||
|
}
|
||||||
|
expect_exact: "console.log(`foo\n bar\\nbaz`);"
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
" bar",
|
||||||
|
"baz",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
placeholder: {
|
||||||
|
input: {
|
||||||
|
console.log(`foo ${ function(a, b) {
|
||||||
|
return a * b;
|
||||||
|
}(6, 7) }`);
|
||||||
|
}
|
||||||
|
expect_exact: "console.log(`foo ${function(a,b){return a*b}(6,7)}`);"
|
||||||
|
expect_stdout: "foo 42"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
nested: {
|
||||||
|
input: {
|
||||||
|
console.log(`P${`A${"S"}`}S`);
|
||||||
|
}
|
||||||
|
expect_exact: 'console.log(`P${`A${"S"}`}S`);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
tagged: {
|
||||||
|
input: {
|
||||||
|
console.log(String.raw`foo\nbar`);
|
||||||
|
}
|
||||||
|
expect_exact: "console.log(String.raw`foo\\nbar`);"
|
||||||
|
expect_stdout: "foo\\nbar"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
tagged_chain: {
|
||||||
|
input: {
|
||||||
|
function f(strings) {
|
||||||
|
return strings.join("") || f;
|
||||||
|
}
|
||||||
|
console.log(f```${42}``pass`.toUpperCase());
|
||||||
|
}
|
||||||
|
expect_exact: 'function f(strings){return strings.join("")||f}console.log(f```${42}``pass`.toUpperCase());'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
tag_parentheses_arrow: {
|
||||||
|
input: {
|
||||||
|
console.log((s => s.raw[0])`\tPASS`.slice(2));
|
||||||
|
}
|
||||||
|
expect_exact: "console.log((s=>s.raw[0])`\\tPASS`.slice(2));"
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
tag_parentheses_new: {
|
||||||
|
input: {
|
||||||
|
(new function() {
|
||||||
|
return console.log;
|
||||||
|
})`foo`;
|
||||||
|
}
|
||||||
|
expect_exact: "(new function(){return console.log})`foo`;"
|
||||||
|
expect_stdout: true
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
tag_parentheses_sequence: {
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
f() {
|
||||||
|
console.log(this === o ? "FAIL" : "PASS");
|
||||||
|
},
|
||||||
|
};
|
||||||
|
(42, o.f)``;
|
||||||
|
}
|
||||||
|
expect_exact: 'var o={f(){console.log(this===o?"FAIL":"PASS")}};(42,o.f)``;'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
malformed_escape: {
|
||||||
|
input: {
|
||||||
|
(function(s) {
|
||||||
|
s.forEach((c, i) => console.log(i, c, s.raw[i]));
|
||||||
|
return () => console.log(arguments);
|
||||||
|
})`\uFo${42}`();
|
||||||
|
}
|
||||||
|
expect_exact: "(function(s){s.forEach((c,i)=>console.log(i,c,s.raw[i]));return()=>console.log(arguments)})`\\uFo${42}`();"
|
||||||
|
expect_stdout: true
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
evaluate: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
templates: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(`foo ${ function(a, b) {
|
||||||
|
return a * b;
|
||||||
|
}(6, 7) }`);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(`foo ${42}`);
|
||||||
|
}
|
||||||
|
expect_stdout: "foo 42"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
evaluate_templates: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
templates: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(`foo ${ function(a, b) {
|
||||||
|
return a * b;
|
||||||
|
}(6, 7) }`);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("foo 42");
|
||||||
|
}
|
||||||
|
expect_stdout: "foo 42"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
partial_evaluate: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
templates: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(`${6 * 7} foo ${console ? `PA` + "SS" : `FA` + `IL`}`);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(`42 foo ${console ? "PASS" : "FAIL"}`);
|
||||||
|
}
|
||||||
|
expect_stdout: "42 foo PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
malformed_evaluate_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
templates: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(`\67 ${6 * 7}`);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(`\67 42`);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
malformed_evaluate_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
templates: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(`\u0${0}b${5}`);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(`\u0${0}b5`);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
malformed_evaluate_3: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
templates: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(`\u${0}b${5}`);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(`\u0b5`);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
malformed_evaluate_4: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
templates: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(String.raw`\u0${0}b${5}`);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("\\u00b5");
|
||||||
|
}
|
||||||
|
expect_stdout: "\\u00b5"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe_evaluate: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
templates: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(String.raw`\uFo`);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("\\uFo");
|
||||||
|
}
|
||||||
|
expect_stdout: "\\uFo"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
side_effects_1: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
`42`;
|
||||||
|
`${console.log("foo")}`;
|
||||||
|
console.log`\nbar`;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("foo");
|
||||||
|
console.log`\nbar`;
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
side_effects_2: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
f() {
|
||||||
|
console.log(this === o ? "FAIL" : "PASS");
|
||||||
|
},
|
||||||
|
};
|
||||||
|
(42, o.f)``;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {
|
||||||
|
f() {
|
||||||
|
console.log(this === o ? "FAIL" : "PASS");
|
||||||
|
},
|
||||||
|
};
|
||||||
|
(0, o.f)``;
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe_side_effects: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
`42`;
|
||||||
|
`${console.log("foo")}`;
|
||||||
|
String.raw`\nbar`;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("foo");
|
||||||
|
}
|
||||||
|
expect_stdout: "foo"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4604: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 0, log = console.log;
|
||||||
|
a = "FAIL";
|
||||||
|
(function() {
|
||||||
|
a = "PASS";
|
||||||
|
})``;
|
||||||
|
log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 0, log = console.log;
|
||||||
|
a = "FAIL";
|
||||||
|
(function() {
|
||||||
|
a = "PASS";
|
||||||
|
})``;
|
||||||
|
log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4606: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
templates: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(`${typeof A} ${"\r"} ${"\\"} ${"`"}`);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(`${typeof A} \r \\ \``);
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined \r \\ `"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4630: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
templates: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(`${/PASS/}`);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("/PASS/");
|
||||||
|
}
|
||||||
|
expect_stdout: "/PASS/"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4676: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
templates: true,
|
||||||
|
toplevel: true,
|
||||||
|
unsafe:true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
var b = `foo${a = "PASS"}`;
|
||||||
|
for (var c in f && b)
|
||||||
|
b.p;
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
console.log(f("FAIL"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function f(a) {
|
||||||
|
var b = "fooPASS";
|
||||||
|
for (var c in f, b)
|
||||||
|
b.p;
|
||||||
|
return "PASS";
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
@@ -1,3 +1,37 @@
|
|||||||
|
ascii_only_false: {
|
||||||
|
options = {}
|
||||||
|
beautify = {
|
||||||
|
ascii_only: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(
|
||||||
|
"\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: 'console.log("\\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\');'
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
ascii_only_true: {
|
||||||
|
options = {}
|
||||||
|
beautify = {
|
||||||
|
ascii_only: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(
|
||||||
|
"\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: 'console.log("\\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\');'
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
unicode_parse_variables: {
|
unicode_parse_variables: {
|
||||||
options = {}
|
options = {}
|
||||||
input: {
|
input: {
|
||||||
@@ -16,7 +50,7 @@ unicode_parse_variables: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unicode_escaped_identifier: {
|
unicode_escaped_identifier_1: {
|
||||||
input: {
|
input: {
|
||||||
var \u0061 = "\ud800\udc00";
|
var \u0061 = "\ud800\udc00";
|
||||||
console.log(a);
|
console.log(a);
|
||||||
@@ -25,6 +59,17 @@ unicode_escaped_identifier: {
|
|||||||
expect_stdout: "\ud800\udc00"
|
expect_stdout: "\ud800\udc00"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unicode_escaped_identifier_2: {
|
||||||
|
input: {
|
||||||
|
var \u{61} = "foo";
|
||||||
|
var \u{10000} = "bar";
|
||||||
|
console.log(a, \u{10000});
|
||||||
|
}
|
||||||
|
expect_exact: 'var a="foo";var \u{10000}="bar";console.log(a,\u{10000});'
|
||||||
|
expect_stdout: "foo bar"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
unicode_identifier_ascii_only: {
|
unicode_identifier_ascii_only: {
|
||||||
beautify = {
|
beautify = {
|
||||||
ascii_only: true,
|
ascii_only: true,
|
||||||
@@ -141,3 +186,35 @@ issue_2569: {
|
|||||||
}
|
}
|
||||||
expect_exact: 'new RegExp("[\\udc42-\\udcaa\\udd74-\\udd96\\ude45-\\ude4f\\udea3-\\udecc]");'
|
expect_exact: 'new RegExp("[\\udc42-\\udcaa\\udd74-\\udd96\\ude45-\\ude4f\\udea3-\\udecc]");'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
surrogate_pair: {
|
||||||
|
beautify = {
|
||||||
|
ascii_only: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var \u{2f800} = {
|
||||||
|
\u{2f801}: "\u{100000}",
|
||||||
|
};
|
||||||
|
\u{2f800}.\u{2f802} = "\u{100001}";
|
||||||
|
console.log(typeof \u{2f800}, \u{2f800}.\u{2f801}, \u{2f800}["\u{2f802}"]);
|
||||||
|
}
|
||||||
|
expect_exact: 'var \ud87e\udc00={"\ud87e\udc01":"\udbc0\udc00"};\ud87e\udc00.\ud87e\udc02="\udbc0\udc01";console.log(typeof \ud87e\udc00,\ud87e\udc00.\ud87e\udc01,\ud87e\udc00["\ud87e\udc02"]);'
|
||||||
|
expect_stdout: "object \udbc0\udc00 \udbc0\udc01"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
surrogate_pair_ascii: {
|
||||||
|
beautify = {
|
||||||
|
ascii_only: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var \u{2f800} = {
|
||||||
|
\u{2f801}: "\u{100000}",
|
||||||
|
};
|
||||||
|
\u{2f800}.\u{2f802} = "\u{100001}";
|
||||||
|
console.log(typeof \u{2f800}, \u{2f800}.\u{2f801}, \u{2f800}["\u{2f802}"]);
|
||||||
|
}
|
||||||
|
expect_exact: 'var \\u{2f800}={"\\ud87e\\udc01":"\\udbc0\\udc00"};\\u{2f800}.\\u{2f802}="\\udbc0\\udc01";console.log(typeof \\u{2f800},\\u{2f800}.\\u{2f801},\\u{2f800}["\\ud87e\\udc02"]);'
|
||||||
|
expect_stdout: "object \udbc0\udc00 \udbc0\udc01"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|||||||
525
test/compress/varify.js
Normal file
525
test/compress/varify.js
Normal file
@@ -0,0 +1,525 @@
|
|||||||
|
reduce_merge_const: {
|
||||||
|
options = {
|
||||||
|
merge_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
varify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
const a = console;
|
||||||
|
console.log(typeof a);
|
||||||
|
var b = typeof a;
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var b = console;
|
||||||
|
console.log(typeof b);
|
||||||
|
b = typeof b;
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"object",
|
||||||
|
"object",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
reduce_merge_let: {
|
||||||
|
options = {
|
||||||
|
merge_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
varify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
let a = console;
|
||||||
|
console.log(typeof a);
|
||||||
|
var b = typeof a;
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
var b = console;
|
||||||
|
console.log(typeof b);
|
||||||
|
b = typeof b;
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"object",
|
||||||
|
"object",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
reduce_block_const: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
varify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
{
|
||||||
|
const a = typeof console;
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = typeof console;
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "object"
|
||||||
|
}
|
||||||
|
|
||||||
|
reduce_block_let: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
varify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
{
|
||||||
|
let a = typeof console;
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
var a = typeof console;
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "object"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
hoist_props_const: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
varify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
{
|
||||||
|
const o = {
|
||||||
|
p: "PASS",
|
||||||
|
};
|
||||||
|
console.log(o.p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o_p = "PASS";
|
||||||
|
console.log(o_p);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
hoist_props_let: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
varify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
{
|
||||||
|
let o = {
|
||||||
|
p: "PASS",
|
||||||
|
};
|
||||||
|
console.log(o.p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
var o_p = "PASS";
|
||||||
|
console.log(o_p);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
scope_adjustment_const: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
inline: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
varify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
for (var k in [ 42 ])
|
||||||
|
console.log(function f() {
|
||||||
|
if (k) {
|
||||||
|
const a = 0;
|
||||||
|
}
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
for (var k in [ 42 ])
|
||||||
|
console.log(void (k && 0));
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
scope_adjustment_let: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
inline: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
varify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
for (var k in [ 42 ])
|
||||||
|
console.log(function f() {
|
||||||
|
if (k) {
|
||||||
|
let a = 0;
|
||||||
|
}
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
for (var k in [ 42 ])
|
||||||
|
console.log(void (k && 0));
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4191_const: {
|
||||||
|
options = {
|
||||||
|
functions: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
varify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
const a = function() {};
|
||||||
|
console.log(typeof a, a());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function a() {};
|
||||||
|
console.log(typeof a, a());
|
||||||
|
}
|
||||||
|
expect_stdout: "function undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4191_let: {
|
||||||
|
options = {
|
||||||
|
functions: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
varify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
let a = function() {};
|
||||||
|
console.log(typeof a, a());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
function a() {};
|
||||||
|
console.log(typeof a, a());
|
||||||
|
}
|
||||||
|
expect_stdout: "function undefined"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
forin_const_1: {
|
||||||
|
options = {
|
||||||
|
join_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
varify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
const o = {
|
||||||
|
foo: 42,
|
||||||
|
bar: "PASS",
|
||||||
|
};
|
||||||
|
for (const k in o)
|
||||||
|
console.log(k, o[k]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {
|
||||||
|
foo: 42,
|
||||||
|
bar: "PASS",
|
||||||
|
};
|
||||||
|
for (const k in o)
|
||||||
|
console.log(k, o[k]);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
forin_const_2: {
|
||||||
|
options = {
|
||||||
|
join_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
varify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
const o = {
|
||||||
|
p: 42,
|
||||||
|
q: "PASS",
|
||||||
|
};
|
||||||
|
for (const [ k ] in o)
|
||||||
|
console.log(k, o[k]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {
|
||||||
|
p: 42,
|
||||||
|
q: "PASS",
|
||||||
|
}, k;
|
||||||
|
for ([ k ] in o)
|
||||||
|
console.log(k, o[k]);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"p 42",
|
||||||
|
"q PASS",
|
||||||
|
]
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
forin_let_1: {
|
||||||
|
options = {
|
||||||
|
join_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
varify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
let o = {
|
||||||
|
foo: 42,
|
||||||
|
bar: "PASS",
|
||||||
|
};
|
||||||
|
for (let k in o)
|
||||||
|
console.log(k, o[k]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
var o = {
|
||||||
|
foo: 42,
|
||||||
|
bar: "PASS",
|
||||||
|
}, k;
|
||||||
|
for (k in o)
|
||||||
|
console.log(k, o[k]);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo 42",
|
||||||
|
"bar PASS",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
forin_let_2: {
|
||||||
|
options = {
|
||||||
|
join_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
varify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
let o = {
|
||||||
|
p: 42,
|
||||||
|
q: "PASS",
|
||||||
|
};
|
||||||
|
for (let [ k ] in o)
|
||||||
|
console.log(k, o[k]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {
|
||||||
|
p: 42,
|
||||||
|
q: "PASS",
|
||||||
|
}, k;
|
||||||
|
for ([ k ] in o)
|
||||||
|
console.log(k, o[k]);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"p 42",
|
||||||
|
"q PASS",
|
||||||
|
]
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
loop_scope_1: {
|
||||||
|
options = {
|
||||||
|
toplevel: true,
|
||||||
|
varify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
var o = { foo: 1, bar: 2 };
|
||||||
|
for (let i in o) {
|
||||||
|
console.log(i);
|
||||||
|
}
|
||||||
|
for (const j in o)
|
||||||
|
setTimeout(() => console.log(j), 0);
|
||||||
|
for (let k in o)
|
||||||
|
setTimeout(function() {
|
||||||
|
console.log(k);
|
||||||
|
}, 0);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
var o = { foo: 1, bar: 2 };
|
||||||
|
for (var i in o)
|
||||||
|
console.log(i);
|
||||||
|
for (const j in o)
|
||||||
|
setTimeout(() => console.log(j), 0);
|
||||||
|
for (let k in o)
|
||||||
|
setTimeout(function() {
|
||||||
|
console.log(k);
|
||||||
|
}, 0);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
loop_scope_2: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
varify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
var a = [ "foo", "bar" ];
|
||||||
|
for (var i = 0; i < a.length; i++) {
|
||||||
|
const x = a[i];
|
||||||
|
console.log(x);
|
||||||
|
let y = a[i];
|
||||||
|
setTimeout(() => console.log(y), 0);
|
||||||
|
const z = a[i];
|
||||||
|
setTimeout(function() {
|
||||||
|
console.log(z);
|
||||||
|
}, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
var a = [ "foo", "bar" ];
|
||||||
|
for (var i = 0; i < a.length; i++) {
|
||||||
|
var x = a[i];
|
||||||
|
console.log(x);
|
||||||
|
let y = a[i];
|
||||||
|
setTimeout(() => console.log(y), 0);
|
||||||
|
const z = a[i];
|
||||||
|
setTimeout(function() {
|
||||||
|
console.log(z);
|
||||||
|
}, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
"foo",
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
"bar",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4290_1_const: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
varify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
const a = 0;
|
||||||
|
var a;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
const a = 0;
|
||||||
|
var a;
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_4290_1_let: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
varify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
let a = 0;
|
||||||
|
var a;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
let a = 0;
|
||||||
|
var a;
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_forin_let: {
|
||||||
|
options = {
|
||||||
|
loops: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
varify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
for (let a in console.log("PASS"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
default_init: {
|
||||||
|
options = {
|
||||||
|
join_vars: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
varify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
A = "PASS";
|
||||||
|
(function() {
|
||||||
|
"use strict";
|
||||||
|
let a;
|
||||||
|
a = A;
|
||||||
|
console.log(a);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
A = "PASS";
|
||||||
|
(function() {
|
||||||
|
"use strict";
|
||||||
|
var a = A;
|
||||||
|
console.log(a);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
1085
test/compress/yields.js
Normal file
1085
test/compress/yields.js
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,6 @@
|
|||||||
exports["Compressor"] = Compressor;
|
exports["Compressor"] = Compressor;
|
||||||
exports["defaults"] = defaults;
|
exports["defaults"] = defaults;
|
||||||
|
exports["is_statement"] = is_statement;
|
||||||
exports["JS_Parse_Error"] = JS_Parse_Error;
|
exports["JS_Parse_Error"] = JS_Parse_Error;
|
||||||
exports["List"] = List;
|
exports["List"] = List;
|
||||||
exports["mangle_properties"] = mangle_properties;
|
exports["mangle_properties"] = mangle_properties;
|
||||||
|
|||||||
8
test/input/invalid/destructured_var.js
Normal file
8
test/input/invalid/destructured_var.js
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
function f() {
|
||||||
|
var { eval } = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function g() {
|
||||||
|
"use strict";
|
||||||
|
var { eval } = 42;
|
||||||
|
}
|
||||||
1
test/input/invalid/for-await.js
Normal file
1
test/input/invalid/for-await.js
Normal file
@@ -0,0 +1 @@
|
|||||||
|
for await (; console.log(42););
|
||||||
3
test/input/invalid/for-of_1.js
Normal file
3
test/input/invalid/for-of_1.js
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
var a = [ 1 ], b;
|
||||||
|
for (b = 2 of a)
|
||||||
|
console.log(b);
|
||||||
3
test/input/invalid/for-of_2.js
Normal file
3
test/input/invalid/for-of_2.js
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
var a = [ 1 ];
|
||||||
|
for (var b = 2 of a)
|
||||||
|
console.log(b);
|
||||||
4
test/input/invalid/switch.js
Normal file
4
test/input/invalid/switch.js
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
switch (0) {
|
||||||
|
default:
|
||||||
|
default:
|
||||||
|
}
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
{
|
{
|
||||||
"version": 3,
|
"version": 3,
|
||||||
"sources": [
|
"sources": [
|
||||||
"input.js"
|
"input.js"
|
||||||
],
|
],
|
||||||
"names": [],
|
"names": [],
|
||||||
"mappings": ";;;;;;;;;;;;;;eAAc,OAAO,CAAC,KAAD,C;IAAd,G,YAAA,G;;gBACS,OAAO,CAAC,OAAD,C;IAAhB,K,aAAA,K;;AAEP,GAAG,CAAC,CAAJ,OAAA,GAAG,qBAAM,GAAG,CAAC,CAAJ,CAAM,KAAK,CAAC,CAAZ,CAAN,EAAH",
|
"mappings": ";;;;;;;;;;;;;;eAAc,OAAO,CAAC,KAAD,C;IAAd,G,YAAA,G;;gBACS,OAAO,CAAC,OAAD,C;IAAhB,K,aAAA,K;;AAEP,GAAG,CAAC,CAAJ,OAAA,GAAG,qBAAM,GAAG,CAAC,CAAJ,CAAM,KAAK,CAAC,CAAZ,CAAN,EAAH",
|
||||||
"sourcesContent": [
|
"sourcesContent": [
|
||||||
"const {foo} = require(\"bar\");\nconst {hello} = require(\"world\");\n\nfoo.x(...foo.y(hello.z));\n"
|
"const {foo} = require(\"bar\");\nconst {hello} = require(\"world\");\n\nfoo.x(...foo.y(hello.z));\n"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
new function(){console.log(3)};
|
console.log(3);
|
||||||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInN0ZGluIl0sInNvdXJjZXNDb250ZW50IjpbImNsYXNzIEZvbyB7IGNvbnN0cnVjdG9yKCl7Y29uc29sZS5sb2coMSsyKTt9IH0gbmV3IEZvbygpO1xuIl0sIm5hbWVzIjpbImNvbnNvbGUiLCJsb2ciXSwibWFwcGluZ3MiOiJBQUErQyxJQUFyQyxXQUFnQkEsUUFBUUMsSUFBSSJ9
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInN0ZGluIl0sInNvdXJjZXNDb250ZW50IjpbImNsYXNzIEZvbyB7IGNvbnN0cnVjdG9yKCl7Y29uc29sZS5sb2coMSsyKTt9IH0gbmV3IEZvbygpO1xuIl0sIm5hbWVzIjpbImNvbnNvbGUiLCJsb2ciXSwibWFwcGluZ3MiOiJBQUEwQkEsUUFBUUMsSUFBSSJ9
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"compress": false,
|
"compress": false,
|
||||||
"mangle": {
|
"mangle": {
|
||||||
"properties": {
|
"properties": {
|
||||||
"regex": "/^_/"
|
"regex": "/^_/"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
new function(){console.log(3)};
|
console.log(3);
|
||||||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInN0ZGluIl0sInNvdXJjZXNDb250ZW50IjpbImNsYXNzIEZvbyB7IGNvbnN0cnVjdG9yKCl7Y29uc29sZS5sb2coMSsyKTt9IH0gbmV3IEZvbygpO1xuIl0sIm5hbWVzIjpbImNvbnNvbGUiLCJsb2ciXSwibWFwcGluZ3MiOiJBQUErQyxJQUFyQyxXQUFnQkEsUUFBUUMsSUFBSSJ9
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInN0ZGluIl0sInNvdXJjZXNDb250ZW50IjpbImNsYXNzIEZvbyB7IGNvbnN0cnVjdG9yKCl7Y29uc29sZS5sb2coMSsyKTt9IH0gbmV3IEZvbygpO1xuIl0sIm5hbWVzIjpbImNvbnNvbGUiLCJsb2ciXSwibWFwcGluZ3MiOiJBQUEwQkEsUUFBUUMsSUFBSSJ9
|
||||||
|
|||||||
3
test/input/reduce/destructured_assign.js
Normal file
3
test/input/reduce/destructured_assign.js
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
var o = {};
|
||||||
|
[ o[1 + .1 + .1] ] = [ 42 ];
|
||||||
|
console.log(o[1.2]);
|
||||||
17
test/input/reduce/destructured_assign.reduced.js
Normal file
17
test/input/reduce/destructured_assign.reduced.js
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
// (beautified)
|
||||||
|
var o = {};
|
||||||
|
|
||||||
|
[ o[1 + .1 + .1] ] = [];
|
||||||
|
|
||||||
|
console.log(o);
|
||||||
|
// output: { '1.2000000000000002': undefined }
|
||||||
|
//
|
||||||
|
// minify: { '1.2': undefined }
|
||||||
|
//
|
||||||
|
// options: {
|
||||||
|
// "compress": {
|
||||||
|
// "unsafe_math": true
|
||||||
|
// },
|
||||||
|
// "mangle": false,
|
||||||
|
// "validate": true
|
||||||
|
// }
|
||||||
7
test/input/reduce/destructured_catch.js
Normal file
7
test/input/reduce/destructured_catch.js
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
try {
|
||||||
|
"foo" in 42;
|
||||||
|
} catch ({
|
||||||
|
message,
|
||||||
|
}) {
|
||||||
|
console.log(message);
|
||||||
|
}
|
||||||
13
test/input/reduce/destructured_catch.reduced.js
Normal file
13
test/input/reduce/destructured_catch.reduced.js
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
// (beautified)
|
||||||
|
try {
|
||||||
|
1 in 0;
|
||||||
|
} catch (message) {
|
||||||
|
console.log(message);
|
||||||
|
}
|
||||||
|
// output: TypeError: Cannot use 'in' operator to search for '1' in 0
|
||||||
|
//
|
||||||
|
// minify: TypeError: Cannot use 'in' operator to search for '0' in 0
|
||||||
|
//
|
||||||
|
// options: {
|
||||||
|
// "mangle": false
|
||||||
|
// }
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user