Compare commits
586 Commits
harmony-v2
...
harmony-v3
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
94b19a9c46 | ||
|
|
bcf95ac02c | ||
|
|
e11cec1ab8 | ||
|
|
38bfb73f06 | ||
|
|
bbedbf4ea0 | ||
|
|
2cfb5aa7da | ||
|
|
6c45101870 | ||
|
|
2c2fd89e34 | ||
|
|
0c43519097 | ||
|
|
352a7de204 | ||
|
|
df9c8dfd72 | ||
|
|
f46281e2b7 | ||
|
|
25a18883f5 | ||
|
|
5b4b07e9a7 | ||
|
|
a8aa28a7a6 | ||
|
|
fe5a68f9d5 | ||
|
|
71e61153b1 | ||
|
|
c8b6f4733d | ||
|
|
29bbc41dfe | ||
|
|
a48f87abf2 | ||
|
|
d535daa2c7 | ||
|
|
0a9cdb6c73 | ||
|
|
3ae34177a6 | ||
|
|
086cb33163 | ||
|
|
2fd927a7cc | ||
|
|
8428326ea1 | ||
|
|
6371e2ee63 | ||
|
|
6ab73c7bd5 | ||
|
|
31f8209193 | ||
|
|
9b0f86f5a1 | ||
|
|
ee082ace1b | ||
|
|
ae67a49850 | ||
|
|
4178289c38 | ||
|
|
74ae16f9f8 | ||
|
|
1968203d83 | ||
|
|
2848596280 | ||
|
|
86ea38a259 | ||
|
|
8a713e449f | ||
|
|
7d9a8596a9 | ||
|
|
24aa07855b | ||
|
|
5fd723f143 | ||
|
|
516eaef50c | ||
|
|
4ae1fb3ed8 | ||
|
|
011123223b | ||
|
|
44352eb26a | ||
|
|
9f1c72ae28 | ||
|
|
c60fa67827 | ||
|
|
96439ca246 | ||
|
|
f9c57dfee0 | ||
|
|
c927cea632 | ||
|
|
9f4b98f8e4 | ||
|
|
0f2ef3367c | ||
|
|
6bf5fea008 | ||
|
|
7e5b5cac97 | ||
|
|
c1346e06b7 | ||
|
|
0d2fe8e3ef | ||
|
|
f2b9c11e2a | ||
|
|
b6a7ca292e | ||
|
|
fe647b083e | ||
|
|
a89f126db6 | ||
|
|
d8ee2de95c | ||
|
|
58a5608b66 | ||
|
|
f496ac5c85 | ||
|
|
dfe4f6c6de | ||
|
|
a09c8ad666 | ||
|
|
ec598c351b | ||
|
|
f79f737fb2 | ||
|
|
eba0f93bc0 | ||
|
|
99800d4aa9 | ||
|
|
70d56c951a | ||
|
|
b810e2f8da | ||
|
|
1abe14296e | ||
|
|
336b1add4f | ||
|
|
873755b35c | ||
|
|
744032755d | ||
|
|
4fac8076b8 | ||
|
|
6920e898d1 | ||
|
|
dd71639264 | ||
|
|
2dcc552ce0 | ||
|
|
a020d2ead3 | ||
|
|
68645b28d3 | ||
|
|
aaa8212837 | ||
|
|
bd84007cf4 | ||
|
|
55387e8fd0 | ||
|
|
1241600013 | ||
|
|
7e3e9da860 | ||
|
|
a784717fe2 | ||
|
|
00f509405b | ||
|
|
e8235657e4 | ||
|
|
c46b9f361a | ||
|
|
3b0b4d6abf | ||
|
|
d73500e8d1 | ||
|
|
aceb0af36b | ||
|
|
4f0953f7e9 | ||
|
|
182a47bfb1 | ||
|
|
d8685f528d | ||
|
|
8891495789 | ||
|
|
cd27f4ec38 | ||
|
|
8158b1bdcf | ||
|
|
aacf3edc68 | ||
|
|
8b89072190 | ||
|
|
395a17ccda | ||
|
|
3f355866cf | ||
|
|
2779a29a86 | ||
|
|
71d52f147d | ||
|
|
eb7adaa6fc | ||
|
|
e5cf7972ea | ||
|
|
067d52b6ba | ||
|
|
e0e009ace2 | ||
|
|
f81ff10a9b | ||
|
|
ae0f117da6 | ||
|
|
a5461e0adc | ||
|
|
16d40915b4 | ||
|
|
2bf8216e50 | ||
|
|
2ed3f8db44 | ||
|
|
4700c14855 | ||
|
|
e7c21e87e3 | ||
|
|
f54ab16843 | ||
|
|
69cb459c16 | ||
|
|
1eae8f2dcc | ||
|
|
c4c2ef44d0 | ||
|
|
a845897758 | ||
|
|
d600c78d7b | ||
|
|
32ea2c5530 | ||
|
|
d3df2f985d | ||
|
|
69861824b5 | ||
|
|
1e0c7d2bc5 | ||
|
|
98b850580b | ||
|
|
29011ea60a | ||
|
|
77d18be073 | ||
|
|
bc61deeca9 | ||
|
|
6a5e74b44e | ||
|
|
54446341ee | ||
|
|
91f8b57b3e | ||
|
|
3a2b737c42 | ||
|
|
4e12a6f740 | ||
|
|
b35dfc2599 | ||
|
|
9e1da9235e | ||
|
|
a5ffe2c23f | ||
|
|
9282e7b0c6 | ||
|
|
5229cb2b1b | ||
|
|
458e3e15f0 | ||
|
|
c615a1e80a | ||
|
|
10a938cb79 | ||
|
|
0f4278148d | ||
|
|
4956ad311b | ||
|
|
145874e504 | ||
|
|
f30375052b | ||
|
|
3e1a8598bf | ||
|
|
ef63de6968 | ||
|
|
2539fb8096 | ||
|
|
a556dd2dcb | ||
|
|
bd7be07c38 | ||
|
|
71ee91e716 | ||
|
|
e7334b4048 | ||
|
|
4f70d2e28c | ||
|
|
4b6ca5e742 | ||
|
|
f5c46db738 | ||
|
|
9306da3c58 | ||
|
|
1ac25fc032 | ||
|
|
fdbb1d09ef | ||
|
|
5f046c724b | ||
|
|
af0262b7e5 | ||
|
|
6b3aeff1d8 | ||
|
|
20e4f8277f | ||
|
|
f3a487a368 | ||
|
|
33ad0d258c | ||
|
|
5ea1da2d42 | ||
|
|
e77b6d525c | ||
|
|
2dde41615a | ||
|
|
8b69a3d18e | ||
|
|
d40950b741 | ||
|
|
a9eecd844f | ||
|
|
ed3032e52a | ||
|
|
7659ea1d2e | ||
|
|
52cc21d999 | ||
|
|
a938fe5e1f | ||
|
|
07a5a57336 | ||
|
|
bdeadffbf5 | ||
|
|
945db924fc | ||
|
|
087bce508a | ||
|
|
5e6f26445f | ||
|
|
fc7e33453f | ||
|
|
d052394621 | ||
|
|
4d5aeeddfb | ||
|
|
f0a99125ee | ||
|
|
1e4de2e6d3 | ||
|
|
ad139aa34d | ||
|
|
26be15f111 | ||
|
|
179f33f08a | ||
|
|
d260fe9018 | ||
|
|
96f9b8cba3 | ||
|
|
11afa816e3 | ||
|
|
8b4dcd8f3e | ||
|
|
285401ced8 | ||
|
|
9db4c42380 | ||
|
|
49f3de8397 | ||
|
|
94f93ad82d | ||
|
|
d1f085bce7 | ||
|
|
7b95b63ca1 | ||
|
|
94e5e00c03 | ||
|
|
dc6bcaa18e | ||
|
|
d58b184835 | ||
|
|
137e4c4753 | ||
|
|
b3a57ff019 | ||
|
|
3d5bc08185 | ||
|
|
0692435f01 | ||
|
|
b163b13a0b | ||
|
|
402954bdf3 | ||
|
|
f5931866e0 | ||
|
|
f67a6b0e43 | ||
|
|
471db8a717 | ||
|
|
8ba9e4e0da | ||
|
|
71556d00b5 | ||
|
|
8709753bfb | ||
|
|
db877e8729 | ||
|
|
11923e3ae8 | ||
|
|
62d1fbf645 | ||
|
|
343ea326c2 | ||
|
|
849ba79dee | ||
|
|
a298bcce02 | ||
|
|
daaf1273fa | ||
|
|
1c150c632f | ||
|
|
0a0f4f5591 | ||
|
|
931daa85bf | ||
|
|
00e4f7b3c1 | ||
|
|
11e63bc335 | ||
|
|
3fa862ce19 | ||
|
|
33405bb24b | ||
|
|
370f2cc906 | ||
|
|
78cf35f89c | ||
|
|
57dc4fb32f | ||
|
|
b85a358deb | ||
|
|
100e18305d | ||
|
|
43697958f3 | ||
|
|
3f961bbba0 | ||
|
|
7cc03d4d40 | ||
|
|
0a1e523cd5 | ||
|
|
c28056d7ed | ||
|
|
8af362ed57 | ||
|
|
4231f7323e | ||
|
|
68138f2281 | ||
|
|
da2de350c3 | ||
|
|
41beae4dd7 | ||
|
|
82db9188ac | ||
|
|
3dc9e140e4 | ||
|
|
fed0096556 | ||
|
|
2bdc8802dd | ||
|
|
5ef7cb372a | ||
|
|
4ad7b1dae4 | ||
|
|
9186859cb7 | ||
|
|
47c0713747 | ||
|
|
293c566d6c | ||
|
|
9c306406f1 | ||
|
|
9db0695b10 | ||
|
|
a7971f4e34 | ||
|
|
f2af093402 | ||
|
|
b9ad53d1ab | ||
|
|
b0eab71470 | ||
|
|
3493a182b2 | ||
|
|
27c5284d3d | ||
|
|
540220b91b | ||
|
|
82fefc5d29 | ||
|
|
753932b302 | ||
|
|
84634da4b5 | ||
|
|
1743621889 | ||
|
|
1edbd6556f | ||
|
|
f330ab743a | ||
|
|
888a321417 | ||
|
|
ee5c03f7f1 | ||
|
|
4377e932ca | ||
|
|
bac14ba881 | ||
|
|
ec095ed647 | ||
|
|
17e73121fa | ||
|
|
0cb75089f0 | ||
|
|
f71e8fd948 | ||
|
|
a1647ee0c5 | ||
|
|
c814060b4a | ||
|
|
3e62faa64f | ||
|
|
e9645e017f | ||
|
|
55b5f2a8aa | ||
|
|
303293e4aa | ||
|
|
23265ac253 | ||
|
|
0cc6dedccc | ||
|
|
ec63588496 | ||
|
|
c2e471e3ad | ||
|
|
ee23a84e14 | ||
|
|
520da57fdc | ||
|
|
4e0a22e5c8 | ||
|
|
1aa38051fb | ||
|
|
e62b879b48 | ||
|
|
c6c9f4f5a8 | ||
|
|
fec14379f6 | ||
|
|
e5e0ce0b42 | ||
|
|
79131cd647 | ||
|
|
94d2aeee89 | ||
|
|
aa835eb0f6 | ||
|
|
c3f14a1481 | ||
|
|
7b13159cda | ||
|
|
95094b9c22 | ||
|
|
1ff8e9dd38 | ||
|
|
78309a293d | ||
|
|
695e182d59 | ||
|
|
dc33facfcb | ||
|
|
39d4d7e20a | ||
|
|
c70fb60384 | ||
|
|
02811ce35e | ||
|
|
793d61499b | ||
|
|
a277fe168d | ||
|
|
c988e5f4d6 | ||
|
|
7d3b941e6e | ||
|
|
075b648bb1 | ||
|
|
37e549ff4f | ||
|
|
e95052a423 | ||
|
|
e667f0acb8 | ||
|
|
7bcb442e4c | ||
|
|
a658cd84a5 | ||
|
|
69ac794bc8 | ||
|
|
efdb65913b | ||
|
|
a1dedeb3ce | ||
|
|
5b22334f3b | ||
|
|
a3053c537a | ||
|
|
d3c4a8e9e7 | ||
|
|
d6f77a6352 | ||
|
|
7e164aba8f | ||
|
|
22aedef849 | ||
|
|
58fae7dc07 | ||
|
|
a2172e1a99 | ||
|
|
5bf8d7e949 | ||
|
|
1df9d06f4a | ||
|
|
9a074c2637 | ||
|
|
02b14528fa | ||
|
|
3408fc9d32 | ||
|
|
eae26756f1 | ||
|
|
3db2001633 | ||
|
|
aaba482e48 | ||
|
|
5f29fced0a | ||
|
|
43add9416b | ||
|
|
efcf167e5e | ||
|
|
6ed90913ca | ||
|
|
b1b918e6d6 | ||
|
|
569c21e952 | ||
|
|
87c3a2c0ce | ||
|
|
baef8bf050 | ||
|
|
0813c5316f | ||
|
|
ebb469e4cd | ||
|
|
c22d26b483 | ||
|
|
f751e64d49 | ||
|
|
60c56a24b9 | ||
|
|
c88139492d | ||
|
|
cb45886512 | ||
|
|
01f23cf5a1 | ||
|
|
99fb3e8f0d | ||
|
|
050474ab44 | ||
|
|
f6c805ae1d | ||
|
|
9464d3c20f | ||
|
|
f18abd1b9c | ||
|
|
3be06ad085 | ||
|
|
265008c948 | ||
|
|
756c9aa7dc | ||
|
|
07d6bfd707 | ||
|
|
81243c4e71 | ||
|
|
cd6e849555 | ||
|
|
ff526be61d | ||
|
|
e005099fb1 | ||
|
|
504a436e9d | ||
|
|
3ca902258c | ||
|
|
91de285166 | ||
|
|
4d8f289eb0 | ||
|
|
fd0951231c | ||
|
|
9e29b6dad2 | ||
|
|
c391576d52 | ||
|
|
ac73c5d421 | ||
|
|
547f41beba | ||
|
|
945ba64160 | ||
|
|
c699200398 | ||
|
|
daf44f2b21 | ||
|
|
daaefc17b9 | ||
|
|
1d407e761e | ||
|
|
2b44f4ae30 | ||
|
|
e51c3541da | ||
|
|
3bf194684b | ||
|
|
fcd90db30d | ||
|
|
e2888bdc43 | ||
|
|
fb50b7b627 | ||
|
|
aae7d49d0c | ||
|
|
9d59c693c2 | ||
|
|
0459af2ecc | ||
|
|
04f2344efc | ||
|
|
6ddb5bd94d | ||
|
|
bad9d5cf88 | ||
|
|
eda49605c5 | ||
|
|
a0f5f862df | ||
|
|
1e9ef17e32 | ||
|
|
41996be86f | ||
|
|
222100ea4c | ||
|
|
5fd8244a2e | ||
|
|
93db48a317 | ||
|
|
2944e3df7d | ||
|
|
c14e280585 | ||
|
|
bc3fa78e8c | ||
|
|
8c7c107765 | ||
|
|
e0ae8da089 | ||
|
|
81f1311b24 | ||
|
|
2433bb4e52 | ||
|
|
3dd328dce3 | ||
|
|
014f428153 | ||
|
|
a3b2eb75bd | ||
|
|
da295de82b | ||
|
|
4f8ca4626e | ||
|
|
e54748365c | ||
|
|
3fac29a017 | ||
|
|
b4c18f6b83 | ||
|
|
2d99d06601 | ||
|
|
98cf95e5b5 | ||
|
|
7313465cba | ||
|
|
2c7ee956fd | ||
|
|
ecf3563c45 | ||
|
|
dee5a27516 | ||
|
|
5a25d24b56 | ||
|
|
bffdc8dca8 | ||
|
|
69b5663653 | ||
|
|
ea9289771b | ||
|
|
2cb55b2ad0 | ||
|
|
73d6438773 | ||
|
|
5c6316a37d | ||
|
|
bbb5f2a89c | ||
|
|
76d19b60ad | ||
|
|
9e62628171 | ||
|
|
9bf72cf758 | ||
|
|
64d74432f6 | ||
|
|
45ce369480 | ||
|
|
ca32a09032 | ||
|
|
6f954aa3d0 | ||
|
|
f05d4f7af3 | ||
|
|
88e7a542cd | ||
|
|
4dcff038cb | ||
|
|
b4b9305db0 | ||
|
|
28cfb65c47 | ||
|
|
0f4f01b66c | ||
|
|
5d9f1da3ab | ||
|
|
d1aa09c5c7 | ||
|
|
6d5f341999 | ||
|
|
4ffb6fce76 | ||
|
|
71a8d0d236 | ||
|
|
1a498db2d3 | ||
|
|
44dfa5a318 | ||
|
|
251ff1d1af | ||
|
|
ec443e422c | ||
|
|
32deb365d5 | ||
|
|
2244743545 | ||
|
|
278577f3cb | ||
|
|
0d8597e904 | ||
|
|
04b8964505 | ||
|
|
d6fbc365e2 | ||
|
|
9a978843f5 | ||
|
|
0479ff0c54 | ||
|
|
cf72fe552f | ||
|
|
a1532eb076 | ||
|
|
c2a1bceb77 | ||
|
|
e3c9c22c75 | ||
|
|
0f4cd73dcc | ||
|
|
281e882d27 | ||
|
|
cc6aa3e5ac | ||
|
|
e869779a98 | ||
|
|
06cdb74279 | ||
|
|
ff289b90a9 | ||
|
|
9b6bc67c33 | ||
|
|
4b90dc1fdb | ||
|
|
c20bb99a62 | ||
|
|
951770fc68 | ||
|
|
2377171200 | ||
|
|
603d92effc | ||
|
|
48b3fe9952 | ||
|
|
a400741868 | ||
|
|
17f0cc359f | ||
|
|
59a4e56bc8 | ||
|
|
1f1fccc45d | ||
|
|
35bae3fcd0 | ||
|
|
4614b5b46e | ||
|
|
b7f6b73f4e | ||
|
|
9469c03ac9 | ||
|
|
d57527697f | ||
|
|
f7ca4f2297 | ||
|
|
c076e7b60d | ||
|
|
4a55bb0be5 | ||
|
|
28ecea50a6 | ||
|
|
9a311705f5 | ||
|
|
ee3fe0f4cd | ||
|
|
87f6e1b091 | ||
|
|
c934fc8142 | ||
|
|
257ddc3bdb | ||
|
|
1ddc05725d | ||
|
|
2f93058c6e | ||
|
|
a729c43e87 | ||
|
|
e6b76a4879 | ||
|
|
a0c3836ba0 | ||
|
|
f8a71b56fd | ||
|
|
11e9bdc427 | ||
|
|
66e9039350 | ||
|
|
d717bf9ce8 | ||
|
|
a84564d1a8 | ||
|
|
c595b84032 | ||
|
|
5dea52266b | ||
|
|
7cb1adf455 | ||
|
|
7bea38a05d | ||
|
|
0f910ee25c | ||
|
|
beb9659778 | ||
|
|
f1a833a7aa | ||
|
|
2e41cd6394 | ||
|
|
09f77c7d4d | ||
|
|
fef0bf9ee0 | ||
|
|
ae740b933f | ||
|
|
ec7f37f314 | ||
|
|
fccefbeaca | ||
|
|
eb48a035e7 | ||
|
|
1e2b0aaa04 | ||
|
|
6ab3224c0d | ||
|
|
c909ffb715 | ||
|
|
f71f4905b0 | ||
|
|
fb177a6312 | ||
|
|
65da9acce6 | ||
|
|
67d0237f73 | ||
|
|
984a21704e | ||
|
|
aa3f647656 | ||
|
|
c526da59a1 | ||
|
|
581630e0a7 | ||
|
|
f5952933a0 | ||
|
|
f001e4cb9d | ||
|
|
57ce5bd9e0 | ||
|
|
861a79ac9f | ||
|
|
00996afd2c | ||
|
|
e76fb354eb | ||
|
|
3276740779 | ||
|
|
5509e51098 | ||
|
|
94f84727ce | ||
|
|
8a4f86528f | ||
|
|
adb0e882e9 | ||
|
|
6a54de79b5 | ||
|
|
f83d370f57 | ||
|
|
b19aa58cff | ||
|
|
0a65de89b9 | ||
|
|
6e86ee950d | ||
|
|
8ca2401ebe | ||
|
|
491f16c766 | ||
|
|
a30092e20f | ||
|
|
b1abe92e1a | ||
|
|
b454ce667e | ||
|
|
32283a0def | ||
|
|
ac51d4c5a0 | ||
|
|
0432a7abb9 | ||
|
|
f3a1694a41 | ||
|
|
2e0dc97003 | ||
|
|
701035621d | ||
|
|
79334dda10 | ||
|
|
e918748d88 | ||
|
|
9e2290b29c | ||
|
|
97d0fc271d | ||
|
|
6b2f34769a | ||
|
|
48ffbef51d | ||
|
|
c0f3feae9f | ||
|
|
a00040dd93 | ||
|
|
ee95c1b38b | ||
|
|
4bceb85cbf | ||
|
|
7906033e82 | ||
|
|
4bf21ce5c1 | ||
|
|
44d6b47bdc | ||
|
|
30a75049f5 | ||
|
|
a3cc3a9b87 | ||
|
|
96f8befdd7 | ||
|
|
cd58635dcc | ||
|
|
274331d0ea | ||
|
|
129e449c8e | ||
|
|
75c3c8963f | ||
|
|
0489d6de64 | ||
|
|
fb092839c2 | ||
|
|
d26b7522d9 | ||
|
|
b7c112eefe | ||
|
|
b2b8a0d386 | ||
|
|
ac40301813 | ||
|
|
3563d8c09e | ||
|
|
5ae04b3545 | ||
|
|
a80b228d8b | ||
|
|
cf4bf4ceb1 | ||
|
|
8223b2e0db | ||
|
|
381bd3836e |
32
.github/ISSUE_TEMPLATE.md
vendored
32
.github/ISSUE_TEMPLATE.md
vendored
@@ -1,7 +1,27 @@
|
|||||||
- Bug report or feature request?
|
**Bug report or feature request?**
|
||||||
- `uglify-js` version (`uglifyjs -V`)
|
|
||||||
- JavaScript input - ideally as small as possible.
|
|
||||||
- The `uglifyjs` CLI command executed or `minify()` options used.
|
|
||||||
- An example of JavaScript output produced and/or the error or warning.
|
|
||||||
|
|
||||||
Note: the release version of `uglify-js` only supports ES5. Those wishing to minify ES6 should use the experimental [`harmony`](https://github.com/mishoo/UglifyJS2#harmony) branch.
|
<!-- Note: sub-optimal but correct code is not a bug -->
|
||||||
|
|
||||||
|
**ES5 or ES6+ input?**
|
||||||
|
|
||||||
|
<!-- Note: for ES6 see: https://github.com/mishoo/UglifyJS2/tree/harmony#harmony -->
|
||||||
|
|
||||||
|
**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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
**The `uglifyjs` CLI command executed or `minify()` options used.**
|
||||||
|
|
||||||
|
**JavaScript output or error produced.**
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Note: `uglify-js` only supports ES5.
|
||||||
|
Those wishing to minify ES6 should use `uglify-es`.
|
||||||
|
-->
|
||||||
|
|||||||
@@ -1,13 +1,14 @@
|
|||||||
language: node_js
|
language: node_js
|
||||||
before_install: "npm install -g npm"
|
|
||||||
node_js:
|
node_js:
|
||||||
- "0.10"
|
- "0.10"
|
||||||
- "0.12"
|
- "0.12"
|
||||||
- "4"
|
- "4"
|
||||||
- "6"
|
- "6"
|
||||||
- "7"
|
- "8"
|
||||||
env:
|
env:
|
||||||
- UGLIFYJS_TEST_ALL=1
|
- UGLIFYJS_TEST_ALL=1
|
||||||
matrix:
|
matrix:
|
||||||
fast_finish: true
|
fast_finish: true
|
||||||
sudo: false
|
sudo: false
|
||||||
|
cache:
|
||||||
|
directories: tmp
|
||||||
|
|||||||
@@ -1,77 +0,0 @@
|
|||||||
#! /usr/bin/env node
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
var U2 = require("../tools/node");
|
|
||||||
var fs = require("fs");
|
|
||||||
var yargs = require("yargs");
|
|
||||||
var ARGS = yargs
|
|
||||||
.describe("o", "Output file")
|
|
||||||
.argv;
|
|
||||||
var files = ARGS._.slice();
|
|
||||||
var output = {
|
|
||||||
vars: {},
|
|
||||||
props: {}
|
|
||||||
};
|
|
||||||
|
|
||||||
if (ARGS.o) try {
|
|
||||||
output = JSON.parse(fs.readFileSync(ARGS.o, "utf8"));
|
|
||||||
} catch(ex) {}
|
|
||||||
|
|
||||||
files.forEach(getProps);
|
|
||||||
|
|
||||||
if (ARGS.o) {
|
|
||||||
fs.writeFileSync(ARGS.o, JSON.stringify(output, null, 2), "utf8");
|
|
||||||
} else {
|
|
||||||
console.log("%s", JSON.stringify(output, null, 2));
|
|
||||||
}
|
|
||||||
|
|
||||||
function getProps(filename) {
|
|
||||||
var code = fs.readFileSync(filename, "utf8");
|
|
||||||
var ast = U2.parse(code);
|
|
||||||
|
|
||||||
ast.walk(new U2.TreeWalker(function(node){
|
|
||||||
if (node instanceof U2.AST_ObjectKeyVal) {
|
|
||||||
add(node.key);
|
|
||||||
}
|
|
||||||
else if (node instanceof U2.AST_ObjectProperty) {
|
|
||||||
add(node.key.name);
|
|
||||||
}
|
|
||||||
else if (node instanceof U2.AST_Dot) {
|
|
||||||
add(node.property);
|
|
||||||
}
|
|
||||||
else if (node instanceof U2.AST_Sub) {
|
|
||||||
addStrings(node.property);
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
function addStrings(node) {
|
|
||||||
var out = {};
|
|
||||||
try {
|
|
||||||
(function walk(node){
|
|
||||||
node.walk(new U2.TreeWalker(function(node){
|
|
||||||
if (node instanceof U2.AST_Seq) {
|
|
||||||
walk(node.cdr);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (node instanceof U2.AST_String) {
|
|
||||||
add(node.value);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (node instanceof U2.AST_Conditional) {
|
|
||||||
walk(node.consequent);
|
|
||||||
walk(node.alternative);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
throw out;
|
|
||||||
}));
|
|
||||||
})(node);
|
|
||||||
} catch(ex) {
|
|
||||||
if (ex !== out) throw ex;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function add(name) {
|
|
||||||
output.props[name] = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
939
bin/uglifyjs
939
bin/uglifyjs
@@ -3,633 +3,404 @@
|
|||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
var UglifyJS = require("../tools/node");
|
// workaround for tty output truncation upon process.exit()
|
||||||
var sys = require("util");
|
[process.stdout, process.stderr].forEach(function(stream){
|
||||||
var yargs = require("yargs");
|
if (stream._handle && stream._handle.setBlocking)
|
||||||
var fs = require("fs");
|
stream._handle.setBlocking(true);
|
||||||
var path = require("path");
|
|
||||||
var acorn;
|
|
||||||
var screw_ie8 = true;
|
|
||||||
var ARGS = yargs
|
|
||||||
.usage("$0 input1.js [input2.js ...] [options]\n\
|
|
||||||
Use a single dash to read input from the standard input.\
|
|
||||||
\n\n\
|
|
||||||
NOTE: by default there is no mangling/compression.\n\
|
|
||||||
Without [options] it will simply parse input files and dump the AST\n\
|
|
||||||
with whitespace and comments discarded. To achieve compression and\n\
|
|
||||||
mangling you need to use `-c` and `-m`.\
|
|
||||||
")
|
|
||||||
.describe("source-map", "Specify an output file where to generate source map.")
|
|
||||||
.describe("source-map-root", "The path to the original source to be included in the source map.")
|
|
||||||
.describe("source-map-url", "The path to the source map to be added in //# sourceMappingURL. Defaults to the value passed with --source-map.")
|
|
||||||
.describe("source-map-inline", "Write base64-encoded source map to the end of js output. Disabled by default")
|
|
||||||
.describe("source-map-include-sources", "Pass this flag if you want to include the content of source files in the source map as sourcesContent property.")
|
|
||||||
.describe("in-source-map", "Input source map, useful if you're compressing JS that was generated from some other original code.")
|
|
||||||
.describe("screw-ie8", "Do not support Internet Explorer 6/7/8. This flag is enabled by default.")
|
|
||||||
.describe("support-ie8", "Support non-standard Internet Explorer 6/7/8 javascript.")
|
|
||||||
.describe("expr", "Parse a single expression, rather than a program (for parsing JSON)")
|
|
||||||
.describe("p", "Skip prefix for original filenames that appear in source maps. \
|
|
||||||
For example -p 3 will drop 3 directories from file names and ensure they are relative paths. \
|
|
||||||
You can also specify -p relative, which will make UglifyJS figure out itself the relative paths between original sources, \
|
|
||||||
the source map and the output file.")
|
|
||||||
.describe("o", "Output file (default STDOUT).")
|
|
||||||
.describe("b", "Beautify output/specify output options.")
|
|
||||||
.describe("m", "Mangle names/pass mangler options.")
|
|
||||||
.describe("r", "Reserved names to exclude from mangling.")
|
|
||||||
.describe("c", "Enable compressor/pass compressor options. \
|
|
||||||
Pass options like -c hoist_vars=false,if_return=false. \
|
|
||||||
Use -c with no argument to use the default compression options.")
|
|
||||||
.describe("d", "Global definitions")
|
|
||||||
.describe("e", "Embed everything in a big function, with a configurable parameter/argument list.")
|
|
||||||
|
|
||||||
.describe("comments", "Preserve copyright comments in the output. \
|
|
||||||
By default this works like Google Closure, keeping JSDoc-style comments that contain \"@license\" or \"@preserve\". \
|
|
||||||
You can optionally pass one of the following arguments to this flag:\n\
|
|
||||||
- \"all\" to keep all comments\n\
|
|
||||||
- a valid JS RegExp like `/foo/`or `/^!/` to keep only matching comments.\n\
|
|
||||||
\
|
|
||||||
Note that currently not *all* comments can be kept when compression is on, \
|
|
||||||
because of dead code removal or cascading statements into sequences.")
|
|
||||||
|
|
||||||
.describe("preamble", "Preamble to prepend to the output. You can use this to insert a \
|
|
||||||
comment, for example for licensing information. This will not be \
|
|
||||||
parsed, but the source map will adjust for its presence.")
|
|
||||||
|
|
||||||
.describe("stats", "Display operations run time on STDERR.")
|
|
||||||
.describe("acorn", "Use Acorn for parsing.")
|
|
||||||
.describe("spidermonkey", "Assume input files are SpiderMonkey AST format (as JSON).")
|
|
||||||
.describe("self", "Build itself (UglifyJS2) as a library (implies --wrap=UglifyJS --export-all)")
|
|
||||||
.describe("wrap", "Embed everything in a big function, making the “exports” and “global” variables available. \
|
|
||||||
You need to pass an argument to this option to specify the name that your module will take when included in, say, a browser.")
|
|
||||||
.describe("export-all", "Only used when --wrap, this tells UglifyJS to add code to automatically export all globals.")
|
|
||||||
.describe("lint", "Display some scope warnings")
|
|
||||||
.describe("v", "Verbose")
|
|
||||||
.describe("V", "Print version number and exit.")
|
|
||||||
.describe("noerr", "Don't throw an error for unknown options in -c, -b or -m.")
|
|
||||||
.describe("bare-returns", "Allow return outside of functions. Useful when minifying CommonJS modules.")
|
|
||||||
.describe("keep-fnames", "Do not mangle/drop function names. Useful for code relying on Function.prototype.name.")
|
|
||||||
.describe("quotes", "Quote style (0 - auto, 1 - single, 2 - double, 3 - original)")
|
|
||||||
.describe("reserved-file", "File containing reserved names")
|
|
||||||
.describe("reserve-domprops", "Make (most?) DOM properties reserved for --mangle-props")
|
|
||||||
.describe("mangle-props", "Mangle property names (0 - disabled, 1 - mangle all properties, 2 - mangle unquoted properies)")
|
|
||||||
.describe("mangle-regex", "Only mangle property names matching the regex")
|
|
||||||
.describe("name-cache", "File to hold mangled names mappings")
|
|
||||||
.describe("pure-funcs", "List of functions that can be safely removed if their return value is not used")
|
|
||||||
.describe("dump-spidermonkey-ast", "Dump SpiderMonkey AST to stdout.")
|
|
||||||
.describe("wrap-iife", "Wrap IIFEs in parenthesis. Note: this disables the negate_iife compression option")
|
|
||||||
|
|
||||||
.alias("p", "prefix")
|
|
||||||
.alias("o", "output")
|
|
||||||
.alias("v", "verbose")
|
|
||||||
.alias("b", "beautify")
|
|
||||||
.alias("m", "mangle")
|
|
||||||
.alias("c", "compress")
|
|
||||||
.alias("d", "define")
|
|
||||||
.alias("r", "reserved")
|
|
||||||
.alias("V", "version")
|
|
||||||
.alias("e", "enclose")
|
|
||||||
.alias("q", "quotes")
|
|
||||||
|
|
||||||
.string("source-map")
|
|
||||||
.string("source-map-root")
|
|
||||||
.string("source-map-url")
|
|
||||||
.string("b")
|
|
||||||
.string("beautify")
|
|
||||||
.string("m")
|
|
||||||
.string("mangle")
|
|
||||||
.string("mangle-props-debug")
|
|
||||||
.string("c")
|
|
||||||
.string("compress")
|
|
||||||
.string("d")
|
|
||||||
.string("define")
|
|
||||||
.string("e")
|
|
||||||
.string("enclose")
|
|
||||||
.string("comments")
|
|
||||||
.string("wrap")
|
|
||||||
.string("p")
|
|
||||||
.string("prefix")
|
|
||||||
.string("name-cache")
|
|
||||||
|
|
||||||
.array("reserved-file")
|
|
||||||
.array("pure-funcs")
|
|
||||||
|
|
||||||
.boolean("expr")
|
|
||||||
.boolean("source-map-inline")
|
|
||||||
.boolean("source-map-include-sources")
|
|
||||||
.boolean("screw-ie8")
|
|
||||||
.boolean("support-ie8")
|
|
||||||
.boolean("export-all")
|
|
||||||
.boolean("self")
|
|
||||||
.boolean("v")
|
|
||||||
.boolean("verbose")
|
|
||||||
.boolean("stats")
|
|
||||||
.boolean("acorn")
|
|
||||||
.boolean("spidermonkey")
|
|
||||||
.boolean("dump-spidermonkey-ast")
|
|
||||||
.boolean("lint")
|
|
||||||
.boolean("V")
|
|
||||||
.boolean("version")
|
|
||||||
.boolean("noerr")
|
|
||||||
.boolean("bare-returns")
|
|
||||||
.boolean("keep-fnames")
|
|
||||||
.boolean("reserve-domprops")
|
|
||||||
.boolean("wrap-iife")
|
|
||||||
|
|
||||||
.wrap(80)
|
|
||||||
|
|
||||||
.argv
|
|
||||||
;
|
|
||||||
|
|
||||||
normalize(ARGS);
|
|
||||||
|
|
||||||
if (ARGS.noerr) {
|
|
||||||
UglifyJS.DefaultsError.croak = function(msg, defs) {
|
|
||||||
print_error("WARN: " + msg);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ARGS.version || ARGS.V) {
|
|
||||||
var json = require("../package.json");
|
|
||||||
print(json.name + ' ' + json.version);
|
|
||||||
process.exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ARGS.ast_help) {
|
|
||||||
var desc = UglifyJS.describe_ast();
|
|
||||||
print(typeof desc == "string" ? desc : JSON.stringify(desc, null, 2));
|
|
||||||
process.exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ARGS.h || ARGS.help) {
|
|
||||||
print(yargs.help());
|
|
||||||
process.exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ARGS.acorn) {
|
|
||||||
acorn = require("acorn");
|
|
||||||
}
|
|
||||||
|
|
||||||
var COMPRESS = getOptions("c", true);
|
|
||||||
var MANGLE = getOptions("m", true);
|
|
||||||
var BEAUTIFY = getOptions("b", true);
|
|
||||||
var RESERVED = null;
|
|
||||||
|
|
||||||
if (ARGS.reserved_file) ARGS.reserved_file.forEach(function(filename){
|
|
||||||
RESERVED = UglifyJS.readReservedFile(filename, RESERVED);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
if (ARGS.reserve_domprops) {
|
var fs = require("fs");
|
||||||
RESERVED = UglifyJS.readDefaultReservedFile(RESERVED);
|
var info = require("../package.json");
|
||||||
}
|
var path = require("path");
|
||||||
|
var program = require("commander");
|
||||||
|
var UglifyJS = require("../tools/node");
|
||||||
|
|
||||||
if (ARGS.d) {
|
var skip_keys = [ "cname", "enclosed", "parent_scope", "scope", "thedef", "uses_eval", "uses_with" ];
|
||||||
if (COMPRESS) COMPRESS.global_defs = getOptions("d");
|
var files = {};
|
||||||
}
|
var options = {
|
||||||
|
compress: false,
|
||||||
if (ARGS.pure_funcs) {
|
mangle: false
|
||||||
if (COMPRESS) COMPRESS.pure_funcs = ARGS.pure_funcs;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ARGS.r) {
|
|
||||||
if (MANGLE) MANGLE.except = ARGS.r.replace(/^\s+|\s+$/g).split(/\s*,+\s*/);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (RESERVED && MANGLE) {
|
|
||||||
if (!MANGLE.except) MANGLE.except = RESERVED.vars;
|
|
||||||
else MANGLE.except = MANGLE.except.concat(RESERVED.vars);
|
|
||||||
}
|
|
||||||
|
|
||||||
function readNameCache(key) {
|
|
||||||
return UglifyJS.readNameCache(ARGS.name_cache, key);
|
|
||||||
}
|
|
||||||
|
|
||||||
function writeNameCache(key, cache) {
|
|
||||||
return UglifyJS.writeNameCache(ARGS.name_cache, key, cache);
|
|
||||||
}
|
|
||||||
|
|
||||||
function extractRegex(str) {
|
|
||||||
if (/^\/.*\/[a-zA-Z]*$/.test(str)) {
|
|
||||||
var regex_pos = str.lastIndexOf("/");
|
|
||||||
return new RegExp(str.substr(1, regex_pos - 1), str.substr(regex_pos + 1));
|
|
||||||
} else {
|
|
||||||
throw new Error("Invalid regular expression: " + str);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ARGS.quotes === true) {
|
|
||||||
ARGS.quotes = 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ARGS.mangle_props === true) {
|
|
||||||
ARGS.mangle_props = 1;
|
|
||||||
} else if (ARGS.mangle_props === "unquoted") {
|
|
||||||
ARGS.mangle_props = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
var OUTPUT_OPTIONS = {
|
|
||||||
beautify : BEAUTIFY ? true : false,
|
|
||||||
max_line_len : 32000,
|
|
||||||
preamble : ARGS.preamble || null,
|
|
||||||
quote_style : ARGS.quotes != null ? ARGS.quotes : 0,
|
|
||||||
};
|
};
|
||||||
|
program.version(info.name + " " + info.version);
|
||||||
if (ARGS.mangle_props == 2) {
|
program.parseArgv = program.parse;
|
||||||
OUTPUT_OPTIONS.keep_quoted_props = true;
|
program.parse = undefined;
|
||||||
if (COMPRESS && !("properties" in COMPRESS))
|
if (process.argv.indexOf("ast") >= 0) program.helpInformation = UglifyJS.describe_ast;
|
||||||
COMPRESS.properties = false;
|
else if (process.argv.indexOf("options") >= 0) program.helpInformation = function() {
|
||||||
|
var text = [];
|
||||||
|
var options = UglifyJS.default_options();
|
||||||
|
for (var option in options) {
|
||||||
|
text.push("--" + (option == "output" ? "beautify" : option == "sourceMap" ? "source-map" : option) + " options:");
|
||||||
|
text.push(format_object(options[option]));
|
||||||
|
text.push("");
|
||||||
|
}
|
||||||
|
return text.join("\n");
|
||||||
|
};
|
||||||
|
program.option("-p, --parse <options>", "Specify parser options.", parse_js());
|
||||||
|
program.option("-c, --compress [options]", "Enable compressor/specify compressor options.", parse_js());
|
||||||
|
program.option("-m, --mangle [options]", "Mangle names/specify mangler options.", parse_js());
|
||||||
|
program.option("--mangle-props [options]", "Mangle properties/specify mangler options.", parse_js());
|
||||||
|
program.option("-b, --beautify [options]", "Beautify output/specify output options.", parse_js());
|
||||||
|
program.option("-o, --output <file>", "Output file (default STDOUT).");
|
||||||
|
program.option("--comments [filter]", "Preserve copyright comments in the output.");
|
||||||
|
program.option("--config-file <file>", "Read minify() options from JSON file.");
|
||||||
|
program.option("-d, --define <expr>[=value]", "Global definitions.", parse_js("define"));
|
||||||
|
program.option("--ecma <version>", "Specify ECMAScript release: 5, 6, 7 or 8.");
|
||||||
|
program.option("--ie8", "Support non-standard Internet Explorer 8.");
|
||||||
|
program.option("--keep-fnames", "Do not mangle/drop function names. Useful for code relying on Function.prototype.name.");
|
||||||
|
program.option("--name-cache <file>", "File to hold mangled name mappings.");
|
||||||
|
program.option("--self", "Build UglifyJS as a library (implies --wrap UglifyJS)");
|
||||||
|
program.option("--source-map [options]", "Enable source map/specify source map options.", parse_source_map());
|
||||||
|
program.option("--timings", "Display operations run time on STDERR.")
|
||||||
|
program.option("--toplevel", "Compress and/or mangle variables in toplevel scope.");
|
||||||
|
program.option("--verbose", "Print diagnostic messages.");
|
||||||
|
program.option("--warn", "Print warning messages.");
|
||||||
|
program.option("--wrap <name>", "Embed everything as a function with “exports” corresponding to “name” globally.");
|
||||||
|
program.arguments("[files...]").parseArgv(process.argv);
|
||||||
|
if (program.configFile) {
|
||||||
|
options = JSON.parse(read_file(program.configFile));
|
||||||
}
|
}
|
||||||
|
if (!program.output && program.sourceMap && program.sourceMap.url != "inline") {
|
||||||
if (ARGS.support_ie8 === true && ARGS.screw_ie8 !== true) {
|
fatal("ERROR: cannot write source map to STDOUT");
|
||||||
screw_ie8 = false;
|
|
||||||
}
|
}
|
||||||
|
[
|
||||||
if (COMPRESS) COMPRESS.screw_ie8 = screw_ie8;
|
"compress",
|
||||||
if (MANGLE) MANGLE.screw_ie8 = screw_ie8;
|
"ie8",
|
||||||
OUTPUT_OPTIONS.screw_ie8 = screw_ie8;
|
"mangle",
|
||||||
|
"sourceMap",
|
||||||
if (ARGS.keep_fnames) {
|
"toplevel",
|
||||||
if (COMPRESS) COMPRESS.keep_fnames = true;
|
"wrap"
|
||||||
if (MANGLE) MANGLE.keep_fnames = true;
|
].forEach(function(name) {
|
||||||
|
if (name in program) {
|
||||||
|
options[name] = program[name];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if ("ecma" in program) {
|
||||||
|
if (program.ecma != (program.ecma | 0)) fatal("ERROR: ecma must be an integer");
|
||||||
|
options.ecma = program.ecma | 0;
|
||||||
}
|
}
|
||||||
|
if (program.beautify) {
|
||||||
if (ARGS.wrap_iife) {
|
options.output = typeof program.beautify == "object" ? program.beautify : {};
|
||||||
if (COMPRESS) COMPRESS.negate_iife = false;
|
if (!("beautify" in options.output)) {
|
||||||
OUTPUT_OPTIONS.wrap_iife = true;
|
options.output.beautify = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
if (program.comments) {
|
||||||
if (BEAUTIFY)
|
if (typeof options.output != "object") options.output = {};
|
||||||
UglifyJS.merge(OUTPUT_OPTIONS, BEAUTIFY);
|
options.output.comments = typeof program.comments == "string" ? program.comments : "some";
|
||||||
|
|
||||||
if (ARGS.comments === "") {
|
|
||||||
OUTPUT_OPTIONS.comments = "some";
|
|
||||||
} else {
|
|
||||||
OUTPUT_OPTIONS.comments = ARGS.comments;
|
|
||||||
}
|
}
|
||||||
|
if (program.define) {
|
||||||
var files = ARGS._.slice();
|
if (typeof options.compress != "object") options.compress = {};
|
||||||
|
if (typeof options.compress.global_defs != "object") options.compress.global_defs = {};
|
||||||
if (process.platform === "win32")
|
for (var expr in program.define) {
|
||||||
files = UglifyJS.simple_glob(files);
|
options.compress.global_defs[expr] = program.define[expr];
|
||||||
|
}
|
||||||
if (ARGS.self) {
|
}
|
||||||
if (files.length > 0) {
|
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("ERROR: inline source map only works with built-in parser");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var convert_path = function(name) {
|
||||||
|
return name;
|
||||||
|
};
|
||||||
|
if (typeof program.sourceMap == "object" && "base" in program.sourceMap) {
|
||||||
|
convert_path = function() {
|
||||||
|
var base = program.sourceMap.base;
|
||||||
|
delete options.sourceMap.base;
|
||||||
|
return function(name) {
|
||||||
|
return path.relative(base, name);
|
||||||
|
};
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
if (program.verbose) {
|
||||||
|
options.warnings = "verbose";
|
||||||
|
} else if (program.warn) {
|
||||||
|
options.warnings = true;
|
||||||
|
}
|
||||||
|
if (program.self) {
|
||||||
|
if (program.args.length) {
|
||||||
print_error("WARN: Ignoring input files since --self was passed");
|
print_error("WARN: Ignoring input files since --self was passed");
|
||||||
}
|
}
|
||||||
files = UglifyJS.FILES;
|
if (!options.wrap) options.wrap = "UglifyJS";
|
||||||
if (!ARGS.wrap) ARGS.wrap = "UglifyJS";
|
simple_glob(UglifyJS.FILES).forEach(function(name) {
|
||||||
|
files[convert_path(name)] = read_file(name);
|
||||||
|
});
|
||||||
|
run();
|
||||||
|
} else if (program.args.length) {
|
||||||
|
simple_glob(program.args).forEach(function(name) {
|
||||||
|
files[convert_path(name)] = read_file(name);
|
||||||
|
});
|
||||||
|
run();
|
||||||
|
} else {
|
||||||
|
var chunks = [];
|
||||||
|
process.stdin.setEncoding("utf8");
|
||||||
|
process.stdin.on("data", function(chunk) {
|
||||||
|
chunks.push(chunk);
|
||||||
|
}).on("end", function() {
|
||||||
|
files = [ chunks.join("") ];
|
||||||
|
run();
|
||||||
|
});
|
||||||
|
process.stdin.resume();
|
||||||
}
|
}
|
||||||
|
|
||||||
var ORIG_MAP = ARGS.in_source_map;
|
function convert_ast(fn) {
|
||||||
|
return UglifyJS.AST_Node.from_mozilla_ast(Object.keys(files).reduce(fn, null));
|
||||||
if (ORIG_MAP && ORIG_MAP != "inline") {
|
|
||||||
ORIG_MAP = JSON.parse(fs.readFileSync(ORIG_MAP));
|
|
||||||
if (files.length == 0) {
|
|
||||||
print_error("INFO: Using file from the input source map: " + ORIG_MAP.file);
|
|
||||||
files = [ ORIG_MAP.file ];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (files.length == 0) {
|
function run() {
|
||||||
files = [ "-" ];
|
UglifyJS.AST_Node.warn_function = function(msg) {
|
||||||
}
|
print_error("WARN: " + msg);
|
||||||
|
};
|
||||||
if (ORIG_MAP == "inline") {
|
if (program.timings) options.timings = true;
|
||||||
if (files.length > 1) {
|
try {
|
||||||
print_error("ERROR: Inline source map only works with singular input");
|
if (program.parse) {
|
||||||
process.exit(1);
|
if (program.parse.acorn) {
|
||||||
}
|
files = convert_ast(function(toplevel, name) {
|
||||||
if (ARGS.acorn || ARGS.spidermonkey) {
|
return require("acorn").parse(files[name], {
|
||||||
print_error("ERROR: Inline source map only works with built-in parser");
|
locations: true,
|
||||||
process.exit(1);
|
program: toplevel,
|
||||||
}
|
sourceFile: name
|
||||||
}
|
});
|
||||||
|
});
|
||||||
if (files.indexOf("-") >= 0 && ARGS.source_map) {
|
} else if (program.parse.spidermonkey) {
|
||||||
print_error("ERROR: Source map doesn't work with input from STDIN");
|
files = convert_ast(function(toplevel, name) {
|
||||||
process.exit(1);
|
var obj = JSON.parse(files[name]);
|
||||||
}
|
if (!toplevel) return obj;
|
||||||
|
toplevel.body = toplevel.body.concat(obj.body);
|
||||||
if (files.filter(function(el){ return el == "-" }).length > 1) {
|
return toplevel;
|
||||||
print_error("ERROR: Can read a single file from STDIN (two or more dashes specified)");
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
var STATS = {};
|
|
||||||
var TOPLEVEL = null;
|
|
||||||
var P_RELATIVE = ARGS.p && ARGS.p == "relative";
|
|
||||||
var SOURCES_CONTENT = {};
|
|
||||||
var index = 0;
|
|
||||||
|
|
||||||
!function cb() {
|
|
||||||
if (index == files.length) return done();
|
|
||||||
var file = files[index++];
|
|
||||||
read_whole_file(file, function (err, code) {
|
|
||||||
if (err) {
|
|
||||||
print_error("ERROR: can't read file: " + file);
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
if (ORIG_MAP == "inline") {
|
|
||||||
ORIG_MAP = read_source_map(code);
|
|
||||||
}
|
|
||||||
if (ARGS.p != null) {
|
|
||||||
if (P_RELATIVE) {
|
|
||||||
file = path.relative(path.dirname(ARGS.source_map), file).replace(/\\/g, '/');
|
|
||||||
} else {
|
|
||||||
var p = parseInt(ARGS.p, 10);
|
|
||||||
if (!isNaN(p)) {
|
|
||||||
file = file.replace(/^\/+/, "").split(/\/+/).slice(ARGS.p).join("/");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SOURCES_CONTENT[file] = code;
|
|
||||||
time_it("parse", function(){
|
|
||||||
if (ARGS.spidermonkey) {
|
|
||||||
var program = JSON.parse(code);
|
|
||||||
if (!TOPLEVEL) TOPLEVEL = program;
|
|
||||||
else TOPLEVEL.body = TOPLEVEL.body.concat(program.body);
|
|
||||||
}
|
|
||||||
else if (ARGS.acorn) {
|
|
||||||
TOPLEVEL = acorn.parse(code, {
|
|
||||||
locations : true,
|
|
||||||
sourceFile : file,
|
|
||||||
program : TOPLEVEL
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else {
|
}
|
||||||
try {
|
} catch (ex) {
|
||||||
TOPLEVEL = UglifyJS.parse(code, {
|
fatal(ex);
|
||||||
filename : file,
|
}
|
||||||
toplevel : TOPLEVEL,
|
var result = UglifyJS.minify(files, options);
|
||||||
expression : ARGS.expr,
|
if (result.error) {
|
||||||
bare_returns : ARGS.bare_returns,
|
var ex = result.error;
|
||||||
});
|
if (ex.name == "SyntaxError") {
|
||||||
} catch(ex) {
|
print_error("Parse error at " + ex.filename + ":" + ex.line + "," + ex.col);
|
||||||
if (ex instanceof UglifyJS.JS_Parse_Error) {
|
var col = ex.col;
|
||||||
print_error("Parse error at " + file + ":" + ex.line + "," + ex.col);
|
var lines = files[ex.filename].split(/\r?\n/);
|
||||||
var col = ex.col;
|
var line = lines[ex.line - 1];
|
||||||
var line = code.split(/\r?\n/)[ex.line - (col ? 1 : 2)];
|
if (!line && !col) {
|
||||||
if (line) {
|
line = lines[ex.line - 2];
|
||||||
if (col > 40) {
|
col = line.length;
|
||||||
line = line.slice(col - 40);
|
}
|
||||||
col = 40;
|
if (line) {
|
||||||
}
|
var limit = 70;
|
||||||
if (col) {
|
if (col > limit) {
|
||||||
print_error(line.slice(0, 80));
|
line = line.slice(col - limit);
|
||||||
print_error(line.slice(0, col).replace(/\S/g, " ") + "^");
|
col = limit;
|
||||||
} else {
|
|
||||||
print_error(line.slice(-40));
|
|
||||||
print_error(line.slice(-40).replace(/\S/g, " ") + "^");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
print_error(ex.stack);
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
throw ex;
|
|
||||||
}
|
}
|
||||||
};
|
print_error(line.slice(0, 80));
|
||||||
});
|
print_error(line.slice(0, col).replace(/\S/g, " ") + "^");
|
||||||
cb();
|
}
|
||||||
});
|
}
|
||||||
}();
|
if (ex.defs) {
|
||||||
|
|
||||||
function done() {
|
|
||||||
var OUTPUT_FILE = ARGS.o;
|
|
||||||
|
|
||||||
var SOURCE_MAP = (ARGS.source_map || ARGS.source_map_inline) ? UglifyJS.SourceMap({
|
|
||||||
file: P_RELATIVE ? path.relative(path.dirname(ARGS.source_map), OUTPUT_FILE) : OUTPUT_FILE,
|
|
||||||
root: ARGS.source_map_root || ORIG_MAP && ORIG_MAP.sourceRoot,
|
|
||||||
orig: ORIG_MAP,
|
|
||||||
}) : null;
|
|
||||||
|
|
||||||
OUTPUT_OPTIONS.source_map = SOURCE_MAP;
|
|
||||||
|
|
||||||
try {
|
|
||||||
var output = UglifyJS.OutputStream(OUTPUT_OPTIONS);
|
|
||||||
var compressor = COMPRESS && UglifyJS.Compressor(COMPRESS);
|
|
||||||
} catch(ex) {
|
|
||||||
if (ex instanceof UglifyJS.DefaultsError) {
|
|
||||||
print_error(ex.message);
|
|
||||||
print_error("Supported options:");
|
print_error("Supported options:");
|
||||||
print_error(sys.inspect(ex.defs));
|
print_error(format_object(ex.defs));
|
||||||
process.exit(1);
|
|
||||||
}
|
}
|
||||||
}
|
fatal(ex);
|
||||||
|
} else if (program.output == "ast") {
|
||||||
if (ARGS.acorn || ARGS.spidermonkey) time_it("convert_ast", function(){
|
print(JSON.stringify(result.ast, function(key, value) {
|
||||||
TOPLEVEL = UglifyJS.AST_Node.from_mozilla_ast(TOPLEVEL);
|
if (skip_key(key)) return;
|
||||||
});
|
if (value instanceof UglifyJS.AST_Token) return;
|
||||||
|
if (value instanceof UglifyJS.Dictionary) return;
|
||||||
if (ARGS.wrap != null) {
|
if (value instanceof UglifyJS.AST_Node) {
|
||||||
TOPLEVEL = TOPLEVEL.wrap_commonjs(ARGS.wrap, ARGS.export_all);
|
var result = {
|
||||||
}
|
_class: "AST_" + value.TYPE
|
||||||
|
};
|
||||||
if (ARGS.enclose != null) {
|
value.CTOR.PROPS.forEach(function(prop) {
|
||||||
var arg_parameter_list = ARGS.enclose;
|
result[prop] = value[prop];
|
||||||
if (arg_parameter_list === true) {
|
});
|
||||||
arg_parameter_list = [];
|
return result;
|
||||||
}
|
|
||||||
else if (!(arg_parameter_list instanceof Array)) {
|
|
||||||
arg_parameter_list = [arg_parameter_list];
|
|
||||||
}
|
|
||||||
TOPLEVEL = TOPLEVEL.wrap_enclose(arg_parameter_list);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ARGS.mangle_props || ARGS.name_cache) (function(){
|
|
||||||
var reserved = RESERVED ? RESERVED.props : null;
|
|
||||||
var cache = readNameCache("props");
|
|
||||||
var regex;
|
|
||||||
|
|
||||||
try {
|
|
||||||
regex = ARGS.mangle_regex ? extractRegex(ARGS.mangle_regex) : null;
|
|
||||||
} catch (e) {
|
|
||||||
print_error("ERROR: Invalid --mangle-regex: " + e.message);
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
TOPLEVEL = UglifyJS.mangle_properties(TOPLEVEL, {
|
|
||||||
reserved : reserved,
|
|
||||||
cache : cache,
|
|
||||||
only_cache : !ARGS.mangle_props,
|
|
||||||
regex : regex,
|
|
||||||
ignore_quoted : ARGS.mangle_props == 2,
|
|
||||||
debug : typeof ARGS.mangle_props_debug === "undefined" ? false : ARGS.mangle_props_debug
|
|
||||||
});
|
|
||||||
writeNameCache("props", cache);
|
|
||||||
})();
|
|
||||||
|
|
||||||
var SCOPE_IS_NEEDED = COMPRESS || MANGLE || ARGS.lint
|
|
||||||
var TL_CACHE = readNameCache("vars");
|
|
||||||
if (MANGLE) MANGLE.cache = TL_CACHE;
|
|
||||||
|
|
||||||
if (SCOPE_IS_NEEDED) {
|
|
||||||
time_it("scope", function(){
|
|
||||||
TOPLEVEL.figure_out_scope(MANGLE || { screw_ie8: screw_ie8, cache: TL_CACHE });
|
|
||||||
if (ARGS.lint) {
|
|
||||||
TOPLEVEL.scope_warnings();
|
|
||||||
}
|
}
|
||||||
});
|
return value;
|
||||||
}
|
}, 2));
|
||||||
|
} else if (program.output == "spidermonkey") {
|
||||||
if (COMPRESS) {
|
print(JSON.stringify(UglifyJS.minify(result.code, {
|
||||||
time_it("squeeze", function(){
|
compress: false,
|
||||||
TOPLEVEL = compressor.compress(TOPLEVEL);
|
mangle: false,
|
||||||
});
|
output: {
|
||||||
}
|
ast: true,
|
||||||
|
code: false
|
||||||
if (SCOPE_IS_NEEDED) {
|
|
||||||
time_it("scope", function(){
|
|
||||||
TOPLEVEL.figure_out_scope(MANGLE || { screw_ie8: screw_ie8, cache: TL_CACHE });
|
|
||||||
if (MANGLE && !TL_CACHE) {
|
|
||||||
TOPLEVEL.compute_char_frequency(MANGLE);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (MANGLE) time_it("mangle", function(){
|
|
||||||
TOPLEVEL.mangle_names(MANGLE);
|
|
||||||
});
|
|
||||||
|
|
||||||
writeNameCache("vars", TL_CACHE);
|
|
||||||
|
|
||||||
if (ARGS.source_map_include_sources) {
|
|
||||||
for (var file in SOURCES_CONTENT) {
|
|
||||||
if (SOURCES_CONTENT.hasOwnProperty(file)) {
|
|
||||||
SOURCE_MAP.get().setSourceContent(file, SOURCES_CONTENT[file]);
|
|
||||||
}
|
}
|
||||||
|
}).ast.to_mozilla_ast(), null, 2));
|
||||||
|
} else if (program.output) {
|
||||||
|
fs.writeFileSync(program.output, result.code);
|
||||||
|
if (result.map) {
|
||||||
|
fs.writeFileSync(program.output + ".map", result.map);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (ARGS.dump_spidermonkey_ast) {
|
|
||||||
print(JSON.stringify(TOPLEVEL.to_mozilla_ast(), null, 2));
|
|
||||||
} else {
|
} else {
|
||||||
time_it("generate", function(){
|
print(result.code);
|
||||||
TOPLEVEL.print(output);
|
}
|
||||||
});
|
if (program.nameCache) {
|
||||||
|
fs.writeFileSync(program.nameCache, JSON.stringify(options.nameCache));
|
||||||
|
}
|
||||||
|
if (result.timings) for (var phase in result.timings) {
|
||||||
|
print_error("- " + phase + ": " + result.timings[phase].toFixed(3) + "s");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
output = output.get();
|
function fatal(message) {
|
||||||
|
if (message instanceof Error) message = message.stack.replace(/^\S*?Error:/, "ERROR:")
|
||||||
|
print_error(message);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
if (SOURCE_MAP) {
|
// A file glob function that only supports "*" and "?" wildcards in the basename.
|
||||||
if (ARGS.source_map_inline) {
|
// Example: "foo/bar/*baz??.*.js"
|
||||||
var base64_string = new Buffer(SOURCE_MAP.toString()).toString('base64');
|
// Argument `glob` may be a string or an array of strings.
|
||||||
output += "\n//# sourceMappingURL=data:application/json;charset=utf-8;base64," + base64_string;
|
// Returns an array of strings. Garbage in, garbage out.
|
||||||
} else {
|
function simple_glob(glob) {
|
||||||
fs.writeFileSync(ARGS.source_map, SOURCE_MAP, "utf8");
|
if (Array.isArray(glob)) {
|
||||||
var source_map_url = ARGS.source_map_url || (
|
return [].concat.apply([], glob.map(simple_glob));
|
||||||
P_RELATIVE
|
}
|
||||||
? path.relative(path.dirname(OUTPUT_FILE), ARGS.source_map)
|
if (glob.match(/\*|\?/)) {
|
||||||
: ARGS.source_map
|
var dir = path.dirname(glob);
|
||||||
);
|
try {
|
||||||
output += "\n//# sourceMappingURL=" + source_map_url;
|
var entries = fs.readdirSync(dir);
|
||||||
}
|
} catch (ex) {}
|
||||||
}
|
if (entries) {
|
||||||
|
var pattern = "^" + path.basename(glob)
|
||||||
if (OUTPUT_FILE) {
|
.replace(/[.+^$[\]\\(){}]/g, "\\$&")
|
||||||
fs.writeFileSync(OUTPUT_FILE, output, "utf8");
|
.replace(/\*/g, "[^/\\\\]*")
|
||||||
} else {
|
.replace(/\?/g, "[^/\\\\]") + "$";
|
||||||
print(output);
|
var mod = process.platform === "win32" ? "i" : "";
|
||||||
|
var rx = new RegExp(pattern, mod);
|
||||||
|
var results = entries.filter(function(name) {
|
||||||
|
return rx.test(name);
|
||||||
|
}).map(function(name) {
|
||||||
|
return path.join(dir, name);
|
||||||
|
});
|
||||||
|
if (results.length) return results;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return [ glob ];
|
||||||
|
}
|
||||||
|
|
||||||
if (ARGS.stats) {
|
function read_file(path, default_value) {
|
||||||
print_error(UglifyJS.string_template("Timing information (compressed {count} files):", {
|
try {
|
||||||
count: files.length
|
return fs.readFileSync(path, "utf8");
|
||||||
}));
|
} catch (ex) {
|
||||||
for (var i in STATS) if (STATS.hasOwnProperty(i)) {
|
if (ex.code == "ENOENT" && default_value != null) return default_value;
|
||||||
print_error(UglifyJS.string_template("- {name}: {time}s", {
|
fatal(ex);
|
||||||
name: i,
|
}
|
||||||
time: (STATS[i] / 1000).toFixed(3)
|
}
|
||||||
|
|
||||||
|
function parse_js(flag) {
|
||||||
|
return function(value, options) {
|
||||||
|
options = options || {};
|
||||||
|
try {
|
||||||
|
UglifyJS.minify(value, {
|
||||||
|
parse: {
|
||||||
|
expression: true
|
||||||
|
},
|
||||||
|
compress: false,
|
||||||
|
mangle: false,
|
||||||
|
output: {
|
||||||
|
ast: true,
|
||||||
|
code: false
|
||||||
|
}
|
||||||
|
}).ast.walk(new UglifyJS.TreeWalker(function(node) {
|
||||||
|
if (node instanceof UglifyJS.AST_Assign) {
|
||||||
|
var name = node.left.print_to_string();
|
||||||
|
var value = node.right;
|
||||||
|
if (flag) {
|
||||||
|
options[name] = value;
|
||||||
|
} else if (value instanceof UglifyJS.AST_Array) {
|
||||||
|
options[name] = value.elements.map(to_string);
|
||||||
|
} else {
|
||||||
|
options[name] = to_string(value);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
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.getValue() : value.print_to_string({
|
||||||
|
quote_keys: true
|
||||||
|
});
|
||||||
|
}
|
||||||
}));
|
}));
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -----[ functions ]----- */
|
|
||||||
|
|
||||||
function normalize(o) {
|
|
||||||
for (var i in o) if (o.hasOwnProperty(i) && /-/.test(i)) {
|
|
||||||
o[i.replace(/-/g, "_")] = o[i];
|
|
||||||
delete o[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function getOptions(flag, constants) {
|
|
||||||
var x = ARGS[flag];
|
|
||||||
if (x == null || x === false) return null;
|
|
||||||
var ret = {};
|
|
||||||
if (x !== "") {
|
|
||||||
if (Array.isArray(x)) x = x.map(function (v) { return "(" + v + ")"; }).join(", ");
|
|
||||||
|
|
||||||
var ast;
|
|
||||||
try {
|
|
||||||
ast = UglifyJS.parse(x, { expression: true });
|
|
||||||
} catch(ex) {
|
} catch(ex) {
|
||||||
if (ex instanceof UglifyJS.JS_Parse_Error) {
|
if (flag) {
|
||||||
print_error("Error parsing arguments for flag `" + flag + "': " + x);
|
fatal("Error parsing arguments for '" + flag + "': " + value);
|
||||||
process.exit(1);
|
} else {
|
||||||
|
options[value] = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ast.walk(new UglifyJS.TreeWalker(function(node){
|
return options;
|
||||||
if (node instanceof UglifyJS.AST_Seq) return; // descend
|
|
||||||
if (node instanceof UglifyJS.AST_Assign) {
|
|
||||||
var name = node.left.print_to_string().replace(/-/g, "_");
|
|
||||||
var value = node.right;
|
|
||||||
if (constants)
|
|
||||||
value = new Function("return (" + value.print_to_string() + ")")();
|
|
||||||
ret[name] = value;
|
|
||||||
return true; // no descend
|
|
||||||
}
|
|
||||||
if (node instanceof UglifyJS.AST_Symbol || node instanceof UglifyJS.AST_Binary) {
|
|
||||||
var name = node.print_to_string().replace(/-/g, "_");
|
|
||||||
ret[name] = true;
|
|
||||||
return true; // no descend
|
|
||||||
}
|
|
||||||
print_error(node.TYPE)
|
|
||||||
print_error("Error parsing arguments for flag `" + flag + "': " + x);
|
|
||||||
process.exit(1);
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
function read_whole_file(filename, cb) {
|
|
||||||
if (filename == "-") {
|
|
||||||
var chunks = [];
|
|
||||||
process.stdin.setEncoding('utf-8');
|
|
||||||
process.stdin.on('data', function (chunk) {
|
|
||||||
chunks.push(chunk);
|
|
||||||
}).on('end', function () {
|
|
||||||
cb(null, chunks.join(""));
|
|
||||||
});
|
|
||||||
process.openStdin();
|
|
||||||
} else {
|
|
||||||
fs.readFile(filename, "utf-8", cb);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function read_source_map(code) {
|
function parse_source_map() {
|
||||||
var match = /\n\/\/# sourceMappingURL=data:application\/json(;.*?)?;base64,(.*)/.exec(code);
|
var parse = parse_js();
|
||||||
if (!match) {
|
return function(value, options) {
|
||||||
print_error("WARN: inline source map not found");
|
var hasContent = options && "content" in options;
|
||||||
return null;
|
var settings = parse(value, options);
|
||||||
|
if (!hasContent && settings.content && settings.content != "inline") {
|
||||||
|
print_error("INFO: Using input source map: " + settings.content);
|
||||||
|
settings.content = read_file(settings.content, settings.content);
|
||||||
|
}
|
||||||
|
return settings;
|
||||||
}
|
}
|
||||||
return JSON.parse(new Buffer(match[2], "base64"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function time_it(name, cont) {
|
function skip_key(key) {
|
||||||
var t1 = new Date().getTime();
|
return skip_keys.indexOf(key) >= 0;
|
||||||
var ret = cont();
|
}
|
||||||
if (ARGS.stats) {
|
|
||||||
var spent = new Date().getTime() - t1;
|
function format_object(obj) {
|
||||||
if (STATS[name]) STATS[name] += spent;
|
var lines = [];
|
||||||
else STATS[name] = spent;
|
var padding = "";
|
||||||
}
|
Object.keys(obj).map(function(name) {
|
||||||
return ret;
|
if (padding.length < name.length) padding = Array(name.length + 1).join(" ");
|
||||||
|
return [ name, JSON.stringify(obj[name]) ];
|
||||||
|
}).forEach(function(tokens) {
|
||||||
|
lines.push(" " + tokens[0] + padding.slice(tokens[0].length - 2) + tokens[1]);
|
||||||
|
});
|
||||||
|
return lines.join("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
function print_error(msg) {
|
function print_error(msg) {
|
||||||
console.error("%s", msg);
|
process.stderr.write(msg);
|
||||||
|
process.stderr.write("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
function print(txt) {
|
function print(txt) {
|
||||||
console.log("%s", txt);
|
process.stdout.write(txt);
|
||||||
|
process.stdout.write("\n");
|
||||||
}
|
}
|
||||||
|
|||||||
327
lib/ast.js
327
lib/ast.js
@@ -134,11 +134,10 @@ var AST_Debugger = DEFNODE("Debugger", null, {
|
|||||||
$documentation: "Represents a debugger statement",
|
$documentation: "Represents a debugger statement",
|
||||||
}, AST_Statement);
|
}, AST_Statement);
|
||||||
|
|
||||||
var AST_Directive = DEFNODE("Directive", "value scope quote", {
|
var AST_Directive = DEFNODE("Directive", "value quote", {
|
||||||
$documentation: "Represents a directive, like \"use strict\";",
|
$documentation: "Represents a directive, like \"use strict\";",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
value: "[string] The value of this directive as a plain string (it's not an AST_String!)",
|
value: "[string] The value of this directive as a plain string (it's not an AST_String!)",
|
||||||
scope: "[AST_Scope/S] The scope that this directive affects",
|
|
||||||
quote: "[string] the original quote character"
|
quote: "[string] the original quote character"
|
||||||
},
|
},
|
||||||
}, AST_Statement);
|
}, AST_Statement);
|
||||||
@@ -182,21 +181,13 @@ var AST_BlockStatement = DEFNODE("BlockStatement", null, {
|
|||||||
}, AST_Block);
|
}, AST_Block);
|
||||||
|
|
||||||
var AST_EmptyStatement = DEFNODE("EmptyStatement", null, {
|
var AST_EmptyStatement = DEFNODE("EmptyStatement", null, {
|
||||||
$documentation: "The empty statement (empty block or simply a semicolon)",
|
$documentation: "The empty statement (empty block or simply a semicolon)"
|
||||||
_walk: function(visitor) {
|
|
||||||
return visitor._visit(this);
|
|
||||||
}
|
|
||||||
}, AST_Statement);
|
}, AST_Statement);
|
||||||
|
|
||||||
var AST_StatementWithBody = DEFNODE("StatementWithBody", "body", {
|
var AST_StatementWithBody = DEFNODE("StatementWithBody", "body", {
|
||||||
$documentation: "Base class for all statements that contain one nested body: `For`, `ForIn`, `Do`, `While`, `With`",
|
$documentation: "Base class for all statements that contain one nested body: `For`, `ForIn`, `Do`, `While`, `With`",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
body: "[AST_Statement] the body; this should always be present, even if it's an AST_EmptyStatement"
|
body: "[AST_Statement] the body; this should always be present, even if it's an AST_EmptyStatement"
|
||||||
},
|
|
||||||
_walk: function(visitor) {
|
|
||||||
return visitor._visit(this, function(){
|
|
||||||
this.body._walk(visitor);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}, AST_Statement);
|
}, AST_Statement);
|
||||||
|
|
||||||
@@ -214,12 +205,13 @@ var AST_LabeledStatement = DEFNODE("LabeledStatement", "label", {
|
|||||||
clone: function(deep) {
|
clone: function(deep) {
|
||||||
var node = this._clone(deep);
|
var node = this._clone(deep);
|
||||||
if (deep) {
|
if (deep) {
|
||||||
var refs = node.label.references;
|
var label = node.label;
|
||||||
var label = this.label;
|
var def = this.label;
|
||||||
node.walk(new TreeWalker(function(node) {
|
node.walk(new TreeWalker(function(node) {
|
||||||
if (node instanceof AST_LoopControl
|
if (node instanceof AST_LoopControl
|
||||||
&& node.label && node.label.thedef === label) {
|
&& node.label && node.label.thedef === def) {
|
||||||
refs.push(node);
|
node.label.thedef = label;
|
||||||
|
label.references.push(node);
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
@@ -310,10 +302,9 @@ var AST_With = DEFNODE("With", "expression", {
|
|||||||
|
|
||||||
/* -----[ scope and functions ]----- */
|
/* -----[ scope and functions ]----- */
|
||||||
|
|
||||||
var AST_Scope = DEFNODE("Scope", "directives variables functions uses_with uses_eval parent_scope enclosed cname", {
|
var AST_Scope = DEFNODE("Scope", "variables functions uses_with uses_eval parent_scope enclosed cname", {
|
||||||
$documentation: "Base class for all statements introducing a lexical scope",
|
$documentation: "Base class for all statements introducing a lexical scope",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
directives: "[string*/S] an array of directives declared in this scope",
|
|
||||||
variables: "[Object/S] a map of name -> SymbolDef for all variables/functions defined in this scope",
|
variables: "[Object/S] a map of name -> SymbolDef for all variables/functions defined in this scope",
|
||||||
functions: "[Object/S] like `variables`, but only lists function declarations",
|
functions: "[Object/S] like `variables`, but only lists function declarations",
|
||||||
uses_with: "[boolean/S] tells whether this scope uses the `with` statement",
|
uses_with: "[boolean/S] tells whether this scope uses the `with` statement",
|
||||||
@@ -336,62 +327,13 @@ var AST_Toplevel = DEFNODE("Toplevel", "globals", {
|
|||||||
$propdoc: {
|
$propdoc: {
|
||||||
globals: "[Object/S] a map of name -> SymbolDef for all undeclared names",
|
globals: "[Object/S] a map of name -> SymbolDef for all undeclared names",
|
||||||
},
|
},
|
||||||
wrap_enclose: function(arg_parameter_pairs) {
|
wrap_commonjs: function(name) {
|
||||||
var self = this;
|
var body = this.body;
|
||||||
var args = [];
|
var wrapped_tl = "(function(exports){'$ORIG';})(typeof " + name + "=='undefined'?(" + name + "={}):" + name + ");";
|
||||||
var parameters = [];
|
|
||||||
|
|
||||||
arg_parameter_pairs.forEach(function(pair) {
|
|
||||||
var splitAt = pair.lastIndexOf(":");
|
|
||||||
|
|
||||||
args.push(pair.substr(0, splitAt));
|
|
||||||
parameters.push(pair.substr(splitAt + 1));
|
|
||||||
});
|
|
||||||
|
|
||||||
var wrapped_tl = "(function(" + parameters.join(",") + "){ '$ORIG'; })(" + args.join(",") + ")";
|
|
||||||
wrapped_tl = parse(wrapped_tl);
|
wrapped_tl = parse(wrapped_tl);
|
||||||
wrapped_tl = wrapped_tl.transform(new TreeTransformer(function before(node){
|
wrapped_tl = wrapped_tl.transform(new TreeTransformer(function before(node){
|
||||||
if (node instanceof AST_Directive && node.value == "$ORIG") {
|
if (node instanceof AST_Directive && node.value == "$ORIG") {
|
||||||
return MAP.splice(self.body);
|
return MAP.splice(body);
|
||||||
}
|
|
||||||
}));
|
|
||||||
return wrapped_tl;
|
|
||||||
},
|
|
||||||
wrap_commonjs: function(name, export_all) {
|
|
||||||
var self = this;
|
|
||||||
var to_export = [];
|
|
||||||
if (export_all) {
|
|
||||||
self.figure_out_scope();
|
|
||||||
self.walk(new TreeWalker(function(node){
|
|
||||||
if (node instanceof AST_SymbolDeclaration && node.definition().global) {
|
|
||||||
if (!find_if(function(n){ return n.name == node.name }, to_export))
|
|
||||||
to_export.push(node);
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
var wrapped_tl = "(function(exports, global){ '$ORIG'; '$EXPORTS'; global['" + name + "'] = exports; }({}, (function(){return this}())))";
|
|
||||||
wrapped_tl = parse(wrapped_tl);
|
|
||||||
wrapped_tl = wrapped_tl.transform(new TreeTransformer(function before(node){
|
|
||||||
if (node instanceof AST_Directive) {
|
|
||||||
switch (node.value) {
|
|
||||||
case "$ORIG":
|
|
||||||
return MAP.splice(self.body);
|
|
||||||
case "$EXPORTS":
|
|
||||||
var body = [];
|
|
||||||
to_export.forEach(function(sym){
|
|
||||||
body.push(new AST_SimpleStatement({
|
|
||||||
body: new AST_Assign({
|
|
||||||
left: new AST_Sub({
|
|
||||||
expression: new AST_SymbolRef({ name: "exports" }),
|
|
||||||
property: new AST_String({ value: sym.name }),
|
|
||||||
}),
|
|
||||||
operator: "=",
|
|
||||||
right: new AST_SymbolRef(sym),
|
|
||||||
}),
|
|
||||||
}));
|
|
||||||
});
|
|
||||||
return MAP.splice(body);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
return wrapped_tl;
|
return wrapped_tl;
|
||||||
@@ -401,7 +343,7 @@ var AST_Toplevel = DEFNODE("Toplevel", "globals", {
|
|||||||
var AST_Expansion = DEFNODE("Expansion", "expression", {
|
var AST_Expansion = DEFNODE("Expansion", "expression", {
|
||||||
$documentation: "An expandible argument, such as ...rest, a splat, such as [1,2,...all], or an expansion in a variable declaration, such as var [first, ...rest] = list",
|
$documentation: "An expandible argument, such as ...rest, a splat, such as [1,2,...all], or an expansion in a variable declaration, such as var [first, ...rest] = list",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
expression: "AST_Symbol the thing to be expanded"
|
expression: "[AST_Node] the thing to be expanded"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
var self = this;
|
var self = this;
|
||||||
@@ -411,82 +353,14 @@ var AST_Expansion = DEFNODE("Expansion", "expression", {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var AST_ArrowParametersOrSeq = DEFNODE("ArrowParametersOrSeq", "expressions", {
|
var AST_Lambda = DEFNODE("Lambda", "name argnames uses_arguments is_generator async", {
|
||||||
$documentation: "A set of arrow function parameters or a sequence expression. This is used because when the parser sees a \"(\" it could be the start of a seq, or the start of a parameter list of an arrow function.",
|
|
||||||
$propdoc: {
|
|
||||||
expressions: "[AST_Expression|AST_Destructuring|AST_Expansion*] array of expressions or argument names or destructurings."
|
|
||||||
},
|
|
||||||
as_params: function (croak) {
|
|
||||||
// We don't want anything which doesn't belong in a destructuring
|
|
||||||
var root = this;
|
|
||||||
return this.expressions.map(function to_fun_args(ex, _, __, default_seen_above) {
|
|
||||||
var insert_default = function(ex, default_value) {
|
|
||||||
if (default_value) {
|
|
||||||
return new AST_DefaultAssign({
|
|
||||||
start: ex.start,
|
|
||||||
left: ex,
|
|
||||||
operator: "=",
|
|
||||||
right: default_value,
|
|
||||||
end: default_value.end
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return ex;
|
|
||||||
}
|
|
||||||
if (ex instanceof AST_Object) {
|
|
||||||
return insert_default(new AST_Destructuring({
|
|
||||||
start: ex.start,
|
|
||||||
end: ex.end,
|
|
||||||
is_array: false,
|
|
||||||
names: ex.properties.map(to_fun_args)
|
|
||||||
}), default_seen_above);
|
|
||||||
} else if (ex instanceof AST_ObjectKeyVal) {
|
|
||||||
if (ex.key instanceof AST_SymbolRef) {
|
|
||||||
ex.key = to_fun_args(ex.key, 0, [ex.key]);
|
|
||||||
}
|
|
||||||
ex.value = to_fun_args(ex.value, 0, [ex.key]);
|
|
||||||
return insert_default(ex, default_seen_above);
|
|
||||||
} else if (ex instanceof AST_Hole) {
|
|
||||||
return ex;
|
|
||||||
} else if (ex instanceof AST_Destructuring) {
|
|
||||||
if (ex.names.length == 0)
|
|
||||||
croak("Invalid destructuring function parameter", ex.start.line, ex.start.col);
|
|
||||||
ex.names = ex.names.map(to_fun_args);
|
|
||||||
return insert_default(ex, default_seen_above);
|
|
||||||
} else if (ex instanceof AST_SymbolRef) {
|
|
||||||
return insert_default(new AST_SymbolFunarg({
|
|
||||||
name: ex.name,
|
|
||||||
start: ex.start,
|
|
||||||
end: ex.end
|
|
||||||
}), default_seen_above);
|
|
||||||
} else if (ex instanceof AST_Expansion) {
|
|
||||||
ex.expression = to_fun_args(ex.expression);
|
|
||||||
return insert_default(ex, default_seen_above);
|
|
||||||
} else if (ex instanceof AST_Array) {
|
|
||||||
return insert_default(new AST_Destructuring({
|
|
||||||
start: ex.start,
|
|
||||||
end: ex.end,
|
|
||||||
is_array: true,
|
|
||||||
names: ex.elements.map(to_fun_args)
|
|
||||||
}), default_seen_above);
|
|
||||||
} else if (ex instanceof AST_Assign) {
|
|
||||||
return insert_default(to_fun_args(ex.left, undefined, undefined, ex.right), default_seen_above);
|
|
||||||
} else {
|
|
||||||
croak("Invalid function parameter", ex.start.line, ex.start.col);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
as_expr: function (croak) {
|
|
||||||
return AST_Seq.from_array(this.expressions);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var AST_Lambda = DEFNODE("Lambda", "name argnames uses_arguments is_generator", {
|
|
||||||
$documentation: "Base class for functions",
|
$documentation: "Base class for functions",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
is_generator: "[boolean] is generatorFn or not",
|
|
||||||
name: "[AST_SymbolDeclaration?] the name of this function",
|
name: "[AST_SymbolDeclaration?] the name of this function",
|
||||||
argnames: "[AST_SymbolFunarg|AST_Destructuring|AST_Expansion|AST_DefaultAssign*] array of function arguments, destructurings, or expanding arguments",
|
argnames: "[AST_SymbolFunarg|AST_Destructuring|AST_Expansion|AST_DefaultAssign*] array of function arguments, destructurings, or expanding arguments",
|
||||||
uses_arguments: "[boolean/S] tells whether this function accesses the arguments array"
|
uses_arguments: "[boolean/S] tells whether this function accesses the arguments array",
|
||||||
|
is_generator: "[boolean] is this a generator method",
|
||||||
|
async: "[boolean] is this method async",
|
||||||
},
|
},
|
||||||
args_as_names: function () {
|
args_as_names: function () {
|
||||||
var out = [];
|
var out = [];
|
||||||
@@ -570,14 +444,12 @@ var AST_PrefixedTemplateString = DEFNODE("PrefixedTemplateString", "template_str
|
|||||||
var AST_TemplateString = DEFNODE("TemplateString", "segments", {
|
var AST_TemplateString = DEFNODE("TemplateString", "segments", {
|
||||||
$documentation: "A template string literal",
|
$documentation: "A template string literal",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
segments: "[AST_TemplateSegment|AST_Expression]* One or more segments, starting with AST_TemplateSegment. AST_Expression may follow AST_TemplateSegment, but each AST_Expression must be followed by AST_TemplateSegment."
|
segments: "[AST_Node*] One or more segments, starting with AST_TemplateSegment. AST_Node may follow AST_TemplateSegment, but each AST_Node must be followed by AST_TemplateSegment."
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function(){
|
||||||
this.segments.forEach(function(seg, i){
|
this.segments.forEach(function(seg){
|
||||||
if (i % 2 !== 0) {
|
seg._walk(visitor);
|
||||||
seg._walk(visitor);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -753,11 +625,11 @@ var AST_Const = DEFNODE("Const", null, {
|
|||||||
$documentation: "A `const` statement"
|
$documentation: "A `const` statement"
|
||||||
}, AST_Definitions);
|
}, AST_Definitions);
|
||||||
|
|
||||||
var AST_NameImport = DEFNODE("NameImport", "foreign_name name", {
|
var AST_NameMapping = DEFNODE("NameMapping", "foreign_name name", {
|
||||||
$documentation: "The part of the import statement that imports names from a module.",
|
$documentation: "The part of the export/import statement that declare names from a module.",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
foreign_name: "[AST_SymbolImportForeign] The name being imported (as specified in the module)",
|
foreign_name: "[AST_SymbolExportForeign|AST_SymbolImportForeign] The name being exported/imported (as specified in the module)",
|
||||||
name: "[AST_SymbolImport] The name as it becomes available to this module."
|
name: "[AST_SymbolExport|AST_SymbolImport] The name as it is visible to this module."
|
||||||
},
|
},
|
||||||
_walk: function (visitor) {
|
_walk: function (visitor) {
|
||||||
return visitor._visit(this, function() {
|
return visitor._visit(this, function() {
|
||||||
@@ -771,7 +643,7 @@ var AST_Import = DEFNODE("Import", "imported_name imported_names module_name", {
|
|||||||
$documentation: "An `import` statement",
|
$documentation: "An `import` statement",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
imported_name: "[AST_SymbolImport] The name of the variable holding the module's default export.",
|
imported_name: "[AST_SymbolImport] The name of the variable holding the module's default export.",
|
||||||
imported_names: "[AST_NameImport*] The names of non-default imported variables",
|
imported_names: "[AST_NameMapping*] The names of non-default imported variables",
|
||||||
module_name: "[AST_String] String literal describing where this module came from",
|
module_name: "[AST_String] String literal describing where this module came from",
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
@@ -780,7 +652,7 @@ var AST_Import = DEFNODE("Import", "imported_name imported_names module_name", {
|
|||||||
this.imported_name._walk(visitor);
|
this.imported_name._walk(visitor);
|
||||||
}
|
}
|
||||||
if (this.imported_names) {
|
if (this.imported_names) {
|
||||||
this.imported_names.forEach(function (name_import) {
|
this.imported_names.forEach(function(name_import) {
|
||||||
name_import._walk(visitor);
|
name_import._walk(visitor);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -789,11 +661,13 @@ var AST_Import = DEFNODE("Import", "imported_name imported_names module_name", {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var AST_Export = DEFNODE("Export", "exported_definition exported_value is_default", {
|
var AST_Export = DEFNODE("Export", "exported_definition exported_value is_default exported_names module_name", {
|
||||||
$documentation: "An `export` statement",
|
$documentation: "An `export` statement",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
exported_definition: "[AST_Defun|AST_Definitions|AST_DefClass?] An exported definition",
|
exported_definition: "[AST_Defun|AST_Definitions|AST_DefClass?] An exported definition",
|
||||||
exported_value: "[AST_Node?] An exported value",
|
exported_value: "[AST_Node?] An exported value",
|
||||||
|
exported_names: "[AST_NameMapping*?] List of exported names",
|
||||||
|
module_name: "[AST_String?] Name of the file to load exports from",
|
||||||
is_default: "[Boolean] Whether this is the default exported value of this module"
|
is_default: "[Boolean] Whether this is the default exported value of this module"
|
||||||
},
|
},
|
||||||
_walk: function (visitor) {
|
_walk: function (visitor) {
|
||||||
@@ -804,6 +678,14 @@ var AST_Export = DEFNODE("Export", "exported_definition exported_value is_defaul
|
|||||||
if (this.exported_value) {
|
if (this.exported_value) {
|
||||||
this.exported_value._walk(visitor);
|
this.exported_value._walk(visitor);
|
||||||
}
|
}
|
||||||
|
if (this.exported_names) {
|
||||||
|
this.exported_names.forEach(function(name_export) {
|
||||||
|
name_export._walk(visitor);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (this.module_name) {
|
||||||
|
this.module_name._walk(visitor);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}, AST_Statement);
|
}, AST_Statement);
|
||||||
@@ -811,7 +693,7 @@ var AST_Export = DEFNODE("Export", "exported_definition exported_value is_defaul
|
|||||||
var AST_VarDef = DEFNODE("VarDef", "name value", {
|
var AST_VarDef = DEFNODE("VarDef", "name value", {
|
||||||
$documentation: "A variable declaration; only appears in a AST_Definitions node",
|
$documentation: "A variable declaration; only appears in a AST_Definitions node",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
name: "[AST_SymbolVar|AST_SymbolConst|AST_Destructuring] name of the variable",
|
name: "[AST_Destructuring|AST_SymbolConst|AST_SymbolLet|AST_SymbolVar] name of the variable",
|
||||||
value: "[AST_Node?] initializer, or null of there's no initializer"
|
value: "[AST_Node?] initializer, or null of there's no initializer"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
@@ -832,11 +714,11 @@ var AST_Call = DEFNODE("Call", "expression args", {
|
|||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function(){
|
||||||
this.expression._walk(visitor);
|
|
||||||
var args = this.args;
|
var args = this.args;
|
||||||
for (var i = 0, len = args.length; i < len; i++) {
|
for (var i = 0, len = args.length; i < len; i++) {
|
||||||
args[i]._walk(visitor);
|
args[i]._walk(visitor);
|
||||||
}
|
}
|
||||||
|
this.expression._walk(visitor);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -845,68 +727,16 @@ var AST_New = DEFNODE("New", null, {
|
|||||||
$documentation: "An object instantiation. Derives from a function call since it has exactly the same properties"
|
$documentation: "An object instantiation. Derives from a function call since it has exactly the same properties"
|
||||||
}, AST_Call);
|
}, AST_Call);
|
||||||
|
|
||||||
var AST_Seq = DEFNODE("Seq", "car cdr", {
|
var AST_Sequence = DEFNODE("Sequence", "expressions", {
|
||||||
$documentation: "A sequence expression (two comma-separated expressions)",
|
$documentation: "A sequence expression (comma-separated expressions)",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
car: "[AST_Node] first element in sequence",
|
expressions: "[AST_Node*] array of expressions (at least two)"
|
||||||
cdr: "[AST_Node] second element in sequence"
|
|
||||||
},
|
|
||||||
$cons: function(x, y) {
|
|
||||||
var seq = new AST_Seq(x);
|
|
||||||
seq.car = x;
|
|
||||||
seq.cdr = y;
|
|
||||||
return seq;
|
|
||||||
},
|
|
||||||
$from_array: function(array) {
|
|
||||||
if (array.length == 0) return null;
|
|
||||||
if (array.length == 1) return array[0].clone();
|
|
||||||
var list = null;
|
|
||||||
for (var i = array.length; --i >= 0;) {
|
|
||||||
list = AST_Seq.cons(array[i], list);
|
|
||||||
}
|
|
||||||
var p = list;
|
|
||||||
while (p) {
|
|
||||||
if (p.cdr && !p.cdr.cdr) {
|
|
||||||
p.cdr = p.cdr.car;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
p = p.cdr;
|
|
||||||
}
|
|
||||||
return list;
|
|
||||||
},
|
|
||||||
to_array: function() {
|
|
||||||
var p = this, a = [];
|
|
||||||
while (p) {
|
|
||||||
a.push(p.car);
|
|
||||||
if (p.cdr && !(p.cdr instanceof AST_Seq)) {
|
|
||||||
a.push(p.cdr);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
p = p.cdr;
|
|
||||||
}
|
|
||||||
return a;
|
|
||||||
},
|
|
||||||
add: function(node) {
|
|
||||||
var p = this;
|
|
||||||
while (p) {
|
|
||||||
if (!(p.cdr instanceof AST_Seq)) {
|
|
||||||
var cell = AST_Seq.cons(p.cdr, node);
|
|
||||||
return p.cdr = cell;
|
|
||||||
}
|
|
||||||
p = p.cdr;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
len: function() {
|
|
||||||
if (this.cdr instanceof AST_Seq) {
|
|
||||||
return this.cdr.len() + 1;
|
|
||||||
} else {
|
|
||||||
return 2;
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function(){
|
||||||
this.car._walk(visitor);
|
this.expressions.forEach(function(node) {
|
||||||
if (this.cdr) this.cdr._walk(visitor);
|
node._walk(visitor);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -959,7 +789,7 @@ var AST_UnaryPostfix = DEFNODE("UnaryPostfix", null, {
|
|||||||
$documentation: "Unary postfix expression, i.e. `i++`"
|
$documentation: "Unary postfix expression, i.e. `i++`"
|
||||||
}, AST_Unary);
|
}, AST_Unary);
|
||||||
|
|
||||||
var AST_Binary = DEFNODE("Binary", "left operator right", {
|
var AST_Binary = DEFNODE("Binary", "operator left right", {
|
||||||
$documentation: "Binary expression, i.e. `a + b`",
|
$documentation: "Binary expression, i.e. `a + b`",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
left: "[AST_Node] left-hand side expression",
|
left: "[AST_Node] left-hand side expression",
|
||||||
@@ -1034,7 +864,7 @@ var AST_ObjectProperty = DEFNODE("ObjectProperty", "key value", {
|
|||||||
$documentation: "Base class for literal object properties",
|
$documentation: "Base class for literal object properties",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
key: "[string|AST_Node] the property name converted to a string for ObjectKeyVal. For setters, getters and computed property this is an arbitrary AST_Node",
|
key: "[string|AST_Node] the property name converted to a string for ObjectKeyVal. For setters, getters and computed property this is an arbitrary AST_Node",
|
||||||
value: "[AST_Node] property value. For setters and getters this is an AST_Function."
|
value: "[AST_Node] property value. For setters and getters this is an AST_Accessor."
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function(){
|
||||||
@@ -1068,11 +898,12 @@ var AST_ObjectGetter = DEFNODE("ObjectGetter", "quote static", {
|
|||||||
$documentation: "An object getter property",
|
$documentation: "An object getter property",
|
||||||
}, AST_ObjectProperty);
|
}, AST_ObjectProperty);
|
||||||
|
|
||||||
var AST_ConciseMethod = DEFNODE("ConciseMethod", "quote static is_generator", {
|
var AST_ConciseMethod = DEFNODE("ConciseMethod", "quote static is_generator async", {
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
quote: "[string|undefined] the original quote character, if any",
|
quote: "[string|undefined] the original quote character, if any",
|
||||||
static: "[boolean] whether this method is static (classes only)",
|
static: "[boolean] is this method static (classes only)",
|
||||||
is_generator: "[boolean] is generatorFn or not",
|
is_generator: "[boolean] is this a generator method",
|
||||||
|
async: "[boolean] is this method async",
|
||||||
},
|
},
|
||||||
$documentation: "An ES6 concise method inside an object or class"
|
$documentation: "An ES6 concise method inside an object or class"
|
||||||
}, AST_ObjectProperty);
|
}, AST_ObjectProperty);
|
||||||
@@ -1120,10 +951,6 @@ var AST_NewTarget = DEFNODE("NewTarget", null, {
|
|||||||
$documentation: "A reference to new.target"
|
$documentation: "A reference to new.target"
|
||||||
});
|
});
|
||||||
|
|
||||||
var AST_SymbolAccessor = DEFNODE("SymbolAccessor", null, {
|
|
||||||
$documentation: "The name of a property accessor (setter/getter function)"
|
|
||||||
}, AST_Symbol);
|
|
||||||
|
|
||||||
var AST_SymbolDeclaration = DEFNODE("SymbolDeclaration", "init", {
|
var AST_SymbolDeclaration = DEFNODE("SymbolDeclaration", "init", {
|
||||||
$documentation: "A declaration symbol (symbol in var/const, function name or argument, symbol in catch)",
|
$documentation: "A declaration symbol (symbol in var/const, function name or argument, symbol in catch)",
|
||||||
}, AST_Symbol);
|
}, AST_Symbol);
|
||||||
@@ -1173,7 +1000,7 @@ var AST_SymbolCatch = DEFNODE("SymbolCatch", null, {
|
|||||||
}, AST_SymbolBlockDeclaration);
|
}, AST_SymbolBlockDeclaration);
|
||||||
|
|
||||||
var AST_SymbolImport = DEFNODE("SymbolImport", null, {
|
var AST_SymbolImport = DEFNODE("SymbolImport", null, {
|
||||||
$documentation: "Symbol refering to an imported name",
|
$documentation: "Symbol referring to an imported name",
|
||||||
}, AST_SymbolBlockDeclaration);
|
}, AST_SymbolBlockDeclaration);
|
||||||
|
|
||||||
var AST_SymbolImportForeign = DEFNODE("SymbolImportForeign", null, {
|
var AST_SymbolImportForeign = DEFNODE("SymbolImportForeign", null, {
|
||||||
@@ -1195,6 +1022,14 @@ var AST_SymbolRef = DEFNODE("SymbolRef", null, {
|
|||||||
$documentation: "Reference to some symbol (not definition/declaration)",
|
$documentation: "Reference to some symbol (not definition/declaration)",
|
||||||
}, AST_Symbol);
|
}, AST_Symbol);
|
||||||
|
|
||||||
|
var AST_SymbolExport = DEFNODE("SymbolExport", null, {
|
||||||
|
$documentation: "Symbol referring to a name to export",
|
||||||
|
}, AST_SymbolRef);
|
||||||
|
|
||||||
|
var AST_SymbolExportForeign = DEFNODE("SymbolExportForeign", null, {
|
||||||
|
$documentation: "A symbol exported from this module, but it is used in the other module, and its real name is irrelevant for this module's purposes",
|
||||||
|
}, AST_Symbol);
|
||||||
|
|
||||||
var AST_LabelRef = DEFNODE("LabelRef", null, {
|
var AST_LabelRef = DEFNODE("LabelRef", null, {
|
||||||
$documentation: "Reference to a label symbol",
|
$documentation: "Reference to a label symbol",
|
||||||
}, AST_Symbol);
|
}, AST_Symbol);
|
||||||
@@ -1205,7 +1040,7 @@ var AST_This = DEFNODE("This", null, {
|
|||||||
|
|
||||||
var AST_Super = DEFNODE("Super", null, {
|
var AST_Super = DEFNODE("Super", null, {
|
||||||
$documentation: "The `super` symbol",
|
$documentation: "The `super` symbol",
|
||||||
}, AST_Symbol);
|
}, AST_This);
|
||||||
|
|
||||||
var AST_Constant = DEFNODE("Constant", null, {
|
var AST_Constant = DEFNODE("Constant", null, {
|
||||||
$documentation: "Base class for all constants",
|
$documentation: "Base class for all constants",
|
||||||
@@ -1280,7 +1115,17 @@ var AST_True = DEFNODE("True", null, {
|
|||||||
value: true
|
value: true
|
||||||
}, AST_Boolean);
|
}, AST_Boolean);
|
||||||
|
|
||||||
/* -----[ Yield ]----- */
|
var AST_Await = DEFNODE("Await", "expression", {
|
||||||
|
$documentation: "An `await` statement",
|
||||||
|
$propdoc: {
|
||||||
|
expression: "[AST_Node] the mandatory expression being awaited",
|
||||||
|
},
|
||||||
|
_walk: function(visitor) {
|
||||||
|
return visitor._visit(this, function(){
|
||||||
|
this.expression._walk(visitor);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
var AST_Yield = DEFNODE("Yield", "expression is_star", {
|
var AST_Yield = DEFNODE("Yield", "expression is_star", {
|
||||||
$documentation: "A `yield` statement",
|
$documentation: "A `yield` statement",
|
||||||
@@ -1311,25 +1156,27 @@ TreeWalker.prototype = {
|
|||||||
if (!ret && descend) {
|
if (!ret && descend) {
|
||||||
descend.call(node);
|
descend.call(node);
|
||||||
}
|
}
|
||||||
this.pop(node);
|
this.pop();
|
||||||
return ret;
|
return ret;
|
||||||
},
|
},
|
||||||
parent: function(n) {
|
parent: function(n) {
|
||||||
return this.stack[this.stack.length - 2 - (n || 0)];
|
return this.stack[this.stack.length - 2 - (n || 0)];
|
||||||
},
|
},
|
||||||
push: function (node) {
|
push: function(node) {
|
||||||
if (node instanceof AST_Lambda) {
|
if (node instanceof AST_Lambda) {
|
||||||
this.directives = Object.create(this.directives);
|
this.directives = Object.create(this.directives);
|
||||||
} else if (node instanceof AST_Directive) {
|
} else if (node instanceof AST_Directive && !this.directives[node.value]) {
|
||||||
this.directives[node.value] = this.directives[node.value] ? "up" : true;
|
this.directives[node.value] = node;
|
||||||
} else if (node instanceof AST_Class) {
|
} else if (node instanceof AST_Class) {
|
||||||
this.directives = Object.create(this.directives);
|
this.directives = Object.create(this.directives);
|
||||||
this.directives["use strict"] = this.directives["use strict"] ? "up" : true;
|
if (!this.directives["use strict"]) {
|
||||||
|
this.directives["use strict"] = node;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
this.stack.push(node);
|
this.stack.push(node);
|
||||||
},
|
},
|
||||||
pop: function(node) {
|
pop: function() {
|
||||||
this.stack.pop();
|
var node = this.stack.pop();
|
||||||
if (node instanceof AST_Lambda || node instanceof AST_Class) {
|
if (node instanceof AST_Lambda || node instanceof AST_Class) {
|
||||||
this.directives = Object.getPrototypeOf(this.directives);
|
this.directives = Object.getPrototypeOf(this.directives);
|
||||||
}
|
}
|
||||||
@@ -1352,7 +1199,7 @@ TreeWalker.prototype = {
|
|||||||
for (var i = 0; i < node.body.length; ++i) {
|
for (var i = 0; i < node.body.length; ++i) {
|
||||||
var st = node.body[i];
|
var st = node.body[i];
|
||||||
if (!(st instanceof AST_Directive)) break;
|
if (!(st instanceof AST_Directive)) break;
|
||||||
if (st.value == type) return true;
|
if (st.value == type) return st;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1374,16 +1221,16 @@ TreeWalker.prototype = {
|
|||||||
self = p;
|
self = p;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
loopcontrol_target: function(label) {
|
loopcontrol_target: function(node) {
|
||||||
var stack = this.stack;
|
var stack = this.stack;
|
||||||
if (label) for (var i = stack.length; --i >= 0;) {
|
if (node.label) for (var i = stack.length; --i >= 0;) {
|
||||||
var x = stack[i];
|
var x = stack[i];
|
||||||
if (x instanceof AST_LabeledStatement && x.label.name == label.name) {
|
if (x instanceof AST_LabeledStatement && x.label.name == node.label.name)
|
||||||
return x.body;
|
return x.body;
|
||||||
}
|
|
||||||
} else for (var i = stack.length; --i >= 0;) {
|
} else for (var i = stack.length; --i >= 0;) {
|
||||||
var x = stack[i];
|
var x = stack[i];
|
||||||
if (x instanceof AST_Switch || x instanceof AST_IterationStatement)
|
if (x instanceof AST_IterationStatement
|
||||||
|
|| node instanceof AST_Break && x instanceof AST_Switch)
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
4654
lib/compress.js
4654
lib/compress.js
File diff suppressed because it is too large
Load Diff
222
lib/minify.js
Normal file
222
lib/minify.js
Normal file
@@ -0,0 +1,222 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
var to_ascii = typeof atob == "undefined" ? function(b64) {
|
||||||
|
return new Buffer(b64, "base64").toString();
|
||||||
|
} : atob;
|
||||||
|
var to_base64 = typeof btoa == "undefined" ? function(str) {
|
||||||
|
return new Buffer(str).toString("base64");
|
||||||
|
} : btoa;
|
||||||
|
|
||||||
|
function read_source_map(code) {
|
||||||
|
var match = /\n\/\/# sourceMappingURL=data:application\/json(;.*?)?;base64,(.*)/.exec(code);
|
||||||
|
if (!match) {
|
||||||
|
AST_Node.warn("inline source map not found");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return to_ascii(match[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
function set_shorthand(name, options, keys) {
|
||||||
|
if (options[name]) {
|
||||||
|
keys.forEach(function(key) {
|
||||||
|
if (options[key]) {
|
||||||
|
if (typeof options[key] != "object") options[key] = {};
|
||||||
|
if (!(name in options[key])) options[key][name] = options[name];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function init_cache(cache) {
|
||||||
|
if (!cache) return;
|
||||||
|
if (!("cname" in cache)) cache.cname = -1;
|
||||||
|
if (!("props" in cache)) {
|
||||||
|
cache.props = new Dictionary();
|
||||||
|
} else if (!(cache.props instanceof Dictionary)) {
|
||||||
|
cache.props = Dictionary.fromObject(cache.props);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function to_json(cache) {
|
||||||
|
return {
|
||||||
|
cname: cache.cname,
|
||||||
|
props: cache.props.toObject()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function minify(files, options) {
|
||||||
|
var warn_function = AST_Node.warn_function;
|
||||||
|
try {
|
||||||
|
options = defaults(options, {
|
||||||
|
compress: {},
|
||||||
|
ecma: undefined,
|
||||||
|
ie8: false,
|
||||||
|
keep_fnames: false,
|
||||||
|
mangle: {},
|
||||||
|
nameCache: null,
|
||||||
|
output: {},
|
||||||
|
parse: {},
|
||||||
|
sourceMap: false,
|
||||||
|
timings: false,
|
||||||
|
toplevel: false,
|
||||||
|
warnings: false,
|
||||||
|
wrap: false,
|
||||||
|
}, true);
|
||||||
|
var timings = options.timings && {
|
||||||
|
start: Date.now()
|
||||||
|
};
|
||||||
|
set_shorthand("ecma", options, [ "parse", "compress", "output" ]);
|
||||||
|
set_shorthand("ie8", options, [ "compress", "mangle", "output" ]);
|
||||||
|
set_shorthand("keep_fnames", options, [ "compress", "mangle" ]);
|
||||||
|
set_shorthand("toplevel", options, [ "compress", "mangle" ]);
|
||||||
|
set_shorthand("warnings", options, [ "compress" ]);
|
||||||
|
var quoted_props;
|
||||||
|
if (options.mangle) {
|
||||||
|
options.mangle = defaults(options.mangle, {
|
||||||
|
cache: options.nameCache && (options.nameCache.vars || {}),
|
||||||
|
eval: false,
|
||||||
|
ie8: false,
|
||||||
|
keep_classnames: false,
|
||||||
|
keep_fnames: false,
|
||||||
|
properties: false,
|
||||||
|
reserved: [],
|
||||||
|
safari10: false,
|
||||||
|
toplevel: false,
|
||||||
|
}, true);
|
||||||
|
if (options.mangle.properties) {
|
||||||
|
if (typeof options.mangle.properties != "object") {
|
||||||
|
options.mangle.properties = {};
|
||||||
|
}
|
||||||
|
if (options.mangle.properties.keep_quoted) {
|
||||||
|
quoted_props = options.mangle.properties.reserved;
|
||||||
|
if (!Array.isArray(quoted_props)) quoted_props = [];
|
||||||
|
options.mangle.properties.reserved = quoted_props;
|
||||||
|
}
|
||||||
|
if (options.nameCache && !("cache" in options.mangle.properties)) {
|
||||||
|
options.mangle.properties.cache = options.nameCache.props || {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
init_cache(options.mangle.cache);
|
||||||
|
init_cache(options.mangle.properties.cache);
|
||||||
|
}
|
||||||
|
if (options.sourceMap) {
|
||||||
|
options.sourceMap = defaults(options.sourceMap, {
|
||||||
|
content: null,
|
||||||
|
filename: null,
|
||||||
|
includeSources: false,
|
||||||
|
root: null,
|
||||||
|
url: null,
|
||||||
|
}, true);
|
||||||
|
}
|
||||||
|
var warnings = [];
|
||||||
|
if (options.warnings && !AST_Node.warn_function) {
|
||||||
|
AST_Node.warn_function = function(warning) {
|
||||||
|
warnings.push(warning);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
if (timings) timings.parse = Date.now();
|
||||||
|
var toplevel;
|
||||||
|
if (files instanceof AST_Toplevel) {
|
||||||
|
toplevel = files;
|
||||||
|
} else {
|
||||||
|
if (typeof files == "string") {
|
||||||
|
files = [ files ];
|
||||||
|
}
|
||||||
|
options.parse = options.parse || {};
|
||||||
|
options.parse.toplevel = null;
|
||||||
|
for (var name in files) if (HOP(files, name)) {
|
||||||
|
options.parse.filename = name;
|
||||||
|
options.parse.toplevel = parse(files[name], options.parse);
|
||||||
|
if (options.sourceMap && options.sourceMap.content == "inline") {
|
||||||
|
if (Object.keys(files).length > 1)
|
||||||
|
throw new Error("inline source map only works with singular input");
|
||||||
|
options.sourceMap.content = read_source_map(files[name]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
toplevel = options.parse.toplevel;
|
||||||
|
}
|
||||||
|
if (quoted_props) {
|
||||||
|
reserve_quoted_keys(toplevel, quoted_props);
|
||||||
|
}
|
||||||
|
if (options.wrap) {
|
||||||
|
toplevel = toplevel.wrap_commonjs(options.wrap);
|
||||||
|
}
|
||||||
|
if (timings) timings.compress = Date.now();
|
||||||
|
if (options.compress) toplevel = new Compressor(options.compress).compress(toplevel);
|
||||||
|
if (timings) timings.scope = Date.now();
|
||||||
|
if (options.mangle) toplevel.figure_out_scope(options.mangle);
|
||||||
|
if (timings) timings.mangle = Date.now();
|
||||||
|
if (options.mangle) {
|
||||||
|
base54.reset();
|
||||||
|
toplevel.compute_char_frequency(options.mangle);
|
||||||
|
toplevel.mangle_names(options.mangle);
|
||||||
|
}
|
||||||
|
if (timings) timings.properties = Date.now();
|
||||||
|
if (options.mangle && options.mangle.properties) {
|
||||||
|
toplevel = mangle_properties(toplevel, options.mangle.properties);
|
||||||
|
}
|
||||||
|
if (timings) timings.output = Date.now();
|
||||||
|
var result = {};
|
||||||
|
if (options.output.ast) {
|
||||||
|
result.ast = toplevel;
|
||||||
|
}
|
||||||
|
if (!HOP(options.output, "code") || options.output.code) {
|
||||||
|
if (options.sourceMap) {
|
||||||
|
if (typeof options.sourceMap.content == "string") {
|
||||||
|
options.sourceMap.content = JSON.parse(options.sourceMap.content);
|
||||||
|
}
|
||||||
|
options.output.source_map = SourceMap({
|
||||||
|
file: options.sourceMap.filename,
|
||||||
|
orig: options.sourceMap.content,
|
||||||
|
root: options.sourceMap.root
|
||||||
|
});
|
||||||
|
if (options.sourceMap.includeSources) {
|
||||||
|
if (files instanceof AST_Toplevel) {
|
||||||
|
throw new Error("original source content unavailable");
|
||||||
|
} else for (var name in files) if (HOP(files, name)) {
|
||||||
|
options.output.source_map.get().setSourceContent(name, files[name]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
delete options.output.ast;
|
||||||
|
delete options.output.code;
|
||||||
|
var stream = OutputStream(options.output);
|
||||||
|
toplevel.print(stream);
|
||||||
|
result.code = stream.get();
|
||||||
|
if (options.sourceMap) {
|
||||||
|
result.map = options.output.source_map.toString();
|
||||||
|
if (options.sourceMap.url == "inline") {
|
||||||
|
result.code += "\n//# sourceMappingURL=data:application/json;charset=utf-8;base64," + to_base64(result.map);
|
||||||
|
} else if (options.sourceMap.url) {
|
||||||
|
result.code += "\n//# sourceMappingURL=" + options.sourceMap.url;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (options.nameCache && options.mangle) {
|
||||||
|
if (options.mangle.cache) options.nameCache.vars = to_json(options.mangle.cache);
|
||||||
|
if (options.mangle.properties && options.mangle.properties.cache) {
|
||||||
|
options.nameCache.props = to_json(options.mangle.properties.cache);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (timings) {
|
||||||
|
timings.end = Date.now();
|
||||||
|
result.timings = {
|
||||||
|
parse: 1e-3 * (timings.compress - timings.parse),
|
||||||
|
compress: 1e-3 * (timings.scope - timings.compress),
|
||||||
|
scope: 1e-3 * (timings.mangle - timings.scope),
|
||||||
|
mangle: 1e-3 * (timings.properties - timings.mangle),
|
||||||
|
properties: 1e-3 * (timings.output - timings.properties),
|
||||||
|
output: 1e-3 * (timings.end - timings.output),
|
||||||
|
total: 1e-3 * (timings.end - timings.start)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (warnings.length) {
|
||||||
|
result.warnings = warnings;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
} catch (ex) {
|
||||||
|
return { error: ex };
|
||||||
|
} finally {
|
||||||
|
AST_Node.warn_function = warn_function;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -111,23 +111,19 @@
|
|||||||
},
|
},
|
||||||
Property: function(M) {
|
Property: function(M) {
|
||||||
var key = M.key;
|
var key = M.key;
|
||||||
var name = key.type == "Identifier" ? key.name : key.value;
|
|
||||||
var args = {
|
var args = {
|
||||||
start : my_start_token(key),
|
start : my_start_token(key),
|
||||||
end : my_end_token(M.value),
|
end : my_end_token(M.value),
|
||||||
key : name,
|
key : key.type == "Identifier" ? key.name : key.value,
|
||||||
value : from_moz(M.value)
|
value : from_moz(M.value)
|
||||||
};
|
};
|
||||||
switch (M.kind) {
|
if (M.kind == "init") return new AST_ObjectKeyVal(args);
|
||||||
case "init":
|
args.key = new AST_SymbolMethod({
|
||||||
return new AST_ObjectKeyVal(args);
|
name: args.key
|
||||||
case "set":
|
});
|
||||||
args.value.name = from_moz(key);
|
args.value = new AST_Accessor(args.value);
|
||||||
return new AST_ObjectSetter(args);
|
if (M.kind == "get") return new AST_ObjectGetter(args);
|
||||||
case "get":
|
if (M.kind == "set") return new AST_ObjectSetter(args);
|
||||||
args.value.name = from_moz(key);
|
|
||||||
return new AST_ObjectGetter(args);
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
ArrayExpression: function(M) {
|
ArrayExpression: function(M) {
|
||||||
return new AST_Array({
|
return new AST_Array({
|
||||||
@@ -149,7 +145,11 @@
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
SequenceExpression: function(M) {
|
SequenceExpression: function(M) {
|
||||||
return AST_Seq.from_array(M.expressions.map(from_moz));
|
return new AST_Sequence({
|
||||||
|
start : my_start_token(M),
|
||||||
|
end : my_end_token(M),
|
||||||
|
expressions: M.expressions.map(from_moz)
|
||||||
|
});
|
||||||
},
|
},
|
||||||
MemberExpression: function(M) {
|
MemberExpression: function(M) {
|
||||||
return new (M.computed ? AST_Sub : AST_Dot)({
|
return new (M.computed ? AST_Sub : AST_Dot)({
|
||||||
@@ -256,10 +256,7 @@
|
|||||||
map("CallExpression", AST_Call, "callee>expression, arguments@args");
|
map("CallExpression", AST_Call, "callee>expression, arguments@args");
|
||||||
|
|
||||||
def_to_moz(AST_Toplevel, function To_Moz_Program(M) {
|
def_to_moz(AST_Toplevel, function To_Moz_Program(M) {
|
||||||
return {
|
return to_moz_scope("Program", M);
|
||||||
type: "Program",
|
|
||||||
body: M.body.map(to_moz)
|
|
||||||
};
|
|
||||||
});
|
});
|
||||||
|
|
||||||
def_to_moz(AST_Defun, function To_Moz_FunctionDeclaration(M) {
|
def_to_moz(AST_Defun, function To_Moz_FunctionDeclaration(M) {
|
||||||
@@ -267,7 +264,7 @@
|
|||||||
type: "FunctionDeclaration",
|
type: "FunctionDeclaration",
|
||||||
id: to_moz(M.name),
|
id: to_moz(M.name),
|
||||||
params: M.argnames.map(to_moz),
|
params: M.argnames.map(to_moz),
|
||||||
body: to_moz_block(M)
|
body: to_moz_scope("BlockStatement", M)
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -276,7 +273,7 @@
|
|||||||
type: "FunctionExpression",
|
type: "FunctionExpression",
|
||||||
id: to_moz(M.name),
|
id: to_moz(M.name),
|
||||||
params: M.argnames.map(to_moz),
|
params: M.argnames.map(to_moz),
|
||||||
body: to_moz_block(M)
|
body: to_moz_scope("BlockStatement", M)
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -332,10 +329,10 @@
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
def_to_moz(AST_Seq, function To_Moz_SequenceExpression(M) {
|
def_to_moz(AST_Sequence, function To_Moz_SequenceExpression(M) {
|
||||||
return {
|
return {
|
||||||
type: "SequenceExpression",
|
type: "SequenceExpression",
|
||||||
expressions: M.to_array().map(to_moz)
|
expressions: M.expressions.map(to_moz)
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -382,11 +379,10 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
def_to_moz(AST_ObjectProperty, function To_Moz_Property(M) {
|
def_to_moz(AST_ObjectProperty, function To_Moz_Property(M) {
|
||||||
var key = (
|
var key = {
|
||||||
is_identifier(M.key)
|
type: "Literal",
|
||||||
? {type: "Identifier", name: M.key}
|
value: M.key instanceof AST_SymbolMethod ? M.key.name : M.key
|
||||||
: {type: "Literal", value: M.key}
|
};
|
||||||
);
|
|
||||||
var kind;
|
var kind;
|
||||||
if (M instanceof AST_ObjectKeyVal) {
|
if (M instanceof AST_ObjectKeyVal) {
|
||||||
kind = "init";
|
kind = "init";
|
||||||
@@ -547,8 +543,8 @@
|
|||||||
moz_to_me = new Function("U2", "my_start_token", "my_end_token", "from_moz", "return(" + moz_to_me + ")")(
|
moz_to_me = new Function("U2", "my_start_token", "my_end_token", "from_moz", "return(" + moz_to_me + ")")(
|
||||||
exports, my_start_token, my_end_token, from_moz
|
exports, my_start_token, my_end_token, from_moz
|
||||||
);
|
);
|
||||||
me_to_moz = new Function("to_moz", "to_moz_block", "return(" + me_to_moz + ")")(
|
me_to_moz = new Function("to_moz", "to_moz_block", "to_moz_scope", "return(" + me_to_moz + ")")(
|
||||||
to_moz, to_moz_block
|
to_moz, to_moz_block, to_moz_scope
|
||||||
);
|
);
|
||||||
MOZ_TO_ME[moztype] = moz_to_me;
|
MOZ_TO_ME[moztype] = moz_to_me;
|
||||||
def_to_moz(mytype, me_to_moz);
|
def_to_moz(mytype, me_to_moz);
|
||||||
@@ -606,4 +602,14 @@
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function to_moz_scope(type, node) {
|
||||||
|
var body = node.body.map(to_moz);
|
||||||
|
if (node.body[0] instanceof AST_SimpleStatement && node.body[0].body instanceof AST_String) {
|
||||||
|
body.unshift(to_moz(new AST_EmptyStatement(node.body[0])));
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
type: type,
|
||||||
|
body: body
|
||||||
|
};
|
||||||
|
};
|
||||||
})();
|
})();
|
||||||
|
|||||||
577
lib/output.js
577
lib/output.js
@@ -53,35 +53,30 @@ function is_some_comments(comment) {
|
|||||||
function OutputStream(options) {
|
function OutputStream(options) {
|
||||||
|
|
||||||
options = defaults(options, {
|
options = defaults(options, {
|
||||||
indent_start : 0,
|
|
||||||
indent_level : 4,
|
|
||||||
quote_keys : false,
|
|
||||||
space_colon : true,
|
|
||||||
ascii_only : false,
|
ascii_only : false,
|
||||||
ascii_identifiers: undefined,
|
|
||||||
unescape_regexps : false,
|
|
||||||
inline_script : false,
|
|
||||||
width : 80,
|
|
||||||
max_line_len : false,
|
|
||||||
beautify : false,
|
beautify : false,
|
||||||
source_map : null,
|
|
||||||
bracketize : false,
|
bracketize : false,
|
||||||
semicolons : true,
|
|
||||||
comments : false,
|
comments : false,
|
||||||
shebang : true,
|
|
||||||
preserve_line : false,
|
|
||||||
screw_ie8 : true,
|
|
||||||
preamble : null,
|
|
||||||
quote_style : 0,
|
|
||||||
keep_quoted_props: false,
|
|
||||||
shorthand : undefined,
|
|
||||||
ecma : 5,
|
ecma : 5,
|
||||||
|
ie8 : false,
|
||||||
|
indent_level : 4,
|
||||||
|
indent_start : 0,
|
||||||
|
inline_script : true,
|
||||||
|
keep_quoted_props: false,
|
||||||
|
max_line_len : false,
|
||||||
|
preamble : null,
|
||||||
|
preserve_line : false,
|
||||||
|
quote_keys : false,
|
||||||
|
quote_style : 0,
|
||||||
|
semicolons : true,
|
||||||
|
shebang : true,
|
||||||
|
shorthand : undefined,
|
||||||
|
source_map : null,
|
||||||
|
webkit : false,
|
||||||
|
width : 80,
|
||||||
wrap_iife : false,
|
wrap_iife : false,
|
||||||
}, true);
|
}, true);
|
||||||
|
|
||||||
if (typeof options.ascii_identifiers === 'undefined')
|
|
||||||
options.ascii_identifiers = options.ascii_only;
|
|
||||||
|
|
||||||
if (options.shorthand === undefined)
|
if (options.shorthand === undefined)
|
||||||
options.shorthand = options.ecma > 5;
|
options.shorthand = options.ecma > 5;
|
||||||
|
|
||||||
@@ -119,20 +114,16 @@ function OutputStream(options) {
|
|||||||
var current_pos = 0;
|
var current_pos = 0;
|
||||||
var OUTPUT = "";
|
var OUTPUT = "";
|
||||||
|
|
||||||
function to_ascii(str, identifier) {
|
var to_utf8 = options.ascii_only ? function(str, identifier) {
|
||||||
return str.replace(/[\ud800-\udbff][\udc00-\udfff]|[\u0000-\u001f\u007f-\uffff]/g, function(ch) {
|
if (options.ecma >= 6) {
|
||||||
var code = get_full_char_code(ch, 0).toString(16);
|
str = str.replace(/[\ud800-\udbff][\udc00-\udfff]/g, function(ch) {
|
||||||
|
var code = get_full_char_code(ch, 0).toString(16);
|
||||||
if ((identifier && code.length === 1 && options.ecma >= 6) || code.length > 4) {
|
|
||||||
if (options.ecma < 6) {
|
|
||||||
if (identifier) {
|
|
||||||
return ch; // no \u{} support
|
|
||||||
}
|
|
||||||
return "\\u" + ch.charCodeAt(0).toString(16) + "\\u"
|
|
||||||
+ ch.charCodeAt(1).toString(16);
|
|
||||||
}
|
|
||||||
return "\\u{" + code + "}";
|
return "\\u{" + code + "}";
|
||||||
} else if (code.length <= 2 && !identifier) {
|
});
|
||||||
|
}
|
||||||
|
return str.replace(/[\u0000-\u001f\u007f-\uffff]/g, function(ch) {
|
||||||
|
var code = ch.charCodeAt(0).toString(16);
|
||||||
|
if (code.length <= 2 && !identifier) {
|
||||||
while (code.length < 2) code = "0" + code;
|
while (code.length < 2) code = "0" + code;
|
||||||
return "\\x" + code;
|
return "\\x" + code;
|
||||||
} else {
|
} else {
|
||||||
@@ -140,6 +131,12 @@ function OutputStream(options) {
|
|||||||
return "\\u" + code;
|
return "\\u" + code;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
} : function(str) {
|
||||||
|
return str.replace(/[\ud800-\udbff](?![\udc00-\udfff])/g, function(ch) {
|
||||||
|
return "\\u" + ch.charCodeAt(0).toString(16);
|
||||||
|
}).replace(/(^|[^\ud800-\udbff])([\udc00-\udfff])/g, function(match, prefix, ch) {
|
||||||
|
return prefix + "\\u" + ch.charCodeAt(0).toString(16);
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
function make_string(str, quote) {
|
function make_string(str, quote) {
|
||||||
@@ -155,12 +152,12 @@ function OutputStream(options) {
|
|||||||
case "\t": return "\\t";
|
case "\t": return "\\t";
|
||||||
case "\b": return "\\b";
|
case "\b": return "\\b";
|
||||||
case "\f": return "\\f";
|
case "\f": return "\\f";
|
||||||
case "\x0B": return options.screw_ie8 ? "\\v" : "\\x0B";
|
case "\x0B": return options.ie8 ? "\\x0B" : "\\v";
|
||||||
case "\u2028": return "\\u2028";
|
case "\u2028": return "\\u2028";
|
||||||
case "\u2029": return "\\u2029";
|
case "\u2029": return "\\u2029";
|
||||||
case "\ufeff": return "\\ufeff";
|
case "\ufeff": return "\\ufeff";
|
||||||
case "\0":
|
case "\0":
|
||||||
return /[0-7]/.test(get_full_char(str, i+1)) ? "\\x00" : "\\0";
|
return /[0-9]/.test(get_full_char(str, i+1)) ? "\\x00" : "\\0";
|
||||||
}
|
}
|
||||||
return s;
|
return s;
|
||||||
});
|
});
|
||||||
@@ -171,20 +168,9 @@ function OutputStream(options) {
|
|||||||
return '"' + str.replace(/\x22/g, '\\"') + '"';
|
return '"' + str.replace(/\x22/g, '\\"') + '"';
|
||||||
}
|
}
|
||||||
function quote_template() {
|
function quote_template() {
|
||||||
if (!options.ascii_only) {
|
|
||||||
str = str.replace(/\\(n|r|u2028|u2029)/g, function(s, c) {
|
|
||||||
switch(c) {
|
|
||||||
case "n": return "\n";
|
|
||||||
case "r": return "\r";
|
|
||||||
case "u2028": return "\u2028";
|
|
||||||
case "u2029": return "\u2029";
|
|
||||||
}
|
|
||||||
return s;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return '`' + str.replace(/`/g, '\\`') + '`';
|
return '`' + str.replace(/`/g, '\\`') + '`';
|
||||||
}
|
}
|
||||||
if (options.ascii_only) str = to_ascii(str);
|
str = to_utf8(str);
|
||||||
if (quote === "`") return quote_template();
|
if (quote === "`") return quote_template();
|
||||||
switch (options.quote_style) {
|
switch (options.quote_style) {
|
||||||
case 1:
|
case 1:
|
||||||
@@ -210,8 +196,7 @@ function OutputStream(options) {
|
|||||||
|
|
||||||
function make_name(name) {
|
function make_name(name) {
|
||||||
name = name.toString();
|
name = name.toString();
|
||||||
if (options.ascii_identifiers)
|
name = to_utf8(name, true);
|
||||||
name = to_ascii(name, true);
|
|
||||||
return name;
|
return name;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -224,23 +209,44 @@ function OutputStream(options) {
|
|||||||
var might_need_space = false;
|
var might_need_space = false;
|
||||||
var might_need_semicolon = false;
|
var might_need_semicolon = false;
|
||||||
var might_add_newline = 0;
|
var might_add_newline = 0;
|
||||||
var last = null;
|
var last = "";
|
||||||
|
var mapping_token, mapping_name, mappings = options.source_map && [];
|
||||||
|
|
||||||
function last_char() {
|
var do_add_mapping = mappings ? function() {
|
||||||
var char = last.charAt(last.length - 1);
|
mappings.forEach(function(mapping) {
|
||||||
|
try {
|
||||||
if (is_surrogate_pair_tail(char)) {
|
options.source_map.add(
|
||||||
return last.charAt(last.length - 2) + char;
|
mapping.token.file,
|
||||||
}
|
mapping.line, mapping.col,
|
||||||
|
mapping.token.line, mapping.token.col,
|
||||||
return char;
|
!mapping.name && mapping.token.type == "name" ? mapping.token.value : mapping.name
|
||||||
};
|
);
|
||||||
|
} catch(ex) {
|
||||||
|
AST_Node.warn("Couldn't figure out mapping for {file}:{line},{col} → {cline},{ccol} [{name}]", {
|
||||||
|
file: mapping.token.file,
|
||||||
|
line: mapping.token.line,
|
||||||
|
col: mapping.token.col,
|
||||||
|
cline: mapping.line,
|
||||||
|
ccol: mapping.col,
|
||||||
|
name: mapping.name || ""
|
||||||
|
})
|
||||||
|
}
|
||||||
|
});
|
||||||
|
mappings = [];
|
||||||
|
} : noop;
|
||||||
|
|
||||||
var ensure_line_len = options.max_line_len ? function() {
|
var ensure_line_len = options.max_line_len ? function() {
|
||||||
if (current_col > options.max_line_len) {
|
if (current_col > options.max_line_len) {
|
||||||
if (might_add_newline) {
|
if (might_add_newline) {
|
||||||
var left = OUTPUT.slice(0, might_add_newline);
|
var left = OUTPUT.slice(0, might_add_newline);
|
||||||
var right = OUTPUT.slice(might_add_newline);
|
var right = OUTPUT.slice(might_add_newline);
|
||||||
|
if (mappings) {
|
||||||
|
var delta = right.length - current_col;
|
||||||
|
mappings.forEach(function(mapping) {
|
||||||
|
mapping.line++;
|
||||||
|
mapping.col += delta;
|
||||||
|
});
|
||||||
|
}
|
||||||
OUTPUT = left + "\n" + right;
|
OUTPUT = left + "\n" + right;
|
||||||
current_line++;
|
current_line++;
|
||||||
current_pos++;
|
current_pos++;
|
||||||
@@ -250,18 +256,22 @@ function OutputStream(options) {
|
|||||||
AST_Node.warn("Output exceeds {max_line_len} characters", options);
|
AST_Node.warn("Output exceeds {max_line_len} characters", options);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
might_add_newline = 0;
|
if (might_add_newline) {
|
||||||
|
might_add_newline = 0;
|
||||||
|
do_add_mapping();
|
||||||
|
}
|
||||||
} : noop;
|
} : noop;
|
||||||
|
|
||||||
var requireSemicolonChars = makePredicate("( [ + * / - , .");
|
var requireSemicolonChars = makePredicate("( [ + * / - , . `");
|
||||||
|
|
||||||
function print(str) {
|
function print(str) {
|
||||||
str = String(str);
|
str = String(str);
|
||||||
var ch = get_full_char(str, 0);
|
var ch = get_full_char(str, 0);
|
||||||
|
var prev = get_full_char(last, last.length - 1);
|
||||||
if (might_need_semicolon) {
|
if (might_need_semicolon) {
|
||||||
might_need_semicolon = false;
|
might_need_semicolon = false;
|
||||||
|
|
||||||
if ((!ch || ";}".indexOf(ch) < 0) && !/[;]$/.test(last)) {
|
if (prev == ":" && ch == "}" || (!ch || ";}".indexOf(ch) < 0) && prev != ";") {
|
||||||
if (options.semicolons || requireSemicolonChars(ch)) {
|
if (options.semicolons || requireSemicolonChars(ch)) {
|
||||||
OUTPUT += ";";
|
OUTPUT += ";";
|
||||||
current_col++;
|
current_col++;
|
||||||
@@ -298,7 +308,6 @@ function OutputStream(options) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (might_need_space) {
|
if (might_need_space) {
|
||||||
var prev = last_char();
|
|
||||||
if ((is_identifier_char(prev)
|
if ((is_identifier_char(prev)
|
||||||
&& (is_identifier_char(ch) || ch == "\\"))
|
&& (is_identifier_char(ch) || ch == "\\"))
|
||||||
|| (ch == "/" && ch == prev)
|
|| (ch == "/" && ch == prev)
|
||||||
@@ -310,6 +319,18 @@ function OutputStream(options) {
|
|||||||
}
|
}
|
||||||
might_need_space = false;
|
might_need_space = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mapping_token) {
|
||||||
|
mappings.push({
|
||||||
|
token: mapping_token,
|
||||||
|
name: mapping_name,
|
||||||
|
line: current_line,
|
||||||
|
col: current_col
|
||||||
|
});
|
||||||
|
mapping_token = false;
|
||||||
|
if (!might_add_newline) do_add_mapping();
|
||||||
|
}
|
||||||
|
|
||||||
OUTPUT += str;
|
OUTPUT += str;
|
||||||
current_pos += str.length;
|
current_pos += str.length;
|
||||||
var a = str.split(/\r?\n/), n = a.length - 1;
|
var a = str.split(/\r?\n/), n = a.length - 1;
|
||||||
@@ -405,27 +426,12 @@ function OutputStream(options) {
|
|||||||
|
|
||||||
function colon() {
|
function colon() {
|
||||||
print(":");
|
print(":");
|
||||||
if (options.space_colon) space();
|
space();
|
||||||
};
|
};
|
||||||
|
|
||||||
var add_mapping = options.source_map ? function(token, name) {
|
var add_mapping = mappings ? function(token, name) {
|
||||||
try {
|
mapping_token = token;
|
||||||
if (token) options.source_map.add(
|
mapping_name = name;
|
||||||
token.file || "?",
|
|
||||||
current_line, current_col,
|
|
||||||
token.line, token.col,
|
|
||||||
(!name && token.type == "name") ? token.value : name
|
|
||||||
);
|
|
||||||
} catch(ex) {
|
|
||||||
AST_Node.warn("Couldn't figure out mapping for {file}:{line},{col} → {cline},{ccol} [{name}]", {
|
|
||||||
file: token.file,
|
|
||||||
line: token.line,
|
|
||||||
col: token.col,
|
|
||||||
cline: current_line,
|
|
||||||
ccol: current_col,
|
|
||||||
name: name || ""
|
|
||||||
})
|
|
||||||
}
|
|
||||||
} : noop;
|
} : noop;
|
||||||
|
|
||||||
function get() {
|
function get() {
|
||||||
@@ -452,7 +458,7 @@ function OutputStream(options) {
|
|||||||
last : function() { return last },
|
last : function() { return last },
|
||||||
semicolon : semicolon,
|
semicolon : semicolon,
|
||||||
force_semicolon : force_semicolon,
|
force_semicolon : force_semicolon,
|
||||||
to_ascii : to_ascii,
|
to_utf8 : to_utf8,
|
||||||
print_name : function(name) { print(make_name(name)) },
|
print_name : function(name) { print(make_name(name)) },
|
||||||
print_string : function(str, quote, escape_directive) {
|
print_string : function(str, quote, escape_directive) {
|
||||||
var encoded = encode_string(str, quote);
|
var encoded = encode_string(str, quote);
|
||||||
@@ -500,13 +506,17 @@ function OutputStream(options) {
|
|||||||
nodetype.DEFMETHOD("_codegen", generator);
|
nodetype.DEFMETHOD("_codegen", generator);
|
||||||
};
|
};
|
||||||
|
|
||||||
var use_asm = false;
|
|
||||||
var in_directive = false;
|
var in_directive = false;
|
||||||
|
var active_scope = null;
|
||||||
|
var use_asm = null;
|
||||||
|
|
||||||
AST_Node.DEFMETHOD("print", function(stream, force_parens){
|
AST_Node.DEFMETHOD("print", function(stream, force_parens){
|
||||||
var self = this, generator = self._codegen, prev_use_asm = use_asm;
|
var self = this, generator = self._codegen;
|
||||||
if (self instanceof AST_Directive && self.value == "use asm" && stream.parent() instanceof AST_Scope) {
|
if (self instanceof AST_Scope) {
|
||||||
use_asm = true;
|
active_scope = self;
|
||||||
|
}
|
||||||
|
else if (!use_asm && self instanceof AST_Directive && self.value == "use asm") {
|
||||||
|
use_asm = active_scope;
|
||||||
}
|
}
|
||||||
function doit() {
|
function doit() {
|
||||||
self.add_comments(stream);
|
self.add_comments(stream);
|
||||||
@@ -520,10 +530,11 @@ function OutputStream(options) {
|
|||||||
doit();
|
doit();
|
||||||
}
|
}
|
||||||
stream.pop_node();
|
stream.pop_node();
|
||||||
if (self instanceof AST_Scope) {
|
if (self === use_asm) {
|
||||||
use_asm = prev_use_asm;
|
use_asm = null;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
AST_Node.DEFMETHOD("_print", AST_Node.prototype.print);
|
||||||
|
|
||||||
AST_Node.DEFMETHOD("print_to_string", function(options){
|
AST_Node.DEFMETHOD("print_to_string", function(options){
|
||||||
var s = OutputStream(options);
|
var s = OutputStream(options);
|
||||||
@@ -559,8 +570,8 @@ function OutputStream(options) {
|
|||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (comments.length > 0 && output.pos() == 0) {
|
if (output.pos() == 0) {
|
||||||
if (output.option("shebang") && comments[0].type == "comment5") {
|
if (comments.length > 0 && output.option("shebang") && comments[0].type == "comment5") {
|
||||||
output.print("#!" + comments.shift().value + "\n");
|
output.print("#!" + comments.shift().value + "\n");
|
||||||
output.indent();
|
output.indent();
|
||||||
}
|
}
|
||||||
@@ -621,6 +632,13 @@ function OutputStream(options) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (output.option('webkit')) {
|
||||||
|
var p = output.parent();
|
||||||
|
if (p instanceof AST_PropAccess && p.expression === this) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (output.option('wrap_iife')) {
|
if (output.option('wrap_iife')) {
|
||||||
var p = output.parent();
|
var p = output.parent();
|
||||||
return p instanceof AST_Call && p.expression === this;
|
return p instanceof AST_Call && p.expression === this;
|
||||||
@@ -634,13 +652,17 @@ function OutputStream(options) {
|
|||||||
return p instanceof AST_PropAccess && p.expression === this;
|
return p instanceof AST_PropAccess && p.expression === this;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
PARENS(AST_ClassExpression, function(output){
|
||||||
|
return output.parent() instanceof AST_SimpleStatement;
|
||||||
|
});
|
||||||
|
|
||||||
// same goes for an object literal, because otherwise it would be
|
// same goes for an object literal, because otherwise it would be
|
||||||
// interpreted as a block of code.
|
// interpreted as a block of code.
|
||||||
PARENS(AST_Object, function(output){
|
PARENS(AST_Object, function(output){
|
||||||
return first_in_statement(output);
|
return first_in_statement(output);
|
||||||
});
|
});
|
||||||
|
|
||||||
PARENS([ AST_Unary, AST_Undefined ], function(output){
|
PARENS(AST_Unary, function(output){
|
||||||
var p = output.parent();
|
var p = output.parent();
|
||||||
return p instanceof AST_PropAccess && p.expression === this
|
return p instanceof AST_PropAccess && p.expression === this
|
||||||
|| p instanceof AST_Call && p.expression === this
|
|| p instanceof AST_Call && p.expression === this
|
||||||
@@ -652,19 +674,26 @@ function OutputStream(options) {
|
|||||||
&& this.operator !== "--";
|
&& this.operator !== "--";
|
||||||
});
|
});
|
||||||
|
|
||||||
PARENS(AST_Seq, function(output){
|
PARENS(AST_Await, function(output){
|
||||||
var p = output.parent();
|
var p = output.parent();
|
||||||
return p instanceof AST_Call // (foo, bar)() or foo(1, (2, 3), 4)
|
return p instanceof AST_PropAccess && p.expression === this
|
||||||
|| p instanceof AST_Unary // !(foo, bar, baz)
|
|| p instanceof AST_Call && p.expression === this;
|
||||||
|| p instanceof AST_Binary // 1 + (2, 3) + 4 ==> 8
|
});
|
||||||
|| p instanceof AST_VarDef // var a = (1, 2), b = a + a; ==> b == 4
|
|
||||||
|| p instanceof AST_PropAccess // (1, {foo:2}).foo or (1, {foo:2})["foo"] ==> 2
|
PARENS(AST_Sequence, function(output){
|
||||||
|| p instanceof AST_Array // [ 1, (2, 3), 4 ] ==> [ 1, 3, 4 ]
|
var p = output.parent();
|
||||||
|| p instanceof AST_ObjectProperty // { foo: (1, 2) }.foo ==> 2
|
return p instanceof AST_Call // (foo, bar)() or foo(1, (2, 3), 4)
|
||||||
|| p instanceof AST_Conditional /* (false, true) ? (a = 10, b = 20) : (c = 30)
|
|| p instanceof AST_Unary // !(foo, bar, baz)
|
||||||
* ==> 20 (side effect, set a := 10 and b := 20) */
|
|| p instanceof AST_Binary // 1 + (2, 3) + 4 ==> 8
|
||||||
|| p instanceof AST_Arrow // x => (x, x)
|
|| p instanceof AST_VarDef // var a = (1, 2), b = a + a; ==> b == 4
|
||||||
|| p instanceof AST_DefaultAssign // x => (x = (0, function(){}))
|
|| p instanceof AST_PropAccess // (1, {foo:2}).foo or (1, {foo:2})["foo"] ==> 2
|
||||||
|
|| p instanceof AST_Array // [ 1, (2, 3), 4 ] ==> [ 1, 3, 4 ]
|
||||||
|
|| p instanceof AST_ObjectProperty // { foo: (1, 2) }.foo ==> 2
|
||||||
|
|| p instanceof AST_Conditional /* (false, true) ? (a = 10, b = 20) : (c = 30)
|
||||||
|
* ==> 20 (side effect, set a := 10 and b := 20) */
|
||||||
|
|| p instanceof AST_Arrow // x => (x, x)
|
||||||
|
|| p instanceof AST_DefaultAssign // x => (x = (0, function(){}))
|
||||||
|
|| p instanceof AST_Expansion // [...(a, b)]
|
||||||
;
|
;
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -718,14 +747,15 @@ function OutputStream(options) {
|
|||||||
// parens around it too, otherwise the call will be
|
// parens around it too, otherwise the call will be
|
||||||
// interpreted as passing the arguments to the upper New
|
// interpreted as passing the arguments to the upper New
|
||||||
// expression.
|
// expression.
|
||||||
try {
|
var parens = false;
|
||||||
this.walk(new TreeWalker(function(node){
|
this.walk(new TreeWalker(function(node) {
|
||||||
if (node instanceof AST_Call) throw p;
|
if (parens || node instanceof AST_Scope) return true;
|
||||||
}));
|
if (node instanceof AST_Call) {
|
||||||
} catch(ex) {
|
parens = true;
|
||||||
if (ex !== p) throw ex;
|
return true;
|
||||||
return true;
|
}
|
||||||
}
|
}));
|
||||||
|
return parens;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -761,7 +791,7 @@ function OutputStream(options) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
PARENS([ AST_Assign, AST_Conditional ], function (output){
|
PARENS([ AST_Assign, AST_Conditional ], function(output){
|
||||||
var p = output.parent();
|
var p = output.parent();
|
||||||
// !(a = false) → true
|
// !(a = false) → true
|
||||||
if (p instanceof AST_Unary)
|
if (p instanceof AST_Unary)
|
||||||
@@ -797,17 +827,15 @@ function OutputStream(options) {
|
|||||||
|
|
||||||
DEFPRINT(AST_Destructuring, function (self, output) {
|
DEFPRINT(AST_Destructuring, function (self, output) {
|
||||||
output.print(self.is_array ? "[" : "{");
|
output.print(self.is_array ? "[" : "{");
|
||||||
var first = true;
|
|
||||||
var len = self.names.length;
|
var len = self.names.length;
|
||||||
self.names.forEach(function (name, i) {
|
self.names.forEach(function (name, i) {
|
||||||
if (first) first = false; else { output.comma(); output.space(); }
|
if (i > 0) output.comma();
|
||||||
name.print(output);
|
name.print(output);
|
||||||
// If the final element is a hole, we need to make sure it
|
// If the final element is a hole, we need to make sure it
|
||||||
// doesn't look like a trailing comma, by inserting an actual
|
// doesn't look like a trailing comma, by inserting an actual
|
||||||
// trailing comma.
|
// trailing comma.
|
||||||
if (i === len - 1 && name instanceof AST_Hole)
|
if (i == len - 1 && name instanceof AST_Hole) output.comma();
|
||||||
output.comma();
|
});
|
||||||
})
|
|
||||||
output.print(self.is_array ? "]" : "}");
|
output.print(self.is_array ? "]" : "}");
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -904,7 +932,7 @@ function OutputStream(options) {
|
|||||||
output.print("for");
|
output.print("for");
|
||||||
output.space();
|
output.space();
|
||||||
output.with_parens(function(){
|
output.with_parens(function(){
|
||||||
if (self.init && !(self.init instanceof AST_EmptyStatement)) {
|
if (self.init) {
|
||||||
if (self.init instanceof AST_Definitions) {
|
if (self.init instanceof AST_Definitions) {
|
||||||
self.init.print(output);
|
self.init.print(output);
|
||||||
} else {
|
} else {
|
||||||
@@ -960,8 +988,12 @@ function OutputStream(options) {
|
|||||||
AST_Lambda.DEFMETHOD("_do_print", function(output, nokeyword){
|
AST_Lambda.DEFMETHOD("_do_print", function(output, nokeyword){
|
||||||
var self = this;
|
var self = this;
|
||||||
if (!nokeyword) {
|
if (!nokeyword) {
|
||||||
|
if (self.async) {
|
||||||
|
output.print("async");
|
||||||
|
output.space();
|
||||||
|
}
|
||||||
output.print("function");
|
output.print("function");
|
||||||
if (this.is_generator) {
|
if (self.is_generator) {
|
||||||
output.star();
|
output.star();
|
||||||
}
|
}
|
||||||
if (self.name) {
|
if (self.name) {
|
||||||
@@ -1017,6 +1049,10 @@ function OutputStream(options) {
|
|||||||
parent instanceof AST_Unary ||
|
parent instanceof AST_Unary ||
|
||||||
(parent instanceof AST_Call && self === parent.expression);
|
(parent instanceof AST_Call && self === parent.expression);
|
||||||
if (needs_parens) { output.print("(") }
|
if (needs_parens) { output.print("(") }
|
||||||
|
if (self.async) {
|
||||||
|
output.print("async");
|
||||||
|
output.space();
|
||||||
|
}
|
||||||
if (self.argnames.length === 1 && self.argnames[0] instanceof AST_Symbol) {
|
if (self.argnames.length === 1 && self.argnames[0] instanceof AST_Symbol) {
|
||||||
self.argnames[0].print(output);
|
self.argnames[0].print(output);
|
||||||
} else {
|
} else {
|
||||||
@@ -1031,9 +1067,9 @@ function OutputStream(options) {
|
|||||||
output.print('=>');
|
output.print('=>');
|
||||||
output.space();
|
output.space();
|
||||||
if (self.body instanceof AST_Node) {
|
if (self.body instanceof AST_Node) {
|
||||||
this.body.print(output);
|
self.body.print(output);
|
||||||
} else {
|
} else {
|
||||||
print_bracketed(this.body, output);
|
print_bracketed(self.body, output);
|
||||||
}
|
}
|
||||||
if (needs_parens) { output.print(")") }
|
if (needs_parens) { output.print(")") }
|
||||||
});
|
});
|
||||||
@@ -1065,6 +1101,22 @@ function OutputStream(options) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
DEFPRINT(AST_Await, function(self, output){
|
||||||
|
output.print("await");
|
||||||
|
output.space();
|
||||||
|
var e = self.expression;
|
||||||
|
var parens = !(
|
||||||
|
e instanceof AST_Call
|
||||||
|
|| e instanceof AST_SymbolRef
|
||||||
|
|| e instanceof AST_PropAccess
|
||||||
|
|| e instanceof AST_Unary
|
||||||
|
|| e instanceof AST_Constant
|
||||||
|
);
|
||||||
|
if (parens) output.print("(");
|
||||||
|
self.expression.print(output);
|
||||||
|
if (parens) output.print(")");
|
||||||
|
});
|
||||||
|
|
||||||
/* -----[ loop control ]----- */
|
/* -----[ loop control ]----- */
|
||||||
AST_LoopControl.DEFMETHOD("_do_print", function(output, kind){
|
AST_LoopControl.DEFMETHOD("_do_print", function(output, kind){
|
||||||
output.print(kind);
|
output.print(kind);
|
||||||
@@ -1085,7 +1137,7 @@ function OutputStream(options) {
|
|||||||
function make_then(self, output) {
|
function make_then(self, output) {
|
||||||
var b = self.body;
|
var b = self.body;
|
||||||
if (output.option("bracketize")
|
if (output.option("bracketize")
|
||||||
|| !output.option("screw_ie8") && b instanceof AST_Do)
|
|| output.option("ie8") && b instanceof AST_Do)
|
||||||
return make_block(b, output);
|
return make_block(b, output);
|
||||||
// The squeezer replaces "block"-s that contain only a single
|
// The squeezer replaces "block"-s that contain only a single
|
||||||
// statement with the statement itself; technically, the AST
|
// statement with the statement itself; technically, the AST
|
||||||
@@ -1139,24 +1191,24 @@ function OutputStream(options) {
|
|||||||
self.expression.print(output);
|
self.expression.print(output);
|
||||||
});
|
});
|
||||||
output.space();
|
output.space();
|
||||||
if (self.body.length > 0) output.with_block(function(){
|
var last = self.body.length - 1;
|
||||||
self.body.forEach(function(stmt, i){
|
if (last < 0) output.print("{}");
|
||||||
if (i) output.newline();
|
else output.with_block(function(){
|
||||||
|
self.body.forEach(function(branch, i){
|
||||||
output.indent(true);
|
output.indent(true);
|
||||||
stmt.print(output);
|
branch.print(output);
|
||||||
|
if (i < last && branch.body.length > 0)
|
||||||
|
output.newline();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
else output.print("{}");
|
|
||||||
});
|
});
|
||||||
AST_SwitchBranch.DEFMETHOD("_do_print_body", function(output){
|
AST_SwitchBranch.DEFMETHOD("_do_print_body", function(output){
|
||||||
if (this.body.length > 0) {
|
output.newline();
|
||||||
|
this.body.forEach(function(stmt){
|
||||||
|
output.indent();
|
||||||
|
stmt.print(output);
|
||||||
output.newline();
|
output.newline();
|
||||||
this.body.forEach(function(stmt){
|
});
|
||||||
output.indent();
|
|
||||||
stmt.print(output);
|
|
||||||
output.newline();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_Default, function(self, output){
|
DEFPRINT(AST_Default, function(self, output){
|
||||||
output.print("default:");
|
output.print("default:");
|
||||||
@@ -1233,17 +1285,20 @@ function OutputStream(options) {
|
|||||||
output.space();
|
output.space();
|
||||||
}
|
}
|
||||||
if (self.imported_names) {
|
if (self.imported_names) {
|
||||||
output.print("{");
|
if (self.imported_names.length === 1 && self.imported_names[0].foreign_name.name === "*") {
|
||||||
self.imported_names.forEach(function(name_import, i) {
|
self.imported_names[0].print(output);
|
||||||
output.space();
|
} else {
|
||||||
name_import.print(output);
|
output.print("{");
|
||||||
if (i < self.imported_names.length - 1) {
|
self.imported_names.forEach(function (name_import, i) {
|
||||||
output.print(",");
|
|
||||||
output.space();
|
output.space();
|
||||||
}
|
name_import.print(output);
|
||||||
});
|
if (i < self.imported_names.length - 1) {
|
||||||
output.space();
|
output.print(",");
|
||||||
output.print("}");
|
}
|
||||||
|
});
|
||||||
|
output.space();
|
||||||
|
output.print("}");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (self.imported_name || self.imported_names) {
|
if (self.imported_name || self.imported_names) {
|
||||||
output.space();
|
output.space();
|
||||||
@@ -1254,17 +1309,26 @@ function OutputStream(options) {
|
|||||||
output.semicolon();
|
output.semicolon();
|
||||||
});
|
});
|
||||||
|
|
||||||
DEFPRINT(AST_NameImport, function(self, output) {
|
DEFPRINT(AST_NameMapping, function(self, output) {
|
||||||
|
var is_import = output.parent() instanceof AST_Import;
|
||||||
var definition = self.name.definition();
|
var definition = self.name.definition();
|
||||||
var names_are_different =
|
var names_are_different =
|
||||||
(definition && definition.mangled_name || self.name.name) !==
|
(definition && definition.mangled_name || self.name.name) !==
|
||||||
self.foreign_name.name;
|
self.foreign_name.name;
|
||||||
if (names_are_different) {
|
if (names_are_different) {
|
||||||
output.print(self.foreign_name.name);
|
if (is_import) {
|
||||||
|
output.print(self.foreign_name.name);
|
||||||
|
} else {
|
||||||
|
self.name.print(output);
|
||||||
|
}
|
||||||
output.space();
|
output.space();
|
||||||
output.print("as");
|
output.print("as");
|
||||||
output.space();
|
output.space();
|
||||||
self.name.print(output);
|
if (is_import) {
|
||||||
|
self.name.print(output);
|
||||||
|
} else {
|
||||||
|
output.print(self.foreign_name.name);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
self.name.print(output);
|
self.name.print(output);
|
||||||
}
|
}
|
||||||
@@ -1277,28 +1341,48 @@ function OutputStream(options) {
|
|||||||
output.print("default");
|
output.print("default");
|
||||||
output.space();
|
output.space();
|
||||||
}
|
}
|
||||||
if (self.exported_value) {
|
if (self.exported_names) {
|
||||||
|
if (self.exported_names.length === 1 && self.exported_names[0].name.name === "*") {
|
||||||
|
self.exported_names[0].print(output);
|
||||||
|
} else {
|
||||||
|
output.print("{");
|
||||||
|
self.exported_names.forEach(function(name_export, i) {
|
||||||
|
output.space();
|
||||||
|
name_export.print(output);
|
||||||
|
if (i < self.exported_names.length - 1) {
|
||||||
|
output.print(",");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
output.space();
|
||||||
|
output.print("}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (self.exported_value) {
|
||||||
self.exported_value.print(output);
|
self.exported_value.print(output);
|
||||||
} else if (self.exported_definition) {
|
} else if (self.exported_definition) {
|
||||||
self.exported_definition.print(output);
|
self.exported_definition.print(output);
|
||||||
}
|
}
|
||||||
|
if (self.module_name) {
|
||||||
|
output.space();
|
||||||
|
output.print("from");
|
||||||
|
output.space();
|
||||||
|
self.module_name.print(output);
|
||||||
|
}
|
||||||
output.semicolon();
|
output.semicolon();
|
||||||
});
|
});
|
||||||
|
|
||||||
function parenthesize_for_noin(node, output, noin) {
|
function parenthesize_for_noin(node, output, noin) {
|
||||||
if (!noin) node.print(output);
|
var parens = false;
|
||||||
else try {
|
// need to take some precautions here:
|
||||||
// need to take some precautions here:
|
// https://github.com/mishoo/UglifyJS2/issues/60
|
||||||
// https://github.com/mishoo/UglifyJS2/issues/60
|
if (noin) node.walk(new TreeWalker(function(node) {
|
||||||
node.walk(new TreeWalker(function(node){
|
if (parens || node instanceof AST_Scope) return true;
|
||||||
if (node instanceof AST_Binary && node.operator == "in")
|
if (node instanceof AST_Binary && node.operator == "in") {
|
||||||
throw output;
|
parens = true;
|
||||||
}));
|
return true;
|
||||||
node.print(output);
|
}
|
||||||
} catch(ex) {
|
}));
|
||||||
if (ex !== output) throw ex;
|
node.print(output, parens);
|
||||||
node.print(output, true);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
DEFPRINT(AST_VarDef, function(self, output){
|
DEFPRINT(AST_VarDef, function(self, output){
|
||||||
@@ -1318,6 +1402,9 @@ function OutputStream(options) {
|
|||||||
self.expression.print(output);
|
self.expression.print(output);
|
||||||
if (self instanceof AST_New && !need_constructor_parens(self, output))
|
if (self instanceof AST_New && !need_constructor_parens(self, output))
|
||||||
return;
|
return;
|
||||||
|
if (self.expression instanceof AST_Call || self.expression instanceof AST_Lambda) {
|
||||||
|
output.add_mapping(self.start);
|
||||||
|
}
|
||||||
output.with_parens(function(){
|
output.with_parens(function(){
|
||||||
self.args.forEach(function(expr, i){
|
self.args.forEach(function(expr, i){
|
||||||
if (i) output.comma();
|
if (i) output.comma();
|
||||||
@@ -1331,18 +1418,19 @@ function OutputStream(options) {
|
|||||||
AST_Call.prototype._codegen(self, output);
|
AST_Call.prototype._codegen(self, output);
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Seq.DEFMETHOD("_do_print", function(output){
|
AST_Sequence.DEFMETHOD("_do_print", function(output){
|
||||||
this.car.print(output);
|
this.expressions.forEach(function(node, index) {
|
||||||
if (this.cdr) {
|
if (index > 0) {
|
||||||
output.comma();
|
output.comma();
|
||||||
if (output.should_break()) {
|
if (output.should_break()) {
|
||||||
output.newline();
|
output.newline();
|
||||||
output.indent();
|
output.indent();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
this.cdr.print(output);
|
node.print(output);
|
||||||
}
|
});
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_Seq, function(self, output){
|
DEFPRINT(AST_Sequence, function(self, output){
|
||||||
self._do_print(output);
|
self._do_print(output);
|
||||||
// var p = output.parent();
|
// var p = output.parent();
|
||||||
// if (p instanceof AST_Statement) {
|
// if (p instanceof AST_Statement) {
|
||||||
@@ -1356,15 +1444,23 @@ function OutputStream(options) {
|
|||||||
DEFPRINT(AST_Dot, function(self, output){
|
DEFPRINT(AST_Dot, function(self, output){
|
||||||
var expr = self.expression;
|
var expr = self.expression;
|
||||||
expr.print(output);
|
expr.print(output);
|
||||||
if (expr instanceof AST_Number && expr.getValue() >= 0) {
|
var prop = self.property;
|
||||||
if (!/[xa-f.)]/i.test(output.last())) {
|
if (output.option("ie8") && RESERVED_WORDS(prop)) {
|
||||||
output.print(".");
|
output.print("[");
|
||||||
|
output.add_mapping(self.end);
|
||||||
|
output.print_string(prop);
|
||||||
|
output.print("]");
|
||||||
|
} else {
|
||||||
|
if (expr instanceof AST_Number && expr.getValue() >= 0) {
|
||||||
|
if (!/[xa-f.)]/i.test(output.last())) {
|
||||||
|
output.print(".");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
output.print(".");
|
||||||
|
// the name after dot would be mapped about here.
|
||||||
|
output.add_mapping(self.end);
|
||||||
|
output.print_name(prop);
|
||||||
}
|
}
|
||||||
output.print(".");
|
|
||||||
// the name after dot would be mapped about here.
|
|
||||||
output.add_mapping(self.end);
|
|
||||||
output.print_name(self.property);
|
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_Sub, function(self, output){
|
DEFPRINT(AST_Sub, function(self, output){
|
||||||
self.expression.print(output);
|
self.expression.print(output);
|
||||||
@@ -1463,10 +1559,24 @@ function OutputStream(options) {
|
|||||||
output.space();
|
output.space();
|
||||||
}
|
}
|
||||||
if (self.extends) {
|
if (self.extends) {
|
||||||
|
var parens = (
|
||||||
|
!(self.extends instanceof AST_SymbolRef)
|
||||||
|
&& !(self.extends instanceof AST_PropAccess)
|
||||||
|
&& !(self.extends instanceof AST_ClassExpression)
|
||||||
|
&& !(self.extends instanceof AST_Function)
|
||||||
|
);
|
||||||
output.print("extends");
|
output.print("extends");
|
||||||
output.space();
|
if (parens) {
|
||||||
|
output.print("(");
|
||||||
|
} else {
|
||||||
|
output.space();
|
||||||
|
}
|
||||||
self.extends.print(output);
|
self.extends.print(output);
|
||||||
output.space();
|
if (parens) {
|
||||||
|
output.print(")");
|
||||||
|
} else {
|
||||||
|
output.space();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (self.properties.length > 0) output.with_block(function(){
|
if (self.properties.length > 0) output.with_block(function(){
|
||||||
self.properties.forEach(function(prop, i){
|
self.properties.forEach(function(prop, i){
|
||||||
@@ -1483,7 +1593,8 @@ function OutputStream(options) {
|
|||||||
DEFPRINT(AST_NewTarget, function(self, output) {
|
DEFPRINT(AST_NewTarget, function(self, output) {
|
||||||
output.print("new.target");
|
output.print("new.target");
|
||||||
});
|
});
|
||||||
AST_ObjectProperty.DEFMETHOD("print_property_name", function(key, quote, output) {
|
|
||||||
|
function print_property_name(key, quote, output) {
|
||||||
if (output.option("quote_keys")) {
|
if (output.option("quote_keys")) {
|
||||||
output.print_string(key + "");
|
output.print_string(key + "");
|
||||||
} else if ((typeof key == "number"
|
} else if ((typeof key == "number"
|
||||||
@@ -1491,7 +1602,7 @@ function OutputStream(options) {
|
|||||||
&& +key + "" == key)
|
&& +key + "" == key)
|
||||||
&& parseFloat(key) >= 0) {
|
&& parseFloat(key) >= 0) {
|
||||||
output.print(make_num(key));
|
output.print(make_num(key));
|
||||||
} else if (RESERVED_WORDS(key) ? output.option("screw_ie8") : is_identifier_string(key)) {
|
} else if (RESERVED_WORDS(key) ? !output.option("ie8") : is_identifier_string(key)) {
|
||||||
if (quote && output.option("keep_quoted_props")) {
|
if (quote && output.option("keep_quoted_props")) {
|
||||||
output.print_string(key, quote);
|
output.print_string(key, quote);
|
||||||
} else {
|
} else {
|
||||||
@@ -1500,7 +1611,8 @@ function OutputStream(options) {
|
|||||||
} else {
|
} else {
|
||||||
output.print_string(key, quote);
|
output.print_string(key, quote);
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
|
||||||
DEFPRINT(AST_ObjectKeyVal, function(self, output){
|
DEFPRINT(AST_ObjectKeyVal, function(self, output){
|
||||||
function get_name(self) {
|
function get_name(self) {
|
||||||
var def = self.definition();
|
var def = self.definition();
|
||||||
@@ -1513,7 +1625,7 @@ function OutputStream(options) {
|
|||||||
is_identifier_string(self.key) &&
|
is_identifier_string(self.key) &&
|
||||||
get_name(self.value) === self.key
|
get_name(self.value) === self.key
|
||||||
) {
|
) {
|
||||||
self.print_property_name(self.key, self.quote, output);
|
print_property_name(self.key, self.quote, output);
|
||||||
|
|
||||||
} else if (allowShortHand &&
|
} else if (allowShortHand &&
|
||||||
self.value instanceof AST_DefaultAssign &&
|
self.value instanceof AST_DefaultAssign &&
|
||||||
@@ -1521,12 +1633,14 @@ function OutputStream(options) {
|
|||||||
is_identifier_string(self.key) &&
|
is_identifier_string(self.key) &&
|
||||||
get_name(self.value.left) === self.key
|
get_name(self.value.left) === self.key
|
||||||
) {
|
) {
|
||||||
self.print_property_name(self.key, self.quote, output);
|
print_property_name(self.key, self.quote, output);
|
||||||
|
output.space();
|
||||||
output.print("=");
|
output.print("=");
|
||||||
|
output.space();
|
||||||
self.value.right.print(output);
|
self.value.right.print(output);
|
||||||
} else {
|
} else {
|
||||||
if (!(self.key instanceof AST_Node)) {
|
if (!(self.key instanceof AST_Node)) {
|
||||||
self.print_property_name(self.key, self.quote, output);
|
print_property_name(self.key, self.quote, output);
|
||||||
} else {
|
} else {
|
||||||
output.with_square(function() {
|
output.with_square(function() {
|
||||||
self.key.print(output);
|
self.key.print(output);
|
||||||
@@ -1536,15 +1650,18 @@ function OutputStream(options) {
|
|||||||
self.value.print(output);
|
self.value.print(output);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
AST_ObjectProperty.DEFMETHOD("_print_getter_setter", function(type, self, output) {
|
AST_ObjectProperty.DEFMETHOD("_print_getter_setter", function(type, output) {
|
||||||
|
var self = this;
|
||||||
if (self.static) {
|
if (self.static) {
|
||||||
output.print("static");
|
output.print("static");
|
||||||
output.space();
|
output.space();
|
||||||
}
|
}
|
||||||
output.print(type);
|
if (type) {
|
||||||
output.space();
|
output.print(type);
|
||||||
|
output.space();
|
||||||
|
}
|
||||||
if (self.key instanceof AST_SymbolMethod) {
|
if (self.key instanceof AST_SymbolMethod) {
|
||||||
self.print_property_name(self.key.name, self.quote, output);
|
print_property_name(self.key.name, self.quote, output);
|
||||||
} else {
|
} else {
|
||||||
output.with_square(function() {
|
output.with_square(function() {
|
||||||
self.key.print(output);
|
self.key.print(output);
|
||||||
@@ -1553,28 +1670,13 @@ function OutputStream(options) {
|
|||||||
self.value._do_print(output, true);
|
self.value._do_print(output, true);
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_ObjectSetter, function(self, output){
|
DEFPRINT(AST_ObjectSetter, function(self, output){
|
||||||
self._print_getter_setter("set", self, output);
|
self._print_getter_setter("set", output);
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_ObjectGetter, function(self, output){
|
DEFPRINT(AST_ObjectGetter, function(self, output){
|
||||||
self._print_getter_setter("get", self, output);
|
self._print_getter_setter("get", output);
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_ConciseMethod, function(self, output){
|
DEFPRINT(AST_ConciseMethod, function(self, output){
|
||||||
if (self.static) {
|
self._print_getter_setter(self.is_generator && "*" || self.async && "async", output);
|
||||||
output.print("static");
|
|
||||||
output.space();
|
|
||||||
}
|
|
||||||
if (self.is_generator) {
|
|
||||||
output.print("*");
|
|
||||||
}
|
|
||||||
output.space();
|
|
||||||
if (self.key instanceof AST_SymbolMethod) {
|
|
||||||
self.print_property_name(self.key.name, self.quote, output);
|
|
||||||
} else {
|
|
||||||
output.with_square(function() {
|
|
||||||
self.key.print(output);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
self.value._do_print(output, true);
|
|
||||||
});
|
});
|
||||||
AST_Symbol.DEFMETHOD("_do_print", function(output){
|
AST_Symbol.DEFMETHOD("_do_print", function(output){
|
||||||
var def = this.definition();
|
var def = this.definition();
|
||||||
@@ -1583,19 +1685,7 @@ function OutputStream(options) {
|
|||||||
DEFPRINT(AST_Symbol, function (self, output) {
|
DEFPRINT(AST_Symbol, function (self, output) {
|
||||||
self._do_print(output);
|
self._do_print(output);
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_SymbolDeclaration, function(self, output){
|
|
||||||
self._do_print(output);
|
|
||||||
});
|
|
||||||
DEFPRINT(AST_Undefined, function(self, output){
|
|
||||||
output.print("void 0");
|
|
||||||
});
|
|
||||||
DEFPRINT(AST_Hole, noop);
|
DEFPRINT(AST_Hole, noop);
|
||||||
DEFPRINT(AST_Infinity, function(self, output){
|
|
||||||
output.print("Infinity");
|
|
||||||
});
|
|
||||||
DEFPRINT(AST_NaN, function(self, output){
|
|
||||||
output.print("NaN");
|
|
||||||
});
|
|
||||||
DEFPRINT(AST_This, function(self, output){
|
DEFPRINT(AST_This, function(self, output){
|
||||||
output.print("this");
|
output.print("this");
|
||||||
});
|
});
|
||||||
@@ -1616,46 +1706,13 @@ function OutputStream(options) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
function regexp_safe_literal(code) {
|
|
||||||
return [
|
|
||||||
0x5c , // \
|
|
||||||
0x2f , // /
|
|
||||||
0x2e , // .
|
|
||||||
0x2b , // +
|
|
||||||
0x2a , // *
|
|
||||||
0x3f , // ?
|
|
||||||
0x28 , // (
|
|
||||||
0x29 , // )
|
|
||||||
0x5b , // [
|
|
||||||
0x5d , // ]
|
|
||||||
0x7b , // {
|
|
||||||
0x7d , // }
|
|
||||||
0x24 , // $
|
|
||||||
0x5e , // ^
|
|
||||||
0x3a , // :
|
|
||||||
0x7c , // |
|
|
||||||
0x21 , // !
|
|
||||||
0x0a , // \n
|
|
||||||
0x0d , // \r
|
|
||||||
0x00 , // \0
|
|
||||||
0xfeff , // Unicode BOM
|
|
||||||
0x2028 , // unicode "line separator"
|
|
||||||
0x2029 , // unicode "paragraph separator"
|
|
||||||
].indexOf(code) < 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
DEFPRINT(AST_RegExp, function(self, output){
|
DEFPRINT(AST_RegExp, function(self, output){
|
||||||
var str = self.getValue().toString();
|
var regexp = self.getValue();
|
||||||
if (output.option("ascii_only")) {
|
var str = regexp.toString();
|
||||||
str = output.to_ascii(str);
|
if (regexp.raw_source) {
|
||||||
} else if (output.option("unescape_regexps")) {
|
str = "/" + regexp.raw_source + str.slice(str.lastIndexOf("/"));
|
||||||
str = str.split("\\\\").map(function(str){
|
|
||||||
return str.replace(/\\u[0-9a-fA-F]{4}|\\x[0-9a-fA-F]{2}/g, function(s){
|
|
||||||
var code = parseInt(s.substr(2), 16);
|
|
||||||
return regexp_safe_literal(code) ? String.fromCharCode(code) : s;
|
|
||||||
});
|
|
||||||
}).join("\\\\");
|
|
||||||
}
|
}
|
||||||
|
str = output.to_utf8(str);
|
||||||
output.print(str);
|
output.print(str);
|
||||||
var p = output.parent();
|
var p = output.parent();
|
||||||
if (p instanceof AST_Binary && /^in/.test(p.operator) && p.left === self)
|
if (p instanceof AST_Binary && /^in/.test(p.operator) && p.left === self)
|
||||||
|
|||||||
858
lib/parse.js
858
lib/parse.js
File diff suppressed because it is too large
Load Diff
@@ -43,17 +43,26 @@
|
|||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
function find_builtins() {
|
function find_builtins(reserved) {
|
||||||
|
|
||||||
// Compatibility fix for some standard defined globals not defined on every js environment
|
// Compatibility fix for some standard defined globals not defined on every js environment
|
||||||
var new_globals = ["Symbol", "Map", "Promise", "Proxy", "Reflect", "Set", "WeakMap", "WeakSet"];
|
var new_globals = ["Symbol", "Map", "Promise", "Proxy", "Reflect", "Set", "WeakMap", "WeakSet"];
|
||||||
var objects = {};
|
var objects = {};
|
||||||
|
var global_ref = typeof global === "object" ? global : self;
|
||||||
|
|
||||||
new_globals.forEach(function (new_global) {
|
new_globals.forEach(function (new_global) {
|
||||||
objects[new_global] = global[new_global] || new Function();
|
objects[new_global] = global_ref[new_global] || new Function();
|
||||||
});
|
});
|
||||||
|
|
||||||
var a = [];
|
// NaN will be included due to Number.NaN
|
||||||
|
[
|
||||||
|
"null",
|
||||||
|
"true",
|
||||||
|
"false",
|
||||||
|
"Infinity",
|
||||||
|
"-Infinity",
|
||||||
|
"undefined",
|
||||||
|
].forEach(add);
|
||||||
[ Object, Array, Function, Number,
|
[ Object, Array, Function, Number,
|
||||||
String, Boolean, Error, Math,
|
String, Boolean, Error, Math,
|
||||||
Date, RegExp, objects.Symbol, ArrayBuffer,
|
Date, RegExp, objects.Symbol, ArrayBuffer,
|
||||||
@@ -72,24 +81,54 @@ function find_builtins() {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
function add(name) {
|
function add(name) {
|
||||||
push_uniq(a, name);
|
push_uniq(reserved, name);
|
||||||
}
|
}
|
||||||
return a;
|
}
|
||||||
|
|
||||||
|
function reserve_quoted_keys(ast, reserved) {
|
||||||
|
function add(name) {
|
||||||
|
push_uniq(reserved, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
ast.walk(new TreeWalker(function(node) {
|
||||||
|
if (node instanceof AST_ObjectKeyVal && node.quote) {
|
||||||
|
add(node.key);
|
||||||
|
} else if (node instanceof AST_ObjectProperty && node.quote) {
|
||||||
|
add(node.key.name);
|
||||||
|
} else if (node instanceof AST_Sub) {
|
||||||
|
addStrings(node.property, add);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
function addStrings(node, add) {
|
||||||
|
node.walk(new TreeWalker(function(node) {
|
||||||
|
if (node instanceof AST_Sequence) {
|
||||||
|
addStrings(node.expressions[node.expressions.length - 1], add);
|
||||||
|
} else if (node instanceof AST_String) {
|
||||||
|
add(node.value);
|
||||||
|
} else if (node instanceof AST_Conditional) {
|
||||||
|
addStrings(node.consequent, add);
|
||||||
|
addStrings(node.alternative, add);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
function mangle_properties(ast, options) {
|
function mangle_properties(ast, options) {
|
||||||
options = defaults(options, {
|
options = defaults(options, {
|
||||||
reserved : null,
|
builtins: false,
|
||||||
cache : null,
|
cache: null,
|
||||||
only_cache : false,
|
debug: false,
|
||||||
regex : null,
|
keep_quoted: false,
|
||||||
ignore_quoted : false,
|
only_cache: false,
|
||||||
debug : false
|
regex: null,
|
||||||
});
|
reserved: null,
|
||||||
|
}, true);
|
||||||
|
|
||||||
var reserved = options.reserved;
|
var reserved = options.reserved;
|
||||||
if (reserved == null)
|
if (!Array.isArray(reserved)) reserved = [];
|
||||||
reserved = find_builtins();
|
if (!options.builtins) find_builtins(reserved);
|
||||||
|
|
||||||
var cache = options.cache;
|
var cache = options.cache;
|
||||||
if (cache == null) {
|
if (cache == null) {
|
||||||
@@ -100,12 +139,11 @@ function mangle_properties(ast, options) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var regex = options.regex;
|
var regex = options.regex;
|
||||||
var ignore_quoted = options.ignore_quoted;
|
|
||||||
|
|
||||||
// note debug is either false (disabled), or a string of the debug suffix to use (enabled).
|
// note debug is either false (disabled), or a string of the debug suffix to use (enabled).
|
||||||
// note debug may be enabled as an empty string, which is falsey. Also treat passing 'true'
|
// note debug may be enabled as an empty string, which is falsey. Also treat passing 'true'
|
||||||
// the same as passing an empty string.
|
// the same as passing an empty string.
|
||||||
var debug = (options.debug !== false);
|
var debug = options.debug !== false;
|
||||||
var debug_name_suffix;
|
var debug_name_suffix;
|
||||||
if (debug) {
|
if (debug) {
|
||||||
debug_name_suffix = (options.debug === true ? "" : options.debug);
|
debug_name_suffix = (options.debug === true ? "" : options.debug);
|
||||||
@@ -113,12 +151,11 @@ function mangle_properties(ast, options) {
|
|||||||
|
|
||||||
var names_to_mangle = [];
|
var names_to_mangle = [];
|
||||||
var unmangleable = [];
|
var unmangleable = [];
|
||||||
var ignored = {};
|
|
||||||
|
|
||||||
// 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_ObjectKeyVal) {
|
||||||
add(node.key, ignore_quoted && node.quote);
|
add(node.key);
|
||||||
}
|
}
|
||||||
else if (node instanceof AST_ObjectProperty) {
|
else if (node instanceof AST_ObjectProperty) {
|
||||||
// setter or getter, since KeyVal is handled above
|
// setter or getter, since KeyVal is handled above
|
||||||
@@ -128,18 +165,14 @@ function mangle_properties(ast, options) {
|
|||||||
add(node.property);
|
add(node.property);
|
||||||
}
|
}
|
||||||
else if (node instanceof AST_Sub) {
|
else if (node instanceof AST_Sub) {
|
||||||
addStrings(node.property, ignore_quoted);
|
addStrings(node.property, add);
|
||||||
}
|
|
||||||
else if (node instanceof AST_ConciseMethod) {
|
|
||||||
add(node.name.name);
|
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
|
||||||
// step 2: transform the tree, renaming properties
|
// step 2: transform the tree, renaming properties
|
||||||
return ast.transform(new TreeTransformer(function(node){
|
return ast.transform(new TreeTransformer(function(node){
|
||||||
if (node instanceof AST_ObjectKeyVal) {
|
if (node instanceof AST_ObjectKeyVal) {
|
||||||
if (!(ignore_quoted && node.quote))
|
node.key = mangle(node.key);
|
||||||
node.key = mangle(node.key);
|
|
||||||
}
|
}
|
||||||
else if (node instanceof AST_ObjectProperty) {
|
else if (node instanceof AST_ObjectProperty) {
|
||||||
// setter or getter
|
// setter or getter
|
||||||
@@ -148,56 +181,31 @@ function mangle_properties(ast, options) {
|
|||||||
else if (node instanceof AST_Dot) {
|
else if (node instanceof AST_Dot) {
|
||||||
node.property = mangle(node.property);
|
node.property = mangle(node.property);
|
||||||
}
|
}
|
||||||
else if (node instanceof AST_Sub) {
|
else if (!options.keep_quoted && node instanceof AST_Sub) {
|
||||||
if (!ignore_quoted)
|
node.property = mangleStrings(node.property);
|
||||||
node.property = mangleStrings(node.property);
|
|
||||||
}
|
}
|
||||||
else if (node instanceof AST_ConciseMethod) {
|
|
||||||
if (should_mangle(node.name.name)) {
|
|
||||||
node.name.name = mangle(node.name.name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// else if (node instanceof AST_String) {
|
|
||||||
// if (should_mangle(node.value)) {
|
|
||||||
// AST_Node.warn(
|
|
||||||
// "Found \"{prop}\" property candidate for mangling in an arbitrary string [{file}:{line},{col}]", {
|
|
||||||
// file : node.start.file,
|
|
||||||
// line : node.start.line,
|
|
||||||
// col : node.start.col,
|
|
||||||
// prop : node.value
|
|
||||||
// }
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
}));
|
}));
|
||||||
|
|
||||||
// only function declarations after this line
|
// only function declarations after this line
|
||||||
|
|
||||||
function can_mangle(name) {
|
function can_mangle(name) {
|
||||||
if (!is_identifier(name)) return false;
|
|
||||||
if (unmangleable.indexOf(name) >= 0) return false;
|
if (unmangleable.indexOf(name) >= 0) return false;
|
||||||
if (reserved.indexOf(name) >= 0) return false;
|
if (reserved.indexOf(name) >= 0) return false;
|
||||||
if (options.only_cache) {
|
if (options.only_cache) {
|
||||||
return cache.props.has(name);
|
return cache.props.has(name);
|
||||||
}
|
}
|
||||||
if (/^[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 (ignore_quoted && name in ignored) return false;
|
|
||||||
if (regex && !regex.test(name)) return false;
|
if (regex && !regex.test(name)) return false;
|
||||||
if (reserved.indexOf(name) >= 0) return false;
|
if (reserved.indexOf(name) >= 0) return false;
|
||||||
return cache.props.has(name)
|
return cache.props.has(name)
|
||||||
|| names_to_mangle.indexOf(name) >= 0;
|
|| names_to_mangle.indexOf(name) >= 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
function add(name, ignore) {
|
function add(name) {
|
||||||
if (ignore) {
|
|
||||||
ignored[name] = true;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (can_mangle(name))
|
if (can_mangle(name))
|
||||||
push_uniq(names_to_mangle, name);
|
push_uniq(names_to_mangle, name);
|
||||||
|
|
||||||
@@ -217,19 +225,16 @@ function mangle_properties(ast, options) {
|
|||||||
// 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_name_suffix + "_";
|
var debug_mangled = "_$" + name + "$" + debug_name_suffix + "_";
|
||||||
|
|
||||||
if (can_mangle(debug_mangled) && !(ignore_quoted && debug_mangled in ignored)) {
|
if (can_mangle(debug_mangled)) {
|
||||||
mangled = debug_mangled;
|
mangled = debug_mangled;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// either debug mode is off, or it is on and we could not use the mangled name
|
// either debug mode is off, or it is on and we could not use the mangled name
|
||||||
if (!mangled) {
|
if (!mangled) {
|
||||||
// note can_mangle() does not check if the name collides with the 'ignored' set
|
|
||||||
// (filled with quoted properties when ignore_quoted set). Make sure we add this
|
|
||||||
// check so we don't collide with a quoted name.
|
|
||||||
do {
|
do {
|
||||||
mangled = base54(++cache.cname);
|
mangled = base54(++cache.cname);
|
||||||
} while (!can_mangle(mangled) || (ignore_quoted && mangled in ignored));
|
} while (!can_mangle(mangled));
|
||||||
}
|
}
|
||||||
|
|
||||||
cache.props.set(name, mangled);
|
cache.props.set(name, mangled);
|
||||||
@@ -237,36 +242,11 @@ function mangle_properties(ast, options) {
|
|||||||
return mangled;
|
return mangled;
|
||||||
}
|
}
|
||||||
|
|
||||||
function addStrings(node, ignore) {
|
|
||||||
var out = {};
|
|
||||||
try {
|
|
||||||
(function walk(node){
|
|
||||||
node.walk(new TreeWalker(function(node){
|
|
||||||
if (node instanceof AST_Seq) {
|
|
||||||
walk(node.cdr);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (node instanceof AST_String) {
|
|
||||||
add(node.value, ignore);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (node instanceof AST_Conditional) {
|
|
||||||
walk(node.consequent);
|
|
||||||
walk(node.alternative);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
throw out;
|
|
||||||
}));
|
|
||||||
})(node);
|
|
||||||
} catch(ex) {
|
|
||||||
if (ex !== out) throw ex;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function mangleStrings(node) {
|
function mangleStrings(node) {
|
||||||
return node.transform(new TreeTransformer(function(node){
|
return node.transform(new TreeTransformer(function(node){
|
||||||
if (node instanceof AST_Seq) {
|
if (node instanceof AST_Sequence) {
|
||||||
node.cdr = mangleStrings(node.cdr);
|
var last = node.expressions.length - 1;
|
||||||
|
node.expressions[last] = mangleStrings(node.expressions[last]);
|
||||||
}
|
}
|
||||||
else if (node instanceof AST_String) {
|
else if (node instanceof AST_String) {
|
||||||
node.value = mangle(node.value);
|
node.value = mangle(node.value);
|
||||||
@@ -278,5 +258,4 @@ function mangle_properties(ast, options) {
|
|||||||
return node;
|
return node;
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
510
lib/scope.js
510
lib/scope.js
@@ -51,7 +51,6 @@ function SymbolDef(scope, index, orig) {
|
|||||||
this.global = false;
|
this.global = false;
|
||||||
this.export = false;
|
this.export = false;
|
||||||
this.mangled_name = null;
|
this.mangled_name = null;
|
||||||
this.object_destructuring_arg = false;
|
|
||||||
this.undeclared = false;
|
this.undeclared = false;
|
||||||
this.index = index;
|
this.index = index;
|
||||||
this.id = SymbolDef.next_id++;
|
this.id = SymbolDef.next_id++;
|
||||||
@@ -65,7 +64,6 @@ SymbolDef.prototype = {
|
|||||||
|
|
||||||
return (this.global && !options.toplevel)
|
return (this.global && !options.toplevel)
|
||||||
|| this.export
|
|| this.export
|
||||||
|| this.object_destructuring_arg
|
|
||||||
|| this.undeclared
|
|| this.undeclared
|
||||||
|| (!options.eval && (this.scope.uses_eval || this.scope.uses_with))
|
|| (!options.eval && (this.scope.uses_eval || this.scope.uses_with))
|
||||||
|| (options.keep_fnames
|
|| (options.keep_fnames
|
||||||
@@ -83,20 +81,29 @@ SymbolDef.prototype = {
|
|||||||
}
|
}
|
||||||
else if (!this.mangled_name && !this.unmangleable(options)) {
|
else if (!this.mangled_name && !this.unmangleable(options)) {
|
||||||
var s = this.scope;
|
var s = this.scope;
|
||||||
if (!options.screw_ie8 && this.orig[0] instanceof AST_SymbolLambda)
|
var sym = this.orig[0];
|
||||||
|
if (options.ie8 && sym instanceof AST_SymbolLambda)
|
||||||
s = s.parent_scope;
|
s = s.parent_scope;
|
||||||
this.mangled_name = s.next_mangled(options, this);
|
var def;
|
||||||
|
if (def = this.redefined()) {
|
||||||
|
this.mangled_name = def.mangled_name || def.name;
|
||||||
|
} else
|
||||||
|
this.mangled_name = s.next_mangled(options, this);
|
||||||
if (this.global && cache) {
|
if (this.global && cache) {
|
||||||
cache.set(this.name, this.mangled_name);
|
cache.set(this.name, this.mangled_name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
redefined: function() {
|
||||||
|
return this.defun && this.defun.variables.get(this.name);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
|
AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
|
||||||
options = defaults(options, {
|
options = defaults(options, {
|
||||||
screw_ie8: true,
|
cache: null,
|
||||||
cache: null
|
ie8: false,
|
||||||
|
safari10: false,
|
||||||
});
|
});
|
||||||
|
|
||||||
// pass 1: setup scope chaining and handle definitions
|
// pass 1: setup scope chaining and handle definitions
|
||||||
@@ -105,32 +112,35 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
|
|||||||
var labels = new Dictionary();
|
var labels = new Dictionary();
|
||||||
var defun = null;
|
var defun = null;
|
||||||
var in_destructuring = null;
|
var in_destructuring = null;
|
||||||
var in_export = false;
|
var for_scopes = [];
|
||||||
var in_block = 0;
|
|
||||||
var tw = new TreeWalker(function(node, descend){
|
var tw = new TreeWalker(function(node, descend){
|
||||||
if (node.is_block_scope()) {
|
if (node.is_block_scope()) {
|
||||||
var save_scope = scope;
|
var save_scope = scope;
|
||||||
scope = new AST_Scope(node);
|
node.block_scope = scope = new AST_Scope(node);
|
||||||
scope.init_scope_vars();
|
scope.init_scope_vars(save_scope);
|
||||||
scope.parent_scope = save_scope;
|
|
||||||
if (!(node instanceof AST_Scope)) {
|
if (!(node instanceof AST_Scope)) {
|
||||||
scope.uses_with = save_scope.uses_with;
|
scope.uses_with = save_scope.uses_with;
|
||||||
scope.uses_eval = save_scope.uses_eval;
|
scope.uses_eval = save_scope.uses_eval;
|
||||||
scope.directives = save_scope.directives;
|
scope.directives = save_scope.directives;
|
||||||
}
|
}
|
||||||
|
if (options.safari10) {
|
||||||
|
if (node instanceof AST_For || node instanceof AST_ForIn) {
|
||||||
|
for_scopes.push(scope);
|
||||||
|
}
|
||||||
|
}
|
||||||
descend();
|
descend();
|
||||||
scope = save_scope;
|
scope = save_scope;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (node instanceof AST_Destructuring && node.is_array === false) {
|
if (node instanceof AST_Destructuring) {
|
||||||
in_destructuring = node; // These don't nest
|
in_destructuring = node; // These don't nest
|
||||||
descend();
|
descend();
|
||||||
in_destructuring = null;
|
in_destructuring = null;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (node instanceof AST_Scope) {
|
if (node instanceof AST_Scope) {
|
||||||
node.init_scope_vars();
|
node.init_scope_vars(scope);
|
||||||
var save_scope = node.parent_scope = scope;
|
var save_scope = scope;
|
||||||
var save_defun = defun;
|
var save_defun = defun;
|
||||||
var save_labels = labels;
|
var save_labels = labels;
|
||||||
defun = scope = node;
|
defun = scope = node;
|
||||||
@@ -141,22 +151,6 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
|
|||||||
labels = save_labels;
|
labels = save_labels;
|
||||||
return true; // don't descend again in TreeWalker
|
return true; // don't descend again in TreeWalker
|
||||||
}
|
}
|
||||||
if (node instanceof AST_Export) {
|
|
||||||
in_export = true;
|
|
||||||
descend();
|
|
||||||
in_export = false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (node instanceof AST_BlockStatement
|
|
||||||
|| node instanceof AST_Switch
|
|
||||||
|| node instanceof AST_Try
|
|
||||||
|| node instanceof AST_Catch
|
|
||||||
|| node instanceof AST_Finally) {
|
|
||||||
in_block++;
|
|
||||||
descend();
|
|
||||||
in_block--;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (node instanceof AST_LabeledStatement) {
|
if (node instanceof AST_LabeledStatement) {
|
||||||
var l = node.label;
|
var l = node.label;
|
||||||
if (labels.has(l.name)) {
|
if (labels.has(l.name)) {
|
||||||
@@ -175,15 +169,12 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
|
|||||||
if (node instanceof AST_Symbol) {
|
if (node instanceof AST_Symbol) {
|
||||||
node.scope = scope;
|
node.scope = scope;
|
||||||
}
|
}
|
||||||
if (node instanceof AST_SymbolFunarg) {
|
|
||||||
node.object_destructuring_arg = !!in_destructuring;
|
|
||||||
}
|
|
||||||
if (node instanceof AST_Label) {
|
if (node instanceof AST_Label) {
|
||||||
node.thedef = node;
|
node.thedef = node;
|
||||||
node.references = [];
|
node.references = [];
|
||||||
}
|
}
|
||||||
if (node instanceof AST_SymbolLambda) {
|
if (node instanceof AST_SymbolLambda) {
|
||||||
defun.def_function(node, in_export, in_block);
|
defun.def_function(node);
|
||||||
}
|
}
|
||||||
else if (node instanceof AST_SymbolDefun) {
|
else if (node instanceof AST_SymbolDefun) {
|
||||||
// Careful here, the scope where this should be defined is
|
// Careful here, the scope where this should be defined is
|
||||||
@@ -195,27 +186,51 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
|
|||||||
while (parent_lambda.is_block_scope()) {
|
while (parent_lambda.is_block_scope()) {
|
||||||
parent_lambda = parent_lambda.parent_scope;
|
parent_lambda = parent_lambda.parent_scope;
|
||||||
}
|
}
|
||||||
(node.scope = parent_lambda).def_function(node, in_export, in_block);
|
mark_export((node.scope = parent_lambda).def_function(node), 1);
|
||||||
}
|
}
|
||||||
else if (node instanceof AST_SymbolClass) {
|
else if (node instanceof AST_SymbolClass) {
|
||||||
defun.def_variable(node, in_export, in_block);
|
mark_export(defun.def_variable(node), 1);
|
||||||
}
|
}
|
||||||
else if (node instanceof AST_SymbolImport) {
|
else if (node instanceof AST_SymbolImport) {
|
||||||
scope.def_variable(node, in_export, in_block);
|
scope.def_variable(node);
|
||||||
}
|
}
|
||||||
else if (node instanceof AST_SymbolDefClass) {
|
else if (node instanceof AST_SymbolDefClass) {
|
||||||
// This deals with the name of the class being available
|
// This deals with the name of the class being available
|
||||||
// inside the class.
|
// inside the class.
|
||||||
(node.scope = defun.parent_scope).def_function(node, in_export, in_block);
|
mark_export((node.scope = defun.parent_scope).def_function(node), 1);
|
||||||
}
|
}
|
||||||
else if (node instanceof AST_SymbolVar
|
else if (node instanceof AST_SymbolVar
|
||||||
|| node instanceof AST_SymbolLet
|
|| node instanceof AST_SymbolLet
|
||||||
|| node instanceof AST_SymbolConst) {
|
|| node instanceof AST_SymbolConst) {
|
||||||
var def = ((node instanceof AST_SymbolBlockDeclaration) ? scope : defun).def_variable(node, in_export, in_block);
|
var def = ((node instanceof AST_SymbolBlockDeclaration) ? scope : defun).def_variable(node);
|
||||||
|
if (!all(def.orig, function(sym) {
|
||||||
|
if (sym === node) return true;
|
||||||
|
if (node instanceof AST_SymbolBlockDeclaration) {
|
||||||
|
return sym instanceof AST_SymbolLambda;
|
||||||
|
}
|
||||||
|
return !(sym instanceof AST_SymbolLet || sym instanceof AST_SymbolConst);
|
||||||
|
})) {
|
||||||
|
js_error(
|
||||||
|
node.name + " redeclared",
|
||||||
|
node.start.file,
|
||||||
|
node.start.line,
|
||||||
|
node.start.col,
|
||||||
|
node.start.pos
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (!(node instanceof AST_SymbolFunarg)) mark_export(def, 2);
|
||||||
def.destructuring = in_destructuring;
|
def.destructuring = in_destructuring;
|
||||||
|
if (defun !== scope) {
|
||||||
|
node.mark_enclosed(options);
|
||||||
|
var def = scope.find_variable(node);
|
||||||
|
if (node.thedef !== def) {
|
||||||
|
node.thedef = def;
|
||||||
|
node.reference(options);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (node instanceof AST_SymbolCatch) {
|
else if (node instanceof AST_SymbolCatch) {
|
||||||
scope.def_variable(node, in_export, in_block);
|
scope.def_variable(node).defun = defun;
|
||||||
}
|
}
|
||||||
else if (node instanceof AST_LabelRef) {
|
else if (node instanceof AST_LabelRef) {
|
||||||
var sym = labels.get(node.name);
|
var sym = labels.get(node.name);
|
||||||
@@ -226,28 +241,32 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
|
|||||||
}));
|
}));
|
||||||
node.thedef = sym;
|
node.thedef = sym;
|
||||||
}
|
}
|
||||||
|
if (!(scope instanceof AST_Toplevel) && (node instanceof AST_Export || node instanceof AST_Import)) {
|
||||||
|
js_error(
|
||||||
|
node.TYPE + " statement may only appear at top level",
|
||||||
|
node.start.file,
|
||||||
|
node.start.line,
|
||||||
|
node.start.col,
|
||||||
|
node.start.pos
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function mark_export(def, level) {
|
||||||
|
if (in_destructuring) {
|
||||||
|
var i = 0;
|
||||||
|
do {
|
||||||
|
level++;
|
||||||
|
} while (tw.parent(i++) !== in_destructuring);
|
||||||
|
}
|
||||||
|
var node = tw.parent(level);
|
||||||
|
def.export = node instanceof AST_Export;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
self.walk(tw);
|
self.walk(tw);
|
||||||
|
|
||||||
// pass 2: find back references and eval
|
// pass 2: find back references and eval
|
||||||
var func = null;
|
self.globals = new Dictionary();
|
||||||
var cls = null;
|
|
||||||
var globals = self.globals = new Dictionary();
|
|
||||||
var tw = new TreeWalker(function(node, descend){
|
var tw = new TreeWalker(function(node, descend){
|
||||||
if (node instanceof AST_Lambda) {
|
|
||||||
var prev_func = func;
|
|
||||||
func = node;
|
|
||||||
descend();
|
|
||||||
func = prev_func;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (node instanceof AST_Class) {
|
|
||||||
var prev_cls = cls;
|
|
||||||
cls = node;
|
|
||||||
descend();
|
|
||||||
cls = prev_cls;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (node instanceof AST_LoopControl && node.label) {
|
if (node instanceof AST_LoopControl && node.label) {
|
||||||
node.label.thedef.references.push(node);
|
node.label.thedef.references.push(node);
|
||||||
return true;
|
return true;
|
||||||
@@ -259,38 +278,62 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
|
|||||||
s.uses_eval = true;
|
s.uses_eval = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var sym = node.scope.find_variable(name);
|
var sym;
|
||||||
if (node.scope instanceof AST_Lambda && name == "arguments") {
|
if (tw.parent() instanceof AST_NameMapping && tw.parent(1).module_name
|
||||||
node.scope.uses_arguments = true;
|
|| !(sym = node.scope.find_variable(name))) {
|
||||||
}
|
|
||||||
if (!sym) {
|
|
||||||
sym = self.def_global(node);
|
sym = self.def_global(node);
|
||||||
|
} else if (sym.scope instanceof AST_Lambda && name == "arguments") {
|
||||||
|
sym.scope.uses_arguments = true;
|
||||||
}
|
}
|
||||||
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
|
||||||
|
var def;
|
||||||
|
if (node instanceof AST_SymbolCatch && (def = node.definition().redefined())) {
|
||||||
|
var s = node.scope;
|
||||||
|
while (s) {
|
||||||
|
push_uniq(s.enclosed, def);
|
||||||
|
if (s === def.scope) break;
|
||||||
|
s = s.parent_scope;
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
self.walk(tw);
|
self.walk(tw);
|
||||||
|
|
||||||
// pass 3: fix up any scoping issue with IE8
|
// pass 3: fix up any scoping issue with IE8
|
||||||
if (!options.screw_ie8) {
|
if (options.ie8) {
|
||||||
self.walk(new TreeWalker(function(node, descend) {
|
self.walk(new TreeWalker(function(node, descend) {
|
||||||
if (node instanceof AST_SymbolCatch) {
|
if (node instanceof AST_SymbolCatch) {
|
||||||
var name = node.name;
|
var name = node.name;
|
||||||
var refs = node.thedef.references;
|
var refs = node.thedef.references;
|
||||||
var scope = node.thedef.scope.parent_scope;
|
var scope = node.thedef.defun;
|
||||||
var def = scope.find_variable(name) || self.globals.get(name) || scope.def_variable(node);
|
var def = scope.find_variable(name) || self.globals.get(name) || scope.def_variable(node);
|
||||||
refs.forEach(function(ref) {
|
refs.forEach(function(ref) {
|
||||||
ref.thedef = def;
|
ref.thedef = def;
|
||||||
ref.reference(options);
|
ref.reference(options);
|
||||||
});
|
});
|
||||||
node.thedef = def;
|
node.thedef = def;
|
||||||
|
node.reference(options);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// pass 4: add symbol definitions to loop scopes
|
||||||
|
// Safari/Webkit bug workaround - loop init let variable shadowing argument.
|
||||||
|
// https://github.com/mishoo/UglifyJS2/issues/1753
|
||||||
|
// https://bugs.webkit.org/show_bug.cgi?id=171041
|
||||||
|
if (options.safari10) {
|
||||||
|
for (var i = 0; i < for_scopes.length; i++) {
|
||||||
|
var scope = for_scopes[i];
|
||||||
|
scope.parent_scope.variables.each(function(def) {
|
||||||
|
push_uniq(scope.enclosed, def);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (options.cache) {
|
if (options.cache) {
|
||||||
this.cname = options.cache.cname;
|
this.cname = options.cache.cname;
|
||||||
}
|
}
|
||||||
@@ -309,45 +352,36 @@ AST_Toplevel.DEFMETHOD("def_global", function(node){
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Scope.DEFMETHOD("init_scope_vars", function(){
|
AST_Scope.DEFMETHOD("init_scope_vars", function(parent_scope){
|
||||||
this.variables = new Dictionary(); // map name to AST_SymbolVar (variables defined in this scope; includes functions)
|
this.variables = new Dictionary(); // map name to AST_SymbolVar (variables defined in this scope; includes functions)
|
||||||
this.functions = new Dictionary(); // map name to AST_SymbolDefun (functions defined in this scope)
|
this.functions = new Dictionary(); // map name to AST_SymbolDefun (functions defined in this scope)
|
||||||
this.uses_with = false; // will be set to true if this or some nested scope uses the `with` statement
|
this.uses_with = false; // will be set to true if this or some nested scope uses the `with` statement
|
||||||
this.uses_eval = false; // will be set to true if this or nested scope uses the global `eval`
|
this.uses_eval = false; // will be set to true if this or nested scope uses the global `eval`
|
||||||
this.parent_scope = null; // the parent scope
|
this.parent_scope = parent_scope; // the parent scope
|
||||||
this.enclosed = []; // a list of variables from this or outer scope(s) that are referenced from this or inner scopes
|
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
|
this.cname = -1; // the current index for mangling functions/variables
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Node.DEFMETHOD("is_block_scope", function(){
|
AST_Node.DEFMETHOD("is_block_scope", return_false);
|
||||||
return false; // Behaviour will be overridden by AST_Block
|
AST_Class.DEFMETHOD("is_block_scope", return_false);
|
||||||
});
|
AST_Lambda.DEFMETHOD("is_block_scope", return_false);
|
||||||
|
AST_Toplevel.DEFMETHOD("is_block_scope", return_false);
|
||||||
AST_Block.DEFMETHOD("is_block_scope", function(){
|
AST_SwitchBranch.DEFMETHOD("is_block_scope", return_false);
|
||||||
return (
|
AST_Block.DEFMETHOD("is_block_scope", return_true);
|
||||||
!(this instanceof AST_Lambda) &&
|
AST_IterationStatement.DEFMETHOD("is_block_scope", return_true);
|
||||||
!(this instanceof AST_Toplevel) &&
|
|
||||||
!(this instanceof AST_Class) &&
|
|
||||||
!(this instanceof AST_SwitchBranch)
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
AST_IterationStatement.DEFMETHOD("is_block_scope", function(){
|
|
||||||
return true;
|
|
||||||
});
|
|
||||||
|
|
||||||
AST_Lambda.DEFMETHOD("init_scope_vars", function(){
|
AST_Lambda.DEFMETHOD("init_scope_vars", function(){
|
||||||
AST_Scope.prototype.init_scope_vars.apply(this, arguments);
|
AST_Scope.prototype.init_scope_vars.apply(this, arguments);
|
||||||
this.uses_arguments = false;
|
this.uses_arguments = false;
|
||||||
|
this.def_variable(new AST_SymbolFunarg({
|
||||||
var symbol = new AST_VarDef({ name: "arguments", start: this.start, end: this.end });
|
name: "arguments",
|
||||||
var def = new SymbolDef(this, this.variables.size(), symbol);
|
start: this.start,
|
||||||
this.variables.set(symbol.name, def);
|
end: this.end
|
||||||
|
}));
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_SymbolRef.DEFMETHOD("reference", function(options) {
|
AST_Symbol.DEFMETHOD("mark_enclosed", function(options) {
|
||||||
var def = this.definition();
|
var def = this.definition();
|
||||||
def.references.push(this);
|
|
||||||
var s = this.scope;
|
var s = this.scope;
|
||||||
while (s) {
|
while (s) {
|
||||||
push_uniq(s.enclosed, def);
|
push_uniq(s.enclosed, def);
|
||||||
@@ -361,30 +395,29 @@ AST_SymbolRef.DEFMETHOD("reference", function(options) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
AST_Symbol.DEFMETHOD("reference", function(options) {
|
||||||
|
this.definition().references.push(this);
|
||||||
|
this.mark_enclosed(options);
|
||||||
|
});
|
||||||
|
|
||||||
AST_Scope.DEFMETHOD("find_variable", function(name){
|
AST_Scope.DEFMETHOD("find_variable", function(name){
|
||||||
if (name instanceof AST_Symbol) name = name.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, in_export, in_block){
|
AST_Scope.DEFMETHOD("def_function", function(symbol){
|
||||||
this.functions.set(symbol.name, this.def_variable(symbol, in_export, in_block));
|
var def = this.def_variable(symbol);
|
||||||
|
this.functions.set(symbol.name, def);
|
||||||
|
return def;
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Scope.DEFMETHOD("def_variable", function(symbol, in_export, in_block){
|
AST_Scope.DEFMETHOD("def_variable", function(symbol){
|
||||||
var def;
|
var def;
|
||||||
if (!this.variables.has(symbol.name)) {
|
if (!this.variables.has(symbol.name)) {
|
||||||
def = new SymbolDef(this, this.variables.size(), symbol);
|
def = new SymbolDef(this, this.variables.size(), symbol);
|
||||||
this.variables.set(symbol.name, def);
|
this.variables.set(symbol.name, def);
|
||||||
def.object_destructuring_arg = symbol.object_destructuring_arg;
|
def.global = !this.parent_scope;
|
||||||
if (in_export) {
|
|
||||||
def.export = true;
|
|
||||||
}
|
|
||||||
if (in_block && symbol instanceof AST_SymbolBlockDeclaration) {
|
|
||||||
def.global = false;
|
|
||||||
} else {
|
|
||||||
def.global = !this.parent_scope;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
def = this.variables.get(symbol.name);
|
def = this.variables.get(symbol.name);
|
||||||
def.orig.push(symbol);
|
def.orig.push(symbol);
|
||||||
@@ -399,8 +432,8 @@ AST_Scope.DEFMETHOD("next_mangled", function(options){
|
|||||||
if (!is_identifier(m)) continue; // skip over "do"
|
if (!is_identifier(m)) continue; // skip over "do"
|
||||||
|
|
||||||
// https://github.com/mishoo/UglifyJS2/issues/242 -- do not
|
// https://github.com/mishoo/UglifyJS2/issues/242 -- do not
|
||||||
// shadow a name excepted from mangling.
|
// shadow a name reserved from mangling.
|
||||||
if (options.except.indexOf(m) >= 0) continue;
|
if (options.reserved.indexOf(m) >= 0) continue;
|
||||||
|
|
||||||
// we must ensure that the mangled name does not shadow a name
|
// we must ensure that the mangled name does not shadow a name
|
||||||
// from some parent scope that is referenced in this or in
|
// from some parent scope that is referenced in this or in
|
||||||
@@ -433,36 +466,17 @@ AST_Function.DEFMETHOD("next_mangled", function(options, def){
|
|||||||
|
|
||||||
AST_Symbol.DEFMETHOD("unmangleable", function(options){
|
AST_Symbol.DEFMETHOD("unmangleable", function(options){
|
||||||
var def = this.definition();
|
var def = this.definition();
|
||||||
return def && def.unmangleable(options);
|
return !def || def.unmangleable(options);
|
||||||
});
|
|
||||||
|
|
||||||
// property accessors are not mangleable
|
|
||||||
AST_SymbolAccessor.DEFMETHOD("unmangleable", function(){
|
|
||||||
return true;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// labels are always mangleable
|
// labels are always mangleable
|
||||||
AST_Label.DEFMETHOD("unmangleable", function(){
|
AST_Label.DEFMETHOD("unmangleable", return_false);
|
||||||
return false;
|
|
||||||
});
|
|
||||||
|
|
||||||
AST_Symbol.DEFMETHOD("unreferenced", function(){
|
AST_Symbol.DEFMETHOD("unreferenced", function(){
|
||||||
return this.definition().references.length == 0
|
return this.definition().references.length == 0
|
||||||
&& !(this.scope.uses_eval || this.scope.uses_with);
|
&& !(this.scope.uses_eval || this.scope.uses_with);
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Symbol.DEFMETHOD("undeclared", function(){
|
|
||||||
return this.definition().undeclared;
|
|
||||||
});
|
|
||||||
|
|
||||||
AST_LabelRef.DEFMETHOD("undeclared", function(){
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
|
|
||||||
AST_Label.DEFMETHOD("undeclared", function(){
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
|
|
||||||
AST_Symbol.DEFMETHOD("definition", function(){
|
AST_Symbol.DEFMETHOD("definition", function(){
|
||||||
return this.thedef;
|
return this.thedef;
|
||||||
});
|
});
|
||||||
@@ -472,22 +486,23 @@ AST_Symbol.DEFMETHOD("global", function(){
|
|||||||
});
|
});
|
||||||
|
|
||||||
AST_Toplevel.DEFMETHOD("_default_mangler_options", function(options){
|
AST_Toplevel.DEFMETHOD("_default_mangler_options", function(options){
|
||||||
return defaults(options, {
|
options = defaults(options, {
|
||||||
except : [],
|
|
||||||
eval : false,
|
eval : false,
|
||||||
sort : false, // Ignored. Flag retained for backwards compatibility.
|
ie8 : false,
|
||||||
toplevel : false,
|
keep_classnames: false,
|
||||||
screw_ie8 : true,
|
|
||||||
keep_fnames : false,
|
keep_fnames : false,
|
||||||
keep_classnames : false
|
reserved : [],
|
||||||
|
toplevel : false,
|
||||||
});
|
});
|
||||||
|
if (!Array.isArray(options.reserved)) options.reserved = [];
|
||||||
|
return options;
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Toplevel.DEFMETHOD("mangle_names", function(options){
|
AST_Toplevel.DEFMETHOD("mangle_names", function(options){
|
||||||
options = this._default_mangler_options(options);
|
options = this._default_mangler_options(options);
|
||||||
|
|
||||||
// Never mangle arguments
|
// Never mangle arguments
|
||||||
options.except.push('arguments');
|
options.reserved.push('arguments');
|
||||||
|
|
||||||
// We only need to mangle declaration nodes. Special logic wired
|
// We only need to mangle declaration nodes. Special logic wired
|
||||||
// into the code generator will display the mangled name if it's
|
// into the code generator will display the mangled name if it's
|
||||||
@@ -498,7 +513,7 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options){
|
|||||||
|
|
||||||
if (options.cache) {
|
if (options.cache) {
|
||||||
this.globals.each(function(symbol){
|
this.globals.each(function(symbol){
|
||||||
if (options.except.indexOf(symbol.name) < 0) {
|
if (options.reserved.indexOf(symbol.name) < 0) {
|
||||||
to_mangle.push(symbol);
|
to_mangle.push(symbol);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -515,7 +530,7 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options){
|
|||||||
if (node instanceof AST_Scope) {
|
if (node instanceof AST_Scope) {
|
||||||
var p = tw.parent(), a = [];
|
var p = tw.parent(), a = [];
|
||||||
node.variables.each(function(symbol){
|
node.variables.each(function(symbol){
|
||||||
if (options.except.indexOf(symbol.name) < 0) {
|
if (options.reserved.indexOf(symbol.name) < 0) {
|
||||||
a.push(symbol);
|
a.push(symbol);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -529,16 +544,15 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options){
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
var mangle_with_block_scope =
|
var mangle_with_block_scope =
|
||||||
(options.screw_ie8 && node instanceof AST_SymbolCatch) ||
|
(!options.ie8 && node instanceof AST_SymbolCatch) ||
|
||||||
node instanceof AST_SymbolBlockDeclaration;
|
node instanceof AST_SymbolBlockDeclaration;
|
||||||
if (mangle_with_block_scope) {
|
if (mangle_with_block_scope && options.reserved.indexOf(node.name) < 0) {
|
||||||
to_mangle.push(node.definition());
|
to_mangle.push(node.definition());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
this.walk(tw);
|
this.walk(tw);
|
||||||
to_mangle.forEach(function(def){
|
to_mangle.forEach(function(def){
|
||||||
if (def.destructuring && !def.destructuring.is_array) return;
|
|
||||||
def.mangle(options);
|
def.mangle(options);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -549,111 +563,69 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options){
|
|||||||
|
|
||||||
AST_Toplevel.DEFMETHOD("compute_char_frequency", function(options){
|
AST_Toplevel.DEFMETHOD("compute_char_frequency", function(options){
|
||||||
options = this._default_mangler_options(options);
|
options = this._default_mangler_options(options);
|
||||||
var tw = new TreeWalker(function(node){
|
try {
|
||||||
if (node instanceof AST_Constant)
|
AST_Node.prototype.print = function(stream, force_parens) {
|
||||||
base54.consider(node.print_to_string());
|
this._print(stream, force_parens);
|
||||||
else if (node instanceof AST_Return)
|
if (this instanceof AST_Symbol && !this.unmangleable(options)) {
|
||||||
base54.consider("return");
|
base54.consider(this.name, -1);
|
||||||
else if (node instanceof AST_Throw)
|
} else if (options.properties) {
|
||||||
base54.consider("throw");
|
if (this instanceof AST_Dot) {
|
||||||
else if (node instanceof AST_Continue)
|
base54.consider(this.property, -1);
|
||||||
base54.consider("continue");
|
} else if (this instanceof AST_Sub) {
|
||||||
else if (node instanceof AST_Break)
|
skip_string(this.property);
|
||||||
base54.consider("break");
|
}
|
||||||
else if (node instanceof AST_Debugger)
|
}
|
||||||
base54.consider("debugger");
|
};
|
||||||
else if (node instanceof AST_Directive)
|
base54.consider(this.print_to_string(), 1);
|
||||||
base54.consider(node.value);
|
} finally {
|
||||||
else if (node instanceof AST_While)
|
AST_Node.prototype.print = AST_Node.prototype._print;
|
||||||
base54.consider("while");
|
}
|
||||||
else if (node instanceof AST_Do)
|
|
||||||
base54.consider("do while");
|
|
||||||
else if (node instanceof AST_If) {
|
|
||||||
base54.consider("if");
|
|
||||||
if (node.alternative) base54.consider("else");
|
|
||||||
}
|
|
||||||
else if (node instanceof AST_Var)
|
|
||||||
base54.consider("var");
|
|
||||||
else if (node instanceof AST_Const)
|
|
||||||
base54.consider("const");
|
|
||||||
else if (node instanceof AST_Lambda)
|
|
||||||
base54.consider("function");
|
|
||||||
else if (node instanceof AST_For)
|
|
||||||
base54.consider("for");
|
|
||||||
else if (node instanceof AST_ForIn)
|
|
||||||
base54.consider("for in");
|
|
||||||
else if (node instanceof AST_Switch)
|
|
||||||
base54.consider("switch");
|
|
||||||
else if (node instanceof AST_Case)
|
|
||||||
base54.consider("case");
|
|
||||||
else if (node instanceof AST_Default)
|
|
||||||
base54.consider("default");
|
|
||||||
else if (node instanceof AST_With)
|
|
||||||
base54.consider("with");
|
|
||||||
else if (node instanceof AST_ObjectSetter)
|
|
||||||
base54.consider("set" + (typeof node.key === "string" ? node.key : ""));
|
|
||||||
else if (node instanceof AST_ObjectGetter)
|
|
||||||
base54.consider("get" + (typeof node.key === "string" ? node.key : ""));
|
|
||||||
else if (node instanceof AST_ObjectKeyVal && typeof node.key === "string")
|
|
||||||
base54.consider(node.key);
|
|
||||||
else if (node instanceof AST_ConciseMethod && typeof node.key === "string")
|
|
||||||
base54.consider(node.key);
|
|
||||||
else if (node instanceof AST_New)
|
|
||||||
base54.consider("new");
|
|
||||||
else if (node instanceof AST_This)
|
|
||||||
base54.consider("this");
|
|
||||||
else if (node instanceof AST_Super)
|
|
||||||
base54.consider("super");
|
|
||||||
else if (node instanceof AST_Try)
|
|
||||||
base54.consider("try");
|
|
||||||
else if (node instanceof AST_Catch)
|
|
||||||
base54.consider("catch");
|
|
||||||
else if (node instanceof AST_Finally)
|
|
||||||
base54.consider("finally");
|
|
||||||
else if (node instanceof AST_Yield)
|
|
||||||
base54.consider("yield");
|
|
||||||
else if (node instanceof AST_Symbol && node.unmangleable(options))
|
|
||||||
base54.consider(node.name);
|
|
||||||
else if (node instanceof AST_Unary || node instanceof AST_Binary)
|
|
||||||
base54.consider(node.operator);
|
|
||||||
else if (node instanceof AST_Dot)
|
|
||||||
base54.consider(node.property);
|
|
||||||
});
|
|
||||||
this.walk(tw);
|
|
||||||
base54.sort();
|
base54.sort();
|
||||||
|
|
||||||
|
function skip_string(node) {
|
||||||
|
if (node instanceof AST_String) {
|
||||||
|
base54.consider(node.value, -1);
|
||||||
|
} else if (node instanceof AST_Conditional) {
|
||||||
|
skip_string(node.consequent);
|
||||||
|
skip_string(node.alternative);
|
||||||
|
} else if (node instanceof AST_Sequence) {
|
||||||
|
skip_string(node.expressions[node.expressions.length - 1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var base54 = (function() {
|
var base54 = (function() {
|
||||||
var string = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_0123456789";
|
var leading = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_".split("");
|
||||||
|
var digits = "0123456789".split("");
|
||||||
var chars, frequency;
|
var chars, frequency;
|
||||||
function reset() {
|
function reset() {
|
||||||
frequency = Object.create(null);
|
frequency = Object.create(null);
|
||||||
chars = string.split("").map(function(ch){ return ch.charCodeAt(0) });
|
leading.forEach(function(ch) {
|
||||||
chars.forEach(function(ch){ frequency[ch] = 0 });
|
frequency[ch] = 0;
|
||||||
|
});
|
||||||
|
digits.forEach(function(ch) {
|
||||||
|
frequency[ch] = 0;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
base54.consider = function(str){
|
base54.consider = function(str, delta) {
|
||||||
for (var i = str.length; --i >= 0;) {
|
for (var i = str.length; --i >= 0;) {
|
||||||
var code = str.charCodeAt(i);
|
frequency[str[i]] += delta;
|
||||||
if (code in frequency) ++frequency[code];
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
function compare(a, b) {
|
||||||
|
return frequency[b] - frequency[a];
|
||||||
|
}
|
||||||
base54.sort = function() {
|
base54.sort = function() {
|
||||||
chars = mergeSort(chars, function(a, b){
|
chars = mergeSort(leading, compare).concat(mergeSort(digits, compare));
|
||||||
if (is_digit(a) && !is_digit(b)) return 1;
|
|
||||||
if (is_digit(b) && !is_digit(a)) return -1;
|
|
||||||
return frequency[b] - frequency[a];
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
base54.reset = reset;
|
base54.reset = reset;
|
||||||
reset();
|
reset();
|
||||||
base54.get = function(){ return chars };
|
|
||||||
base54.freq = function(){ return frequency };
|
|
||||||
function base54(num) {
|
function base54(num) {
|
||||||
var ret = "", base = 54;
|
var ret = "", base = 54;
|
||||||
num++;
|
num++;
|
||||||
do {
|
do {
|
||||||
num--;
|
num--;
|
||||||
ret += String.fromCharCode(chars[num % base]);
|
ret += chars[num % base];
|
||||||
num = Math.floor(num / base);
|
num = Math.floor(num / base);
|
||||||
base = 64;
|
base = 64;
|
||||||
} while (num > 0);
|
} while (num > 0);
|
||||||
@@ -661,89 +633,3 @@ var base54 = (function() {
|
|||||||
};
|
};
|
||||||
return base54;
|
return base54;
|
||||||
})();
|
})();
|
||||||
|
|
||||||
AST_Toplevel.DEFMETHOD("scope_warnings", function(options){
|
|
||||||
options = defaults(options, {
|
|
||||||
undeclared : false, // this makes a lot of noise
|
|
||||||
unreferenced : true,
|
|
||||||
assign_to_global : true,
|
|
||||||
func_arguments : true,
|
|
||||||
nested_defuns : true,
|
|
||||||
eval : true
|
|
||||||
});
|
|
||||||
var tw = new TreeWalker(function(node){
|
|
||||||
if (options.undeclared
|
|
||||||
&& node instanceof AST_SymbolRef
|
|
||||||
&& node.undeclared())
|
|
||||||
{
|
|
||||||
// XXX: this also warns about JS standard names,
|
|
||||||
// i.e. Object, Array, parseInt etc. Should add a list of
|
|
||||||
// exceptions.
|
|
||||||
AST_Node.warn("Undeclared symbol: {name} [{file}:{line},{col}]", {
|
|
||||||
name: node.name,
|
|
||||||
file: node.start.file,
|
|
||||||
line: node.start.line,
|
|
||||||
col: node.start.col
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (options.assign_to_global)
|
|
||||||
{
|
|
||||||
var sym = null;
|
|
||||||
if (node instanceof AST_Assign && node.left instanceof AST_SymbolRef)
|
|
||||||
sym = node.left;
|
|
||||||
else if (node instanceof AST_ForIn && node.init instanceof AST_SymbolRef)
|
|
||||||
sym = node.init;
|
|
||||||
if (sym
|
|
||||||
&& (sym.undeclared()
|
|
||||||
|| (sym.global() && sym.scope !== sym.definition().scope))) {
|
|
||||||
AST_Node.warn("{msg}: {name} [{file}:{line},{col}]", {
|
|
||||||
msg: sym.undeclared() ? "Accidental global?" : "Assignment to global",
|
|
||||||
name: sym.name,
|
|
||||||
file: sym.start.file,
|
|
||||||
line: sym.start.line,
|
|
||||||
col: sym.start.col
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (options.eval
|
|
||||||
&& node instanceof AST_SymbolRef
|
|
||||||
&& node.undeclared()
|
|
||||||
&& node.name == "eval") {
|
|
||||||
AST_Node.warn("Eval is used [{file}:{line},{col}]", node.start);
|
|
||||||
}
|
|
||||||
if (options.unreferenced
|
|
||||||
&& (node instanceof AST_SymbolDeclaration || node instanceof AST_Label)
|
|
||||||
&& !(node instanceof AST_SymbolCatch)
|
|
||||||
&& node.unreferenced()) {
|
|
||||||
AST_Node.warn("{type} {name} is declared but not referenced [{file}:{line},{col}]", {
|
|
||||||
type: node instanceof AST_Label ? "Label" : "Symbol",
|
|
||||||
name: node.name,
|
|
||||||
file: node.start.file,
|
|
||||||
line: node.start.line,
|
|
||||||
col: node.start.col
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (options.func_arguments
|
|
||||||
&& node instanceof AST_Lambda
|
|
||||||
&& node.uses_arguments) {
|
|
||||||
AST_Node.warn("arguments used in function {name} [{file}:{line},{col}]", {
|
|
||||||
name: node.name ? node.name.name : "anonymous",
|
|
||||||
file: node.start.file,
|
|
||||||
line: node.start.line,
|
|
||||||
col: node.start.col
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (options.nested_defuns
|
|
||||||
&& node instanceof AST_Defun
|
|
||||||
&& !(tw.parent() instanceof AST_Scope)) {
|
|
||||||
AST_Node.warn("Function {name} declared in nested statement \"{type}\" [{file}:{line},{col}]", {
|
|
||||||
name: node.name.name,
|
|
||||||
type: tw.parent().TYPE,
|
|
||||||
file: node.start.file,
|
|
||||||
line: node.start.line,
|
|
||||||
col: node.start.col
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
this.walk(tw);
|
|
||||||
});
|
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ TreeTransformer.prototype = new TreeWalker;
|
|||||||
if (y !== undefined) x = y;
|
if (y !== undefined) x = y;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tw.pop(this);
|
tw.pop();
|
||||||
return x;
|
return x;
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
@@ -182,9 +182,8 @@ TreeTransformer.prototype = new TreeWalker;
|
|||||||
self.args = do_list(self.args, tw);
|
self.args = do_list(self.args, tw);
|
||||||
});
|
});
|
||||||
|
|
||||||
_(AST_Seq, function(self, tw){
|
_(AST_Sequence, function(self, tw){
|
||||||
self.car = self.car.transform(tw);
|
self.expressions = do_list(self.expressions, tw);
|
||||||
self.cdr = self.cdr.transform(tw);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
_(AST_Dot, function(self, tw){
|
_(AST_Dot, function(self, tw){
|
||||||
@@ -200,6 +199,10 @@ TreeTransformer.prototype = new TreeWalker;
|
|||||||
if (self.expression) self.expression = self.expression.transform(tw);
|
if (self.expression) self.expression = self.expression.transform(tw);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
_(AST_Await, function(self, tw){
|
||||||
|
self.expression = self.expression.transform(tw);
|
||||||
|
});
|
||||||
|
|
||||||
_(AST_Unary, function(self, tw){
|
_(AST_Unary, function(self, tw){
|
||||||
self.expression = self.expression.transform(tw);
|
self.expression = self.expression.transform(tw);
|
||||||
});
|
});
|
||||||
@@ -240,12 +243,26 @@ TreeTransformer.prototype = new TreeWalker;
|
|||||||
self.expression = self.expression.transform(tw);
|
self.expression = self.expression.transform(tw);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
_(AST_NameMapping, function(self, tw) {
|
||||||
|
self.foreign_name = self.foreign_name.transform(tw);
|
||||||
|
self.name = self.name.transform(tw);
|
||||||
|
});
|
||||||
|
|
||||||
|
_(AST_Import, function(self, tw) {
|
||||||
|
if (self.imported_name) self.imported_name = self.imported_name.transform(tw);
|
||||||
|
if (self.imported_names) do_list(self.imported_names, tw);
|
||||||
|
self.module_name = self.module_name.transform(tw);
|
||||||
|
});
|
||||||
|
|
||||||
|
_(AST_Export, function(self, tw) {
|
||||||
|
if (self.exported_definition) self.exported_definition = self.exported_definition.transform(tw);
|
||||||
|
if (self.exported_value) self.exported_value = self.exported_value.transform(tw);
|
||||||
|
if (self.exported_names) do_list(self.exported_names, tw);
|
||||||
|
if (self.module_name) self.module_name = self.module_name.transform(tw);
|
||||||
|
});
|
||||||
|
|
||||||
_(AST_TemplateString, function(self, tw) {
|
_(AST_TemplateString, function(self, tw) {
|
||||||
for (var i = 0; i < self.segments.length; i++) {
|
self.segments = do_list(self.segments, tw);
|
||||||
if (!(self.segments[i] instanceof AST_TemplateSegment)) {
|
|
||||||
self.segments[i] = self.segments[i].transform(tw);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
_(AST_PrefixedTemplateString, function(self, tw) {
|
_(AST_PrefixedTemplateString, function(self, tw) {
|
||||||
|
|||||||
13
lib/utils.js
13
lib/utils.js
@@ -43,13 +43,6 @@
|
|||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
function array_to_hash(a) {
|
|
||||||
var ret = Object.create(null);
|
|
||||||
for (var i = 0; i < a.length; ++i)
|
|
||||||
ret[a[i]] = true;
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
|
|
||||||
function slice(a, start) {
|
function slice(a, start) {
|
||||||
return Array.prototype.slice.call(a, start || 0);
|
return Array.prototype.slice.call(a, start || 0);
|
||||||
};
|
};
|
||||||
@@ -126,9 +119,11 @@ function merge(obj, ext) {
|
|||||||
return count;
|
return count;
|
||||||
};
|
};
|
||||||
|
|
||||||
function noop() {};
|
function noop() {}
|
||||||
function return_false() { return false; }
|
function return_false() { return false; }
|
||||||
function return_true() { return true; }
|
function return_true() { return true; }
|
||||||
|
function return_this() { return this; }
|
||||||
|
function return_null() { return null; }
|
||||||
|
|
||||||
var MAP = (function(){
|
var MAP = (function(){
|
||||||
function MAP(a, f, backwards) {
|
function MAP(a, f, backwards) {
|
||||||
@@ -344,7 +339,7 @@ function first_in_statement(stack) {
|
|||||||
for (var i = 0, p; p = stack.parent(i); i++) {
|
for (var i = 0, p; p = stack.parent(i); i++) {
|
||||||
if (p instanceof AST_Statement && p.body === node)
|
if (p instanceof AST_Statement && p.body === node)
|
||||||
return true;
|
return true;
|
||||||
if ((p instanceof AST_Seq && p.car === node ) ||
|
if ((p instanceof AST_Sequence && p.expressions[0] === node) ||
|
||||||
(p instanceof AST_Call && p.expression === node && !(p instanceof AST_New) ) ||
|
(p instanceof AST_Call && p.expression === node && !(p instanceof AST_New) ) ||
|
||||||
(p instanceof AST_Dot && p.expression === node ) ||
|
(p instanceof AST_Dot && p.expression === node ) ||
|
||||||
(p instanceof AST_Sub && p.expression === node ) ||
|
(p instanceof AST_Sub && p.expression === node ) ||
|
||||||
|
|||||||
51
package.json
51
package.json
@@ -1,20 +1,17 @@
|
|||||||
{
|
{
|
||||||
"name": "uglify-js",
|
"name": "uglify-es",
|
||||||
"description": "JavaScript parser, mangler/compressor and beautifier toolkit",
|
"description": "JavaScript parser, mangler/compressor and beautifier toolkit for ES6+",
|
||||||
"homepage": "http://lisperator.net/uglifyjs",
|
"homepage": "https://github.com/mishoo/UglifyJS2/tree/harmony",
|
||||||
"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": "2.8.12",
|
"version": "3.1.8",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.8.0"
|
"node": ">=0.8.0"
|
||||||
},
|
},
|
||||||
"maintainers": [
|
"maintainers": [
|
||||||
"Mihai Bazon <mihai.bazon@gmail.com> (http://lisperator.net/)"
|
"Mihai Bazon <mihai.bazon@gmail.com> (http://lisperator.net/)"
|
||||||
],
|
],
|
||||||
"repository": {
|
"repository": "git+https://github.com/mishoo/UglifyJS2.git#harmony",
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/mishoo/UglifyJS2.git"
|
|
||||||
},
|
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/mishoo/UglifyJS2/issues"
|
"url": "https://github.com/mishoo/UglifyJS2/issues"
|
||||||
},
|
},
|
||||||
@@ -29,25 +26,33 @@
|
|||||||
"LICENSE"
|
"LICENSE"
|
||||||
],
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"source-map": "~0.5.1",
|
"commander": "~2.11.0",
|
||||||
"uglify-to-browserify": "~1.0.0",
|
"source-map": "~0.6.1"
|
||||||
"yargs": "~3.10.0"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"acorn": "~0.6.0",
|
"acorn": "~5.1.1",
|
||||||
"escodegen": "~1.3.3",
|
"mocha": "~3.5.1",
|
||||||
"esfuzz": "~0.3.1",
|
"semver": "~5.4.1"
|
||||||
"estraverse": "~1.5.1",
|
|
||||||
"mocha": "~2.3.4"
|
|
||||||
},
|
|
||||||
"browserify": {
|
|
||||||
"transform": [
|
|
||||||
"uglify-to-browserify"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"shrinkwrap": "rm ./npm-shrinkwrap.json; rm -rf ./node_modules; npm i && npm shrinkwrap && npm outdated",
|
|
||||||
"test": "node test/run-tests.js"
|
"test": "node test/run-tests.js"
|
||||||
},
|
},
|
||||||
"keywords": ["uglify", "uglify-js", "minify", "minifier"]
|
"keywords": [
|
||||||
|
"uglify",
|
||||||
|
"uglify-es",
|
||||||
|
"uglify-js",
|
||||||
|
"minify",
|
||||||
|
"minifier",
|
||||||
|
"javascript",
|
||||||
|
"ecmascript",
|
||||||
|
"es5",
|
||||||
|
"es6",
|
||||||
|
"es7",
|
||||||
|
"es8",
|
||||||
|
"es2015",
|
||||||
|
"es2016",
|
||||||
|
"es2017",
|
||||||
|
"async",
|
||||||
|
"await"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,15 +4,17 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
var createHash = require("crypto").createHash;
|
var createHash = require("crypto").createHash;
|
||||||
|
var fetch = require("./fetch");
|
||||||
var fork = require("child_process").fork;
|
var fork = require("child_process").fork;
|
||||||
|
var zlib = require("zlib");
|
||||||
var args = process.argv.slice(2);
|
var args = process.argv.slice(2);
|
||||||
if (!args.length) {
|
if (!args.length) {
|
||||||
args.push("-mc", "warnings=false");
|
args.push("-mc");
|
||||||
}
|
}
|
||||||
args.push("--stats");
|
args.push("--timings");
|
||||||
var urls = [
|
var urls = [
|
||||||
"https://code.jquery.com/jquery-3.1.1.js",
|
"https://code.jquery.com/jquery-3.2.1.js",
|
||||||
"https://code.angularjs.org/1.6.1/angular.js",
|
"https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.4/angular.js",
|
||||||
"https://cdnjs.cloudflare.com/ajax/libs/mathjs/3.9.0/math.js",
|
"https://cdnjs.cloudflare.com/ajax/libs/mathjs/3.9.0/math.js",
|
||||||
"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.js",
|
"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.js",
|
||||||
"https://unpkg.com/react@15.3.2/dist/react.js",
|
"https://unpkg.com/react@15.3.2/dist/react.js",
|
||||||
@@ -30,13 +32,9 @@ function done() {
|
|||||||
console.log();
|
console.log();
|
||||||
console.log(url);
|
console.log(url);
|
||||||
console.log(info.log);
|
console.log(info.log);
|
||||||
var elapsed = 0;
|
|
||||||
info.log.replace(/: ([0-9]+\.[0-9]{3})s/g, function(match, time) {
|
|
||||||
elapsed += parseFloat(time);
|
|
||||||
});
|
|
||||||
console.log("Run-time:", elapsed.toFixed(3), "s");
|
|
||||||
console.log("Original:", info.input, "bytes");
|
console.log("Original:", info.input, "bytes");
|
||||||
console.log("Uglified:", info.output, "bytes");
|
console.log("Uglified:", info.output, "bytes");
|
||||||
|
console.log("GZipped: ", info.gzip, "bytes");
|
||||||
console.log("SHA1 sum:", info.sha1);
|
console.log("SHA1 sum:", info.sha1);
|
||||||
if (info.code) {
|
if (info.code) {
|
||||||
failures.push(url);
|
failures.push(url);
|
||||||
@@ -55,15 +53,21 @@ urls.forEach(function(url) {
|
|||||||
results[url] = {
|
results[url] = {
|
||||||
input: 0,
|
input: 0,
|
||||||
output: 0,
|
output: 0,
|
||||||
|
gzip: 0,
|
||||||
log: ""
|
log: ""
|
||||||
};
|
};
|
||||||
require(url.slice(0, url.indexOf(":"))).get(url, function(res) {
|
fetch(url, function(err, res) {
|
||||||
|
if (err) throw err;
|
||||||
var uglifyjs = fork("bin/uglifyjs", args, { silent: true });
|
var uglifyjs = fork("bin/uglifyjs", args, { silent: true });
|
||||||
res.on("data", function(data) {
|
res.on("data", function(data) {
|
||||||
results[url].input += data.length;
|
results[url].input += data.length;
|
||||||
}).pipe(uglifyjs.stdin);
|
}).pipe(uglifyjs.stdin);
|
||||||
uglifyjs.stdout.on("data", function(data) {
|
uglifyjs.stdout.on("data", function(data) {
|
||||||
results[url].output += data.length;
|
results[url].output += data.length;
|
||||||
|
}).pipe(zlib.createGzip({
|
||||||
|
level: zlib.Z_BEST_COMPRESSION
|
||||||
|
})).on("data", function(data) {
|
||||||
|
results[url].gzip += data.length;
|
||||||
}).pipe(createHash("sha1")).on("data", function(data) {
|
}).pipe(createHash("sha1")).on("data", function(data) {
|
||||||
results[url].sha1 = data.toString("hex");
|
results[url].sha1 = data.toString("hex");
|
||||||
done();
|
done();
|
||||||
|
|||||||
67
test/compress/angular-inject.js
vendored
67
test/compress/angular-inject.js
vendored
@@ -1,67 +0,0 @@
|
|||||||
ng_inject_defun: {
|
|
||||||
options = {
|
|
||||||
angular: true
|
|
||||||
};
|
|
||||||
input: {
|
|
||||||
/*@ngInject*/
|
|
||||||
function Controller(dependency) {
|
|
||||||
return dependency;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function Controller(dependency) {
|
|
||||||
return dependency;
|
|
||||||
}
|
|
||||||
Controller.$inject=['dependency']
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ng_inject_assignment: {
|
|
||||||
options = {
|
|
||||||
angular: true
|
|
||||||
};
|
|
||||||
input: {
|
|
||||||
/*@ngInject*/
|
|
||||||
var Controller = function(dependency) {
|
|
||||||
return dependency;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
var Controller = function(dependency) {
|
|
||||||
return dependency;
|
|
||||||
}
|
|
||||||
Controller.$inject=['dependency']
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ng_inject_inline: {
|
|
||||||
options = {
|
|
||||||
angular: true
|
|
||||||
};
|
|
||||||
input: {
|
|
||||||
angular.module('a').
|
|
||||||
factory('b',
|
|
||||||
/*@ngInject*/
|
|
||||||
function(dependency) {
|
|
||||||
return dependency;
|
|
||||||
}).
|
|
||||||
directive('c',
|
|
||||||
/*@ngInject*/
|
|
||||||
function(anotherDependency) {
|
|
||||||
return anotherDependency;
|
|
||||||
})
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
angular.module('a').
|
|
||||||
factory('b',[
|
|
||||||
'dependency',
|
|
||||||
function(dependency) {
|
|
||||||
return dependency;
|
|
||||||
}]).
|
|
||||||
directive('c',[
|
|
||||||
'anotherDependency',
|
|
||||||
function(anotherDependency) {
|
|
||||||
return anotherDependency;
|
|
||||||
}])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -203,50 +203,110 @@ constant_join_3: {
|
|||||||
|
|
||||||
for_loop: {
|
for_loop: {
|
||||||
options = {
|
options = {
|
||||||
unsafe : true,
|
evaluate: true,
|
||||||
unused : true,
|
reduce_vars: true,
|
||||||
evaluate : true,
|
unsafe: true,
|
||||||
reduce_vars : true
|
unused: true,
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
function f0() {
|
function f0() {
|
||||||
var a = [1, 2, 3];
|
var a = [1, 2, 3];
|
||||||
for (var i = 0; i < a.length; i++) {
|
var b = 0;
|
||||||
console.log(a[i]);
|
for (var i = 0; i < a.length; i++)
|
||||||
}
|
b += a[i];
|
||||||
|
return b;
|
||||||
}
|
}
|
||||||
|
|
||||||
function f1() {
|
function f1() {
|
||||||
var a = [1, 2, 3];
|
var a = [1, 2, 3];
|
||||||
for (var i = 0, len = a.length; i < len; i++) {
|
var b = 0;
|
||||||
console.log(a[i]);
|
for (var i = 0, len = a.length; i < len; i++)
|
||||||
}
|
b += a[i];
|
||||||
|
return b;
|
||||||
}
|
}
|
||||||
|
|
||||||
function f2() {
|
|
||||||
var a = [1, 2, 3];
|
|
||||||
for (var i = 0; i < a.length; i++) {
|
|
||||||
a[i]++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f0() {
|
|
||||||
var a = [1, 2, 3];
|
|
||||||
for (var i = 0; i < 3; i++)
|
|
||||||
console.log(a[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
function f1() {
|
|
||||||
var a = [1, 2, 3];
|
|
||||||
for (var i = 0; i < 3; i++)
|
|
||||||
console.log(a[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
function f2() {
|
function f2() {
|
||||||
var a = [1, 2, 3];
|
var a = [1, 2, 3];
|
||||||
for (var i = 0; i < a.length; i++)
|
for (var i = 0; i < a.length; i++)
|
||||||
a[i]++;
|
a[i]++;
|
||||||
|
return a[2];
|
||||||
}
|
}
|
||||||
|
console.log(f0(), f1(), f2());
|
||||||
}
|
}
|
||||||
|
expect: {
|
||||||
|
function f0() {
|
||||||
|
var a = [1, 2, 3];
|
||||||
|
var b = 0;
|
||||||
|
for (var i = 0; i < 3; i++)
|
||||||
|
b += a[i];
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
function f1() {
|
||||||
|
var a = [1, 2, 3];
|
||||||
|
var b = 0;
|
||||||
|
for (var i = 0; i < 3; i++)
|
||||||
|
b += a[i];
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
function f2() {
|
||||||
|
var a = [1, 2, 3];
|
||||||
|
for (var i = 0; i < a.length; i++)
|
||||||
|
a[i]++;
|
||||||
|
return a[2];
|
||||||
|
}
|
||||||
|
console.log(f0(), f1(), f2());
|
||||||
|
}
|
||||||
|
expect_stdout: "6 6 4"
|
||||||
|
}
|
||||||
|
|
||||||
|
index: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = [ 1, 2 ];
|
||||||
|
console.log(a[0], a[1]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(1, 2);
|
||||||
|
}
|
||||||
|
expect_stdout: "1 2"
|
||||||
|
}
|
||||||
|
|
||||||
|
length: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = [ 1, 2 ];
|
||||||
|
console.log(a.length);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(2);
|
||||||
|
}
|
||||||
|
expect_stdout: "2"
|
||||||
|
}
|
||||||
|
|
||||||
|
index_length: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = [ 1, 2 ];
|
||||||
|
console.log(a[0], a.length);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(1, 2);
|
||||||
|
}
|
||||||
|
expect_stdout: "1 2"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -135,3 +135,517 @@ arrow_with_regexp: {
|
|||||||
num => /\d{11,14}/.test( num )
|
num => /\d{11,14}/.test( num )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
arrow_unused: {
|
||||||
|
options = {
|
||||||
|
toplevel: false,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
top => dog;
|
||||||
|
let fn = a => { console.log(a * a); };
|
||||||
|
let u = (x, y) => x - y + g;
|
||||||
|
(() => { console.log("0"); })();
|
||||||
|
!function(x) {
|
||||||
|
(() => { console.log("1"); })();
|
||||||
|
let unused = x => { console.log(x); };
|
||||||
|
let baz = e => e + e;
|
||||||
|
console.log(baz(x));
|
||||||
|
}(1);
|
||||||
|
fn(3);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
let fn = a => { console.log(a * a); };
|
||||||
|
let u = (x, y) => x - y + g;
|
||||||
|
(() => { console.log("0"); })();
|
||||||
|
!function(x) {
|
||||||
|
(() => { console.log("1"); })();
|
||||||
|
let baz = e => e + e;
|
||||||
|
console.log(baz(x));
|
||||||
|
}(1);
|
||||||
|
fn(3);
|
||||||
|
}
|
||||||
|
expect_stdout: [ "0", "1", "2", "9" ]
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
arrow_unused_toplevel: {
|
||||||
|
options = {
|
||||||
|
toplevel: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
top => dog;
|
||||||
|
let fn = a => { console.log(a * a); };
|
||||||
|
let u = (x, y) => x - y + g;
|
||||||
|
(() => { console.log("0"); })();
|
||||||
|
!function(x) {
|
||||||
|
(() => { console.log("1"); })();
|
||||||
|
let unused = x => { console.log(x); };
|
||||||
|
let baz = e => e + e;
|
||||||
|
console.log(baz(x));
|
||||||
|
}(1);
|
||||||
|
fn(3);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
let fn = a => { console.log(a * a); };
|
||||||
|
(() => { console.log("0"); })();
|
||||||
|
!function(x) {
|
||||||
|
(() => { console.log("1"); })();
|
||||||
|
let baz = e => e + e;
|
||||||
|
console.log(baz(x));
|
||||||
|
}(1);
|
||||||
|
fn(3);
|
||||||
|
}
|
||||||
|
expect_stdout: [ "0", "1", "2", "9" ]
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
no_leading_parentheses: {
|
||||||
|
input: {
|
||||||
|
(x,y) => x(y);
|
||||||
|
async (x,y) => await x(y);
|
||||||
|
}
|
||||||
|
expect_exact: "(x,y)=>x(y);async(x,y)=>await x(y);"
|
||||||
|
}
|
||||||
|
|
||||||
|
async_identifiers: {
|
||||||
|
options = {
|
||||||
|
unsafe_arrows: true,
|
||||||
|
ecma: 6,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var async = function(x){ console.log("async", x); };
|
||||||
|
var await = function(x){ console.log("await", x); };
|
||||||
|
async(1);
|
||||||
|
await(2);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var async = x => { console.log("async", x); };
|
||||||
|
var await = x => { console.log("await", x); };
|
||||||
|
async(1);
|
||||||
|
await(2);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"async 1",
|
||||||
|
"await 2",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
async_function_expression: {
|
||||||
|
options = {
|
||||||
|
unsafe_arrows: true,
|
||||||
|
ecma: 6,
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var named = async function foo() {
|
||||||
|
await bar(1 + 0) + (2 + 0);
|
||||||
|
}
|
||||||
|
var anon = async function() {
|
||||||
|
await (1 + 0) + bar(2 + 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var named = async function foo() {
|
||||||
|
await bar(1);
|
||||||
|
};
|
||||||
|
var anon = async () => {
|
||||||
|
await 1, bar(2);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_27: {
|
||||||
|
options = {
|
||||||
|
unsafe_arrows: true,
|
||||||
|
collapse_vars: true,
|
||||||
|
ecma: 6,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(jQuery) {
|
||||||
|
var $;
|
||||||
|
$ = jQuery;
|
||||||
|
$("body").addClass("foo");
|
||||||
|
})(jQuery);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(jQuery => {
|
||||||
|
jQuery("body").addClass("foo");
|
||||||
|
})(jQuery);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2105_1: {
|
||||||
|
options = {
|
||||||
|
unsafe_arrows: true,
|
||||||
|
collapse_vars: true,
|
||||||
|
ecma: 6,
|
||||||
|
inline: true,
|
||||||
|
passes: 3,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unsafe_methods: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
!function(factory) {
|
||||||
|
factory();
|
||||||
|
}( function() {
|
||||||
|
return function(fn) {
|
||||||
|
fn()().prop();
|
||||||
|
}( function() {
|
||||||
|
function bar() {
|
||||||
|
var quux = function() {
|
||||||
|
console.log("PASS");
|
||||||
|
}, foo = function() {
|
||||||
|
console.log;
|
||||||
|
quux();
|
||||||
|
};
|
||||||
|
return { prop: foo };
|
||||||
|
}
|
||||||
|
return bar;
|
||||||
|
} );
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
({
|
||||||
|
prop() {
|
||||||
|
console.log;
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}).prop();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2105_2: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
((factory) => {
|
||||||
|
factory();
|
||||||
|
})( () => {
|
||||||
|
return ((fn) => {
|
||||||
|
fn()().prop();
|
||||||
|
})( () => {
|
||||||
|
let bar = () => {
|
||||||
|
var quux = () => {
|
||||||
|
console.log("PASS");
|
||||||
|
}, foo = () => {
|
||||||
|
console.log;
|
||||||
|
quux();
|
||||||
|
};
|
||||||
|
return { prop: foo };
|
||||||
|
};
|
||||||
|
return bar;
|
||||||
|
} );
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
({
|
||||||
|
prop: () => {
|
||||||
|
console.log;
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}).prop();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2136_2: {
|
||||||
|
options = {
|
||||||
|
arrows: true,
|
||||||
|
collapse_vars: true,
|
||||||
|
ecma: 6,
|
||||||
|
inline: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(x) {
|
||||||
|
console.log(x);
|
||||||
|
}
|
||||||
|
!function(a, ...b) {
|
||||||
|
f(b[0]);
|
||||||
|
}(1, 2, 3);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(x) {
|
||||||
|
console.log(x);
|
||||||
|
}
|
||||||
|
f([2,3][0]);
|
||||||
|
}
|
||||||
|
expect_stdout: "2"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2136_3: {
|
||||||
|
options = {
|
||||||
|
arrows: true,
|
||||||
|
collapse_vars: true,
|
||||||
|
ecma: 6,
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 3,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(x) {
|
||||||
|
console.log(x);
|
||||||
|
}
|
||||||
|
!function(a, ...b) {
|
||||||
|
f(b[0]);
|
||||||
|
}(1, 2, 3);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(2);
|
||||||
|
}
|
||||||
|
expect_stdout: "2"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
call_args: {
|
||||||
|
options = {
|
||||||
|
arrows: true,
|
||||||
|
ecma: 6,
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
const a = 1;
|
||||||
|
console.log(a);
|
||||||
|
+function(a) {
|
||||||
|
return a;
|
||||||
|
}(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
const a = 1;
|
||||||
|
console.log(1);
|
||||||
|
+(1, 1);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
call_args_drop_param: {
|
||||||
|
options = {
|
||||||
|
arrows: true,
|
||||||
|
ecma: 6,
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
const a = 1;
|
||||||
|
console.log(a);
|
||||||
|
+function(a) {
|
||||||
|
return a;
|
||||||
|
}(a, b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
const a = 1;
|
||||||
|
console.log(1);
|
||||||
|
+(b, 1);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_485_crashing_1530: {
|
||||||
|
options = {
|
||||||
|
arrows: true,
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
ecma: 6,
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a) {
|
||||||
|
if (true) return;
|
||||||
|
var b = 42;
|
||||||
|
})(this);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
this, void 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2084: {
|
||||||
|
options = {
|
||||||
|
unsafe_arrows: true,
|
||||||
|
collapse_vars: true,
|
||||||
|
conditionals: true,
|
||||||
|
ecma: 6,
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var c = 0;
|
||||||
|
!function() {
|
||||||
|
!function(c) {
|
||||||
|
c = 1 + c;
|
||||||
|
var c = 0;
|
||||||
|
function f14(a_1) {
|
||||||
|
if (c = 1 + c, 0 !== 23..toString())
|
||||||
|
c = 1 + c, a_1 && (a_1[0] = 0);
|
||||||
|
}
|
||||||
|
f14();
|
||||||
|
}(-1);
|
||||||
|
}();
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var c = 0;
|
||||||
|
((c) => {
|
||||||
|
c = 1 + c,
|
||||||
|
c = 1 + (c = 0),
|
||||||
|
0 !== 23..toString() && (c = 1 + c);
|
||||||
|
})(-1),
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect_stdout: "0"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
export_default_object_expression: {
|
||||||
|
options = {
|
||||||
|
arrows: true,
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export default {
|
||||||
|
foo: 1 + 2,
|
||||||
|
bar() { return 4; },
|
||||||
|
get baz() { return this.foo; },
|
||||||
|
};
|
||||||
|
}
|
||||||
|
expect_exact: "export default{foo:3,bar:()=>4,get baz(){return this.foo}};"
|
||||||
|
}
|
||||||
|
|
||||||
|
concise_methods_with_computed_property2: {
|
||||||
|
options = {
|
||||||
|
arrows: true,
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var foo = {
|
||||||
|
[[1]](v) {
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
console.log(foo[[1]]("PASS"));
|
||||||
|
}
|
||||||
|
expect_exact: 'var foo={[[1]]:v=>v};console.log(foo[[1]]("PASS"));'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
async_object_literal: {
|
||||||
|
options = {
|
||||||
|
arrows: true,
|
||||||
|
unsafe_arrows: true,
|
||||||
|
ecma: 6,
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var obj = {
|
||||||
|
async a() {
|
||||||
|
return await foo(1 + 0);
|
||||||
|
},
|
||||||
|
anon: async function() {
|
||||||
|
return await foo(2 + 0);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var obj = {
|
||||||
|
a: async () => await foo(1),
|
||||||
|
anon: async () => await foo(2)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2271: {
|
||||||
|
options = {
|
||||||
|
arrows: true,
|
||||||
|
ecma: 6,
|
||||||
|
evaluate: true,
|
||||||
|
unsafe_arrows: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var Foo = function() {};
|
||||||
|
Foo.prototype.set = function(value) {
|
||||||
|
this.value = value;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
Foo.prototype.print = function() {
|
||||||
|
console.log(this.value);
|
||||||
|
}
|
||||||
|
new Foo().set("PASS").print();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var Foo = function() {};
|
||||||
|
Foo.prototype.set = function(value) {
|
||||||
|
this.value = value;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
Foo.prototype.print = function() {
|
||||||
|
console.log(this.value);
|
||||||
|
}
|
||||||
|
new Foo().set("PASS").print();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
concise_method_with_super: {
|
||||||
|
options = {
|
||||||
|
arrows: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
f: "FAIL",
|
||||||
|
g() {
|
||||||
|
return super.f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Object.setPrototypeOf(o, { f: "PASS" });
|
||||||
|
console.log(o.g());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {
|
||||||
|
f: "FAIL",
|
||||||
|
g() {
|
||||||
|
return super.f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Object.setPrototypeOf(o, { f: "PASS" });
|
||||||
|
console.log(o.g());
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ ascii_only_true: {
|
|||||||
options = {}
|
options = {}
|
||||||
beautify = {
|
beautify = {
|
||||||
ascii_only : true,
|
ascii_only : true,
|
||||||
screw_ie8 : true,
|
ie8 : false,
|
||||||
beautify : false,
|
beautify : false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -13,14 +13,14 @@ ascii_only_true: {
|
|||||||
"\x20\x21\x22\x23 ... \x7d\x7e\x7f\x80\x81 ... \xfe\xff\u0fff\uffff";
|
"\x20\x21\x22\x23 ... \x7d\x7e\x7f\x80\x81 ... \xfe\xff\u0fff\uffff";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect_exact: 'function f(){return"\\x000\\x001\\x007\\08\\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_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: {
|
ascii_only_false: {
|
||||||
options = {}
|
options = {}
|
||||||
beautify = {
|
beautify = {
|
||||||
ascii_only : false,
|
ascii_only : false,
|
||||||
screw_ie8 : true,
|
ie8 : false,
|
||||||
beautify : false,
|
beautify : false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -31,6 +31,5 @@ ascii_only_false: {
|
|||||||
"\x20\x21\x22\x23 ... \x7d\x7e\x7f\x80\x81 ... \xfe\xff\u0fff\uffff";
|
"\x20\x21\x22\x23 ... \x7d\x7e\x7f\x80\x81 ... \xfe\xff\u0fff\uffff";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect_exact: 'function f(){return"\\x000\\x001\\x007\\08\\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_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\'}'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -104,3 +104,65 @@ asm_mixed: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
asm_toplevel: {
|
||||||
|
options = {}
|
||||||
|
input: {
|
||||||
|
"use asm";
|
||||||
|
0.0;
|
||||||
|
function f() {
|
||||||
|
0.0;
|
||||||
|
(function(){
|
||||||
|
0.0;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
0.0;
|
||||||
|
}
|
||||||
|
expect_exact: '"use asm";0.0;function f(){0.0;(function(){0.0})}0.0;'
|
||||||
|
}
|
||||||
|
|
||||||
|
asm_function_expression: {
|
||||||
|
options = {}
|
||||||
|
input: {
|
||||||
|
0.0;
|
||||||
|
var a = function() {
|
||||||
|
"use asm";
|
||||||
|
0.0;
|
||||||
|
}
|
||||||
|
function f() {
|
||||||
|
0.0;
|
||||||
|
return function(){
|
||||||
|
"use asm";
|
||||||
|
0.0;
|
||||||
|
}
|
||||||
|
0.0;
|
||||||
|
}
|
||||||
|
0.0;
|
||||||
|
}
|
||||||
|
expect_exact: '0;var a=function(){"use asm";0.0};function f(){0;return function(){"use asm";0.0};0}0;'
|
||||||
|
}
|
||||||
|
|
||||||
|
asm_nested_functions: {
|
||||||
|
options = {}
|
||||||
|
input: {
|
||||||
|
0.0;
|
||||||
|
function a() {
|
||||||
|
"use asm";
|
||||||
|
0.0;
|
||||||
|
}
|
||||||
|
0.0;
|
||||||
|
function b() {
|
||||||
|
0.0;
|
||||||
|
function c(){
|
||||||
|
"use asm";
|
||||||
|
0.0;
|
||||||
|
}
|
||||||
|
0.0;
|
||||||
|
function d(){
|
||||||
|
0.0;
|
||||||
|
}
|
||||||
|
0.0;
|
||||||
|
}
|
||||||
|
0.0;
|
||||||
|
}
|
||||||
|
expect_exact: '0;function a(){"use asm";0.0}0;function b(){0;function c(){"use asm";0.0}0;function d(){0}0}0;'
|
||||||
|
}
|
||||||
|
|||||||
294
test/compress/async.js
Normal file
294
test/compress/async.js
Normal file
@@ -0,0 +1,294 @@
|
|||||||
|
await_precedence: {
|
||||||
|
input: {
|
||||||
|
async function f1() { await x + y; }
|
||||||
|
async function f2() { await (x + y); }
|
||||||
|
}
|
||||||
|
expect_exact: "async function f1(){await x+y}async function f2(){await(x+y)}"
|
||||||
|
}
|
||||||
|
|
||||||
|
await_precedence_prop: {
|
||||||
|
input: {
|
||||||
|
async function f1(){ return (await foo()).bar; }
|
||||||
|
async function f2(){ return (await foo().bar); }
|
||||||
|
}
|
||||||
|
expect_exact: "async function f1(){return(await foo()).bar}async function f2(){return await foo().bar}"
|
||||||
|
}
|
||||||
|
|
||||||
|
await_precedence_call: {
|
||||||
|
input: {
|
||||||
|
async function f3(){ return (await foo())(); }
|
||||||
|
async function f4(){ return await (foo()()); }
|
||||||
|
}
|
||||||
|
expect_exact: "async function f3(){return(await foo())()}async function f4(){return await foo()()}"
|
||||||
|
}
|
||||||
|
|
||||||
|
async_function_declaration: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
async function f0() {}
|
||||||
|
async function f1() { await x + y; }
|
||||||
|
async function f2() { await (x + y); }
|
||||||
|
async function f3() { await x + await y; }
|
||||||
|
async function f4() { await (x + await y); }
|
||||||
|
async function f5() { await x; await y; }
|
||||||
|
async function f6() { await x, await y; }
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
async function f0() {}
|
||||||
|
async function f1() { await x, y; }
|
||||||
|
async function f2() { await (x + y); }
|
||||||
|
async function f3() { await x, await y; }
|
||||||
|
async function f4() { await (x + await y); }
|
||||||
|
async function f5() { await x; await y; }
|
||||||
|
async function f6() { await x, await y; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async_function_expression: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var named = async function foo() {
|
||||||
|
await bar(1 + 0) + (2 + 0);
|
||||||
|
}
|
||||||
|
var anon = async function() {
|
||||||
|
await (1 + 0) + bar(2 + 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var named = async function() {
|
||||||
|
await bar(1);
|
||||||
|
};
|
||||||
|
var anon = async function() {
|
||||||
|
await 1, bar(2);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async_class: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
class Foo {
|
||||||
|
async m1() {
|
||||||
|
return await foo(1 + 2);
|
||||||
|
}
|
||||||
|
static async m2() {
|
||||||
|
return await foo(3 + 4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
class Foo {
|
||||||
|
async m1() {
|
||||||
|
return await foo(3);
|
||||||
|
}
|
||||||
|
static async m2() {
|
||||||
|
return await foo(7);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async_object_literal: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var obj = {
|
||||||
|
async a() {
|
||||||
|
await foo(1 + 0);
|
||||||
|
},
|
||||||
|
anon: async function(){
|
||||||
|
await foo(2 + 0);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var obj = {
|
||||||
|
async a() {
|
||||||
|
await foo(1);
|
||||||
|
},
|
||||||
|
anon: async function() {
|
||||||
|
await foo(2);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async_export: {
|
||||||
|
input: {
|
||||||
|
export async function run() {};
|
||||||
|
export default async function def() {};
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
export async function run() {};
|
||||||
|
export default async function def() {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async_inline: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
conditionals: true,
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
negate_iife: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(async function(){ return await 3; })();
|
||||||
|
(async function(x){ await console.log(x); })(4);
|
||||||
|
|
||||||
|
function echo(x) { return x; }
|
||||||
|
echo( async function(){ return await 1; }() );
|
||||||
|
echo( async function(x){ await console.log(x); }(2) );
|
||||||
|
|
||||||
|
function top() { console.log("top"); }
|
||||||
|
top();
|
||||||
|
|
||||||
|
async function async_top() { console.log("async_top"); }
|
||||||
|
async_top();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
!async function(){await 3}();
|
||||||
|
!async function(x){await console.log(4)}();
|
||||||
|
|
||||||
|
function echo(x){return x}
|
||||||
|
echo(async function(){return await 1}());
|
||||||
|
echo(async function(x){await console.log(2)}());
|
||||||
|
|
||||||
|
console.log("top");
|
||||||
|
|
||||||
|
!async function(){console.log("async_top")}();
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"4",
|
||||||
|
"2",
|
||||||
|
"top",
|
||||||
|
"async_top",
|
||||||
|
]
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
async_identifiers: {
|
||||||
|
input: {
|
||||||
|
var async = function(x){ console.log("async", x); };
|
||||||
|
var await = function(x){ console.log("await", x); };
|
||||||
|
async(1);
|
||||||
|
await(2);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var async = function(x){ console.log("async", x); };
|
||||||
|
var await = function(x){ console.log("await", x); };
|
||||||
|
async(1);
|
||||||
|
await(2);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"async 1",
|
||||||
|
"await 2",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
async_shorthand_property: {
|
||||||
|
mangle = {
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function print(o) { console.log(o.async + " " + o.await); }
|
||||||
|
var async = "Async", await = "Await";
|
||||||
|
|
||||||
|
print({ async });
|
||||||
|
print({ await });
|
||||||
|
print({ async, await });
|
||||||
|
print({ await, async });
|
||||||
|
|
||||||
|
print({ async: async });
|
||||||
|
print({ await: await });
|
||||||
|
print({ async: async, await: await });
|
||||||
|
print({ await: await, async: async });
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function a(a) { console.log(a.async + " " + a.await); }
|
||||||
|
var n = "Async", c = "Await";
|
||||||
|
|
||||||
|
a({ async: n });
|
||||||
|
a({ await: c });
|
||||||
|
a({ async: n, await: c });
|
||||||
|
a({ await: c, async: n });
|
||||||
|
|
||||||
|
a({ async: n });
|
||||||
|
a({ await: c });
|
||||||
|
a({ async: n, await: c });
|
||||||
|
a({ await: c, async: n });
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"Async undefined",
|
||||||
|
"undefined Await",
|
||||||
|
"Async Await",
|
||||||
|
"Async Await",
|
||||||
|
"Async undefined",
|
||||||
|
"undefined Await",
|
||||||
|
"Async Await",
|
||||||
|
"Async Await",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
async_arrow: {
|
||||||
|
input: {
|
||||||
|
let a1 = async x => await foo(x);
|
||||||
|
let a2 = async () => await bar();
|
||||||
|
let a3 = async (x) => await baz(x);
|
||||||
|
let a4 = async (x, y) => { await far(x, y); }
|
||||||
|
let a5 = async ({x = [1], y: z = 2}) => { await wow(x, z); }
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
let a1 = async x => await foo(x);
|
||||||
|
let a2 = async () => await bar();
|
||||||
|
let a3 = async (x) => await baz(x);
|
||||||
|
let a4 = async (x, y) => { await far(x, y); }
|
||||||
|
let a5 = async ({x = [1], y: z = 2}) => { await wow(x, z); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async_arrow_wait: {
|
||||||
|
input: {
|
||||||
|
var a = async (x, y) => await x(y);
|
||||||
|
}
|
||||||
|
expect_exact: "var a=async(x,y)=>await x(y);"
|
||||||
|
}
|
||||||
|
|
||||||
|
async_arrow_iife: {
|
||||||
|
input: {
|
||||||
|
(async () => {
|
||||||
|
await fetch({});
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_exact: "(async()=>{await fetch({})})();"
|
||||||
|
}
|
||||||
|
|
||||||
|
async_arrow_iife_negate_iife: {
|
||||||
|
options = {
|
||||||
|
negate_iife: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(async () => {
|
||||||
|
await fetch();
|
||||||
|
})();
|
||||||
|
(() => {
|
||||||
|
plain();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_exact: "(async()=>{await fetch()})();(()=>{plain()})();"
|
||||||
|
}
|
||||||
@@ -104,34 +104,36 @@ regression_block_scope_resolves: {
|
|||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
(function () {
|
(function () {
|
||||||
if(1) {
|
if (1) {
|
||||||
let x;
|
let x;
|
||||||
const y;
|
const y = 1;
|
||||||
class Zee {};
|
class Zee {};
|
||||||
}
|
}
|
||||||
if(1) {
|
if (1) {
|
||||||
let ex;
|
let ex;
|
||||||
const why;
|
const why = 2;
|
||||||
class Zi {};
|
class Zi {};
|
||||||
}
|
}
|
||||||
console.log(x, y, Zee, ex, why, Zi);
|
console.log(typeof x, typeof y, typeof Zee, typeof ex, typeof why, typeof Zi);
|
||||||
}());
|
}());
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
(function () {
|
(function () {
|
||||||
if (1) {
|
if (1) {
|
||||||
let o;
|
let e;
|
||||||
const n;
|
const o = 1;
|
||||||
class c {};
|
class t {};
|
||||||
}
|
}
|
||||||
if (1) {
|
if (1) {
|
||||||
let o;
|
let e;
|
||||||
const n;
|
const o = 2;
|
||||||
class c {};
|
class t {};
|
||||||
}
|
}
|
||||||
console.log(x, y, Zee, ex, why, Zi);
|
console.log(typeof x, typeof y, typeof Zee, typeof ex, typeof why, typeof Zi);
|
||||||
}());
|
}());
|
||||||
}
|
}
|
||||||
|
expect_stdout: "undefined undefined undefined undefined undefined undefined"
|
||||||
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|
||||||
switch_block_scope_mangler: {
|
switch_block_scope_mangler: {
|
||||||
@@ -153,25 +155,37 @@ switch_block_scope_mangler: {
|
|||||||
console.log(cat);
|
console.log(cat);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
fn(1);
|
||||||
|
fn(2);
|
||||||
|
fn(3);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var fn = function(o) {
|
var fn = function(e) {
|
||||||
switch (o) {
|
switch (e) {
|
||||||
case 1:
|
case 1:
|
||||||
let e = o + 1
|
let l = e + 1
|
||||||
let c = o + 4;
|
let o = e + 4;
|
||||||
console.log(e, c);
|
console.log(l, o);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
let l = o + 2;
|
let n = e + 2;
|
||||||
console.log(l);
|
console.log(n);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
let a = o + 3;
|
let c = e + 3;
|
||||||
console.log(a);
|
console.log(c);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
fn(1);
|
||||||
|
fn(2);
|
||||||
|
fn(3);
|
||||||
}
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"2 5",
|
||||||
|
"4",
|
||||||
|
"6",
|
||||||
|
]
|
||||||
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,3 +47,142 @@ keep_some_blocks: {
|
|||||||
} else stuff();
|
} else stuff();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_1664: {
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
function f() {
|
||||||
|
if (undefined) a = 2;
|
||||||
|
{
|
||||||
|
function undefined() {}
|
||||||
|
undefined();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 1;
|
||||||
|
function f() {
|
||||||
|
if (undefined) a = 2;
|
||||||
|
{
|
||||||
|
function undefined() {}
|
||||||
|
undefined();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "1"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1672_for: {
|
||||||
|
input: {
|
||||||
|
switch (function() {
|
||||||
|
return xxx;
|
||||||
|
}) {
|
||||||
|
case xxx:
|
||||||
|
for (; console.log("FAIL");) {
|
||||||
|
function xxx() {}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
switch (function() {
|
||||||
|
return xxx;
|
||||||
|
}) {
|
||||||
|
case xxx:
|
||||||
|
for (; console.log("FAIL");) {
|
||||||
|
function xxx() {}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1672_for_strict: {
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
switch (function() {
|
||||||
|
return xxx;
|
||||||
|
}) {
|
||||||
|
case xxx:
|
||||||
|
for (; console.log("FAIL");) {
|
||||||
|
function xxx() {}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
switch (function() {
|
||||||
|
return xxx;
|
||||||
|
}) {
|
||||||
|
case xxx:
|
||||||
|
for (; console.log("FAIL");) {
|
||||||
|
function xxx() {}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1672_if: {
|
||||||
|
input: {
|
||||||
|
switch (function() {
|
||||||
|
return xxx;
|
||||||
|
}) {
|
||||||
|
case xxx:
|
||||||
|
if (console.log("FAIL")) {
|
||||||
|
function xxx() {}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
switch (function() {
|
||||||
|
return xxx;
|
||||||
|
}) {
|
||||||
|
case xxx:
|
||||||
|
if (console.log("FAIL")) function xxx() {}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1672_if_strict: {
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
switch (function() {
|
||||||
|
return xxx;
|
||||||
|
}) {
|
||||||
|
case xxx:
|
||||||
|
if (console.log("FAIL")) {
|
||||||
|
function xxx() {}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
switch (function() {
|
||||||
|
return xxx;
|
||||||
|
}) {
|
||||||
|
case xxx:
|
||||||
|
if (console.log("FAIL")) {
|
||||||
|
function xxx() {}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -73,4 +73,41 @@ dont_change_in_or_instanceof_expressions: {
|
|||||||
1 instanceof 1;
|
1 instanceof 1;
|
||||||
null instanceof null;
|
null instanceof null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self_comparison_1: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
a === a;
|
||||||
|
a !== b;
|
||||||
|
b.c === a.c;
|
||||||
|
b.c !== b.c;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
a == a;
|
||||||
|
a !== b;
|
||||||
|
b.c === a.c;
|
||||||
|
b.c != b.c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
self_comparison_2: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {}
|
||||||
|
var o = {};
|
||||||
|
console.log(f != f, o === o);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {}
|
||||||
|
var o = {};
|
||||||
|
console.log(false, true);
|
||||||
|
}
|
||||||
|
expect_stdout: "false true"
|
||||||
|
}
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ concat_1: {
|
|||||||
var c = 1 + x() + 2 + "boo";
|
var c = 1 + x() + 2 + "boo";
|
||||||
var d = 1 + x() + 2 + 3 + "boo";
|
var d = 1 + x() + 2 + 3 + "boo";
|
||||||
var e = 1 + x() + 2 + "X3boo";
|
var e = 1 + x() + 2 + "X3boo";
|
||||||
var f = "\x00360\08\0";
|
var f = "\x00360\x008\0";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -51,6 +51,7 @@ concat_2: {
|
|||||||
"1" + "2" + "3"
|
"1" + "2" + "3"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
concat_3: {
|
concat_3: {
|
||||||
@@ -79,6 +80,7 @@ concat_3: {
|
|||||||
1 + 2 + "3" + "4" + "5"
|
1 + 2 + "3" + "4" + "5"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
concat_4: {
|
concat_4: {
|
||||||
@@ -107,6 +109,7 @@ concat_4: {
|
|||||||
1 + "2" + "3" + "4" + "5"
|
1 + "2" + "3" + "4" + "5"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
concat_5: {
|
concat_5: {
|
||||||
@@ -135,6 +138,7 @@ concat_5: {
|
|||||||
"1" + 2 + "3" + "4" + "5"
|
"1" + 2 + "3" + "4" + "5"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
concat_6: {
|
concat_6: {
|
||||||
@@ -163,6 +167,7 @@ concat_6: {
|
|||||||
"1" + "2" + "3" + "4" + "5"
|
"1" + "2" + "3" + "4" + "5"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
concat_7: {
|
concat_7: {
|
||||||
@@ -188,6 +193,7 @@ concat_7: {
|
|||||||
x += "foo"
|
x += "foo"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
concat_8: {
|
concat_8: {
|
||||||
@@ -213,4 +219,5 @@ concat_8: {
|
|||||||
x += "foo"
|
x += "foo"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -797,3 +797,221 @@ no_evaluate: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
equality_conditionals_false: {
|
||||||
|
options = {
|
||||||
|
conditionals: false,
|
||||||
|
sequences: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b, c) {
|
||||||
|
console.log(
|
||||||
|
a == (b ? a : a),
|
||||||
|
a == (b ? a : c),
|
||||||
|
a != (b ? a : a),
|
||||||
|
a != (b ? a : c),
|
||||||
|
a === (b ? a : a),
|
||||||
|
a === (b ? a : c),
|
||||||
|
a !== (b ? a : a),
|
||||||
|
a !== (b ? a : c)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
f(0, 0, 0);
|
||||||
|
f(0, true, 0);
|
||||||
|
f(1, 2, 3);
|
||||||
|
f(1, null, 3);
|
||||||
|
f(NaN);
|
||||||
|
f(NaN, "foo");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b, c) {
|
||||||
|
console.log(
|
||||||
|
a == (b ? a : a),
|
||||||
|
a == (b ? a : c),
|
||||||
|
a != (b ? a : a),
|
||||||
|
a != (b ? a : c),
|
||||||
|
a === (b ? a : a),
|
||||||
|
a === (b ? a : c),
|
||||||
|
a !== (b ? a : a),
|
||||||
|
a !== (b ? a : c)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
f(0, 0, 0),
|
||||||
|
f(0, true, 0),
|
||||||
|
f(1, 2, 3),
|
||||||
|
f(1, null, 3),
|
||||||
|
f(NaN),
|
||||||
|
f(NaN, "foo");
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
equality_conditionals_true: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
sequences: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b, c) {
|
||||||
|
console.log(
|
||||||
|
a == (b ? a : a),
|
||||||
|
a == (b ? a : c),
|
||||||
|
a != (b ? a : a),
|
||||||
|
a != (b ? a : c),
|
||||||
|
a === (b ? a : a),
|
||||||
|
a === (b ? a : c),
|
||||||
|
a !== (b ? a : a),
|
||||||
|
a !== (b ? a : c)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
f(0, 0, 0);
|
||||||
|
f(0, true, 0);
|
||||||
|
f(1, 2, 3);
|
||||||
|
f(1, null, 3);
|
||||||
|
f(NaN);
|
||||||
|
f(NaN, "foo");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b, c) {
|
||||||
|
console.log(
|
||||||
|
(b, a == a),
|
||||||
|
a == (b ? a : c),
|
||||||
|
(b, a != a),
|
||||||
|
a != (b ? a : c),
|
||||||
|
(b, a === a),
|
||||||
|
a === (b ? a : c),
|
||||||
|
(b, a !== a),
|
||||||
|
a !== (b ? a : c)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
f(0, 0, 0),
|
||||||
|
f(0, true, 0),
|
||||||
|
f(1, 2, 3),
|
||||||
|
f(1, null, 3),
|
||||||
|
f(NaN),
|
||||||
|
f(NaN, "foo");
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1645_1: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 100, b = 10;
|
||||||
|
(b = a) ? a++ + (b += a) ? b += a : b += a : b ^= a;
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 100, b = 10;
|
||||||
|
(b = a) ? (a++ + (b += a), b += a) : b ^= a;
|
||||||
|
console.log(a,b);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1645_2: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 0;
|
||||||
|
function f() {
|
||||||
|
return a++;
|
||||||
|
}
|
||||||
|
f() ? a += 2 : a += 4;
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 0;
|
||||||
|
function f(){
|
||||||
|
return a++;
|
||||||
|
}
|
||||||
|
f() ? a += 2 : a += 4;
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
condition_symbol_matches_consequent: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function foo(x, y) {
|
||||||
|
return x ? x : y;
|
||||||
|
}
|
||||||
|
function bar() {
|
||||||
|
return g ? g : h;
|
||||||
|
}
|
||||||
|
var g = 4;
|
||||||
|
var h = 5;
|
||||||
|
console.log(foo(3, null), foo(0, 7), foo(true, false), bar());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function foo(x, y) {
|
||||||
|
return x || y;
|
||||||
|
}
|
||||||
|
function bar() {
|
||||||
|
return g || h;
|
||||||
|
}
|
||||||
|
var g = 4;
|
||||||
|
var h = 5;
|
||||||
|
console.log(foo(3, null), foo(0, 7), foo(true, false), bar());
|
||||||
|
}
|
||||||
|
expect_stdout: "3 7 true 4"
|
||||||
|
}
|
||||||
|
|
||||||
|
delete_conditional_1: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(delete (1 ? undefined : x));
|
||||||
|
console.log(delete (1 ? void 0 : x));
|
||||||
|
console.log(delete (1 ? Infinity : x));
|
||||||
|
console.log(delete (1 ? 1 / 0 : x));
|
||||||
|
console.log(delete (1 ? NaN : x));
|
||||||
|
console.log(delete (1 ? 0 / 0 : x));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(!0);
|
||||||
|
console.log(!0);
|
||||||
|
console.log(!0);
|
||||||
|
console.log(!0);
|
||||||
|
console.log(!0);
|
||||||
|
console.log(!0);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
delete_conditional_2: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
evaluate: true,
|
||||||
|
keep_infinity: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(delete (0 ? x : undefined));
|
||||||
|
console.log(delete (0 ? x : void 0));
|
||||||
|
console.log(delete (0 ? x : Infinity));
|
||||||
|
console.log(delete (0 ? x : 1 / 0));
|
||||||
|
console.log(delete (0 ? x : NaN));
|
||||||
|
console.log(delete (0 ? x : 0 / 0));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(!0);
|
||||||
|
console.log(!0);
|
||||||
|
console.log(!0);
|
||||||
|
console.log(!0);
|
||||||
|
console.log(!0);
|
||||||
|
console.log(!0);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|||||||
@@ -162,4 +162,5 @@ regexp_literal_not_const: {
|
|||||||
while (result = REGEXP_LITERAL.exec("acdabcdeabbb")) console.log(result[0]);
|
while (result = REGEXP_LITERAL.exec("acdabcdeabbb")) console.log(result[0]);
|
||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ dead_code_2_should_warn: {
|
|||||||
function f() {
|
function f() {
|
||||||
g();
|
g();
|
||||||
x = 10;
|
x = 10;
|
||||||
throw "foo";
|
throw new Error("foo");
|
||||||
// completely discarding the `if` would introduce some
|
// completely discarding the `if` would introduce some
|
||||||
// bugs. UglifyJS v1 doesn't deal with this issue; in v2
|
// bugs. UglifyJS v1 doesn't deal with this issue; in v2
|
||||||
// we copy any declarations to the upper scope.
|
// we copy any declarations to the upper scope.
|
||||||
@@ -46,16 +46,60 @@ dead_code_2_should_warn: {
|
|||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
f();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function f() {
|
function f() {
|
||||||
g();
|
g();
|
||||||
x = 10;
|
x = 10;
|
||||||
throw "foo";
|
throw new Error("foo");
|
||||||
var x;
|
var x;
|
||||||
function g(){};
|
var g;
|
||||||
}
|
}
|
||||||
|
f();
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
dead_code_2_should_warn_strict: {
|
||||||
|
options = {
|
||||||
|
dead_code: true
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
function f() {
|
||||||
|
g();
|
||||||
|
x = 10;
|
||||||
|
throw new Error("foo");
|
||||||
|
// completely discarding the `if` would introduce some
|
||||||
|
// bugs. UglifyJS v1 doesn't deal with this issue; in v2
|
||||||
|
// we copy any declarations to the upper scope.
|
||||||
|
if (x) {
|
||||||
|
y();
|
||||||
|
var x;
|
||||||
|
function g(){};
|
||||||
|
// but nested declarations should not be kept.
|
||||||
|
(function(){
|
||||||
|
var q;
|
||||||
|
function y(){};
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
function f() {
|
||||||
|
g();
|
||||||
|
x = 10;
|
||||||
|
throw new Error("foo");
|
||||||
|
var x;
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
node_version: ">=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
dead_code_constant_boolean_should_warn_more: {
|
dead_code_constant_boolean_should_warn_more: {
|
||||||
@@ -78,15 +122,55 @@ dead_code_constant_boolean_should_warn_more: {
|
|||||||
foo();
|
foo();
|
||||||
var moo;
|
var moo;
|
||||||
}
|
}
|
||||||
|
bar();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var foo;
|
var foo;
|
||||||
function bar() {}
|
var bar;
|
||||||
// nothing for the while
|
// nothing for the while
|
||||||
// as for the for, it should keep:
|
// as for the for, it should keep:
|
||||||
var x = 10, y;
|
var x = 10, y;
|
||||||
var moo;
|
var moo;
|
||||||
|
bar();
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
dead_code_constant_boolean_should_warn_more_strict: {
|
||||||
|
options = {
|
||||||
|
dead_code : true,
|
||||||
|
loops : true,
|
||||||
|
booleans : true,
|
||||||
|
conditionals : true,
|
||||||
|
evaluate : true,
|
||||||
|
side_effects : true,
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
while (!((foo && bar) || (x + "0"))) {
|
||||||
|
console.log("unreachable");
|
||||||
|
var foo;
|
||||||
|
function bar() {}
|
||||||
|
}
|
||||||
|
for (var x = 10, y; x && (y || x) && (!typeof x); ++x) {
|
||||||
|
asdf();
|
||||||
|
foo();
|
||||||
|
var moo;
|
||||||
|
}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
var foo;
|
||||||
|
// nothing for the while
|
||||||
|
// as for the for, it should keep:
|
||||||
|
var x = 10, y;
|
||||||
|
var moo;
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
node_version: ">=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
dead_code_block_decls_die: {
|
dead_code_block_decls_die: {
|
||||||
@@ -133,8 +217,9 @@ dead_code_const_declaration: {
|
|||||||
var unused;
|
var unused;
|
||||||
const CONST_FOO = !1;
|
const CONST_FOO = !1;
|
||||||
var moo;
|
var moo;
|
||||||
function bar() {}
|
var bar;
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
dead_code_const_annotation: {
|
dead_code_const_annotation: {
|
||||||
@@ -160,8 +245,9 @@ dead_code_const_annotation: {
|
|||||||
var unused;
|
var unused;
|
||||||
var CONST_FOO_ANN = !1;
|
var CONST_FOO_ANN = !1;
|
||||||
var moo;
|
var moo;
|
||||||
function bar() {}
|
var bar;
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
dead_code_const_annotation_regex: {
|
dead_code_const_annotation_regex: {
|
||||||
@@ -185,6 +271,7 @@ dead_code_const_annotation_regex: {
|
|||||||
var CONST_FOO_ANN = !1;
|
var CONST_FOO_ANN = !1;
|
||||||
CONST_FOO_ANN && console.log('reachable');
|
CONST_FOO_ANN && console.log('reachable');
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
dead_code_const_annotation_complex_scope: {
|
dead_code_const_annotation_complex_scope: {
|
||||||
@@ -225,9 +312,312 @@ dead_code_const_annotation_complex_scope: {
|
|||||||
var CONST_FOO_ANN = !1;
|
var CONST_FOO_ANN = !1;
|
||||||
var unused_var_2;
|
var unused_var_2;
|
||||||
var moo;
|
var moo;
|
||||||
function bar() {}
|
var bar;
|
||||||
var beef = 'good';
|
var beef = 'good';
|
||||||
var meat = 'beef';
|
var meat = 'beef';
|
||||||
var pork = 'bad';
|
var pork = 'bad';
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
try_catch_finally: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
!function() {
|
||||||
|
try {
|
||||||
|
if (false) throw x;
|
||||||
|
} catch (a) {
|
||||||
|
var a = 2;
|
||||||
|
console.log("FAIL");
|
||||||
|
} finally {
|
||||||
|
a = 3;
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}();
|
||||||
|
try {
|
||||||
|
console.log(a);
|
||||||
|
} finally {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 1;
|
||||||
|
!function() {
|
||||||
|
var a;
|
||||||
|
a = 3;
|
||||||
|
console.log("PASS");
|
||||||
|
}();
|
||||||
|
try {
|
||||||
|
console.log(a);
|
||||||
|
} finally {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"PASS",
|
||||||
|
"1",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
accessor: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
({
|
||||||
|
get a() {},
|
||||||
|
set a(v){
|
||||||
|
this.b = 2;
|
||||||
|
},
|
||||||
|
b: 1
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2233_1: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
side_effects: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
Array.isArray;
|
||||||
|
Boolean;
|
||||||
|
console.log;
|
||||||
|
Date;
|
||||||
|
decodeURI;
|
||||||
|
decodeURIComponent;
|
||||||
|
encodeURI;
|
||||||
|
encodeURIComponent;
|
||||||
|
Error.name;
|
||||||
|
escape;
|
||||||
|
eval;
|
||||||
|
EvalError;
|
||||||
|
Function.length;
|
||||||
|
isFinite;
|
||||||
|
isNaN;
|
||||||
|
JSON;
|
||||||
|
Math.random;
|
||||||
|
Number.isNaN;
|
||||||
|
parseFloat;
|
||||||
|
parseInt;
|
||||||
|
RegExp;
|
||||||
|
Object.defineProperty;
|
||||||
|
String.fromCharCode;
|
||||||
|
RangeError;
|
||||||
|
ReferenceError;
|
||||||
|
SyntaxError;
|
||||||
|
TypeError;
|
||||||
|
unescape;
|
||||||
|
URIError;
|
||||||
|
}
|
||||||
|
expect: {}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
global_timeout_and_interval_symbols: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
side_effects: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
// These global symbols do not exist in the test sandbox
|
||||||
|
// and must be tested separately.
|
||||||
|
clearInterval;
|
||||||
|
clearTimeout;
|
||||||
|
setInterval;
|
||||||
|
setTimeout;
|
||||||
|
}
|
||||||
|
expect: {}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2233_2: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var RegExp;
|
||||||
|
Array.isArray;
|
||||||
|
RegExp;
|
||||||
|
UndeclaredGlobal;
|
||||||
|
function foo() {
|
||||||
|
var Number;
|
||||||
|
AnotherUndeclaredGlobal;
|
||||||
|
Math.sin;
|
||||||
|
Number.isNaN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var RegExp;
|
||||||
|
UndeclaredGlobal;
|
||||||
|
function foo() {
|
||||||
|
var Number;
|
||||||
|
AnotherUndeclaredGlobal;
|
||||||
|
Number.isNaN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2233_3: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var RegExp;
|
||||||
|
Array.isArray;
|
||||||
|
RegExp;
|
||||||
|
UndeclaredGlobal;
|
||||||
|
function foo() {
|
||||||
|
var Number;
|
||||||
|
AnotherUndeclaredGlobal;
|
||||||
|
Math.sin;
|
||||||
|
Number.isNaN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
UndeclaredGlobal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
global_fns: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
Boolean(1, 2);
|
||||||
|
decodeURI(1, 2);
|
||||||
|
decodeURIComponent(1, 2);
|
||||||
|
Date(1, 2);
|
||||||
|
encodeURI(1, 2);
|
||||||
|
encodeURIComponent(1, 2);
|
||||||
|
Error(1, 2);
|
||||||
|
escape(1, 2);
|
||||||
|
EvalError(1, 2);
|
||||||
|
isFinite(1, 2);
|
||||||
|
isNaN(1, 2);
|
||||||
|
Number(1, 2);
|
||||||
|
Object(1, 2);
|
||||||
|
parseFloat(1, 2);
|
||||||
|
parseInt(1, 2);
|
||||||
|
RangeError(1, 2);
|
||||||
|
ReferenceError(1, 2);
|
||||||
|
String(1, 2);
|
||||||
|
SyntaxError(1, 2);
|
||||||
|
TypeError(1, 2);
|
||||||
|
unescape(1, 2);
|
||||||
|
URIError(1, 2);
|
||||||
|
try {
|
||||||
|
Function(1, 2);
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e.name);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
RegExp(1, 2);
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e.name);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
Array(NaN);
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e.name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
try {
|
||||||
|
Function(1, 2);
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e.name);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
RegExp(1, 2);
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e.name);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
Array(NaN);
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e.name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"SyntaxError",
|
||||||
|
"SyntaxError",
|
||||||
|
"RangeError",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2383_1: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
if (0) {
|
||||||
|
var {x, y} = foo();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var x, y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2383_2: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
if (0) {
|
||||||
|
var {
|
||||||
|
x = 0,
|
||||||
|
y: [ w, , { z, p: q = 7 } ] = [ 1, 2, { z: 3 } ]
|
||||||
|
} = {};
|
||||||
|
}
|
||||||
|
console.log(x, q, w, z);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var x, w, z, q;
|
||||||
|
console.log(x, q, w, z);
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined undefined undefined undefined"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2383_3: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var b = 7, y = 8;
|
||||||
|
if (0) {
|
||||||
|
var a = 1, [ x, y, z ] = [ 2, 3, 4 ], b = 5;
|
||||||
|
}
|
||||||
|
console.log(a, x, y, z, b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var b = 7, y = 8;
|
||||||
|
var a, x, y, z, b;
|
||||||
|
console.log(a, x, y, z, b);
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined undefined 8 undefined 7"
|
||||||
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -65,10 +65,10 @@ nested_destructuring_objects: {
|
|||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
const [{a},b] = c;
|
const [{a},b] = c;
|
||||||
let [{a},b] = c;
|
let [{d},e] = f;
|
||||||
var [{a},b] = c;
|
var [{g},h] = i;
|
||||||
}
|
}
|
||||||
expect_exact: 'const[{a},b]=c;let[{a},b]=c;var[{a},b]=c;';
|
expect_exact: 'const[{a},b]=c;let[{d},e]=f;var[{g},h]=i;';
|
||||||
}
|
}
|
||||||
|
|
||||||
destructuring_constdef_in_loops: {
|
destructuring_constdef_in_loops: {
|
||||||
@@ -151,8 +151,12 @@ destructuring_remove_unused_1: {
|
|||||||
function e() {
|
function e() {
|
||||||
var unused = "foo";
|
var unused = "foo";
|
||||||
var a = [1, 2, 3, 4, 5];
|
var a = [1, 2, 3, 4, 5];
|
||||||
|
var x = [[1, 2, 3]];
|
||||||
|
var y = {h: 1};
|
||||||
var [b, ...c] = a;
|
var [b, ...c] = a;
|
||||||
f(b, c);
|
var [...[e, f]] = x;
|
||||||
|
var [...{g: h}] = y;
|
||||||
|
f(b, c, e, f, g);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
@@ -178,8 +182,12 @@ destructuring_remove_unused_1: {
|
|||||||
}
|
}
|
||||||
function e() {
|
function e() {
|
||||||
var a = [1, 2, 3, 4, 5];
|
var a = [1, 2, 3, 4, 5];
|
||||||
|
var x = [[1, 2, 3]];
|
||||||
|
var y = {h: 1};
|
||||||
var [b, ...c] = a;
|
var [b, ...c] = a;
|
||||||
f(b, c);
|
var [...[e, f]] = x;
|
||||||
|
var [...{g: h}] = y;
|
||||||
|
f(b, c, e, f, g);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -266,8 +274,8 @@ reduce_vars: {
|
|||||||
var {aa, bb: {cc, dd}} = {aa:1, bb: {cc:2, dd: 3}};
|
var {aa, bb: {cc, dd}} = {aa:1, bb: {cc:2, dd: 3}};
|
||||||
({aa, bb: {cc, dd}} = {aa:1, bb: {cc:2, dd: 3}});
|
({aa, bb: {cc, dd}} = {aa:1, bb: {cc:2, dd: 3}});
|
||||||
const [{a},b] = c;
|
const [{a},b] = c;
|
||||||
let [{a},b] = c;
|
let [{d},e] = f;
|
||||||
var [{a},b] = c;
|
var [{g},h] = i;
|
||||||
[{a},b] = c;
|
[{a},b] = c;
|
||||||
for (const [x,y] in pairs);
|
for (const [x,y] in pairs);
|
||||||
for (let [x,y] in pairs);
|
for (let [x,y] in pairs);
|
||||||
@@ -284,8 +292,8 @@ reduce_vars: {
|
|||||||
var {aa, bb: {cc, dd}} = {aa:1, bb: {cc:2, dd: 3}};
|
var {aa, bb: {cc, dd}} = {aa:1, bb: {cc:2, dd: 3}};
|
||||||
({aa, bb: {cc, dd}} = {aa:1, bb: {cc:2, dd: 3}});
|
({aa, bb: {cc, dd}} = {aa:1, bb: {cc:2, dd: 3}});
|
||||||
const [{a},b] = c;
|
const [{a},b] = c;
|
||||||
let [{a},b] = c;
|
let [{d},e] = f;
|
||||||
var [{a},b] = c;
|
var [{g},h] = i;
|
||||||
[{a},b] = c;
|
[{a},b] = c;
|
||||||
for (const [x,y] in pairs);
|
for (const [x,y] in pairs);
|
||||||
for (let [x,y] in pairs);
|
for (let [x,y] in pairs);
|
||||||
@@ -307,3 +315,347 @@ unused: {
|
|||||||
console.log(a);
|
console.log(a);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_1886: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
let [a] = [1];
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
let [a] = [1];
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
destructuring_decl_of_numeric_key: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
let { 3: x } = { [1 + 2]: 42 };
|
||||||
|
console.log(x);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
let { 3: x } = { [3]: 42 };
|
||||||
|
console.log(x);
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
destructuring_decl_of_computed_key: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
let four = 4;
|
||||||
|
let { [7 - four]: x } = { [1 + 2]: 42 };
|
||||||
|
console.log(x);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
let four = 4;
|
||||||
|
let { [7 - four]: x } = { [3]: 42 };
|
||||||
|
console.log(x);
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
destructuring_assign_of_numeric_key: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
let x;
|
||||||
|
({ 3: x } = { [1 + 2]: 42 });
|
||||||
|
console.log(x);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
let x;
|
||||||
|
({ 3: x } = { [3]: 42 });
|
||||||
|
console.log(x);
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
destructuring_assign_of_computed_key: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
let x;
|
||||||
|
let four = 4;
|
||||||
|
({ [(5 + 2) - four]: x } = { [1 + 2]: 42 });
|
||||||
|
console.log(x);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
let x;
|
||||||
|
let four = 4;
|
||||||
|
({ [7 - four]: x } = { [3]: 42 });
|
||||||
|
console.log(x);
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_destructuring_decl: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function test(opts) {
|
||||||
|
let a = opts.a || { e: 7, n: 8 };
|
||||||
|
let { t, e, n, s = 5 + 4, o, r } = a;
|
||||||
|
console.log(t, e, n, s, o, r);
|
||||||
|
}
|
||||||
|
test({a: { t: 1, e: 2, n: 3, s: 4, o: 5, r: 6 }});
|
||||||
|
test({});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function test(t) {
|
||||||
|
let e = t.a || { e: 7, n: 8 };
|
||||||
|
let {t: n, e: o, n: s, s: l = 9, o: a, r: c} = e;
|
||||||
|
console.log(n, o, s, l, a, c);
|
||||||
|
}
|
||||||
|
test({ a: { t: 1, e: 2, n: 3, s: 4, o: 5, r: 6 } });
|
||||||
|
test({});
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"1 2 3 4 5 6",
|
||||||
|
"undefined 7 8 9 undefined undefined",
|
||||||
|
]
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_destructuring_assign_toplevel_true: {
|
||||||
|
options = {
|
||||||
|
toplevel: true,
|
||||||
|
evaluate: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
ecma: 6
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function test(opts) {
|
||||||
|
let s, o, r;
|
||||||
|
let a = opts.a || { e: 7, n: 8 };
|
||||||
|
({ t, e, n, s = 5 + 4, o, r } = a);
|
||||||
|
console.log(t, e, n, s, o, r);
|
||||||
|
}
|
||||||
|
let t, e, n;
|
||||||
|
test({a: { t: 1, e: 2, n: 3, s: 4, o: 5, r: 6 }});
|
||||||
|
test({});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function e(e) {
|
||||||
|
let l, s, a;
|
||||||
|
let c = e.a || { e: 7, n: 8 };
|
||||||
|
({t: n, e: o, n: t, s: l = 9, o: s, r: a} = c);
|
||||||
|
console.log(n, o, t, l, s, a);
|
||||||
|
}
|
||||||
|
let n, o, t;
|
||||||
|
e({ a: { t: 1, e: 2, n: 3, s: 4, o: 5, r: 6 } });
|
||||||
|
e({});
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"1 2 3 4 5 6",
|
||||||
|
"undefined 7 8 9 undefined undefined",
|
||||||
|
]
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_destructuring_assign_toplevel_false: {
|
||||||
|
options = {
|
||||||
|
toplevel: false,
|
||||||
|
evaluate: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
ecma: 6
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function test(opts) {
|
||||||
|
let s, o, r;
|
||||||
|
let a = opts.a || { e: 7, n: 8 };
|
||||||
|
({ t, e, n, s = 9, o, r } = a);
|
||||||
|
console.log(t, e, n, s, o, r);
|
||||||
|
}
|
||||||
|
let t, e, n;
|
||||||
|
test({a: { t: 1, e: 2, n: 3, s: 4, o: 5, r: 6 }});
|
||||||
|
test({});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function test(o) {
|
||||||
|
let s, l, a;
|
||||||
|
let c = o.a || { e: 7, n: 8 };
|
||||||
|
({t, e, n, s = 9, o: l, r: a} = c);
|
||||||
|
console.log(t, e, n, s, l, a);
|
||||||
|
}
|
||||||
|
let t, e, n;
|
||||||
|
test({ a: { t: 1, e: 2, n: 3, s: 4, o: 5, r: 6 } });
|
||||||
|
test({});
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"1 2 3 4 5 6",
|
||||||
|
"undefined 7 8 9 undefined undefined",
|
||||||
|
]
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_destructuring_decl_array: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
unused: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
ecma: 6
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var [, t, e, n, s, o = 2, r = [ 1 + 2 ]] = [ 9, 8, 7, 6 ];
|
||||||
|
console.log(t, e, n, s, o, r);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var [, o, l, a, c, e = 2, g = [ 3 ]] = [ 9, 8, 7, 6 ];
|
||||||
|
console.log(o, l, a, c, e, g);
|
||||||
|
}
|
||||||
|
expect_stdout: "8 7 6 undefined 2 [ 3 ]"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
anon_func_with_destructuring_args: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
unused: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
ecma: 5,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function({foo = 1 + 0, bar = 2}, [car = 3, far = 4]) {
|
||||||
|
console.log(foo, bar, car, far);
|
||||||
|
})({bar: 5 - 0}, [, 6]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function({foo: o = 1, bar: n = 2}, [a = 3, b = 4]) {
|
||||||
|
console.log(o, n, a, b);
|
||||||
|
})({bar: 5}, [, 6]);
|
||||||
|
}
|
||||||
|
expect_stdout: "1 5 3 6"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
arrow_func_with_destructuring_args: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
unused: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
ecma: 5,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(({foo = 1 + 0, bar = 2}, [car = 3, far = 4]) => {
|
||||||
|
console.log(foo, bar, car, far);
|
||||||
|
})({bar: 5 - 0}, [, 6]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(({foo: o = 1, bar: a = 2}, [b = 3, l = 4]) => {
|
||||||
|
console.log(o, a, b, l);
|
||||||
|
})({bar: 5}, [, 6]);
|
||||||
|
}
|
||||||
|
expect_stdout: "1 5 3 6"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2044_ecma_5: {
|
||||||
|
beautify = {
|
||||||
|
beautify: false,
|
||||||
|
ecma: 5,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
({x : a = 1, y = 2 + b, z = 3 - c} = obj);
|
||||||
|
}
|
||||||
|
expect_exact: "({x:a=1,y:y=2+b,z:z=3-c}=obj);"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2044_ecma_6: {
|
||||||
|
beautify = {
|
||||||
|
beautify: false,
|
||||||
|
ecma: 6,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
({x : a = 1, y = 2 + b, z = 3 - c} = obj);
|
||||||
|
}
|
||||||
|
expect_exact: "({x:a=1,y=2+b,z=3-c}=obj);"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2044_ecma_5_beautify: {
|
||||||
|
beautify = {
|
||||||
|
beautify: true,
|
||||||
|
ecma: 5,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
({x : a = 1, y = 2 + b, z = 3 - c} = obj);
|
||||||
|
}
|
||||||
|
expect_exact: "({x: a = 1, y: y = 2 + b, z: z = 3 - c} = obj);"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2044_ecma_6_beautify: {
|
||||||
|
beautify = {
|
||||||
|
beautify: true,
|
||||||
|
ecma: 6,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
({x : a = 1, y = 2 + b, z = 3 - c} = obj);
|
||||||
|
}
|
||||||
|
expect_exact: "({x: a = 1, y = 2 + b, z = 3 - c} = obj);"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2140: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
!function() {
|
||||||
|
var t = {};
|
||||||
|
console.log(([t.a] = [42])[0]);
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
!function() {
|
||||||
|
var t = {};
|
||||||
|
console.log(([t.a] = [42])[0]);
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|||||||
@@ -863,12 +863,707 @@ issue_1583: {
|
|||||||
expect: {
|
expect: {
|
||||||
function m(t) {
|
function m(t) {
|
||||||
(function(e) {
|
(function(e) {
|
||||||
t = (function() {
|
t = function() {
|
||||||
return (function(a) {
|
return (function(a) {
|
||||||
return a;
|
return function(a) {};
|
||||||
})(function(a) {});
|
})();
|
||||||
})();
|
}();
|
||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_1656: {
|
||||||
|
options = {
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
beautify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
for(var a=0;;);
|
||||||
|
}
|
||||||
|
expect_exact: "for (;;) ;"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1709: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(
|
||||||
|
function x() {
|
||||||
|
var x = 1;
|
||||||
|
return x;
|
||||||
|
}(),
|
||||||
|
function y() {
|
||||||
|
const y = 2;
|
||||||
|
return y;
|
||||||
|
}(),
|
||||||
|
function z() {
|
||||||
|
function z() {}
|
||||||
|
return z;
|
||||||
|
}()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(
|
||||||
|
function() {
|
||||||
|
var x = 1;
|
||||||
|
return x;
|
||||||
|
}(),
|
||||||
|
function() {
|
||||||
|
const y = 2;
|
||||||
|
return y;
|
||||||
|
}(),
|
||||||
|
function() {
|
||||||
|
function z() {}
|
||||||
|
return z;
|
||||||
|
}()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1715_1: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
function f() {
|
||||||
|
a++;
|
||||||
|
try {
|
||||||
|
x();
|
||||||
|
} catch (a) {
|
||||||
|
var a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 1;
|
||||||
|
function f() {
|
||||||
|
a++;
|
||||||
|
try {
|
||||||
|
x();
|
||||||
|
} catch (a) {
|
||||||
|
var a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "1"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1715_2: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
function f() {
|
||||||
|
a++;
|
||||||
|
try {
|
||||||
|
x();
|
||||||
|
} catch (a) {
|
||||||
|
var a = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 1;
|
||||||
|
function f() {
|
||||||
|
a++;
|
||||||
|
try {
|
||||||
|
x();
|
||||||
|
} catch (a) {
|
||||||
|
var a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "1"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1715_3: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
function f() {
|
||||||
|
a++;
|
||||||
|
try {
|
||||||
|
console;
|
||||||
|
} catch (a) {
|
||||||
|
var a = 2 + x();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 1;
|
||||||
|
function f() {
|
||||||
|
a++;
|
||||||
|
try {
|
||||||
|
console;
|
||||||
|
} catch (a) {
|
||||||
|
var a;
|
||||||
|
x();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "1"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1715_4: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
!function a() {
|
||||||
|
a++;
|
||||||
|
try {
|
||||||
|
x();
|
||||||
|
} catch (a) {
|
||||||
|
var a;
|
||||||
|
}
|
||||||
|
}();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 1;
|
||||||
|
!function() {
|
||||||
|
a++;
|
||||||
|
try {
|
||||||
|
x();
|
||||||
|
} catch (a) {
|
||||||
|
var a;
|
||||||
|
}
|
||||||
|
}();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "1"
|
||||||
|
}
|
||||||
|
|
||||||
|
delete_assign_1: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
console.log(delete (a = undefined));
|
||||||
|
console.log(delete (a = void 0));
|
||||||
|
console.log(delete (a = Infinity));
|
||||||
|
console.log(delete (a = 1 / 0));
|
||||||
|
console.log(delete (a = NaN));
|
||||||
|
console.log(delete (a = 0 / 0));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log((void 0, !0));
|
||||||
|
console.log((void 0, !0));
|
||||||
|
console.log((1 / 0, !0));
|
||||||
|
console.log((1 / 0, !0));
|
||||||
|
console.log((NaN, !0));
|
||||||
|
console.log((0 / 0, !0));
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
delete_assign_2: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
keep_infinity: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
console.log(delete (a = undefined));
|
||||||
|
console.log(delete (a = void 0));
|
||||||
|
console.log(delete (a = Infinity));
|
||||||
|
console.log(delete (a = 1 / 0));
|
||||||
|
console.log(delete (a = NaN));
|
||||||
|
console.log(delete (a = 0 / 0));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log((void 0, !0));
|
||||||
|
console.log((void 0, !0));
|
||||||
|
console.log((Infinity, !0));
|
||||||
|
console.log((1 / 0, !0));
|
||||||
|
console.log((NaN, !0));
|
||||||
|
console.log((0 / 0, !0));
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_var: {
|
||||||
|
options = {
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
console.log(a, b);
|
||||||
|
var a = 1, b = 2;
|
||||||
|
console.log(a, b);
|
||||||
|
var a = 3;
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(a, b);
|
||||||
|
var a = 1, b = 2;
|
||||||
|
console.log(a, b);
|
||||||
|
a = 3;
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"undefined undefined",
|
||||||
|
"1 2",
|
||||||
|
"3 2",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1830_1: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
!function() {
|
||||||
|
L: for (var b = console.log(1); !1;) continue L;
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
!function() {
|
||||||
|
L: for (console.log(1); !1;) continue L;
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
expect_stdout: "1"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1830_2: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
!function() {
|
||||||
|
L: for (var a = 1, b = console.log(a); --a;) continue L;
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
!function() {
|
||||||
|
var a = 1;
|
||||||
|
L: for (console.log(a); --a;) continue L;
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
expect_stdout: "1"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1838: {
|
||||||
|
options = {
|
||||||
|
join_vars: true,
|
||||||
|
loops: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
beautify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
var b = a;
|
||||||
|
while (c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"function f() {",
|
||||||
|
" for (a; c; ) ;",
|
||||||
|
"}",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
var_catch_toplevel: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
negate_iife: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
a--;
|
||||||
|
try {
|
||||||
|
a++;
|
||||||
|
x();
|
||||||
|
} catch(a) {
|
||||||
|
if (a) var a;
|
||||||
|
var a = 10;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
!function() {
|
||||||
|
try {
|
||||||
|
x();
|
||||||
|
} catch(a) {
|
||||||
|
var a;
|
||||||
|
}
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
reassign_const: {
|
||||||
|
options = {
|
||||||
|
cascade: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
const a = 1;
|
||||||
|
a = 2;
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
console.log(f());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
const a = 1;
|
||||||
|
return a = 2, a;
|
||||||
|
}
|
||||||
|
console.log(f());
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1968: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(c) {
|
||||||
|
var a;
|
||||||
|
if (c) {
|
||||||
|
let b;
|
||||||
|
return (a = 2) + (b = 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(f(1));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(c) {
|
||||||
|
if (c) {
|
||||||
|
let b;
|
||||||
|
return 2 + (b = 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(f(1));
|
||||||
|
}
|
||||||
|
expect_stdout: "5"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2063: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
var a;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2105_1: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
!function(factory) {
|
||||||
|
factory();
|
||||||
|
}( function() {
|
||||||
|
return function(fn) {
|
||||||
|
fn()().prop();
|
||||||
|
}( function() {
|
||||||
|
function bar() {
|
||||||
|
var quux = function() {
|
||||||
|
console.log("PASS");
|
||||||
|
}, foo = function() {
|
||||||
|
console.log;
|
||||||
|
quux();
|
||||||
|
};
|
||||||
|
return { prop: foo };
|
||||||
|
}
|
||||||
|
return bar;
|
||||||
|
} );
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
({
|
||||||
|
prop: function() {
|
||||||
|
console.log;
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}).prop();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2105_2: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
properties: true,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
!function(factory) {
|
||||||
|
factory();
|
||||||
|
}( function() {
|
||||||
|
return function(fn) {
|
||||||
|
fn()().prop();
|
||||||
|
}( function() {
|
||||||
|
function bar() {
|
||||||
|
var quux = function() {
|
||||||
|
console.log("PASS");
|
||||||
|
}, foo = function() {
|
||||||
|
console.log;
|
||||||
|
quux();
|
||||||
|
};
|
||||||
|
return { prop: foo };
|
||||||
|
}
|
||||||
|
return bar;
|
||||||
|
} );
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2136_1: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
!function(a, ...b) {
|
||||||
|
console.log(b);
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
!function(a, ...b) {
|
||||||
|
console.log(b);
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
expect_stdout: "[]"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2136_2: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
inline: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(x) {
|
||||||
|
console.log(x);
|
||||||
|
}
|
||||||
|
!function(a, ...b) {
|
||||||
|
f(b[0]);
|
||||||
|
}(1, 2, 3);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(x) {
|
||||||
|
console.log(x);
|
||||||
|
}
|
||||||
|
f([2,3][0]);
|
||||||
|
}
|
||||||
|
expect_stdout: "2"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2136_3: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 3,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(x) {
|
||||||
|
console.log(x);
|
||||||
|
}
|
||||||
|
!function(a, ...b) {
|
||||||
|
f(b[0]);
|
||||||
|
}(1, 2, 3);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(2);
|
||||||
|
}
|
||||||
|
expect_stdout: "2"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2163: {
|
||||||
|
options = {
|
||||||
|
pure_funcs: [ "pure" ],
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var c;
|
||||||
|
/*@__PURE__*/f(...a);
|
||||||
|
pure(b, ...c);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var c;
|
||||||
|
a;
|
||||||
|
b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2226_1: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f1() {
|
||||||
|
var a = b;
|
||||||
|
a += c;
|
||||||
|
}
|
||||||
|
function f2(a) {
|
||||||
|
a <<= b;
|
||||||
|
}
|
||||||
|
function f3(a) {
|
||||||
|
--a;
|
||||||
|
}
|
||||||
|
function f4() {
|
||||||
|
var a = b;
|
||||||
|
return a *= c;
|
||||||
|
}
|
||||||
|
function f5(a) {
|
||||||
|
x(a /= b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f1() {
|
||||||
|
b;
|
||||||
|
c;
|
||||||
|
}
|
||||||
|
function f2(a) {
|
||||||
|
b;
|
||||||
|
}
|
||||||
|
function f3(a) {
|
||||||
|
0;
|
||||||
|
}
|
||||||
|
function f4() {
|
||||||
|
var a = b;
|
||||||
|
return a *= c;
|
||||||
|
}
|
||||||
|
function f5(a) {
|
||||||
|
x(a /= b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2226_2: {
|
||||||
|
options = {
|
||||||
|
cascade: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(a, b) {
|
||||||
|
a += b;
|
||||||
|
return a;
|
||||||
|
}(1, 2));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(a, b) {
|
||||||
|
return a += b;
|
||||||
|
}(1, 2));
|
||||||
|
}
|
||||||
|
expect_stdout: "3"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2226_3: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(a, b) {
|
||||||
|
a += b;
|
||||||
|
return a;
|
||||||
|
}(1, 2));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(a, b) {
|
||||||
|
return a += 2;
|
||||||
|
}(1));
|
||||||
|
}
|
||||||
|
expect_stdout: "3"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2288: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
beautify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function foo(o) {
|
||||||
|
for (var j = o.a, i = 0; i < 0; i++);
|
||||||
|
for (var i = 0; i < 0; i++);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function foo(o) {
|
||||||
|
o.a;
|
||||||
|
for (i = 0; i < 0; i++);
|
||||||
|
for (var i = 0; i < 0; i++);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -196,10 +196,11 @@ negative_zero: {
|
|||||||
console.log(
|
console.log(
|
||||||
-0,
|
-0,
|
||||||
0,
|
0,
|
||||||
1 / (-0),
|
-1/0,
|
||||||
1 / (-0)
|
-1/0
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
positive_zero: {
|
positive_zero: {
|
||||||
@@ -216,10 +217,11 @@ positive_zero: {
|
|||||||
console.log(
|
console.log(
|
||||||
0,
|
0,
|
||||||
-0,
|
-0,
|
||||||
1 / (0),
|
1/0,
|
||||||
1 / (0)
|
1/0
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
pow: {
|
pow: {
|
||||||
@@ -304,11 +306,11 @@ pow_with_number_constants: {
|
|||||||
var b = 1;
|
var b = 1;
|
||||||
var c = 1;
|
var c = 1;
|
||||||
var d = NaN;
|
var d = NaN;
|
||||||
var e = Infinity;
|
var e = 1/0;
|
||||||
var f = 0;
|
var f = 0;
|
||||||
var g = NaN;
|
var g = NaN;
|
||||||
var h = Infinity;
|
var h = 1/0;
|
||||||
var i = -Infinity;
|
var i = -1/0;
|
||||||
var j = .125;
|
var j = .125;
|
||||||
var k = .125;
|
var k = .125;
|
||||||
var l = .25;
|
var l = .25;
|
||||||
@@ -337,98 +339,119 @@ unsafe_constant: {
|
|||||||
(void 0).a
|
(void 0).a
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe_object: {
|
unsafe_object: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
unsafe : true
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unsafe: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
|
var o = { a: 1 };
|
||||||
console.log(
|
console.log(
|
||||||
({a:1}) + 1,
|
o + 1,
|
||||||
({a:1}).a + 1,
|
o.a + 1,
|
||||||
({a:1}).b + 1,
|
o.b + 1,
|
||||||
({a:1}).a.b + 1
|
o.a.b + 1
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
|
var o = { a: 1 };
|
||||||
console.log(
|
console.log(
|
||||||
({a:1}) + 1,
|
o + 1,
|
||||||
2,
|
2,
|
||||||
({a:1}).b + 1,
|
o.b + 1,
|
||||||
1..b + 1
|
1..b + 1
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe_object_nested: {
|
unsafe_object_nested: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
unsafe : true
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unsafe: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
|
var o = { a: { b: 1 } };
|
||||||
console.log(
|
console.log(
|
||||||
({a:{b:1}}) + 1,
|
o + 1,
|
||||||
({a:{b:1}}).a + 1,
|
o.a + 1,
|
||||||
({a:{b:1}}).b + 1,
|
o.b + 1,
|
||||||
({a:{b:1}}).a.b + 1
|
o.a.b + 1
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
|
var o = { a: { b: 1 } };
|
||||||
console.log(
|
console.log(
|
||||||
({a:{b:1}}) + 1,
|
o + 1,
|
||||||
({a:{b:1}}).a + 1,
|
o.a + 1,
|
||||||
({a:{b:1}}).b + 1,
|
o.b + 1,
|
||||||
2
|
2
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe_object_complex: {
|
unsafe_object_complex: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
unsafe : true
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unsafe: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
|
var o = { a: { b: 1 }, b: 1 };
|
||||||
console.log(
|
console.log(
|
||||||
({a:{b:1},b:1}) + 1,
|
o + 1,
|
||||||
({a:{b:1},b:1}).a + 1,
|
o.a + 1,
|
||||||
({a:{b:1},b:1}).b + 1,
|
o.b + 1,
|
||||||
({a:{b:1},b:1}).a.b + 1
|
o.a.b + 1
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
|
var o = { a: { b: 1 }, b: 1 };
|
||||||
console.log(
|
console.log(
|
||||||
({a:{b:1},b:1}) + 1,
|
o + 1,
|
||||||
({a:{b:1},b:1}).a + 1,
|
o.a + 1,
|
||||||
2,
|
2,
|
||||||
2
|
2
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe_object_repeated: {
|
unsafe_object_repeated: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
unsafe : true
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unsafe: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
|
var o = { a: { b: 1 }, a: 1 };
|
||||||
console.log(
|
console.log(
|
||||||
({a:{b:1},a:1}) + 1,
|
o + 1,
|
||||||
({a:{b:1},a:1}).a + 1,
|
o.a + 1,
|
||||||
({a:{b:1},a:1}).b + 1,
|
o.b + 1,
|
||||||
({a:{b:1},a:1}).a.b + 1
|
o.a.b + 1
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
|
var o = { a: { b: 1 }, a: 1 };
|
||||||
console.log(
|
console.log(
|
||||||
({a:{b:1},a:1}) + 1,
|
o + 1,
|
||||||
2,
|
2,
|
||||||
({a:{b:1},a:1}).b + 1,
|
o.b + 1,
|
||||||
1..b + 1
|
1..b + 1
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe_object_accessor: {
|
unsafe_object_accessor: {
|
||||||
@@ -457,10 +480,11 @@ unsafe_object_accessor: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe_function: {
|
prop_function: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
unsafe : true
|
properties: true,
|
||||||
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
@@ -473,11 +497,12 @@ unsafe_function: {
|
|||||||
expect: {
|
expect: {
|
||||||
console.log(
|
console.log(
|
||||||
({a:{b:1},b:function(){}}) + 1,
|
({a:{b:1},b:function(){}}) + 1,
|
||||||
({a:{b:1},b:function(){}}).a + 1,
|
({b:1}) + 1,
|
||||||
({a:{b:1},b:function(){}}).b + 1,
|
function(){} + 1,
|
||||||
({a:{b:1},b:function(){}}).a.b + 1
|
2
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe_integer_key: {
|
unsafe_integer_key: {
|
||||||
@@ -505,6 +530,7 @@ unsafe_integer_key: {
|
|||||||
1["1"] + 1
|
1["1"] + 1
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe_integer_key_complex: {
|
unsafe_integer_key_complex: {
|
||||||
@@ -532,6 +558,7 @@ unsafe_integer_key_complex: {
|
|||||||
2
|
2
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe_float_key: {
|
unsafe_float_key: {
|
||||||
@@ -559,6 +586,7 @@ unsafe_float_key: {
|
|||||||
1["3.14"] + 1
|
1["3.14"] + 1
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe_float_key_complex: {
|
unsafe_float_key_complex: {
|
||||||
@@ -586,6 +614,7 @@ unsafe_float_key_complex: {
|
|||||||
2
|
2
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe_array: {
|
unsafe_array: {
|
||||||
@@ -621,6 +650,7 @@ unsafe_array: {
|
|||||||
(void 0)[1] + 1
|
(void 0)[1] + 1
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe_string: {
|
unsafe_string: {
|
||||||
@@ -648,6 +678,7 @@ unsafe_string: {
|
|||||||
"11"
|
"11"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe_array_bad_index: {
|
unsafe_array_bad_index: {
|
||||||
@@ -669,6 +700,7 @@ unsafe_array_bad_index: {
|
|||||||
[1, 2, 3, 4][3.14] + 1
|
[1, 2, 3, 4][3.14] + 1
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe_string_bad_index: {
|
unsafe_string_bad_index: {
|
||||||
@@ -690,12 +722,14 @@ unsafe_string_bad_index: {
|
|||||||
"1234"[3.14] + 1
|
"1234"[3.14] + 1
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe_prototype_function: {
|
prototype_function: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
unsafe : true
|
properties: true,
|
||||||
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var a = ({valueOf: 0}) < 1;
|
var a = ({valueOf: 0}) < 1;
|
||||||
@@ -714,14 +748,15 @@ unsafe_prototype_function: {
|
|||||||
var d = ({toString: 0}) + "";
|
var d = ({toString: 0}) + "";
|
||||||
var e = (({valueOf: 0}) + "")[2];
|
var e = (({valueOf: 0}) + "")[2];
|
||||||
var f = (({toString: 0}) + "")[2];
|
var f = (({toString: 0}) + "")[2];
|
||||||
var g = ({valueOf: 0}).valueOf();
|
var g = 0();
|
||||||
var h = "" + ({toString: 0});
|
var h = 0();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
call_args: {
|
call_args: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -736,11 +771,13 @@ call_args: {
|
|||||||
console.log(1);
|
console.log(1);
|
||||||
+(1, 1);
|
+(1, 1);
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
call_args_drop_param: {
|
call_args_drop_param: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
keep_fargs: false,
|
keep_fargs: false,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -757,6 +794,7 @@ call_args_drop_param: {
|
|||||||
console.log(1);
|
console.log(1);
|
||||||
+(b, 1);
|
+(b, 1);
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
in_boolean_context: {
|
in_boolean_context: {
|
||||||
@@ -794,4 +832,498 @@ in_boolean_context: {
|
|||||||
(foo(), !1)
|
(foo(), !1)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe_charAt: {
|
||||||
|
options = {
|
||||||
|
evaluate : true,
|
||||||
|
unsafe : true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(
|
||||||
|
"1234" + 1,
|
||||||
|
"1234".charAt(0) + 1,
|
||||||
|
"1234".charAt(6 - 5) + 1,
|
||||||
|
("12" + "34").charAt(0) + 1,
|
||||||
|
("12" + "34").charAt(6 - 5) + 1,
|
||||||
|
[1, 2, 3, 4].join("").charAt(0) + 1
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(
|
||||||
|
"12341",
|
||||||
|
"11",
|
||||||
|
"21",
|
||||||
|
"11",
|
||||||
|
"21",
|
||||||
|
"11"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe_charAt_bad_index: {
|
||||||
|
options = {
|
||||||
|
evaluate : true,
|
||||||
|
unsafe : true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(
|
||||||
|
"1234".charAt() + 1,
|
||||||
|
"1234".charAt("a") + 1,
|
||||||
|
"1234".charAt(3.14) + 1
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(
|
||||||
|
"11",
|
||||||
|
"11",
|
||||||
|
"41"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe_charAt_noop: {
|
||||||
|
options = {
|
||||||
|
evaluate : true,
|
||||||
|
unsafe : true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(
|
||||||
|
s.charAt(0),
|
||||||
|
"string".charAt(x),
|
||||||
|
(typeof x).charAt()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(
|
||||||
|
s.charAt(0),
|
||||||
|
"string".charAt(x),
|
||||||
|
(typeof x)[0]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1649: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(-1 + -1);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(-2);
|
||||||
|
}
|
||||||
|
expect_stdout: "-2";
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1760_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
!function(a) {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (NaN) {
|
||||||
|
a = +"foo";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
!function(a) {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (NaN) {
|
||||||
|
a = 0 / 0;
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
expect_stdout: "NaN"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1760_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
keep_infinity: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
!function(a) {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (Infinity) {
|
||||||
|
a = 123456789 / 0;
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
!function(a) {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (Infinity) {
|
||||||
|
a = 1 / 0;
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
expect_stdout: "Infinity"
|
||||||
|
}
|
||||||
|
|
||||||
|
delete_expr_1: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(delete undefined);
|
||||||
|
console.log(delete void 0);
|
||||||
|
console.log(delete Infinity);
|
||||||
|
console.log(delete (1 / 0));
|
||||||
|
console.log(delete NaN);
|
||||||
|
console.log(delete (0 / 0));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(delete undefined);
|
||||||
|
console.log((void 0, !0));
|
||||||
|
console.log(delete Infinity);
|
||||||
|
console.log((1 / 0, !0));
|
||||||
|
console.log(delete NaN);
|
||||||
|
console.log((0 / 0, !0));
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
delete_expr_2: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true,
|
||||||
|
keep_infinity: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(delete undefined);
|
||||||
|
console.log(delete void 0);
|
||||||
|
console.log(delete Infinity);
|
||||||
|
console.log(delete (1 / 0));
|
||||||
|
console.log(delete NaN);
|
||||||
|
console.log(delete (0 / 0));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(delete undefined);
|
||||||
|
console.log((void 0, !0));
|
||||||
|
console.log(delete Infinity);
|
||||||
|
console.log((1 / 0, !0));
|
||||||
|
console.log(delete NaN);
|
||||||
|
console.log((0 / 0, !0));
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
delete_binary_1: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(delete (true && undefined));
|
||||||
|
console.log(delete (true && void 0));
|
||||||
|
console.log(delete (true && Infinity));
|
||||||
|
console.log(delete (true && (1 / 0)));
|
||||||
|
console.log(delete (true && NaN));
|
||||||
|
console.log(delete (true && (0 / 0)));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(!0);
|
||||||
|
console.log(!0);
|
||||||
|
console.log(!0);
|
||||||
|
console.log(!0);
|
||||||
|
console.log(!0);
|
||||||
|
console.log(!0);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
delete_binary_2: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true,
|
||||||
|
keep_infinity: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(delete (false || undefined));
|
||||||
|
console.log(delete (false || void 0));
|
||||||
|
console.log(delete (false || Infinity));
|
||||||
|
console.log(delete (false || (1 / 0)));
|
||||||
|
console.log(delete (false || NaN));
|
||||||
|
console.log(delete (false || (0 / 0)));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(!0);
|
||||||
|
console.log(!0);
|
||||||
|
console.log(!0);
|
||||||
|
console.log(!0);
|
||||||
|
console.log(!0);
|
||||||
|
console.log(!0);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
Infinity_NaN_undefined_LHS: {
|
||||||
|
beautify = {
|
||||||
|
beautify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
Infinity = Infinity;
|
||||||
|
++Infinity;
|
||||||
|
Infinity--;
|
||||||
|
NaN *= NaN;
|
||||||
|
++NaN;
|
||||||
|
NaN--;
|
||||||
|
undefined |= undefined;
|
||||||
|
++undefined;
|
||||||
|
undefined--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"function f() {",
|
||||||
|
" Infinity = 1 / 0;",
|
||||||
|
" ++Infinity;",
|
||||||
|
" Infinity--;",
|
||||||
|
" NaN *= NaN;",
|
||||||
|
" ++NaN;",
|
||||||
|
" NaN--;",
|
||||||
|
" undefined |= void 0;",
|
||||||
|
" ++undefined;",
|
||||||
|
" undefined--;",
|
||||||
|
"}",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1964_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unsafe_regexp: false,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
var long_variable_name = /\s/;
|
||||||
|
console.log(long_variable_name.source);
|
||||||
|
return "a b c".split(long_variable_name)[1];
|
||||||
|
}
|
||||||
|
console.log(f());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
var long_variable_name = /\s/;
|
||||||
|
console.log(long_variable_name.source);
|
||||||
|
return "a b c".split(long_variable_name)[1];
|
||||||
|
}
|
||||||
|
console.log(f());
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"\\s",
|
||||||
|
"b",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1964_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unsafe_regexp: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
var long_variable_name = /\s/;
|
||||||
|
console.log(long_variable_name.source);
|
||||||
|
return "a b c".split(long_variable_name)[1];
|
||||||
|
}
|
||||||
|
console.log(f());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
console.log(/\s/.source);
|
||||||
|
return "a b c".split(/\s/)[1];
|
||||||
|
}
|
||||||
|
console.log(f());
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"\\s",
|
||||||
|
"b",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
array_slice_index: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log([1,2,3].slice(1)[1]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(3);
|
||||||
|
}
|
||||||
|
expect_stdout: "3"
|
||||||
|
}
|
||||||
|
|
||||||
|
string_charCodeAt: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log("foo".charCodeAt("bar".length));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(NaN);
|
||||||
|
}
|
||||||
|
expect_stdout: "NaN"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2207_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(String.fromCharCode(65));
|
||||||
|
console.log(Math.max(3, 6, 2, 7, 3, 4));
|
||||||
|
console.log(Math.cos(1.2345));
|
||||||
|
console.log(Math.cos(1.2345) - Math.sin(4.321));
|
||||||
|
console.log(Math.pow(Math.PI, Math.E - Math.LN10));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("A");
|
||||||
|
console.log(7);
|
||||||
|
console.log(Math.cos(1.2345));
|
||||||
|
console.log(1.2543732512566947);
|
||||||
|
console.log(1.6093984514472044);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2207_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(Math.E);
|
||||||
|
console.log(Math.LN10);
|
||||||
|
console.log(Math.LN2);
|
||||||
|
console.log(Math.LOG2E);
|
||||||
|
console.log(Math.LOG10E);
|
||||||
|
console.log(Math.PI);
|
||||||
|
console.log(Math.SQRT1_2);
|
||||||
|
console.log(Math.SQRT2);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(Math.E);
|
||||||
|
console.log(Math.LN10);
|
||||||
|
console.log(Math.LN2);
|
||||||
|
console.log(Math.LOG2E);
|
||||||
|
console.log(Math.LOG10E);
|
||||||
|
console.log(Math.PI);
|
||||||
|
console.log(Math.SQRT1_2);
|
||||||
|
console.log(Math.SQRT2);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2207_3: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(Number.MAX_VALUE);
|
||||||
|
console.log(Number.MIN_VALUE);
|
||||||
|
console.log(Number.NaN);
|
||||||
|
console.log(Number.NEGATIVE_INFINITY);
|
||||||
|
console.log(Number.POSITIVE_INFINITY);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(Number.MAX_VALUE);
|
||||||
|
console.log(5e-324);
|
||||||
|
console.log(NaN);
|
||||||
|
console.log(-1/0);
|
||||||
|
console.log(1/0);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2231_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(Object.keys(void 0));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(Object.keys(void 0));
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2231_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(Object.getOwnPropertyNames(null));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(Object.getOwnPropertyNames(null));
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
self_comparison_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = { n: NaN };
|
||||||
|
console.log(o.n == o.n, o.n === o.n, o.n != o.n, o.n !== o.n, typeof o.n);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(false, false, true, true, "number");
|
||||||
|
}
|
||||||
|
expect_stdout: "false false true true 'number'"
|
||||||
|
}
|
||||||
|
|
||||||
|
self_comparison_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
hoist_props: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = { n: NaN };
|
||||||
|
console.log(o.n == o.n, o.n === o.n, o.n != o.n, o.n !== o.n, typeof o.n);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(false, false, true, true, "number");
|
||||||
|
}
|
||||||
|
expect_stdout: "false false true true 'number'"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,3 +26,46 @@ expand_parameters: {
|
|||||||
expect_exact: "(function(a,...b){});(function(...args){});"
|
expect_exact: "(function(a,...b){});(function(...args){});"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
avoid_spread_in_ternary: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
conditionals: true,
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function print(...x) {
|
||||||
|
console.log(...x);
|
||||||
|
}
|
||||||
|
var a = [1, 2], b = [3, 4];
|
||||||
|
|
||||||
|
if (Math)
|
||||||
|
print(a);
|
||||||
|
else
|
||||||
|
print(b);
|
||||||
|
|
||||||
|
if (Math)
|
||||||
|
print(...a);
|
||||||
|
else
|
||||||
|
print(b);
|
||||||
|
|
||||||
|
if (Math.no_such_property)
|
||||||
|
print(a);
|
||||||
|
else
|
||||||
|
print(...b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function print(...x) {
|
||||||
|
console.log(...x);
|
||||||
|
}
|
||||||
|
var a = [ 1, 2 ], b = [ 3, 4 ];
|
||||||
|
print(Math ? a : b);
|
||||||
|
Math ? print(...a) : print(b);
|
||||||
|
Math.no_such_property ? print(a) : print(...b);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"[ 1, 2 ]",
|
||||||
|
"1 2",
|
||||||
|
"3 4",
|
||||||
|
]
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|||||||
252
test/compress/export.js
Normal file
252
test/compress/export.js
Normal file
@@ -0,0 +1,252 @@
|
|||||||
|
issue_2038_1: {
|
||||||
|
options = {
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export var V = 1;
|
||||||
|
export let L = 2;
|
||||||
|
export const C = 3;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
export var V = 1;
|
||||||
|
export let L = 2;
|
||||||
|
export const C = 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2038_2: {
|
||||||
|
options = {
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
let LET = 1;
|
||||||
|
const CONST = 2;
|
||||||
|
var VAR = 3;
|
||||||
|
export { LET, CONST, VAR };
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
let t = 1;
|
||||||
|
const e = 2;
|
||||||
|
var o = 3;
|
||||||
|
export { t as LET, e as CONST, o as VAR };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2126: {
|
||||||
|
mangle = {
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
import { foo as bar, cat as dog } from "stuff";
|
||||||
|
console.log(bar, dog);
|
||||||
|
export { bar as qux };
|
||||||
|
export { dog };
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
import { foo as o, cat as s } from "stuff";
|
||||||
|
console.log(o, s);
|
||||||
|
export { o as qux };
|
||||||
|
export { s as dog };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
beautify: {
|
||||||
|
beautify = {
|
||||||
|
beautify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export { A as B, C as D };
|
||||||
|
}
|
||||||
|
expect_exact: "export { A as B, C as D };"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2131: {
|
||||||
|
options = {
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function no() {
|
||||||
|
console.log(42);
|
||||||
|
}
|
||||||
|
function go() {
|
||||||
|
console.log(42);
|
||||||
|
}
|
||||||
|
var X = 1, Y = 2;
|
||||||
|
export function main() {
|
||||||
|
go(X);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function go() {
|
||||||
|
console.log(42);
|
||||||
|
}
|
||||||
|
var X = 1;
|
||||||
|
export function main() {
|
||||||
|
go(X);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2129: {
|
||||||
|
mangle = {
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export const { keys } = Object;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
export const { keys } = Object;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async_func: {
|
||||||
|
options = {
|
||||||
|
keep_fargs: false,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export async function Foo(x){};
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
export async function Foo(){};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2134_1: {
|
||||||
|
options = {
|
||||||
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export function Foo(x){};
|
||||||
|
Foo.prototype = {};
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
export function Foo(){};
|
||||||
|
Foo.prototype = {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2134_2: {
|
||||||
|
options = {
|
||||||
|
keep_fargs: false,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export async function Foo(x){};
|
||||||
|
Foo.prototype = {};
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
export async function Foo(){};
|
||||||
|
Foo.prototype = {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
redirection: {
|
||||||
|
mangle = {
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
let foo = 1, bar = 2;
|
||||||
|
export { foo as delete };
|
||||||
|
export { bar as default };
|
||||||
|
export { foo as var } from "module.js";
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
let e = 1, o = 2;
|
||||||
|
export { e as delete };
|
||||||
|
export { o as default };
|
||||||
|
export { foo as var } from "module.js";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
keyword_invalid_1: {
|
||||||
|
input: {
|
||||||
|
export { default };
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
export { default };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
keyword_invalid_2: {
|
||||||
|
input: {
|
||||||
|
export { default as Alias };
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
export { default as Alias };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
keyword_invalid_3: {
|
||||||
|
input: {
|
||||||
|
export { default as default };
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
export { default as default };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
keyword_valid_1: {
|
||||||
|
input: {
|
||||||
|
export { default } from "module.js";
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
export { default } from "module.js";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
keyword_valid_2: {
|
||||||
|
input: {
|
||||||
|
export { default as Alias } from "module.js";
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
export { default as Alias } from "module.js";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
keyword_valid_3: {
|
||||||
|
input: {
|
||||||
|
export { default as default } from "module.js";
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
export { default as default } from "module.js";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dynamic_import: {
|
||||||
|
mangle = {
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
import traditional from './traditional.js';
|
||||||
|
function imp(x) {
|
||||||
|
return import(x);
|
||||||
|
}
|
||||||
|
import("module_for_side_effects.js");
|
||||||
|
let dynamic = import("some/module.js");
|
||||||
|
dynamic.foo();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
import o from "./traditional.js";
|
||||||
|
function t(o) {
|
||||||
|
return import(o);
|
||||||
|
}
|
||||||
|
import("module_for_side_effects.js");
|
||||||
|
let r = import("some/module.js");
|
||||||
|
r.foo();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -26,7 +26,7 @@ pow_with_number_constants: {
|
|||||||
var c = 42 ** -0;
|
var c = 42 ** -0;
|
||||||
var d = NaN ** 1;
|
var d = NaN ** 1;
|
||||||
var e = 2 ** (1/0);
|
var e = 2 ** (1/0);
|
||||||
var f = 2 ** -(1/0);
|
var f = 2 ** (-1/0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ iifes_returning_constants_keep_fargs_true: {
|
|||||||
join_vars : true,
|
join_vars : true,
|
||||||
reduce_vars : true,
|
reduce_vars : true,
|
||||||
cascade : true,
|
cascade : true,
|
||||||
|
inline : true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
(function(){ return -1.23; }());
|
(function(){ return -1.23; }());
|
||||||
@@ -39,6 +40,7 @@ iifes_returning_constants_keep_fargs_true: {
|
|||||||
console.log(6);
|
console.log(6);
|
||||||
console.log((a(), b(), 6));
|
console.log((a(), b(), 6));
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
iifes_returning_constants_keep_fargs_false: {
|
iifes_returning_constants_keep_fargs_false: {
|
||||||
@@ -55,6 +57,7 @@ iifes_returning_constants_keep_fargs_false: {
|
|||||||
join_vars : true,
|
join_vars : true,
|
||||||
reduce_vars : true,
|
reduce_vars : true,
|
||||||
cascade : true,
|
cascade : true,
|
||||||
|
inline : true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
(function(){ return -1.23; }());
|
(function(){ return -1.23; }());
|
||||||
@@ -73,6 +76,7 @@ iifes_returning_constants_keep_fargs_false: {
|
|||||||
console.log(6);
|
console.log(6);
|
||||||
console.log((a(), b(), 6));
|
console.log((a(), b(), 6));
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_485_crashing_1530: {
|
issue_485_crashing_1530: {
|
||||||
@@ -80,6 +84,7 @@ issue_485_crashing_1530: {
|
|||||||
conditionals: true,
|
conditionals: true,
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
(function(a) {
|
(function(a) {
|
||||||
@@ -91,3 +96,453 @@ issue_485_crashing_1530: {
|
|||||||
this, void 0;
|
this, void 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_1841_1: {
|
||||||
|
options = {
|
||||||
|
keep_fargs: false,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var b = 10;
|
||||||
|
!function(arg) {
|
||||||
|
for (var key in "hi")
|
||||||
|
var n = arg.baz, n = [ b = 42 ];
|
||||||
|
}(--b);
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var b = 10;
|
||||||
|
!function() {
|
||||||
|
for (var key in "hi")
|
||||||
|
b = 42;
|
||||||
|
}(--b);
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect_exact: "42"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1841_2: {
|
||||||
|
options = {
|
||||||
|
keep_fargs: false,
|
||||||
|
pure_getters: false,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var b = 10;
|
||||||
|
!function(arg) {
|
||||||
|
for (var key in "hi")
|
||||||
|
var n = arg.baz, n = [ b = 42 ];
|
||||||
|
}(--b);
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var b = 10;
|
||||||
|
!function(arg) {
|
||||||
|
for (var key in "hi")
|
||||||
|
arg.baz, b = 42;
|
||||||
|
}(--b);
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect_exact: "42"
|
||||||
|
}
|
||||||
|
|
||||||
|
function_returning_constant_literal: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
properties: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function greeter() {
|
||||||
|
return { message: 'Hello there' };
|
||||||
|
}
|
||||||
|
var greeting = greeter();
|
||||||
|
console.log(greeting.message);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("Hello there");
|
||||||
|
}
|
||||||
|
expect_stdout: "Hello there"
|
||||||
|
}
|
||||||
|
|
||||||
|
hoist_funs: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(1, typeof f, typeof g);
|
||||||
|
if (console.log(2, typeof f, typeof g))
|
||||||
|
console.log(3, typeof f, typeof g);
|
||||||
|
else {
|
||||||
|
console.log(4, typeof f, typeof g);
|
||||||
|
function f() {}
|
||||||
|
console.log(5, typeof f, typeof g);
|
||||||
|
}
|
||||||
|
function g() {}
|
||||||
|
console.log(6, typeof f, typeof g);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function g() {}
|
||||||
|
console.log(1, typeof f, typeof g);
|
||||||
|
if (console.log(2, typeof f, typeof g))
|
||||||
|
console.log(3, typeof f, typeof g);
|
||||||
|
else {
|
||||||
|
console.log(4, typeof f, typeof g);
|
||||||
|
function f() {}
|
||||||
|
console.log(5, typeof f, typeof g);
|
||||||
|
}
|
||||||
|
console.log(6, typeof f, typeof g);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"1 'undefined' 'function'",
|
||||||
|
"2 'undefined' 'function'",
|
||||||
|
"4 'function' 'function'",
|
||||||
|
"5 'function' 'function'",
|
||||||
|
"6 'function' 'function'",
|
||||||
|
]
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
hoist_funs_strict: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
console.log(1, typeof f, typeof g);
|
||||||
|
if (console.log(2, typeof f, typeof g))
|
||||||
|
console.log(3, typeof f, typeof g);
|
||||||
|
else {
|
||||||
|
console.log(4, typeof f, typeof g);
|
||||||
|
function f() {}
|
||||||
|
console.log(5, typeof f, typeof g);
|
||||||
|
}
|
||||||
|
function g() {}
|
||||||
|
console.log(6, typeof f, typeof g);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
function g() {}
|
||||||
|
console.log(1, typeof f, typeof g);
|
||||||
|
if (console.log(2, typeof f, typeof g))
|
||||||
|
console.log(3, typeof f, typeof g);
|
||||||
|
else {
|
||||||
|
console.log(4, typeof f, typeof g);
|
||||||
|
function f() {}
|
||||||
|
console.log(5, typeof f, typeof g);
|
||||||
|
}
|
||||||
|
console.log(6, typeof f, typeof g);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"1 'undefined' 'function'",
|
||||||
|
"2 'undefined' 'function'",
|
||||||
|
"4 'function' 'function'",
|
||||||
|
"5 'function' 'function'",
|
||||||
|
"6 'undefined' 'function'",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_203: {
|
||||||
|
options = {
|
||||||
|
keep_fargs: false,
|
||||||
|
side_effects: true,
|
||||||
|
unsafe_Func: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var m = {};
|
||||||
|
var fn = Function("require", "module", "exports", "module.exports = 42;");
|
||||||
|
fn(null, m, m.exports);
|
||||||
|
console.log(m.exports);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var m = {};
|
||||||
|
var fn = Function("n,o", "o.exports=42");
|
||||||
|
fn(null, m, m.exports);
|
||||||
|
console.log(m.exports);
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
}
|
||||||
|
|
||||||
|
no_webkit: {
|
||||||
|
beautify = {
|
||||||
|
webkit: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
1 + 1;
|
||||||
|
}.a = 1);
|
||||||
|
}
|
||||||
|
expect_exact: "console.log(function(){1+1}.a=1);"
|
||||||
|
expect_stdout: "1"
|
||||||
|
}
|
||||||
|
|
||||||
|
webkit: {
|
||||||
|
beautify = {
|
||||||
|
webkit: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
1 + 1;
|
||||||
|
}.a = 1);
|
||||||
|
}
|
||||||
|
expect_exact: "console.log((function(){1+1}).a=1);"
|
||||||
|
expect_stdout: "1"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2084: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
conditionals: true,
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var c = 0;
|
||||||
|
!function() {
|
||||||
|
!function(c) {
|
||||||
|
c = 1 + c;
|
||||||
|
var c = 0;
|
||||||
|
function f14(a_1) {
|
||||||
|
if (c = 1 + c, 0 !== 23..toString())
|
||||||
|
c = 1 + c, a_1 && (a_1[0] = 0);
|
||||||
|
}
|
||||||
|
f14();
|
||||||
|
}(-1);
|
||||||
|
}();
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var c = 0;
|
||||||
|
!function(c) {
|
||||||
|
c = 1 + c,
|
||||||
|
c = 1 + (c = 0),
|
||||||
|
0 !== 23..toString() && (c = 1 + c);
|
||||||
|
}(-1),
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect_stdout: "0"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2097: {
|
||||||
|
options = {
|
||||||
|
negate_iife: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (e) {
|
||||||
|
console.log(arguments[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f(1);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
!function() {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (e) {
|
||||||
|
console.log(arguments[0]);
|
||||||
|
}
|
||||||
|
}(1);
|
||||||
|
}
|
||||||
|
expect_stdout: "1"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2101: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
a = {};
|
||||||
|
console.log(function() {
|
||||||
|
return function() {
|
||||||
|
return this.a;
|
||||||
|
}();
|
||||||
|
}() === function() {
|
||||||
|
return a;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
a = {};
|
||||||
|
console.log(function() {
|
||||||
|
return this.a;
|
||||||
|
}() === a);
|
||||||
|
}
|
||||||
|
expect_stdout: "true"
|
||||||
|
}
|
||||||
|
|
||||||
|
inner_ref: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(a) {
|
||||||
|
return function() {
|
||||||
|
return a;
|
||||||
|
}();
|
||||||
|
}(1), function(a) {
|
||||||
|
return function(a) {
|
||||||
|
return a;
|
||||||
|
}();
|
||||||
|
}(2));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(a) {
|
||||||
|
return a;
|
||||||
|
}(1), function(a) {
|
||||||
|
return a;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "1 undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2107: {
|
||||||
|
options = {
|
||||||
|
cascade: true,
|
||||||
|
collapse_vars: true,
|
||||||
|
inline: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var c = 0;
|
||||||
|
!function() {
|
||||||
|
c++;
|
||||||
|
}(c++ + new function() {
|
||||||
|
this.a = 0;
|
||||||
|
var a = (c = c + 1) + (c = 1 + c);
|
||||||
|
return c++ + a;
|
||||||
|
}());
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var c = 0;
|
||||||
|
c++, new function() {
|
||||||
|
this.a = 0, c = 1 + (c += 1), c++;
|
||||||
|
}(), c++, console.log(c);
|
||||||
|
}
|
||||||
|
expect_stdout: "5"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2114_1: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
if_return: true,
|
||||||
|
inline: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var c = 0;
|
||||||
|
!function(a) {
|
||||||
|
a = 0;
|
||||||
|
}([ {
|
||||||
|
0: c = c + 1,
|
||||||
|
length: c = 1 + c
|
||||||
|
}, typeof void function a() {
|
||||||
|
var b = function f1(a) {
|
||||||
|
}(b && (b.b += (c = c + 1, 0)));
|
||||||
|
}() ]);
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var c = 0;
|
||||||
|
c = 1 + (c += 1), function() {
|
||||||
|
var b = void (b && (b.b += (c += 1, 0)));
|
||||||
|
}();
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect_stdout: "2"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2114_2: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
if_return: true,
|
||||||
|
inline: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
passes: 2,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var c = 0;
|
||||||
|
!function(a) {
|
||||||
|
a = 0;
|
||||||
|
}([ {
|
||||||
|
0: c = c + 1,
|
||||||
|
length: c = 1 + c
|
||||||
|
}, typeof void function a() {
|
||||||
|
var b = function f1(a) {
|
||||||
|
}(b && (b.b += (c = c + 1, 0)));
|
||||||
|
}() ]);
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var c = 0;
|
||||||
|
c = 1 + (c += 1), function() {
|
||||||
|
var b = void (b && (b.b += (c += 1, 0)));
|
||||||
|
}();
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect_stdout: "2"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2428: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function bar(k) {
|
||||||
|
console.log(k);
|
||||||
|
}
|
||||||
|
function foo(x) {
|
||||||
|
return bar(x);
|
||||||
|
}
|
||||||
|
function baz(a) {
|
||||||
|
foo(a);
|
||||||
|
}
|
||||||
|
baz(42);
|
||||||
|
baz("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function baz(a) {
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
baz(42);
|
||||||
|
baz("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"42",
|
||||||
|
"PASS",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ object: {
|
|||||||
VALUE: 42,
|
VALUE: 42,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
side_effects: true,
|
||||||
unsafe: true,
|
unsafe: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -140,8 +141,58 @@ mixed: {
|
|||||||
console.log(CONFIG);
|
console.log(CONFIG);
|
||||||
}
|
}
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
'WARN: global_defs CONFIG.VALUE redefined [test/compress/global_defs.js:126,22]',
|
|
||||||
'WARN: global_defs CONFIG.VALUE redefined [test/compress/global_defs.js:127,22]',
|
'WARN: global_defs CONFIG.VALUE redefined [test/compress/global_defs.js:127,22]',
|
||||||
'WARN: global_defs CONFIG.VALUE redefined [test/compress/global_defs.js:129,8]',
|
'WARN: global_defs CONFIG.VALUE redefined [test/compress/global_defs.js:128,22]',
|
||||||
|
'WARN: global_defs CONFIG.VALUE redefined [test/compress/global_defs.js:130,8]',
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_1801: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
global_defs: {
|
||||||
|
"CONFIG.FOO.BAR": true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(CONFIG.FOO.BAR);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(!0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1986: {
|
||||||
|
options = {
|
||||||
|
global_defs: {
|
||||||
|
"@alert": "console.log",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
alert(42);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(42);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2167: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
global_defs: {
|
||||||
|
"@isDevMode": "function(){}",
|
||||||
|
},
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
if (isDevMode()) {
|
||||||
|
greetOverlord();
|
||||||
|
}
|
||||||
|
doWork();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
doWork();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -16,9 +16,12 @@ typeof_arrow_functions: {
|
|||||||
evaluate: true
|
evaluate: true
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var foo = typeof (x) => null;
|
var foo = typeof (x => null);
|
||||||
|
console.log(foo);
|
||||||
}
|
}
|
||||||
expect_exact: "var foo=\"function\";"
|
expect_exact: "var foo=\"function\";console.log(foo);"
|
||||||
|
expect_stdout: "function"
|
||||||
|
node_version: ">=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
classes: {
|
classes: {
|
||||||
@@ -60,15 +63,15 @@ class_name_can_be_mangled: {
|
|||||||
function x() {
|
function x() {
|
||||||
class Foo {
|
class Foo {
|
||||||
}
|
}
|
||||||
var class1 = Foo
|
var class1 = Foo;
|
||||||
var class2 = class Bar {}
|
var class2 = class Bar {};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function x() {
|
function x() {
|
||||||
class a { }
|
class a { }
|
||||||
var n = a
|
var s = a;
|
||||||
var r = class a {}
|
var c = class a {};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -152,6 +155,13 @@ class_methods_and_getters_with_keep_quoted_props_enabled: {
|
|||||||
expect_exact: 'class clss{a(){}"b"(){}get c(){return"c"}get"d"(){return"d"}set e(a){doSomething(a)}set\'f\'(a){doSomething(b)}static g(){}static"h"(){}}'
|
expect_exact: 'class clss{a(){}"b"(){}get c(){return"c"}get"d"(){return"d"}set e(a){doSomething(a)}set\'f\'(a){doSomething(b)}static g(){}static"h"(){}}'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
classes_with_expression_as_expand: {
|
||||||
|
input: {
|
||||||
|
class D extends (calls++, C) {}
|
||||||
|
}
|
||||||
|
expect_exact: "class D extends(calls++,C){}"
|
||||||
|
}
|
||||||
|
|
||||||
new_target: {
|
new_target: {
|
||||||
input: {
|
input: {
|
||||||
new.target;
|
new.target;
|
||||||
@@ -184,19 +194,88 @@ import_statement: {
|
|||||||
import Bar, { Foo } from 'lel';
|
import Bar, { Foo } from 'lel';
|
||||||
import { Bar as kex, Baz as food } from 'lel';
|
import { Bar as kex, Baz as food } from 'lel';
|
||||||
}
|
}
|
||||||
expect_exact: "import\"mod-name\";import Foo from\"bar\";import{Bar,Baz}from\"lel\";import Bar,{Foo}from\"lel\";import{Bar as kex,Baz as food}from\"lel\";"
|
expect_exact: 'import"mod-name";import Foo from"bar";import{Bar,Baz}from"lel";import Bar,{Foo}from"lel";import{Bar as kex,Baz as food}from"lel";'
|
||||||
|
}
|
||||||
|
|
||||||
|
import_all_statement: {
|
||||||
|
input: {
|
||||||
|
import * from 'lel';
|
||||||
|
import * as Lel from 'lel';
|
||||||
|
}
|
||||||
|
expect_exact: 'import*from"lel";import*as Lel from"lel";'
|
||||||
}
|
}
|
||||||
|
|
||||||
export_statement: {
|
export_statement: {
|
||||||
input: {
|
options = {
|
||||||
export default 1;
|
evaluate: true,
|
||||||
export var foo = 4;
|
|
||||||
export let foo = 6;
|
|
||||||
export const foo = 6;
|
|
||||||
export function foo() {};
|
|
||||||
export class foo { };
|
|
||||||
}
|
}
|
||||||
expect_exact: "export default 1;export var foo=4;export let foo=6;export const foo=6;export function foo(){};export class foo{};"
|
input: {
|
||||||
|
export default 1 + 2;
|
||||||
|
export var a = 4;
|
||||||
|
export let b = 6;
|
||||||
|
export const c = 6;
|
||||||
|
export function d() {};
|
||||||
|
export class e {};
|
||||||
|
}
|
||||||
|
expect_exact: "export default 3;export var a=4;export let b=6;export const c=6;export function d(){};export class e{};"
|
||||||
|
}
|
||||||
|
|
||||||
|
export_default_object_expression: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export default {
|
||||||
|
foo: 1 + 2,
|
||||||
|
bar() { return 4; },
|
||||||
|
get baz() { return this.foo; },
|
||||||
|
};
|
||||||
|
}
|
||||||
|
expect_exact: "export default{foo:3,bar(){return 4},get baz(){return this.foo}};"
|
||||||
|
}
|
||||||
|
|
||||||
|
export_default_array: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export default [ 1 + 2, foo ];
|
||||||
|
}
|
||||||
|
expect_exact: "export default[3,foo];"
|
||||||
|
}
|
||||||
|
|
||||||
|
export_default_anon_function: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export default function(){
|
||||||
|
console.log(1 + 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: "export default function(){console.log(3)};"
|
||||||
|
}
|
||||||
|
|
||||||
|
export_default_anon_class: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export default class {
|
||||||
|
foo() { console.log(1 + 2); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: "export default class{foo(){console.log(3)}};"
|
||||||
|
}
|
||||||
|
|
||||||
|
export_module_statement: {
|
||||||
|
input: {
|
||||||
|
export * from "a.js";
|
||||||
|
export {A} from "a.js";
|
||||||
|
export {A, B} from "a.js";
|
||||||
|
export {C};
|
||||||
|
}
|
||||||
|
expect_exact: 'export*from"a.js";export{A}from"a.js";export{A,B}from"a.js";export{C};'
|
||||||
}
|
}
|
||||||
|
|
||||||
import_statement_mangling: {
|
import_statement_mangling: {
|
||||||
@@ -211,12 +290,12 @@ import_statement_mangling: {
|
|||||||
Whatever();
|
Whatever();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
import l from "foo";
|
import o from "foo";
|
||||||
import e, {Food as o} from "lel";
|
import m, {Food as r} from "lel";
|
||||||
import {What as f} from "lel";
|
import {What as f} from "lel";
|
||||||
l();
|
|
||||||
e();
|
|
||||||
o();
|
o();
|
||||||
|
m();
|
||||||
|
r();
|
||||||
f();
|
f();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -296,11 +375,25 @@ default_assign: {
|
|||||||
function f(a, b = 3) {
|
function f(a, b = 3) {
|
||||||
console.log(a);
|
console.log(a);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g = ([[] = 123]) => {};
|
||||||
|
h = ([[x, y, z] = [4, 5, 6]] = []) => {};
|
||||||
|
|
||||||
|
function i([[x, y, z] = [4, 5, 6]] = []) {
|
||||||
|
console.log(b);
|
||||||
|
};
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function f(a) {
|
function f(a) {
|
||||||
console.log(a);
|
console.log(a);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g = ([[] = 123]) => {};
|
||||||
|
h = ([[x, y, z] = [4, 5, 6]] = []) => {};
|
||||||
|
|
||||||
|
function i([[x, y, z] = [4, 5, 6]] = []) {
|
||||||
|
console.log(b);
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -320,3 +413,525 @@ expansion: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_1613: {
|
||||||
|
mangle = { toplevel: true };
|
||||||
|
input: {
|
||||||
|
const name = 1;
|
||||||
|
const foo = {
|
||||||
|
name
|
||||||
|
};
|
||||||
|
}
|
||||||
|
expect_exact: "const n=1;const c={name:n};"
|
||||||
|
}
|
||||||
|
|
||||||
|
format_methods: {
|
||||||
|
beautify = {
|
||||||
|
beautify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
class A extends B {constructor(a){x()} static s(b,c){y()} run(d,e,f){z()}}
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"class A extends B {",
|
||||||
|
" constructor(a) {",
|
||||||
|
" x();",
|
||||||
|
" }",
|
||||||
|
" static s(b, c) {",
|
||||||
|
" y();",
|
||||||
|
" }",
|
||||||
|
" run(d, e, f) {",
|
||||||
|
" z();",
|
||||||
|
" }",
|
||||||
|
"}",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1898: {
|
||||||
|
options = {
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
class Foo {
|
||||||
|
bar() {
|
||||||
|
for (const x of [ 6, 5 ]) {
|
||||||
|
for (let y of [ 4, 3 ]) {
|
||||||
|
for (var z of [ 2, 1 ]) {
|
||||||
|
console.log(x, y, z);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
new Foo().bar();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
class Foo {
|
||||||
|
bar() {
|
||||||
|
for (const f of [ 6, 5 ])
|
||||||
|
for (let r of [ 4, 3 ])
|
||||||
|
for (var o of [ 2, 1 ])
|
||||||
|
console.log(f, r, o);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
new Foo().bar();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1753: {
|
||||||
|
mangle = { safari10: true };
|
||||||
|
input: {
|
||||||
|
class SomeClass {
|
||||||
|
constructor(props) {
|
||||||
|
let pickedSets = [];
|
||||||
|
for (let i = 0; i < 6; i++) {
|
||||||
|
pickedSets.push({
|
||||||
|
mainDrawNumbers: [],
|
||||||
|
extraDrawNumbers: []
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
class SomeClass {
|
||||||
|
constructor(r) {
|
||||||
|
let s = [];
|
||||||
|
for (let a = 0; a < 6; a++)
|
||||||
|
s.push({
|
||||||
|
mainDrawNumbers: [],
|
||||||
|
extraDrawNumbers: []
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1753_disable: {
|
||||||
|
mangle = { safari10: false }
|
||||||
|
input: {
|
||||||
|
class SomeClass {
|
||||||
|
constructor(props) {
|
||||||
|
let pickedSets = [];
|
||||||
|
for (let i = 0; i < 6; i++) {
|
||||||
|
pickedSets.push({
|
||||||
|
mainDrawNumbers: [],
|
||||||
|
extraDrawNumbers: []
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
class SomeClass {
|
||||||
|
constructor(r) {
|
||||||
|
let s = [];
|
||||||
|
for (let r = 0; r < 6; r++)
|
||||||
|
s.push({
|
||||||
|
mainDrawNumbers: [],
|
||||||
|
extraDrawNumbers: []
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class_extends: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
class foo extends bar {}
|
||||||
|
class pro extends some.prop {}
|
||||||
|
class arr extends stuff[1 - 1] {}
|
||||||
|
class bin extends (a || b) {}
|
||||||
|
class seq extends (a, b) {}
|
||||||
|
class ter extends (a ? b : c) {}
|
||||||
|
class uni extends (!0) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: "function f(){class foo extends bar{}class pro extends some.prop{}class arr extends stuff[0]{}class bin extends(a||b){}class seq extends(a,b){}class ter extends(a?b:c){}class uni extends(!0){}}"
|
||||||
|
}
|
||||||
|
|
||||||
|
class_extends_class: {
|
||||||
|
options = {
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
class anon extends class {} {}
|
||||||
|
class named extends class base {} {}
|
||||||
|
}
|
||||||
|
expect_exact: "class anon extends class{}{}class named extends class base{}{}"
|
||||||
|
}
|
||||||
|
|
||||||
|
class_extends_function: {
|
||||||
|
options = {
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
class anon extends function(){} {}
|
||||||
|
class named extends function base(){} {}
|
||||||
|
}
|
||||||
|
expect_exact: "class anon extends function(){}{}class named extends function base(){}{}"
|
||||||
|
}
|
||||||
|
|
||||||
|
class_extends_regex: {
|
||||||
|
options = {
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
class rx1 extends (/rx/) {}
|
||||||
|
// class rx2 extends /rx/ {} // FIXME - parse error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: "function f(){class rx1 extends(/rx/){}}"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2028: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = {};
|
||||||
|
(function(x) {
|
||||||
|
x.X = function() {
|
||||||
|
return X;
|
||||||
|
};
|
||||||
|
class X {
|
||||||
|
static hello() {
|
||||||
|
console.log("hello");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}(a));
|
||||||
|
a.X().hello();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = {};
|
||||||
|
(function(x) {
|
||||||
|
x.X = function() {
|
||||||
|
return X;
|
||||||
|
};
|
||||||
|
class X {
|
||||||
|
static hello() {
|
||||||
|
console.log("hello");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}(a));
|
||||||
|
a.X().hello();
|
||||||
|
}
|
||||||
|
expect_stdout: "hello"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
class_expression_statement: {
|
||||||
|
options = {
|
||||||
|
toplevel: false,
|
||||||
|
side_effects: false,
|
||||||
|
unused: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(class {});
|
||||||
|
(class NamedClassExpr {});
|
||||||
|
let expr = (class AnotherClassExpr {});
|
||||||
|
class C {}
|
||||||
|
}
|
||||||
|
expect_exact: "(class{});(class NamedClassExpr{});let expr=class AnotherClassExpr{};class C{}"
|
||||||
|
}
|
||||||
|
|
||||||
|
class_expression_statement_unused: {
|
||||||
|
options = {
|
||||||
|
toplevel: false,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(class {});
|
||||||
|
(class NamedClassExpr {});
|
||||||
|
let expr = (class AnotherClassExpr {});
|
||||||
|
class C {}
|
||||||
|
}
|
||||||
|
expect_exact: "let expr=class{};class C{}"
|
||||||
|
}
|
||||||
|
|
||||||
|
class_expression_statement_unused_toplevel: {
|
||||||
|
options = {
|
||||||
|
toplevel: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(class {});
|
||||||
|
(class NamedClassExpr {});
|
||||||
|
let expr = (class AnotherClassExpr {});
|
||||||
|
class C {}
|
||||||
|
}
|
||||||
|
expect_exact: ""
|
||||||
|
}
|
||||||
|
|
||||||
|
export_default_function_decl: {
|
||||||
|
options = {
|
||||||
|
toplevel: true,
|
||||||
|
passes: 3,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
// do not drop "unused" exports
|
||||||
|
export default function Foo() {};
|
||||||
|
export function Far() {};
|
||||||
|
}
|
||||||
|
expect_exact: "export default function Foo(){};export function Far(){};"
|
||||||
|
}
|
||||||
|
|
||||||
|
export_default_class_decl: {
|
||||||
|
options = {
|
||||||
|
toplevel: true,
|
||||||
|
passes: 3,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
// do not drop "unused" exports
|
||||||
|
export default class Car {};
|
||||||
|
export class Cab {};
|
||||||
|
}
|
||||||
|
expect_exact: "export default class Car{};export class Cab{};"
|
||||||
|
}
|
||||||
|
|
||||||
|
object_rest_spread: {
|
||||||
|
mangle = {
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var { w: w1, ...V } = { w: 7, x: 1, y: 2 }; console.log(w1, V);
|
||||||
|
let { w: w2, ...L } = { w: 8, x: 3, y: 4 }; console.log(w2, L);
|
||||||
|
const { w: w3, ...C } = { w: 9, x: 5, y: 6 }; console.log(w3, C);
|
||||||
|
|
||||||
|
let b;
|
||||||
|
({ b, ...V } = { a: 1, b: 2, c: 3 }); console.log(V);
|
||||||
|
({ b, ...L } = { a: 4, b: 5, c: 6 }); console.log(L);
|
||||||
|
|
||||||
|
(function({ y, ...p }){ console.log(p); })({ x: 1, y: 2, z: 3 });
|
||||||
|
(({ y, ...p }) => { console.log(p); })({ x: 4, y: 5, z: 6 });
|
||||||
|
|
||||||
|
const T = { a: 1, b: 2 }; console.log({ ...T, w: 0, ...{}, ...L, ...{K: 9} });
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var { w: o, ...l } = { w: 7, x: 1, y: 2 }; console.log(o, l);
|
||||||
|
let { w: c, ...n } = { w: 8, x: 3, y: 4 }; console.log(c, n);
|
||||||
|
const { w: e, ...s } = { w: 9, x: 5, y: 6 }; console.log(e, s);
|
||||||
|
|
||||||
|
let g;
|
||||||
|
({ b: g, ...l } = { a: 1, b: 2, c: 3 }); console.log(l);
|
||||||
|
({ b: g, ...n } = { a: 4, b: 5, c: 6 }); console.log(n);
|
||||||
|
|
||||||
|
(function({ y: o, ...l }) { console.log(l); })({ x: 1, y: 2, z: 3 });
|
||||||
|
(({ y: o, ...l }) => { console.log(l); })({ x: 4, y: 5, z: 6 });
|
||||||
|
|
||||||
|
const w = { a: 1, b: 2 }; console.log({ ...w, w: 0, ...{}, ...n, ...{ K: 9 } });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
object_spread_unsafe: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
|
join_vars: true,
|
||||||
|
passes: 3,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o1 = { x: 1, y: 2 };
|
||||||
|
var o2 = { x: 3, z: 4 };
|
||||||
|
var cloned = { ...o1 };
|
||||||
|
var merged = { ...o1, ...o2 };
|
||||||
|
console.log(cloned, merged);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = { x: 1, y: 2 }, l = { ...o }, x = { ...o, ...{ x: 3, z: 4 } };
|
||||||
|
console.log(l, x);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
array_spread_of_sequence: {
|
||||||
|
mangle = {
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = [1];
|
||||||
|
console.log([...(a, a)]);
|
||||||
|
console.log([...a, a]);
|
||||||
|
console.log([...(a || a)]);
|
||||||
|
console.log([...a || a]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = [1];
|
||||||
|
console.log([...(o, o)]);
|
||||||
|
console.log([...o, o]);
|
||||||
|
console.log([...o || o]);
|
||||||
|
console.log([...o || o]);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"[ 1 ]",
|
||||||
|
"[ 1, [ 1 ] ]",
|
||||||
|
"[ 1 ]",
|
||||||
|
"[ 1 ]",
|
||||||
|
]
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
object_spread_of_sequence: {
|
||||||
|
mangle = {
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = {x: 1};
|
||||||
|
console.log({ ...(a, a) });
|
||||||
|
console.log({ ...a, a });
|
||||||
|
console.log({ ...(a || a) });
|
||||||
|
console.log({ ...a || a });
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = { x: 1 };
|
||||||
|
console.log({ ...(o, o) });
|
||||||
|
console.log({ ...o, a: o });
|
||||||
|
console.log({ ...o || o });
|
||||||
|
console.log({ ...o || o });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// issue 2316
|
||||||
|
class_name_can_be_preserved_with_reserved: {
|
||||||
|
mangle = {
|
||||||
|
reserved: [ "Foo" ],
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function x() {
|
||||||
|
class Foo {}
|
||||||
|
Foo.bar;
|
||||||
|
class Bar {}
|
||||||
|
Bar.foo;
|
||||||
|
}
|
||||||
|
function y() {
|
||||||
|
var Foo = class Foo {};
|
||||||
|
Foo.bar;
|
||||||
|
var Bar = class Bar {};
|
||||||
|
Bar.bar;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function x() {
|
||||||
|
class Foo {}
|
||||||
|
Foo.bar;
|
||||||
|
class a {}
|
||||||
|
a.foo;
|
||||||
|
}
|
||||||
|
function y() {
|
||||||
|
var Foo = class Foo {};
|
||||||
|
Foo.bar;
|
||||||
|
var a = class a {};
|
||||||
|
a.bar;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2345: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log([...[3, 2, 1]].join("-"));
|
||||||
|
var a = [3, 2, 1];
|
||||||
|
console.log([...a].join("-"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log([...[3, 2, 1]].join("-"));
|
||||||
|
var a = [3, 2, 1];
|
||||||
|
console.log([...a].join("-"));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"3-2-1",
|
||||||
|
"3-2-1",
|
||||||
|
]
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2349: {
|
||||||
|
mangle = {}
|
||||||
|
input: {
|
||||||
|
function foo(boo, key) {
|
||||||
|
const value = boo.get();
|
||||||
|
return value.map(({[key]: bar}) => bar);
|
||||||
|
}
|
||||||
|
console.log(foo({
|
||||||
|
get: () => [ {
|
||||||
|
blah: 42
|
||||||
|
} ]
|
||||||
|
}, "blah"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function foo(o, n) {
|
||||||
|
const t = o.get();
|
||||||
|
return t.map(({[n]: o}) => o);
|
||||||
|
}
|
||||||
|
console.log(foo({
|
||||||
|
get: () => [ {
|
||||||
|
blah: 42
|
||||||
|
} ]
|
||||||
|
}, "blah"));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"[ 42 ]",
|
||||||
|
]
|
||||||
|
node_version: ">=7"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2349b: {
|
||||||
|
options = {
|
||||||
|
arrows: true,
|
||||||
|
collapse_vars: true,
|
||||||
|
ecma: 6,
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 3,
|
||||||
|
properties: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
side_effects: true,
|
||||||
|
unsafe_arrows: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function foo(boo, key) {
|
||||||
|
const value = boo.get();
|
||||||
|
return value.map(function({[key]: bar}){ return bar; });
|
||||||
|
}
|
||||||
|
console.log(foo({
|
||||||
|
get: function() {
|
||||||
|
return [ {
|
||||||
|
blah: 42
|
||||||
|
} ];
|
||||||
|
}
|
||||||
|
}, "blah"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log([ {
|
||||||
|
blah: 42
|
||||||
|
} ].map(({["blah"]: l}) => l));
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"[ 42 ]",
|
||||||
|
]
|
||||||
|
node_version: ">=7"
|
||||||
|
}
|
||||||
|
|||||||
513
test/compress/hoist_props.js
Normal file
513
test/compress/hoist_props.js
Normal file
@@ -0,0 +1,513 @@
|
|||||||
|
issue_2377_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var obj = {
|
||||||
|
foo: 1,
|
||||||
|
bar: 2,
|
||||||
|
square: function(x) {
|
||||||
|
return x * x;
|
||||||
|
},
|
||||||
|
cube: function(x) {
|
||||||
|
return x * x * x;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
console.log(obj.foo, obj.cube(3));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var obj_foo = 1, obj_cube = function(x) {
|
||||||
|
return x * x * x;
|
||||||
|
};
|
||||||
|
console.log(obj_foo, obj_cube(3));
|
||||||
|
}
|
||||||
|
expect_stdout: "1 27"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2377_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
hoist_props: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var obj = {
|
||||||
|
foo: 1,
|
||||||
|
bar: 2,
|
||||||
|
square: function(x) {
|
||||||
|
return x * x;
|
||||||
|
},
|
||||||
|
cube: function(x) {
|
||||||
|
return x * x * x;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
console.log(obj.foo, obj.cube(3));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(1, function(x) {
|
||||||
|
return x * x * x;
|
||||||
|
}(3));
|
||||||
|
}
|
||||||
|
expect_stdout: "1 27"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2377_3: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
hoist_props: true,
|
||||||
|
passes: 3,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var obj = {
|
||||||
|
foo: 1,
|
||||||
|
bar: 2,
|
||||||
|
square: function(x) {
|
||||||
|
return x * x;
|
||||||
|
},
|
||||||
|
cube: function(x) {
|
||||||
|
return x * x * x;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
console.log(obj.foo, obj.cube(3));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(1, 27);
|
||||||
|
}
|
||||||
|
expect_stdout: "1 27"
|
||||||
|
}
|
||||||
|
|
||||||
|
direct_access_1: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 0;
|
||||||
|
var obj = {
|
||||||
|
a: 1,
|
||||||
|
b: 2,
|
||||||
|
};
|
||||||
|
for (var k in obj) a++;
|
||||||
|
console.log(a, obj.a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 0;
|
||||||
|
var obj = {
|
||||||
|
a: 1,
|
||||||
|
b: 2,
|
||||||
|
};
|
||||||
|
for (var k in obj) a++;
|
||||||
|
console.log(a, obj.a);
|
||||||
|
}
|
||||||
|
expect_stdout: "2 1"
|
||||||
|
}
|
||||||
|
|
||||||
|
direct_access_2: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = { a: 1 };
|
||||||
|
var f = function(k) {
|
||||||
|
if (o[k]) return "PASS";
|
||||||
|
};
|
||||||
|
console.log(f("a"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = { a: 1 };
|
||||||
|
console.log(function(k) {
|
||||||
|
if (o[k]) return "PASS";
|
||||||
|
}("a"));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
direct_access_3: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = { a: 1 };
|
||||||
|
o.b;
|
||||||
|
console.log(o.a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = { a: 1 };
|
||||||
|
o.b;
|
||||||
|
console.log(o.a);
|
||||||
|
}
|
||||||
|
expect_stdout: "1"
|
||||||
|
}
|
||||||
|
|
||||||
|
single_use: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var obj = {
|
||||||
|
bar: function() {
|
||||||
|
return 42;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
console.log(obj.bar());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log({
|
||||||
|
bar: function() {
|
||||||
|
return 42;
|
||||||
|
},
|
||||||
|
}.bar());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
name_collision_1: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var obj_foo = 1;
|
||||||
|
var obj_bar = 2;
|
||||||
|
function f() {
|
||||||
|
var obj = {
|
||||||
|
foo: 3,
|
||||||
|
bar: 4,
|
||||||
|
"b-r": 5,
|
||||||
|
"b+r": 6,
|
||||||
|
"b!r": 7,
|
||||||
|
};
|
||||||
|
console.log(obj_foo, obj.foo, obj.bar, obj["b-r"], obj["b+r"], obj["b!r"]);
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var obj_foo = 1;
|
||||||
|
var obj_bar = 2;
|
||||||
|
function f() {
|
||||||
|
var obj_foo$0 = 3,
|
||||||
|
obj_bar = 4,
|
||||||
|
obj_b_r = 5,
|
||||||
|
obj_b_r$0 = 6,
|
||||||
|
obj_b_r$1 = 7;
|
||||||
|
console.log(obj_foo, obj_foo$0, obj_bar, obj_b_r, obj_b_r$0, obj_b_r$1);
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect_stdout: "1 3 4 5 6 7"
|
||||||
|
}
|
||||||
|
|
||||||
|
name_collision_2: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
p: 1,
|
||||||
|
0: function(x) {
|
||||||
|
return x;
|
||||||
|
},
|
||||||
|
1: function(x) {
|
||||||
|
return x + 1;
|
||||||
|
}
|
||||||
|
}, o__$0 = 2, o__$1 = 3;
|
||||||
|
console.log(o.p === o.p, o[0](4), o[1](5), o__$0, o__$1);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o_p = 1,
|
||||||
|
o__ = function(x) {
|
||||||
|
return x;
|
||||||
|
},
|
||||||
|
o__$2 = function(x) {
|
||||||
|
return x + 1;
|
||||||
|
},
|
||||||
|
o__$0 = 2,
|
||||||
|
o__$1 = 3;
|
||||||
|
console.log(o_p === o_p, o__(4), o__$2(5), o__$0, o__$1);
|
||||||
|
}
|
||||||
|
expect_stdout: "true 4 6 2 3"
|
||||||
|
}
|
||||||
|
|
||||||
|
name_collision_3: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
p: 1,
|
||||||
|
0: function(x) {
|
||||||
|
return x;
|
||||||
|
},
|
||||||
|
1: function(x) {
|
||||||
|
return x + 1;
|
||||||
|
}
|
||||||
|
}, o__$0 = 2, o__$1 = 3;
|
||||||
|
console.log(o.p === o.p, o[0](4), o[1](5));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o_p = 1,
|
||||||
|
o__ = function(x) {
|
||||||
|
return x;
|
||||||
|
},
|
||||||
|
o__$2 = function(x) {
|
||||||
|
return x + 1;
|
||||||
|
},
|
||||||
|
o__$0 = 2,
|
||||||
|
o__$1 = 3;
|
||||||
|
console.log(o_p === o_p, o__(4), o__$2(5));
|
||||||
|
}
|
||||||
|
expect_stdout: "true 4 6"
|
||||||
|
}
|
||||||
|
|
||||||
|
contains_this_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
hoist_props: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
u: function() {
|
||||||
|
return this === this;
|
||||||
|
},
|
||||||
|
p: 1
|
||||||
|
};
|
||||||
|
console.log(o.p, o.p);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(1, 1);
|
||||||
|
}
|
||||||
|
expect_stdout: "1 1"
|
||||||
|
}
|
||||||
|
|
||||||
|
contains_this_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
hoist_props: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
u: function() {
|
||||||
|
return this === this;
|
||||||
|
},
|
||||||
|
p: 1
|
||||||
|
};
|
||||||
|
console.log(o.p, o.p, o.u);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(1, 1, function() {
|
||||||
|
return this === this;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
contains_this_3: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
hoist_props: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
u: function() {
|
||||||
|
return this === this;
|
||||||
|
},
|
||||||
|
p: 1
|
||||||
|
};
|
||||||
|
console.log(o.p, o.p, o.u());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {
|
||||||
|
u: function() {
|
||||||
|
return this === this;
|
||||||
|
},
|
||||||
|
p: 1
|
||||||
|
};
|
||||||
|
console.log(o.p, o.p, o.u());
|
||||||
|
}
|
||||||
|
expect_stdout: "1 1 true"
|
||||||
|
}
|
||||||
|
|
||||||
|
hoist_class: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_props: true,
|
||||||
|
inline: true,
|
||||||
|
keep_fnames: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function run(c, v) {
|
||||||
|
return new c(v).value;
|
||||||
|
}
|
||||||
|
var o = {
|
||||||
|
p: class Foo {
|
||||||
|
constructor(value) {
|
||||||
|
this.value = value * 10;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
x: 1,
|
||||||
|
y: 2,
|
||||||
|
};
|
||||||
|
console.log(o.p.name, o.p === o.p, run(o.p, o.x), run(o.p, o.y));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function run(c, v) {
|
||||||
|
return new c(v).value;
|
||||||
|
}
|
||||||
|
var o_p = class Foo {
|
||||||
|
constructor(value) {
|
||||||
|
this.value = 10 * value;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
console.log(o_p.name, true, run(o_p, 1), run(o_p, 2));
|
||||||
|
}
|
||||||
|
node_version: ">=6"
|
||||||
|
expect_stdout: "Foo true 10 20"
|
||||||
|
}
|
||||||
|
|
||||||
|
hoist_class_with_new: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_props: true,
|
||||||
|
inline: true,
|
||||||
|
keep_fnames: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
p: class Foo {
|
||||||
|
constructor(value) {
|
||||||
|
this.value = value * 10;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
x: 1,
|
||||||
|
y: 2,
|
||||||
|
};
|
||||||
|
console.log(o.p.name, o.p === o.p, new o.p(o.x).value, new o.p(o.y).value);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
// FIXME: class `o.p` not hoisted due to `new`
|
||||||
|
var o = {
|
||||||
|
p: class Foo {
|
||||||
|
constructor(value) {
|
||||||
|
this.value = 10 * value;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
x: 1,
|
||||||
|
y: 2
|
||||||
|
};
|
||||||
|
console.log(o.p.name, o.p == o.p, new o.p(o.x).value, new o.p(o.y).value);
|
||||||
|
}
|
||||||
|
node_version: ">=6"
|
||||||
|
expect_stdout: "Foo true 10 20"
|
||||||
|
}
|
||||||
|
|
||||||
|
hoist_function_with_call: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_props: true,
|
||||||
|
inline: true,
|
||||||
|
keep_fnames: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
p: function Foo(value) {
|
||||||
|
return 10 * value;
|
||||||
|
},
|
||||||
|
x: 1,
|
||||||
|
y: 2
|
||||||
|
};
|
||||||
|
console.log(o.p.name, o.p === o.p, o.p(o.x), o.p(o.y));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o_p = function Foo(value){
|
||||||
|
return 10 * value
|
||||||
|
};
|
||||||
|
console.log(o_p.name, true, o_p(1), o_p(2));
|
||||||
|
}
|
||||||
|
expect_stdout: "Foo true 10 20"
|
||||||
|
}
|
||||||
|
|
||||||
|
new_this: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
hoist_props: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
a: 1,
|
||||||
|
b: 2,
|
||||||
|
f: function(a) {
|
||||||
|
this.b = a;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
console.log(new o.f(o.a).b, o.b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(new function(a) {
|
||||||
|
this.b = a;
|
||||||
|
}(1).b, 2);
|
||||||
|
}
|
||||||
|
expect_stdout: "1 2"
|
||||||
|
}
|
||||||
@@ -88,3 +88,24 @@ sequences_funs: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_2295: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function foo(o) {
|
||||||
|
var a = o.a;
|
||||||
|
if (a) return a;
|
||||||
|
var a = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function foo(o) {
|
||||||
|
var a = o.a;
|
||||||
|
if (a) return a;
|
||||||
|
a = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -47,22 +47,6 @@ html_comment_in_greater_than_or_equal: {
|
|||||||
expect_exact: "function f(a,b){return a-- >=b}";
|
expect_exact: "function f(a,b){return a-- >=b}";
|
||||||
}
|
}
|
||||||
|
|
||||||
html_comment_in_right_shift_assign: {
|
|
||||||
input: {
|
|
||||||
// Note: illegal javascript
|
|
||||||
function f(a, b) { return a-- >>= b; }
|
|
||||||
}
|
|
||||||
expect_exact: "function f(a,b){return a-- >>=b}";
|
|
||||||
}
|
|
||||||
|
|
||||||
html_comment_in_zero_fill_right_shift_assign: {
|
|
||||||
input: {
|
|
||||||
// Note: illegal javascript
|
|
||||||
function f(a, b) { return a-- >>>= b; }
|
|
||||||
}
|
|
||||||
expect_exact: "function f(a,b){return a-- >>>=b}";
|
|
||||||
}
|
|
||||||
|
|
||||||
html_comment_in_string_literal: {
|
html_comment_in_string_literal: {
|
||||||
input: {
|
input: {
|
||||||
function f() { return "<!--HTML-->comment in<!--string literal-->"; }
|
function f() { return "<!--HTML-->comment in<!--string literal-->"; }
|
||||||
|
|||||||
@@ -302,3 +302,85 @@ issue_1437_conditionals: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_512: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
if_return: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function a() {
|
||||||
|
if (b()) {
|
||||||
|
c();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function a() {
|
||||||
|
if (!b()) throw e;
|
||||||
|
c();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1317: {
|
||||||
|
options = {
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
!function(a) {
|
||||||
|
if (a) return;
|
||||||
|
let b = 1;
|
||||||
|
function g() {
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
console.log(g());
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
!function(a) {
|
||||||
|
if (a) return;
|
||||||
|
let b = 1;
|
||||||
|
function g() {
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
console.log(g());
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
expect_stdout: "1"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1317_strict: {
|
||||||
|
options = {
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
!function(a) {
|
||||||
|
if (a) return;
|
||||||
|
let b = 1;
|
||||||
|
function g() {
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
console.log(g());
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
!function(a) {
|
||||||
|
if (a) return;
|
||||||
|
let b = 1;
|
||||||
|
function g() {
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
console.log(g());
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
expect_stdout: "1"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ non_hoisted_function_after_return_2a: {
|
|||||||
hoist_funs: false, dead_code: true, conditionals: true, comparisons: true,
|
hoist_funs: false, dead_code: true, conditionals: true, comparisons: true,
|
||||||
evaluate: true, booleans: true, loops: true, unused: true, keep_fargs: true,
|
evaluate: true, booleans: true, loops: true, unused: true, keep_fargs: true,
|
||||||
if_return: true, join_vars: true, cascade: true, side_effects: true,
|
if_return: true, join_vars: true, cascade: true, side_effects: true,
|
||||||
collapse_vars: false, passes: 2
|
collapse_vars: false, passes: 2, warnings: "verbose"
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function foo(x) {
|
function foo(x) {
|
||||||
@@ -71,11 +71,13 @@ non_hoisted_function_after_return_2a: {
|
|||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:51,16]",
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:51,16]",
|
||||||
"WARN: Dropping unused variable a [test/compress/issue-1034.js:48,20]",
|
"WARN: Dropping unused variable a [test/compress/issue-1034.js:48,20]",
|
||||||
"WARN: Dropping unused function nope [test/compress/issue-1034.js:55,21]",
|
"WARN: Dropping unused function nope [test/compress/issue-1034.js:55,21]",
|
||||||
|
"WARN: pass 0: last_count: Infinity, count: 37",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:53,12]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:53,12]",
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:53,12]",
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:53,12]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:56,12]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:56,12]",
|
||||||
"WARN: Dropping unused variable b [test/compress/issue-1034.js:51,20]",
|
"WARN: Dropping unused variable b [test/compress/issue-1034.js:51,20]",
|
||||||
"WARN: Dropping unused variable c [test/compress/issue-1034.js:53,16]"
|
"WARN: Dropping unused variable c [test/compress/issue-1034.js:53,16]",
|
||||||
|
"WARN: pass 1: last_count: 37, count: 18",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -109,13 +111,146 @@ non_hoisted_function_after_return_2b: {
|
|||||||
}
|
}
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
// duplicate warnings no longer emitted
|
// duplicate warnings no longer emitted
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:95,16]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:97,16]",
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:95,16]",
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:97,16]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:97,12]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:99,12]",
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:97,12]",
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:99,12]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:101,12]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:103,12]",
|
||||||
"WARN: Dropping unused variable b [test/compress/issue-1034.js:95,20]",
|
|
||||||
"WARN: Dropping unused variable c [test/compress/issue-1034.js:97,16]"
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
non_hoisted_function_after_return_strict: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: false, dead_code: true, conditionals: true, comparisons: true,
|
||||||
|
evaluate: true, booleans: true, loops: true, unused: true, keep_fargs: true,
|
||||||
|
if_return: true, join_vars: true, cascade: true, side_effects: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
function foo(x) {
|
||||||
|
if (x) {
|
||||||
|
return bar();
|
||||||
|
not_called1();
|
||||||
|
} else {
|
||||||
|
return baz();
|
||||||
|
not_called2();
|
||||||
|
}
|
||||||
|
function bar() { return 7; }
|
||||||
|
return not_reached;
|
||||||
|
function UnusedFunction() {}
|
||||||
|
function baz() { return 8; }
|
||||||
|
}
|
||||||
|
console.log(foo(0), foo(1));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
function foo(x) {
|
||||||
|
return x ? bar() : baz();
|
||||||
|
function bar() { return 7 }
|
||||||
|
function baz() { return 8 }
|
||||||
|
}
|
||||||
|
console.log(foo(0), foo(1));
|
||||||
|
}
|
||||||
|
expect_stdout: "8 7"
|
||||||
|
expect_warnings: [
|
||||||
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:133,16]",
|
||||||
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:136,16]",
|
||||||
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:139,12]",
|
||||||
|
"WARN: Dropping unused function UnusedFunction [test/compress/issue-1034.js:140,21]",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
non_hoisted_function_after_return_2a_strict: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: false, dead_code: true, conditionals: true, comparisons: true,
|
||||||
|
evaluate: true, booleans: true, loops: true, unused: true, keep_fargs: true,
|
||||||
|
if_return: true, join_vars: true, cascade: true, side_effects: true,
|
||||||
|
collapse_vars: false, passes: 2, warnings: "verbose"
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
function foo(x) {
|
||||||
|
if (x) {
|
||||||
|
return bar(1);
|
||||||
|
var a = not_called(1);
|
||||||
|
} else {
|
||||||
|
return bar(2);
|
||||||
|
var b = not_called(2);
|
||||||
|
}
|
||||||
|
var c = bar(3);
|
||||||
|
function bar(x) { return 7 - x; }
|
||||||
|
function nope() {}
|
||||||
|
return b || c;
|
||||||
|
}
|
||||||
|
console.log(foo(0), foo(1));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
function foo(x) {
|
||||||
|
return bar(x ? 1 : 2);
|
||||||
|
function bar(x) {
|
||||||
|
return 7 - x;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(foo(0), foo(1));
|
||||||
|
}
|
||||||
|
expect_stdout: "5 6"
|
||||||
|
expect_warnings: [
|
||||||
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:175,16]",
|
||||||
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:175,16]",
|
||||||
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:178,16]",
|
||||||
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:178,16]",
|
||||||
|
"WARN: Dropping unused variable a [test/compress/issue-1034.js:175,20]",
|
||||||
|
"WARN: Dropping unused function nope [test/compress/issue-1034.js:182,21]",
|
||||||
|
"WARN: pass 0: last_count: Infinity, count: 48",
|
||||||
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:180,12]",
|
||||||
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:180,12]",
|
||||||
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:183,12]",
|
||||||
|
"WARN: Dropping unused variable b [test/compress/issue-1034.js:178,20]",
|
||||||
|
"WARN: Dropping unused variable c [test/compress/issue-1034.js:180,16]",
|
||||||
|
"WARN: pass 1: last_count: 48, count: 29",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
non_hoisted_function_after_return_2b_strict: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: false, dead_code: true, conditionals: true, comparisons: true,
|
||||||
|
evaluate: true, booleans: true, loops: true, unused: true, keep_fargs: true,
|
||||||
|
if_return: true, join_vars: true, cascade: true, side_effects: true,
|
||||||
|
collapse_vars: false
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
function foo(x) {
|
||||||
|
if (x) {
|
||||||
|
return bar(1);
|
||||||
|
} else {
|
||||||
|
return bar(2);
|
||||||
|
var b;
|
||||||
|
}
|
||||||
|
var c = bar(3);
|
||||||
|
function bar(x) {
|
||||||
|
return 7 - x;
|
||||||
|
}
|
||||||
|
return b || c;
|
||||||
|
}
|
||||||
|
console.log(foo(0), foo(1));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
function foo(x) {
|
||||||
|
return bar(x ? 1 : 2);
|
||||||
|
function bar(x) { return 7 - x; }
|
||||||
|
}
|
||||||
|
console.log(foo(0), foo(1));
|
||||||
|
}
|
||||||
|
expect_stdout: "5 6"
|
||||||
|
expect_warnings: [
|
||||||
|
// duplicate warnings no longer emitted
|
||||||
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:229,16]",
|
||||||
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:229,16]",
|
||||||
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:231,12]",
|
||||||
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:231,12]",
|
||||||
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:235,12]",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,90 +1,91 @@
|
|||||||
multiple_functions: {
|
multiple_functions: {
|
||||||
options = { if_return: true, hoist_funs: false };
|
options = {
|
||||||
|
hoist_funs: false,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
( function() {
|
( function() {
|
||||||
if ( !window ) {
|
if ( !window ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
function f() {}
|
function f() {}
|
||||||
function g() {}
|
function g() {}
|
||||||
} )();
|
} )();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
( function() {
|
( function() {
|
||||||
function f() {}
|
|
||||||
function g() {}
|
|
||||||
|
|
||||||
// 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 g() {}
|
||||||
} )();
|
} )();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
single_function: {
|
single_function: {
|
||||||
options = { if_return: true, hoist_funs: false };
|
options = {
|
||||||
|
hoist_funs: false,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
( function() {
|
( function() {
|
||||||
if ( !window ) {
|
if ( !window ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
function f() {}
|
function f() {}
|
||||||
} )();
|
} )();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
( function() {
|
( function() {
|
||||||
function f() {}
|
|
||||||
|
|
||||||
if ( window );
|
if ( window );
|
||||||
|
function f() {}
|
||||||
} )();
|
} )();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
deeply_nested: {
|
deeply_nested: {
|
||||||
options = { if_return: true, hoist_funs: false };
|
options = {
|
||||||
|
hoist_funs: false,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
( function() {
|
( function() {
|
||||||
if ( !window ) {
|
if ( !window ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
function f() {}
|
function f() {}
|
||||||
function g() {}
|
function g() {}
|
||||||
|
|
||||||
if ( !document ) {
|
if ( !document ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
function h() {}
|
function h() {}
|
||||||
} )();
|
} )();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
( function() {
|
( function() {
|
||||||
function f() {}
|
|
||||||
function g() {}
|
|
||||||
|
|
||||||
function h() {}
|
|
||||||
|
|
||||||
// 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 g() {}
|
||||||
|
function h() {}
|
||||||
} )();
|
} )();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
not_hoisted_when_already_nested: {
|
not_hoisted_when_already_nested: {
|
||||||
options = { if_return: true, hoist_funs: false };
|
options = {
|
||||||
|
hoist_funs: false,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
( function() {
|
( function() {
|
||||||
if ( !window ) {
|
if ( !window ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( foo ) function f() {}
|
if ( foo ) function f() {}
|
||||||
|
|
||||||
} )();
|
} )();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
@@ -94,3 +95,69 @@ not_hoisted_when_already_nested: {
|
|||||||
} )();
|
} )();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
defun_if_return: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: false,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function e() {
|
||||||
|
function f() {}
|
||||||
|
if (!window) return;
|
||||||
|
else function g() {}
|
||||||
|
function h() {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function e() {
|
||||||
|
function f() {}
|
||||||
|
if (window) function g() {}
|
||||||
|
function h() {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
defun_hoist_funs: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: true,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function e() {
|
||||||
|
function f() {}
|
||||||
|
if (!window) return;
|
||||||
|
else function g() {}
|
||||||
|
function h() {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function e() {
|
||||||
|
function f() {}
|
||||||
|
function h() {}
|
||||||
|
if (window) function g() {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
defun_else_if_return: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: false,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function e() {
|
||||||
|
function f() {}
|
||||||
|
if (window) function g() {}
|
||||||
|
else return;
|
||||||
|
function h() {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function e() {
|
||||||
|
function f() {}
|
||||||
|
if (window) function g() {}
|
||||||
|
function h() {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -193,13 +193,15 @@ assorted_Infinity_NaN_undefined_in_with_scope: {
|
|||||||
cascade: true,
|
cascade: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
sequences: false,
|
sequences: false,
|
||||||
|
keep_infinity: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
|
var f = console.log;
|
||||||
var o = {
|
var o = {
|
||||||
undefined : 3,
|
undefined : 3,
|
||||||
NaN : 4,
|
NaN : 4,
|
||||||
Infinity : 5,
|
Infinity : 5,
|
||||||
}
|
};
|
||||||
if (o) {
|
if (o) {
|
||||||
f(undefined, void 0);
|
f(undefined, void 0);
|
||||||
f(NaN, 0/0);
|
f(NaN, 0/0);
|
||||||
@@ -216,25 +218,88 @@ assorted_Infinity_NaN_undefined_in_with_scope: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var o = {
|
var f = console.log, o = {
|
||||||
undefined : 3,
|
undefined : 3,
|
||||||
NaN : 4,
|
NaN : 4,
|
||||||
Infinity : 5
|
Infinity : 5
|
||||||
}
|
};
|
||||||
if (o) {
|
if (o) {
|
||||||
f(void 0, void 0);
|
f(void 0, void 0);
|
||||||
f(NaN, NaN);
|
f(NaN, NaN);
|
||||||
f(1/0, 1/0);
|
f(1/0, 1/0);
|
||||||
f(-(1/0), -(1/0));
|
f(-1/0, -1/0);
|
||||||
f(NaN, NaN);
|
f(NaN, NaN);
|
||||||
}
|
}
|
||||||
with (o) {
|
with (o) {
|
||||||
f(undefined, void 0);
|
f(undefined, void 0);
|
||||||
f(NaN, 0/0);
|
f(NaN, 0/0);
|
||||||
f(Infinity, 1/0);
|
f(Infinity, 1/0);
|
||||||
f(-Infinity, -(1/0));
|
f(-Infinity, -1/0);
|
||||||
f(9 + undefined, 9 + void 0);
|
f(9 + undefined, 9 + void 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
assorted_Infinity_NaN_undefined_in_with_scope_keep_infinity: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
evaluate: true,
|
||||||
|
dead_code: true,
|
||||||
|
conditionals: true,
|
||||||
|
comparisons: true,
|
||||||
|
booleans: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
cascade: true,
|
||||||
|
side_effects: true,
|
||||||
|
sequences: false,
|
||||||
|
keep_infinity: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var f = console.log;
|
||||||
|
var o = {
|
||||||
|
undefined : 3,
|
||||||
|
NaN : 4,
|
||||||
|
Infinity : 5,
|
||||||
|
};
|
||||||
|
if (o) {
|
||||||
|
f(undefined, void 0);
|
||||||
|
f(NaN, 0/0);
|
||||||
|
f(Infinity, 1/0);
|
||||||
|
f(-Infinity, -(1/0));
|
||||||
|
f(2 + 7 + undefined, 2 + 7 + void 0);
|
||||||
|
}
|
||||||
|
with (o) {
|
||||||
|
f(undefined, void 0);
|
||||||
|
f(NaN, 0/0);
|
||||||
|
f(Infinity, 1/0);
|
||||||
|
f(-Infinity, -(1/0));
|
||||||
|
f(2 + 7 + undefined, 2 + 7 + void 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var f = console.log, o = {
|
||||||
|
undefined : 3,
|
||||||
|
NaN : 4,
|
||||||
|
Infinity : 5
|
||||||
|
};
|
||||||
|
if (o) {
|
||||||
|
f(void 0, void 0);
|
||||||
|
f(NaN, NaN);
|
||||||
|
f(Infinity, 1/0);
|
||||||
|
f(-Infinity, -1/0);
|
||||||
|
f(NaN, NaN);
|
||||||
|
}
|
||||||
|
with (o) {
|
||||||
|
f(undefined, void 0);
|
||||||
|
f(NaN, 0/0);
|
||||||
|
f(Infinity, 1/0);
|
||||||
|
f(-Infinity, -1/0);
|
||||||
|
f(9 + undefined, 9 + void 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|||||||
@@ -49,4 +49,3 @@ mangle_keep_fnames_true: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -96,6 +96,13 @@ pure_function_calls_toplevel: {
|
|||||||
})();
|
})();
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
// pure top-level calls will be dropped regardless of the leading comments position
|
||||||
|
var MyClass = /*#__PURE__*//*@class*/(function(){
|
||||||
|
function MyClass() {}
|
||||||
|
MyClass.prototype.method = function() {};
|
||||||
|
return MyClass;
|
||||||
|
})();
|
||||||
|
|
||||||
// comment #__PURE__ comment
|
// comment #__PURE__ comment
|
||||||
bar(), baz(), quux();
|
bar(), baz(), quux();
|
||||||
a.b(), /* @__PURE__ */ c.d.e(), f.g();
|
a.b(), /* @__PURE__ */ c.d.e(), f.g();
|
||||||
@@ -110,10 +117,12 @@ pure_function_calls_toplevel: {
|
|||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:92,37]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:92,37]",
|
||||||
"WARN: Dropping unused variable iife2 [test/compress/issue-1261.js:92,16]",
|
"WARN: Dropping unused variable iife2 [test/compress/issue-1261.js:92,16]",
|
||||||
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:90,8]",
|
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:90,8]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:100,8]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:107,8]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:101,31]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:108,31]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:84,33]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:84,33]",
|
||||||
"WARN: Dropping unused variable iife1 [test/compress/issue-1261.js:84,12]",
|
"WARN: Dropping unused variable iife1 [test/compress/issue-1261.js:84,12]",
|
||||||
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:100,45]",
|
||||||
|
"WARN: Dropping unused variable MyClass [test/compress/issue-1261.js:100,12]",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -148,29 +157,29 @@ should_warn: {
|
|||||||
baz();
|
baz();
|
||||||
}
|
}
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:128,61]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:137,61]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:128,23]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:137,23]",
|
||||||
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:128,23]",
|
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:137,23]",
|
||||||
"WARN: Boolean || always true [test/compress/issue-1261.js:129,23]",
|
"WARN: Boolean || always true [test/compress/issue-1261.js:138,23]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:129,23]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:138,23]",
|
||||||
"WARN: Condition always true [test/compress/issue-1261.js:129,23]",
|
"WARN: Condition always true [test/compress/issue-1261.js:138,23]",
|
||||||
"WARN: Boolean || always true [test/compress/issue-1261.js:130,8]",
|
"WARN: Condition left of || always true [test/compress/issue-1261.js:139,8]",
|
||||||
"WARN: Condition always true [test/compress/issue-1261.js:130,8]",
|
"WARN: Condition always true [test/compress/issue-1261.js:139,8]",
|
||||||
"WARN: Boolean && always false [test/compress/issue-1261.js:131,23]",
|
"WARN: Boolean && always false [test/compress/issue-1261.js:140,23]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:131,23]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:140,23]",
|
||||||
"WARN: Condition always false [test/compress/issue-1261.js:131,23]",
|
"WARN: Condition always false [test/compress/issue-1261.js:140,23]",
|
||||||
"WARN: Boolean && always false [test/compress/issue-1261.js:132,8]",
|
"WARN: Condition left of && always false [test/compress/issue-1261.js:141,8]",
|
||||||
"WARN: Condition always false [test/compress/issue-1261.js:132,8]",
|
"WARN: Condition always false [test/compress/issue-1261.js:141,8]",
|
||||||
"WARN: + in boolean context always true [test/compress/issue-1261.js:133,23]",
|
"WARN: + in boolean context always true [test/compress/issue-1261.js:142,23]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:133,23]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:142,23]",
|
||||||
"WARN: Condition always true [test/compress/issue-1261.js:133,23]",
|
"WARN: Condition always true [test/compress/issue-1261.js:142,23]",
|
||||||
"WARN: + in boolean context always true [test/compress/issue-1261.js:134,8]",
|
"WARN: + in boolean context always true [test/compress/issue-1261.js:143,8]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:134,31]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:143,31]",
|
||||||
"WARN: Condition always true [test/compress/issue-1261.js:134,8]",
|
"WARN: Condition always true [test/compress/issue-1261.js:143,8]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:135,23]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:144,23]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:136,24]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:145,24]",
|
||||||
"WARN: Condition always true [test/compress/issue-1261.js:136,8]",
|
"WARN: Condition always true [test/compress/issue-1261.js:145,8]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:137,31]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:146,31]",
|
||||||
"WARN: Condition always false [test/compress/issue-1261.js:137,8]",
|
"WARN: Condition always false [test/compress/issue-1261.js:146,8]",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,4 +46,5 @@ string_plus_optimization: {
|
|||||||
}
|
}
|
||||||
foo();
|
foo();
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
issue_1321_no_debug: {
|
issue_1321_no_debug: {
|
||||||
mangle_props = {
|
mangle = {
|
||||||
ignore_quoted: true
|
properties: {
|
||||||
|
keep_quoted: true,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = {};
|
var x = {};
|
||||||
@@ -10,16 +12,19 @@ issue_1321_no_debug: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var x = {};
|
var x = {};
|
||||||
x.b = 1;
|
x.x = 1;
|
||||||
x["a"] = 2 * x.b;
|
x["a"] = 2 * x.x;
|
||||||
console.log(x.b, x["a"]);
|
console.log(x.x, x["a"]);
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_1321_debug: {
|
issue_1321_debug: {
|
||||||
mangle_props = {
|
mangle = {
|
||||||
ignore_quoted: true,
|
properties: {
|
||||||
debug: ""
|
debug: "",
|
||||||
|
keep_quoted: true,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = {};
|
var x = {};
|
||||||
@@ -29,15 +34,18 @@ issue_1321_debug: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var x = {};
|
var x = {};
|
||||||
x.a = 1;
|
x.x = 1;
|
||||||
x["_$foo$_"] = 2 * x.a;
|
x["_$foo$_"] = 2 * x.x;
|
||||||
console.log(x.a, x["_$foo$_"]);
|
console.log(x.x, x["_$foo$_"]);
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_1321_with_quoted: {
|
issue_1321_with_quoted: {
|
||||||
mangle_props = {
|
mangle = {
|
||||||
ignore_quoted: false
|
properties: {
|
||||||
|
keep_quoted: false,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = {};
|
var x = {};
|
||||||
@@ -47,8 +55,9 @@ issue_1321_with_quoted: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var x = {};
|
var x = {};
|
||||||
x.a = 1;
|
x.x = 1;
|
||||||
x["b"] = 2 * x.a;
|
x["o"] = 2 * x.x;
|
||||||
console.log(x.a, x["b"]);
|
console.log(x.x, x["o"]);
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
typeof_eq_undefined: {
|
typeof_eq_undefined: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true
|
comparisons: true,
|
||||||
|
typeofs: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var a = typeof b != "undefined";
|
var a = typeof b != "undefined";
|
||||||
@@ -23,7 +24,8 @@ typeof_eq_undefined: {
|
|||||||
typeof_eq_undefined_ie8: {
|
typeof_eq_undefined_ie8: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
screw_ie8: false
|
ie8: true,
|
||||||
|
typeofs: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var a = typeof b != "undefined";
|
var a = typeof b != "undefined";
|
||||||
@@ -45,7 +47,8 @@ typeof_eq_undefined_ie8: {
|
|||||||
|
|
||||||
undefined_redefined: {
|
undefined_redefined: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true
|
comparisons: true,
|
||||||
|
typeofs: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(undefined) {
|
function f(undefined) {
|
||||||
@@ -58,7 +61,8 @@ undefined_redefined: {
|
|||||||
|
|
||||||
undefined_redefined_mangle: {
|
undefined_redefined_mangle: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true
|
comparisons: true,
|
||||||
|
typeofs: true,
|
||||||
}
|
}
|
||||||
mangle = {}
|
mangle = {}
|
||||||
input: {
|
input: {
|
||||||
|
|||||||
@@ -42,4 +42,5 @@ conditional_false_stray_else_in_loop: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect_exact: "for(var i=1;i<=4;++i)if(!(i<=2))console.log(i);"
|
expect_exact: "for(var i=1;i<=4;++i)if(!(i<=2))console.log(i);"
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,9 +13,9 @@ same_variable_in_multiple_for_loop: {
|
|||||||
join_vars: true,
|
join_vars: true,
|
||||||
cascade: true,
|
cascade: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
collapse_vars: true
|
collapse_vars: true,
|
||||||
};
|
}
|
||||||
mangle = {};
|
mangle = {}
|
||||||
input: {
|
input: {
|
||||||
for (let i = 0; i < 3; i++) {
|
for (let i = 0; i < 3; i++) {
|
||||||
let a = 100;
|
let a = 100;
|
||||||
@@ -33,11 +33,12 @@ same_variable_in_multiple_for_loop: {
|
|||||||
console.log(o, l);
|
console.log(o, l);
|
||||||
for (let o = 0; o < 2; o++) {
|
for (let o = 0; o < 2; o++) {
|
||||||
console.log(o, l);
|
console.log(o, l);
|
||||||
let c = 2;
|
let e = 2;
|
||||||
console.log(c);
|
console.log(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
same_variable_in_multiple_forOf: {
|
same_variable_in_multiple_forOf: {
|
||||||
@@ -55,9 +56,9 @@ same_variable_in_multiple_forOf: {
|
|||||||
join_vars: true,
|
join_vars: true,
|
||||||
cascade: true,
|
cascade: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
collapse_vars: true
|
collapse_vars: true,
|
||||||
};
|
}
|
||||||
mangle = {};
|
mangle = {}
|
||||||
input: {
|
input: {
|
||||||
var test = [ "a", "b", "c" ];
|
var test = [ "a", "b", "c" ];
|
||||||
for (let tmp of test) {
|
for (let tmp of test) {
|
||||||
@@ -75,10 +76,11 @@ same_variable_in_multiple_forOf: {
|
|||||||
console.log(o);
|
console.log(o);
|
||||||
let e;
|
let e;
|
||||||
e = [ "e", "f", "g" ];
|
e = [ "e", "f", "g" ];
|
||||||
for (let o of e)
|
for (let o of e)
|
||||||
console.log(o);
|
console.log(o);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
same_variable_in_multiple_forIn: {
|
same_variable_in_multiple_forIn: {
|
||||||
@@ -96,9 +98,9 @@ same_variable_in_multiple_forIn: {
|
|||||||
join_vars: true,
|
join_vars: true,
|
||||||
cascade: true,
|
cascade: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
collapse_vars: true
|
collapse_vars: true,
|
||||||
};
|
}
|
||||||
mangle = {};
|
mangle = {}
|
||||||
input: {
|
input: {
|
||||||
var test = [ "a", "b", "c" ];
|
var test = [ "a", "b", "c" ];
|
||||||
for (let tmp in test) {
|
for (let tmp in test) {
|
||||||
@@ -112,14 +114,15 @@ same_variable_in_multiple_forIn: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var test = [ "a", "b", "c" ];
|
var test = [ "a", "b", "c" ];
|
||||||
for (let o in test) {
|
for (let e in test) {
|
||||||
console.log(o);
|
console.log(e);
|
||||||
let e;
|
let t;
|
||||||
e = [ "e", "f", "g" ];
|
t = [ "e", "f", "g" ];
|
||||||
for (let o in test)
|
for (let e in test)
|
||||||
console.log(o);
|
console.log(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
different_variable_in_multiple_for_loop: {
|
different_variable_in_multiple_for_loop: {
|
||||||
@@ -137,9 +140,9 @@ different_variable_in_multiple_for_loop: {
|
|||||||
join_vars: true,
|
join_vars: true,
|
||||||
cascade: true,
|
cascade: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
collapse_vars: true
|
collapse_vars: true,
|
||||||
};
|
}
|
||||||
mangle = {};
|
mangle = {}
|
||||||
input: {
|
input: {
|
||||||
for (let i = 0; i < 3; i++) {
|
for (let i = 0; i < 3; i++) {
|
||||||
let a = 100;
|
let a = 100;
|
||||||
@@ -157,11 +160,12 @@ different_variable_in_multiple_for_loop: {
|
|||||||
console.log(o, l);
|
console.log(o, l);
|
||||||
for (let o = 0; o < 2; o++) {
|
for (let o = 0; o < 2; o++) {
|
||||||
console.log(o, l);
|
console.log(o, l);
|
||||||
let c = 2;
|
let e = 2;
|
||||||
console.log(c);
|
console.log(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
different_variable_in_multiple_forOf: {
|
different_variable_in_multiple_forOf: {
|
||||||
@@ -179,9 +183,9 @@ different_variable_in_multiple_forOf: {
|
|||||||
join_vars: true,
|
join_vars: true,
|
||||||
cascade: true,
|
cascade: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
collapse_vars: true
|
collapse_vars: true,
|
||||||
};
|
}
|
||||||
mangle = {};
|
mangle = {}
|
||||||
input: {
|
input: {
|
||||||
var test = [ "a", "b", "c" ];
|
var test = [ "a", "b", "c" ];
|
||||||
for (let tmp of test) {
|
for (let tmp of test) {
|
||||||
@@ -203,6 +207,7 @@ different_variable_in_multiple_forOf: {
|
|||||||
console.log(o);
|
console.log(o);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
different_variable_in_multiple_forIn: {
|
different_variable_in_multiple_forIn: {
|
||||||
@@ -220,9 +225,9 @@ different_variable_in_multiple_forIn: {
|
|||||||
join_vars: true,
|
join_vars: true,
|
||||||
cascade: true,
|
cascade: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
collapse_vars: true
|
collapse_vars: true,
|
||||||
};
|
}
|
||||||
mangle = {};
|
mangle = {}
|
||||||
input: {
|
input: {
|
||||||
var test = [ "a", "b", "c" ];
|
var test = [ "a", "b", "c" ];
|
||||||
for (let tmp in test) {
|
for (let tmp in test) {
|
||||||
@@ -236,14 +241,15 @@ different_variable_in_multiple_forIn: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var test = [ "a", "b", "c" ];
|
var test = [ "a", "b", "c" ];
|
||||||
for (let o in test) {
|
for (let e in test) {
|
||||||
console.log(o);
|
console.log(e);
|
||||||
let e;
|
let t;
|
||||||
e = [ "e", "f", "g" ];
|
t = [ "e", "f", "g" ];
|
||||||
for (let o in test)
|
for (let e in test)
|
||||||
console.log(o);
|
console.log(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
more_variable_in_multiple_for: {
|
more_variable_in_multiple_for: {
|
||||||
@@ -261,9 +267,9 @@ more_variable_in_multiple_for: {
|
|||||||
join_vars: true,
|
join_vars: true,
|
||||||
cascade: true,
|
cascade: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
collapse_vars: true
|
collapse_vars: true,
|
||||||
};
|
}
|
||||||
mangle = {};
|
mangle = {}
|
||||||
input: {
|
input: {
|
||||||
for (let a = 9, i = 0; i < 20; i += a) {
|
for (let a = 9, i = 0; i < 20; i += a) {
|
||||||
let b = a++ + i;
|
let b = a++ + i;
|
||||||
@@ -275,11 +281,11 @@ more_variable_in_multiple_for: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
for (let o = 9, l = 0; l < 20; l += o) {
|
for (let o = 9, l = 0; l < 20; l += o) {
|
||||||
let c = o++ + l;
|
let e = o++ + l;
|
||||||
console.log(o, c, l);
|
console.log(o, e, l);
|
||||||
for (let l = c, e = c * c, f = 0; f < 10; f++)
|
for (let l = e, t = e * e, c = 0; c < 10; c++)
|
||||||
console.log(o, c, e, l, f);
|
console.log(o, e, t, l, c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
99
test/compress/issue-1588.js
Normal file
99
test/compress/issue-1588.js
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
screw_ie8: {
|
||||||
|
options = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try { throw "foo"; } catch (x) { console.log(x); }
|
||||||
|
}
|
||||||
|
expect_exact: 'try{throw"foo"}catch(o){console.log(o)}'
|
||||||
|
expect_stdout: [
|
||||||
|
"foo"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
support_ie8: {
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try { throw "foo"; } catch (x) { console.log(x); }
|
||||||
|
}
|
||||||
|
expect_exact: 'try{throw"foo"}catch(x){console.log(x)}'
|
||||||
|
expect_stdout: "foo"
|
||||||
|
}
|
||||||
|
|
||||||
|
safe_undefined: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
if_return: true,
|
||||||
|
unsafe: false,
|
||||||
|
}
|
||||||
|
mangle = {}
|
||||||
|
input: {
|
||||||
|
var a, c;
|
||||||
|
console.log(function(undefined) {
|
||||||
|
return function() {
|
||||||
|
if (a)
|
||||||
|
return b;
|
||||||
|
if (c)
|
||||||
|
return d;
|
||||||
|
};
|
||||||
|
}(1)());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a, c;
|
||||||
|
console.log(function(n) {
|
||||||
|
return function() {
|
||||||
|
return a ? b : c ? d : void 0;
|
||||||
|
};
|
||||||
|
}(1)());
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe_undefined: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
if_return: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
mangle = {}
|
||||||
|
input: {
|
||||||
|
var a, c;
|
||||||
|
console.log(function(undefined) {
|
||||||
|
return function() {
|
||||||
|
if (a)
|
||||||
|
return b;
|
||||||
|
if (c)
|
||||||
|
return d;
|
||||||
|
};
|
||||||
|
}()());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a, c;
|
||||||
|
console.log(function(n) {
|
||||||
|
return function() {
|
||||||
|
return a ? b : c ? d : n;
|
||||||
|
};
|
||||||
|
}()());
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
runtime_error: {
|
||||||
|
input: {
|
||||||
|
const a = 1;
|
||||||
|
console.log(a++);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
const a = 1;
|
||||||
|
console.log(a++);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
52
test/compress/issue-1609.js
Normal file
52
test/compress/issue-1609.js
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
chained_evaluation_1: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
var a = 1;
|
||||||
|
(function() {
|
||||||
|
var b = a, c;
|
||||||
|
c = f(b);
|
||||||
|
c.bar = b;
|
||||||
|
})();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function() {
|
||||||
|
(function() {
|
||||||
|
f(1).bar = 1;
|
||||||
|
})();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
chained_evaluation_2: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
var a = "long piece of string";
|
||||||
|
(function() {
|
||||||
|
var b = a, c;
|
||||||
|
c = f(b);
|
||||||
|
c.bar = b;
|
||||||
|
})();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function() {
|
||||||
|
(function() {
|
||||||
|
var b = "long piece of string";
|
||||||
|
f(b).bar = b;
|
||||||
|
})();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
}
|
||||||
88
test/compress/issue-1639.js
Normal file
88
test/compress/issue-1639.js
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
|
||||||
|
issue_1639_1: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
cascade: true,
|
||||||
|
conditionals: true,
|
||||||
|
evaluate: true,
|
||||||
|
join_vars: true,
|
||||||
|
loops: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 100, b = 10;
|
||||||
|
|
||||||
|
var L1 = 5;
|
||||||
|
while (--L1 > 0) {
|
||||||
|
if ((--b), false) {
|
||||||
|
if (b) {
|
||||||
|
var ignore = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
for (var a = 100, b = 10, L1 = 5; --L1 > 0;)
|
||||||
|
if (--b, !1) var ignore = 0;
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1639_2: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
cascade: true,
|
||||||
|
conditionals: true,
|
||||||
|
evaluate: true,
|
||||||
|
join_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 100, b = 10;
|
||||||
|
|
||||||
|
function f19() {
|
||||||
|
if (++a, false)
|
||||||
|
if (a)
|
||||||
|
if (++a);
|
||||||
|
}
|
||||||
|
f19();
|
||||||
|
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 100, b = 10;
|
||||||
|
function f19() {
|
||||||
|
++a, 1;
|
||||||
|
}
|
||||||
|
f19(),
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1639_3: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
cascade: true,
|
||||||
|
conditionals: true,
|
||||||
|
evaluate: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 100, b = 10;
|
||||||
|
a++ && false && a ? 0 : 0;
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 100, b = 10;
|
||||||
|
a++,
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
45
test/compress/issue-1656.js
Normal file
45
test/compress/issue-1656.js
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
f7: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
cascade: true,
|
||||||
|
collapse_vars: true,
|
||||||
|
comparisons: true,
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
drop_debugger: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
loops: true,
|
||||||
|
negate_iife: true,
|
||||||
|
passes: 3,
|
||||||
|
properties: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
beautify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 100, b = 10;
|
||||||
|
function f22464() {
|
||||||
|
var brake146670 = 5;
|
||||||
|
while (((b = a) ? !a : ~a ? null : b += a) && --brake146670 > 0) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f22464();
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"var b = 10;",
|
||||||
|
"",
|
||||||
|
"!function() {",
|
||||||
|
" for (;b = 100, !1; ) ;",
|
||||||
|
"}(), console.log(100, b);",
|
||||||
|
]
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
161
test/compress/issue-1673.js
Normal file
161
test/compress/issue-1673.js
Normal file
@@ -0,0 +1,161 @@
|
|||||||
|
side_effects_catch: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
function g() {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
g();
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
(function() {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
side_effects_else: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(x) {
|
||||||
|
function g() {
|
||||||
|
if (x);
|
||||||
|
else console.log("PASS");
|
||||||
|
}
|
||||||
|
g();
|
||||||
|
}
|
||||||
|
f(0);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(x) {
|
||||||
|
(function() {
|
||||||
|
if (x);
|
||||||
|
else console.log("PASS");
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
f(0);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
side_effects_finally: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
function g() {
|
||||||
|
try {
|
||||||
|
x();
|
||||||
|
} catch (e) {
|
||||||
|
} finally {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
g();
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
(function() {
|
||||||
|
try {
|
||||||
|
x();
|
||||||
|
} catch (e) {
|
||||||
|
} finally {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
side_effects_label: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(x) {
|
||||||
|
function g() {
|
||||||
|
L: {
|
||||||
|
console.log("PASS");
|
||||||
|
break L;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
g();
|
||||||
|
}
|
||||||
|
f(0);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(x) {
|
||||||
|
(function() {
|
||||||
|
L: {
|
||||||
|
console.log("PASS");
|
||||||
|
break L;
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
f(0);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
side_effects_switch: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
function g() {
|
||||||
|
switch (0) {
|
||||||
|
default:
|
||||||
|
case console.log("PASS"):
|
||||||
|
}
|
||||||
|
}
|
||||||
|
g();
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
(function() {
|
||||||
|
switch (0) {
|
||||||
|
default:
|
||||||
|
case console.log("PASS"):
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
347
test/compress/issue-1704.js
Normal file
347
test/compress/issue-1704.js
Normal file
@@ -0,0 +1,347 @@
|
|||||||
|
mangle_catch: {
|
||||||
|
options = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "FAIL";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (args) {
|
||||||
|
a = "PASS";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'var a="FAIL";try{throw 1}catch(o){a="PASS"}console.log(a);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_ie8: {
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "FAIL";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (args) {
|
||||||
|
a = "PASS";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'var a="FAIL";try{throw 1}catch(args){a="PASS"}console.log(a);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_var: {
|
||||||
|
options = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "FAIL";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (args) {
|
||||||
|
var a = "PASS";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'var a="FAIL";try{throw 1}catch(o){var a="PASS"}console.log(a);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_var_ie8: {
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "FAIL";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (args) {
|
||||||
|
var a = "PASS";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'var a="FAIL";try{throw 1}catch(args){var a="PASS"}console.log(a);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_toplevel: {
|
||||||
|
options = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "FAIL";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (args) {
|
||||||
|
a = "PASS";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'var o="FAIL";try{throw 1}catch(c){o="PASS"}console.log(o);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_ie8_toplevel: {
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "FAIL";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (args) {
|
||||||
|
a = "PASS";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'var o="FAIL";try{throw 1}catch(c){o="PASS"}console.log(o);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_var_toplevel: {
|
||||||
|
options = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "FAIL";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (args) {
|
||||||
|
var a = "PASS";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'var o="FAIL";try{throw 1}catch(r){var o="PASS"}console.log(o);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_var_ie8_toplevel: {
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "FAIL";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (args) {
|
||||||
|
var a = "PASS";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'var o="FAIL";try{throw 1}catch(r){var o="PASS"}console.log(o);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_redef_1: {
|
||||||
|
options = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS";
|
||||||
|
try {
|
||||||
|
throw "FAIL1";
|
||||||
|
} catch (a) {
|
||||||
|
var a = "FAIL2";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'var a="PASS";try{throw"FAIL1"}catch(a){var a="FAIL2"}console.log(a);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_redef_1_ie8: {
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS";
|
||||||
|
try {
|
||||||
|
throw "FAIL1";
|
||||||
|
} catch (a) {
|
||||||
|
var a = "FAIL2";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'var a="PASS";try{throw"FAIL1"}catch(a){var a="FAIL2"}console.log(a);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_redef_1_toplevel: {
|
||||||
|
options = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS";
|
||||||
|
try {
|
||||||
|
throw "FAIL1";
|
||||||
|
} catch (a) {
|
||||||
|
var a = "FAIL2";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'var o="PASS";try{throw"FAIL1"}catch(o){var o="FAIL2"}console.log(o);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_redef_1_ie8_toplevel: {
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS";
|
||||||
|
try {
|
||||||
|
throw "FAIL1";
|
||||||
|
} catch (a) {
|
||||||
|
var a = "FAIL2";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'var o="PASS";try{throw"FAIL1"}catch(o){var o="FAIL2"}console.log(o);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_redef_2: {
|
||||||
|
options = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try {
|
||||||
|
throw "FAIL1";
|
||||||
|
} catch (a) {
|
||||||
|
var a = "FAIL2";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'try{throw"FAIL1"}catch(a){var a="FAIL2"}console.log(a);'
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_redef_2_ie8: {
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try {
|
||||||
|
throw "FAIL1";
|
||||||
|
} catch (a) {
|
||||||
|
var a = "FAIL2";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'try{throw"FAIL1"}catch(a){var a="FAIL2"}console.log(a);'
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_redef_2_toplevel: {
|
||||||
|
options = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try {
|
||||||
|
throw "FAIL1";
|
||||||
|
} catch (a) {
|
||||||
|
var a = "FAIL2";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'try{throw"FAIL1"}catch(o){var o="FAIL2"}console.log(o);'
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_redef_2_ie8_toplevel: {
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try {
|
||||||
|
throw "FAIL1";
|
||||||
|
} catch (a) {
|
||||||
|
var a = "FAIL2";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'try{throw"FAIL1"}catch(o){var o="FAIL2"}console.log(o);'
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
97
test/compress/issue-1733.js
Normal file
97
test/compress/issue-1733.js
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
function_iife_catch: {
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(n) {
|
||||||
|
!function() {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (n) {
|
||||||
|
var a = 1;
|
||||||
|
console.log(n, a);
|
||||||
|
}
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect_exact: "function f(o){!function(){try{throw 0}catch(c){var o=1;console.log(c,o)}}()}f();"
|
||||||
|
expect_stdout: "0 1"
|
||||||
|
}
|
||||||
|
|
||||||
|
function_iife_catch_ie8: {
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(n) {
|
||||||
|
!function() {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (n) {
|
||||||
|
var a = 1;
|
||||||
|
console.log(n, a);
|
||||||
|
}
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect_exact: "function f(o){!function(){try{throw 0}catch(o){var c=1;console.log(o,c)}}()}f();"
|
||||||
|
expect_stdout: "0 1"
|
||||||
|
}
|
||||||
|
|
||||||
|
function_catch_catch: {
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = 0;
|
||||||
|
function f() {
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (c) {
|
||||||
|
try {
|
||||||
|
throw 2;
|
||||||
|
} catch (o) {
|
||||||
|
var o = 3;
|
||||||
|
console.log(o);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(o);
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect_exact: "var o=0;function f(){try{throw 1}catch(c){try{throw 2}catch(o){var o=3;console.log(o)}}console.log(o)}f();"
|
||||||
|
expect_stdout: [
|
||||||
|
"3",
|
||||||
|
"undefined",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
function_catch_catch_ie8: {
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = 0;
|
||||||
|
function f() {
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (c) {
|
||||||
|
try {
|
||||||
|
throw 2;
|
||||||
|
} catch (o) {
|
||||||
|
var o = 3;
|
||||||
|
console.log(o);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(o);
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect_exact: "var o=0;function f(){try{throw 1}catch(c){try{throw 2}catch(o){var o=3;console.log(o)}}console.log(o)}f();"
|
||||||
|
expect_stdout: [
|
||||||
|
"3",
|
||||||
|
"undefined",
|
||||||
|
]
|
||||||
|
}
|
||||||
54
test/compress/issue-1750.js
Normal file
54
test/compress/issue-1750.js
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
case_1: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 0, b = 1;
|
||||||
|
switch (true) {
|
||||||
|
case a, true:
|
||||||
|
default:
|
||||||
|
b = 2;
|
||||||
|
case true:
|
||||||
|
}
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 0, b = 1;
|
||||||
|
switch (true) {
|
||||||
|
case a, true:
|
||||||
|
b = 2;
|
||||||
|
}
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect_stdout: "0 2"
|
||||||
|
}
|
||||||
|
|
||||||
|
case_2: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 0, b = 1;
|
||||||
|
switch (0) {
|
||||||
|
default:
|
||||||
|
b = 2;
|
||||||
|
case a:
|
||||||
|
a = 3;
|
||||||
|
case 0:
|
||||||
|
}
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 0, b = 1;
|
||||||
|
switch (0) {
|
||||||
|
case a:
|
||||||
|
a = 3;
|
||||||
|
}
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect_stdout: "3 1"
|
||||||
|
}
|
||||||
109
test/compress/issue-1770.js
Normal file
109
test/compress/issue-1770.js
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
mangle_props: {
|
||||||
|
mangle = {
|
||||||
|
properties: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var obj = {
|
||||||
|
undefined: 1,
|
||||||
|
NaN: 2,
|
||||||
|
Infinity: 3,
|
||||||
|
"-Infinity": 4,
|
||||||
|
null: 5,
|
||||||
|
};
|
||||||
|
console.log(
|
||||||
|
obj[void 0],
|
||||||
|
obj[undefined],
|
||||||
|
obj["undefined"],
|
||||||
|
obj[0/0],
|
||||||
|
obj[NaN],
|
||||||
|
obj["NaN"],
|
||||||
|
obj[1/0],
|
||||||
|
obj[Infinity],
|
||||||
|
obj["Infinity"],
|
||||||
|
obj[-1/0],
|
||||||
|
obj[-Infinity],
|
||||||
|
obj["-Infinity"],
|
||||||
|
obj[null],
|
||||||
|
obj["null"]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var obj = {
|
||||||
|
undefined: 1,
|
||||||
|
NaN: 2,
|
||||||
|
Infinity: 3,
|
||||||
|
"-Infinity": 4,
|
||||||
|
null: 5,
|
||||||
|
};
|
||||||
|
console.log(
|
||||||
|
obj[void 0],
|
||||||
|
obj[void 0],
|
||||||
|
obj["undefined"],
|
||||||
|
obj[0/0],
|
||||||
|
obj[NaN],
|
||||||
|
obj["NaN"],
|
||||||
|
obj[1/0],
|
||||||
|
obj[1/0],
|
||||||
|
obj["Infinity"],
|
||||||
|
obj[-1/0],
|
||||||
|
obj[-1/0],
|
||||||
|
obj["-Infinity"],
|
||||||
|
obj[null],
|
||||||
|
obj["null"]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect_stdout: "1 1 1 2 2 2 3 3 3 4 4 4 5 5"
|
||||||
|
}
|
||||||
|
|
||||||
|
numeric_literal: {
|
||||||
|
mangle = {
|
||||||
|
properties: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
beautify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var obj = {
|
||||||
|
0: 0,
|
||||||
|
"-0": 1,
|
||||||
|
42: 2,
|
||||||
|
"42": 3,
|
||||||
|
0x25: 4,
|
||||||
|
"0x25": 5,
|
||||||
|
1E42: 6,
|
||||||
|
"1E42": 7,
|
||||||
|
"1e+42": 8,
|
||||||
|
};
|
||||||
|
console.log(obj[-0], obj[-""], obj["-0"]);
|
||||||
|
console.log(obj[42], obj["42"]);
|
||||||
|
console.log(obj[0x25], obj["0x25"], obj[37], obj["37"]);
|
||||||
|
console.log(obj[1E42], obj["1E42"], obj["1e+42"]);
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
'var obj = {',
|
||||||
|
' 0: 0,',
|
||||||
|
' "-0": 1,',
|
||||||
|
' 42: 2,',
|
||||||
|
' "42": 3,',
|
||||||
|
' 37: 4,',
|
||||||
|
' o: 5,',
|
||||||
|
' 1e42: 6,',
|
||||||
|
' b: 7,',
|
||||||
|
' "1e+42": 8',
|
||||||
|
'};',
|
||||||
|
'',
|
||||||
|
'console.log(obj[-0], obj[-""], obj["-0"]);',
|
||||||
|
'',
|
||||||
|
'console.log(obj[42], obj["42"]);',
|
||||||
|
'',
|
||||||
|
'console.log(obj[37], obj["o"], obj[37], obj["37"]);',
|
||||||
|
'',
|
||||||
|
'console.log(obj[1e42], obj["b"], obj["1e+42"]);',
|
||||||
|
]
|
||||||
|
expect_stdout: [
|
||||||
|
"0 0 1",
|
||||||
|
"3 3",
|
||||||
|
"4 5 4 4",
|
||||||
|
"8 7 8",
|
||||||
|
]
|
||||||
|
}
|
||||||
16
test/compress/issue-1787.js
Normal file
16
test/compress/issue-1787.js
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
unary_prefix: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
var x = -(2 / 3);
|
||||||
|
return x;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_exact: "console.log(-2/3);"
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
134
test/compress/issue-1833.js
Normal file
134
test/compress/issue-1833.js
Normal file
@@ -0,0 +1,134 @@
|
|||||||
|
iife_for: {
|
||||||
|
options = {
|
||||||
|
negate_iife: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
function g() {
|
||||||
|
L: for (;;) break L;
|
||||||
|
}
|
||||||
|
g();
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
!function() {
|
||||||
|
!function() {
|
||||||
|
L: for (;;) break L;
|
||||||
|
}();
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
iife_for_in: {
|
||||||
|
options = {
|
||||||
|
negate_iife: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
function g() {
|
||||||
|
L: for (var a in x) break L;
|
||||||
|
}
|
||||||
|
g();
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
!function() {
|
||||||
|
!function() {
|
||||||
|
L: for (var a in x) break L;
|
||||||
|
}();
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
iife_do: {
|
||||||
|
options = {
|
||||||
|
negate_iife: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
function g() {
|
||||||
|
L: do {
|
||||||
|
break L;
|
||||||
|
} while (1);
|
||||||
|
}
|
||||||
|
g();
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
!function() {
|
||||||
|
!function() {
|
||||||
|
L: do {
|
||||||
|
break L;
|
||||||
|
} while (1);
|
||||||
|
}();
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
iife_while: {
|
||||||
|
options = {
|
||||||
|
negate_iife: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
function g() {
|
||||||
|
L: while (1) break L;
|
||||||
|
}
|
||||||
|
g();
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
!function() {
|
||||||
|
!function() {
|
||||||
|
L: while (1) break L;
|
||||||
|
}();
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
label_do: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
loops: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
L: do {
|
||||||
|
continue L;
|
||||||
|
} while (0);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
L: do {
|
||||||
|
continue L;
|
||||||
|
} while (0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
label_while: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
dead_code: true,
|
||||||
|
loops: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
L: while (0) continue L;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: "function f(){L:;}"
|
||||||
|
}
|
||||||
31
test/compress/issue-1943.js
Normal file
31
test/compress/issue-1943.js
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
operator: {
|
||||||
|
input: {
|
||||||
|
a. //comment
|
||||||
|
typeof
|
||||||
|
}
|
||||||
|
expect_exact: "a.typeof;"
|
||||||
|
}
|
||||||
|
|
||||||
|
name: {
|
||||||
|
input: {
|
||||||
|
a. //comment
|
||||||
|
b
|
||||||
|
}
|
||||||
|
expect_exact: "a.b;"
|
||||||
|
}
|
||||||
|
|
||||||
|
keyword: {
|
||||||
|
input: {
|
||||||
|
a. //comment
|
||||||
|
default
|
||||||
|
}
|
||||||
|
expect_exact: "a.default;"
|
||||||
|
}
|
||||||
|
|
||||||
|
atom: {
|
||||||
|
input: {
|
||||||
|
a. //comment
|
||||||
|
true
|
||||||
|
}
|
||||||
|
expect_exact: "a.true;"
|
||||||
|
}
|
||||||
283
test/compress/issue-2001.js
Normal file
283
test/compress/issue-2001.js
Normal file
@@ -0,0 +1,283 @@
|
|||||||
|
export_func_1: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export function f(){};
|
||||||
|
}
|
||||||
|
expect_exact: "export function f(){};"
|
||||||
|
}
|
||||||
|
|
||||||
|
export_func_2: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: true,
|
||||||
|
side_effects: false,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export function f(){}(1);
|
||||||
|
}
|
||||||
|
expect_exact: "export function f(){};1;"
|
||||||
|
}
|
||||||
|
|
||||||
|
export_func_3: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export function f(){}(1);
|
||||||
|
}
|
||||||
|
expect_exact: "export function f(){};"
|
||||||
|
}
|
||||||
|
|
||||||
|
export_default_func_1: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export default function f(){};
|
||||||
|
}
|
||||||
|
expect_exact: "export default function f(){};"
|
||||||
|
}
|
||||||
|
|
||||||
|
export_default_func_2: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: true,
|
||||||
|
side_effects: false,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export default function f(){}(1);
|
||||||
|
}
|
||||||
|
expect_exact: "export default function f(){};1;"
|
||||||
|
}
|
||||||
|
|
||||||
|
export_default_func_3: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export default function f(){}(1);
|
||||||
|
}
|
||||||
|
expect_exact: "export default function f(){};"
|
||||||
|
}
|
||||||
|
|
||||||
|
export_class_1: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export class C {};
|
||||||
|
}
|
||||||
|
expect_exact: "export class C{};"
|
||||||
|
}
|
||||||
|
|
||||||
|
export_class_2: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: true,
|
||||||
|
side_effects: false,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export class C {}(1);
|
||||||
|
}
|
||||||
|
expect_exact: "export class C{};1;"
|
||||||
|
}
|
||||||
|
|
||||||
|
export_class_3: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export class C {}(1);
|
||||||
|
}
|
||||||
|
expect_exact: "export class C{};"
|
||||||
|
}
|
||||||
|
|
||||||
|
export_default_class_1: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export default class C {};
|
||||||
|
}
|
||||||
|
expect_exact: "export default class C{};"
|
||||||
|
}
|
||||||
|
|
||||||
|
export_default_class_2: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: true,
|
||||||
|
side_effects: false,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export default class C {}(1);
|
||||||
|
}
|
||||||
|
expect_exact: "export default class C{};1;"
|
||||||
|
}
|
||||||
|
|
||||||
|
export_default_class_3: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export default class C {}(1);
|
||||||
|
}
|
||||||
|
expect_exact: "export default class C{};"
|
||||||
|
}
|
||||||
|
|
||||||
|
export_mangle_1: {
|
||||||
|
mangle = {
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export function foo(one, two) {
|
||||||
|
return one - two;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
expect_exact: "export function foo(o,n){return o-n};"
|
||||||
|
}
|
||||||
|
|
||||||
|
export_mangle_2: {
|
||||||
|
mangle = {
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export default function foo(one, two) {
|
||||||
|
return one - two;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
expect_exact: "export default function foo(o,t){return o-t};"
|
||||||
|
}
|
||||||
|
|
||||||
|
export_mangle_3: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export class C {
|
||||||
|
go(one, two) {
|
||||||
|
var z = one;
|
||||||
|
return one - two + z;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
expect_exact: "export class C{go(r,e){return r-e+r}};"
|
||||||
|
}
|
||||||
|
|
||||||
|
export_mangle_4: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export default class C {
|
||||||
|
go(one, two) {
|
||||||
|
var z = one;
|
||||||
|
return one - two + z;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
expect_exact: "export default class C{go(e,r){return e-r+e}};"
|
||||||
|
}
|
||||||
|
|
||||||
|
export_mangle_5: {
|
||||||
|
mangle = {
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export default {
|
||||||
|
prop: function(one, two) {
|
||||||
|
return one - two;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
expect_exact: "export default{prop:function(r,t){return r-t}};"
|
||||||
|
}
|
||||||
|
|
||||||
|
export_mangle_6: {
|
||||||
|
mangle = {
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var baz = 2;
|
||||||
|
export let foo = 1, bar = baz;
|
||||||
|
}
|
||||||
|
expect_exact: "var o=2;export let foo=1,bar=o;"
|
||||||
|
}
|
||||||
|
|
||||||
|
export_toplevel_1: {
|
||||||
|
options = {
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(){}
|
||||||
|
export function g(){};
|
||||||
|
export default function h(){};
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
export function g(){};
|
||||||
|
export default function h(){};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export_toplevel_2: {
|
||||||
|
options = {
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
class A {}
|
||||||
|
export class B {};
|
||||||
|
export default class C {};
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
export class B {};
|
||||||
|
export default class C {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export_default_func_ref: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export default function f(){};
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect_exact: "export default function f(){};f();"
|
||||||
|
}
|
||||||
@@ -1,19 +1,21 @@
|
|||||||
|
|
||||||
compress_new_function: {
|
compress_new_function: {
|
||||||
options = {
|
options = {
|
||||||
unsafe: true
|
unsafe: true,
|
||||||
|
unsafe_Func: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
new Function("aa, bb", 'return aa;');
|
new Function("aa, bb", 'return aa;');
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
Function("a", "b", "return a");
|
Function("n,r", "return n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
compress_new_function_with_destruct: {
|
compress_new_function_with_destruct: {
|
||||||
options = {
|
options = {
|
||||||
unsafe: true,
|
unsafe: true,
|
||||||
|
unsafe_Func: true,
|
||||||
ecma: 6
|
ecma: 6
|
||||||
}
|
}
|
||||||
beautify = {
|
beautify = {
|
||||||
@@ -25,10 +27,31 @@ compress_new_function_with_destruct: {
|
|||||||
new Function("[[aa]], [{bb}]", 'return aa;');
|
new Function("[[aa]], [{bb}]", 'return aa;');
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
Function("a", "[b]", "return a");
|
Function("n,[r]", "return n");
|
||||||
Function("a", "{bb}", "return a");
|
Function("n,{bb:b}", "return n");
|
||||||
Function("[[a]]", "[{bb}]", 'return a');
|
Function("[[n]],[{bb:b}]", "return n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
compress_new_function_with_destruct_arrows: {
|
||||||
|
options = {
|
||||||
|
arrows: true,
|
||||||
|
unsafe_arrows: true,
|
||||||
|
unsafe: true,
|
||||||
|
unsafe_Func: true,
|
||||||
|
ecma: 6,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
ecma: 6
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
new Function("aa, [bb]", 'return aa;');
|
||||||
|
new Function("aa, {bb}", 'return aa;');
|
||||||
|
new Function("[[aa]], [{bb}]", 'return aa;');
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
Function("n,[a]", "return n");
|
||||||
|
Function("b,{bb:n}", "return b");
|
||||||
|
Function("[[b]],[{bb:n}]", "return b");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
493
test/compress/issue-281.js
Normal file
493
test/compress/issue-281.js
Normal file
@@ -0,0 +1,493 @@
|
|||||||
|
collapse_vars_constants: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f1(x) {
|
||||||
|
var a = 4, b = x.prop, c = 5, d = sideeffect1(), e = sideeffect2();
|
||||||
|
return b + (function() { return d - a * e - c; })();
|
||||||
|
}
|
||||||
|
function f2(x) {
|
||||||
|
var a = 4, b = x.prop, c = 5, not_used = sideeffect1(), e = sideeffect2();
|
||||||
|
return b + (function() { return -a * e - c; })();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f1(x) {
|
||||||
|
var b = x.prop, d = sideeffect1(), e = sideeffect2();
|
||||||
|
return b + (d - 4 * e - 5);
|
||||||
|
}
|
||||||
|
function f2(x) {
|
||||||
|
var b = x.prop;
|
||||||
|
sideeffect1();
|
||||||
|
return b + (-4 * sideeffect2() - 5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
modified: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
inline: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f5(b) {
|
||||||
|
var a = function() {
|
||||||
|
return b;
|
||||||
|
}();
|
||||||
|
return b++ + a;
|
||||||
|
}
|
||||||
|
console.log(f5(1));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f5(b) {
|
||||||
|
var a = b;
|
||||||
|
return b++ + a;
|
||||||
|
}
|
||||||
|
console.log(f5(1));
|
||||||
|
}
|
||||||
|
expect_stdout: "2"
|
||||||
|
}
|
||||||
|
|
||||||
|
ref_scope: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
inline: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
var a = 1, b = 2, c = 3;
|
||||||
|
var a = c++, b = b /= a;
|
||||||
|
return function() {
|
||||||
|
return a;
|
||||||
|
}() + b;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function() {
|
||||||
|
var a = 1, b = 2, c = 3;
|
||||||
|
b = b /= a = c++;
|
||||||
|
return a + b;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
safe_undefined: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
if_return: true,
|
||||||
|
inline: true,
|
||||||
|
unsafe: false,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
mangle = {}
|
||||||
|
input: {
|
||||||
|
var a, c;
|
||||||
|
console.log(function(undefined) {
|
||||||
|
return function() {
|
||||||
|
if (a)
|
||||||
|
return b;
|
||||||
|
if (c)
|
||||||
|
return d;
|
||||||
|
};
|
||||||
|
}(1)());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a, c;
|
||||||
|
console.log(a ? b : c ? d : void 0);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
negate_iife_3: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
expression: true,
|
||||||
|
inline: true,
|
||||||
|
negate_iife: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(){ return t })() ? console.log(true) : console.log(false);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
t ? console.log(true) : console.log(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
negate_iife_3_off: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
expression: true,
|
||||||
|
inline: true,
|
||||||
|
negate_iife: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(){ return t })() ? console.log(true) : console.log(false);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
t ? console.log(true) : console.log(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
negate_iife_4: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
expression: true,
|
||||||
|
inline: true,
|
||||||
|
negate_iife: true,
|
||||||
|
sequences: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(){ return t })() ? console.log(true) : console.log(false);
|
||||||
|
(function(){
|
||||||
|
console.log("something");
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
t ? console.log(true) : console.log(false), void console.log("something");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
negate_iife_5: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
expression: true,
|
||||||
|
inline: true,
|
||||||
|
negate_iife: true,
|
||||||
|
sequences: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
if ((function(){ return t })()) {
|
||||||
|
foo(true);
|
||||||
|
} else {
|
||||||
|
bar(false);
|
||||||
|
}
|
||||||
|
(function(){
|
||||||
|
console.log("something");
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
t ? foo(true) : bar(false), void console.log("something");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
negate_iife_5_off: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
expression: true,
|
||||||
|
inline: true,
|
||||||
|
negate_iife: false,
|
||||||
|
sequences: true,
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
if ((function(){ return t })()) {
|
||||||
|
foo(true);
|
||||||
|
} else {
|
||||||
|
bar(false);
|
||||||
|
}
|
||||||
|
(function(){
|
||||||
|
console.log("something");
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
t ? foo(true) : bar(false), void console.log("something");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1254_negate_iife_true: {
|
||||||
|
options = {
|
||||||
|
expression: true,
|
||||||
|
inline: true,
|
||||||
|
negate_iife: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
return function() {
|
||||||
|
console.log('test')
|
||||||
|
};
|
||||||
|
})()();
|
||||||
|
}
|
||||||
|
expect_exact: 'void console.log("test");'
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1254_negate_iife_nested: {
|
||||||
|
options = {
|
||||||
|
expression: true,
|
||||||
|
inline: true,
|
||||||
|
negate_iife: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
return function() {
|
||||||
|
console.log('test')
|
||||||
|
};
|
||||||
|
})()()()()();
|
||||||
|
}
|
||||||
|
expect_exact: '(void console.log("test"))()()();'
|
||||||
|
}
|
||||||
|
|
||||||
|
negate_iife_issue_1073: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
negate_iife: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
unused: true,
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
new (function(a) {
|
||||||
|
return function Foo() {
|
||||||
|
this.x = a;
|
||||||
|
console.log(this);
|
||||||
|
};
|
||||||
|
}(7))();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
new function() {
|
||||||
|
this.x = 7,
|
||||||
|
console.log(this);
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1288_side_effects: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
negate_iife: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
if (w) ;
|
||||||
|
else {
|
||||||
|
(function f() {})();
|
||||||
|
}
|
||||||
|
if (!x) {
|
||||||
|
(function() {
|
||||||
|
x = {};
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
if (y)
|
||||||
|
(function() {})();
|
||||||
|
else
|
||||||
|
(function(z) {
|
||||||
|
return z;
|
||||||
|
})(0);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
w;
|
||||||
|
x || (x = {});
|
||||||
|
y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inner_var_for_in_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
var a = 1, b = 2;
|
||||||
|
for (b in (function() {
|
||||||
|
return x(a, b, c);
|
||||||
|
})()) {
|
||||||
|
var c = 3, d = 4;
|
||||||
|
x(a, b, c, d);
|
||||||
|
}
|
||||||
|
x(a, b, c, d);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
var a = 1, b = 2;
|
||||||
|
for (b in x(1, b, c)) {
|
||||||
|
var c = 3, d = 4;
|
||||||
|
x(1, b, c, d);
|
||||||
|
}
|
||||||
|
x(1, b, c, d);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1595_3: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function f(a) {
|
||||||
|
return g(a + 1);
|
||||||
|
})(2);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
g(3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1758: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(c) {
|
||||||
|
var undefined = 42;
|
||||||
|
return function() {
|
||||||
|
c--;
|
||||||
|
c--, c.toString();
|
||||||
|
return;
|
||||||
|
}();
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(c) {
|
||||||
|
var undefined = 42;
|
||||||
|
return c--, c--, void c.toString();
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
wrap_iife: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
negate_iife: false,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
wrap_iife: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
return function() {
|
||||||
|
console.log('test')
|
||||||
|
};
|
||||||
|
})()();
|
||||||
|
}
|
||||||
|
expect_exact: 'void console.log("test");'
|
||||||
|
}
|
||||||
|
|
||||||
|
wrap_iife_in_expression: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
negate_iife: false,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
wrap_iife: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
foo = (function () {
|
||||||
|
return bar();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_exact: 'foo=bar();'
|
||||||
|
}
|
||||||
|
|
||||||
|
wrap_iife_in_return_call: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
negate_iife: false,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
wrap_iife: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
return (function() {
|
||||||
|
console.log('test')
|
||||||
|
})();
|
||||||
|
})()();
|
||||||
|
}
|
||||||
|
expect_exact: '(void console.log("test"))();'
|
||||||
|
}
|
||||||
|
|
||||||
|
pure_annotation_1: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
/*@__PURE__*/(function() {
|
||||||
|
console.log("hello");
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_exact: ""
|
||||||
|
}
|
||||||
|
|
||||||
|
pure_annotation_2: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
inline: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
/*@__PURE__*/(function(n) {
|
||||||
|
console.log("hello", n);
|
||||||
|
}(42));
|
||||||
|
}
|
||||||
|
expect_exact: ""
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_fargs: {
|
||||||
|
options = {
|
||||||
|
cascade: true,
|
||||||
|
inline: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
!function(a_1) {
|
||||||
|
a++;
|
||||||
|
}(a++ + (a && a.var));
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 1;
|
||||||
|
++a && a.var, a++;
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "3"
|
||||||
|
}
|
||||||
|
|
||||||
|
keep_fargs: {
|
||||||
|
options = {
|
||||||
|
cascade: true,
|
||||||
|
inline: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
!function(a_1) {
|
||||||
|
a++;
|
||||||
|
}(a++ + (a && a.var));
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 1;
|
||||||
|
++a && a.var, a++;
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "3"
|
||||||
|
}
|
||||||
@@ -6,7 +6,7 @@ NaN_and_Infinity_must_have_parens: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
(1/0).toString();
|
(1/0).toString();
|
||||||
NaN.toString(); // transformation to 0/0 dropped
|
NaN.toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -23,3 +23,135 @@ NaN_and_Infinity_should_not_be_replaced_when_they_are_redefined: {
|
|||||||
NaN.toString();
|
NaN.toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NaN_and_Infinity_must_have_parens_evaluate: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(123456789 / 0).toString();
|
||||||
|
(+"foo").toString();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(1/0).toString();
|
||||||
|
NaN.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NaN_and_Infinity_should_not_be_replaced_when_they_are_redefined_evaluate: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var Infinity, NaN;
|
||||||
|
(123456789 / 0).toString();
|
||||||
|
(+"foo").toString();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var Infinity, NaN;
|
||||||
|
(1/0).toString();
|
||||||
|
(0/0).toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
beautify_off_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
beautify: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var NaN;
|
||||||
|
console.log(
|
||||||
|
null,
|
||||||
|
undefined,
|
||||||
|
Infinity,
|
||||||
|
NaN,
|
||||||
|
Infinity * undefined,
|
||||||
|
Infinity.toString(),
|
||||||
|
NaN.toString(),
|
||||||
|
(Infinity * undefined).toString()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect_exact: "var NaN;console.log(null,void 0,1/0,NaN,0/0,(1/0).toString(),NaN.toString(),(0/0).toString());"
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
beautify_off_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
beautify: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(
|
||||||
|
null.toString(),
|
||||||
|
undefined.toString()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect_exact: "console.log(null.toString(),(void 0).toString());"
|
||||||
|
}
|
||||||
|
|
||||||
|
beautify_on_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
beautify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var NaN;
|
||||||
|
console.log(
|
||||||
|
null,
|
||||||
|
undefined,
|
||||||
|
Infinity,
|
||||||
|
NaN,
|
||||||
|
Infinity * undefined,
|
||||||
|
Infinity.toString(),
|
||||||
|
NaN.toString(),
|
||||||
|
(Infinity * undefined).toString()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"var NaN;",
|
||||||
|
"",
|
||||||
|
"console.log(null, void 0, 1 / 0, NaN, 0 / 0, (1 / 0).toString(), NaN.toString(), (0 / 0).toString());",
|
||||||
|
]
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
beautify_on_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
beautify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(
|
||||||
|
null.toString(),
|
||||||
|
undefined.toString()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect_exact: "console.log(null.toString(), (void 0).toString());"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1724: {
|
||||||
|
input: {
|
||||||
|
var a = 0;
|
||||||
|
++a % Infinity | Infinity ? a++ : 0;
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: "var a=0;++a%(1/0)|1/0?a++:0;console.log(a);"
|
||||||
|
expect_stdout: "2"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1725: {
|
||||||
|
input: {
|
||||||
|
([].length === 0) % Infinity ? console.log("PASS") : console.log("FAIL");
|
||||||
|
}
|
||||||
|
expect_exact: '(0===[].length)%(1/0)?console.log("PASS"):console.log("FAIL");'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ dead_code_const_annotation_regex: {
|
|||||||
var CONST_FOO_ANN = !1;
|
var CONST_FOO_ANN = !1;
|
||||||
if (CONST_FOO_ANN) console.log('reachable');
|
if (CONST_FOO_ANN) console.log('reachable');
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
drop_console_2: {
|
drop_console_2: {
|
||||||
@@ -158,7 +159,7 @@ negate_iife_4: {
|
|||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
(function(){ return t })() ? console.log(true) : console.log(false), function(){
|
!function(){ return t }() ? console.log(false) : console.log(true), function(){
|
||||||
console.log("something");
|
console.log("something");
|
||||||
}();
|
}();
|
||||||
}
|
}
|
||||||
@@ -182,7 +183,7 @@ negate_iife_5: {
|
|||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
(function(){ return t })() ? foo(true) : bar(false), function(){
|
!function(){ return t }() ? bar(false) : foo(true), function(){
|
||||||
console.log("something");
|
console.log("something");
|
||||||
}();
|
}();
|
||||||
}
|
}
|
||||||
@@ -206,7 +207,7 @@ negate_iife_5_off: {
|
|||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
(function(){ return t })() ? foo(true) : bar(false), function(){
|
!function(){ return t }() ? bar(false) : foo(true), function(){
|
||||||
console.log("something");
|
console.log("something");
|
||||||
}();
|
}();
|
||||||
}
|
}
|
||||||
@@ -225,6 +226,7 @@ issue_1254_negate_iife_true: {
|
|||||||
})()();
|
})()();
|
||||||
}
|
}
|
||||||
expect_exact: '(function(){return function(){console.log("test")}})()();'
|
expect_exact: '(function(){return function(){console.log("test")}})()();'
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_1254_negate_iife_nested: {
|
issue_1254_negate_iife_nested: {
|
||||||
@@ -240,6 +242,7 @@ issue_1254_negate_iife_nested: {
|
|||||||
})()()()()();
|
})()()()()();
|
||||||
}
|
}
|
||||||
expect_exact: '(function(){return function(){console.log("test")}})()()()()();'
|
expect_exact: '(function(){return function(){console.log("test")}})()()()()();'
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
conditional: {
|
conditional: {
|
||||||
|
|||||||
@@ -1,37 +1,45 @@
|
|||||||
dont_reuse_prop: {
|
dont_reuse_prop: {
|
||||||
mangle_props = {
|
mangle = {
|
||||||
regex: /asd/
|
properties: {
|
||||||
};
|
regex: /asd/,
|
||||||
|
},
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
|
"aaaaaaaaaabbbbb";
|
||||||
var obj = {};
|
var obj = {};
|
||||||
obj.a = 123;
|
obj.a = 123;
|
||||||
obj.asd = 256;
|
obj.asd = 256;
|
||||||
console.log(obj.a);
|
console.log(obj.a);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
|
"aaaaaaaaaabbbbb";
|
||||||
var obj = {};
|
var obj = {};
|
||||||
obj.a = 123;
|
obj.a = 123;
|
||||||
obj.b = 256;
|
obj.b = 256;
|
||||||
console.log(obj.a);
|
console.log(obj.a);
|
||||||
}
|
}
|
||||||
|
expect_stdout: "123"
|
||||||
}
|
}
|
||||||
|
|
||||||
unmangleable_props_should_always_be_reserved: {
|
unmangleable_props_should_always_be_reserved: {
|
||||||
mangle_props = {
|
mangle = {
|
||||||
regex: /asd/
|
properties: {
|
||||||
};
|
regex: /asd/,
|
||||||
|
},
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
|
"aaaaaaaaaabbbbb";
|
||||||
var obj = {};
|
var obj = {};
|
||||||
obj.asd = 256;
|
obj.asd = 256;
|
||||||
obj.a = 123;
|
obj.a = 123;
|
||||||
console.log(obj.a);
|
console.log(obj.a);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
|
"aaaaaaaaaabbbbb";
|
||||||
var obj = {};
|
var obj = {};
|
||||||
obj.b = 256;
|
obj.b = 256;
|
||||||
obj.a = 123;
|
obj.a = 123;
|
||||||
console.log(obj.a);
|
console.log(obj.a);
|
||||||
}
|
}
|
||||||
}
|
expect_stdout: "123"
|
||||||
|
}
|
||||||
|
|||||||
@@ -29,4 +29,5 @@ dont_mangle_arguments: {
|
|||||||
})(5,6,7);
|
})(5,6,7);
|
||||||
}
|
}
|
||||||
expect_exact: "(function(){var arguments=arguments,o=9;console.log(o,arguments)})(5,6,7);"
|
expect_exact: "(function(){var arguments=arguments,o=9;console.log(o,arguments)})(5,6,7);"
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,6 +50,8 @@ this_binding_conditionals: {
|
|||||||
this_binding_collapse_vars: {
|
this_binding_collapse_vars: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
var c = a; c();
|
var c = a; c();
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ eval_collapse_vars: {
|
|||||||
eval("console.log(a);");
|
eval("console.log(a);");
|
||||||
})(eval);
|
})(eval);
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
eval_unused: {
|
eval_unused: {
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ labels_1: {
|
|||||||
expect: {
|
expect: {
|
||||||
foo || console.log("bar");
|
foo || console.log("bar");
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
labels_2: {
|
labels_2: {
|
||||||
@@ -40,6 +41,7 @@ labels_3: {
|
|||||||
for (var i = 0; i < 5; ++i)
|
for (var i = 0; i < 5; ++i)
|
||||||
i < 3 || console.log(i);
|
i < 3 || console.log(i);
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
labels_4: {
|
labels_4: {
|
||||||
@@ -54,6 +56,7 @@ labels_4: {
|
|||||||
for (var i = 0; i < 5; ++i)
|
for (var i = 0; i < 5; ++i)
|
||||||
i < 3 || console.log(i);
|
i < 3 || console.log(i);
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
labels_5: {
|
labels_5: {
|
||||||
|
|||||||
@@ -166,6 +166,7 @@ keep_collapse_const_in_own_block_scope: {
|
|||||||
console.log(i);
|
console.log(i);
|
||||||
console.log(c);
|
console.log(c);
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
keep_collapse_const_in_own_block_scope_2: {
|
keep_collapse_const_in_own_block_scope_2: {
|
||||||
@@ -186,6 +187,7 @@ keep_collapse_const_in_own_block_scope_2: {
|
|||||||
console.log(i);
|
console.log(i);
|
||||||
console.log(c);
|
console.log(c);
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
evaluate: {
|
evaluate: {
|
||||||
@@ -213,8 +215,7 @@ evaluate: {
|
|||||||
a();
|
a();
|
||||||
for(;;)
|
for(;;)
|
||||||
c();
|
c();
|
||||||
// rule disabled due to issue_1532
|
d();
|
||||||
do d(); while (false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -244,7 +245,7 @@ issue_1532: {
|
|||||||
issue_186: {
|
issue_186: {
|
||||||
beautify = {
|
beautify = {
|
||||||
beautify: false,
|
beautify: false,
|
||||||
screw_ie8: true,
|
ie8: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = 3;
|
var x = 3;
|
||||||
@@ -263,7 +264,7 @@ issue_186: {
|
|||||||
issue_186_ie8: {
|
issue_186_ie8: {
|
||||||
beautify = {
|
beautify = {
|
||||||
beautify: false,
|
beautify: false,
|
||||||
screw_ie8: false,
|
ie8: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = 3;
|
var x = 3;
|
||||||
@@ -282,7 +283,7 @@ issue_186_ie8: {
|
|||||||
issue_186_beautify: {
|
issue_186_beautify: {
|
||||||
beautify = {
|
beautify = {
|
||||||
beautify: true,
|
beautify: true,
|
||||||
screw_ie8: true,
|
ie8: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = 3;
|
var x = 3;
|
||||||
@@ -309,7 +310,7 @@ issue_186_beautify: {
|
|||||||
issue_186_beautify_ie8: {
|
issue_186_beautify_ie8: {
|
||||||
beautify = {
|
beautify = {
|
||||||
beautify: true,
|
beautify: true,
|
||||||
screw_ie8: false,
|
ie8: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = 3;
|
var x = 3;
|
||||||
@@ -339,7 +340,7 @@ issue_186_bracketize: {
|
|||||||
beautify = {
|
beautify = {
|
||||||
beautify: false,
|
beautify: false,
|
||||||
bracketize: true,
|
bracketize: true,
|
||||||
screw_ie8: true,
|
ie8: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = 3;
|
var x = 3;
|
||||||
@@ -359,7 +360,7 @@ issue_186_bracketize_ie8: {
|
|||||||
beautify = {
|
beautify = {
|
||||||
beautify: false,
|
beautify: false,
|
||||||
bracketize: true,
|
bracketize: true,
|
||||||
screw_ie8: false,
|
ie8: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = 3;
|
var x = 3;
|
||||||
@@ -379,7 +380,7 @@ issue_186_beautify_bracketize: {
|
|||||||
beautify = {
|
beautify = {
|
||||||
beautify: true,
|
beautify: true,
|
||||||
bracketize: true,
|
bracketize: true,
|
||||||
screw_ie8: true,
|
ie8: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = 3;
|
var x = 3;
|
||||||
@@ -411,7 +412,7 @@ issue_186_beautify_bracketize_ie8: {
|
|||||||
beautify = {
|
beautify = {
|
||||||
beautify: true,
|
beautify: true,
|
||||||
bracketize: true,
|
bracketize: true,
|
||||||
screw_ie8: false,
|
ie8: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = 3;
|
var x = 3;
|
||||||
@@ -438,3 +439,58 @@ issue_186_beautify_bracketize_ie8: {
|
|||||||
'}',
|
'}',
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_1648: {
|
||||||
|
options = {
|
||||||
|
join_vars: true,
|
||||||
|
loops: true,
|
||||||
|
passes: 2,
|
||||||
|
sequences: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
x();
|
||||||
|
var b = 1;
|
||||||
|
while (1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: "function f(){for(x();1;);}"
|
||||||
|
}
|
||||||
|
|
||||||
|
do_switch: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
loops: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
do {
|
||||||
|
switch (a) {
|
||||||
|
case b:
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} while (false);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
do {
|
||||||
|
switch (a) {
|
||||||
|
case b:
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} while (false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
in_parenthesis_1: {
|
||||||
|
input: {
|
||||||
|
for (("foo" in {});0;);
|
||||||
|
}
|
||||||
|
expect_exact: 'for(("foo"in{});0;);'
|
||||||
|
}
|
||||||
|
|
||||||
|
in_parenthesis_2: {
|
||||||
|
input: {
|
||||||
|
for ((function(){ "foo" in {}; });0;);
|
||||||
|
}
|
||||||
|
expect_exact: 'for(function(){"foo"in{}};0;);'
|
||||||
|
}
|
||||||
|
|||||||
@@ -22,27 +22,25 @@ negate_iife_1_off: {
|
|||||||
|
|
||||||
negate_iife_2: {
|
negate_iife_2: {
|
||||||
options = {
|
options = {
|
||||||
negate_iife: true
|
inline: true,
|
||||||
|
negate_iife: true,
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
(function(){ return {} })().x = 10; // should not transform this one
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(function(){ return {} })().x = 10;
|
(function(){ return {} })().x = 10;
|
||||||
}
|
}
|
||||||
|
expect_exact: "({}).x=10;"
|
||||||
}
|
}
|
||||||
|
|
||||||
negate_iife_2_side_effects: {
|
negate_iife_2_side_effects: {
|
||||||
options = {
|
options = {
|
||||||
|
inline: true,
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
(function(){ return {} })().x = 10; // should not transform this one
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
(function(){ return {} })().x = 10;
|
(function(){ return {} })().x = 10;
|
||||||
}
|
}
|
||||||
|
expect_exact: "({}).x=10;"
|
||||||
}
|
}
|
||||||
|
|
||||||
negate_iife_3: {
|
negate_iife_3: {
|
||||||
@@ -62,6 +60,7 @@ negate_iife_3_evaluate: {
|
|||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -70,6 +69,7 @@ negate_iife_3_evaluate: {
|
|||||||
expect: {
|
expect: {
|
||||||
console.log(true);
|
console.log(true);
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
negate_iife_3_side_effects: {
|
negate_iife_3_side_effects: {
|
||||||
@@ -103,6 +103,7 @@ negate_iife_3_off_evaluate: {
|
|||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
negate_iife: false,
|
negate_iife: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -111,6 +112,7 @@ negate_iife_3_off_evaluate: {
|
|||||||
expect: {
|
expect: {
|
||||||
console.log(true);
|
console.log(true);
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
negate_iife_4: {
|
negate_iife_4: {
|
||||||
@@ -243,6 +245,7 @@ negate_iife_nested: {
|
|||||||
}(7);
|
}(7);
|
||||||
}).f();
|
}).f();
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
negate_iife_nested_off: {
|
negate_iife_nested_off: {
|
||||||
@@ -275,6 +278,7 @@ negate_iife_nested_off: {
|
|||||||
})(7);
|
})(7);
|
||||||
}).f();
|
}).f();
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
negate_iife_issue_1073: {
|
negate_iife_issue_1073: {
|
||||||
@@ -299,6 +303,7 @@ negate_iife_issue_1073: {
|
|||||||
};
|
};
|
||||||
}(7))();
|
}(7))();
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_1254_negate_iife_false: {
|
issue_1254_negate_iife_false: {
|
||||||
@@ -313,6 +318,7 @@ issue_1254_negate_iife_false: {
|
|||||||
})()();
|
})()();
|
||||||
}
|
}
|
||||||
expect_exact: '(function(){return function(){console.log("test")}})()();'
|
expect_exact: '(function(){return function(){console.log("test")}})()();'
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_1254_negate_iife_true: {
|
issue_1254_negate_iife_true: {
|
||||||
@@ -327,6 +333,7 @@ issue_1254_negate_iife_true: {
|
|||||||
})()();
|
})()();
|
||||||
}
|
}
|
||||||
expect_exact: '!function(){return function(){console.log("test")}}()();'
|
expect_exact: '!function(){return function(){console.log("test")}}()();'
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_1254_negate_iife_nested: {
|
issue_1254_negate_iife_nested: {
|
||||||
@@ -341,12 +348,14 @@ issue_1254_negate_iife_nested: {
|
|||||||
})()()()()();
|
})()()()()();
|
||||||
}
|
}
|
||||||
expect_exact: '!function(){return function(){console.log("test")}}()()()()();'
|
expect_exact: '!function(){return function(){console.log("test")}}()()()()();'
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_1288: {
|
issue_1288: {
|
||||||
options = {
|
options = {
|
||||||
negate_iife: true,
|
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
|
negate_iife: true,
|
||||||
|
side_effects: false,
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
if (w) ;
|
if (w) ;
|
||||||
@@ -366,11 +375,11 @@ issue_1288: {
|
|||||||
})(0);
|
})(0);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
w || function f() {}();
|
w || !function f() {}();
|
||||||
x || function() {
|
x || !function() {
|
||||||
x = {};
|
x = {};
|
||||||
}();
|
}();
|
||||||
y ? function() {}() : function(z) {
|
y ? !function() {}() : !function(z) {
|
||||||
return z;
|
return z;
|
||||||
}(0);
|
}(0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -98,3 +98,19 @@ new_with_assignement_expression: {
|
|||||||
new y([a, b] = [3, 4]);
|
new y([a, b] = [3, 4]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dot_parenthesis_1: {
|
||||||
|
input: {
|
||||||
|
console.log(new (Math.random().constructor) instanceof Number);
|
||||||
|
}
|
||||||
|
expect_exact: "console.log(new(Math.random().constructor)instanceof Number);"
|
||||||
|
expect_stdout: "true"
|
||||||
|
}
|
||||||
|
|
||||||
|
dot_parenthesis_2: {
|
||||||
|
input: {
|
||||||
|
console.log(typeof new function(){Math.random()}.constructor);
|
||||||
|
}
|
||||||
|
expect_exact: "console.log(typeof new function(){Math.random()}.constructor);"
|
||||||
|
expect_stdout: "function"
|
||||||
|
}
|
||||||
|
|||||||
38
test/compress/node_version.js
Normal file
38
test/compress/node_version.js
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
eval_let_6: {
|
||||||
|
input: {
|
||||||
|
eval("let a;");
|
||||||
|
console.log();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
eval("let a;");
|
||||||
|
console.log();
|
||||||
|
}
|
||||||
|
expect_stdout: ""
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
eval_let_4: {
|
||||||
|
input: {
|
||||||
|
eval("let a;");
|
||||||
|
console.log();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
eval("let a;");
|
||||||
|
console.log();
|
||||||
|
}
|
||||||
|
expect_stdout: SyntaxError("Block-scoped declarations (let, const, function, class) not yet supported outside strict mode")
|
||||||
|
node_version: "4"
|
||||||
|
}
|
||||||
|
|
||||||
|
eval_let_0: {
|
||||||
|
input: {
|
||||||
|
eval("let a;");
|
||||||
|
console.log();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
eval("let a;");
|
||||||
|
console.log();
|
||||||
|
}
|
||||||
|
expect_stdout: SyntaxError("Unexpected identifier")
|
||||||
|
node_version: "<=0.12"
|
||||||
|
}
|
||||||
@@ -153,3 +153,52 @@ evaluate_4: {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_1710: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var x = {};
|
||||||
|
console.log((x += 1) + -x);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var x = {};
|
||||||
|
console.log((x += 1) + -x);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
unary_binary_parenthesis: {
|
||||||
|
input: {
|
||||||
|
var v = [ 0, 1, NaN, Infinity, null, undefined, true, false, "", "foo", /foo/ ];
|
||||||
|
v.forEach(function(x) {
|
||||||
|
v.forEach(function(y) {
|
||||||
|
console.log(
|
||||||
|
+(x*y),
|
||||||
|
+(x/y),
|
||||||
|
+(x%y),
|
||||||
|
-(x*y),
|
||||||
|
-(x/y),
|
||||||
|
-(x%y)
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var v = [ 0, 1, NaN, 1/0, null, void 0, true, false, "", "foo", /foo/ ];
|
||||||
|
v.forEach(function(x) {
|
||||||
|
v.forEach(function(y) {
|
||||||
|
console.log(
|
||||||
|
+x*y,
|
||||||
|
+x/y,
|
||||||
|
+x%y,
|
||||||
|
-x*y,
|
||||||
|
-x/y,
|
||||||
|
-x%y
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|||||||
@@ -105,7 +105,7 @@ getter_setter_mangler: {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect_exact: "function f(n,t){return{get:n,set:t,get g(){},set s(n){},c,a:1,m(){}}}"
|
expect_exact: "function f(t,e){return{get:t,set:e,get g(){},set s(t){},c,a:1,m(){}}}"
|
||||||
}
|
}
|
||||||
|
|
||||||
use_shorthand_opportunity: {
|
use_shorthand_opportunity: {
|
||||||
@@ -126,6 +126,67 @@ computed_property_names: {
|
|||||||
expect_exact: 'obj({["x"+"x"]:6});'
|
expect_exact: 'obj({["x"+"x"]:6});'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
convert_computed_props_to_regular_ones: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
computed_props: true,
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
["hi"]: 0,
|
||||||
|
["A" + 1]: 1,
|
||||||
|
[/B/]: 2,
|
||||||
|
[100 + 23]: 3,
|
||||||
|
[1 + .5]: 4,
|
||||||
|
[Math.PI]: 5,
|
||||||
|
[undefined]: 6,
|
||||||
|
[true]: 7,
|
||||||
|
[false]: 8,
|
||||||
|
[null]: 9,
|
||||||
|
[Infinity]: 10,
|
||||||
|
[NaN]: 11,
|
||||||
|
};
|
||||||
|
for (var k in o) {
|
||||||
|
console.log(k, o[k]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {
|
||||||
|
hi: 0,
|
||||||
|
A1: 1,
|
||||||
|
[/B/]: 2,
|
||||||
|
123: 3,
|
||||||
|
1.5: 4,
|
||||||
|
[Math.PI]: 5,
|
||||||
|
|
||||||
|
// leave these problematic cases as is
|
||||||
|
[void 0]: 6,
|
||||||
|
[!0]: 7,
|
||||||
|
[!1]: 8,
|
||||||
|
[null]: 9,
|
||||||
|
[1 / 0]: 10,
|
||||||
|
[NaN]: 11
|
||||||
|
};
|
||||||
|
for (var k in o) console.log(k, o[k]);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"123 3",
|
||||||
|
"hi 0",
|
||||||
|
"A1 1",
|
||||||
|
"/B/ 2",
|
||||||
|
"1.5 4",
|
||||||
|
"3.141592653589793 5",
|
||||||
|
"undefined 6",
|
||||||
|
"true 7",
|
||||||
|
"false 8",
|
||||||
|
"null 9",
|
||||||
|
"Infinity 10",
|
||||||
|
"NaN 11",
|
||||||
|
]
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
computed_property_names_evaluated_1: {
|
computed_property_names_evaluated_1: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true
|
evaluate: true
|
||||||
@@ -157,16 +218,20 @@ computed_property_names_evaluated_2: {
|
|||||||
|
|
||||||
shorthand_properties: {
|
shorthand_properties: {
|
||||||
mangle = true;
|
mangle = true;
|
||||||
input: (function() {
|
input: {
|
||||||
var prop = 1;
|
(function() {
|
||||||
const value = {prop};
|
var prop = 1;
|
||||||
return value;
|
const value = {prop};
|
||||||
})();
|
return value;
|
||||||
expect: (function() {
|
})();
|
||||||
var n = 1;
|
}
|
||||||
const r = {prop:n};
|
expect: {
|
||||||
return r;
|
(function() {
|
||||||
})();
|
var n = 1;
|
||||||
|
const r = {prop:n};
|
||||||
|
return r;
|
||||||
|
})();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
concise_methods: {
|
concise_methods: {
|
||||||
@@ -233,9 +298,7 @@ concise_methods_with_computed_property2: {
|
|||||||
};
|
};
|
||||||
doSomething(foo[[1]]());
|
doSomething(foo[[1]]());
|
||||||
}
|
}
|
||||||
expect_exact: {
|
expect_exact: 'var foo={[[1]](){return"success"}};doSomething(foo[[1]]());'
|
||||||
'var foo={[[1]](){return"success"}};doSomething(foo[[1]]());'
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
concise_methods_with_various_property_names: {
|
concise_methods_with_various_property_names: {
|
||||||
@@ -282,9 +345,11 @@ concise_methods_with_various_property_names: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
concise_methods_and_mangle_props: {
|
concise_methods_and_mangle_props: {
|
||||||
mangle_props = {
|
mangle = {
|
||||||
regex: /_/
|
properties: {
|
||||||
};
|
regex: /_/,
|
||||||
|
},
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
function x() {
|
function x() {
|
||||||
obj = {
|
obj = {
|
||||||
@@ -295,7 +360,7 @@ concise_methods_and_mangle_props: {
|
|||||||
expect: {
|
expect: {
|
||||||
function x() {
|
function x() {
|
||||||
obj = {
|
obj = {
|
||||||
a() { return 1; }
|
o() { return 1; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -507,4 +572,243 @@ variable_as_computed_property: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect_exact: "function getLine(header){return{[header]:{}}}"
|
expect_exact: "function getLine(header){return{[header]:{}}}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
prop_func_to_concise_method: {
|
||||||
|
options = {
|
||||||
|
ecma: 6,
|
||||||
|
unsafe_methods: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
({
|
||||||
|
emit: function NamedFunctionExpression() {
|
||||||
|
console.log("PASS");
|
||||||
|
},
|
||||||
|
run: function() {
|
||||||
|
this.emit();
|
||||||
|
}
|
||||||
|
}).run();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
({
|
||||||
|
emit: function NamedFunctionExpression() {
|
||||||
|
console.log("PASS");
|
||||||
|
},
|
||||||
|
run() {
|
||||||
|
this.emit();
|
||||||
|
}
|
||||||
|
}).run();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
prop_arrow_to_concise_method: {
|
||||||
|
options = {
|
||||||
|
ecma: 6,
|
||||||
|
unsafe_methods: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
({
|
||||||
|
run: () => {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}).run();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
({
|
||||||
|
run() {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}).run();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
concise_method_to_prop_arrow: {
|
||||||
|
options = {
|
||||||
|
arrows: true,
|
||||||
|
ecma: 6,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(({ a: () => 1 }).a());
|
||||||
|
console.log(({ a: () => { return 2; } }).a());
|
||||||
|
console.log(({ a() { return 3; } }).a());
|
||||||
|
console.log(({ a() { return this.b; }, b: 4 }).a());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log({ a: () => 1 }.a());
|
||||||
|
console.log({ a: () => 2 }.a());
|
||||||
|
console.log({ a: () => 3 }.a());
|
||||||
|
console.log({ a() { return this.b; }, b: 4 }.a());
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"1",
|
||||||
|
"2",
|
||||||
|
"3",
|
||||||
|
"4",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
prop_func_to_async_concise_method: {
|
||||||
|
options = {
|
||||||
|
ecma: 8,
|
||||||
|
unsafe_methods: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
({
|
||||||
|
run: async function() {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}).run();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
({
|
||||||
|
async run() {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}).run();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|
||||||
|
prop_func_to_concise_method_various: {
|
||||||
|
options = {
|
||||||
|
ecma: 6,
|
||||||
|
unsafe_methods: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
({
|
||||||
|
null: function(x, y){ x(y); },
|
||||||
|
123: function(x, y){ x(y); },
|
||||||
|
"A B": function(x, y){ x(y); },
|
||||||
|
p1: function(x, y){ x(y); },
|
||||||
|
p2: function*(x, y){ yield x(y); },
|
||||||
|
p3: async function(x, y){ await x(y); },
|
||||||
|
[c1]: function(x, y){ x(y); },
|
||||||
|
[c2]: function*(x, y){ yield x(y); },
|
||||||
|
[c3]: async function(x, y){ await x(y); },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
({
|
||||||
|
null(x, y) { x(y); },
|
||||||
|
123(x, y) { x(y); },
|
||||||
|
"A B"(x, y) { x(y); },
|
||||||
|
p1(x, y) { x(y); },
|
||||||
|
*p2(x, y) { yield x(y); },
|
||||||
|
async p3(x, y) { await x(y); },
|
||||||
|
[c1](x, y) { x(y); },
|
||||||
|
*[c2](x, y) { yield x(y); },
|
||||||
|
async [c3](x, y) { await x(y); },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
prop_arrows_to_concise_method_various: {
|
||||||
|
options = {
|
||||||
|
ecma: 6,
|
||||||
|
unsafe_methods: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
({
|
||||||
|
null: (x, y) => { x(y); },
|
||||||
|
123: (x, y) => { x(y); },
|
||||||
|
"A B": (x, y) => { x(y); },
|
||||||
|
p1: (x, y) => { x(y); },
|
||||||
|
p3: async (x, y) => { await x(y); },
|
||||||
|
[c1]: (x, y) => { x(y); },
|
||||||
|
[c3]: async (x, y) => { await x(y); },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
({
|
||||||
|
null(x, y) { x(y); },
|
||||||
|
123(x, y) { x(y); },
|
||||||
|
"A B"(x, y) { x(y); },
|
||||||
|
p1(x, y) { x(y); },
|
||||||
|
async p3(x, y) { await x(y); },
|
||||||
|
[c1](x, y) { x(y); },
|
||||||
|
async [c3](x, y) { await x(y); },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
prop_arrow_with_this: {
|
||||||
|
options = {
|
||||||
|
ecma: 6,
|
||||||
|
unsafe_methods: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function run(arg) {
|
||||||
|
console.log(arg === this ? "global" : arg === foo ? "foo" : arg);
|
||||||
|
}
|
||||||
|
var foo = {
|
||||||
|
func_no_this: function() { run(); },
|
||||||
|
func_with_this: function() { run(this); },
|
||||||
|
arrow_no_this: () => { run(); },
|
||||||
|
arrow_with_this: () => { run(this); },
|
||||||
|
};
|
||||||
|
for (var key in foo) foo[key]();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function run(arg) {
|
||||||
|
console.log(arg === this ? "global" : arg === foo ? "foo" : arg);
|
||||||
|
}
|
||||||
|
var foo = {
|
||||||
|
func_no_this() { run(); },
|
||||||
|
func_with_this() { run(this); },
|
||||||
|
arrow_no_this() { run(); },
|
||||||
|
arrow_with_this: () => { run(this); },
|
||||||
|
};
|
||||||
|
for (var key in foo) foo[key]();
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"undefined",
|
||||||
|
"foo",
|
||||||
|
"undefined",
|
||||||
|
"global",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
prop_arrow_with_nested_this: {
|
||||||
|
options = {
|
||||||
|
ecma: 6,
|
||||||
|
unsafe_methods: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function run(arg) {
|
||||||
|
console.log(arg === this ? "global" : arg === foo ? "foo" : arg);
|
||||||
|
}
|
||||||
|
var foo = {
|
||||||
|
func_func_this: function() { (function() { run(this); })(); },
|
||||||
|
func_arrow_this: function() { (() => { run(this); })(); },
|
||||||
|
arrow_func_this: () => { (function() { run(this); })(); },
|
||||||
|
arrow_arrow_this: () => { (() => { run(this); })(); },
|
||||||
|
};
|
||||||
|
for (var key in foo) foo[key]();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function run(arg) {
|
||||||
|
console.log(arg === this ? "global" : arg === foo ? "foo" : arg);
|
||||||
|
}
|
||||||
|
var foo = {
|
||||||
|
func_func_this() { (function() { run(this); })(); },
|
||||||
|
func_arrow_this() { (() => { run(this); })(); },
|
||||||
|
arrow_func_this() { (function() { run(this); })(); },
|
||||||
|
arrow_arrow_this: () => { (() => { run(this); })(); },
|
||||||
|
};
|
||||||
|
for (var key in foo) foo[key]();
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"global",
|
||||||
|
"foo",
|
||||||
|
"global",
|
||||||
|
"global",
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
arrow_functions: {
|
arrow_functions: {
|
||||||
|
options = {
|
||||||
|
arrows: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
(a) => b; // 1 args
|
(a) => b; // 1 args
|
||||||
(a, b) => c; // n args
|
(a, b) => c; // n args
|
||||||
@@ -9,7 +12,22 @@ arrow_functions: {
|
|||||||
a=>{return b;}
|
a=>{return b;}
|
||||||
a => 'lel'; // Dropping the parens
|
a => 'lel'; // Dropping the parens
|
||||||
}
|
}
|
||||||
expect_exact: "a=>b;(a,b)=>c;()=>b;a=>b=>c;a=>b=>c;()=>(b,c)=>d;a=>{return b};a=>\"lel\";"
|
expect_exact: "a=>b;(a,b)=>c;()=>b;a=>b=>c;a=>b=>c;()=>(b,c)=>d;a=>b;a=>\"lel\";"
|
||||||
|
}
|
||||||
|
|
||||||
|
arrow_return: {
|
||||||
|
options = {
|
||||||
|
arrows: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
() => {};
|
||||||
|
() => { return; };
|
||||||
|
a => { return 1; }
|
||||||
|
a => { return -b }
|
||||||
|
a => { return b; var b; }
|
||||||
|
(x, y) => { return x - y; }
|
||||||
|
}
|
||||||
|
expect_exact: "()=>{};()=>{};a=>1;a=>-b;a=>{return b;var b};(x,y)=>x-y;"
|
||||||
}
|
}
|
||||||
|
|
||||||
regression_arrow_functions_and_hoist: {
|
regression_arrow_functions_and_hoist: {
|
||||||
@@ -124,11 +142,11 @@ destructuring_arguments_3: {
|
|||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function fn3({x: {y: {z: {} = 42}}}) {}
|
function fn3({x: {y: {z: {} = 42}}}) {}
|
||||||
const { cover = (function () {}), xCover = (0, function() {}) } = {};
|
const { a = (function () {}), b = (0, function() {}) } = {};
|
||||||
let { cover = (function () {}), xCover = (0, function() {}) } = {};
|
let { c = (function () {}), d = (0, function() {}) } = {};
|
||||||
var { cover = (function () {}), xCover = (0, function() {}) } = {};
|
var { e = (function () {}), f = (0, function() {}) } = {};
|
||||||
}
|
}
|
||||||
expect_exact: "function fn3({x:{y:{z:{}=42}}}){}const{cover=function(){},xCover=(0,function(){})}={};let{cover=function(){},xCover=(0,function(){})}={};var{cover=function(){},xCover=(0,function(){})}={};"
|
expect_exact: "function fn3({x:{y:{z:{}=42}}}){}const{a=function(){},b=(0,function(){})}={};let{c=function(){},d=(0,function(){})}={};var{e=function(){},f=(0,function(){})}={};"
|
||||||
}
|
}
|
||||||
|
|
||||||
default_arguments: {
|
default_arguments: {
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
keep_properties: {
|
keep_properties: {
|
||||||
options = {
|
options = {
|
||||||
properties: false
|
evaluate: true,
|
||||||
};
|
properties: false,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
a["foo"] = "bar";
|
a["foo"] = "bar";
|
||||||
}
|
}
|
||||||
@@ -12,9 +13,12 @@ keep_properties: {
|
|||||||
|
|
||||||
dot_properties: {
|
dot_properties: {
|
||||||
options = {
|
options = {
|
||||||
|
evaluate: true,
|
||||||
properties: true,
|
properties: true,
|
||||||
screw_ie8: false
|
}
|
||||||
};
|
beautify = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
a["foo"] = "bar";
|
a["foo"] = "bar";
|
||||||
a["if"] = "if";
|
a["if"] = "if";
|
||||||
@@ -35,9 +39,12 @@ dot_properties: {
|
|||||||
|
|
||||||
dot_properties_es5: {
|
dot_properties_es5: {
|
||||||
options = {
|
options = {
|
||||||
|
evaluate: true,
|
||||||
properties: true,
|
properties: true,
|
||||||
screw_ie8: true
|
}
|
||||||
};
|
beautify = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
a["foo"] = "bar";
|
a["foo"] = "bar";
|
||||||
a["if"] = "if";
|
a["if"] = "if";
|
||||||
@@ -57,8 +64,8 @@ dot_properties_es5: {
|
|||||||
sub_properties: {
|
sub_properties: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
properties: true
|
properties: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
a[0] = 0;
|
a[0] = 0;
|
||||||
a["0"] = 1;
|
a["0"] = 1;
|
||||||
@@ -77,18 +84,18 @@ sub_properties: {
|
|||||||
a[3.14] = 3;
|
a[3.14] = 3;
|
||||||
a.if = 4;
|
a.if = 4;
|
||||||
a["foo bar"] = 5;
|
a["foo bar"] = 5;
|
||||||
a[NaN] = 6;
|
a.NaN = 6;
|
||||||
a[null] = 7;
|
a.null = 7;
|
||||||
a[void 0] = 8;
|
a[void 0] = 8;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
evaluate_array_length: {
|
evaluate_array_length: {
|
||||||
options = {
|
options = {
|
||||||
|
evaluate: true,
|
||||||
properties: true,
|
properties: true,
|
||||||
unsafe: true,
|
unsafe: true,
|
||||||
evaluate: true
|
}
|
||||||
};
|
|
||||||
input: {
|
input: {
|
||||||
a = [1, 2, 3].length;
|
a = [1, 2, 3].length;
|
||||||
a = [1, 2, 3].join()["len" + "gth"];
|
a = [1, 2, 3].join()["len" + "gth"];
|
||||||
@@ -105,10 +112,10 @@ evaluate_array_length: {
|
|||||||
|
|
||||||
evaluate_string_length: {
|
evaluate_string_length: {
|
||||||
options = {
|
options = {
|
||||||
|
evaluate: true,
|
||||||
properties: true,
|
properties: true,
|
||||||
unsafe: true,
|
unsafe: true,
|
||||||
evaluate: true
|
}
|
||||||
};
|
|
||||||
input: {
|
input: {
|
||||||
a = "foo".length;
|
a = "foo".length;
|
||||||
a = ("foo" + "bar")["len" + "gth"];
|
a = ("foo" + "bar")["len" + "gth"];
|
||||||
@@ -124,9 +131,11 @@ evaluate_string_length: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
mangle_properties: {
|
mangle_properties: {
|
||||||
mangle_props = {
|
mangle = {
|
||||||
ignore_quoted: false
|
properties: {
|
||||||
};
|
keep_quoted: false,
|
||||||
|
},
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
a["foo"] = "bar";
|
a["foo"] = "bar";
|
||||||
a.color = "red";
|
a.color = "red";
|
||||||
@@ -137,19 +146,22 @@ mangle_properties: {
|
|||||||
expect: {
|
expect: {
|
||||||
a["a"] = "bar";
|
a["a"] = "bar";
|
||||||
a.b = "red";
|
a.b = "red";
|
||||||
x = {c: 10};
|
x = {o: 10};
|
||||||
a.d(x.c, a.a);
|
a.r(x.o, a.a);
|
||||||
a['d']({b: "blue", a: "baz"});
|
a['r']({b: "blue", a: "baz"});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mangle_unquoted_properties: {
|
mangle_unquoted_properties: {
|
||||||
options = {
|
options = {
|
||||||
properties: false
|
evaluate: true,
|
||||||
|
properties: false,
|
||||||
}
|
}
|
||||||
mangle_props = {
|
mangle = {
|
||||||
ignore_quoted: true,
|
properties: {
|
||||||
reserved: []
|
builtins: true,
|
||||||
|
keep_quoted: true,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
beautify = {
|
beautify = {
|
||||||
beautify: false,
|
beautify: false,
|
||||||
@@ -178,24 +190,26 @@ mangle_unquoted_properties: {
|
|||||||
function f1() {
|
function f1() {
|
||||||
a["foo"] = "bar";
|
a["foo"] = "bar";
|
||||||
a.color = "red";
|
a.color = "red";
|
||||||
a.b = 2;
|
a.r = 2;
|
||||||
x = {"bar": 10, c: 7};
|
x = {"bar": 10, b: 7};
|
||||||
a.c = 9;
|
a.b = 9;
|
||||||
}
|
}
|
||||||
function f2() {
|
function f2() {
|
||||||
a.foo = "bar";
|
a.foo = "bar";
|
||||||
a['color'] = "red";
|
a['color'] = "red";
|
||||||
x = {bar: 10, c: 7};
|
x = {bar: 10, b: 7};
|
||||||
a.c = 9;
|
a.b = 9;
|
||||||
a.b = 3;
|
a.r = 3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mangle_debug: {
|
mangle_debug: {
|
||||||
mangle_props = {
|
mangle = {
|
||||||
debug: ""
|
properties: {
|
||||||
};
|
debug: "",
|
||||||
|
},
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
a.foo = "bar";
|
a.foo = "bar";
|
||||||
x = { baz: "ban" };
|
x = { baz: "ban" };
|
||||||
@@ -207,9 +221,11 @@ mangle_debug: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
mangle_debug_true: {
|
mangle_debug_true: {
|
||||||
mangle_props = {
|
mangle = {
|
||||||
debug: true
|
properties: {
|
||||||
};
|
debug: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
a.foo = "bar";
|
a.foo = "bar";
|
||||||
x = { baz: "ban" };
|
x = { baz: "ban" };
|
||||||
@@ -221,9 +237,11 @@ mangle_debug_true: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
mangle_debug_suffix: {
|
mangle_debug_suffix: {
|
||||||
mangle_props = {
|
mangle = {
|
||||||
debug: "XYZ"
|
properties: {
|
||||||
};
|
debug: "XYZ",
|
||||||
|
},
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
a.foo = "bar";
|
a.foo = "bar";
|
||||||
x = { baz: "ban" };
|
x = { baz: "ban" };
|
||||||
@@ -234,14 +252,18 @@ mangle_debug_suffix: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mangle_debug_suffix_ignore_quoted: {
|
mangle_debug_suffix_keep_quoted: {
|
||||||
options = {
|
options = {
|
||||||
properties: false
|
evaluate: true,
|
||||||
|
properties: false,
|
||||||
}
|
}
|
||||||
mangle_props = {
|
mangle = {
|
||||||
ignore_quoted: true,
|
properties: {
|
||||||
debug: "XYZ",
|
builtins: true,
|
||||||
reserved: []
|
debug: "XYZ",
|
||||||
|
keep_quoted: true,
|
||||||
|
reserved: [],
|
||||||
|
},
|
||||||
}
|
}
|
||||||
beautify = {
|
beautify = {
|
||||||
beautify: false,
|
beautify: false,
|
||||||
@@ -556,3 +578,726 @@ native_prototype: {
|
|||||||
"".indexOf.call(e, "bar");
|
"".indexOf.call(e, "bar");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
accessor_boolean: {
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
var b = {
|
||||||
|
get true() {
|
||||||
|
return a;
|
||||||
|
},
|
||||||
|
set false(c) {
|
||||||
|
a = c;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
console.log(b.true, b.false = 2, b.true);
|
||||||
|
}
|
||||||
|
expect_exact: 'var a=1;var b={get true(){return a},set false(c){a=c}};console.log(b.true,b.false=2,b.true);'
|
||||||
|
expect_stdout: "1 2 2"
|
||||||
|
}
|
||||||
|
|
||||||
|
accessor_get_set: {
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
var b = {
|
||||||
|
get set() {
|
||||||
|
return a;
|
||||||
|
},
|
||||||
|
set get(c) {
|
||||||
|
a = c;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
console.log(b.set, b.get = 2, b.set);
|
||||||
|
}
|
||||||
|
expect_exact: 'var a=1;var b={get set(){return a},set get(c){a=c}};console.log(b.set,b.get=2,b.set);'
|
||||||
|
expect_stdout: "1 2 2"
|
||||||
|
}
|
||||||
|
|
||||||
|
accessor_null_undefined: {
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
var b = {
|
||||||
|
get null() {
|
||||||
|
return a;
|
||||||
|
},
|
||||||
|
set undefined(c) {
|
||||||
|
a = c;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
console.log(b.null, b.undefined = 2, b.null);
|
||||||
|
}
|
||||||
|
expect_exact: 'var a=1;var b={get null(){return a},set undefined(c){a=c}};console.log(b.null,b.undefined=2,b.null);'
|
||||||
|
expect_stdout: "1 2 2"
|
||||||
|
}
|
||||||
|
|
||||||
|
accessor_number: {
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
var b = {
|
||||||
|
get 42() {
|
||||||
|
return a;
|
||||||
|
},
|
||||||
|
set 42(c) {
|
||||||
|
a = c;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
console.log(b[42], b[42] = 2, b[42]);
|
||||||
|
}
|
||||||
|
expect_exact: 'var a=1;var b={get 42(){return a},set 42(c){a=c}};console.log(b[42],b[42]=2,b[42]);'
|
||||||
|
expect_stdout: "1 2 2"
|
||||||
|
}
|
||||||
|
|
||||||
|
accessor_string: {
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
var b = {
|
||||||
|
get "a-b"() {
|
||||||
|
return a;
|
||||||
|
},
|
||||||
|
set "a-b"(c) {
|
||||||
|
a = c;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
console.log(b["a-b"], b["a-b"] = 2, b["a-b"]);
|
||||||
|
}
|
||||||
|
expect_exact: 'var a=1;var b={get"a-b"(){return a},set"a-b"(c){a=c}};console.log(b["a-b"],b["a-b"]=2,b["a-b"]);'
|
||||||
|
expect_stdout: "1 2 2"
|
||||||
|
}
|
||||||
|
|
||||||
|
accessor_this: {
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
var b = {
|
||||||
|
get this() {
|
||||||
|
return a;
|
||||||
|
},
|
||||||
|
set this(c) {
|
||||||
|
a = c;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
console.log(b.this, b.this = 2, b.this);
|
||||||
|
}
|
||||||
|
expect_exact: 'var a=1;var b={get this(){return a},set this(c){a=c}};console.log(b.this,b.this=2,b.this);'
|
||||||
|
expect_stdout: "1 2 2"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2208_1: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
properties: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log({
|
||||||
|
p: function() {
|
||||||
|
return 42;
|
||||||
|
}
|
||||||
|
}.p());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(42);
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2208_2: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
properties: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log({
|
||||||
|
a: 42,
|
||||||
|
p: function() {
|
||||||
|
return this.a;
|
||||||
|
}
|
||||||
|
}.p());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log({
|
||||||
|
a: 42,
|
||||||
|
p: function() {
|
||||||
|
return this.a;
|
||||||
|
}
|
||||||
|
}.p());
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2208_3: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
properties: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
a = 42;
|
||||||
|
console.log({
|
||||||
|
p: function() {
|
||||||
|
return function() {
|
||||||
|
return this.a;
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
}.p());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
a = 42;
|
||||||
|
console.log(function() {
|
||||||
|
return this.a;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2208_4: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
properties: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function foo() {}
|
||||||
|
console.log({
|
||||||
|
a: foo(),
|
||||||
|
p: function() {
|
||||||
|
return 42;
|
||||||
|
}
|
||||||
|
}.p());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function foo() {}
|
||||||
|
console.log((foo(), function() {
|
||||||
|
return 42;
|
||||||
|
})());
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2208_5: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
properties: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log({
|
||||||
|
p: "FAIL",
|
||||||
|
p: function() {
|
||||||
|
return 42;
|
||||||
|
}
|
||||||
|
}.p());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(42);
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2208_6: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
properties: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log({
|
||||||
|
p: () => 42
|
||||||
|
}.p());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(42);
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2208_7: {
|
||||||
|
options = {
|
||||||
|
ecma: 6,
|
||||||
|
inline: true,
|
||||||
|
properties: true,
|
||||||
|
side_effects: true,
|
||||||
|
unsafe_arrows: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log({
|
||||||
|
p() {
|
||||||
|
return 42;
|
||||||
|
}
|
||||||
|
}.p());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(42);
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2208_8: {
|
||||||
|
options = {
|
||||||
|
ecma: 6,
|
||||||
|
inline: true,
|
||||||
|
properties: true,
|
||||||
|
side_effects: true,
|
||||||
|
unsafe_arrows: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log({
|
||||||
|
*p() {
|
||||||
|
return x();
|
||||||
|
}
|
||||||
|
}.p());
|
||||||
|
console.log({
|
||||||
|
async p() {
|
||||||
|
return await x();
|
||||||
|
}
|
||||||
|
}.p());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log({
|
||||||
|
*p() {
|
||||||
|
return x();
|
||||||
|
}
|
||||||
|
}.p());
|
||||||
|
console.log((async () => {
|
||||||
|
return await x();
|
||||||
|
})());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2208_9: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
properties: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
a = 42;
|
||||||
|
console.log({
|
||||||
|
p: () => {
|
||||||
|
return function() {
|
||||||
|
return this.a;
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
}.p());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
a = 42;
|
||||||
|
console.log(function() {
|
||||||
|
return this.a;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
methods_keep_quoted_true: {
|
||||||
|
options = {
|
||||||
|
arrows: true,
|
||||||
|
ecma: 6,
|
||||||
|
unsafe_methods: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
properties: {
|
||||||
|
keep_quoted: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
class C { "Quoted"(){} Unquoted(){} }
|
||||||
|
f1({ "Quoted"(){}, Unquoted(){}, "Prop": 3 });
|
||||||
|
f2({ "Quoted": function(){} });
|
||||||
|
f3({ "Quoted": ()=>{} });
|
||||||
|
}
|
||||||
|
expect_exact: "class C{Quoted(){}o(){}}f1({Quoted(){},o(){},Prop:3});f2({Quoted(){}});f3({Quoted(){}});"
|
||||||
|
}
|
||||||
|
|
||||||
|
methods_keep_quoted_false: {
|
||||||
|
options = {
|
||||||
|
arrows: true,
|
||||||
|
ecma: 6,
|
||||||
|
unsafe_methods: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
properties: {
|
||||||
|
keep_quoted: false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
class C { "Quoted"(){} Unquoted(){} }
|
||||||
|
f1({ "Quoted"(){}, Unquoted(){}, "Prop": 3 });
|
||||||
|
f2({ "Quoted": function(){} });
|
||||||
|
f3({ "Quoted": ()=>{} });
|
||||||
|
}
|
||||||
|
expect_exact: "class C{o(){}d(){}}f1({o(){},d(){},e:3});f2({o(){}});f3({o(){}});"
|
||||||
|
}
|
||||||
|
|
||||||
|
methods_keep_quoted_from_dead_code: {
|
||||||
|
options = {
|
||||||
|
arrows: true,
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
ecma: 6,
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unsafe_methods: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
properties: {
|
||||||
|
keep_quoted: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
class C { Quoted(){} Unquoted(){} }
|
||||||
|
f1({ Quoted(){}, Unquoted(){}, "Prop": 3 });
|
||||||
|
f2({ Quoted: function(){} });
|
||||||
|
f3({ Quoted: ()=>{} });
|
||||||
|
0 && obj["Quoted"];
|
||||||
|
}
|
||||||
|
expect_exact: "class C{Quoted(){}o(){}}f1({Quoted(){},o(){},Prop:3});f2({Quoted(){}});f3({Quoted(){}});"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2256: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
properties: {
|
||||||
|
keep_quoted: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
({ "keep": 1 });
|
||||||
|
g.keep = g.change;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
g.keep = g.g;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2321: {
|
||||||
|
options = {
|
||||||
|
ecma: 6,
|
||||||
|
unsafe_methods: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var f = {
|
||||||
|
foo: function(){ console.log("foo") },
|
||||||
|
bar() { console.log("bar") }
|
||||||
|
};
|
||||||
|
var foo = new f.foo();
|
||||||
|
var bar = f.bar();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var f = {
|
||||||
|
foo: function() {
|
||||||
|
console.log("foo");
|
||||||
|
},
|
||||||
|
bar() {
|
||||||
|
console.log("bar");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var foo = new f.foo();
|
||||||
|
var bar = f.bar();
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
]
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe_methods_regex: {
|
||||||
|
options = {
|
||||||
|
ecma: 6,
|
||||||
|
unsafe_methods: /^[A-Z1]/,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var f = {
|
||||||
|
123: function(){ console.log("123") },
|
||||||
|
foo: function(){ console.log("foo") },
|
||||||
|
bar() { console.log("bar") },
|
||||||
|
Baz: function(){ console.log("baz") },
|
||||||
|
BOO: function(){ console.log("boo") },
|
||||||
|
null: function(){ console.log("null") },
|
||||||
|
undefined: function(){ console.log("undefined") },
|
||||||
|
};
|
||||||
|
f[123]();
|
||||||
|
new f.foo();
|
||||||
|
f.bar();
|
||||||
|
f.Baz();
|
||||||
|
f.BOO();
|
||||||
|
new f.null();
|
||||||
|
new f.undefined();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var f = {
|
||||||
|
123() { console.log("123") },
|
||||||
|
foo: function(){ console.log("foo") },
|
||||||
|
bar() { console.log("bar"); },
|
||||||
|
Baz() { console.log("baz") },
|
||||||
|
BOO() { console.log("boo") },
|
||||||
|
null: function(){ console.log("null") },
|
||||||
|
undefined: function(){ console.log("undefined") },
|
||||||
|
};
|
||||||
|
f[123]();
|
||||||
|
new f.foo();
|
||||||
|
f.bar();
|
||||||
|
f.Baz();
|
||||||
|
f.BOO();
|
||||||
|
new f.null();
|
||||||
|
new f.undefined();
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"123",
|
||||||
|
"foo",
|
||||||
|
"bar",
|
||||||
|
"baz",
|
||||||
|
"boo",
|
||||||
|
"null",
|
||||||
|
"undefined",
|
||||||
|
]
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
lhs_prop_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
properties: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(++{
|
||||||
|
a: 1
|
||||||
|
}.a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(++{
|
||||||
|
a: 1
|
||||||
|
}.a);
|
||||||
|
}
|
||||||
|
expect_stdout: "2"
|
||||||
|
}
|
||||||
|
|
||||||
|
lhs_prop_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
properties: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
[1][0] = 42;
|
||||||
|
(function(a) {
|
||||||
|
a.b = "g";
|
||||||
|
})("abc");
|
||||||
|
(function(a) {
|
||||||
|
a[2] = "g";
|
||||||
|
})("def");
|
||||||
|
(function(a) {
|
||||||
|
a[""] = "g";
|
||||||
|
})("ghi");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
[1][0] = 42;
|
||||||
|
"abc".b = "g";
|
||||||
|
"def"[2] = "g";
|
||||||
|
"ghi"[""] = "g";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
literal_duplicate_key_side_effects: {
|
||||||
|
options = {
|
||||||
|
properties: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log({
|
||||||
|
a: "FAIL",
|
||||||
|
a: console.log ? "PASS" : "FAIL"
|
||||||
|
}.a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(console.log ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
prop_side_effects_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
properties: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var C = 1;
|
||||||
|
console.log(C);
|
||||||
|
var obj = {
|
||||||
|
bar: function() {
|
||||||
|
return C + C;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
console.log(obj.bar());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(1);
|
||||||
|
var obj = {
|
||||||
|
bar: function() {
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
console.log(obj.bar());
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"1",
|
||||||
|
"2",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
prop_side_effects_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
properties: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var C = 1;
|
||||||
|
console.log(C);
|
||||||
|
var obj = {
|
||||||
|
"": function() {
|
||||||
|
return C + C;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
console.log(obj[""]());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(1);
|
||||||
|
console.log(2);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"1",
|
||||||
|
"2",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
accessor_1: {
|
||||||
|
options = {
|
||||||
|
properties: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log({
|
||||||
|
a: "FAIL",
|
||||||
|
get a() {
|
||||||
|
return "PASS";
|
||||||
|
}
|
||||||
|
}.a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log({
|
||||||
|
a: "FAIL",
|
||||||
|
get a() {
|
||||||
|
return "PASS";
|
||||||
|
}
|
||||||
|
}.a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
accessor_2: {
|
||||||
|
options = {
|
||||||
|
properties: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log({
|
||||||
|
get a() {
|
||||||
|
return "PASS";
|
||||||
|
},
|
||||||
|
set a(v) {},
|
||||||
|
a: "FAIL"
|
||||||
|
}.a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log({
|
||||||
|
get a() {
|
||||||
|
return "PASS";
|
||||||
|
},
|
||||||
|
set a(v) {},
|
||||||
|
a: "FAIL"
|
||||||
|
}.a);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
array_hole: {
|
||||||
|
options = {
|
||||||
|
properties: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(
|
||||||
|
[ 1, 2, , 3][1],
|
||||||
|
[ 1, 2, , 3][2],
|
||||||
|
[ 1, 2, , 3][3]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(2, void 0, 3);
|
||||||
|
}
|
||||||
|
expect_stdout: "2 undefined 3"
|
||||||
|
}
|
||||||
|
|
||||||
|
computed_property: {
|
||||||
|
options = {
|
||||||
|
properties: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log({
|
||||||
|
a: "bar",
|
||||||
|
[console.log("foo")]: 42,
|
||||||
|
}.a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log([
|
||||||
|
"bar",
|
||||||
|
console.log("foo")
|
||||||
|
][0]);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar"
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
new_this: {
|
||||||
|
options = {
|
||||||
|
properties: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
new {
|
||||||
|
f: function(a) {
|
||||||
|
this.a = a;
|
||||||
|
}
|
||||||
|
}.f(42);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
new function(a) {
|
||||||
|
this.a = a;
|
||||||
|
}(42);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
722
test/compress/pure_getters.js
Normal file
722
test/compress/pure_getters.js
Normal file
@@ -0,0 +1,722 @@
|
|||||||
|
strict: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: false,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a, b = null, c = {};
|
||||||
|
a.prop;
|
||||||
|
b.prop;
|
||||||
|
c.prop;
|
||||||
|
d.prop;
|
||||||
|
null.prop;
|
||||||
|
(void 0).prop;
|
||||||
|
undefined.prop;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a, b = null, c = {};
|
||||||
|
a.prop;
|
||||||
|
b.prop;
|
||||||
|
c.prop;
|
||||||
|
d.prop;
|
||||||
|
null.prop;
|
||||||
|
(void 0).prop;
|
||||||
|
(void 0).prop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
strict_reduce_vars: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a, b = null, c = {};
|
||||||
|
a.prop;
|
||||||
|
b.prop;
|
||||||
|
c.prop;
|
||||||
|
d.prop;
|
||||||
|
null.prop;
|
||||||
|
(void 0).prop;
|
||||||
|
undefined.prop;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a, b = null, c = {};
|
||||||
|
a.prop;
|
||||||
|
b.prop;
|
||||||
|
d.prop;
|
||||||
|
null.prop;
|
||||||
|
(void 0).prop;
|
||||||
|
(void 0).prop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe: {
|
||||||
|
options = {
|
||||||
|
pure_getters: true,
|
||||||
|
reduce_vars: false,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a, b = null, c = {};
|
||||||
|
a.prop;
|
||||||
|
b.prop;
|
||||||
|
c.prop;
|
||||||
|
d.prop;
|
||||||
|
null.prop;
|
||||||
|
(void 0).prop;
|
||||||
|
undefined.prop;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a, b = null, c = {};
|
||||||
|
d;
|
||||||
|
null.prop;
|
||||||
|
(void 0).prop;
|
||||||
|
(void 0).prop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe_reduce_vars: {
|
||||||
|
options = {
|
||||||
|
pure_getters: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a, b = null, c = {};
|
||||||
|
a.prop;
|
||||||
|
b.prop;
|
||||||
|
c.prop;
|
||||||
|
d.prop;
|
||||||
|
null.prop;
|
||||||
|
(void 0).prop;
|
||||||
|
undefined.prop;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a, b = null, c = {};
|
||||||
|
d;
|
||||||
|
null.prop;
|
||||||
|
(void 0).prop;
|
||||||
|
(void 0).prop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
chained: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
a.b.c;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
a.b.c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impure_getter_1: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
({
|
||||||
|
get a() {
|
||||||
|
console.log(1);
|
||||||
|
},
|
||||||
|
b: 1
|
||||||
|
}).a;
|
||||||
|
({
|
||||||
|
get a() {
|
||||||
|
console.log(1);
|
||||||
|
},
|
||||||
|
b: 1
|
||||||
|
}).b;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
({
|
||||||
|
get a() {
|
||||||
|
console.log(1);
|
||||||
|
},
|
||||||
|
b: 1
|
||||||
|
}).a;
|
||||||
|
({
|
||||||
|
get a() {
|
||||||
|
console.log(1);
|
||||||
|
},
|
||||||
|
b: 1
|
||||||
|
}).b;
|
||||||
|
}
|
||||||
|
expect_stdout: "1"
|
||||||
|
}
|
||||||
|
|
||||||
|
impure_getter_2: {
|
||||||
|
options = {
|
||||||
|
pure_getters: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
// will produce incorrect output because getter is not pure
|
||||||
|
({
|
||||||
|
get a() {
|
||||||
|
console.log(1);
|
||||||
|
},
|
||||||
|
b: 1
|
||||||
|
}).a;
|
||||||
|
({
|
||||||
|
get a() {
|
||||||
|
console.log(1);
|
||||||
|
},
|
||||||
|
b: 1
|
||||||
|
}).b;
|
||||||
|
}
|
||||||
|
expect: {}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2110_1: {
|
||||||
|
options = {
|
||||||
|
cascade: true,
|
||||||
|
pure_getters: "strict",
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
function f() {}
|
||||||
|
function g() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
f.g = g;
|
||||||
|
return f.g();
|
||||||
|
}
|
||||||
|
console.log(typeof f());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
function f() {}
|
||||||
|
return f.g = function() {
|
||||||
|
return this;
|
||||||
|
}, f.g();
|
||||||
|
}
|
||||||
|
console.log(typeof f());
|
||||||
|
}
|
||||||
|
expect_stdout: "function"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2110_2: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
function f() {}
|
||||||
|
function g() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
f.g = g;
|
||||||
|
return f.g();
|
||||||
|
}
|
||||||
|
console.log(typeof f());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
function f() {}
|
||||||
|
f.g = function() {
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
return f.g();
|
||||||
|
}
|
||||||
|
console.log(typeof f());
|
||||||
|
}
|
||||||
|
expect_stdout: "function"
|
||||||
|
}
|
||||||
|
|
||||||
|
set_immutable_1: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
a.foo += "";
|
||||||
|
if (a.foo) console.log("FAIL");
|
||||||
|
else console.log("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
1..foo += "";
|
||||||
|
if (1..foo) console.log("FAIL");
|
||||||
|
else console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
set_immutable_2: {
|
||||||
|
options = {
|
||||||
|
cascade: true,
|
||||||
|
conditionals: true,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
a.foo += "";
|
||||||
|
if (a.foo) console.log("FAIL");
|
||||||
|
else console.log("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 1;
|
||||||
|
a.foo += "", a.foo ? console.log("FAIL") : console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
set_immutable_3: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
var a = 1;
|
||||||
|
a.foo += "";
|
||||||
|
if (a.foo) console.log("FAIL");
|
||||||
|
else console.log("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
1..foo += "";
|
||||||
|
if (1..foo) console.log("FAIL");
|
||||||
|
else console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
set_immutable_4: {
|
||||||
|
options = {
|
||||||
|
cascade: true,
|
||||||
|
conditionals: true,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
var a = 1;
|
||||||
|
a.foo += "";
|
||||||
|
if (a.foo) console.log("FAIL");
|
||||||
|
else console.log("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
var a = 1;
|
||||||
|
a.foo += "", a.foo ? console.log("FAIL") : console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
set_mutable_1: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
!function a() {
|
||||||
|
a.foo += "";
|
||||||
|
if (a.foo) console.log("PASS");
|
||||||
|
else console.log("FAIL");
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
!function a() {
|
||||||
|
if (a.foo += "") console.log("PASS");
|
||||||
|
else console.log("FAIL");
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
set_mutable_2: {
|
||||||
|
options = {
|
||||||
|
cascade: true,
|
||||||
|
conditionals: true,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
!function a() {
|
||||||
|
a.foo += "";
|
||||||
|
if (a.foo) console.log("PASS");
|
||||||
|
else console.log("FAIL");
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
!function a() {
|
||||||
|
(a.foo += "") ? console.log("PASS") : console.log("FAIL");
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2265_1: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
({ ...{} }).p;
|
||||||
|
({ ...g }).p;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
({ ...g }).p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2265_2: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = {
|
||||||
|
get b() {
|
||||||
|
throw 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
({...a}).b;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = {
|
||||||
|
get b() {
|
||||||
|
throw 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
({...a}).b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2265_3: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = {
|
||||||
|
set b() {
|
||||||
|
throw 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
({...a}).b;
|
||||||
|
}
|
||||||
|
expect: {}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2265_4: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = { b: 1 };
|
||||||
|
({...a}).b;
|
||||||
|
}
|
||||||
|
expect: {}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2313_1: {
|
||||||
|
options = {
|
||||||
|
cascade: true,
|
||||||
|
conditionals: true,
|
||||||
|
pure_getters: "strict",
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function x() {
|
||||||
|
console.log(1);
|
||||||
|
return {
|
||||||
|
y: function() {
|
||||||
|
console.log(2);
|
||||||
|
return {
|
||||||
|
z: 0
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
x().y().z++;
|
||||||
|
if (x().y().z) {
|
||||||
|
console.log(3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function x() {
|
||||||
|
return console.log(1), {
|
||||||
|
y: function() {
|
||||||
|
return console.log(2), {
|
||||||
|
z: 0
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
x().y().z++,
|
||||||
|
x().y().z && console.log(3);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"1",
|
||||||
|
"2",
|
||||||
|
"1",
|
||||||
|
"2",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2313_2: {
|
||||||
|
options = {
|
||||||
|
cascade: true,
|
||||||
|
conditionals: true,
|
||||||
|
pure_getters: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function x() {
|
||||||
|
console.log(1);
|
||||||
|
return {
|
||||||
|
y: function() {
|
||||||
|
console.log(2);
|
||||||
|
return {
|
||||||
|
z: 0
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
x().y().z++;
|
||||||
|
if (x().y().z) {
|
||||||
|
console.log(3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function x() {
|
||||||
|
return console.log(1), {
|
||||||
|
y: function() {
|
||||||
|
return console.log(2), {
|
||||||
|
z: 0
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
x().y().z++,
|
||||||
|
x().y().z && console.log(3);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"1",
|
||||||
|
"2",
|
||||||
|
"1",
|
||||||
|
"2",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2313_3: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
conditionals: true,
|
||||||
|
pure_getters: "strict",
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function x() {
|
||||||
|
console.log(1);
|
||||||
|
return {
|
||||||
|
y: function() {
|
||||||
|
console.log(2);
|
||||||
|
return {
|
||||||
|
z: 0
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
x().y().z++;
|
||||||
|
if (x().y().z) {
|
||||||
|
console.log(3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function x() {
|
||||||
|
console.log(1);
|
||||||
|
return {
|
||||||
|
y: function() {
|
||||||
|
console.log(2);
|
||||||
|
return {
|
||||||
|
z: 0
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
x().y().z++;
|
||||||
|
x().y().z && console.log(3);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"1",
|
||||||
|
"2",
|
||||||
|
"1",
|
||||||
|
"2",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2313_4: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
conditionals: true,
|
||||||
|
pure_getters: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function x() {
|
||||||
|
console.log(1);
|
||||||
|
return {
|
||||||
|
y: function() {
|
||||||
|
console.log(2);
|
||||||
|
return {
|
||||||
|
z: 0
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
x().y().z++;
|
||||||
|
if (x().y().z) {
|
||||||
|
console.log(3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function x() {
|
||||||
|
console.log(1);
|
||||||
|
return {
|
||||||
|
y: function() {
|
||||||
|
console.log(2);
|
||||||
|
return {
|
||||||
|
z: 0
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
x().y().z++;
|
||||||
|
x().y().z && console.log(3);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"1",
|
||||||
|
"2",
|
||||||
|
"1",
|
||||||
|
"2",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2313_5: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
x().y++;
|
||||||
|
x().y;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
x().y++;
|
||||||
|
x().y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2313_6: {
|
||||||
|
options = {
|
||||||
|
pure_getters: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
x().y++;
|
||||||
|
x().y;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
x().y++;
|
||||||
|
x();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2313_7: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
conditionals: true,
|
||||||
|
pure_getters: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 0, b = 0;
|
||||||
|
class foo {
|
||||||
|
get c() {
|
||||||
|
a++;
|
||||||
|
return 42;
|
||||||
|
}
|
||||||
|
set c(c) {
|
||||||
|
b++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class bar extends foo {
|
||||||
|
d() {
|
||||||
|
super.c++;
|
||||||
|
if (super.c) console.log(a, b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
new bar().d();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 0, b = 0;
|
||||||
|
class foo {
|
||||||
|
get c() {
|
||||||
|
a++;
|
||||||
|
return 42;
|
||||||
|
}
|
||||||
|
set c(c) {
|
||||||
|
b++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class bar extends foo {
|
||||||
|
d() {
|
||||||
|
super.c++;
|
||||||
|
super.c && console.log(a, b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
new bar().d();
|
||||||
|
}
|
||||||
|
expect_stdout: "2 1"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
14
test/compress/sandbox.js
Normal file
14
test/compress/sandbox.js
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
console_log: {
|
||||||
|
input: {
|
||||||
|
console.log("%% %s");
|
||||||
|
console.log("%% %s", "%s");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("%% %s");
|
||||||
|
console.log("%% %s", "%s");
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"%% %s",
|
||||||
|
"% %s",
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -1,25 +1,34 @@
|
|||||||
do_screw: {
|
do_screw: {
|
||||||
options = { screw_ie8: true };
|
options = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
beautify = {
|
beautify = {
|
||||||
screw_ie8: true,
|
ie8: false,
|
||||||
ascii_only: true
|
ascii_only: true,
|
||||||
};
|
}
|
||||||
|
input: {
|
||||||
input: f("\v");
|
f("\v");
|
||||||
expect_exact: 'f("\\v");';
|
}
|
||||||
|
expect_exact: 'f("\\v");'
|
||||||
}
|
}
|
||||||
|
|
||||||
dont_screw: {
|
dont_screw: {
|
||||||
options = { screw_ie8: false };
|
options = {
|
||||||
beautify = { screw_ie8: false, ascii_only: true };
|
ie8: true,
|
||||||
|
}
|
||||||
input: f("\v");
|
beautify = {
|
||||||
expect_exact: 'f("\\x0B");';
|
ie8: true,
|
||||||
|
ascii_only: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
f("\v");
|
||||||
|
}
|
||||||
|
expect_exact: 'f("\\x0B");'
|
||||||
}
|
}
|
||||||
|
|
||||||
do_screw_constants: {
|
do_screw_constants: {
|
||||||
options = {
|
options = {
|
||||||
screw_ie8: true,
|
ie8: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
f(undefined, Infinity);
|
f(undefined, Infinity);
|
||||||
@@ -29,7 +38,7 @@ do_screw_constants: {
|
|||||||
|
|
||||||
dont_screw_constants: {
|
dont_screw_constants: {
|
||||||
options = {
|
options = {
|
||||||
screw_ie8: false,
|
ie8: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
f(undefined, Infinity);
|
f(undefined, Infinity);
|
||||||
@@ -38,9 +47,15 @@ dont_screw_constants: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
do_screw_try_catch: {
|
do_screw_try_catch: {
|
||||||
options = { screw_ie8: true };
|
options = {
|
||||||
mangle = { screw_ie8: true };
|
ie8: false,
|
||||||
beautify = { screw_ie8: true };
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
good = function(e){
|
good = function(e){
|
||||||
return function(error){
|
return function(error){
|
||||||
@@ -66,9 +81,15 @@ do_screw_try_catch: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dont_screw_try_catch: {
|
dont_screw_try_catch: {
|
||||||
options = { screw_ie8: false };
|
options = {
|
||||||
mangle = { screw_ie8: false };
|
ie8: true,
|
||||||
beautify = { screw_ie8: false };
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
bad = function(e){
|
bad = function(e){
|
||||||
return function(error){
|
return function(error){
|
||||||
@@ -94,9 +115,15 @@ dont_screw_try_catch: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
do_screw_try_catch_undefined: {
|
do_screw_try_catch_undefined: {
|
||||||
options = { screw_ie8: true };
|
options = {
|
||||||
mangle = { screw_ie8: true };
|
ie8: false,
|
||||||
beautify = { screw_ie8: true };
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
function a(b){
|
function a(b){
|
||||||
try {
|
try {
|
||||||
@@ -119,12 +146,19 @@ do_screw_try_catch_undefined: {
|
|||||||
return void 0===o
|
return void 0===o
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
dont_screw_try_catch_undefined: {
|
dont_screw_try_catch_undefined: {
|
||||||
options = { screw_ie8: false };
|
options = {
|
||||||
mangle = { screw_ie8: false };
|
ie8: true,
|
||||||
beautify = { screw_ie8: false };
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
function a(b){
|
function a(b){
|
||||||
try {
|
try {
|
||||||
@@ -147,17 +181,18 @@ dont_screw_try_catch_undefined: {
|
|||||||
return n === undefined
|
return n === undefined
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
reduce_vars: {
|
reduce_vars: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
screw_ie8: false,
|
ie8: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
screw_ie8: false,
|
ie8: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f() {
|
function f() {
|
||||||
@@ -185,36 +220,174 @@ reduce_vars: {
|
|||||||
|
|
||||||
issue_1586_1: {
|
issue_1586_1: {
|
||||||
options = {
|
options = {
|
||||||
screw_ie8: false,
|
ie8: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
screw_ie8: false,
|
ie8: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f() {
|
function f() {
|
||||||
try {
|
try {
|
||||||
|
x();
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.log(err.message);
|
console.log(err.message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect_exact: "function f(){try{}catch(c){console.log(c.message)}}"
|
expect_exact: "function f(){try{x()}catch(c){console.log(c.message)}}"
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_1586_2: {
|
issue_1586_2: {
|
||||||
options = {
|
options = {
|
||||||
screw_ie8: true,
|
ie8: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
screw_ie8: true,
|
ie8: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f() {
|
function f() {
|
||||||
try {
|
try {
|
||||||
|
x();
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.log(err.message);
|
console.log(err.message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect_exact: "function f(){try{}catch(c){console.log(c.message)}}"
|
expect_exact: "function f(){try{x()}catch(c){console.log(c.message)}}"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2120_1: {
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"aaaaaaaa";
|
||||||
|
var a = 1, b = "FAIL";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (c) {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (a) {
|
||||||
|
if (c) b = "PASS";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"aaaaaaaa";
|
||||||
|
var a = 1, b = "FAIL";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (t) {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (a) {
|
||||||
|
if (t) b = "PASS";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2120_2: {
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"aaaaaaaa";
|
||||||
|
var a = 1, b = "FAIL";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (c) {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (a) {
|
||||||
|
if (c) b = "PASS";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"aaaaaaaa";
|
||||||
|
var a = 1, b = "FAIL";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (c) {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (a) {
|
||||||
|
if (c) b = "PASS";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2254_1: {
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"eeeeee";
|
||||||
|
try {
|
||||||
|
console.log(f("PASS"));
|
||||||
|
} catch (e) {}
|
||||||
|
function f(s) {
|
||||||
|
try {
|
||||||
|
throw "FAIL";
|
||||||
|
} catch (e) {
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"eeeeee";
|
||||||
|
try {
|
||||||
|
console.log(f("PASS"));
|
||||||
|
} catch (e) {}
|
||||||
|
function f(e) {
|
||||||
|
try {
|
||||||
|
throw "FAIL";
|
||||||
|
} catch (t) {
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2254_2: {
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"eeeeee";
|
||||||
|
try {
|
||||||
|
console.log(f("PASS"));
|
||||||
|
} catch (e) {}
|
||||||
|
function f(s) {
|
||||||
|
try {
|
||||||
|
throw "FAIL";
|
||||||
|
} catch (e) {
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"eeeeee";
|
||||||
|
try {
|
||||||
|
console.log(f("PASS"));
|
||||||
|
} catch (e) {}
|
||||||
|
function f(t) {
|
||||||
|
try {
|
||||||
|
throw "FAIL";
|
||||||
|
} catch (e) {
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -86,6 +86,7 @@ make_sequences_4: {
|
|||||||
switch (x = 5, y) {}
|
switch (x = 5, y) {}
|
||||||
with (x = 5, obj);
|
with (x = 5, obj);
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
lift_sequences_1: {
|
lift_sequences_1: {
|
||||||
@@ -103,15 +104,18 @@ lift_sequences_1: {
|
|||||||
lift_sequences_2: {
|
lift_sequences_2: {
|
||||||
options = { sequences: true, evaluate: true };
|
options = { sequences: true, evaluate: true };
|
||||||
input: {
|
input: {
|
||||||
var foo, bar;
|
var foo = 1, bar;
|
||||||
foo.x = (foo = {}, 10);
|
foo.x = (foo = {}, 10);
|
||||||
bar = (bar = {}, 10);
|
bar = (bar = {}, 10);
|
||||||
|
console.log(foo, bar);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var foo, bar;
|
var foo = 1, bar;
|
||||||
foo.x = (foo = {}, 10),
|
foo.x = (foo = {}, 10),
|
||||||
bar = {}, bar = 10;
|
bar = {}, bar = 10,
|
||||||
|
console.log(foo, bar);
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
lift_sequences_3: {
|
lift_sequences_3: {
|
||||||
@@ -138,6 +142,23 @@ lift_sequences_4: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lift_sequences_5: {
|
||||||
|
options = {
|
||||||
|
sequences: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 2, b;
|
||||||
|
a *= (b, a = 4, 3);
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 2, b;
|
||||||
|
b, a *= (a = 4, 3),
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "6"
|
||||||
|
}
|
||||||
|
|
||||||
for_sequences: {
|
for_sequences: {
|
||||||
options = { sequences: true };
|
options = { sequences: true };
|
||||||
input: {
|
input: {
|
||||||
@@ -155,6 +176,11 @@ for_sequences: {
|
|||||||
// 4
|
// 4
|
||||||
x = (foo in bar);
|
x = (foo in bar);
|
||||||
for (y = 5; false;);
|
for (y = 5; false;);
|
||||||
|
// 5
|
||||||
|
x = function() {
|
||||||
|
foo in bar;
|
||||||
|
};
|
||||||
|
for (y = 5; false;);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
// 1
|
// 1
|
||||||
@@ -167,6 +193,10 @@ for_sequences: {
|
|||||||
// 4
|
// 4
|
||||||
x = (foo in bar);
|
x = (foo in bar);
|
||||||
for (y = 5; false;);
|
for (y = 5; false;);
|
||||||
|
// 5
|
||||||
|
for (x = function() {
|
||||||
|
foo in bar;
|
||||||
|
}, y = 5; false;);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -230,6 +260,7 @@ negate_iife_for: {
|
|||||||
for (!function() {}(), i = 0; i < 5; i++) console.log(i);
|
for (!function() {}(), i = 0; i < 5; i++) console.log(i);
|
||||||
for (function() {}(); i < 5; i++) console.log(i);
|
for (function() {}(); i < 5; i++) console.log(i);
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
iife: {
|
iife: {
|
||||||
@@ -284,3 +315,492 @@ unsafe_undefined: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_1685: {
|
||||||
|
options = {
|
||||||
|
cascade: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 100, b = 10;
|
||||||
|
function f() {
|
||||||
|
var a = (a--, delete a && --b);
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 100, b = 10;
|
||||||
|
function f() {
|
||||||
|
var a = (a--, delete a && --b);
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
func_def_1: {
|
||||||
|
options = {
|
||||||
|
cascade: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
return f = 0, !!f;
|
||||||
|
}
|
||||||
|
console.log(f());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
return !!(f = 0);
|
||||||
|
}
|
||||||
|
console.log(f());
|
||||||
|
}
|
||||||
|
expect_stdout: "false"
|
||||||
|
}
|
||||||
|
|
||||||
|
func_def_2: {
|
||||||
|
options = {
|
||||||
|
cascade: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function f() {
|
||||||
|
return f = 0, !!f;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function f() {
|
||||||
|
return f = 0, !!f;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "true"
|
||||||
|
}
|
||||||
|
|
||||||
|
func_def_3: {
|
||||||
|
options = {
|
||||||
|
cascade: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
function g() {}
|
||||||
|
return g = 0, !!g;
|
||||||
|
}
|
||||||
|
console.log(f());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
function g() {}
|
||||||
|
return !!(g = 0);
|
||||||
|
}
|
||||||
|
console.log(f());
|
||||||
|
}
|
||||||
|
expect_stdout: "false"
|
||||||
|
}
|
||||||
|
|
||||||
|
func_def_4: {
|
||||||
|
options = {
|
||||||
|
cascade: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
function g() {
|
||||||
|
return g = 0, !!g;
|
||||||
|
}
|
||||||
|
return g();
|
||||||
|
}
|
||||||
|
console.log(f());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
function g() {
|
||||||
|
return !!(g = 0);
|
||||||
|
}
|
||||||
|
return g();
|
||||||
|
}
|
||||||
|
console.log(f());
|
||||||
|
}
|
||||||
|
expect_stdout: "false"
|
||||||
|
}
|
||||||
|
|
||||||
|
func_def_5: {
|
||||||
|
options = {
|
||||||
|
cascade: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
return function g(){
|
||||||
|
return g = 0, !!g;
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
console.log(f());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
return function g(){
|
||||||
|
return g = 0, !!g;
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
console.log(f());
|
||||||
|
}
|
||||||
|
expect_stdout: "true"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1758: {
|
||||||
|
options = {
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(c) {
|
||||||
|
var undefined = 42;
|
||||||
|
return function() {
|
||||||
|
c--;
|
||||||
|
c--, c.toString();
|
||||||
|
return;
|
||||||
|
}();
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(c) {
|
||||||
|
var undefined = 42;
|
||||||
|
return function() {
|
||||||
|
return c--, c--, void c.toString();
|
||||||
|
}();
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
delete_seq_1: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(delete (1, undefined));
|
||||||
|
console.log(delete (1, void 0));
|
||||||
|
console.log(delete (1, Infinity));
|
||||||
|
console.log(delete (1, 1 / 0));
|
||||||
|
console.log(delete (1, NaN));
|
||||||
|
console.log(delete (1, 0 / 0));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(!0);
|
||||||
|
console.log(!0);
|
||||||
|
console.log(!0);
|
||||||
|
console.log(!0);
|
||||||
|
console.log(!0);
|
||||||
|
console.log(!0);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
delete_seq_2: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(delete (1, 2, undefined));
|
||||||
|
console.log(delete (1, 2, void 0));
|
||||||
|
console.log(delete (1, 2, Infinity));
|
||||||
|
console.log(delete (1, 2, 1 / 0));
|
||||||
|
console.log(delete (1, 2, NaN));
|
||||||
|
console.log(delete (1, 2, 0 / 0));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(!0);
|
||||||
|
console.log(!0);
|
||||||
|
console.log(!0);
|
||||||
|
console.log(!0);
|
||||||
|
console.log(!0);
|
||||||
|
console.log(!0);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
delete_seq_3: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
keep_infinity: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(delete (1, 2, undefined));
|
||||||
|
console.log(delete (1, 2, void 0));
|
||||||
|
console.log(delete (1, 2, Infinity));
|
||||||
|
console.log(delete (1, 2, 1 / 0));
|
||||||
|
console.log(delete (1, 2, NaN));
|
||||||
|
console.log(delete (1, 2, 0 / 0));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(!0);
|
||||||
|
console.log(!0);
|
||||||
|
console.log(!0);
|
||||||
|
console.log(!0);
|
||||||
|
console.log(!0);
|
||||||
|
console.log(!0);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
delete_seq_4: {
|
||||||
|
options = {
|
||||||
|
booleans: 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((f(), !0)),
|
||||||
|
console.log((f(), !0)),
|
||||||
|
console.log((f(), !0)),
|
||||||
|
console.log((f(), !0)),
|
||||||
|
console.log((f(), !0)),
|
||||||
|
console.log((f(), !0));
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
delete_seq_5: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
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((f(), !0)),
|
||||||
|
console.log((f(), !0)),
|
||||||
|
console.log((f(), !0)),
|
||||||
|
console.log((f(), !0)),
|
||||||
|
console.log((f(), !0)),
|
||||||
|
console.log((f(), !0));
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
delete_seq_6: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
console.log(delete (1, a));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
console.log(!0);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
side_effects: {
|
||||||
|
options = {
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
0, a(), 1, b(), 2, c(), 3;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
a(), b(), c();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
side_effects_cascade_1: {
|
||||||
|
options = {
|
||||||
|
cascade: true,
|
||||||
|
conditionals: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b) {
|
||||||
|
a -= 42;
|
||||||
|
if (a < 0) a = 0;
|
||||||
|
b.a = a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b) {
|
||||||
|
(a -= 42) < 0 && (a = 0), b.a = a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
side_effects_cascade_2: {
|
||||||
|
options = {
|
||||||
|
cascade: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b) {
|
||||||
|
b = a,
|
||||||
|
!a + (b += a) || (b += a),
|
||||||
|
b = a,
|
||||||
|
b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b) {
|
||||||
|
b = a,
|
||||||
|
!a + (b += a) || (b += a),
|
||||||
|
b = a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
side_effects_cascade_3: {
|
||||||
|
options = {
|
||||||
|
cascade: true,
|
||||||
|
conditionals: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b) {
|
||||||
|
"foo" ^ (b += a),
|
||||||
|
b ? false : (b = a) ? -1 : (b -= a) - (b ^= a),
|
||||||
|
a-- || !a,
|
||||||
|
a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b) {
|
||||||
|
!(b += a) && ((b = a) || (b -= a, b ^= a)),
|
||||||
|
--a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_27: {
|
||||||
|
options = {
|
||||||
|
cascade: true,
|
||||||
|
passes: 2,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(jQuery) {
|
||||||
|
var $;
|
||||||
|
$ = jQuery;
|
||||||
|
$("body").addClass("foo");
|
||||||
|
})(jQuery);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(jQuery) {
|
||||||
|
jQuery("body").addClass("foo");
|
||||||
|
})(jQuery);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
reassign_const: {
|
||||||
|
options = {
|
||||||
|
cascade: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
const a = 1;
|
||||||
|
a++;
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
console.log(f());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
const a = 1;
|
||||||
|
return a++, a;
|
||||||
|
}
|
||||||
|
console.log(f());
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2062: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
cascade: true,
|
||||||
|
conditionals: 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 && a.var;
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "1"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2313: {
|
||||||
|
options = {
|
||||||
|
cascade: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 0, b = 0;
|
||||||
|
var foo = {
|
||||||
|
get c() {
|
||||||
|
a++;
|
||||||
|
return 42;
|
||||||
|
},
|
||||||
|
set c(c) {
|
||||||
|
b++;
|
||||||
|
},
|
||||||
|
d: function() {
|
||||||
|
this.c++;
|
||||||
|
if (this.c) console.log(a, b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foo.d();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 0, b = 0;
|
||||||
|
var foo = {
|
||||||
|
get c() {
|
||||||
|
return a++, 42;
|
||||||
|
},
|
||||||
|
set c(c) {
|
||||||
|
b++;
|
||||||
|
},
|
||||||
|
d: function() {
|
||||||
|
if (this.c++, this.c) console.log(a, b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foo.d();
|
||||||
|
}
|
||||||
|
expect_stdout: "2 1"
|
||||||
|
}
|
||||||
|
|||||||
@@ -8,3 +8,12 @@ octal_escape_sequence: {
|
|||||||
var border_check = "\x20\x30\x38\x30\x00\x30\xc0\x30";
|
var border_check = "\x20\x30\x38\x30\x00\x30\xc0\x30";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_1929: {
|
||||||
|
input: {
|
||||||
|
function f(s) {
|
||||||
|
return s.split(/[\\/]/);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: "function f(s){return s.split(/[\\\\/]/)}"
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,5 +1,10 @@
|
|||||||
constant_switch_1: {
|
constant_switch_1: {
|
||||||
options = { dead_code: true, evaluate: true };
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
switch (1+1) {
|
switch (1+1) {
|
||||||
case 1: foo(); break;
|
case 1: foo(); break;
|
||||||
@@ -13,7 +18,12 @@ constant_switch_1: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
constant_switch_2: {
|
constant_switch_2: {
|
||||||
options = { dead_code: true, evaluate: true };
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
switch (1) {
|
switch (1) {
|
||||||
case 1: foo();
|
case 1: foo();
|
||||||
@@ -28,7 +38,12 @@ constant_switch_2: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
constant_switch_3: {
|
constant_switch_3: {
|
||||||
options = { dead_code: true, evaluate: true };
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
switch (10) {
|
switch (10) {
|
||||||
case 1: foo();
|
case 1: foo();
|
||||||
@@ -44,7 +59,12 @@ constant_switch_3: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
constant_switch_4: {
|
constant_switch_4: {
|
||||||
options = { dead_code: true, evaluate: true };
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
switch (2) {
|
switch (2) {
|
||||||
case 1:
|
case 1:
|
||||||
@@ -65,7 +85,12 @@ constant_switch_4: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
constant_switch_5: {
|
constant_switch_5: {
|
||||||
options = { dead_code: true, evaluate: true };
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
switch (1) {
|
switch (1) {
|
||||||
case 1:
|
case 1:
|
||||||
@@ -94,7 +119,12 @@ constant_switch_5: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
constant_switch_6: {
|
constant_switch_6: {
|
||||||
options = { dead_code: true, evaluate: true };
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
OUT: {
|
OUT: {
|
||||||
foo();
|
foo();
|
||||||
@@ -123,7 +153,12 @@ constant_switch_6: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
constant_switch_7: {
|
constant_switch_7: {
|
||||||
options = { dead_code: true, evaluate: true };
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
OUT: {
|
OUT: {
|
||||||
foo();
|
foo();
|
||||||
@@ -161,7 +196,12 @@ constant_switch_7: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
constant_switch_8: {
|
constant_switch_8: {
|
||||||
options = { dead_code: true, evaluate: true };
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
OUT: switch (1) {
|
OUT: switch (1) {
|
||||||
case 1:
|
case 1:
|
||||||
@@ -185,7 +225,12 @@ constant_switch_8: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
constant_switch_9: {
|
constant_switch_9: {
|
||||||
options = { dead_code: true, evaluate: true };
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
OUT: switch (1) {
|
OUT: switch (1) {
|
||||||
case 1:
|
case 1:
|
||||||
@@ -210,7 +255,10 @@ constant_switch_9: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
drop_default_1: {
|
drop_default_1: {
|
||||||
options = { dead_code: true };
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
switch (foo) {
|
switch (foo) {
|
||||||
case 'bar': baz();
|
case 'bar': baz();
|
||||||
@@ -225,7 +273,10 @@ drop_default_1: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
drop_default_2: {
|
drop_default_2: {
|
||||||
options = { dead_code: true };
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
switch (foo) {
|
switch (foo) {
|
||||||
case 'bar': baz(); break;
|
case 'bar': baz(); break;
|
||||||
@@ -241,7 +292,10 @@ drop_default_2: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
keep_default: {
|
keep_default: {
|
||||||
options = { dead_code: true };
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
switch (foo) {
|
switch (foo) {
|
||||||
case 'bar': baz();
|
case 'bar': baz();
|
||||||
@@ -258,3 +312,507 @@ keep_default: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_1663: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 100, b = 10;
|
||||||
|
function f() {
|
||||||
|
switch (1) {
|
||||||
|
case 1:
|
||||||
|
b = a++;
|
||||||
|
return ++b;
|
||||||
|
default:
|
||||||
|
var b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 100, b = 10;
|
||||||
|
function f() {
|
||||||
|
var b;
|
||||||
|
b = a++;
|
||||||
|
return ++b;
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_case: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
switch (foo) {
|
||||||
|
case 'bar': baz(); break;
|
||||||
|
case 'moo':
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
switch (foo) {
|
||||||
|
case 'bar': baz();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
keep_case: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
switch (foo) {
|
||||||
|
case 'bar': baz(); break;
|
||||||
|
case moo:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
switch (foo) {
|
||||||
|
case 'bar': baz(); break;
|
||||||
|
case moo:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_376: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
switch (true) {
|
||||||
|
case boolCondition:
|
||||||
|
console.log(1);
|
||||||
|
break;
|
||||||
|
case false:
|
||||||
|
console.log(2);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
switch (true) {
|
||||||
|
case boolCondition:
|
||||||
|
console.log(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_441_1: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
switch (foo) {
|
||||||
|
case bar:
|
||||||
|
qux();
|
||||||
|
break;
|
||||||
|
case baz:
|
||||||
|
qux();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
qux();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
switch (foo) {
|
||||||
|
case bar:
|
||||||
|
case baz:
|
||||||
|
default:
|
||||||
|
qux();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_441_2: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
switch (foo) {
|
||||||
|
case bar:
|
||||||
|
// TODO: Fold into the case below
|
||||||
|
qux();
|
||||||
|
break;
|
||||||
|
case fall:
|
||||||
|
case baz:
|
||||||
|
qux();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
qux();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
switch (foo) {
|
||||||
|
case bar:
|
||||||
|
qux();
|
||||||
|
break;
|
||||||
|
case fall:
|
||||||
|
case baz:
|
||||||
|
default:
|
||||||
|
qux();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1674: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
switch (0) {
|
||||||
|
default:
|
||||||
|
console.log("FAIL");
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
console.log("PASS");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1679: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 100, b = 10;
|
||||||
|
function f() {
|
||||||
|
switch (--b) {
|
||||||
|
default:
|
||||||
|
case !function x() {}:
|
||||||
|
break;
|
||||||
|
case b--:
|
||||||
|
switch (0) {
|
||||||
|
default:
|
||||||
|
case a--:
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case (a++):
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 100, b = 10;
|
||||||
|
function f() {
|
||||||
|
switch (--b) {
|
||||||
|
default:
|
||||||
|
case !function x() {}:
|
||||||
|
break;
|
||||||
|
case b--:
|
||||||
|
switch (0) {
|
||||||
|
default:
|
||||||
|
case a--:
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case (a++):
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1680_1: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(x) {
|
||||||
|
console.log(x);
|
||||||
|
return x + 1;
|
||||||
|
}
|
||||||
|
switch (2) {
|
||||||
|
case f(0):
|
||||||
|
case f(1):
|
||||||
|
f(2);
|
||||||
|
case 2:
|
||||||
|
case f(3):
|
||||||
|
case f(4):
|
||||||
|
f(5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(x) {
|
||||||
|
console.log(x);
|
||||||
|
return x + 1;
|
||||||
|
}
|
||||||
|
switch (2) {
|
||||||
|
case f(0):
|
||||||
|
case f(1):
|
||||||
|
f(2);
|
||||||
|
case 2:
|
||||||
|
f(5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"0",
|
||||||
|
"1",
|
||||||
|
"2",
|
||||||
|
"5",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1680_2: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 100, b = 10;
|
||||||
|
switch (b) {
|
||||||
|
case a--:
|
||||||
|
break;
|
||||||
|
case b:
|
||||||
|
var c;
|
||||||
|
break;
|
||||||
|
case a:
|
||||||
|
break;
|
||||||
|
case a--:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 100, b = 10;
|
||||||
|
switch (b) {
|
||||||
|
case a--:
|
||||||
|
break;
|
||||||
|
case b:
|
||||||
|
var c;
|
||||||
|
break;
|
||||||
|
case a:
|
||||||
|
case a--:
|
||||||
|
}
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1690_1: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
switch (console.log("PASS")) {}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1690_2: {
|
||||||
|
options = {
|
||||||
|
dead_code: false,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
switch (console.log("PASS")) {}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
switch (console.log("PASS")) {}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
if_switch_typeof: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
side_effects: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
if (a) switch(typeof b) {}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1698: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
!function() {
|
||||||
|
switch (a++) {}
|
||||||
|
}();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 1;
|
||||||
|
!function() {
|
||||||
|
switch (a++) {}
|
||||||
|
}();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "2"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1705_1: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 0;
|
||||||
|
switch (a) {
|
||||||
|
default:
|
||||||
|
console.log("FAIL");
|
||||||
|
case 0:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 0;
|
||||||
|
switch (a) {
|
||||||
|
default:
|
||||||
|
console.log("FAIL");
|
||||||
|
case 0:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1705_2: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
switches: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 0;
|
||||||
|
switch (a) {
|
||||||
|
default:
|
||||||
|
console.log("FAIL");
|
||||||
|
case 0:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1705_3: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
switch (a) {
|
||||||
|
case 0:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
a;
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
beautify: {
|
||||||
|
beautify = {
|
||||||
|
beautify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
switch (a) {
|
||||||
|
case 0:
|
||||||
|
case 1:
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
switch (b) {
|
||||||
|
case 3:
|
||||||
|
foo();
|
||||||
|
bar();
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"switch (a) {",
|
||||||
|
" case 0:",
|
||||||
|
" case 1:",
|
||||||
|
" break;",
|
||||||
|
"",
|
||||||
|
" case 2:",
|
||||||
|
" default:",
|
||||||
|
"}",
|
||||||
|
"",
|
||||||
|
"switch (b) {",
|
||||||
|
" case 3:",
|
||||||
|
" foo();",
|
||||||
|
" bar();",
|
||||||
|
"",
|
||||||
|
" default:",
|
||||||
|
" break;",
|
||||||
|
"}",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1758: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 1, b = 2;
|
||||||
|
switch (a--) {
|
||||||
|
default:
|
||||||
|
b++;
|
||||||
|
}
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 1, b = 2;
|
||||||
|
a--;
|
||||||
|
b++;
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect_stdout: "0 3"
|
||||||
|
}
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ template_strings_without_ascii_only: {
|
|||||||
bar
|
bar
|
||||||
ↂωↂ`
|
ↂωↂ`
|
||||||
}
|
}
|
||||||
expect_exact: "var foo=`foo\n bar\n ↂωↂ`;"
|
expect_exact: "var foo=`foo\\n bar\\n ↂωↂ`;"
|
||||||
}
|
}
|
||||||
|
|
||||||
template_string_with_constant_expression: {
|
template_string_with_constant_expression: {
|
||||||
@@ -59,7 +59,7 @@ template_string_with_constant_expression: {
|
|||||||
var foo = `${4 + 4} equals 4 + 4`;
|
var foo = `${4 + 4} equals 4 + 4`;
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var foo = `8 equals 4 + 4`;
|
var foo = "8 equals 4 + 4";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -89,21 +89,21 @@ template_string_with_predefined_constants: {
|
|||||||
var c = `${4**14}`; // 8 in template vs 9 chars - 268435456
|
var c = `${4**14}`; // 8 in template vs 9 chars - 268435456
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var foo = `This is undefined`;
|
var foo = "This is undefined";
|
||||||
var bar = `This is NaN`;
|
var bar = "This is NaN";
|
||||||
var baz = `This is null`;
|
var baz = "This is null";
|
||||||
var foofoo = `This is ${1/0}`;
|
var foofoo = `This is ${1/0}`;
|
||||||
var foobar = "This is ${1/0}";
|
var foobar = "This is ${1/0}";
|
||||||
var foobaz = 'This is ${1/0}';
|
var foobaz = 'This is ${1/0}';
|
||||||
var barfoo = "This is ${NaN}";
|
var barfoo = "This is ${NaN}";
|
||||||
var bazfoo = "This is ${null}";
|
var bazfoo = "This is ${null}";
|
||||||
var bazbaz = `This is ${1/0}`;
|
var bazbaz = `This is ${1/0}`;
|
||||||
var barbar = `This is NaN`;
|
var barbar = "This is NaN";
|
||||||
var barbar = "This is ${0/0}";
|
var barbar = "This is ${0/0}";
|
||||||
var barber = 'This is ${0/0}';
|
var barber = 'This is ${0/0}';
|
||||||
|
|
||||||
var a = `4194304`;
|
var a = "4194304";
|
||||||
var b = `16777216`; // Potential for further concatentation
|
var b = "16777216"; // Potential for further concatentation
|
||||||
var c = `${4**14}`; // Not worth converting
|
var c = `${4**14}`; // Not worth converting
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -123,7 +123,7 @@ template_string_evaluate_with_many_segments: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var foo = `Hello ${guest()}, welcome to ${location()}.`;
|
var foo = `Hello ${guest()}, welcome to ${location()}.`;
|
||||||
var bar = `1234567890`;
|
var bar = "1234567890";
|
||||||
var baz = `${foobar()}${foobar()}${foobar()}${foobar()}`;
|
var baz = `${foobar()}${foobar()}${foobar()}${foobar()}`;
|
||||||
var buzz = `1${foobar()}2${foobar()}3${foobar()}`;
|
var buzz = `1${foobar()}2${foobar()}3${foobar()}`;
|
||||||
}
|
}
|
||||||
@@ -159,7 +159,7 @@ template_string_to_normal_string: {
|
|||||||
var bar = "Decimals " + `${1}${2}${3}${4}${5}${6}${7}${8}${9}${0}`;
|
var bar = "Decimals " + `${1}${2}${3}${4}${5}${6}${7}${8}${9}${0}`;
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var foo = `This is undefined`;
|
var foo = "This is undefined";
|
||||||
var bar = "Decimals 1234567890";
|
var bar = "Decimals 1234567890";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -192,7 +192,7 @@ evaluate_nested_templates: {
|
|||||||
var baz = `${`${`${`foo`}`}`}`;
|
var baz = `${`${`${`foo`}`}`}`;
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var baz = `foo`;
|
var baz = "foo";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -241,8 +241,8 @@ enforce_double_quotes_and_evaluate: {
|
|||||||
var baz = `Hello ${world()}`;
|
var baz = `Hello ${world()}`;
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var foo = `Hello world`;
|
var foo = "Hello world";
|
||||||
var bar = `Hello world`;
|
var bar = "Hello world";
|
||||||
var baz = `Hello ${world()}`;
|
var baz = `Hello ${world()}`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -260,8 +260,8 @@ enforce_single_quotes_and_evaluate: {
|
|||||||
var baz = `Hello ${world()}`;
|
var baz = `Hello ${world()}`;
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var foo = `Hello world`;
|
var foo = "Hello world";
|
||||||
var bar = `Hello world`;
|
var bar = "Hello world";
|
||||||
var baz = `Hello ${world()}`;
|
var baz = `Hello ${world()}`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -339,7 +339,7 @@ escape_dollar_curly: {
|
|||||||
console.log(`${1-0}\${2-0}$\{3-0}${4-0}`)
|
console.log(`${1-0}\${2-0}$\{3-0}${4-0}`)
|
||||||
console.log(`$${""}{not an expression}`)
|
console.log(`$${""}{not an expression}`)
|
||||||
}
|
}
|
||||||
expect_exact: "console.log(`\\${ beep }`);console.log(`1\\${2-0}\\${3-0}4`);console.log(`\\${not an expression}`);"
|
expect_exact: 'console.log("${ beep }");console.log("1${2-0}${3-0}4");console.log("${not an expression}");'
|
||||||
}
|
}
|
||||||
|
|
||||||
template_starting_with_newline: {
|
template_starting_with_newline: {
|
||||||
@@ -351,7 +351,8 @@ template_starting_with_newline: {
|
|||||||
return `
|
return `
|
||||||
this is a template string!`;
|
this is a template string!`;
|
||||||
};
|
};
|
||||||
} expect_exact: "function foo(e){return`\nthis is a template string!`}"
|
}
|
||||||
|
expect_exact: "function foo(e){return`\\nthis is a template string!`}"
|
||||||
}
|
}
|
||||||
|
|
||||||
template_with_newline: {
|
template_with_newline: {
|
||||||
@@ -363,7 +364,8 @@ template_with_newline: {
|
|||||||
return `yep,
|
return `yep,
|
||||||
this is a template string!`;
|
this is a template string!`;
|
||||||
};
|
};
|
||||||
} expect_exact: "function foo(e){return`yep,\nthis is a template string!`}"
|
}
|
||||||
|
expect_exact: "function foo(e){return`yep,\\nthis is a template string!`}"
|
||||||
}
|
}
|
||||||
|
|
||||||
template_ending_with_newline: {
|
template_ending_with_newline: {
|
||||||
@@ -375,5 +377,84 @@ template_ending_with_newline: {
|
|||||||
return `this is a template string!
|
return `this is a template string!
|
||||||
`;
|
`;
|
||||||
};
|
};
|
||||||
} expect_exact: "function foo(e){return`this is a template string!\n`}"
|
}
|
||||||
|
expect_exact: "function foo(e){return`this is a template string!\\n`}"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1856: {
|
||||||
|
beautify = {
|
||||||
|
ascii_only: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(`\\n\\r\\u2028\\u2029\n\r\u2028\u2029`);
|
||||||
|
}
|
||||||
|
expect_exact: "console.log(`\\\\n\\\\r\\\\u2028\\\\u2029\\n\\r\\u2028\\u2029`);"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1856_ascii_only: {
|
||||||
|
beautify = {
|
||||||
|
ascii_only: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(`\\n\\r\\u2028\\u2029\n\r\u2028\u2029`);
|
||||||
|
}
|
||||||
|
expect_exact: "console.log(`\\\\n\\\\r\\\\u2028\\\\u2029\\n\\r\\u2028\\u2029`);"
|
||||||
|
}
|
||||||
|
|
||||||
|
side_effects: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
`t1`;
|
||||||
|
tag`t2`;
|
||||||
|
`t${3}`;
|
||||||
|
tag`t${4}`;
|
||||||
|
console.log(`
|
||||||
|
t${5}`);
|
||||||
|
function f(a) {
|
||||||
|
`t6${a}`;
|
||||||
|
a = `t7${a}` & a;
|
||||||
|
a = `t8${b}` | a;
|
||||||
|
a = f`t9${a}` ^ a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
tag`t2`;
|
||||||
|
tag`t${4}`;
|
||||||
|
console.log("\nt5");
|
||||||
|
function f(a) {
|
||||||
|
a &= `t7${a}`;
|
||||||
|
a = `t8${b}` | a;
|
||||||
|
a = f`t9${a}` ^ a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
simple_string: {
|
||||||
|
options = {
|
||||||
|
computed_props: true,
|
||||||
|
evaluate: true,
|
||||||
|
properties: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log({[`foo`]: 1}[`foo`], `hi` == "hi", `world`);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log([ 1 ][0], true, "world");
|
||||||
|
}
|
||||||
|
expect_stdout: "1 true 'world'"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
semicolons: {
|
||||||
|
beautify = {
|
||||||
|
semicolons: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
foo;
|
||||||
|
`bar`;
|
||||||
|
}
|
||||||
|
expect_exact: "foo;`bar`\n"
|
||||||
}
|
}
|
||||||
|
|||||||
130
test/compress/transform.js
Normal file
130
test/compress/transform.js
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
booleans_evaluate: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(typeof void 0 != "undefined");
|
||||||
|
console.log(1 == 1, 1 === 1)
|
||||||
|
console.log(1 != 1, 1 !== 1)
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(!1);
|
||||||
|
console.log(!0, !0);
|
||||||
|
console.log(!1, !1);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
booleans_global_defs: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true,
|
||||||
|
global_defs: {
|
||||||
|
A: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(A == 1);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(!0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
condition_evaluate: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
dead_code: false,
|
||||||
|
evaluate: true,
|
||||||
|
loops: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
while (1 === 2);
|
||||||
|
for (; 1 == true;);
|
||||||
|
if (void 0 == null);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
while (!1);
|
||||||
|
for (; !0;);
|
||||||
|
if (!0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if_else_empty: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
if ({} ? a : b); else {}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
!{} ? b : a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
label_if_break: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
L: if (true) {
|
||||||
|
a;
|
||||||
|
break L;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while_if_break: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
loops: true,
|
||||||
|
sequences: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
while (a) {
|
||||||
|
if (b) if(c) d;
|
||||||
|
if (e) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
for(; a && (b && c && d, !e););
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if_return: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
if_return: true,
|
||||||
|
sequences: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(w, x, y, z) {
|
||||||
|
if (x) return;
|
||||||
|
if (w) {
|
||||||
|
if (y) return;
|
||||||
|
} else if (z) return;
|
||||||
|
if (x == y) return true;
|
||||||
|
|
||||||
|
if (x) w();
|
||||||
|
if (y) z();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(w, x, y, z) {
|
||||||
|
if (!x) {
|
||||||
|
if (w) {
|
||||||
|
if (y) return;
|
||||||
|
} else if (z) return;
|
||||||
|
return x == y || (x && w(), y && z(), !0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -48,3 +48,15 @@ typeof_in_boolean_context: {
|
|||||||
foo();
|
foo();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_1668: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
if (typeof bar);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
if (!0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -43,15 +43,6 @@ unicode_string_literals: {
|
|||||||
expect_exact: 'var a="6 length unicode character: \\u{101111}";'
|
expect_exact: 'var a="6 length unicode character: \\u{101111}";'
|
||||||
}
|
}
|
||||||
|
|
||||||
// Don't escape identifiers below es6 (or in this case double escaped in expect_exact)
|
|
||||||
unicode_output_es5_surrogates: {
|
|
||||||
beautify = {ascii_only: true, ecma: 5}
|
|
||||||
input: {
|
|
||||||
var \u{10000} = "6 length unicode character: \u{10FFFF}";
|
|
||||||
}
|
|
||||||
expect_exact: 'var \u{10000}="6 length unicode character: \\udbff\\udfff";'
|
|
||||||
}
|
|
||||||
|
|
||||||
check_escape_style: {
|
check_escape_style: {
|
||||||
beautify = {ascii_only: true, ecma: 6}
|
beautify = {ascii_only: true, ecma: 6}
|
||||||
input: {
|
input: {
|
||||||
@@ -65,20 +56,6 @@ check_escape_style: {
|
|||||||
expect_exact: 'var a="\\x01";var \\ua0081="\\x10";var \\u0100="\\u0100";var \\u1000="\\u1000";var \\u{10000}="\\u{10000}";var \\u{2f800}="\\u{100000}";'
|
expect_exact: 'var a="\\x01";var \\ua0081="\\x10";var \\u0100="\\u0100";var \\u1000="\\u1000";var \\u{10000}="\\u{10000}";var \\u{2f800}="\\u{100000}";'
|
||||||
}
|
}
|
||||||
|
|
||||||
// Don't escape identifiers below es6, no escaped identifiers support and no \u{} syntax
|
|
||||||
check_escape_style_es5: {
|
|
||||||
beautify = {ascii_only: true, ecma: 5}
|
|
||||||
input: {
|
|
||||||
var a = "\x01";
|
|
||||||
var \ua0081 = "\x10"; // \u0081 only in ID_Continue
|
|
||||||
var \u0100 = "\u0100";
|
|
||||||
var \u1000 = "\u1000";
|
|
||||||
var \u{10000} = "\u{10000}"; // Identifier won't be escaped in es 5.1
|
|
||||||
var \u{2f800} = "\u{100000}"; // Same
|
|
||||||
}
|
|
||||||
expect_exact: 'var a="\\x01";var \\ua0081="\\x10";var \\u0100="\\u0100";var \\u1000="\\u1000";var \ud800\udc00="\\ud800\\udc00";var \ud87e\udc00="\\udbc0\\udc00";'
|
|
||||||
}
|
|
||||||
|
|
||||||
ID_continue_with_surrogate_pair: {
|
ID_continue_with_surrogate_pair: {
|
||||||
beautify = {ascii_only: true, ecma: 6}
|
beautify = {ascii_only: true, ecma: 6}
|
||||||
input: {
|
input: {
|
||||||
@@ -103,18 +80,42 @@ non_escape_2_non_escape: {
|
|||||||
expect_exact: 'var µþ="µþ";'
|
expect_exact: 'var µþ="µþ";'
|
||||||
}
|
}
|
||||||
|
|
||||||
non_escape_2_half_escape1: {
|
issue_2242_1: {
|
||||||
beautify = {ascii_only: false, ascii_identifiers: true, ecma: 6}
|
beautify = {
|
||||||
input: {
|
ascii_only: false,
|
||||||
var µþ = "µþ";
|
|
||||||
}
|
}
|
||||||
expect_exact: 'var \\u00b5\\u00fe="µþ";'
|
input: {
|
||||||
|
console.log("\ud83d", "\ude00", "\ud83d\ude00", "\ud83d@\ude00");
|
||||||
|
}
|
||||||
|
expect_exact: 'console.log("\\ud83d","\\ude00","\ud83d\ude00","\\ud83d@\\ude00");'
|
||||||
}
|
}
|
||||||
|
|
||||||
non_escape_2_half_escape2: {
|
issue_2242_2: {
|
||||||
beautify = {ascii_only: true, ascii_identifiers: false, ecma: 6}
|
beautify = {
|
||||||
input: {
|
ascii_only: true,
|
||||||
var µþ = "µþ";
|
|
||||||
}
|
}
|
||||||
expect_exact: 'var µþ="\\xb5\\xfe";'
|
input: {
|
||||||
}
|
console.log("\ud83d", "\ude00", "\ud83d\ude00", "\ud83d@\ude00");
|
||||||
|
}
|
||||||
|
expect_exact: 'console.log("\\ud83d","\\ude00","\\ud83d\\ude00","\\ud83d@\\ude00");'
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2242_3: {
|
||||||
|
options = {
|
||||||
|
evaluate: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log("\ud83d" + "\ude00", "\ud83d" + "@" + "\ude00");
|
||||||
|
}
|
||||||
|
expect_exact: 'console.log("\\ud83d"+"\\ude00","\\ud83d"+"@"+"\\ude00");'
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2242_4: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log("\ud83d" + "\ude00", "\ud83d" + "@" + "\ude00");
|
||||||
|
}
|
||||||
|
expect_exact: 'console.log("\ud83d\ude00","\\ud83d@\\ude00");'
|
||||||
|
}
|
||||||
|
|||||||
@@ -190,3 +190,12 @@ yield_sub: {
|
|||||||
}
|
}
|
||||||
expect_exact: 'function*foo(){yield x["foo"];(yield x)["foo"];yield(yield obj.foo())["bar"]()}'
|
expect_exact: 'function*foo(){yield x["foo"];(yield x)["foo"];yield(yield obj.foo())["bar"]()}'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
yield_as_ES5_property: {
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
console.log({yield: 42}.yield);
|
||||||
|
}
|
||||||
|
expect_exact: '"use strict";console.log({yield:42}.yield);'
|
||||||
|
expect_stdout: "42"
|
||||||
|
}
|
||||||
|
|||||||
14
test/exports.js
Normal file
14
test/exports.js
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
exports["Compressor"] = Compressor;
|
||||||
|
exports["JS_Parse_Error"] = JS_Parse_Error;
|
||||||
|
exports["OutputStream"] = OutputStream;
|
||||||
|
exports["SourceMap"] = SourceMap;
|
||||||
|
exports["TreeWalker"] = TreeWalker;
|
||||||
|
exports["base54"] = base54;
|
||||||
|
exports["defaults"] = defaults;
|
||||||
|
exports["mangle_properties"] = mangle_properties;
|
||||||
|
exports["minify"] = minify;
|
||||||
|
exports["parse"] = parse;
|
||||||
|
exports["reserve_quoted_keys"] = reserve_quoted_keys;
|
||||||
|
exports["string_template"] = string_template;
|
||||||
|
exports["tokenizer"] = tokenizer;
|
||||||
|
exports["is_identifier"] = is_identifier;
|
||||||
31
test/fetch.js
Normal file
31
test/fetch.js
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
var fs = require("fs");
|
||||||
|
var path = require("path");
|
||||||
|
|
||||||
|
try {
|
||||||
|
fs.mkdirSync("./tmp");
|
||||||
|
} catch (e) {
|
||||||
|
if (e.code != "EEXIST") throw e;
|
||||||
|
}
|
||||||
|
|
||||||
|
function local(url) {
|
||||||
|
return path.join("./tmp", encodeURIComponent(url));
|
||||||
|
}
|
||||||
|
|
||||||
|
function read(url) {
|
||||||
|
return fs.createReadStream(local(url));
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = function(url, callback) {
|
||||||
|
var result = read(url);
|
||||||
|
result.on("error", function(e) {
|
||||||
|
if (e.code != "ENOENT") return callback(e);
|
||||||
|
require(url.slice(0, url.indexOf(":"))).get(url, function(res) {
|
||||||
|
if (res.statusCode !== 200) return callback(res);
|
||||||
|
res.pipe(fs.createWriteStream(local(url)).on("close", function() {
|
||||||
|
callback(null, read(url));
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
}).on("open", function() {
|
||||||
|
callback(null, result);
|
||||||
|
});
|
||||||
|
};
|
||||||
1
test/input/invalid/assign_1.js
Normal file
1
test/input/invalid/assign_1.js
Normal file
@@ -0,0 +1 @@
|
|||||||
|
console.log(1 || 5--);
|
||||||
1
test/input/invalid/assign_2.js
Normal file
1
test/input/invalid/assign_2.js
Normal file
@@ -0,0 +1 @@
|
|||||||
|
console.log(2 || (Math.random() /= 2));
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user