mirror of
https://github.com/whoisclebs/lodash.git
synced 2026-02-01 15:57:48 +00:00
Compare commits
941 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
19c9251b36 | ||
|
|
b5e672995a | ||
|
|
edadd45214 | ||
|
|
4879a7a7d0 | ||
|
|
9648f692b0 | ||
|
|
dfa407db0b | ||
|
|
156e1965ae | ||
|
|
933e1061b8 | ||
|
|
072a807ff7 | ||
|
|
70d9d037c3 | ||
|
|
2235819f76 | ||
|
|
4afb725803 | ||
|
|
20c530121e | ||
|
|
717fe4f37c | ||
|
|
23903d3c80 | ||
|
|
4e856eb123 | ||
|
|
519b3d1f0d | ||
|
|
61ff26e089 | ||
|
|
c93ba2d878 | ||
|
|
8a26eb42ad | ||
|
|
f299b52f39 | ||
|
|
c4847ebe7d | ||
|
|
3469357cff | ||
|
|
ded9bc6658 | ||
|
|
63150ef764 | ||
|
|
00f0f62a97 | ||
|
|
846e434c7a | ||
|
|
5d046f39cb | ||
|
|
aa816b36d4 | ||
|
|
d7fbc52ee0 | ||
|
|
2e1c0f22f4 | ||
|
|
1b6c282299 | ||
|
|
a370ac8140 | ||
|
|
1144918f35 | ||
|
|
3a3b0fd339 | ||
|
|
c84fe82760 | ||
|
|
e7b28ea6cb | ||
|
|
0cec225778 | ||
|
|
94c3a8133c | ||
|
|
659e8c019c | ||
|
|
602cc3f03d | ||
|
|
b281ddecc4 | ||
|
|
ddfd9b11a0 | ||
|
|
b185fcee26 | ||
|
|
be87d30394 | ||
|
|
a6fe6b1e17 | ||
|
|
e37182845f | ||
|
|
357e899e68 | ||
|
|
fd9a062d57 | ||
|
|
e77d68121f | ||
|
|
629d186579 | ||
|
|
2406eac542 | ||
|
|
17a34bc585 | ||
|
|
53838a38f8 | ||
|
|
29e258497b | ||
|
|
8f4d3eb018 | ||
|
|
02b3295a63 | ||
|
|
52ab48c054 | ||
|
|
f8dc2149f7 | ||
|
|
deb65de218 | ||
|
|
60eb517911 | ||
|
|
1f8ea07746 | ||
|
|
e42cd97dae | ||
|
|
343456d696 | ||
|
|
0b8592a35c | ||
|
|
7084300d34 | ||
|
|
15b156512f | ||
|
|
bda6f2795f | ||
|
|
1cb18dfada | ||
|
|
39a7eae40d | ||
|
|
e0cbb4c8e6 | ||
|
|
0843bd46ef | ||
|
|
3ac4b261e4 | ||
|
|
eaa9f36e91 | ||
|
|
552f94a7db | ||
|
|
d8ddc1a15f | ||
|
|
e5f9af5418 | ||
|
|
2de676fe76 | ||
|
|
278c6dd33d | ||
|
|
79b9d20a91 | ||
|
|
6e62e1e8df | ||
|
|
5c08f18d36 | ||
|
|
90e6199a16 | ||
|
|
67389a8c78 | ||
|
|
a65fd33603 | ||
|
|
b002100433 | ||
|
|
4680cdacc0 | ||
|
|
852988e04a | ||
|
|
97e9edc53d | ||
|
|
ce32a89e3e | ||
|
|
5e58cd216c | ||
|
|
5adb4ee95c | ||
|
|
a73b92b58e | ||
|
|
a1b53054d6 | ||
|
|
dac890a211 | ||
|
|
7167a78644 | ||
|
|
f83197727b | ||
|
|
20c5307542 | ||
|
|
45ac7f3bcc | ||
|
|
7cb477a3a0 | ||
|
|
b8c719d3be | ||
|
|
d8e069cc34 | ||
|
|
5a3ff73997 | ||
|
|
912d6b04a1 | ||
|
|
165572022d | ||
|
|
ae467c7313 | ||
|
|
1e80c19b0f | ||
|
|
6eeafd3dc2 | ||
|
|
e33b15674d | ||
|
|
a23b918bef | ||
|
|
ef618992b5 | ||
|
|
708b962860 | ||
|
|
da2d08d771 | ||
|
|
30863e5fa6 | ||
|
|
6672a4f942 | ||
|
|
f7263047bf | ||
|
|
02fdf4e673 | ||
|
|
e2c703a96f | ||
|
|
32fdfcc1e5 | ||
|
|
6c1ae0b54d | ||
|
|
0c1c87b046 | ||
|
|
b51786e72e | ||
|
|
5ee5099af1 | ||
|
|
482dc9478b | ||
|
|
528b6a98a9 | ||
|
|
a8bcb5f3d5 | ||
|
|
d429f90ec5 | ||
|
|
72f559e1a3 | ||
|
|
2f92d55024 | ||
|
|
5a86b67263 | ||
|
|
bea4b29bc4 | ||
|
|
0cd4134bc6 | ||
|
|
ec74813be6 | ||
|
|
67926a4df2 | ||
|
|
40a591d0c0 | ||
|
|
783e03ffa3 | ||
|
|
1dddf27a39 | ||
|
|
2890eabf66 | ||
|
|
a3e077324a | ||
|
|
86ee93650d | ||
|
|
dd0d984d37 | ||
|
|
eba18891e5 | ||
|
|
5cb80a0a84 | ||
|
|
db14f324f6 | ||
|
|
238defb150 | ||
|
|
53ba1e0c3c | ||
|
|
95d3477c22 | ||
|
|
a06d1a0313 | ||
|
|
330c8cb46e | ||
|
|
da2e8a1030 | ||
|
|
5bc9e6b8bd | ||
|
|
9a02bd5fc7 | ||
|
|
89656fdf4a | ||
|
|
4cb7bea97d | ||
|
|
eb4861c3cd | ||
|
|
170c13b5ba | ||
|
|
26a6117889 | ||
|
|
014982cb2c | ||
|
|
058361e222 | ||
|
|
e344b66af9 | ||
|
|
54cb3599e3 | ||
|
|
6c427b7a26 | ||
|
|
ce093845e1 | ||
|
|
102c5f00d7 | ||
|
|
13d315a93b | ||
|
|
2cc247ddf8 | ||
|
|
5488644658 | ||
|
|
1fe9042953 | ||
|
|
8bde34dda0 | ||
|
|
98720bea4a | ||
|
|
032637bba1 | ||
|
|
dadde87cab | ||
|
|
fcd0bbfc56 | ||
|
|
600fbbadfb | ||
|
|
3d0df11e50 | ||
|
|
2e4c997dba | ||
|
|
5aaf7e40ae | ||
|
|
57703b040d | ||
|
|
c6ff776147 | ||
|
|
9ac729e1bc | ||
|
|
6d951ccc87 | ||
|
|
3217118fab | ||
|
|
6ef973ae33 | ||
|
|
e0a65ac34a | ||
|
|
b833d83a3e | ||
|
|
220713109c | ||
|
|
cafb9822ce | ||
|
|
1b3815928d | ||
|
|
fbb67f9dbe | ||
|
|
8d24f393ac | ||
|
|
7759376b91 | ||
|
|
ccc3081be0 | ||
|
|
62b66305f2 | ||
|
|
65daae2043 | ||
|
|
0fcf43b02b | ||
|
|
46d1f53ee9 | ||
|
|
fc22665dd8 | ||
|
|
7862e5ce2d | ||
|
|
7cbffd5ebf | ||
|
|
5028267c72 | ||
|
|
6f03ef955c | ||
|
|
f75bf13ad1 | ||
|
|
d7dbf0951d | ||
|
|
daf6de6a46 | ||
|
|
7d4c3ed404 | ||
|
|
a9fd17950a | ||
|
|
b91a515258 | ||
|
|
bc5729a9de | ||
|
|
729d1a57aa | ||
|
|
73e2562cd1 | ||
|
|
849423c9d8 | ||
|
|
1c9a9f364d | ||
|
|
e485e16d28 | ||
|
|
bc49e7fe18 | ||
|
|
6a9337434f | ||
|
|
0c89b9aeb5 | ||
|
|
6f7a8501cb | ||
|
|
7a03898ffe | ||
|
|
609ae34b4e | ||
|
|
2d21faf68a | ||
|
|
26ee0c5c2a | ||
|
|
cafb5e1331 | ||
|
|
7717b8aa64 | ||
|
|
c82322c490 | ||
|
|
4af0c066ec | ||
|
|
d2b10de40b | ||
|
|
26bfb74a60 | ||
|
|
ef129e4c8c | ||
|
|
0b04309ea5 | ||
|
|
fb4852f6db | ||
|
|
5046943020 | ||
|
|
14d7f89f75 | ||
|
|
d431e97030 | ||
|
|
8f06ea259a | ||
|
|
0a0fa58e2d | ||
|
|
286f1abb87 | ||
|
|
a621ba236a | ||
|
|
a041a3782d | ||
|
|
9f8064a8b5 | ||
|
|
729f424622 | ||
|
|
6a8e978fd7 | ||
|
|
aea509c230 | ||
|
|
21113b8c87 | ||
|
|
dcf6d382c4 | ||
|
|
c541598f40 | ||
|
|
bd8e38518f | ||
|
|
067036a359 | ||
|
|
22b51ed232 | ||
|
|
054e78572b | ||
|
|
31cb06a643 | ||
|
|
ee4a5a2604 | ||
|
|
05b60871c5 | ||
|
|
03a194fcb9 | ||
|
|
52e96c38dc | ||
|
|
f5dd98cac4 | ||
|
|
b890d40b54 | ||
|
|
457a0dc703 | ||
|
|
e4837cd75d | ||
|
|
67b2c6f900 | ||
|
|
260a84c4d8 | ||
|
|
4b0db6ec6c | ||
|
|
9c4c194bb5 | ||
|
|
ac74a1ea15 | ||
|
|
e4ddf3e155 | ||
|
|
896b27ef73 | ||
|
|
bdf0b9f288 | ||
|
|
1665e5cbff | ||
|
|
6e8c0de1ff | ||
|
|
4fb41ac6a9 | ||
|
|
af983b2dd3 | ||
|
|
405d5875b8 | ||
|
|
b30f979ec7 | ||
|
|
836bd258a0 | ||
|
|
d2f74ee245 | ||
|
|
45f668b416 | ||
|
|
d29d74f687 | ||
|
|
9fba7be296 | ||
|
|
f30851bac1 | ||
|
|
d308bce09f | ||
|
|
3d7dbd140c | ||
|
|
15bd64a1b4 | ||
|
|
3c30100837 | ||
|
|
81bdb9da43 | ||
|
|
60e3a93a30 | ||
|
|
158f2839fd | ||
|
|
c7b9df4286 | ||
|
|
0eca941e22 | ||
|
|
8592f4163f | ||
|
|
29e2598a39 | ||
|
|
32e75acb9f | ||
|
|
b54501a771 | ||
|
|
6062860628 | ||
|
|
a12c3797fb | ||
|
|
48bc8b4f1a | ||
|
|
e861681963 | ||
|
|
9985e81808 | ||
|
|
ffde99b216 | ||
|
|
492caa4fd2 | ||
|
|
01c0950ae8 | ||
|
|
20fa52309c | ||
|
|
7a345b5606 | ||
|
|
b6d8116882 | ||
|
|
4495e74f77 | ||
|
|
c009349d99 | ||
|
|
26d5ba992c | ||
|
|
320ef6f933 | ||
|
|
b678bb4a74 | ||
|
|
c1c394ac60 | ||
|
|
70d3057e17 | ||
|
|
3d27920226 | ||
|
|
33a43a5f93 | ||
|
|
fac9501840 | ||
|
|
4d6aade733 | ||
|
|
d9e2c1cc34 | ||
|
|
c8c6a7e7b1 | ||
|
|
69addb855e | ||
|
|
55fb0172c0 | ||
|
|
2026cbeebd | ||
|
|
d6d01cdfa0 | ||
|
|
cb07604dc6 | ||
|
|
549def0e48 | ||
|
|
a3c215919d | ||
|
|
ab904a1047 | ||
|
|
60381f4d6c | ||
|
|
8f607295ae | ||
|
|
27218a95af | ||
|
|
8e150ad6bc | ||
|
|
c8914a890c | ||
|
|
b25a86f352 | ||
|
|
ec8e279235 | ||
|
|
1cc16029db | ||
|
|
5c912bcc62 | ||
|
|
b3742c8d3c | ||
|
|
c3a7516712 | ||
|
|
12319d5775 | ||
|
|
45e1965936 | ||
|
|
6091c8ec49 | ||
|
|
cfb7dab0f3 | ||
|
|
2d9f3cde0f | ||
|
|
e5f4770247 | ||
|
|
dc7c321514 | ||
|
|
40164659b1 | ||
|
|
7829f3d224 | ||
|
|
92359257c1 | ||
|
|
d2a2b3a8c4 | ||
|
|
4019eb65f2 | ||
|
|
4c5bead5c6 | ||
|
|
0163aae357 | ||
|
|
8fa23a94a0 | ||
|
|
8176d56c72 | ||
|
|
5add168743 | ||
|
|
27e59404d3 | ||
|
|
54f5ac7b8d | ||
|
|
5c688cc0b7 | ||
|
|
86efb0ea09 | ||
|
|
bc13666222 | ||
|
|
d1abde7d1a | ||
|
|
691db4d406 | ||
|
|
fb833b0c19 | ||
|
|
4d2181ad83 | ||
|
|
9dd291a96e | ||
|
|
1344803e7e | ||
|
|
4a5f8fa974 | ||
|
|
212e4a6407 | ||
|
|
d47123779e | ||
|
|
fc734a6371 | ||
|
|
02be5b808e | ||
|
|
0d757fdc40 | ||
|
|
0263a879c4 | ||
|
|
c309ed1c49 | ||
|
|
e58de14437 | ||
|
|
78a7fa1d14 | ||
|
|
77178a9583 | ||
|
|
d2ab33eb52 | ||
|
|
7b3194660c | ||
|
|
f627b25e9d | ||
|
|
1bbb7c9d3b | ||
|
|
08a4ae1f56 | ||
|
|
7c398f8019 | ||
|
|
6651023f7f | ||
|
|
021df666a3 | ||
|
|
d7e60cb6d0 | ||
|
|
4cd26e6860 | ||
|
|
946a3bf5c8 | ||
|
|
b10e6a01b2 | ||
|
|
e23341a118 | ||
|
|
4446fb13a3 | ||
|
|
4dfbde7716 | ||
|
|
3c03d4a1f3 | ||
|
|
a0ecdfff0b | ||
|
|
60023a23df | ||
|
|
e96442631c | ||
|
|
94750bfa3c | ||
|
|
5cc02555d0 | ||
|
|
6e2f7e2f38 | ||
|
|
de92cc32e6 | ||
|
|
e97205409d | ||
|
|
091d8e3dbf | ||
|
|
171ca53c29 | ||
|
|
5be61796d9 | ||
|
|
1aee1c6cb8 | ||
|
|
343f48b08c | ||
|
|
358ecfd2eb | ||
|
|
8066ad7e65 | ||
|
|
7ae0d0099d | ||
|
|
2e4fc41c9b | ||
|
|
71247ff556 | ||
|
|
5ef163f143 | ||
|
|
510cbfaa3f | ||
|
|
bd3fcab9c0 | ||
|
|
9841e6aa4c | ||
|
|
1bf125eebd | ||
|
|
f9936b8b54 | ||
|
|
d11aa6de06 | ||
|
|
1c4fccc0fd | ||
|
|
aa0323f04d | ||
|
|
2916e9dd11 | ||
|
|
6958d7abd4 | ||
|
|
9e661cb858 | ||
|
|
a972026c67 | ||
|
|
2b1bda7418 | ||
|
|
a6a3f3ed80 | ||
|
|
5cca51e978 | ||
|
|
7c971587dc | ||
|
|
40a13d4b86 | ||
|
|
a0971d016d | ||
|
|
410e9e3eb8 | ||
|
|
37813c3826 | ||
|
|
e00c243662 | ||
|
|
f504f5aac5 | ||
|
|
0b63f2c259 | ||
|
|
14fb27ce77 | ||
|
|
7da7d7b7e0 | ||
|
|
907add6acc | ||
|
|
f110e3ddcd | ||
|
|
ed206e5611 | ||
|
|
e4d8af175b | ||
|
|
ba7ddc8cdc | ||
|
|
389f5790a7 | ||
|
|
6071982dd9 | ||
|
|
f71c0bd4c3 | ||
|
|
50b45d013a | ||
|
|
93a047e77c | ||
|
|
a3bf0e8888 | ||
|
|
d8fa2f3e89 | ||
|
|
e361c5a5b3 | ||
|
|
3ef032cbaf | ||
|
|
36cf5a7ff3 | ||
|
|
6d930d6920 | ||
|
|
f676a8c9c1 | ||
|
|
941ffee2d3 | ||
|
|
0a71f3372f | ||
|
|
f817f68487 | ||
|
|
826975f392 | ||
|
|
5f244d3c31 | ||
|
|
71be34859f | ||
|
|
f9a4705c9c | ||
|
|
a546842792 | ||
|
|
ba86e20179 | ||
|
|
b32fc6f6e6 | ||
|
|
1f13a34687 | ||
|
|
f212b4850d | ||
|
|
1b4555afb6 | ||
|
|
358013c67e | ||
|
|
a98667ca05 | ||
|
|
02e9f4c333 | ||
|
|
d7951db01b | ||
|
|
21fba2df9f | ||
|
|
a4947139a6 | ||
|
|
c01e7580cd | ||
|
|
8b4f22ed75 | ||
|
|
669b76bf99 | ||
|
|
efee02ace7 | ||
|
|
cd8adf5611 | ||
|
|
d216106b88 | ||
|
|
6dd8fb12ad | ||
|
|
a4999575d0 | ||
|
|
fcaff8ff28 | ||
|
|
cf0b3e3212 | ||
|
|
bccb4150fd | ||
|
|
9a297b0eb5 | ||
|
|
9c4baf7645 | ||
|
|
73b2f20509 | ||
|
|
642690e692 | ||
|
|
1468c74c36 | ||
|
|
0bfa1ec2d0 | ||
|
|
7c74464d7a | ||
|
|
de051ac1ac | ||
|
|
ba0c4c413d | ||
|
|
7e6f5ef4f5 | ||
|
|
712eeb009f | ||
|
|
b54e28deb7 | ||
|
|
1f44cebac3 | ||
|
|
9c05e8392b | ||
|
|
9a67fec48a | ||
|
|
1966ac7979 | ||
|
|
8b624217c5 | ||
|
|
40499af9b9 | ||
|
|
b3bd359a0d | ||
|
|
de07e3f874 | ||
|
|
c7e8953b68 | ||
|
|
80e7fe4bf9 | ||
|
|
2bc199d7fc | ||
|
|
9b710d8e81 | ||
|
|
cc6a0ee98d | ||
|
|
c9492d79a1 | ||
|
|
94c4719c0d | ||
|
|
c253e8d7b8 | ||
|
|
98f12fb8e1 | ||
|
|
e05a40bb16 | ||
|
|
c73bb67486 | ||
|
|
3ad0cbc86d | ||
|
|
6402af7db9 | ||
|
|
6a41a79ded | ||
|
|
fbd9a804a9 | ||
|
|
694e1175a1 | ||
|
|
80dbd4cbfa | ||
|
|
d459f4ac7c | ||
|
|
2c5c4bfbea | ||
|
|
a1a68bb5d7 | ||
|
|
984a10c1b1 | ||
|
|
3c4c06cb5e | ||
|
|
8d28a5ca3f | ||
|
|
801c4a56c3 | ||
|
|
ea000e6ce7 | ||
|
|
6723cdfa07 | ||
|
|
2cf10711f5 | ||
|
|
bde171e947 | ||
|
|
2696615523 | ||
|
|
f98028d1d8 | ||
|
|
97475fc365 | ||
|
|
ea7aa52ea3 | ||
|
|
ec4ae5978b | ||
|
|
90d73143e1 | ||
|
|
249f0cd72c | ||
|
|
232cc1ab34 | ||
|
|
2cea31cb1b | ||
|
|
02c4d60861 | ||
|
|
8c9073308a | ||
|
|
8cb5455671 | ||
|
|
8bc44e3bff | ||
|
|
73f84baaec | ||
|
|
d3acace1c4 | ||
|
|
7f3539d001 | ||
|
|
3ef19f1ab1 | ||
|
|
749b2db846 | ||
|
|
a3e99b5d89 | ||
|
|
dbbb3fbb55 | ||
|
|
6eeac45d23 | ||
|
|
5669cc0a0b | ||
|
|
d986901a1c | ||
|
|
5394bbf06a | ||
|
|
d7b2f922b5 | ||
|
|
9ab55443eb | ||
|
|
67c7a43e6f | ||
|
|
26a4bfb838 | ||
|
|
e7a16b2e64 | ||
|
|
a5612ed668 | ||
|
|
f55d15692b | ||
|
|
107994859b | ||
|
|
a8d3689061 | ||
|
|
4fb4ec5328 | ||
|
|
9bc8519656 | ||
|
|
af36d2d8e5 | ||
|
|
6b0069f10f | ||
|
|
a64b629333 | ||
|
|
fc4cc977ed | ||
|
|
7483520c8c | ||
|
|
5d18fb8c70 | ||
|
|
1163bfac5c | ||
|
|
d643bbd7e4 | ||
|
|
32158935f8 | ||
|
|
50bf1ea784 | ||
|
|
fa29123c5e | ||
|
|
314c652818 | ||
|
|
a3dd60370e | ||
|
|
3d82567118 | ||
|
|
eaac5e02c0 | ||
|
|
3bd5703bdb | ||
|
|
bf80a75474 | ||
|
|
bea7016223 | ||
|
|
c8ff2b4612 | ||
|
|
6c673cd19b | ||
|
|
c1ae43e041 | ||
|
|
9605072200 | ||
|
|
9cabc7c222 | ||
|
|
b2b3391827 | ||
|
|
19e94b8889 | ||
|
|
4bee8c9ead | ||
|
|
3f1ae77306 | ||
|
|
9f6d6d7b37 | ||
|
|
adac412f58 | ||
|
|
31ca38515a | ||
|
|
4a35929979 | ||
|
|
4a0610f107 | ||
|
|
9a1b3d813a | ||
|
|
a7a4862491 | ||
|
|
5783536837 | ||
|
|
f8646d1a5d | ||
|
|
39bb7064e7 | ||
|
|
388bf6934d | ||
|
|
5122e9271c | ||
|
|
32b36435f8 | ||
|
|
807ad48bbc | ||
|
|
b5842314b4 | ||
|
|
efb4db2b86 | ||
|
|
ecbf8cd722 | ||
|
|
9992144130 | ||
|
|
1f9cba6f53 | ||
|
|
2465a6bdbd | ||
|
|
1a7199fd6b | ||
|
|
57f0a4c6d7 | ||
|
|
138cf77916 | ||
|
|
43d1ca89c2 | ||
|
|
51e619b18f | ||
|
|
21df7426e2 | ||
|
|
2f6b2ca0c7 | ||
|
|
cf1b9f9595 | ||
|
|
b0ec8339fa | ||
|
|
762748684e | ||
|
|
bdfd5880e9 | ||
|
|
9e55e5bcea | ||
|
|
887576e4a5 | ||
|
|
ccd1d6ab29 | ||
|
|
fcbb63ad60 | ||
|
|
1607e7914c | ||
|
|
68e98397ab | ||
|
|
3983d4f473 | ||
|
|
9eda959489 | ||
|
|
4880f9923c | ||
|
|
87e8a4290e | ||
|
|
fd96d59963 | ||
|
|
1a1771f0b5 | ||
|
|
22ed53260f | ||
|
|
77cf88a3bf | ||
|
|
695d74d7c5 | ||
|
|
a164735369 | ||
|
|
6ccea636b1 | ||
|
|
0ccaf76661 | ||
|
|
593f6f9f86 | ||
|
|
fbdda6df03 | ||
|
|
a7dcce3e8d | ||
|
|
ee5718003b | ||
|
|
a43065ec08 | ||
|
|
1740ee91da | ||
|
|
90f95306f9 | ||
|
|
0964f9175e | ||
|
|
dbde3f8826 | ||
|
|
33e08baf3f | ||
|
|
6e67ebab05 | ||
|
|
5fbc5303ff | ||
|
|
e582ad226a | ||
|
|
dfb71a3a50 | ||
|
|
5355f4f25e | ||
|
|
98c422d227 | ||
|
|
e18b577d20 | ||
|
|
7226df593e | ||
|
|
8a376f647e | ||
|
|
050087f6c4 | ||
|
|
c67e347255 | ||
|
|
3fdac985c7 | ||
|
|
02ff3e6258 | ||
|
|
65ce1b0bb5 | ||
|
|
7e8528104b | ||
|
|
40ac55acb6 | ||
|
|
42c639d252 | ||
|
|
d110b64ee4 | ||
|
|
a2617d810c | ||
|
|
90d07bc04c | ||
|
|
013d9db86f | ||
|
|
9d4d725bc7 | ||
|
|
9881cc9e10 | ||
|
|
01474fed0b | ||
|
|
024e6d8ae8 | ||
|
|
607ba653f7 | ||
|
|
9090c1904f | ||
|
|
158b762367 | ||
|
|
e8b3b2dc31 | ||
|
|
5d72eec742 | ||
|
|
6fe020c920 | ||
|
|
40c5a6af49 | ||
|
|
803dce242b | ||
|
|
4ed722ccd8 | ||
|
|
f35d479d5e | ||
|
|
f3af61de97 | ||
|
|
077fb89083 | ||
|
|
d4d4390846 | ||
|
|
33e54546fe | ||
|
|
bf008e0680 | ||
|
|
08694bd709 | ||
|
|
91242440fc | ||
|
|
68ae6fc212 | ||
|
|
14a16c2a7a | ||
|
|
9cbb50d3a6 | ||
|
|
47635b9978 | ||
|
|
f90c3f2483 | ||
|
|
5a67ecc142 | ||
|
|
a542f8ab54 | ||
|
|
f32349db7d | ||
|
|
32f5db3f72 | ||
|
|
670e3983b4 | ||
|
|
e1cc4d8552 | ||
|
|
8422bb37b0 | ||
|
|
ebf9b64062 | ||
|
|
56b397b506 | ||
|
|
de6cc79ac8 | ||
|
|
d28395fdb9 | ||
|
|
84b8ee7bda | ||
|
|
b56c732332 | ||
|
|
041c1b4586 | ||
|
|
0edc480d17 | ||
|
|
1a3bcb4ebd | ||
|
|
7d8c2a84b7 | ||
|
|
4faac431c4 | ||
|
|
df9ded3282 | ||
|
|
1fe8d1679e | ||
|
|
708505f2b1 | ||
|
|
b2da5ee1a7 | ||
|
|
315e751f43 | ||
|
|
dc5544223f | ||
|
|
c14728d31a | ||
|
|
7d4b154866 | ||
|
|
b69647a0c3 | ||
|
|
d054442e2c | ||
|
|
e50bf1fb44 | ||
|
|
d40b6a75da | ||
|
|
e124e7fb5f | ||
|
|
7c3a163f9c | ||
|
|
03af0791aa | ||
|
|
464885a539 | ||
|
|
346579ac7a | ||
|
|
76ed206e9b | ||
|
|
06e7c963ef | ||
|
|
573d902026 | ||
|
|
66cdfe5896 | ||
|
|
9afd4659c7 | ||
|
|
7249217600 | ||
|
|
2f20c672e0 | ||
|
|
6d02a64c47 | ||
|
|
3d078383cb | ||
|
|
64e765bf7a | ||
|
|
b5b6125730 | ||
|
|
e45984f6b8 | ||
|
|
a95cf1c26c | ||
|
|
4a19913726 | ||
|
|
52ae769bfa | ||
|
|
44d7c3887d | ||
|
|
315271996c | ||
|
|
2357704540 | ||
|
|
262049f737 | ||
|
|
04d6e351a6 | ||
|
|
9fa86ec712 | ||
|
|
901e3dcff2 | ||
|
|
43fffe3200 | ||
|
|
1123e13072 | ||
|
|
996636d25b | ||
|
|
8864095bab | ||
|
|
def9f5d84a | ||
|
|
47d024ae7b | ||
|
|
05135ca171 | ||
|
|
ca1f22a7c6 | ||
|
|
9a461a5e48 | ||
|
|
73e7bab839 | ||
|
|
572060aedc | ||
|
|
f1b63d41f8 | ||
|
|
9ee423edcf | ||
|
|
70c8651182 | ||
|
|
2b54f23dad | ||
|
|
67ef2bb008 | ||
|
|
f2b5e58500 | ||
|
|
b8fa0d9b29 | ||
|
|
264d68dec9 | ||
|
|
71f5264ee1 | ||
|
|
ce8a1feb94 | ||
|
|
05c32044e9 | ||
|
|
44927be6e2 | ||
|
|
d1779d6cdd | ||
|
|
a13d640bcc | ||
|
|
c7d4106f66 | ||
|
|
2e59faad8f | ||
|
|
6d70b64b2e | ||
|
|
767f9c6bce | ||
|
|
edd7c2f0b1 | ||
|
|
b9cfd31bd5 | ||
|
|
6883f99141 | ||
|
|
c2aee218d2 | ||
|
|
8e44d73705 | ||
|
|
9e30cc4542 | ||
|
|
963e2c23b0 | ||
|
|
7ee4bf8d02 | ||
|
|
c3c6bc9666 | ||
|
|
ef1024bb60 | ||
|
|
6c6e1c2be3 | ||
|
|
e9a08ba9a9 | ||
|
|
59546b9989 | ||
|
|
816edcce2e | ||
|
|
8accfb3372 | ||
|
|
da146a9afd | ||
|
|
cbcd5ffdc4 | ||
|
|
6f600ebeac | ||
|
|
9aa456f26f | ||
|
|
dc77d7605d | ||
|
|
f7c4410f41 | ||
|
|
9fa0ec00b8 | ||
|
|
0125ff7303 | ||
|
|
fbc91cf7ae | ||
|
|
43c26b5d6f | ||
|
|
4e38f70e0e | ||
|
|
e2c86dac63 | ||
|
|
aebc0650f8 | ||
|
|
44cf971405 | ||
|
|
c0d7418054 | ||
|
|
a0db54b53f | ||
|
|
32b813e42b | ||
|
|
3c144b8601 | ||
|
|
076e4e6db5 | ||
|
|
2ea08ccd36 | ||
|
|
fc48518f2b | ||
|
|
594c3b3406 | ||
|
|
38edd713e4 | ||
|
|
6987d70dc2 | ||
|
|
0e4b307585 | ||
|
|
c81bbe95c6 | ||
|
|
b21a87b50f | ||
|
|
e3566eb1ce | ||
|
|
0429434dbb | ||
|
|
80f35ee713 | ||
|
|
224595c837 | ||
|
|
61ace9a24b | ||
|
|
8c630ede7e | ||
|
|
ca3b583695 | ||
|
|
c2cbb06d57 | ||
|
|
f6bf8d2e6d | ||
|
|
60c89b2754 | ||
|
|
b72fba911d | ||
|
|
3930c388e4 | ||
|
|
ddf5ef0839 | ||
|
|
c66947405b | ||
|
|
ad27b62343 | ||
|
|
5283b0f407 | ||
|
|
af41f9267a | ||
|
|
6e8c984250 | ||
|
|
c2e018b2ac | ||
|
|
a47ce3cf13 | ||
|
|
ba58f35f37 | ||
|
|
30fd1693ee | ||
|
|
161c17ce7f | ||
|
|
27dfe542bd | ||
|
|
353113f17f | ||
|
|
762e858c48 | ||
|
|
db49702046 | ||
|
|
7239bf791f | ||
|
|
9cb75cae1d | ||
|
|
fdb4cf1208 | ||
|
|
714cf7b18c | ||
|
|
1a1e0e1a6b | ||
|
|
f6c14ec31f | ||
|
|
da7f413f6f | ||
|
|
3cf28953a7 | ||
|
|
080b761f7f | ||
|
|
7f6ad484ec | ||
|
|
391a930d49 | ||
|
|
a532773703 | ||
|
|
49f8aa4289 | ||
|
|
44b9b085c0 | ||
|
|
a447353977 | ||
|
|
dea6ccbf43 | ||
|
|
0c4d8836e7 | ||
|
|
ef67e07732 | ||
|
|
7e885a4ddd | ||
|
|
a3c1f42708 | ||
|
|
d3ef5a3acb | ||
|
|
5098d63a22 | ||
|
|
4275a73170 | ||
|
|
78a157d675 | ||
|
|
97a437e8e6 | ||
|
|
3c37f290a8 | ||
|
|
dcd5d470e0 | ||
|
|
b424f3b60f | ||
|
|
201ea9a9f0 | ||
|
|
2469af6c3f | ||
|
|
bfe6e06b5a | ||
|
|
091b5fbe30 | ||
|
|
93168e6018 | ||
|
|
16ed081818 | ||
|
|
c38b4b29cf | ||
|
|
a20b88d114 | ||
|
|
87912a3b3f | ||
|
|
53bde1238c | ||
|
|
fd365c27e2 | ||
|
|
4f43841699 | ||
|
|
e60e97c03f | ||
|
|
e619f8ca83 | ||
|
|
cf2f538167 | ||
|
|
17e1a6dbe8 | ||
|
|
74f6af8686 | ||
|
|
351236f526 | ||
|
|
51ad056710 | ||
|
|
6512b7f925 | ||
|
|
c7264e3f1f | ||
|
|
349ec35c48 | ||
|
|
057dd5b0a8 | ||
|
|
f6ac7cb1a1 | ||
|
|
c1958daf65 | ||
|
|
ee73c9b436 | ||
|
|
fac5e727e6 | ||
|
|
977264f55b | ||
|
|
e776e679af | ||
|
|
23901dfd45 | ||
|
|
87444e1a45 | ||
|
|
dc63bc2bd9 | ||
|
|
f4ff4f29b1 | ||
|
|
06412d5f12 | ||
|
|
bbc84903a7 | ||
|
|
e014592ea0 | ||
|
|
4305ffde18 | ||
|
|
0588dcb3e9 | ||
|
|
58afd8c364 | ||
|
|
e120d63ee2 | ||
|
|
d7f43eba6a | ||
|
|
786a92669e | ||
|
|
504aead673 | ||
|
|
8c72ffc583 | ||
|
|
27d3311b6a | ||
|
|
5e2f113d50 | ||
|
|
55e7b8764e | ||
|
|
513c0ae64d | ||
|
|
f0f6a1e382 | ||
|
|
6f3fb587e2 | ||
|
|
083c5b703a | ||
|
|
3583c56067 | ||
|
|
9999199d2b | ||
|
|
c084e358bd | ||
|
|
238d45a2cb | ||
|
|
21d056c470 | ||
|
|
0308d4de62 | ||
|
|
f2a6f6ce6a | ||
|
|
cf5d6b5bc8 | ||
|
|
7a6b64b2f6 | ||
|
|
bca11bd21e | ||
|
|
bf39a31907 |
18
.github/CONTRIBUTING.md
vendored
18
.github/CONTRIBUTING.md
vendored
@@ -1,8 +1,8 @@
|
|||||||
# Contributing to Lodash
|
# Contributing to Lodash
|
||||||
|
|
||||||
Contributions are always welcome. Before contributing please read the
|
Contributions are always welcome. Before contributing please read the
|
||||||
[code of conduct](https://github.com/lodash/lodash/blob/master/CODE_OF_CONDUCT.md)
|
[code of conduct](https://github.com/openjs-foundation/cross-project-council/blob/main/CODE_OF_CONDUCT.md) &
|
||||||
& [search the issue tracker](https://github.com/lodash/lodash/issues); your issue
|
[search the issue tracker](https://github.com/lodash/lodash/issues); your issue
|
||||||
may have already been discussed or fixed in `master`. To contribute,
|
may have already been discussed or fixed in `master`. To contribute,
|
||||||
[fork](https://help.github.com/articles/fork-a-repo/) Lodash, commit your changes,
|
[fork](https://help.github.com/articles/fork-a-repo/) Lodash, commit your changes,
|
||||||
& [send a pull request](https://help.github.com/articles/using-pull-requests/).
|
& [send a pull request](https://help.github.com/articles/using-pull-requests/).
|
||||||
@@ -13,8 +13,8 @@ Feature requests should be submitted in the
|
|||||||
[issue tracker](https://github.com/lodash/lodash/issues), with a description of
|
[issue tracker](https://github.com/lodash/lodash/issues), with a description of
|
||||||
the expected behavior & use case, where they’ll remain closed until sufficient interest,
|
the expected behavior & use case, where they’ll remain closed until sufficient interest,
|
||||||
[e.g. :+1: reactions](https://help.github.com/articles/about-discussions-in-issues-and-pull-requests/),
|
[e.g. :+1: reactions](https://help.github.com/articles/about-discussions-in-issues-and-pull-requests/),
|
||||||
has been shown by the community. Before submitting a request, please search for
|
has been [shown by the community](https://github.com/lodash/lodash/issues?q=label%3A%22votes+needed%22+sort%3Areactions-%2B1-desc).
|
||||||
similar ones in the
|
Before submitting a request, please search for similar ones in the
|
||||||
[closed issues](https://github.com/lodash/lodash/issues?q=is%3Aissue+is%3Aclosed+label%3Aenhancement).
|
[closed issues](https://github.com/lodash/lodash/issues?q=is%3Aissue+is%3Aclosed+label%3Aenhancement).
|
||||||
|
|
||||||
## Pull Requests
|
## Pull Requests
|
||||||
@@ -31,12 +31,12 @@ Run unit tests from the command-line via `npm test`, or open `test/index.html` &
|
|||||||
|
|
||||||
## Contributor License Agreement
|
## Contributor License Agreement
|
||||||
|
|
||||||
Lodash is a member of the [jQuery Foundation](https://jquery.org/).
|
Lodash is a member of the [Open JS Foundation](https://openjsf.org/).
|
||||||
As such, we request that all contributors sign the jQuery Foundation
|
As such, we request that all contributors sign our
|
||||||
[contributor license agreement (CLA)](https://contribute.jquery.org/CLA/).
|
[contributor license agreement (CLA)](https://openjsf.org/cla).
|
||||||
|
|
||||||
For more information about CLAs, please check out Alex Russell’s excellent post,
|
For more information about CLAs, please check out Alex Russell’s excellent post,
|
||||||
[“Why Do I Need to Sign This?”](http://infrequently.org/2008/06/why-do-i-need-to-sign-this/).
|
[“Why Do I Need to Sign This?”](https://infrequently.org/2008/06/why-do-i-need-to-sign-this/).
|
||||||
|
|
||||||
## Coding Guidelines
|
## Coding Guidelines
|
||||||
|
|
||||||
@@ -48,7 +48,7 @@ established in the code.
|
|||||||
|
|
||||||
- **Naming**:<br>
|
- **Naming**:<br>
|
||||||
Keep variable & method names concise & descriptive.<br>
|
Keep variable & method names concise & descriptive.<br>
|
||||||
Variable names `index`, `collection`, & `callback` are preferable to
|
Variable names `index`, `array`, & `iteratee` are preferable to
|
||||||
`i`, `arr`, & `fn`.
|
`i`, `arr`, & `fn`.
|
||||||
|
|
||||||
- **Quotes**:<br>
|
- **Quotes**:<br>
|
||||||
|
|||||||
39
.github/workflows/browser-testing.yml
vendored
Normal file
39
.github/workflows/browser-testing.yml
vendored
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
name: CI Browsers
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ main ]
|
||||||
|
pull_request:
|
||||||
|
# Run on every PR, regardless of branch
|
||||||
|
branches: [ '*' ]
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test-docs:
|
||||||
|
name: Modern Browsers Test
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install Node
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: '24'
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
npm install
|
||||||
|
npx playwright install --with-deps
|
||||||
|
npm install -D @playwright/test@latest
|
||||||
|
|
||||||
|
- name: Build project
|
||||||
|
run: npm run build
|
||||||
|
|
||||||
|
- name: Start server
|
||||||
|
run: |
|
||||||
|
npx http-server -p 9001 &
|
||||||
|
sleep 2
|
||||||
|
|
||||||
|
- name: Run Playwright tests
|
||||||
|
run: npx playwright test
|
||||||
34
.github/workflows/ci-bun.yml
vendored
Normal file
34
.github/workflows/ci-bun.yml
vendored
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
name: CI Bun
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ main ]
|
||||||
|
pull_request:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
name: Bun CI
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
bun-version: [1.0.0, 1.1.0, 1.2.0, 1.3.0]
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Setup Bun
|
||||||
|
uses: oven-sh/setup-bun@v1
|
||||||
|
with:
|
||||||
|
bun-version: ${{ matrix.bun-version }}
|
||||||
|
|
||||||
|
# TODO: Remove this step once the lockfile has been updated to v3 in the repository
|
||||||
|
- name: Install npm dependencies (lockfile v3)
|
||||||
|
run: npm i --lockfile-version 3 --package-lock-only
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: bun install
|
||||||
|
|
||||||
|
- name: Run validate
|
||||||
|
run: bun run validate
|
||||||
32
.github/workflows/ci-docs.yml
vendored
Normal file
32
.github/workflows/ci-docs.yml
vendored
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
name: CI Docs
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ main ]
|
||||||
|
pull_request:
|
||||||
|
# Run on every PR, regardless of branch
|
||||||
|
branches: [ '*' ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test-docs:
|
||||||
|
name: Docs Test
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Setup Node.js (latest)
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: 'node' # Use 'node' for the latest version
|
||||||
|
cache: 'npm'
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: npm install
|
||||||
|
|
||||||
|
- name: Test documentation
|
||||||
|
run: |
|
||||||
|
npm run doc:fp
|
||||||
|
npm run doc:site
|
||||||
|
npm run doc
|
||||||
61
.github/workflows/ci-node.yml
vendored
Normal file
61
.github/workflows/ci-node.yml
vendored
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
name: CI Node.js
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ main ]
|
||||||
|
pull_request:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
name: Node.js ${{ matrix.node-version }} on ${{ matrix.os }}
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
os: [ubuntu-latest]
|
||||||
|
node-version: [
|
||||||
|
'4',
|
||||||
|
'5',
|
||||||
|
'6',
|
||||||
|
'7',
|
||||||
|
'8',
|
||||||
|
'9',
|
||||||
|
'10',
|
||||||
|
'11',
|
||||||
|
'12',
|
||||||
|
'13',
|
||||||
|
'14',
|
||||||
|
'15',
|
||||||
|
'16',
|
||||||
|
'17',
|
||||||
|
'18',
|
||||||
|
'19',
|
||||||
|
'20',
|
||||||
|
'21',
|
||||||
|
'22',
|
||||||
|
'23',
|
||||||
|
'24',
|
||||||
|
'25'
|
||||||
|
]
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Setup Node.js ${{ matrix.node-version }}
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: ${{ matrix.node-version }}
|
||||||
|
cache: 'npm'
|
||||||
|
|
||||||
|
# This is due to bugs in npm 3’s handling of newer package formats.
|
||||||
|
- name: Use npm@3.10.10 for Node@5
|
||||||
|
if: matrix.node-version == '5'
|
||||||
|
run: npm install -g npm@3.10.10
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: npm install
|
||||||
|
|
||||||
|
- name: Run Validate
|
||||||
|
run: npm run validate
|
||||||
73
.github/workflows/codeql.yml
vendored
Normal file
73
.github/workflows/codeql.yml
vendored
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
# For most projects, this workflow file will not need changing; you simply need
|
||||||
|
# to commit it to your repository.
|
||||||
|
#
|
||||||
|
# You may wish to alter this file to override the set of languages analyzed,
|
||||||
|
# or to provide custom queries or build logic.
|
||||||
|
#
|
||||||
|
# ******** NOTE ********
|
||||||
|
# We have attempted to detect the languages in your repository. Please check
|
||||||
|
# the `language` matrix defined below to confirm you have the correct set of
|
||||||
|
# supported CodeQL languages.
|
||||||
|
#
|
||||||
|
name: "CodeQL"
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: ["main"]
|
||||||
|
pull_request:
|
||||||
|
# The branches below must be a subset of the branches above
|
||||||
|
branches: ["main"]
|
||||||
|
schedule:
|
||||||
|
- cron: "0 0 * * 1"
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
analyze:
|
||||||
|
name: Analyze
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
actions: read
|
||||||
|
contents: read
|
||||||
|
security-events: write
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
language: ["javascript"]
|
||||||
|
# CodeQL supports [ $supported-codeql-languages ]
|
||||||
|
# Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
|
|
||||||
|
# Initializes the CodeQL tools for scanning.
|
||||||
|
- name: Initialize CodeQL
|
||||||
|
uses: github/codeql-action/init@42213152a85ae7569bdb6bec7bcd74cd691bfe41 # v3.30.9
|
||||||
|
with:
|
||||||
|
languages: ${{ matrix.language }}
|
||||||
|
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||||
|
# By default, queries listed here will override any specified in a config file.
|
||||||
|
# Prefix the list here with "+" to use these queries and those in the config file.
|
||||||
|
|
||||||
|
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||||
|
# If this step fails, then you should remove it and run the build manually (see below)
|
||||||
|
- name: Autobuild
|
||||||
|
uses: github/codeql-action/autobuild@42213152a85ae7569bdb6bec7bcd74cd691bfe41 # v3.30.9
|
||||||
|
|
||||||
|
# ℹ️ Command-line programs to run using the OS shell.
|
||||||
|
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
|
||||||
|
|
||||||
|
# If the Autobuild fails above, remove it and uncomment the following three lines.
|
||||||
|
# modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.
|
||||||
|
|
||||||
|
# - run: |
|
||||||
|
# echo "Run, Build Application using script"
|
||||||
|
# ./location_of_script_within_repo/buildscript.sh
|
||||||
|
|
||||||
|
- name: Perform CodeQL Analysis
|
||||||
|
uses: github/codeql-action/analyze@42213152a85ae7569bdb6bec7bcd74cd691bfe41 # v3.30.9
|
||||||
|
with:
|
||||||
|
category: "/language:${{matrix.language}}"
|
||||||
19
.github/workflows/renovate.yml
vendored
Normal file
19
.github/workflows/renovate.yml
vendored
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
name: Renovate
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '0 23 1 * *' # 23:00 on the first day of each month
|
||||||
|
workflow_dispatch: # allow manual runs
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
renovate:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v5.0.0
|
||||||
|
- name: Self-hosted Renovate
|
||||||
|
uses: renovatebot/github-action@v44.0.0
|
||||||
|
with:
|
||||||
|
configurationFile: renovate.json
|
||||||
|
env:
|
||||||
|
RENOVATE_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
LOG_LEVEL: info
|
||||||
58
.github/workflows/scorecards.yml
vendored
Normal file
58
.github/workflows/scorecards.yml
vendored
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
name: Scorecard supply-chain security
|
||||||
|
on:
|
||||||
|
# For Branch-Protection check. Only the default branch is supported. See
|
||||||
|
# https://github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection
|
||||||
|
branch_protection_rule:
|
||||||
|
# To guarantee Maintained check is occasionally updated. See
|
||||||
|
# https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained
|
||||||
|
schedule:
|
||||||
|
- cron: '20 7 * * 2'
|
||||||
|
push:
|
||||||
|
branches: ["main"]
|
||||||
|
|
||||||
|
# Declare default permissions as read only.
|
||||||
|
permissions: read-all
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
analysis:
|
||||||
|
name: Scorecard analysis
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
# Needed to upload the results to code-scanning dashboard.
|
||||||
|
security-events: write
|
||||||
|
# Needed to publish results and get a badge (see publish_results below).
|
||||||
|
id-token: write
|
||||||
|
contents: read
|
||||||
|
actions: read
|
||||||
|
# To allow GraphQL ListCommits to work
|
||||||
|
issues: read
|
||||||
|
pull-requests: read
|
||||||
|
# To detect SAST tools
|
||||||
|
checks: read
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: "Checkout code"
|
||||||
|
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
|
with:
|
||||||
|
persist-credentials: false
|
||||||
|
|
||||||
|
- name: "Run analysis"
|
||||||
|
uses: ossf/scorecard-action@62b2cac7ed8198b15735ed49ab1e5cf35480ba46 # v2.4.0
|
||||||
|
with:
|
||||||
|
results_file: results.sarif
|
||||||
|
results_format: sarif
|
||||||
|
publish_results: true
|
||||||
|
|
||||||
|
# Upload the results as artifacts so they can be downloaded later if needed.
|
||||||
|
- name: "Upload artifact"
|
||||||
|
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
||||||
|
with:
|
||||||
|
name: SARIF file
|
||||||
|
path: results.sarif
|
||||||
|
retention-days: 5
|
||||||
|
|
||||||
|
# Upload the results to GitHub's code scanning dashboard.
|
||||||
|
- name: "Upload to code-scanning"
|
||||||
|
uses: github/codeql-action/upload-sarif@42213152a85ae7569bdb6bec7bcd74cd691bfe41 # v3.30.9
|
||||||
|
with:
|
||||||
|
sarif_file: results.sarif
|
||||||
7
.gitignore
vendored
7
.gitignore
vendored
@@ -1,9 +1,4 @@
|
|||||||
.DS_Store
|
.DS_Store
|
||||||
*.custom.*
|
|
||||||
*.log
|
*.log
|
||||||
*.map
|
doc/*.html
|
||||||
lodash.compat.min.js
|
|
||||||
coverage
|
|
||||||
node_modules
|
node_modules
|
||||||
.opt-in
|
|
||||||
.opt-out
|
|
||||||
|
|||||||
181
.jscsrc
181
.jscsrc
@@ -1,96 +1,97 @@
|
|||||||
{
|
{
|
||||||
"maxErrors": "2000",
|
"maxErrors": "2000",
|
||||||
"maximumLineLength": {
|
"maximumLineLength": {
|
||||||
"value": 180,
|
"value": 180,
|
||||||
"allExcept": ["comments", "functionSignature", "regex"]
|
"allExcept": ["comments", "functionSignature", "regex"]
|
||||||
},
|
},
|
||||||
"requireCurlyBraces": [
|
"requireCurlyBraces": [
|
||||||
"if",
|
"if",
|
||||||
"else",
|
"else",
|
||||||
"for",
|
"for",
|
||||||
"while",
|
"while",
|
||||||
"do",
|
"do",
|
||||||
"try",
|
"try",
|
||||||
"catch"
|
"catch"
|
||||||
],
|
],
|
||||||
"requireOperatorBeforeLineBreak": [
|
"requireOperatorBeforeLineBreak": [
|
||||||
"=",
|
"=",
|
||||||
"+",
|
"+",
|
||||||
"-",
|
"-",
|
||||||
"/",
|
"/",
|
||||||
"*",
|
"*",
|
||||||
"==",
|
"==",
|
||||||
"===",
|
"===",
|
||||||
"!=",
|
"!=",
|
||||||
"!==",
|
"!==",
|
||||||
">",
|
">",
|
||||||
">=",
|
">=",
|
||||||
"<",
|
"<",
|
||||||
"<="
|
"<="
|
||||||
],
|
],
|
||||||
"requireSpaceAfterKeywords": [
|
"requireSpaceAfterKeywords": [
|
||||||
"if",
|
"if",
|
||||||
"else",
|
"else",
|
||||||
"for",
|
"for",
|
||||||
"while",
|
"while",
|
||||||
"do",
|
"do",
|
||||||
"switch",
|
"switch",
|
||||||
"return",
|
"return",
|
||||||
"try",
|
"try",
|
||||||
"catch"
|
"catch"
|
||||||
],
|
],
|
||||||
"requireSpaceBeforeBinaryOperators": [
|
"requireSpaceBeforeBinaryOperators": [
|
||||||
"=", "+=", "-=", "*=", "/=", "%=", "<<=", ">>=", ">>>=",
|
"=", "+=", "-=", "*=", "/=", "%=", "<<=", ">>=", ">>>=",
|
||||||
"&=", "|=", "^=", "+=",
|
"&=", "|=", "^=",
|
||||||
|
|
||||||
"+", "-", "*", "/", "%", "<<", ">>", ">>>", "&",
|
"+", "-", "*", "/", "%", "<<", ">>", ">>>", "&",
|
||||||
"|", "^", "&&", "||", "===", "==", ">=",
|
"|", "^", "&&", "||", "===", "==", ">=",
|
||||||
"<=", "<", ">", "!=", "!=="
|
"<=", "<", ">", "!=", "!=="
|
||||||
],
|
],
|
||||||
"requireSpacesInFunctionExpression": {
|
"requireSpacesInFunctionExpression": {
|
||||||
"beforeOpeningCurlyBrace": true
|
"beforeOpeningCurlyBrace": true
|
||||||
},
|
},
|
||||||
"requireCamelCaseOrUpperCaseIdentifiers": true,
|
"requireCamelCaseOrUpperCaseIdentifiers": true,
|
||||||
"requireDotNotation": { "allExcept": ["keywords"] },
|
"requireDotNotation": { "allExcept": ["keywords"] },
|
||||||
"requireEarlyReturn": true,
|
"requireEarlyReturn": true,
|
||||||
"requireLineFeedAtFileEnd": true,
|
"requireLineFeedAtFileEnd": true,
|
||||||
"requireSemicolons": true,
|
"requireSemicolons": true,
|
||||||
"requireSpaceAfterBinaryOperators": true,
|
"requireSpaceAfterBinaryOperators": true,
|
||||||
"requireSpacesInConditionalExpression": true,
|
"requireSpacesInConditionalExpression": true,
|
||||||
"requireSpaceBeforeObjectValues": true,
|
"requireSpaceBeforeObjectValues": true,
|
||||||
"requireSpaceBeforeBlockStatements": true,
|
"requireSpaceBeforeBlockStatements": true,
|
||||||
"requireSpacesInForStatement": true,
|
"requireSpacesInForStatement": true,
|
||||||
|
|
||||||
"validateIndentation": 2,
|
"validateIndentation": 2,
|
||||||
"validateParameterSeparator": ", ",
|
"validateParameterSeparator": ", ",
|
||||||
"validateQuoteMarks": { "mark": "'", "escape": true },
|
"validateQuoteMarks": { "mark": "'", "escape": true },
|
||||||
|
|
||||||
"disallowSpacesInAnonymousFunctionExpression": {
|
"disallowSpacesInAnonymousFunctionExpression": {
|
||||||
"beforeOpeningRoundBrace": true
|
"beforeOpeningRoundBrace": true
|
||||||
},
|
},
|
||||||
"disallowSpacesInFunctionDeclaration": {
|
"disallowSpacesInFunctionDeclaration": {
|
||||||
"beforeOpeningRoundBrace": true
|
"beforeOpeningRoundBrace": true
|
||||||
},
|
},
|
||||||
"disallowSpacesInFunctionExpression": {
|
"disallowSpacesInFunctionExpression": {
|
||||||
"beforeOpeningRoundBrace": true
|
"beforeOpeningRoundBrace": true
|
||||||
},
|
},
|
||||||
"disallowKeywords": ["with"],
|
"disallowKeywords": ["with"],
|
||||||
"disallowMixedSpacesAndTabs": true,
|
"disallowMixedSpacesAndTabs": true,
|
||||||
"disallowMultipleLineBreaks": true,
|
"disallowMultipleLineBreaks": true,
|
||||||
"disallowNewlineBeforeBlockStatements": true,
|
"disallowNewlineBeforeBlockStatements": true,
|
||||||
"disallowSpaceAfterObjectKeys": true,
|
"disallowSpaceAfterObjectKeys": true,
|
||||||
"disallowSpaceAfterPrefixUnaryOperators": true,
|
"disallowSpaceAfterPrefixUnaryOperators": true,
|
||||||
"disallowSpacesInCallExpression": true,
|
"disallowSpacesInCallExpression": true,
|
||||||
"disallowSpacesInsideArrayBrackets": true,
|
"disallowSpacesInsideArrayBrackets": true,
|
||||||
"disallowSpacesInsideParentheses": true,
|
"disallowSpacesInsideParentheses": true,
|
||||||
"disallowTrailingWhitespace": true,
|
"disallowTrailingWhitespace": true,
|
||||||
|
"disallowUnusedVariables": true,
|
||||||
|
|
||||||
"jsDoc": {
|
"jsDoc": {
|
||||||
"checkRedundantAccess": true,
|
"checkRedundantAccess": true,
|
||||||
"checkTypes": true,
|
"checkTypes": true,
|
||||||
"requireNewlineAfterDescription": true,
|
"requireNewlineAfterDescription": true,
|
||||||
"requireParamDescription": true,
|
"requireParamDescription": true,
|
||||||
"requireParamTypes": true,
|
"requireParamTypes": true,
|
||||||
"requireReturnTypes": true
|
"requireReturnTypes": true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
11
.markdown-doctest-setup.js
Normal file
11
.markdown-doctest-setup.js
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
delete global['__core-js_shared__'];
|
||||||
|
|
||||||
|
const _ = require('./lodash.js');
|
||||||
|
const globals = require('lodash-doc-globals');
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
'babel': false,
|
||||||
|
'globals': _.assign({ '_': _ }, globals)
|
||||||
|
};
|
||||||
77
.travis.yml
77
.travis.yml
@@ -1,77 +0,0 @@
|
|||||||
language: node_js
|
|
||||||
sudo: false
|
|
||||||
node_js:
|
|
||||||
- "5"
|
|
||||||
env:
|
|
||||||
global:
|
|
||||||
- BIN="node" ISTANBUL=false OPTION=""
|
|
||||||
- SAUCE_LABS=false SAUCE_USERNAME="lodash"
|
|
||||||
- secure: "tg1JFsIFnxzLaTboFPOnm+aJCuMm5+JdhLlESlqg9x3fwro++7KCnwHKLNovhchaPe4otC43ZMB/nfWhDnDm11dKbm/V6HlTkED+dadTsaLxVDg6J+7yK41QhokBPJOxLV78iDaNaAQVYEirAgZ0yn8kFubxmNKV+bpCGQNc9yU="
|
|
||||||
matrix:
|
|
||||||
-
|
|
||||||
- BIN="phantomjs"
|
|
||||||
- ISTANBUL=true
|
|
||||||
- SAUCE_LABS=true
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- node_js: "0.10"
|
|
||||||
env:
|
|
||||||
- node_js: "0.12"
|
|
||||||
env:
|
|
||||||
- node_js: "4"
|
|
||||||
env:
|
|
||||||
git:
|
|
||||||
depth: 10
|
|
||||||
branches:
|
|
||||||
only:
|
|
||||||
- master
|
|
||||||
notifications:
|
|
||||||
webhooks:
|
|
||||||
urls:
|
|
||||||
- https://webhooks.gitter.im/e/4aab6358b0e9aed0b628
|
|
||||||
on_success: change
|
|
||||||
on_failure: always
|
|
||||||
before_install:
|
|
||||||
- "nvm use $TRAVIS_NODE_VERSION"
|
|
||||||
- "npm set loglevel error"
|
|
||||||
- "npm set progress false"
|
|
||||||
- "npm i -g npm@\"^2.0.0\""
|
|
||||||
- |
|
|
||||||
PATTERN[0]="|\s*if\s*\(isHostObject\b[\s\S]+?\}(?=\n)|"
|
|
||||||
PATTERN[1]="|\s*if\s*\(enumerate\b[\s\S]+?\};\s*\}|"
|
|
||||||
PATTERN[2]="|\s*while\s*\([^)]+\)\s*\{\s*iteratee\(index\);\s*\}|"
|
|
||||||
PATTERN[3]="|\s*else\s*\{\s*assocSet\(data\b[\s\S]+?\}|"
|
|
||||||
PATTERN[4]="|\bcase\s+(?:dataView|set|map|weakMap)CtorString:.+|g"
|
|
||||||
PATTERN[5]="|\bindex,\s*iterable\)\s*===\s*false\)[^}]+?(break;)|"
|
|
||||||
PATTERN[6]="|\s*if\s*\(\!lodashFunc\)\s*\{\s*return;\s*\}|"
|
|
||||||
PATTERN[7]="|\s*define\([\s\S]+?\);|"
|
|
||||||
PATTERN[8]="|\s*root\._\s*=\s*_;|"
|
|
||||||
|
|
||||||
if [ $ISTANBUL == true ]; then
|
|
||||||
set -e
|
|
||||||
for PTRN in ${PATTERN[@]}; do
|
|
||||||
node ./test/remove.js "$PTRN" ./lodash.js
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
- "git clone --depth=10 --branch=master git://github.com/lodash/lodash-cli ./node_modules/lodash-cli && mkdir $_/node_modules && cd $_ && ln -s ../../../ ./lodash && cd ../ && npm i && cd ../../"
|
|
||||||
- "node ./node_modules/lodash-cli/bin/lodash -o ./dist/lodash.js"
|
|
||||||
script:
|
|
||||||
- "[ $ISTANBUL == false ] || istanbul cover -x \"**/vendor/**\" --report lcovonly ./test/test.js -- ./lodash.js"
|
|
||||||
- "[ $ISTANBUL == false ] || [ $TRAVIS_SECURE_ENV_VARS == false ] || (cat ./coverage/lcov.info | coveralls) || true"
|
|
||||||
- "[ $ISTANBUL == false ] || [ $TRAVIS_SECURE_ENV_VARS == false ] || (cat ./coverage/coverage.json | codecov) || true"
|
|
||||||
- "[ $SAUCE_LABS == true ] || [ $ISTANBUL == true ] || cd ./test"
|
|
||||||
- "[ $SAUCE_LABS == true ] || [ $ISTANBUL == true ] || $BIN $OPTION ./test.js ../lodash.js"
|
|
||||||
- "[ $SAUCE_LABS == true ] || [ $ISTANBUL == true ] || [ $TRAVIS_SECURE_ENV_VARS == false ] || $BIN $OPTION ./test.js ../dist/lodash.min.js"
|
|
||||||
- "[ $SAUCE_LABS == false ] || rm -rf ./node_modules/lodash"
|
|
||||||
- "[ $SAUCE_LABS == false ] || ($BIN ./node_modules/lodash-cli/bin/lodash modularize exports=node -o ./node_modules/lodash && node ./node_modules/lodash-cli/bin/lodash -d -o ./node_modules/lodash/lodash.js)"
|
|
||||||
- "[ $SAUCE_LABS == false ] || $BIN ./node_modules/lodash-cli/bin/lodash core -o ./dist/lodash.core.js"
|
|
||||||
- "[ $SAUCE_LABS == false ] || npm run build"
|
|
||||||
- "[ $SAUCE_LABS == false ] || $BIN ./test/saucelabs.js name=\"lodash tests\" runner=\"test/index.html?build=../dist/lodash.js&noglobals=true\" tags=\"development\""
|
|
||||||
- "[ $SAUCE_LABS == false ] || $BIN ./test/saucelabs.js name=\"lodash tests\" runner=\"test/index.html?build=../dist/lodash.min.js&noglobals=true\" tags=\"production\""
|
|
||||||
- "[ $SAUCE_LABS == false ] || $BIN ./test/saucelabs.js name=\"lodash-fp tests\" runner=\"test/fp.html?noglobals=true\" tags=\"development\""
|
|
||||||
- "[ $SAUCE_LABS == false ] || $BIN ./test/saucelabs.js name=\"underscore tests\" runner=\"test/underscore.html?build=../dist/lodash.js\" tags=\"development,underscore\""
|
|
||||||
- "[ $SAUCE_LABS == false ] || $BIN ./test/saucelabs.js name=\"underscore tests\" runner=\"test/underscore.html?build=../dist/lodash.min.js\" tags=\"production,underscore\""
|
|
||||||
- "[ $SAUCE_LABS == false ] || $BIN ./test/saucelabs.js name=\"backbone tests\" runner=\"test/backbone.html?build=../dist/lodash.js\" tags=\"development,backbone\""
|
|
||||||
- "[ $SAUCE_LABS == false ] || $BIN ./test/saucelabs.js name=\"backbone tests\" runner=\"test/backbone.html?build=../dist/lodash.min.js\" tags=\"production,backbone\""
|
|
||||||
- "[ $SAUCE_LABS == false ] || $BIN ./test/saucelabs.js name=\"backbone tests\" runner=\"test/backbone.html?build=../dist/lodash.core.js\" tags=\"development,backbone\""
|
|
||||||
- "[ $SAUCE_LABS == false ] || $BIN ./test/saucelabs.js name=\"backbone tests\" runner=\"test/backbone.html?build=../dist/lodash.core.min.js\" tags=\"production,backbone\""
|
|
||||||
@@ -1,74 +0,0 @@
|
|||||||
# Contributor Covenant Code of Conduct
|
|
||||||
|
|
||||||
## Our Pledge
|
|
||||||
|
|
||||||
In the interest of fostering an open and welcoming environment, we as
|
|
||||||
contributors and maintainers pledge to making participation in our project and
|
|
||||||
our community a harassment-free experience for everyone, regardless of age, body
|
|
||||||
size, disability, ethnicity, gender identity and expression, level of experience,
|
|
||||||
nationality, personal appearance, race, religion, or sexual identity and
|
|
||||||
orientation.
|
|
||||||
|
|
||||||
## Our Standards
|
|
||||||
|
|
||||||
Examples of behavior that contributes to creating a positive environment
|
|
||||||
include:
|
|
||||||
|
|
||||||
* Using welcoming and inclusive language
|
|
||||||
* Being respectful of differing viewpoints and experiences
|
|
||||||
* Gracefully accepting constructive criticism
|
|
||||||
* Focusing on what is best for the community
|
|
||||||
* Showing empathy towards other community members
|
|
||||||
|
|
||||||
Examples of unacceptable behavior by participants include:
|
|
||||||
|
|
||||||
* The use of sexualized language or imagery and unwelcome sexual attention or
|
|
||||||
advances
|
|
||||||
* Trolling, insulting/derogatory comments, and personal or political attacks
|
|
||||||
* Public or private harassment
|
|
||||||
* Publishing others' private information, such as a physical or electronic
|
|
||||||
address, without explicit permission
|
|
||||||
* Other conduct which could reasonably be considered inappropriate in a
|
|
||||||
professional setting
|
|
||||||
|
|
||||||
## Our Responsibilities
|
|
||||||
|
|
||||||
Project maintainers are responsible for clarifying the standards of acceptable
|
|
||||||
behavior and are expected to take appropriate and fair corrective action in
|
|
||||||
response to any instances of unacceptable behavior.
|
|
||||||
|
|
||||||
Project maintainers have the right and responsibility to remove, edit, or
|
|
||||||
reject comments, commits, code, wiki edits, issues, and other contributions
|
|
||||||
that are not aligned to this Code of Conduct, or to ban temporarily or
|
|
||||||
permanently any contributor for other behaviors that they deem inappropriate,
|
|
||||||
threatening, offensive, or harmful.
|
|
||||||
|
|
||||||
## Scope
|
|
||||||
|
|
||||||
This Code of Conduct applies both within project spaces and in public spaces
|
|
||||||
when an individual is representing the project or its community. Examples of
|
|
||||||
representing a project or community include using an official project e-mail
|
|
||||||
address, posting via an official social media account, or acting as an appointed
|
|
||||||
representative at an online or offline event. Representation of a project may be
|
|
||||||
further defined and clarified by project maintainers.
|
|
||||||
|
|
||||||
## Enforcement
|
|
||||||
|
|
||||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
|
||||||
reported by contacting the project team at [coc@lodash.com](mailto:coc@lodash.com).
|
|
||||||
The project team will review and investigate all complaints, and will respond in
|
|
||||||
a way that it deems appropriate to the circumstances. The project team is obligated
|
|
||||||
to maintain confidentiality with regard to the reporter of an incident. Further
|
|
||||||
details of specific enforcement policies may be posted separately.
|
|
||||||
|
|
||||||
Project maintainers who do not follow or enforce the Code of Conduct in good
|
|
||||||
faith may face temporary or permanent repercussions as determined by other
|
|
||||||
members of the project's leadership.
|
|
||||||
|
|
||||||
## Attribution
|
|
||||||
|
|
||||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
|
|
||||||
available at [http://contributor-covenant.org/version/1/4][version]
|
|
||||||
|
|
||||||
[homepage]: http://contributor-covenant.org
|
|
||||||
[version]: http://contributor-covenant.org/version/1/4/
|
|
||||||
25
GOVERNANCE.md
Normal file
25
GOVERNANCE.md
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
> [!IMPORTANT]
|
||||||
|
> As announced on the [OpenJS Foundation blog](https://openjsf.org/blog/sta-supports-lodash), Lodash has received support from the Sovereign Tech Agency and will transition to the Feature-Complete maturity stage so that it remains stable, secure, and sustainable long-term. As part of this effort, Lodash is rebooting its governance. A draft charter will be published shortly. The upcoming Technical Steering Committee (TSC) is already at work. For transparency, its members are listed below.
|
||||||
|
|
||||||
|
# Lodash Governance
|
||||||
|
|
||||||
|
## Technical Steering Committee Members
|
||||||
|
|
||||||
|
The current Technical Steering Committee (TSC) members are:
|
||||||
|
|
||||||
|
- John-David Dalton ([@jdalton](https://github.com/jdalton)), _(Lodash creator)_
|
||||||
|
- Jon Church ([@jonchurch](https://github.com/jonchurch))
|
||||||
|
- Jordan Harband ([@ljharb](https://github.com/ljharb))
|
||||||
|
- Michał Lipiński ([@falsyvalues](https://github.com/falsyvalues))
|
||||||
|
- Tobie Langel ([@tobie](https://github.com/tobie))
|
||||||
|
- Ulises Gascón ([@ulisesgascon](https://github.com/UlisesGascon))
|
||||||
|
|
||||||
|
## Security Triage Team
|
||||||
|
|
||||||
|
The Security Triage Team is responsible for assessing and managing vulnerability and incident reports. Security triaging is currently handled by the [TSC](#technical-steering-committee-members).
|
||||||
|
|
||||||
|
## Release Team
|
||||||
|
|
||||||
|
The Release Team is solely responsible for publishing new versions of Lodash to npm. Its current member is:
|
||||||
|
|
||||||
|
- John-David Dalton ([@jdalton](https://github.com/jdalton))
|
||||||
2
LICENSE
2
LICENSE
@@ -1,4 +1,4 @@
|
|||||||
Copyright jQuery Foundation and other contributors <https://jquery.org/>
|
Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
|
||||||
|
|
||||||
Based on Underscore.js, copyright Jeremy Ashkenas,
|
Based on Underscore.js, copyright Jeremy Ashkenas,
|
||||||
DocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>
|
DocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>
|
||||||
|
|||||||
82
README.md
82
README.md
@@ -1,52 +1,86 @@
|
|||||||
# lodash v4.8.0
|
# lodash v4.17.21
|
||||||
|
|
||||||
|
[Site](https://lodash.com/) |
|
||||||
|
[Docs](https://lodash.com/docs) |
|
||||||
|
[FP Guide](https://github.com/lodash/lodash/wiki/FP-Guide) |
|
||||||
|
[Contributing](https://github.com/lodash/lodash/blob/master/.github/CONTRIBUTING.md) |
|
||||||
|
[Wiki](https://github.com/lodash/lodash/wiki "Changelog, Roadmap, etc.") |
|
||||||
|
[Code of Conduct](https://github.com/openjs-foundation/cross-project-council/blob/main/CODE_OF_CONDUCT.md) |
|
||||||
|
[Governance](https://github.com/lodash/lodash/blob/HEAD/GOVERNANCE.md) |
|
||||||
|
[Twitter](https://twitter.com/bestiejs) |
|
||||||
|
[Chat](https://gitter.im/lodash/lodash)
|
||||||
|
|
||||||
|
> [!IMPORTANT]
|
||||||
|
> As announced on the [OpenJS Foundation blog](https://openjsf.org/blog/sta-supports-lodash), Lodash has received support from the Sovereign Tech Agency and will transition to the Feature-Complete maturity stage so that it remains stable, secure, and sustainable long-term. As part of this effort, Lodash is rebooting its governance. A draft charter will be published shortly. The upcoming Technical Steering Committee (TSC) is already at work. For transparency, its members are listed in [GOVERNANCE.md](https://github.com/lodash/lodash/blob/HEAD/GOVERNANCE.md).
|
||||||
|
|
||||||
The [Lodash](https://lodash.com/) library exported as a [UMD](https://github.com/umdjs/umd) module.
|
The [Lodash](https://lodash.com/) library exported as a [UMD](https://github.com/umdjs/umd) module.
|
||||||
|
|
||||||
Generated using [lodash-cli](https://www.npmjs.com/package/lodash-cli):
|
Generated using [lodash-cli](https://www.npmjs.com/package/lodash-cli):
|
||||||
```bash
|
```shell
|
||||||
$ npm run build
|
$ npm run build
|
||||||
$ lodash -o ./dist/lodash.js
|
$ lodash -o ./dist/lodash.js
|
||||||
$ lodash core -o ./dist/lodash.core.js
|
$ lodash core -o ./dist/lodash.core.js
|
||||||
```
|
```
|
||||||
|
|
||||||
## Community
|
|
||||||
|
|
||||||
[](https://gitter.im/lodash/lodash)
|
|
||||||
|
|
||||||
## Documentation
|
|
||||||
|
|
||||||
* [API Documentation](https://lodash.com/docs)
|
|
||||||
* [FP Guide](https://github.com/lodash/lodash/wiki/FP-Guide)
|
|
||||||
|
|
||||||
## Download
|
## Download
|
||||||
|
|
||||||
Lodash is released under the [MIT license](https://raw.githubusercontent.com/lodash/lodash/4.8.0/LICENSE) & supports [modern environments](#support).<br>
|
* [Core build](https://raw.githubusercontent.com/lodash/lodash/4.17.21/dist/lodash.core.js) ([~4 kB gzipped](https://raw.githubusercontent.com/lodash/lodash/4.17.21/dist/lodash.core.min.js))
|
||||||
|
* [Full build](https://raw.githubusercontent.com/lodash/lodash/4.17.21/dist/lodash.js) ([~24 kB gzipped](https://raw.githubusercontent.com/lodash/lodash/4.17.21/dist/lodash.min.js))
|
||||||
|
* [CDN copies](https://www.jsdelivr.com/projects/lodash)
|
||||||
|
|
||||||
|
Lodash is released under the [MIT license](https://raw.githubusercontent.com/lodash/lodash/4.17.21/LICENSE) & supports modern environments.<br>
|
||||||
Review the [build differences](https://github.com/lodash/lodash/wiki/build-differences) & pick one that’s right for you.
|
Review the [build differences](https://github.com/lodash/lodash/wiki/build-differences) & pick one that’s right for you.
|
||||||
|
|
||||||
* [Core build](https://raw.githubusercontent.com/lodash/lodash/4.8.0/dist/lodash.core.js) ([~4 kB gzipped](https://raw.githubusercontent.com/lodash/lodash/4.8.0/dist/lodash.core.min.js))
|
## Installation
|
||||||
* [Full build](https://raw.githubusercontent.com/lodash/lodash/4.8.0/dist/lodash.js) ([~22 kB gzipped](https://raw.githubusercontent.com/lodash/lodash/4.8.0/dist/lodash.min.js))
|
|
||||||
* [CDN copies](https://www.jsdelivr.com/projects/lodash)
|
In a browser:
|
||||||
|
```html
|
||||||
|
<script src="lodash.js"></script>
|
||||||
|
```
|
||||||
|
|
||||||
|
Using npm:
|
||||||
|
```shell
|
||||||
|
$ npm i -g npm
|
||||||
|
$ npm i --save lodash
|
||||||
|
```
|
||||||
|
|
||||||
|
In Node.js:
|
||||||
|
```js
|
||||||
|
// Load the full build.
|
||||||
|
var _ = require('lodash');
|
||||||
|
// Load the core build.
|
||||||
|
var _ = require('lodash/core');
|
||||||
|
// Load the FP build for immutable auto-curried iteratee-first data-last methods.
|
||||||
|
var fp = require('lodash/fp');
|
||||||
|
|
||||||
|
// Load method categories.
|
||||||
|
var array = require('lodash/array');
|
||||||
|
var object = require('lodash/fp/object');
|
||||||
|
|
||||||
|
// Cherry-pick methods for smaller browserify/rollup/webpack bundles.
|
||||||
|
var at = require('lodash/at');
|
||||||
|
var curryN = require('lodash/fp/curryN');
|
||||||
|
```
|
||||||
|
|
||||||
|
**Note:**<br>
|
||||||
|
Install [n_](https://www.npmjs.com/package/n_) for Lodash use in the Node.js < 6 REPL.
|
||||||
|
|
||||||
## Why Lodash?
|
## Why Lodash?
|
||||||
|
|
||||||
Lodash makes JavaScript easier by taking the hassle out of working with arrays,<br>
|
Lodash makes JavaScript easier by taking the hassle out of working with arrays,<br>
|
||||||
numbers, objects, strings, etc. Lodash’s modular methods are great for:
|
numbers, objects, strings, etc. Lodash’s modular methods are great for:
|
||||||
|
|
||||||
* Iterating arrays, objects, & strings
|
* Iterating arrays, objects, & strings
|
||||||
* Manipulating & testing values
|
* Manipulating & testing values
|
||||||
* Creating composite functions
|
* Creating composite functions
|
||||||
|
|
||||||
## Module Formats
|
## Module Formats
|
||||||
|
|
||||||
Lodash is available in a [variety of builds](https://lodash.com/custom-builds) & module formats.
|
Lodash is available in a [variety of builds](https://lodash.com/custom-builds) & module formats.
|
||||||
|
|
||||||
* [lodash](https://www.npmjs.com/package/lodash) & [per method packages](https://www.npmjs.com/browse/keyword/lodash-modularized)
|
* [lodash](https://www.npmjs.com/package/lodash) & [per method packages](https://www.npmjs.com/browse/keyword/lodash-modularized)
|
||||||
|
* [lodash-es](https://www.npmjs.com/package/lodash-es), [babel-plugin-lodash](https://www.npmjs.com/package/babel-plugin-lodash), & [lodash-webpack-plugin](https://www.npmjs.com/package/lodash-webpack-plugin)
|
||||||
|
* [lodash/fp](https://github.com/lodash/lodash/tree/npm/fp)
|
||||||
* [lodash-amd](https://www.npmjs.com/package/lodash-amd)
|
* [lodash-amd](https://www.npmjs.com/package/lodash-amd)
|
||||||
* [lodash-es](https://www.npmjs.com/package/lodash-es) & [babel-plugin-lodash](https://www.npmjs.com/package/babel-plugin-lodash)
|
|
||||||
* [lodash/fp](https://github.com/lodash/lodash/tree/4.8.0-npm/fp)
|
|
||||||
|
|
||||||
## Further Reading
|
|
||||||
|
|
||||||
* [Contributing](https://github.com/lodash/lodash/blob/4.8.0/.github/CONTRIBUTING.md)
|
|
||||||
* [Release Notes](https://github.com/lodash/lodash/releases/tag/4.0.0)
|
|
||||||
* [Wiki (Changelog, Roadmap, etc.)](https://github.com/lodash/lodash/wiki)
|
|
||||||
|
|||||||
47
SECURITY.md
Normal file
47
SECURITY.md
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
# Security Policy
|
||||||
|
|
||||||
|
## Supported versions
|
||||||
|
|
||||||
|
The following table describes the versions of this project that are currently
|
||||||
|
supported with security updates:
|
||||||
|
|
||||||
|
| Version | Supported |
|
||||||
|
| ------- | ------------------ |
|
||||||
|
| 4.x | :white_check_mark: |
|
||||||
|
| 3.x | :x: |
|
||||||
|
| 2.x | :x: |
|
||||||
|
| 1.x | :x: |
|
||||||
|
|
||||||
|
## Threat Model
|
||||||
|
|
||||||
|
To better understand which classes of vulnerabilities are considered in-scope or out-of-scope for Lodash, please review the [Lodash Threat Model](./threat-model.md).
|
||||||
|
|
||||||
|
The threat model defines Lodash’s trust boundaries and clarifies how security issues are assessed for triage and disclosure.
|
||||||
|
|
||||||
|
## Responsible disclosure security policy
|
||||||
|
|
||||||
|
A responsible disclosure policy helps protect users of the project from publicly
|
||||||
|
disclosed security vulnerabilities without a fix by employing a process where
|
||||||
|
vulnerabilities are first triaged in a private manner, and only publicly disclosed
|
||||||
|
after a reasonable time period that allows patching the vulnerability and provides
|
||||||
|
an upgrade path for users.
|
||||||
|
|
||||||
|
We kindly ask you to refrain from malicious acts that put our users, the project,
|
||||||
|
or any of the project’s team members at risk.
|
||||||
|
|
||||||
|
## Reporting a security issue
|
||||||
|
|
||||||
|
We consider the security of Lodash a top priority. But no matter how much effort
|
||||||
|
we put into security, there can still be vulnerabilities present.
|
||||||
|
|
||||||
|
If you discover a security vulnerability, please report the security issue
|
||||||
|
directly to the Lodash maintainers through the [Security tab](https://github.com/lodash/lodash/security) of the Lodash
|
||||||
|
repository.
|
||||||
|
|
||||||
|
Your efforts to responsibly disclose your findings are sincerely appreciated.
|
||||||
|
|
||||||
|
## Escalation
|
||||||
|
|
||||||
|
If you do not receive an acknowledgement of your report within 6 business days, or if you cannot find a private security contact for the project, you may escalate to the OpenJS Foundation CNA at `security@lists.openjsf.org`.
|
||||||
|
|
||||||
|
If the project acknowledges your report but does not provide any further response or engagement within 14 days, escalation is also appropriate.
|
||||||
1681
dist/lodash.core.js
vendored
1681
dist/lodash.core.js
vendored
File diff suppressed because it is too large
Load Diff
51
dist/lodash.core.min.js
vendored
51
dist/lodash.core.min.js
vendored
@@ -1,30 +1,29 @@
|
|||||||
/**
|
/**
|
||||||
* @license
|
* @license
|
||||||
* lodash 4.8.0 (Custom Build) lodash.com/license | Underscore.js 1.8.3 underscorejs.org/LICENSE
|
* Lodash (Custom Build) lodash.com/license | Underscore.js 1.8.3 underscorejs.org/LICENSE
|
||||||
* Build: `lodash core -o ./dist/lodash.core.js`
|
* Build: `lodash core -o ./dist/lodash.core.js`
|
||||||
*/
|
*/
|
||||||
;(function(){function n(n,t){return n.push.apply(n,t),n}function t(n,t,r){for(var e=-1,u=n.length;++e<u;){var o=n[e],i=t(o);if(null!=i&&(c===ln?i===i:r(i,c)))var c=i,f=o}return f}function r(n,t,r){var e;return r(n,function(n,r,u){return t(n,r,u)?(e=n,false):void 0}),e}function e(n,t,r,e,u){return u(n,function(n,u,o){r=e?(e=false,n):t(r,n,u,o)}),r}function u(n,t){return w(t,function(t){return n[t]})}function o(n){return n&&n.Object===Object?n:null}function i(n){return yn[n]}function c(n){var t=false;if(null!=n&&typeof n.toString!="function")try{
|
;(function(){function n(n){return H(n)&&pn.call(n,"callee")&&!yn.call(n,"callee")}function t(n,t){return n.push.apply(n,t),n}function r(n){return function(t){return null==t?Z:t[n]}}function e(n,t,r,e,u){return u(n,function(n,u,o){r=e?(e=false,n):t(r,n,u,o)}),r}function u(n,t){return j(t,function(t){return n[t]})}function o(n){return n instanceof i?n:new i(n)}function i(n,t){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!t}function c(n,t,r){if(typeof n!="function")throw new TypeError("Expected a function");
|
||||||
t=!!(n+"")}catch(r){}return t}function f(n,t){return n=typeof n=="number"||vn.test(n)?+n:-1,n>-1&&0==n%1&&(null==t?9007199254740991:t)>n}function a(n){return n instanceof l?n:new l(n)}function l(n,t){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!t}function p(n,t,r,e){var u;return(u=n===ln)||(u=An[r],u=(n===u||n!==n&&u!==u)&&!En.call(e,r)),u?t:n}function s(n){return Y(n)?Rn(n):{}}function h(n,t,r){if(typeof n!="function")throw new TypeError("Expected a function");return setTimeout(function(){
|
return setTimeout(function(){n.apply(Z,r)},t)}function f(n,t){var r=true;return mn(n,function(n,e,u){return r=!!t(n,e,u)}),r}function a(n,t,r){for(var e=-1,u=n.length;++e<u;){var o=n[e],i=t(o);if(null!=i&&(c===Z?i===i:r(i,c)))var c=i,f=o}return f}function l(n,t){var r=[];return mn(n,function(n,e,u){t(n,e,u)&&r.push(n)}),r}function p(n,r,e,u,o){var i=-1,c=n.length;for(e||(e=R),o||(o=[]);++i<c;){var f=n[i];0<r&&e(f)?1<r?p(f,r-1,e,u,o):t(o,f):u||(o[o.length]=f)}return o}function s(n,t){return n&&On(n,t,Dn);
|
||||||
n.apply(ln,r)},t)}function v(n,t){var r=true;return zn(n,function(n,e,u){return r=!!t(n,e,u)}),r}function y(n,t){var r=[];return zn(n,function(n,e,u){t(n,e,u)&&r.push(n)}),r}function g(t,r,e,u){u||(u=[]);for(var o=-1,i=t.length;++o<i;){var c=t[o];r>0&&Z(c)&&Q(c)&&(e||Un(c)||L(c))?r>1?g(c,r-1,e,u):n(u,c):e||(u[u.length]=c)}return u}function b(n,t){return n&&Cn(n,t,un)}function _(n,t){return y(t,function(t){return W(n[t])})}function j(n,t,r,e,u){return n===t?true:null==n||null==t||!Y(n)&&!Z(t)?n!==n&&t!==t:d(n,t,j,r,e,u);
|
}function h(n,t){return l(t,function(t){return U(n[t])})}function v(n,t){return n>t}function b(n,t,r,e,u){return n===t||(null==n||null==t||!H(n)&&!H(t)?n!==n&&t!==t:y(n,t,r,e,b,u))}function y(n,t,r,e,u,o){var i=Nn(n),c=Nn(t),f=i?"[object Array]":hn.call(n),a=c?"[object Array]":hn.call(t),f="[object Arguments]"==f?"[object Object]":f,a="[object Arguments]"==a?"[object Object]":a,l="[object Object]"==f,c="[object Object]"==a,a=f==a;o||(o=[]);var p=An(o,function(t){return t[0]==n}),s=An(o,function(n){
|
||||||
}function d(n,t,r,e,u,o){var i=Un(n),f=Un(t),a="[object Array]",l="[object Array]";i||(a=Nn.call(n),a="[object Arguments]"==a?"[object Object]":a),f||(l=Nn.call(t),l="[object Arguments]"==l?"[object Object]":l);var p="[object Object]"==a&&!c(n),f="[object Object]"==l&&!c(t),l=a==l;o||(o=[]);var s=J(o,function(t){return t[0]===n});return s&&s[1]?s[1]==t:(o.push([n,t]),l&&!p?(r=i||isTypedArray(n)?I(n,t,r,e,u,o):$(n,t,a),o.pop(),r):2&u||(i=p&&En.call(n,"__wrapped__"),a=f&&En.call(t,"__wrapped__"),!i&&!a)?l?(r=q(n,t,r,e,u,o),
|
return n[0]==t});if(p&&s)return p[1]==t;if(o.push([n,t]),o.push([t,n]),a&&!l){if(i)r=T(n,t,r,e,u,o);else n:{switch(f){case"[object Boolean]":case"[object Date]":case"[object Number]":r=J(+n,+t);break n;case"[object Error]":r=n.name==t.name&&n.message==t.message;break n;case"[object RegExp]":case"[object String]":r=n==t+"";break n}r=false}return o.pop(),r}return 1&r||(i=l&&pn.call(n,"__wrapped__"),f=c&&pn.call(t,"__wrapped__"),!i&&!f)?!!a&&(r=B(n,t,r,e,u,o),o.pop(),r):(i=i?n.value():n,f=f?t.value():t,
|
||||||
o.pop(),r):false:(i=i?n.value():n,t=a?t.value():t,r=r(i,t,e,u,o),o.pop(),r))}function m(n){return typeof n=="function"?n:null==n?fn:(typeof n=="object"?x:E)(n)}function O(n){n=null==n?n:Object(n);var t,r=[];for(t in n)r.push(t);return r}function w(n,t){var r=-1,e=Q(n)?Array(n.length):[];return zn(n,function(n,u,o){e[++r]=t(n,u,o)}),e}function x(n){var t=un(n);return function(r){var e=t.length;if(null==r)return!e;for(r=Object(r);e--;){var u=t[e];if(!(u in r&&j(n[u],r[u],ln,3)))return false}return true}}function A(n,t){
|
r=u(i,f,r,e,o),o.pop(),r)}function g(n){return typeof n=="function"?n:null==n?X:(typeof n=="object"?d:r)(n)}function _(n,t){return n<t}function j(n,t){var r=-1,e=M(n)?Array(n.length):[];return mn(n,function(n,u,o){e[++r]=t(n,u,o)}),e}function d(n){var t=_n(n);return function(r){var e=t.length;if(null==r)return!e;for(r=Object(r);e--;){var u=t[e];if(!(u in r&&b(n[u],r[u],3)))return false}return true}}function m(n,t){return n=Object(n),C(t,function(t,r){return r in n&&(t[r]=n[r]),t},{})}function O(n){return xn(I(n,void 0,X),n+"");
|
||||||
return n=Object(n),P(t,function(t,r){return r in n&&(t[r]=n[r]),t},{})}function E(n){return function(t){return null==t?ln:t[n]}}function k(n,t,r){var e=-1,u=n.length;for(0>t&&(t=-t>u?0:u+t),r=r>u?u:r,0>r&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0,r=Array(u);++e<u;)r[e]=n[e+t];return r}function N(n){return k(n,0,n.length)}function S(n,t){var r;return zn(n,function(n,e,u){return r=t(n,e,u),!r}),!!r}function T(t,r){return P(r,function(t,r){return r.func.apply(r.thisArg,n([t],r.args))},t)}function F(n,t,r,e){r||(r={});
|
}function x(n,t,r){var e=-1,u=n.length;for(0>t&&(t=-t>u?0:u+t),r=r>u?u:r,0>r&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0,r=Array(u);++e<u;)r[e]=n[e+t];return r}function A(n){return x(n,0,n.length)}function E(n,t){var r;return mn(n,function(n,e,u){return r=t(n,e,u),!r}),!!r}function w(n,r){return C(r,function(n,r){return r.func.apply(r.thisArg,t([n],r.args))},n)}function k(n,t,r){var e=!r;r||(r={});for(var u=-1,o=t.length;++u<o;){var i=t[u],c=Z;if(c===Z&&(c=n[i]),e)r[i]=c;else{var f=r,a=f[i];pn.call(f,i)&&J(a,c)&&(c!==Z||i in f)||(f[i]=c);
|
||||||
for(var u=-1,o=t.length;++u<o;){var i=t[u],c=e?e(r[i],n[i],i,r,n):n[i],f=r,a=f[i];En.call(f,i)&&(a===c||a!==a&&c!==c)&&(c!==ln||i in f)||(f[i]=c)}return r}function R(n){return V(function(t,r){var e=-1,u=r.length,o=u>1?r[u-1]:ln,o=typeof o=="function"?(u--,o):ln;for(t=Object(t);++e<u;){var i=r[e];i&&n(t,i,e,o)}return t})}function B(n){return function(){var t=arguments,r=s(n.prototype),t=n.apply(r,t);return Y(t)?t:r}}function D(n,t,r){function e(){for(var o=-1,i=arguments.length,c=-1,f=r.length,a=Array(f+i),l=this&&this!==wn&&this instanceof e?u:n;++c<f;)a[c]=r[c];
|
}}return r}function N(n){return O(function(t,r){var e=-1,u=r.length,o=1<u?r[u-1]:Z,o=3<n.length&&typeof o=="function"?(u--,o):Z;for(t=Object(t);++e<u;){var i=r[e];i&&n(t,i,e,o)}return t})}function F(n){return function(){var t=arguments,r=dn(n.prototype),t=n.apply(r,t);return V(t)?t:r}}function S(n,t,r){function e(){for(var o=-1,i=arguments.length,c=-1,f=r.length,a=Array(f+i),l=this&&this!==on&&this instanceof e?u:n;++c<f;)a[c]=r[c];for(;i--;)a[c++]=arguments[++o];return l.apply(t,a)}if(typeof n!="function")throw new TypeError("Expected a function");
|
||||||
for(;i--;)a[c++]=arguments[++o];return l.apply(t,a)}if(typeof n!="function")throw new TypeError("Expected a function");var u=B(n);return e}function I(n,t,r,e,u,o){var i=-1,c=1&u,f=n.length,a=t.length;if(f!=a&&!(2&u&&a>f))return false;for(a=true;++i<f;){var l=n[i],p=t[i];if(void 0!==ln){a=false;break}if(c){if(!S(t,function(n){return l===n||r(l,n,e,u,o)})){a=false;break}}else if(l!==p&&!r(l,p,e,u,o)){a=false;break}}return a}function $(n,t,r){switch(r){case"[object Boolean]":case"[object Date]":return+n==+t;case"[object Error]":
|
var u=F(n);return e}function T(n,t,r,e,u,o){var i=n.length,c=t.length;if(i!=c&&!(1&r&&c>i))return false;var c=o.get(n),f=o.get(t);if(c&&f)return c==t&&f==n;for(var c=-1,f=true,a=2&r?[]:Z;++c<i;){var l=n[c],p=t[c];if(void 0!==Z){f=false;break}if(a){if(!E(t,function(n,t){if(!P(a,t)&&(l===n||u(l,n,r,e,o)))return a.push(t)})){f=false;break}}else if(l!==p&&!u(l,p,r,e,o)){f=false;break}}return f}function B(n,t,r,e,u,o){var i=1&r,c=Dn(n),f=c.length,a=Dn(t).length;if(f!=a&&!i)return false;for(a=f;a--;){var l=c[a];if(!(i?l in t:pn.call(t,l)))return false;
|
||||||
return n.name==t.name&&n.message==t.message;case"[object Number]":return n!=+n?t!=+t:n==+t;case"[object RegExp]":case"[object String]":return n==t+""}return false}function q(n,t,r,e,u,o){var i=2&u,c=un(n),f=c.length,a=un(t).length;if(f!=a&&!i)return false;for(var l=f;l--;){var p=c[l];if(!(i?p in t:En.call(t,p)))return false}for(a=true;++l<f;){var p=c[l],s=n[p],h=t[p];if(void 0!==ln||s!==h&&!r(s,h,e,u,o)){a=false;break}i||(i="constructor"==p)}return a&&!i&&(r=n.constructor,e=t.constructor,r!=e&&"constructor"in n&&"constructor"in t&&!(typeof r=="function"&&r instanceof r&&typeof e=="function"&&e instanceof e)&&(a=false)),
|
}var p=o.get(n),l=o.get(t);if(p&&l)return p==t&&l==n;for(p=true;++a<f;){var l=c[a],s=n[l],h=t[l];if(void 0!==Z||s!==h&&!u(s,h,r,e,o)){p=false;break}i||(i="constructor"==l)}return p&&!i&&(r=n.constructor,e=t.constructor,r!=e&&"constructor"in n&&"constructor"in t&&!(typeof r=="function"&&r instanceof r&&typeof e=="function"&&e instanceof e)&&(p=false)),p}function R(t){return Nn(t)||n(t)}function D(n){var t=[];if(null!=n)for(var r in Object(n))t.push(r);return t}function I(n,t,r){return t=jn(t===Z?n.length-1:t,0),
|
||||||
a}function z(n){var t=n?n.length:ln;if(X(t)&&(Un(n)||tn(n)||L(n))){n=String;for(var r=-1,e=Array(t);++r<t;)e[r]=n(r);t=e}else t=null;return t}function C(n){var t=n&&n.constructor;return n===(typeof t=="function"&&t.prototype||An)}function G(n){return n?n[0]:ln}function J(n,t){return r(n,m(t),zn)}function M(n,t){return zn(n,m(t))}function P(n,t,r){return e(n,m(t),r,3>arguments.length,zn)}function U(n,t){var r;if(typeof t!="function")throw new TypeError("Expected a function");return n=Vn(n),function(){
|
function(){for(var e=arguments,u=-1,o=jn(e.length-t,0),i=Array(o);++u<o;)i[u]=e[t+u];for(u=-1,o=Array(t+1);++u<t;)o[u]=e[u];return o[t]=r(i),n.apply(this,o)}}function $(n){return(null==n?0:n.length)?p(n,1):[]}function q(n){return n&&n.length?n[0]:Z}function P(n,t,r){var e=null==n?0:n.length;r=typeof r=="number"?0>r?jn(e+r,0):r:0,r=(r||0)-1;for(var u=t===t;++r<e;){var o=n[r];if(u?o===t:o!==o)return r}return-1}function z(n,t){return mn(n,g(t))}function C(n,t,r){return e(n,g(t),r,3>arguments.length,mn);
|
||||||
return 0<--n&&(r=t.apply(this,arguments)),1>=n&&(t=ln),r}}function V(n){var t;if(typeof n!="function")throw new TypeError("Expected a function");return t=$n(t===ln?n.length-1:Vn(t),0),function(){for(var r=arguments,e=-1,u=$n(r.length-t,0),o=Array(u);++e<u;)o[e]=r[t+e];for(u=Array(t+1),e=-1;++e<t;)u[e]=r[e];return u[t]=o,n.apply(this,u)}}function H(){if(!arguments.length)return[];var n=arguments[0];return Un(n)?n:[n]}function K(n,t){return n>t}function L(n){return Z(n)&&Q(n)&&En.call(n,"callee")&&(!Bn.call(n,"callee")||"[object Arguments]"==Nn.call(n));
|
}function G(n,t){var r;if(typeof t!="function")throw new TypeError("Expected a function");return n=Fn(n),function(){return 0<--n&&(r=t.apply(this,arguments)),1>=n&&(t=Z),r}}function J(n,t){return n===t||n!==n&&t!==t}function M(n){var t;return(t=null!=n)&&(t=n.length,t=typeof t=="number"&&-1<t&&0==t%1&&9007199254740991>=t),t&&!U(n)}function U(n){return!!V(n)&&(n=hn.call(n),"[object Function]"==n||"[object GeneratorFunction]"==n||"[object AsyncFunction]"==n||"[object Proxy]"==n)}function V(n){var t=typeof n;
|
||||||
}function Q(n){return null!=n&&X(Gn(n))&&!W(n)}function W(n){return n=Y(n)?Nn.call(n):"","[object Function]"==n||"[object GeneratorFunction]"==n}function X(n){return typeof n=="number"&&n>-1&&0==n%1&&9007199254740991>=n}function Y(n){var t=typeof n;return!!n&&("object"==t||"function"==t)}function Z(n){return!!n&&typeof n=="object"}function nn(n){return typeof n=="number"||Z(n)&&"[object Number]"==Nn.call(n)}function tn(n){return typeof n=="string"||!Un(n)&&Z(n)&&"[object String]"==Nn.call(n)}function rn(n,t){
|
return null!=n&&("object"==t||"function"==t)}function H(n){return null!=n&&typeof n=="object"}function K(n){return typeof n=="number"||H(n)&&"[object Number]"==hn.call(n)}function L(n){return typeof n=="string"||!Nn(n)&&H(n)&&"[object String]"==hn.call(n)}function Q(n){return typeof n=="string"?n:null==n?"":n+""}function W(n){return null==n?[]:u(n,Dn(n))}function X(n){return n}function Y(n,r,e){var u=Dn(r),o=h(r,u);null!=e||V(r)&&(o.length||!u.length)||(e=r,r=n,n=this,o=h(r,Dn(r)));var i=!(V(e)&&"chain"in e&&!e.chain),c=U(n);
|
||||||
return t>n}function en(n){return typeof n=="string"?n:null==n?"":n+""}function un(n){var t=C(n);if(!t&&!Q(n))return In(Object(n));var r,e=z(n),u=!!e,e=e||[],o=e.length;for(r in n)!En.call(n,r)||u&&("length"==r||f(r,o))||t&&"constructor"==r||e.push(r);return e}function on(n){for(var t=-1,r=C(n),e=O(n),u=e.length,o=z(n),i=!!o,o=o||[],c=o.length;++t<u;){var a=e[t];i&&("length"==a||f(a,c))||"constructor"==a&&(r||!En.call(n,a))||o.push(a)}return o}function cn(n){return n?u(n,un(n)):[]}function fn(n){return n;
|
return mn(o,function(e){var u=r[e];n[e]=u,c&&(n.prototype[e]=function(){var r=this.__chain__;if(i||r){var e=n(this.__wrapped__);return(e.__actions__=A(this.__actions__)).push({func:u,args:arguments,thisArg:n}),e.__chain__=r,e}return u.apply(n,t([this.value()],arguments))})}),n}var Z,nn=1/0,tn=/[&<>"']/g,rn=RegExp(tn.source),en=/^(?:0|[1-9]\d*)$/,un=typeof self=="object"&&self&&self.Object===Object&&self,on=typeof global=="object"&&global&&global.Object===Object&&global||un||Function("return this")(),cn=(un=typeof exports=="object"&&exports&&!exports.nodeType&&exports)&&typeof module=="object"&&module&&!module.nodeType&&module,fn=function(n){
|
||||||
}function an(t,r,e){var u=un(r),o=_(r,u);null!=e||Y(r)&&(o.length||!u.length)||(e=r,r=t,t=this,o=_(r,un(r)));var i=Y(e)&&"chain"in e?e.chain:true,c=W(t);return zn(o,function(e){var u=r[e];t[e]=u,c&&(t.prototype[e]=function(){var r=this.__chain__;if(i||r){var e=t(this.__wrapped__);return(e.__actions__=N(this.__actions__)).push({func:u,args:arguments,thisArg:t}),e.__chain__=r,e}return u.apply(t,n([this.value()],arguments))})}),t}var ln,pn=1/0,sn=/[&<>"'`]/g,hn=RegExp(sn.source),vn=/^(?:0|[1-9]\d*)$/,yn={
|
return function(t){return null==n?Z:n[t]}}({"&":"&","<":"<",">":">",'"':""","'":"'"}),an=Array.prototype,ln=Object.prototype,pn=ln.hasOwnProperty,sn=0,hn=ln.toString,vn=on._,bn=Object.create,yn=ln.propertyIsEnumerable,gn=on.isFinite,_n=function(n,t){return function(r){return n(t(r))}}(Object.keys,Object),jn=Math.max,dn=function(){function n(){}return function(t){return V(t)?bn?bn(t):(n.prototype=t,t=new n,n.prototype=Z,t):{}}}();i.prototype=dn(o.prototype),i.prototype.constructor=i;
|
||||||
"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},gn={"function":true,object:true},bn=gn[typeof exports]&&exports&&!exports.nodeType?exports:ln,_n=gn[typeof module]&&module&&!module.nodeType?module:ln,jn=_n&&_n.exports===bn?bn:ln,dn=o(gn[typeof self]&&self),mn=o(gn[typeof window]&&window),On=o(gn[typeof this]&&this),wn=o(bn&&_n&&typeof global=="object"&&global)||mn!==(On&&On.window)&&mn||dn||On||Function("return this")(),xn=Array.prototype,An=Object.prototype,En=An.hasOwnProperty,kn=0,Nn=An.toString,Sn=wn._,Tn=wn.Reflect,Fn=Tn?Tn.f:ln,Rn=Object.create,Bn=An.propertyIsEnumerable,Dn=wn.isFinite,In=Object.keys,$n=Math.max,qn=!Bn.call({
|
var mn=function(n,t){return function(r,e){if(null==r)return r;if(!M(r))return n(r,e);for(var u=r.length,o=t?u:-1,i=Object(r);(t?o--:++o<u)&&false!==e(i[o],o,i););return r}}(s),On=function(n){return function(t,r,e){var u=-1,o=Object(t);e=e(t);for(var i=e.length;i--;){var c=e[n?i:++u];if(false===r(o[c],c,o))break}return t}}(),xn=X,An=function(n){return function(t,r,e){var u=Object(t);if(!M(t)){var o=g(r);t=Dn(t),r=function(n){return o(u[n],n,u)}}return r=n(t,r,e),-1<r?u[o?t[r]:r]:Z}}(function(n,t,r){var e=null==n?0:n.length;
|
||||||
valueOf:1},"valueOf");l.prototype=s(a.prototype),l.prototype.constructor=l;var zn=function(n,t){return function(r,e){if(null==r)return r;if(!Q(r))return n(r,e);for(var u=r.length,o=t?u:-1,i=Object(r);(t?o--:++o<u)&&false!==e(i[o],o,i););return r}}(b),Cn=function(n){return function(t,r,e){var u=-1,o=Object(t);e=e(t);for(var i=e.length;i--;){var c=e[n?i:++u];if(false===r(o[c],c,o))break}return t}}();Fn&&!Bn.call({valueOf:1},"valueOf")&&(O=function(n){n=Fn(n);for(var t,r=[];!(t=n.next()).done;)r.push(t.value);
|
if(!e)return-1;r=null==r?0:Fn(r),0>r&&(r=jn(e+r,0));n:{for(t=g(t),e=n.length,r+=-1;++r<e;)if(t(n[r],r,n)){n=r;break n}n=-1}return n}),En=O(function(n,t,r){return S(n,t,r)}),wn=O(function(n,t){return c(n,1,t)}),kn=O(function(n,t,r){return c(n,Sn(t)||0,r)}),Nn=Array.isArray,Fn=Number,Sn=Number,Tn=N(function(n,t){k(t,_n(t),n)}),Bn=N(function(n,t){k(t,D(t),n)}),Rn=O(function(n,t){n=Object(n);var r,e=-1,u=t.length,o=2<u?t[2]:Z;if(r=o){r=t[0];var i=t[1];if(V(o)){var c=typeof i;if("number"==c){if(c=M(o))var c=o.length,f=typeof i,c=null==c?9007199254740991:c,c=!!c&&("number"==f||"symbol"!=f&&en.test(i))&&-1<i&&0==i%1&&i<c;
|
||||||
return r});var Gn=E("length"),Jn=V(function(n,t,r){return D(n,t,r)}),Mn=V(function(n,t){return h(n,1,t)}),Pn=V(function(n,t,r){return h(n,Hn(t)||0,r)}),Un=Array.isArray,Vn=Number,Hn=Number,Kn=R(function(n,t){F(t,un(t),n)}),Ln=R(function(n,t){F(t,on(t),n)}),Qn=R(function(n,t,r,e){F(t,on(t),n,e)}),Wn=V(function(n){return n.push(ln,p),Qn.apply(ln,n)}),Xn=V(function(n,t){return null==n?{}:A(n,g(t,1))}),Yn=m;a.assignIn=Ln,a.before=U,a.bind=Jn,a.chain=function(n){return n=a(n),n.__chain__=true,n},a.compact=function(n){
|
}else c="string"==c&&i in o;r=!!c&&J(o[i],r)}else r=false}for(r&&(u=1);++e<u;)for(o=t[e],r=In(o),i=-1,c=r.length;++i<c;){var f=r[i],a=n[f];(a===Z||J(a,ln[f])&&!pn.call(n,f))&&(n[f]=o[f])}return n}),Dn=_n,In=D,$n=function(n){return xn(I(n,Z,$),n+"")}(function(n,t){return null==n?{}:m(n,t)});o.assignIn=Bn,o.before=G,o.bind=En,o.chain=function(n){return n=o(n),n.__chain__=true,n},o.compact=function(n){return l(n,Boolean)},o.concat=function(){var n=arguments.length;if(!n)return[];for(var r=Array(n-1),e=arguments[0];n--;)r[n-1]=arguments[n];
|
||||||
return y(n,Boolean)},a.concat=function(){var t=arguments.length,r=H(arguments[0]);if(2>t)return t?N(r):[];for(var e=Array(t-1);t--;)e[t-1]=arguments[t];return g(e,1),n(N(r),cn)},a.create=function(n,t){var r=s(n);return t?Kn(r,t):r},a.defaults=Wn,a.defer=Mn,a.delay=Pn,a.filter=function(n,t){return y(n,m(t))},a.flatten=function(n){return n&&n.length?g(n,1):[]},a.flattenDeep=function(n){return n&&n.length?g(n,pn):[]},a.iteratee=Yn,a.keys=un,a.map=function(n,t){return w(n,m(t))},a.matches=function(n){
|
return t(Nn(e)?A(e):[e],p(r,1))},o.create=function(n,t){var r=dn(n);return null==t?r:Tn(r,t)},o.defaults=Rn,o.defer=wn,o.delay=kn,o.filter=function(n,t){return l(n,g(t))},o.flatten=$,o.flattenDeep=function(n){return(null==n?0:n.length)?p(n,nn):[]},o.iteratee=g,o.keys=Dn,o.map=function(n,t){return j(n,g(t))},o.matches=function(n){return d(Tn({},n))},o.mixin=Y,o.negate=function(n){if(typeof n!="function")throw new TypeError("Expected a function");return function(){return!n.apply(this,arguments)}},o.once=function(n){
|
||||||
return x(Kn({},n))},a.mixin=an,a.negate=function(n){if(typeof n!="function")throw new TypeError("Expected a function");return function(){return!n.apply(this,arguments)}},a.once=function(n){return U(2,n)},a.pick=Xn,a.slice=function(n,t,r){var e=n?n.length:0;return r=r===ln?e:+r,e?k(n,null==t?0:+t,r):[]},a.sortBy=function(n,t){var r=0;return t=m(t),w(w(n,function(n,e,u){return{c:n,b:r++,a:t(n,e,u)}}).sort(function(n,t){var r;n:{r=n.a;var e=t.a;if(r!==e){var u=null===r,o=r===ln,i=r===r,c=null===e,f=e===ln,a=e===e;
|
return G(2,n)},o.pick=$n,o.slice=function(n,t,r){var e=null==n?0:n.length;return r=r===Z?e:+r,e?x(n,null==t?0:+t,r):[]},o.sortBy=function(n,t){var e=0;return t=g(t),j(j(n,function(n,r,u){return{value:n,index:e++,criteria:t(n,r,u)}}).sort(function(n,t){var r;n:{r=n.criteria;var e=t.criteria;if(r!==e){var u=r!==Z,o=null===r,i=r===r,c=e!==Z,f=null===e,a=e===e;if(!f&&r>e||o&&c&&a||!u&&a||!i){r=1;break n}if(!o&&r<e||f&&u&&i||!c&&i||!a){r=-1;break n}}r=0}return r||n.index-t.index}),r("value"))},o.tap=function(n,t){
|
||||||
if(r>e&&!c||!i||u&&!f&&a||o&&a){r=1;break n}if(e>r&&!u||!a||c&&!o&&i||f&&i){r=-1;break n}}r=0}return r||n.b-t.b}),E("c"))},a.tap=function(n,t){return t(n),n},a.thru=function(n,t){return t(n)},a.toArray=function(n){return Q(n)?n.length?N(n):[]:cn(n)},a.values=cn,a.extend=Ln,an(a,a),a.clone=function(n){return Y(n)?Un(n)?N(n):F(n,un(n)):n},a.escape=function(n){return(n=en(n))&&hn.test(n)?n.replace(sn,i):n},a.every=function(n,t,r){return t=r?ln:t,v(n,m(t))},a.find=J,a.forEach=M,a.has=function(n,t){return null!=n&&En.call(n,t);
|
return t(n),n},o.thru=function(n,t){return t(n)},o.toArray=function(n){return M(n)?n.length?A(n):[]:W(n)},o.values=W,o.extend=Bn,Y(o,o),o.clone=function(n){return V(n)?Nn(n)?A(n):k(n,_n(n)):n},o.escape=function(n){return(n=Q(n))&&rn.test(n)?n.replace(tn,fn):n},o.every=function(n,t,r){return t=r?Z:t,f(n,g(t))},o.find=An,o.forEach=z,o.has=function(n,t){return null!=n&&pn.call(n,t)},o.head=q,o.identity=X,o.indexOf=P,o.isArguments=n,o.isArray=Nn,o.isBoolean=function(n){return true===n||false===n||H(n)&&"[object Boolean]"==hn.call(n);
|
||||||
},a.head=G,a.identity=fn,a.indexOf=function(n,t,r){var e=n?n.length:0;r=typeof r=="number"?0>r?$n(e+r,0):r:0,r=(r||0)-1;for(var u=t===t;++r<e;){var o=n[r];if(u?o===t:o!==o)return r}return-1},a.isArguments=L,a.isArray=Un,a.isBoolean=function(n){return true===n||false===n||Z(n)&&"[object Boolean]"==Nn.call(n)},a.isDate=function(n){return Z(n)&&"[object Date]"==Nn.call(n)},a.isEmpty=function(n){if(Q(n)&&(Un(n)||tn(n)||W(n.splice)||L(n)))return!n.length;for(var t in n)if(En.call(n,t))return false;return!(qn&&un(n).length);
|
},o.isDate=function(n){return H(n)&&"[object Date]"==hn.call(n)},o.isEmpty=function(t){return M(t)&&(Nn(t)||L(t)||U(t.splice)||n(t))?!t.length:!_n(t).length},o.isEqual=function(n,t){return b(n,t)},o.isFinite=function(n){return typeof n=="number"&&gn(n)},o.isFunction=U,o.isNaN=function(n){return K(n)&&n!=+n},o.isNull=function(n){return null===n},o.isNumber=K,o.isObject=V,o.isRegExp=function(n){return H(n)&&"[object RegExp]"==hn.call(n)},o.isString=L,o.isUndefined=function(n){return n===Z},o.last=function(n){
|
||||||
},a.isEqual=function(n,t){return j(n,t)},a.isFinite=function(n){return typeof n=="number"&&Dn(n)},a.isFunction=W,a.isNaN=function(n){return nn(n)&&n!=+n},a.isNull=function(n){return null===n},a.isNumber=nn,a.isObject=Y,a.isRegExp=function(n){return Y(n)&&"[object RegExp]"==Nn.call(n)},a.isString=tn,a.isUndefined=function(n){return n===ln},a.last=function(n){var t=n?n.length:0;return t?n[t-1]:ln},a.max=function(n){return n&&n.length?t(n,fn,K):ln},a.min=function(n){return n&&n.length?t(n,fn,rn):ln},
|
var t=null==n?0:n.length;return t?n[t-1]:Z},o.max=function(n){return n&&n.length?a(n,X,v):Z},o.min=function(n){return n&&n.length?a(n,X,_):Z},o.noConflict=function(){return on._===this&&(on._=vn),this},o.noop=function(){},o.reduce=C,o.result=function(n,t,r){return t=null==n?Z:n[t],t===Z&&(t=r),U(t)?t.call(n):t},o.size=function(n){return null==n?0:(n=M(n)?n:_n(n),n.length)},o.some=function(n,t,r){return t=r?Z:t,E(n,g(t))},o.uniqueId=function(n){var t=++sn;return Q(n)+t},o.each=z,o.first=q,Y(o,function(){
|
||||||
a.noConflict=function(){return wn._===this&&(wn._=Sn),this},a.noop=function(){},a.reduce=P,a.result=function(n,t,r){return t=null==n?ln:n[t],t===ln&&(t=r),W(t)?t.call(n):t},a.size=function(n){return null==n?0:(n=Q(n)?n:un(n),n.length)},a.some=function(n,t,r){return t=r?ln:t,S(n,m(t))},a.uniqueId=function(n){var t=++kn;return en(n)+t},a.each=M,a.first=G,an(a,function(){var n={};return b(a,function(t,r){En.call(a.prototype,r)||(n[r]=t)}),n}(),{chain:false}),a.VERSION="4.8.0",zn("pop join replace reverse split push shift sort splice unshift".split(" "),function(n){
|
var n={};return s(o,function(t,r){pn.call(o.prototype,r)||(n[r]=t)}),n}(),{chain:false}),o.VERSION="4.17.21",mn("pop join replace reverse split push shift sort splice unshift".split(" "),function(n){var t=(/^(?:replace|split)$/.test(n)?String.prototype:an)[n],r=/^(?:push|sort|unshift)$/.test(n)?"tap":"thru",e=/^(?:pop|join|replace|shift)$/.test(n);o.prototype[n]=function(){var n=arguments;if(e&&!this.__chain__){var u=this.value();return t.apply(Nn(u)?u:[],n)}return this[r](function(r){return t.apply(Nn(r)?r:[],n);
|
||||||
var t=(/^(?:replace|split)$/.test(n)?String.prototype:xn)[n],r=/^(?:push|sort|unshift)$/.test(n)?"tap":"thru",e=/^(?:pop|join|replace|shift)$/.test(n);a.prototype[n]=function(){var n=arguments;if(e&&!this.__chain__){var u=this.value();return t.apply(Un(u)?u:[],n)}return this[r](function(r){return t.apply(Un(r)?r:[],n)})}}),a.prototype.toJSON=a.prototype.valueOf=a.prototype.value=function(){return T(this.__wrapped__,this.__actions__)},(mn||dn||{})._=a,typeof define=="function"&&typeof define.amd=="object"&&define.amd? define(function(){
|
})}}),o.prototype.toJSON=o.prototype.valueOf=o.prototype.value=function(){return w(this.__wrapped__,this.__actions__)},typeof define=="function"&&typeof define.amd=="object"&&define.amd?(on._=o, define(function(){return o})):cn?((cn.exports=o)._=o,un._=o):on._=o}).call(this);
|
||||||
return a}):bn&&_n?(jn&&((_n.exports=a)._=a),bn._=a):wn._=a}).call(this);
|
|
||||||
445
dist/lodash.fp.js
vendored
445
dist/lodash.fp.js
vendored
@@ -52,7 +52,7 @@ return /******/ (function(modules) { // webpackBootstrap
|
|||||||
/************************************************************************/
|
/************************************************************************/
|
||||||
/******/ ([
|
/******/ ([
|
||||||
/* 0 */
|
/* 0 */
|
||||||
/***/ function(module, exports, __webpack_require__) {
|
/***/ (function(module, exports, __webpack_require__) {
|
||||||
|
|
||||||
var baseConvert = __webpack_require__(1);
|
var baseConvert = __webpack_require__(1);
|
||||||
|
|
||||||
@@ -68,20 +68,22 @@ return /******/ (function(modules) { // webpackBootstrap
|
|||||||
return baseConvert(lodash, lodash, options);
|
return baseConvert(lodash, lodash, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (typeof _ == 'function') {
|
if (typeof _ == 'function' && typeof _.runInContext == 'function') {
|
||||||
_ = browserConvert(_.runInContext());
|
_ = browserConvert(_.runInContext());
|
||||||
}
|
}
|
||||||
module.exports = browserConvert;
|
module.exports = browserConvert;
|
||||||
|
|
||||||
|
|
||||||
/***/ },
|
/***/ }),
|
||||||
/* 1 */
|
/* 1 */
|
||||||
/***/ function(module, exports, __webpack_require__) {
|
/***/ (function(module, exports, __webpack_require__) {
|
||||||
|
|
||||||
var mapping = __webpack_require__(2),
|
var mapping = __webpack_require__(2),
|
||||||
mutateMap = mapping.mutate,
|
|
||||||
fallbackHolder = __webpack_require__(3);
|
fallbackHolder = __webpack_require__(3);
|
||||||
|
|
||||||
|
/** Built-in value reference. */
|
||||||
|
var push = Array.prototype.push;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a function, with an arity of `n`, that invokes `func` with the
|
* Creates a function, with an arity of `n`, that invokes `func` with the
|
||||||
* arguments it receives.
|
* arguments it receives.
|
||||||
@@ -142,6 +144,37 @@ return /******/ (function(modules) { // webpackBootstrap
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A specialized version of `_.spread` which flattens the spread array into
|
||||||
|
* the arguments of the invoked `func`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Function} func The function to spread arguments over.
|
||||||
|
* @param {number} start The start position of the spread.
|
||||||
|
* @returns {Function} Returns the new function.
|
||||||
|
*/
|
||||||
|
function flatSpread(func, start) {
|
||||||
|
return function() {
|
||||||
|
var length = arguments.length,
|
||||||
|
lastIndex = length - 1,
|
||||||
|
args = Array(length);
|
||||||
|
|
||||||
|
while (length--) {
|
||||||
|
args[length] = arguments[length];
|
||||||
|
}
|
||||||
|
var array = args[start],
|
||||||
|
otherArgs = args.slice(0, start);
|
||||||
|
|
||||||
|
if (array) {
|
||||||
|
push.apply(otherArgs, array);
|
||||||
|
}
|
||||||
|
if (start != lastIndex) {
|
||||||
|
push.apply(otherArgs, args.slice(start + 1));
|
||||||
|
}
|
||||||
|
return func.apply(this, otherArgs);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a function that wraps `func` and uses `cloner` to clone the first
|
* Creates a function that wraps `func` and uses `cloner` to clone the first
|
||||||
* argument it receives.
|
* argument it receives.
|
||||||
@@ -151,11 +184,11 @@ return /******/ (function(modules) { // webpackBootstrap
|
|||||||
* @param {Function} cloner The function to clone arguments.
|
* @param {Function} cloner The function to clone arguments.
|
||||||
* @returns {Function} Returns the new immutable function.
|
* @returns {Function} Returns the new immutable function.
|
||||||
*/
|
*/
|
||||||
function immutWrap(func, cloner) {
|
function wrapImmutable(func, cloner) {
|
||||||
return function() {
|
return function() {
|
||||||
var length = arguments.length;
|
var length = arguments.length;
|
||||||
if (!length) {
|
if (!length) {
|
||||||
return result;
|
return;
|
||||||
}
|
}
|
||||||
var args = Array(length);
|
var args = Array(length);
|
||||||
while (length--) {
|
while (length--) {
|
||||||
@@ -183,8 +216,7 @@ return /******/ (function(modules) { // webpackBootstrap
|
|||||||
* @returns {Function|Object} Returns the converted function or object.
|
* @returns {Function|Object} Returns the converted function or object.
|
||||||
*/
|
*/
|
||||||
function baseConvert(util, name, func, options) {
|
function baseConvert(util, name, func, options) {
|
||||||
var setPlaceholder,
|
var isLib = typeof name == 'function',
|
||||||
isLib = typeof name == 'function',
|
|
||||||
isObj = name === Object(name);
|
isObj = name === Object(name);
|
||||||
|
|
||||||
if (isObj) {
|
if (isObj) {
|
||||||
@@ -205,10 +237,10 @@ return /******/ (function(modules) { // webpackBootstrap
|
|||||||
'rearg': 'rearg' in options ? options.rearg : true
|
'rearg': 'rearg' in options ? options.rearg : true
|
||||||
};
|
};
|
||||||
|
|
||||||
var forceCurry = ('curry' in options) && options.curry,
|
var defaultHolder = isLib ? func : fallbackHolder,
|
||||||
|
forceCurry = ('curry' in options) && options.curry,
|
||||||
forceFixed = ('fixed' in options) && options.fixed,
|
forceFixed = ('fixed' in options) && options.fixed,
|
||||||
forceRearg = ('rearg' in options) && options.rearg,
|
forceRearg = ('rearg' in options) && options.rearg,
|
||||||
placeholder = isLib ? func : fallbackHolder,
|
|
||||||
pristine = isLib ? func.runInContext() : undefined;
|
pristine = isLib ? func.runInContext() : undefined;
|
||||||
|
|
||||||
var helpers = isLib ? func : {
|
var helpers = isLib ? func : {
|
||||||
@@ -218,11 +250,13 @@ return /******/ (function(modules) { // webpackBootstrap
|
|||||||
'curry': util.curry,
|
'curry': util.curry,
|
||||||
'forEach': util.forEach,
|
'forEach': util.forEach,
|
||||||
'isArray': util.isArray,
|
'isArray': util.isArray,
|
||||||
|
'isError': util.isError,
|
||||||
'isFunction': util.isFunction,
|
'isFunction': util.isFunction,
|
||||||
|
'isWeakMap': util.isWeakMap,
|
||||||
'iteratee': util.iteratee,
|
'iteratee': util.iteratee,
|
||||||
'keys': util.keys,
|
'keys': util.keys,
|
||||||
'rearg': util.rearg,
|
'rearg': util.rearg,
|
||||||
'spread': util.spread,
|
'toInteger': util.toInteger,
|
||||||
'toPath': util.toPath
|
'toPath': util.toPath
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -232,10 +266,12 @@ return /******/ (function(modules) { // webpackBootstrap
|
|||||||
curry = helpers.curry,
|
curry = helpers.curry,
|
||||||
each = helpers.forEach,
|
each = helpers.forEach,
|
||||||
isArray = helpers.isArray,
|
isArray = helpers.isArray,
|
||||||
|
isError = helpers.isError,
|
||||||
isFunction = helpers.isFunction,
|
isFunction = helpers.isFunction,
|
||||||
|
isWeakMap = helpers.isWeakMap,
|
||||||
keys = helpers.keys,
|
keys = helpers.keys,
|
||||||
rearg = helpers.rearg,
|
rearg = helpers.rearg,
|
||||||
spread = helpers.spread,
|
toInteger = helpers.toInteger,
|
||||||
toPath = helpers.toPath;
|
toPath = helpers.toPath;
|
||||||
|
|
||||||
var aryMethodKeys = keys(mapping.aryMethod);
|
var aryMethodKeys = keys(mapping.aryMethod);
|
||||||
@@ -269,30 +305,38 @@ return /******/ (function(modules) { // webpackBootstrap
|
|||||||
if (!isFunction(func)) {
|
if (!isFunction(func)) {
|
||||||
return mixin(func, Object(source));
|
return mixin(func, Object(source));
|
||||||
}
|
}
|
||||||
var methods = [],
|
var pairs = [];
|
||||||
methodNames = [];
|
|
||||||
|
|
||||||
each(keys(source), function(key) {
|
each(keys(source), function(key) {
|
||||||
var value = source[key];
|
if (isFunction(source[key])) {
|
||||||
if (isFunction(value)) {
|
pairs.push([key, func.prototype[key]]);
|
||||||
methodNames.push(key);
|
|
||||||
methods.push(func.prototype[key]);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
mixin(func, Object(source));
|
mixin(func, Object(source));
|
||||||
|
|
||||||
each(methodNames, function(methodName, index) {
|
each(pairs, function(pair) {
|
||||||
var method = methods[index];
|
var value = pair[1];
|
||||||
if (isFunction(method)) {
|
if (isFunction(value)) {
|
||||||
func.prototype[methodName] = method;
|
func.prototype[pair[0]] = value;
|
||||||
} else {
|
} else {
|
||||||
delete func.prototype[methodName];
|
delete func.prototype[pair[0]];
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return func;
|
return func;
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
'nthArg': function(nthArg) {
|
||||||
|
return function(n) {
|
||||||
|
var arity = n < 0 ? 1 : (toInteger(n) + 1);
|
||||||
|
return curry(nthArg(n), arity);
|
||||||
|
};
|
||||||
|
},
|
||||||
|
'rearg': function(rearg) {
|
||||||
|
return function(func, indexes) {
|
||||||
|
var arity = indexes ? indexes.length : 0;
|
||||||
|
return curry(rearg(func, indexes), arity);
|
||||||
|
};
|
||||||
|
},
|
||||||
'runInContext': function(runInContext) {
|
'runInContext': function(runInContext) {
|
||||||
return function(context) {
|
return function(context) {
|
||||||
return baseConvert(util, runInContext(context), options);
|
return baseConvert(util, runInContext(context), options);
|
||||||
@@ -302,6 +346,77 @@ return /******/ (function(modules) { // webpackBootstrap
|
|||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
/*--------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Casts `func` to a function with an arity capped iteratee if needed.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} name The name of the function to inspect.
|
||||||
|
* @param {Function} func The function to inspect.
|
||||||
|
* @returns {Function} Returns the cast function.
|
||||||
|
*/
|
||||||
|
function castCap(name, func) {
|
||||||
|
if (config.cap) {
|
||||||
|
var indexes = mapping.iterateeRearg[name];
|
||||||
|
if (indexes) {
|
||||||
|
return iterateeRearg(func, indexes);
|
||||||
|
}
|
||||||
|
var n = !isLib && mapping.iterateeAry[name];
|
||||||
|
if (n) {
|
||||||
|
return iterateeAry(func, n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return func;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Casts `func` to a curried function if needed.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} name The name of the function to inspect.
|
||||||
|
* @param {Function} func The function to inspect.
|
||||||
|
* @param {number} n The arity of `func`.
|
||||||
|
* @returns {Function} Returns the cast function.
|
||||||
|
*/
|
||||||
|
function castCurry(name, func, n) {
|
||||||
|
return (forceCurry || (config.curry && n > 1))
|
||||||
|
? curry(func, n)
|
||||||
|
: func;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Casts `func` to a fixed arity function if needed.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} name The name of the function to inspect.
|
||||||
|
* @param {Function} func The function to inspect.
|
||||||
|
* @param {number} n The arity cap.
|
||||||
|
* @returns {Function} Returns the cast function.
|
||||||
|
*/
|
||||||
|
function castFixed(name, func, n) {
|
||||||
|
if (config.fixed && (forceFixed || !mapping.skipFixed[name])) {
|
||||||
|
var data = mapping.methodSpread[name],
|
||||||
|
start = data && data.start;
|
||||||
|
|
||||||
|
return start === undefined ? ary(func, n) : flatSpread(func, start);
|
||||||
|
}
|
||||||
|
return func;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Casts `func` to an rearged function if needed.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} name The name of the function to inspect.
|
||||||
|
* @param {Function} func The function to inspect.
|
||||||
|
* @param {number} n The arity of `func`.
|
||||||
|
* @returns {Function} Returns the cast function.
|
||||||
|
*/
|
||||||
|
function castRearg(name, func, n) {
|
||||||
|
return (config.rearg && n > 1 && (forceRearg || !mapping.skipRearg[name]))
|
||||||
|
? rearg(func, mapping.methodRearg[name] || mapping.aryRearg[n])
|
||||||
|
: func;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a clone of `object` by `path`.
|
* Creates a clone of `object` by `path`.
|
||||||
*
|
*
|
||||||
@@ -315,6 +430,7 @@ return /******/ (function(modules) { // webpackBootstrap
|
|||||||
|
|
||||||
var index = -1,
|
var index = -1,
|
||||||
length = path.length,
|
length = path.length,
|
||||||
|
lastIndex = length - 1,
|
||||||
result = clone(Object(object)),
|
result = clone(Object(object)),
|
||||||
nested = result;
|
nested = result;
|
||||||
|
|
||||||
@@ -322,8 +438,9 @@ return /******/ (function(modules) { // webpackBootstrap
|
|||||||
var key = path[index],
|
var key = path[index],
|
||||||
value = nested[key];
|
value = nested[key];
|
||||||
|
|
||||||
if (value != null) {
|
if (value != null &&
|
||||||
nested[key] = clone(Object(value));
|
!(isFunction(value) || isError(value) || isWeakMap(value))) {
|
||||||
|
nested[key] = clone(index == lastIndex ? value : Object(value));
|
||||||
}
|
}
|
||||||
nested = nested[key];
|
nested = nested[key];
|
||||||
}
|
}
|
||||||
@@ -349,13 +466,16 @@ return /******/ (function(modules) { // webpackBootstrap
|
|||||||
* @returns {Function} Returns the new converter function.
|
* @returns {Function} Returns the new converter function.
|
||||||
*/
|
*/
|
||||||
function createConverter(name, func) {
|
function createConverter(name, func) {
|
||||||
var oldOptions = options;
|
var realName = mapping.aliasToReal[name] || name,
|
||||||
|
methodName = mapping.remap[realName] || realName,
|
||||||
|
oldOptions = options;
|
||||||
|
|
||||||
return function(options) {
|
return function(options) {
|
||||||
var newUtil = isLib ? pristine : helpers,
|
var newUtil = isLib ? pristine : helpers,
|
||||||
newFunc = isLib ? pristine[name] : func,
|
newFunc = isLib ? pristine[methodName] : func,
|
||||||
newOptions = assign(assign({}, oldOptions), options);
|
newOptions = assign(assign({}, oldOptions), options);
|
||||||
|
|
||||||
return baseConvert(newUtil, name, newFunc, newOptions);
|
return baseConvert(newUtil, realName, newFunc, newOptions);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -393,12 +513,11 @@ return /******/ (function(modules) { // webpackBootstrap
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a function that invokes `func` with its first argument passed
|
* Creates a function that invokes `func` with its first argument transformed.
|
||||||
* thru `transform`.
|
|
||||||
*
|
*
|
||||||
* @private
|
* @private
|
||||||
* @param {Function} func The function to wrap.
|
* @param {Function} func The function to wrap.
|
||||||
* @param {...Function} transform The functions to transform the first argument.
|
* @param {Function} transform The argument transform.
|
||||||
* @returns {Function} Returns the new function.
|
* @returns {Function} Returns the new function.
|
||||||
*/
|
*/
|
||||||
function overArg(func, transform) {
|
function overArg(func, transform) {
|
||||||
@@ -426,54 +545,38 @@ return /******/ (function(modules) { // webpackBootstrap
|
|||||||
* @param {Function} func The function to wrap.
|
* @param {Function} func The function to wrap.
|
||||||
* @returns {Function} Returns the converted function.
|
* @returns {Function} Returns the converted function.
|
||||||
*/
|
*/
|
||||||
function wrap(name, func) {
|
function wrap(name, func, placeholder) {
|
||||||
name = mapping.aliasToReal[name] || name;
|
|
||||||
|
|
||||||
var result,
|
var result,
|
||||||
|
realName = mapping.aliasToReal[name] || name,
|
||||||
wrapped = func,
|
wrapped = func,
|
||||||
wrapper = wrappers[name];
|
wrapper = wrappers[realName];
|
||||||
|
|
||||||
if (wrapper) {
|
if (wrapper) {
|
||||||
wrapped = wrapper(func);
|
wrapped = wrapper(func);
|
||||||
}
|
}
|
||||||
else if (config.immutable) {
|
else if (config.immutable) {
|
||||||
if (mutateMap.array[name]) {
|
if (mapping.mutate.array[realName]) {
|
||||||
wrapped = immutWrap(func, cloneArray);
|
wrapped = wrapImmutable(func, cloneArray);
|
||||||
}
|
}
|
||||||
else if (mutateMap.object[name]) {
|
else if (mapping.mutate.object[realName]) {
|
||||||
wrapped = immutWrap(func, createCloner(func));
|
wrapped = wrapImmutable(func, createCloner(func));
|
||||||
}
|
}
|
||||||
else if (mutateMap.set[name]) {
|
else if (mapping.mutate.set[realName]) {
|
||||||
wrapped = immutWrap(func, cloneByPath);
|
wrapped = wrapImmutable(func, cloneByPath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
each(aryMethodKeys, function(aryKey) {
|
each(aryMethodKeys, function(aryKey) {
|
||||||
each(mapping.aryMethod[aryKey], function(otherName) {
|
each(mapping.aryMethod[aryKey], function(otherName) {
|
||||||
if (name == otherName) {
|
if (realName == otherName) {
|
||||||
var aryN = !isLib && mapping.iterateeAry[name],
|
var data = mapping.methodSpread[realName],
|
||||||
reargIndexes = mapping.iterateeRearg[name],
|
afterRearg = data && data.afterRearg;
|
||||||
spreadStart = mapping.methodSpread[name];
|
|
||||||
|
|
||||||
result = wrapped;
|
result = afterRearg
|
||||||
if (config.fixed && (forceFixed || !mapping.skipFixed[name])) {
|
? castFixed(realName, castRearg(realName, wrapped, aryKey), aryKey)
|
||||||
result = spreadStart === undefined
|
: castRearg(realName, castFixed(realName, wrapped, aryKey), aryKey);
|
||||||
? ary(result, aryKey)
|
|
||||||
: spread(result, spreadStart);
|
result = castCap(realName, result);
|
||||||
}
|
result = castCurry(realName, result, aryKey);
|
||||||
if (config.rearg && aryKey > 1 && (forceRearg || !mapping.skipRearg[name])) {
|
|
||||||
result = rearg(result, mapping.methodRearg[name] || mapping.aryRearg[aryKey]);
|
|
||||||
}
|
|
||||||
if (config.cap) {
|
|
||||||
if (reargIndexes) {
|
|
||||||
result = iterateeRearg(result, reargIndexes);
|
|
||||||
} else if (aryN) {
|
|
||||||
result = iterateeAry(result, aryN);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (forceCurry || (config.curry && aryKey > 1)) {
|
|
||||||
forceCurry && console.log(forceCurry, name);
|
|
||||||
result = curry(result, aryKey);
|
|
||||||
}
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -486,18 +589,16 @@ return /******/ (function(modules) { // webpackBootstrap
|
|||||||
return func.apply(this, arguments);
|
return func.apply(this, arguments);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
result.convert = createConverter(name, func);
|
result.convert = createConverter(realName, func);
|
||||||
if (mapping.placeholder[name]) {
|
result.placeholder = func.placeholder = placeholder;
|
||||||
setPlaceholder = true;
|
|
||||||
result.placeholder = func.placeholder = placeholder;
|
|
||||||
}
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
/*--------------------------------------------------------------------------*/
|
||||||
|
|
||||||
if (!isObj) {
|
if (!isObj) {
|
||||||
return wrap(name, func);
|
return wrap(name, func, defaultHolder);
|
||||||
}
|
}
|
||||||
var _ = func;
|
var _ = func;
|
||||||
|
|
||||||
@@ -507,7 +608,7 @@ return /******/ (function(modules) { // webpackBootstrap
|
|||||||
each(mapping.aryMethod[aryKey], function(key) {
|
each(mapping.aryMethod[aryKey], function(key) {
|
||||||
var func = _[mapping.remap[key] || key];
|
var func = _[mapping.remap[key] || key];
|
||||||
if (func) {
|
if (func) {
|
||||||
pairs.push([key, wrap(key, func)]);
|
pairs.push([key, wrap(key, func, _)]);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -533,9 +634,8 @@ return /******/ (function(modules) { // webpackBootstrap
|
|||||||
});
|
});
|
||||||
|
|
||||||
_.convert = convertLib;
|
_.convert = convertLib;
|
||||||
if (setPlaceholder) {
|
_.placeholder = _;
|
||||||
_.placeholder = placeholder;
|
|
||||||
}
|
|
||||||
// Assign aliases.
|
// Assign aliases.
|
||||||
each(keys(_), function(key) {
|
each(keys(_), function(key) {
|
||||||
each(mapping.realToAlias[key] || [], function(alias) {
|
each(mapping.realToAlias[key] || [], function(alias) {
|
||||||
@@ -549,9 +649,9 @@ return /******/ (function(modules) { // webpackBootstrap
|
|||||||
module.exports = baseConvert;
|
module.exports = baseConvert;
|
||||||
|
|
||||||
|
|
||||||
/***/ },
|
/***/ }),
|
||||||
/* 2 */
|
/* 2 */
|
||||||
/***/ function(module, exports) {
|
/***/ (function(module, exports) {
|
||||||
|
|
||||||
/** Used to map aliases to their real names. */
|
/** Used to map aliases to their real names. */
|
||||||
exports.aliasToReal = {
|
exports.aliasToReal = {
|
||||||
@@ -562,11 +662,20 @@ return /******/ (function(modules) { // webpackBootstrap
|
|||||||
'entries': 'toPairs',
|
'entries': 'toPairs',
|
||||||
'entriesIn': 'toPairsIn',
|
'entriesIn': 'toPairsIn',
|
||||||
'extend': 'assignIn',
|
'extend': 'assignIn',
|
||||||
|
'extendAll': 'assignInAll',
|
||||||
|
'extendAllWith': 'assignInAllWith',
|
||||||
'extendWith': 'assignInWith',
|
'extendWith': 'assignInWith',
|
||||||
'first': 'head',
|
'first': 'head',
|
||||||
|
|
||||||
|
// Methods that are curried variants of others.
|
||||||
|
'conforms': 'conformsTo',
|
||||||
|
'matches': 'isMatch',
|
||||||
|
'property': 'get',
|
||||||
|
|
||||||
// Ramda aliases.
|
// Ramda aliases.
|
||||||
'__': 'placeholder',
|
'__': 'placeholder',
|
||||||
|
'F': 'stubFalse',
|
||||||
|
'T': 'stubTrue',
|
||||||
'all': 'every',
|
'all': 'every',
|
||||||
'allPass': 'overEvery',
|
'allPass': 'overEvery',
|
||||||
'always': 'constant',
|
'always': 'constant',
|
||||||
@@ -580,68 +689,84 @@ return /******/ (function(modules) { // webpackBootstrap
|
|||||||
'contains': 'includes',
|
'contains': 'includes',
|
||||||
'dissoc': 'unset',
|
'dissoc': 'unset',
|
||||||
'dissocPath': 'unset',
|
'dissocPath': 'unset',
|
||||||
|
'dropLast': 'dropRight',
|
||||||
|
'dropLastWhile': 'dropRightWhile',
|
||||||
'equals': 'isEqual',
|
'equals': 'isEqual',
|
||||||
'identical': 'eq',
|
'identical': 'eq',
|
||||||
|
'indexBy': 'keyBy',
|
||||||
'init': 'initial',
|
'init': 'initial',
|
||||||
'invertObj': 'invert',
|
'invertObj': 'invert',
|
||||||
'juxt': 'over',
|
'juxt': 'over',
|
||||||
'mapObj': 'mapValues',
|
|
||||||
'omitAll': 'omit',
|
'omitAll': 'omit',
|
||||||
'nAry': 'ary',
|
'nAry': 'ary',
|
||||||
'path': 'get',
|
'path': 'get',
|
||||||
'pathEq': 'matchesProperty',
|
'pathEq': 'matchesProperty',
|
||||||
'pathOr': 'getOr',
|
'pathOr': 'getOr',
|
||||||
|
'paths': 'at',
|
||||||
'pickAll': 'pick',
|
'pickAll': 'pick',
|
||||||
'pipe': 'flow',
|
'pipe': 'flow',
|
||||||
|
'pluck': 'map',
|
||||||
'prop': 'get',
|
'prop': 'get',
|
||||||
'propOf': 'propertyOf',
|
'propEq': 'matchesProperty',
|
||||||
'propOr': 'getOr',
|
'propOr': 'getOr',
|
||||||
|
'props': 'at',
|
||||||
|
'symmetricDifference': 'xor',
|
||||||
|
'symmetricDifferenceBy': 'xorBy',
|
||||||
|
'symmetricDifferenceWith': 'xorWith',
|
||||||
|
'takeLast': 'takeRight',
|
||||||
|
'takeLastWhile': 'takeRightWhile',
|
||||||
'unapply': 'rest',
|
'unapply': 'rest',
|
||||||
'unnest': 'flatten',
|
'unnest': 'flatten',
|
||||||
'useWith': 'overArgs',
|
'useWith': 'overArgs',
|
||||||
'whereEq': 'filter',
|
'where': 'conformsTo',
|
||||||
|
'whereEq': 'isMatch',
|
||||||
'zipObj': 'zipObject'
|
'zipObj': 'zipObject'
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Used to map ary to method names. */
|
/** Used to map ary to method names. */
|
||||||
exports.aryMethod = {
|
exports.aryMethod = {
|
||||||
'1': [
|
'1': [
|
||||||
'attempt', 'castArray', 'ceil', 'create', 'curry', 'curryRight', 'floor',
|
'assignAll', 'assignInAll', 'attempt', 'castArray', 'ceil', 'create',
|
||||||
'flow', 'flowRight', 'fromPairs', 'invert', 'iteratee', 'memoize', 'method',
|
'curry', 'curryRight', 'defaultsAll', 'defaultsDeepAll', 'floor', 'flow',
|
||||||
'methodOf', 'mixin', 'over', 'overEvery', 'overSome', 'rest', 'reverse',
|
'flowRight', 'fromPairs', 'invert', 'iteratee', 'memoize', 'method', 'mergeAll',
|
||||||
|
'methodOf', 'mixin', 'nthArg', 'over', 'overEvery', 'overSome','rest', 'reverse',
|
||||||
'round', 'runInContext', 'spread', 'template', 'trim', 'trimEnd', 'trimStart',
|
'round', 'runInContext', 'spread', 'template', 'trim', 'trimEnd', 'trimStart',
|
||||||
'uniqueId', 'words'
|
'uniqueId', 'words', 'zipAll'
|
||||||
],
|
],
|
||||||
'2': [
|
'2': [
|
||||||
'add', 'after', 'ary', 'assign', 'assignIn', 'at', 'before', 'bind', 'bindAll',
|
'add', 'after', 'ary', 'assign', 'assignAllWith', 'assignIn', 'assignInAllWith',
|
||||||
'bindKey', 'chunk', 'cloneDeepWith', 'cloneWith', 'concat', 'countBy', 'curryN',
|
'at', 'before', 'bind', 'bindAll', 'bindKey', 'chunk', 'cloneDeepWith',
|
||||||
'curryRightN', 'debounce', 'defaults', 'defaultsDeep', 'delay', 'difference',
|
'cloneWith', 'concat', 'conformsTo', 'countBy', 'curryN', 'curryRightN',
|
||||||
'divide', 'drop', 'dropRight', 'dropRightWhile', 'dropWhile', 'endsWith',
|
'debounce', 'defaults', 'defaultsDeep', 'defaultTo', 'delay', 'difference',
|
||||||
'eq', 'every', 'filter', 'find', 'find', 'findIndex', 'findKey', 'findLast',
|
'divide', 'drop', 'dropRight', 'dropRightWhile', 'dropWhile', 'endsWith', 'eq',
|
||||||
'findLastIndex', 'findLastKey', 'flatMap', 'flatMapDeep', 'flattenDepth',
|
'every', 'filter', 'find', 'findIndex', 'findKey', 'findLast', 'findLastIndex',
|
||||||
'forEach', 'forEachRight', 'forIn', 'forInRight', 'forOwn', 'forOwnRight',
|
'findLastKey', 'flatMap', 'flatMapDeep', 'flattenDepth', 'forEach',
|
||||||
'get', 'groupBy', 'gt', 'gte', 'has', 'hasIn', 'includes', 'indexOf',
|
'forEachRight', 'forIn', 'forInRight', 'forOwn', 'forOwnRight', 'get',
|
||||||
'intersection', 'invertBy', 'invoke', 'invokeMap', 'isEqual', 'isMatch',
|
'groupBy', 'gt', 'gte', 'has', 'hasIn', 'includes', 'indexOf', 'intersection',
|
||||||
'join', 'keyBy', 'lastIndexOf', 'lt', 'lte', 'map', 'mapKeys', 'mapValues',
|
'invertBy', 'invoke', 'invokeMap', 'isEqual', 'isMatch', 'join', 'keyBy',
|
||||||
'matchesProperty', 'maxBy', 'meanBy', 'merge', 'minBy', 'multiply', 'omit', 'omitBy',
|
'lastIndexOf', 'lt', 'lte', 'map', 'mapKeys', 'mapValues', 'matchesProperty',
|
||||||
'overArgs', 'pad', 'padEnd', 'padStart', 'parseInt', 'partial', 'partialRight',
|
'maxBy', 'meanBy', 'merge', 'mergeAllWith', 'minBy', 'multiply', 'nth', 'omit',
|
||||||
'partition', 'pick', 'pickBy', 'pull', 'pullAll', 'pullAt', 'random', 'range',
|
'omitBy', 'overArgs', 'pad', 'padEnd', 'padStart', 'parseInt', 'partial',
|
||||||
'rangeRight', 'rearg', 'reject', 'remove', 'repeat', 'restFrom', 'result',
|
'partialRight', 'partition', 'pick', 'pickBy', 'propertyOf', 'pull', 'pullAll',
|
||||||
'sampleSize', 'some', 'sortBy', 'sortedIndex', 'sortedIndexOf', 'sortedLastIndex',
|
'pullAt', 'random', 'range', 'rangeRight', 'rearg', 'reject', 'remove',
|
||||||
'sortedLastIndexOf', 'sortedUniqBy', 'split', 'spreadFrom', 'startsWith',
|
'repeat', 'restFrom', 'result', 'sampleSize', 'some', 'sortBy', 'sortedIndex',
|
||||||
'subtract', 'sumBy', 'take', 'takeRight', 'takeRightWhile', 'takeWhile', 'tap',
|
'sortedIndexOf', 'sortedLastIndex', 'sortedLastIndexOf', 'sortedUniqBy',
|
||||||
'throttle', 'thru', 'times', 'trimChars', 'trimCharsEnd', 'trimCharsStart',
|
'split', 'spreadFrom', 'startsWith', 'subtract', 'sumBy', 'take', 'takeRight',
|
||||||
'truncate', 'union', 'uniqBy', 'uniqWith', 'unset', 'unzipWith', 'without',
|
'takeRightWhile', 'takeWhile', 'tap', 'throttle', 'thru', 'times', 'trimChars',
|
||||||
'wrap', 'xor', 'zip', 'zipObject', 'zipObjectDeep'
|
'trimCharsEnd', 'trimCharsStart', 'truncate', 'union', 'uniqBy', 'uniqWith',
|
||||||
|
'unset', 'unzipWith', 'without', 'wrap', 'xor', 'zip', 'zipObject',
|
||||||
|
'zipObjectDeep'
|
||||||
],
|
],
|
||||||
'3': [
|
'3': [
|
||||||
'assignInWith', 'assignWith', 'clamp', 'differenceBy', 'differenceWith',
|
'assignInWith', 'assignWith', 'clamp', 'differenceBy', 'differenceWith',
|
||||||
'getOr', 'inRange', 'intersectionBy', 'intersectionWith', 'invokeArgs',
|
'findFrom', 'findIndexFrom', 'findLastFrom', 'findLastIndexFrom', 'getOr',
|
||||||
'invokeArgsMap', 'isEqualWith', 'isMatchWith', 'flatMapDepth', 'mergeWith',
|
'includesFrom', 'indexOfFrom', 'inRange', 'intersectionBy', 'intersectionWith',
|
||||||
'orderBy', 'padChars', 'padCharsEnd', 'padCharsStart', 'pullAllBy',
|
'invokeArgs', 'invokeArgsMap', 'isEqualWith', 'isMatchWith', 'flatMapDepth',
|
||||||
'pullAllWith', 'reduce', 'reduceRight', 'replace', 'set', 'slice',
|
'lastIndexOfFrom', 'mergeWith', 'orderBy', 'padChars', 'padCharsEnd',
|
||||||
'sortedIndexBy', 'sortedLastIndexBy', 'transform', 'unionBy', 'unionWith',
|
'padCharsStart', 'pullAllBy', 'pullAllWith', 'rangeStep', 'rangeStepRight',
|
||||||
'update', 'xorBy', 'xorWith', 'zipWith'
|
'reduce', 'reduceRight', 'replace', 'set', 'slice', 'sortedIndexBy',
|
||||||
|
'sortedLastIndexBy', 'transform', 'unionBy', 'unionWith', 'update', 'xorBy',
|
||||||
|
'xorWith', 'zipWith'
|
||||||
],
|
],
|
||||||
'4': [
|
'4': [
|
||||||
'fill', 'setWith', 'updateWith'
|
'fill', 'setWith', 'updateWith'
|
||||||
@@ -662,10 +787,14 @@ return /******/ (function(modules) { // webpackBootstrap
|
|||||||
'every': 1,
|
'every': 1,
|
||||||
'filter': 1,
|
'filter': 1,
|
||||||
'find': 1,
|
'find': 1,
|
||||||
|
'findFrom': 1,
|
||||||
'findIndex': 1,
|
'findIndex': 1,
|
||||||
|
'findIndexFrom': 1,
|
||||||
'findKey': 1,
|
'findKey': 1,
|
||||||
'findLast': 1,
|
'findLast': 1,
|
||||||
|
'findLastFrom': 1,
|
||||||
'findLastIndex': 1,
|
'findLastIndex': 1,
|
||||||
|
'findLastIndexFrom': 1,
|
||||||
'findLastKey': 1,
|
'findLastKey': 1,
|
||||||
'flatMap': 1,
|
'flatMap': 1,
|
||||||
'flatMapDeep': 1,
|
'flatMapDeep': 1,
|
||||||
@@ -693,40 +822,59 @@ return /******/ (function(modules) { // webpackBootstrap
|
|||||||
|
|
||||||
/** Used to map method names to iteratee rearg configs. */
|
/** Used to map method names to iteratee rearg configs. */
|
||||||
exports.iterateeRearg = {
|
exports.iterateeRearg = {
|
||||||
'mapKeys': [1]
|
'mapKeys': [1],
|
||||||
|
'reduceRight': [1, 0]
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Used to map method names to rearg configs. */
|
/** Used to map method names to rearg configs. */
|
||||||
exports.methodRearg = {
|
exports.methodRearg = {
|
||||||
|
'assignInAllWith': [1, 0],
|
||||||
'assignInWith': [1, 2, 0],
|
'assignInWith': [1, 2, 0],
|
||||||
|
'assignAllWith': [1, 0],
|
||||||
'assignWith': [1, 2, 0],
|
'assignWith': [1, 2, 0],
|
||||||
|
'differenceBy': [1, 2, 0],
|
||||||
|
'differenceWith': [1, 2, 0],
|
||||||
'getOr': [2, 1, 0],
|
'getOr': [2, 1, 0],
|
||||||
|
'intersectionBy': [1, 2, 0],
|
||||||
|
'intersectionWith': [1, 2, 0],
|
||||||
'isEqualWith': [1, 2, 0],
|
'isEqualWith': [1, 2, 0],
|
||||||
'isMatchWith': [2, 1, 0],
|
'isMatchWith': [2, 1, 0],
|
||||||
|
'mergeAllWith': [1, 0],
|
||||||
'mergeWith': [1, 2, 0],
|
'mergeWith': [1, 2, 0],
|
||||||
'padChars': [2, 1, 0],
|
'padChars': [2, 1, 0],
|
||||||
'padCharsEnd': [2, 1, 0],
|
'padCharsEnd': [2, 1, 0],
|
||||||
'padCharsStart': [2, 1, 0],
|
'padCharsStart': [2, 1, 0],
|
||||||
'pullAllBy': [2, 1, 0],
|
'pullAllBy': [2, 1, 0],
|
||||||
'pullAllWith': [2, 1, 0],
|
'pullAllWith': [2, 1, 0],
|
||||||
|
'rangeStep': [1, 2, 0],
|
||||||
|
'rangeStepRight': [1, 2, 0],
|
||||||
'setWith': [3, 1, 2, 0],
|
'setWith': [3, 1, 2, 0],
|
||||||
'sortedIndexBy': [2, 1, 0],
|
'sortedIndexBy': [2, 1, 0],
|
||||||
'sortedLastIndexBy': [2, 1, 0],
|
'sortedLastIndexBy': [2, 1, 0],
|
||||||
|
'unionBy': [1, 2, 0],
|
||||||
|
'unionWith': [1, 2, 0],
|
||||||
'updateWith': [3, 1, 2, 0],
|
'updateWith': [3, 1, 2, 0],
|
||||||
|
'xorBy': [1, 2, 0],
|
||||||
|
'xorWith': [1, 2, 0],
|
||||||
'zipWith': [1, 2, 0]
|
'zipWith': [1, 2, 0]
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Used to map method names to spread configs. */
|
/** Used to map method names to spread configs. */
|
||||||
exports.methodSpread = {
|
exports.methodSpread = {
|
||||||
'invokeArgs': 2,
|
'assignAll': { 'start': 0 },
|
||||||
'invokeArgsMap': 2,
|
'assignAllWith': { 'start': 0 },
|
||||||
'over': 0,
|
'assignInAll': { 'start': 0 },
|
||||||
'overArgs': 1,
|
'assignInAllWith': { 'start': 0 },
|
||||||
'overEvery': 0,
|
'defaultsAll': { 'start': 0 },
|
||||||
'overSome': 0,
|
'defaultsDeepAll': { 'start': 0 },
|
||||||
'partial': 1,
|
'invokeArgs': { 'start': 2 },
|
||||||
'partialRight': 1,
|
'invokeArgsMap': { 'start': 2 },
|
||||||
'without': 1
|
'mergeAll': { 'start': 0 },
|
||||||
|
'mergeAllWith': { 'start': 0 },
|
||||||
|
'partial': { 'start': 1 },
|
||||||
|
'partialRight': { 'start': 1 },
|
||||||
|
'without': { 'start': 1 },
|
||||||
|
'zipAll': { 'start': 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Used to identify methods which mutate arrays or objects. */
|
/** Used to identify methods which mutate arrays or objects. */
|
||||||
@@ -743,13 +891,21 @@ return /******/ (function(modules) { // webpackBootstrap
|
|||||||
},
|
},
|
||||||
'object': {
|
'object': {
|
||||||
'assign': true,
|
'assign': true,
|
||||||
|
'assignAll': true,
|
||||||
|
'assignAllWith': true,
|
||||||
'assignIn': true,
|
'assignIn': true,
|
||||||
|
'assignInAll': true,
|
||||||
|
'assignInAllWith': true,
|
||||||
'assignInWith': true,
|
'assignInWith': true,
|
||||||
'assignWith': true,
|
'assignWith': true,
|
||||||
'defaults': true,
|
'defaults': true,
|
||||||
|
'defaultsAll': true,
|
||||||
'defaultsDeep': true,
|
'defaultsDeep': true,
|
||||||
|
'defaultsDeepAll': true,
|
||||||
'merge': true,
|
'merge': true,
|
||||||
'mergeWith': true
|
'mergeAll': true,
|
||||||
|
'mergeAllWith': true,
|
||||||
|
'mergeWith': true,
|
||||||
},
|
},
|
||||||
'set': {
|
'set': {
|
||||||
'set': true,
|
'set': true,
|
||||||
@@ -760,16 +916,6 @@ return /******/ (function(modules) { // webpackBootstrap
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Used to track methods with placeholder support */
|
|
||||||
exports.placeholder = {
|
|
||||||
'bind': true,
|
|
||||||
'bindKey': true,
|
|
||||||
'curry': true,
|
|
||||||
'curryRight': true,
|
|
||||||
'partial': true,
|
|
||||||
'partialRight': true
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Used to map real names to their aliases. */
|
/** Used to map real names to their aliases. */
|
||||||
exports.realToAlias = (function() {
|
exports.realToAlias = (function() {
|
||||||
var hasOwnProperty = Object.prototype.hasOwnProperty,
|
var hasOwnProperty = Object.prototype.hasOwnProperty,
|
||||||
@@ -789,19 +935,38 @@ return /******/ (function(modules) { // webpackBootstrap
|
|||||||
|
|
||||||
/** Used to map method names to other names. */
|
/** Used to map method names to other names. */
|
||||||
exports.remap = {
|
exports.remap = {
|
||||||
|
'assignAll': 'assign',
|
||||||
|
'assignAllWith': 'assignWith',
|
||||||
|
'assignInAll': 'assignIn',
|
||||||
|
'assignInAllWith': 'assignInWith',
|
||||||
'curryN': 'curry',
|
'curryN': 'curry',
|
||||||
'curryRightN': 'curryRight',
|
'curryRightN': 'curryRight',
|
||||||
|
'defaultsAll': 'defaults',
|
||||||
|
'defaultsDeepAll': 'defaultsDeep',
|
||||||
|
'findFrom': 'find',
|
||||||
|
'findIndexFrom': 'findIndex',
|
||||||
|
'findLastFrom': 'findLast',
|
||||||
|
'findLastIndexFrom': 'findLastIndex',
|
||||||
'getOr': 'get',
|
'getOr': 'get',
|
||||||
|
'includesFrom': 'includes',
|
||||||
|
'indexOfFrom': 'indexOf',
|
||||||
'invokeArgs': 'invoke',
|
'invokeArgs': 'invoke',
|
||||||
'invokeArgsMap': 'invokeMap',
|
'invokeArgsMap': 'invokeMap',
|
||||||
|
'lastIndexOfFrom': 'lastIndexOf',
|
||||||
|
'mergeAll': 'merge',
|
||||||
|
'mergeAllWith': 'mergeWith',
|
||||||
'padChars': 'pad',
|
'padChars': 'pad',
|
||||||
'padCharsEnd': 'padEnd',
|
'padCharsEnd': 'padEnd',
|
||||||
'padCharsStart': 'padStart',
|
'padCharsStart': 'padStart',
|
||||||
|
'propertyOf': 'get',
|
||||||
|
'rangeStep': 'range',
|
||||||
|
'rangeStepRight': 'rangeRight',
|
||||||
'restFrom': 'rest',
|
'restFrom': 'rest',
|
||||||
'spreadFrom': 'spread',
|
'spreadFrom': 'spread',
|
||||||
'trimChars': 'trim',
|
'trimChars': 'trim',
|
||||||
'trimCharsEnd': 'trimEnd',
|
'trimCharsEnd': 'trimEnd',
|
||||||
'trimCharsStart': 'trimStart'
|
'trimCharsStart': 'trimStart',
|
||||||
|
'zipAll': 'zip'
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Used to track methods that skip fixing their arity. */
|
/** Used to track methods that skip fixing their arity. */
|
||||||
@@ -811,6 +976,7 @@ return /******/ (function(modules) { // webpackBootstrap
|
|||||||
'flowRight': true,
|
'flowRight': true,
|
||||||
'iteratee': true,
|
'iteratee': true,
|
||||||
'mixin': true,
|
'mixin': true,
|
||||||
|
'rearg': true,
|
||||||
'runInContext': true
|
'runInContext': true
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -836,19 +1002,20 @@ return /******/ (function(modules) { // webpackBootstrap
|
|||||||
'overArgs': true,
|
'overArgs': true,
|
||||||
'partial': true,
|
'partial': true,
|
||||||
'partialRight': true,
|
'partialRight': true,
|
||||||
|
'propertyOf': true,
|
||||||
'random': true,
|
'random': true,
|
||||||
'range': true,
|
'range': true,
|
||||||
'rangeRight': true,
|
'rangeRight': true,
|
||||||
'subtract': true,
|
'subtract': true,
|
||||||
'without': true,
|
|
||||||
'zip': true,
|
'zip': true,
|
||||||
'zipObject': true
|
'zipObject': true,
|
||||||
|
'zipObjectDeep': true
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/***/ },
|
/***/ }),
|
||||||
/* 3 */
|
/* 3 */
|
||||||
/***/ function(module, exports) {
|
/***/ (function(module, exports) {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The default argument placeholder value for methods.
|
* The default argument placeholder value for methods.
|
||||||
@@ -858,7 +1025,7 @@ return /******/ (function(modules) { // webpackBootstrap
|
|||||||
module.exports = {};
|
module.exports = {};
|
||||||
|
|
||||||
|
|
||||||
/***/ }
|
/***/ })
|
||||||
/******/ ])
|
/******/ ])
|
||||||
});
|
});
|
||||||
;
|
;
|
||||||
38
dist/lodash.fp.min.js
vendored
38
dist/lodash.fp.min.js
vendored
@@ -1,17 +1,21 @@
|
|||||||
!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.fp=e():t.fp=e()}(this,function(){return function(t){function e(n){if(r[n])return r[n].exports;var i=r[n]={exports:{},id:n,loaded:!1};return t[n].call(i.exports,i,i.exports,e),i.loaded=!0,i.exports}var r={};return e.m=t,e.c=r,e.p="",e(0)}([function(t,e,r){function n(t,e){return i(t,t,e)}var i=r(1);"function"==typeof _&&(_=n(_.runInContext())),
|
(function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.fp=e():t.fp=e()})(this,function(){return function(t){function e(n){if(r[n])return r[n].exports;var i=r[n]={exports:{},id:n,loaded:!1};return t[n].call(i.exports,i,i.exports,e),i.loaded=!0,i.exports}var r={};return e.m=t,e.c=r,e.p="",e(0)}([function(t,e,r){function n(t,e){return i(t,t,e)}var i=r(1);"function"==typeof _&&"function"==typeof _.runInContext&&(_=n(_.runInContext())),
|
||||||
t.exports=n},function(t,e,r){function n(t,e){return 2==e?function(e,r){return t.apply(void 0,arguments)}:function(e){return t.apply(void 0,arguments)}}function i(t,e){return 2==e?function(e,r){return t(e,r)}:function(e){return t(e)}}function a(t){for(var e=t?t.length:0,r=Array(e);e--;)r[e]=t[e];return r}function o(t){return function(e){return t({},e)}}function s(t,e){return function(){var r=arguments.length;if(!r)return i;for(var n=Array(r);r--;)n[r]=arguments[r];var i=n[0]=e.apply(void 0,n);return t.apply(void 0,n),
|
t.exports=n},function(t,e,r){function n(t,e){return 2==e?function(e,r){return t.apply(void 0,arguments)}:function(e){return t.apply(void 0,arguments)}}function i(t,e){return 2==e?function(e,r){return t(e,r)}:function(e){return t(e)}}function a(t){for(var e=t?t.length:0,r=Array(e);e--;)r[e]=t[e];return r}function o(t){return function(e){return t({},e)}}function s(t,e){return function(){for(var r=arguments.length,n=r-1,i=Array(r);r--;)i[r]=arguments[r];var a=i[e],o=i.slice(0,e);return a&&d.apply(o,a),
|
||||||
i}}function u(t,e,r,d){function f(t,e){e=F(e);for(var r=-1,n=e.length,i=M(Object(t)),a=i;null!=a&&++r<n;){var o=e[r],s=a[o];null!=s&&(a[o]=M(Object(s))),a=a[o]}return i}function h(t){return N.runInContext.convert(t)(void 0)}function y(t,e){var r=d;return function(n){var i=R?B:j,a=R?B[t]:e,o=w(w({},r),n);return u(i,t,a,o)}}function g(t,e){return v(t,function(t){return"function"==typeof t?i(t,e):t})}function m(t,e){return v(t,function(t){var r=e.length;return n(L(i(t,r),e),r)})}function v(t,e){return function(){
|
e!=n&&d.apply(o,i.slice(e+1)),t.apply(this,o)}}function l(t,e){return function(){var r=arguments.length;if(r){for(var n=Array(r);r--;)n[r]=arguments[r];var i=n[0]=e.apply(void 0,n);return t.apply(void 0,n),i}}}function u(t,e,r,d){function c(t,e){if(b.cap){var r=p.iterateeRearg[t];if(r)return x(e,r);var n=!O&&p.iterateeAry[t];if(n)return W(e,n)}return e}function h(t,e,r){return E||b.curry&&r>1?D(e,r):e}function g(t,e,r){if(b.fixed&&(F||!p.skipFixed[t])){var n=p.methodSpread[t],i=n&&n.start;return void 0===i?L(e,r):s(e,i);
|
||||||
var r=arguments.length;if(!r)return t();for(var n=Array(r);r--;)n[r]=arguments[r];var i=I.rearg?0:r-1;return n[i]=e(n[i]),t.apply(void 0,n)}}function x(t,e){t=p.aliasToReal[t]||t;var r,n=e,i=_[t];return i?n=i(e):I.immutable&&(l.array[t]?n=s(e,a):l.object[t]?n=s(e,o(e)):l.set[t]&&(n=s(e,f))),S(T,function(e){return S(p.aryMethod[e],function(i){if(t==i){var a=!R&&p.iterateeAry[t],o=p.iterateeRearg[t],s=p.methodSpread[t];return r=n,!I.fixed||!O&&p.skipFixed[t]||(r=void 0===s?C(r,e):D(r,s)),I.rearg&&e>1&&(k||!p.skipRearg[t])&&(r=L(r,p.methodRearg[t]||p.aryRearg[e])),
|
}return e}function y(t,e,r){return b.rearg&&r>1&&(M||!p.skipRearg[t])?N(e,p.methodRearg[t]||p.aryRearg[r]):e}function m(t,e){e=U(e);for(var r=-1,n=e.length,i=n-1,a=w(Object(t)),o=a;null!=o&&++r<n;){var s=e[r],l=o[s];null==l||T(l)||P(l)||K(l)||(o[s]=w(r==i?l:Object(l))),o=o[s]}return a}function v(t){return J.runInContext.convert(t)(void 0)}function A(t,e){var r=p.aliasToReal[t]||t,n=p.remap[r]||r,i=d;return function(t){return u(O?j:C,r,O?j[n]:e,S(S({},i),t))}}function W(t,e){return I(t,function(t){
|
||||||
I.cap&&(o?r=m(r,o):a&&(r=g(r,a))),(b||I.curry&&e>1)&&(b&&console.log(b,t),r=q(r,e)),!1}}),!r}),r||(r=n),r==e&&(r=b?q(r,1):function(){return e.apply(this,arguments)}),r.convert=y(t,e),p.placeholder[t]&&(W=!0,r.placeholder=e.placeholder=E),r}var W,R="function"==typeof e,A=e===Object(e);if(A&&(d=r,r=e,e=void 0),null==r)throw new TypeError;d||(d={});var I={cap:"cap"in d?d.cap:!0,curry:"curry"in d?d.curry:!0,fixed:"fixed"in d?d.fixed:!0,immutable:"immutable"in d?d.immutable:!0,rearg:"rearg"in d?d.rearg:!0
|
return"function"==typeof t?i(t,e):t})}function x(t,e){return I(t,function(t){var r=e.length;return n(N(i(t,r),e),r)})}function I(t,e){return function(){var r=arguments.length;if(!r)return t();for(var n=Array(r);r--;)n[r]=arguments[r];var i=b.rearg?0:r-1;return n[i]=e(n[i]),t.apply(void 0,n)}}function R(t,e,r){var n,i=p.aliasToReal[t]||t,s=e,u=H[i];return u?s=u(e):b.immutable&&(p.mutate.array[i]?s=l(e,a):p.mutate.object[i]?s=l(e,o(e)):p.mutate.set[i]&&(s=l(e,m))),z(G,function(t){return z(p.aryMethod[t],function(e){
|
||||||
},b="curry"in d&&d.curry,O="fixed"in d&&d.fixed,k="rearg"in d&&d.rearg,E=R?r:c,B=R?r.runInContext():void 0,j=R?r:{ary:t.ary,assign:t.assign,clone:t.clone,curry:t.curry,forEach:t.forEach,isArray:t.isArray,isFunction:t.isFunction,iteratee:t.iteratee,keys:t.keys,rearg:t.rearg,spread:t.spread,toPath:t.toPath},C=j.ary,w=j.assign,M=j.clone,q=j.curry,S=j.forEach,P=j.isArray,z=j.isFunction,K=j.keys,L=j.rearg,D=j.spread,F=j.toPath,T=K(p.aryMethod),_={castArray:function(t){return function(){var e=arguments[0];
|
if(i==e){var r=p.methodSpread[i];return n=r&&r.afterRearg?g(i,y(i,s,t),t):y(i,g(i,s,t),t),n=c(i,n),n=h(i,n,t),!1}}),!n}),n||(n=s),n==e&&(n=E?D(n,1):function(){return e.apply(this,arguments)}),n.convert=A(i,e),n.placeholder=e.placeholder=r,n}var O="function"==typeof e,k=e===Object(e);if(k&&(d=r,r=e,e=void 0),null==r)throw new TypeError;d||(d={});var b={cap:!("cap"in d)||d.cap,curry:!("curry"in d)||d.curry,fixed:!("fixed"in d)||d.fixed,immutable:!("immutable"in d)||d.immutable,rearg:!("rearg"in d)||d.rearg
|
||||||
return P(e)?t(a(e)):t.apply(void 0,arguments)}},iteratee:function(t){return function(){var e=arguments[0],r=arguments[1],n=t(e,r),a=n.length;return I.cap&&"number"==typeof r?(r=r>2?r-2:1,a&&r>=a?n:i(n,r)):n}},mixin:function(t){return function(e){var r=this;if(!z(r))return t(r,Object(e));var n=[],i=[];return S(K(e),function(t){var a=e[t];z(a)&&(i.push(t),n.push(r.prototype[t]))}),t(r,Object(e)),S(i,function(t,e){var i=n[e];z(i)?r.prototype[t]=i:delete r.prototype[t]}),r}},runInContext:function(e){
|
},B=O?r:f,E="curry"in d&&d.curry,F="fixed"in d&&d.fixed,M="rearg"in d&&d.rearg,j=O?r.runInContext():void 0,C=O?r:{ary:t.ary,assign:t.assign,clone:t.clone,curry:t.curry,forEach:t.forEach,isArray:t.isArray,isError:t.isError,isFunction:t.isFunction,isWeakMap:t.isWeakMap,iteratee:t.iteratee,keys:t.keys,rearg:t.rearg,toInteger:t.toInteger,toPath:t.toPath},L=C.ary,S=C.assign,w=C.clone,D=C.curry,z=C.forEach,q=C.isArray,P=C.isError,T=C.isFunction,K=C.isWeakMap,_=C.keys,N=C.rearg,V=C.toInteger,U=C.toPath,G=_(p.aryMethod),H={
|
||||||
return function(r){return u(t,e(r),d)}}};if(!A)return x(e,r);var N=r,V=[];return S(T,function(t){S(p.aryMethod[t],function(t){var e=N[p.remap[t]||t];e&&V.push([t,x(t,e)])})}),S(K(N),function(t){var e=N[t];if("function"==typeof e){for(var r=V.length;r--;)if(V[r][0]==t)return;e.convert=y(t,e),V.push([t,e])}}),S(V,function(t){N[t[0]]=t[1]}),N.convert=h,W&&(N.placeholder=E),S(K(N),function(t){S(p.realToAlias[t]||[],function(e){N[e]=N[t]})}),N}var p=r(2),l=p.mutate,c=r(3);t.exports=u},function(t,e){e.aliasToReal={
|
castArray:function(t){return function(){var e=arguments[0];return q(e)?t(a(e)):t.apply(void 0,arguments)}},iteratee:function(t){return function(){var e=arguments[0],r=arguments[1],n=t(e,r),a=n.length;return b.cap&&"number"==typeof r?(r=r>2?r-2:1,a&&a<=r?n:i(n,r)):n}},mixin:function(t){return function(e){var r=this;if(!T(r))return t(r,Object(e));var n=[];return z(_(e),function(t){T(e[t])&&n.push([t,r.prototype[t]])}),t(r,Object(e)),z(n,function(t){var e=t[1];T(e)?r.prototype[t[0]]=e:delete r.prototype[t[0]];
|
||||||
each:"forEach",eachRight:"forEachRight",entries:"toPairs",entriesIn:"toPairsIn",extend:"assignIn",extendWith:"assignInWith",first:"head",__:"placeholder",all:"every",allPass:"overEvery",always:"constant",any:"some",anyPass:"overSome",apply:"spread",assoc:"set",assocPath:"set",complement:"negate",compose:"flowRight",contains:"includes",dissoc:"unset",dissocPath:"unset",equals:"isEqual",identical:"eq",init:"initial",invertObj:"invert",juxt:"over",mapObj:"mapValues",omitAll:"omit",nAry:"ary",path:"get",
|
}),r}},nthArg:function(t){return function(e){var r=e<0?1:V(e)+1;return D(t(e),r)}},rearg:function(t){return function(e,r){var n=r?r.length:0;return D(t(e,r),n)}},runInContext:function(e){return function(r){return u(t,e(r),d)}}};if(!k)return R(e,r,B);var J=r,Q=[];return z(G,function(t){z(p.aryMethod[t],function(t){var e=J[p.remap[t]||t];e&&Q.push([t,R(t,e,J)])})}),z(_(J),function(t){var e=J[t];if("function"==typeof e){for(var r=Q.length;r--;)if(Q[r][0]==t)return;e.convert=A(t,e),Q.push([t,e])}}),z(Q,function(t){
|
||||||
pathEq:"matchesProperty",pathOr:"getOr",pickAll:"pick",pipe:"flow",prop:"get",propOf:"propertyOf",propOr:"getOr",unapply:"rest",unnest:"flatten",useWith:"overArgs",whereEq:"filter",zipObj:"zipObject"},e.aryMethod={1:["attempt","castArray","ceil","create","curry","curryRight","floor","flow","flowRight","fromPairs","invert","iteratee","memoize","method","methodOf","mixin","over","overEvery","overSome","rest","reverse","round","runInContext","spread","template","trim","trimEnd","trimStart","uniqueId","words"],
|
J[t[0]]=t[1]}),J.convert=v,J.placeholder=J,z(_(J),function(t){z(p.realToAlias[t]||[],function(e){J[e]=J[t]})}),J}var p=r(2),f=r(3),d=Array.prototype.push;t.exports=u},function(t,e){e.aliasToReal={each:"forEach",eachRight:"forEachRight",entries:"toPairs",entriesIn:"toPairsIn",extend:"assignIn",extendAll:"assignInAll",extendAllWith:"assignInAllWith",extendWith:"assignInWith",first:"head",conforms:"conformsTo",matches:"isMatch",property:"get",__:"placeholder",F:"stubFalse",T:"stubTrue",all:"every",allPass:"overEvery",
|
||||||
2:["add","after","ary","assign","assignIn","at","before","bind","bindAll","bindKey","chunk","cloneDeepWith","cloneWith","concat","countBy","curryN","curryRightN","debounce","defaults","defaultsDeep","delay","difference","divide","drop","dropRight","dropRightWhile","dropWhile","endsWith","eq","every","filter","find","find","findIndex","findKey","findLast","findLastIndex","findLastKey","flatMap","flatMapDeep","flattenDepth","forEach","forEachRight","forIn","forInRight","forOwn","forOwnRight","get","groupBy","gt","gte","has","hasIn","includes","indexOf","intersection","invertBy","invoke","invokeMap","isEqual","isMatch","join","keyBy","lastIndexOf","lt","lte","map","mapKeys","mapValues","matchesProperty","maxBy","meanBy","merge","minBy","multiply","omit","omitBy","overArgs","pad","padEnd","padStart","parseInt","partial","partialRight","partition","pick","pickBy","pull","pullAll","pullAt","random","range","rangeRight","rearg","reject","remove","repeat","restFrom","result","sampleSize","some","sortBy","sortedIndex","sortedIndexOf","sortedLastIndex","sortedLastIndexOf","sortedUniqBy","split","spreadFrom","startsWith","subtract","sumBy","take","takeRight","takeRightWhile","takeWhile","tap","throttle","thru","times","trimChars","trimCharsEnd","trimCharsStart","truncate","union","uniqBy","uniqWith","unset","unzipWith","without","wrap","xor","zip","zipObject","zipObjectDeep"],
|
always:"constant",any:"some",anyPass:"overSome",apply:"spread",assoc:"set",assocPath:"set",complement:"negate",compose:"flowRight",contains:"includes",dissoc:"unset",dissocPath:"unset",dropLast:"dropRight",dropLastWhile:"dropRightWhile",equals:"isEqual",identical:"eq",indexBy:"keyBy",init:"initial",invertObj:"invert",juxt:"over",omitAll:"omit",nAry:"ary",path:"get",pathEq:"matchesProperty",pathOr:"getOr",paths:"at",pickAll:"pick",pipe:"flow",pluck:"map",prop:"get",propEq:"matchesProperty",propOr:"getOr",
|
||||||
3:["assignInWith","assignWith","clamp","differenceBy","differenceWith","getOr","inRange","intersectionBy","intersectionWith","invokeArgs","invokeArgsMap","isEqualWith","isMatchWith","flatMapDepth","mergeWith","orderBy","padChars","padCharsEnd","padCharsStart","pullAllBy","pullAllWith","reduce","reduceRight","replace","set","slice","sortedIndexBy","sortedLastIndexBy","transform","unionBy","unionWith","update","xorBy","xorWith","zipWith"],4:["fill","setWith","updateWith"]},e.aryRearg={2:[1,0],3:[2,0,1],
|
props:"at",symmetricDifference:"xor",symmetricDifferenceBy:"xorBy",symmetricDifferenceWith:"xorWith",takeLast:"takeRight",takeLastWhile:"takeRightWhile",unapply:"rest",unnest:"flatten",useWith:"overArgs",where:"conformsTo",whereEq:"isMatch",zipObj:"zipObject"},e.aryMethod={1:["assignAll","assignInAll","attempt","castArray","ceil","create","curry","curryRight","defaultsAll","defaultsDeepAll","floor","flow","flowRight","fromPairs","invert","iteratee","memoize","method","mergeAll","methodOf","mixin","nthArg","over","overEvery","overSome","rest","reverse","round","runInContext","spread","template","trim","trimEnd","trimStart","uniqueId","words","zipAll"],
|
||||||
4:[3,2,0,1]},e.iterateeAry={dropRightWhile:1,dropWhile:1,every:1,filter:1,find:1,findIndex:1,findKey:1,findLast:1,findLastIndex:1,findLastKey:1,flatMap:1,flatMapDeep:1,flatMapDepth:1,forEach:1,forEachRight:1,forIn:1,forInRight:1,forOwn:1,forOwnRight:1,map:1,mapKeys:1,mapValues:1,partition:1,reduce:2,reduceRight:2,reject:1,remove:1,some:1,takeRightWhile:1,takeWhile:1,times:1,transform:2},e.iterateeRearg={mapKeys:[1]},e.methodRearg={assignInWith:[1,2,0],assignWith:[1,2,0],getOr:[2,1,0],isEqualWith:[1,2,0],
|
2:["add","after","ary","assign","assignAllWith","assignIn","assignInAllWith","at","before","bind","bindAll","bindKey","chunk","cloneDeepWith","cloneWith","concat","conformsTo","countBy","curryN","curryRightN","debounce","defaults","defaultsDeep","defaultTo","delay","difference","divide","drop","dropRight","dropRightWhile","dropWhile","endsWith","eq","every","filter","find","findIndex","findKey","findLast","findLastIndex","findLastKey","flatMap","flatMapDeep","flattenDepth","forEach","forEachRight","forIn","forInRight","forOwn","forOwnRight","get","groupBy","gt","gte","has","hasIn","includes","indexOf","intersection","invertBy","invoke","invokeMap","isEqual","isMatch","join","keyBy","lastIndexOf","lt","lte","map","mapKeys","mapValues","matchesProperty","maxBy","meanBy","merge","mergeAllWith","minBy","multiply","nth","omit","omitBy","overArgs","pad","padEnd","padStart","parseInt","partial","partialRight","partition","pick","pickBy","propertyOf","pull","pullAll","pullAt","random","range","rangeRight","rearg","reject","remove","repeat","restFrom","result","sampleSize","some","sortBy","sortedIndex","sortedIndexOf","sortedLastIndex","sortedLastIndexOf","sortedUniqBy","split","spreadFrom","startsWith","subtract","sumBy","take","takeRight","takeRightWhile","takeWhile","tap","throttle","thru","times","trimChars","trimCharsEnd","trimCharsStart","truncate","union","uniqBy","uniqWith","unset","unzipWith","without","wrap","xor","zip","zipObject","zipObjectDeep"],
|
||||||
isMatchWith:[2,1,0],mergeWith:[1,2,0],padChars:[2,1,0],padCharsEnd:[2,1,0],padCharsStart:[2,1,0],pullAllBy:[2,1,0],pullAllWith:[2,1,0],setWith:[3,1,2,0],sortedIndexBy:[2,1,0],sortedLastIndexBy:[2,1,0],updateWith:[3,1,2,0],zipWith:[1,2,0]},e.methodSpread={invokeArgs:2,invokeArgsMap:2,over:0,overArgs:1,overEvery:0,overSome:0,partial:1,partialRight:1,without:1},e.mutate={array:{fill:!0,pull:!0,pullAll:!0,pullAllBy:!0,pullAllWith:!0,pullAt:!0,remove:!0,reverse:!0},object:{assign:!0,assignIn:!0,assignInWith:!0,
|
3:["assignInWith","assignWith","clamp","differenceBy","differenceWith","findFrom","findIndexFrom","findLastFrom","findLastIndexFrom","getOr","includesFrom","indexOfFrom","inRange","intersectionBy","intersectionWith","invokeArgs","invokeArgsMap","isEqualWith","isMatchWith","flatMapDepth","lastIndexOfFrom","mergeWith","orderBy","padChars","padCharsEnd","padCharsStart","pullAllBy","pullAllWith","rangeStep","rangeStepRight","reduce","reduceRight","replace","set","slice","sortedIndexBy","sortedLastIndexBy","transform","unionBy","unionWith","update","xorBy","xorWith","zipWith"],
|
||||||
assignWith:!0,defaults:!0,defaultsDeep:!0,merge:!0,mergeWith:!0},set:{set:!0,setWith:!0,unset:!0,update:!0,updateWith:!0}},e.placeholder={bind:!0,bindKey:!0,curry:!0,curryRight:!0,partial:!0,partialRight:!0},e.realToAlias=function(){var t=Object.prototype.hasOwnProperty,r=e.aliasToReal,n={};for(var i in r){var a=r[i];t.call(n,a)?n[a].push(i):n[a]=[i]}return n}(),e.remap={curryN:"curry",curryRightN:"curryRight",getOr:"get",invokeArgs:"invoke",invokeArgsMap:"invokeMap",padChars:"pad",padCharsEnd:"padEnd",
|
4:["fill","setWith","updateWith"]},e.aryRearg={2:[1,0],3:[2,0,1],4:[3,2,0,1]},e.iterateeAry={dropRightWhile:1,dropWhile:1,every:1,filter:1,find:1,findFrom:1,findIndex:1,findIndexFrom:1,findKey:1,findLast:1,findLastFrom:1,findLastIndex:1,findLastIndexFrom:1,findLastKey:1,flatMap:1,flatMapDeep:1,flatMapDepth:1,forEach:1,forEachRight:1,forIn:1,forInRight:1,forOwn:1,forOwnRight:1,map:1,mapKeys:1,mapValues:1,partition:1,reduce:2,reduceRight:2,reject:1,remove:1,some:1,takeRightWhile:1,takeWhile:1,times:1,
|
||||||
padCharsStart:"padStart",restFrom:"rest",spreadFrom:"spread",trimChars:"trim",trimCharsEnd:"trimEnd",trimCharsStart:"trimStart"},e.skipFixed={castArray:!0,flow:!0,flowRight:!0,iteratee:!0,mixin:!0,runInContext:!0},e.skipRearg={add:!0,assign:!0,assignIn:!0,bind:!0,bindKey:!0,concat:!0,difference:!0,divide:!0,eq:!0,gt:!0,gte:!0,isEqual:!0,lt:!0,lte:!0,matchesProperty:!0,merge:!0,multiply:!0,overArgs:!0,partial:!0,partialRight:!0,random:!0,range:!0,rangeRight:!0,subtract:!0,without:!0,zip:!0,zipObject:!0
|
transform:2},e.iterateeRearg={mapKeys:[1],reduceRight:[1,0]},e.methodRearg={assignInAllWith:[1,0],assignInWith:[1,2,0],assignAllWith:[1,0],assignWith:[1,2,0],differenceBy:[1,2,0],differenceWith:[1,2,0],getOr:[2,1,0],intersectionBy:[1,2,0],intersectionWith:[1,2,0],isEqualWith:[1,2,0],isMatchWith:[2,1,0],mergeAllWith:[1,0],mergeWith:[1,2,0],padChars:[2,1,0],padCharsEnd:[2,1,0],padCharsStart:[2,1,0],pullAllBy:[2,1,0],pullAllWith:[2,1,0],rangeStep:[1,2,0],rangeStepRight:[1,2,0],setWith:[3,1,2,0],sortedIndexBy:[2,1,0],
|
||||||
}},function(t,e){t.exports={}}])});
|
sortedLastIndexBy:[2,1,0],unionBy:[1,2,0],unionWith:[1,2,0],updateWith:[3,1,2,0],xorBy:[1,2,0],xorWith:[1,2,0],zipWith:[1,2,0]},e.methodSpread={assignAll:{start:0},assignAllWith:{start:0},assignInAll:{start:0},assignInAllWith:{start:0},defaultsAll:{start:0},defaultsDeepAll:{start:0},invokeArgs:{start:2},invokeArgsMap:{start:2},mergeAll:{start:0},mergeAllWith:{start:0},partial:{start:1},partialRight:{start:1},without:{start:1},zipAll:{start:0}},e.mutate={array:{fill:!0,pull:!0,pullAll:!0,pullAllBy:!0,
|
||||||
|
pullAllWith:!0,pullAt:!0,remove:!0,reverse:!0},object:{assign:!0,assignAll:!0,assignAllWith:!0,assignIn:!0,assignInAll:!0,assignInAllWith:!0,assignInWith:!0,assignWith:!0,defaults:!0,defaultsAll:!0,defaultsDeep:!0,defaultsDeepAll:!0,merge:!0,mergeAll:!0,mergeAllWith:!0,mergeWith:!0},set:{set:!0,setWith:!0,unset:!0,update:!0,updateWith:!0}},e.realToAlias=function(){var t=Object.prototype.hasOwnProperty,r=e.aliasToReal,n={};for(var i in r){var a=r[i];t.call(n,a)?n[a].push(i):n[a]=[i]}return n}(),e.remap={
|
||||||
|
assignAll:"assign",assignAllWith:"assignWith",assignInAll:"assignIn",assignInAllWith:"assignInWith",curryN:"curry",curryRightN:"curryRight",defaultsAll:"defaults",defaultsDeepAll:"defaultsDeep",findFrom:"find",findIndexFrom:"findIndex",findLastFrom:"findLast",findLastIndexFrom:"findLastIndex",getOr:"get",includesFrom:"includes",indexOfFrom:"indexOf",invokeArgs:"invoke",invokeArgsMap:"invokeMap",lastIndexOfFrom:"lastIndexOf",mergeAll:"merge",mergeAllWith:"mergeWith",padChars:"pad",padCharsEnd:"padEnd",
|
||||||
|
padCharsStart:"padStart",propertyOf:"get",rangeStep:"range",rangeStepRight:"rangeRight",restFrom:"rest",spreadFrom:"spread",trimChars:"trim",trimCharsEnd:"trimEnd",trimCharsStart:"trimStart",zipAll:"zip"},e.skipFixed={castArray:!0,flow:!0,flowRight:!0,iteratee:!0,mixin:!0,rearg:!0,runInContext:!0},e.skipRearg={add:!0,assign:!0,assignIn:!0,bind:!0,bindKey:!0,concat:!0,difference:!0,divide:!0,eq:!0,gt:!0,gte:!0,isEqual:!0,lt:!0,lte:!0,matchesProperty:!0,merge:!0,multiply:!0,overArgs:!0,partial:!0,partialRight:!0,
|
||||||
|
propertyOf:!0,random:!0,range:!0,rangeRight:!0,subtract:!0,zip:!0,zipObject:!0,zipObjectDeep:!0}},function(t,e){t.exports={}}])});
|
||||||
6125
dist/lodash.js
vendored
6125
dist/lodash.js
vendored
File diff suppressed because it is too large
Load Diff
257
dist/lodash.min.js
vendored
257
dist/lodash.min.js
vendored
@@ -1,123 +1,140 @@
|
|||||||
/**
|
/**
|
||||||
* @license
|
* @license
|
||||||
* lodash 4.8.0 (Custom Build) lodash.com/license | Underscore.js 1.8.3 underscorejs.org/LICENSE
|
* Lodash <https://lodash.com/>
|
||||||
* Build: `lodash -o ./dist/lodash.js`
|
* Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
|
||||||
|
* Released under MIT license <https://lodash.com/license>
|
||||||
|
* Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
|
||||||
|
* Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
||||||
*/
|
*/
|
||||||
;(function(){function t(t,n){return t.set(n[0],n[1]),t}function n(t,n){return t.add(n),t}function r(t,n,r){switch(r.length){case 0:return t.call(n);case 1:return t.call(n,r[0]);case 2:return t.call(n,r[0],r[1]);case 3:return t.call(n,r[0],r[1],r[2])}return t.apply(n,r)}function e(t,n,r,e){for(var u=-1,o=t.length;++u<o;){var i=t[u];n(e,i,r(i),t)}return e}function u(t,n){for(var r=-1,e=t.length;++r<e&&false!==n(t[r],r,t););return t}function o(t,n){for(var r=-1,e=t.length;++r<e;)if(!n(t[r],r,t))return false;
|
(function(){function n(n,t,r){switch(r.length){case 0:return n.call(t);case 1:return n.call(t,r[0]);case 2:return n.call(t,r[0],r[1]);case 3:return n.call(t,r[0],r[1],r[2])}return n.apply(t,r)}function t(n,t,r,e){for(var u=-1,i=null==n?0:n.length;++u<i;){var o=n[u];t(e,o,r(o),n)}return e}function r(n,t){for(var r=-1,e=null==n?0:n.length;++r<e&&t(n[r],r,n)!==!1;);return n}function e(n,t){for(var r=null==n?0:n.length;r--&&t(n[r],r,n)!==!1;);return n}function u(n,t){for(var r=-1,e=null==n?0:n.length;++r<e;)if(!t(n[r],r,n))return!1;
|
||||||
return true}function i(t,n){for(var r=-1,e=t.length,u=0,o=[];++r<e;){var i=t[r];n(i,r,t)&&(o[u++]=i)}return o}function f(t,n){return!!t.length&&-1<d(t,n,0)}function c(t,n,r){for(var e=-1,u=t.length;++e<u;)if(r(n,t[e]))return true;return false}function a(t,n){for(var r=-1,e=t.length,u=Array(e);++r<e;)u[r]=n(t[r],r,t);return u}function l(t,n){for(var r=-1,e=n.length,u=t.length;++r<e;)t[u+r]=n[r];return t}function s(t,n,r,e){var u=-1,o=t.length;for(e&&o&&(r=t[++u]);++u<o;)r=n(r,t[u],u,t);return r}function h(t,n,r,e){
|
return!0}function i(n,t){for(var r=-1,e=null==n?0:n.length,u=0,i=[];++r<e;){var o=n[r];t(o,r,n)&&(i[u++]=o)}return i}function o(n,t){return!!(null==n?0:n.length)&&y(n,t,0)>-1}function f(n,t,r){for(var e=-1,u=null==n?0:n.length;++e<u;)if(r(t,n[e]))return!0;return!1}function c(n,t){for(var r=-1,e=null==n?0:n.length,u=Array(e);++r<e;)u[r]=t(n[r],r,n);return u}function a(n,t){for(var r=-1,e=t.length,u=n.length;++r<e;)n[u+r]=t[r];return n}function l(n,t,r,e){var u=-1,i=null==n?0:n.length;for(e&&i&&(r=n[++u]);++u<i;)r=t(r,n[u],u,n);
|
||||||
var u=t.length;for(e&&u&&(r=t[--u]);u--;)r=n(r,t[u],u,t);return r}function p(t,n){for(var r=-1,e=t.length;++r<e;)if(n(t[r],r,t))return true;return false}function _(t,n,r){for(var e=-1,u=t.length;++e<u;){var o=t[e],i=n(o);if(null!=i&&(f===T?i===i:r(i,f)))var f=i,c=o}return c}function v(t,n,r,e){var u;return r(t,function(t,r,o){return n(t,r,o)?(u=e?r:t,false):void 0}),u}function g(t,n,r){for(var e=t.length,u=r?e:-1;r?u--:++u<e;)if(n(t[u],u,t))return u;return-1}function d(t,n,r){if(n!==n)return U(t,r);--r;for(var e=t.length;++r<e;)if(t[r]===n)return r;
|
return r}function s(n,t,r,e){var u=null==n?0:n.length;for(e&&u&&(r=n[--u]);u--;)r=t(r,n[u],u,n);return r}function h(n,t){for(var r=-1,e=null==n?0:n.length;++r<e;)if(t(n[r],r,n))return!0;return!1}function p(n){return n.split("")}function _(n){return n.match($t)||[]}function v(n,t,r){var e;return r(n,function(n,r,u){if(t(n,r,u))return e=r,!1}),e}function g(n,t,r,e){for(var u=n.length,i=r+(e?1:-1);e?i--:++i<u;)if(t(n[i],i,n))return i;return-1}function y(n,t,r){return t===t?Z(n,t,r):g(n,b,r)}function d(n,t,r,e){
|
||||||
return-1}function y(t,n,r,e){--r;for(var u=t.length;++r<u;)if(e(t[r],n))return r;return-1}function b(t,n){var r=t?t.length:0;return r?m(t,n)/r:K}function x(t,n,r,e,u){return u(t,function(t,u,o){r=e?(e=false,t):n(r,t,u,o)}),r}function j(t,n){var r=t.length;for(t.sort(n);r--;)t[r]=t[r].c;return t}function m(t,n){for(var r,e=-1,u=t.length;++e<u;){var o=n(t[e]);o!==T&&(r=r===T?o:r+o)}return r}function w(t,n){for(var r=-1,e=Array(t);++r<t;)e[r]=n(r);return e}function A(t,n){return a(n,function(n){return[n,t[n]];
|
for(var u=r-1,i=n.length;++u<i;)if(e(n[u],t))return u;return-1}function b(n){return n!==n}function w(n,t){var r=null==n?0:n.length;return r?k(n,t)/r:Cn}function m(n){return function(t){return null==t?X:t[n]}}function x(n){return function(t){return null==n?X:n[t]}}function j(n,t,r,e,u){return u(n,function(n,u,i){r=e?(e=!1,n):t(r,n,u,i)}),r}function A(n,t){var r=n.length;for(n.sort(t);r--;)n[r]=n[r].value;return n}function k(n,t){for(var r,e=-1,u=n.length;++e<u;){var i=t(n[e]);i!==X&&(r=r===X?i:r+i);
|
||||||
})}function O(t){return function(n){return t(n)}}function k(t,n){return a(n,function(n){return t[n]})}function E(t,n){for(var r=-1,e=t.length;++r<e&&-1<d(n,t[r],0););return r}function I(t,n){for(var r=t.length;r--&&-1<d(n,t[r],0););return r}function S(t){return t&&t.Object===Object?t:null}function R(t,n){if(t!==n){var r=null===t,e=t===T,u=t===t,o=null===n,i=n===T,f=n===n;if(t>n&&!o||!u||r&&!i&&f||e&&f)return 1;if(n>t&&!r||!f||o&&!e&&u||i&&u)return-1}return 0}function W(t){return function(n,r){var e;
|
}return r}function O(n,t){for(var r=-1,e=Array(n);++r<n;)e[r]=t(r);return e}function I(n,t){return c(t,function(t){return[t,n[t]]})}function R(n){return n?n.slice(0,H(n)+1).replace(Lt,""):n}function z(n){return function(t){return n(t)}}function E(n,t){return c(t,function(t){return n[t]})}function S(n,t){return n.has(t)}function W(n,t){for(var r=-1,e=n.length;++r<e&&y(t,n[r],0)>-1;);return r}function L(n,t){for(var r=n.length;r--&&y(t,n[r],0)>-1;);return r}function C(n,t){for(var r=n.length,e=0;r--;)n[r]===t&&++e;
|
||||||
return n===T&&r===T?0:(n!==T&&(e=n),r!==T&&(e=e===T?r:t(e,r)),e)}}function B(t){return Mt[t]}function C(t){return Lt[t]}function z(t){return"\\"+Ft[t]}function U(t,n,r){var e=t.length;for(n+=r?0:-1;r?n--:++n<e;){var u=t[n];if(u!==u)return n}return-1}function M(t){var n=false;if(null!=t&&typeof t.toString!="function")try{n=!!(t+"")}catch(r){}return n}function L(t,n){return t=typeof t=="number"||xt.test(t)?+t:-1,t>-1&&0==t%1&&(null==n?9007199254740991:n)>t}function $(t){for(var n,r=[];!(n=t.next()).done;)r.push(n.value);
|
return e}function U(n){return"\\"+Yr[n]}function B(n,t){return null==n?X:n[t]}function T(n){return Nr.test(n)}function $(n){return Pr.test(n)}function D(n){for(var t,r=[];!(t=n.next()).done;)r.push(t.value);return r}function M(n){var t=-1,r=Array(n.size);return n.forEach(function(n,e){r[++t]=[e,n]}),r}function F(n,t){return function(r){return n(t(r))}}function N(n,t){for(var r=-1,e=n.length,u=0,i=[];++r<e;){var o=n[r];o!==t&&o!==cn||(n[r]=cn,i[u++]=r)}return i}function P(n){var t=-1,r=Array(n.size);
|
||||||
return r}function D(t){var n=-1,r=Array(t.size);return t.forEach(function(t,e){r[++n]=[e,t]}),r}function F(t,n){for(var r=-1,e=t.length,u=0,o=[];++r<e;){var i=t[r];i!==n&&"__lodash_placeholder__"!==i||(t[r]="__lodash_placeholder__",o[u++]=r)}return o}function N(t){var n=-1,r=Array(t.size);return t.forEach(function(t){r[++n]=t}),r}function P(t){if(!t||!St.test(t))return t.length;for(var n=It.lastIndex=0;It.test(t);)n++;return n}function Z(t){return $t[t]}function q(S){function xt(t){if(Se(t)&&!Qo(t)&&!(t instanceof kt)){
|
return n.forEach(function(n){r[++t]=n}),r}function q(n){var t=-1,r=Array(n.size);return n.forEach(function(n){r[++t]=[n,n]}),r}function Z(n,t,r){for(var e=r-1,u=n.length;++e<u;)if(n[e]===t)return e;return-1}function K(n,t,r){for(var e=r+1;e--;)if(n[e]===t)return e;return e}function V(n){return T(n)?J(n):_e(n)}function G(n){return T(n)?Y(n):p(n)}function H(n){for(var t=n.length;t--&&Ct.test(n.charAt(t)););return t}function J(n){for(var t=Mr.lastIndex=0;Mr.test(n);)++t;return t}function Y(n){return n.match(Mr)||[];
|
||||||
if(t instanceof Ot)return t;if(vu.call(t,"__wrapped__"))return Jr(t)}return new Ot(t)}function At(){}function Ot(t,n){this.__wrapped__=t,this.__actions__=[],this.__chain__=!!n,this.__index__=0,this.__values__=T}function kt(t){this.__wrapped__=t,this.__actions__=[],this.__dir__=1,this.__filtered__=false,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function Mt(){}function Lt(t){var n=-1,r=t?t.length:0;for(this.clear();++n<r;){var e=t[n];this.set(e[0],e[1])}}function $t(t){var n=-1,r=t?t.length:0;
|
}function Q(n){return n.match(Fr)||[]}var X,nn="4.17.21",tn=200,rn="Unsupported core-js use. Try https://npms.io/search?q=ponyfill.",en="Expected a function",un="Invalid `variable` option passed into `_.template`",on="__lodash_hash_undefined__",fn=500,cn="__lodash_placeholder__",an=1,ln=2,sn=4,hn=1,pn=2,_n=1,vn=2,gn=4,yn=8,dn=16,bn=32,wn=64,mn=128,xn=256,jn=512,An=30,kn="...",On=800,In=16,Rn=1,zn=2,En=3,Sn=1/0,Wn=9007199254740991,Ln=1.7976931348623157e308,Cn=NaN,Un=4294967295,Bn=Un-1,Tn=Un>>>1,$n=[["ary",mn],["bind",_n],["bindKey",vn],["curry",yn],["curryRight",dn],["flip",jn],["partial",bn],["partialRight",wn],["rearg",xn]],Dn="[object Arguments]",Mn="[object Array]",Fn="[object AsyncFunction]",Nn="[object Boolean]",Pn="[object Date]",qn="[object DOMException]",Zn="[object Error]",Kn="[object Function]",Vn="[object GeneratorFunction]",Gn="[object Map]",Hn="[object Number]",Jn="[object Null]",Yn="[object Object]",Qn="[object Promise]",Xn="[object Proxy]",nt="[object RegExp]",tt="[object Set]",rt="[object String]",et="[object Symbol]",ut="[object Undefined]",it="[object WeakMap]",ot="[object WeakSet]",ft="[object ArrayBuffer]",ct="[object DataView]",at="[object Float32Array]",lt="[object Float64Array]",st="[object Int8Array]",ht="[object Int16Array]",pt="[object Int32Array]",_t="[object Uint8Array]",vt="[object Uint8ClampedArray]",gt="[object Uint16Array]",yt="[object Uint32Array]",dt=/\b__p \+= '';/g,bt=/\b(__p \+=) '' \+/g,wt=/(__e\(.*?\)|\b__t\)) \+\n'';/g,mt=/&(?:amp|lt|gt|quot|#39);/g,xt=/[&<>"']/g,jt=RegExp(mt.source),At=RegExp(xt.source),kt=/<%-([\s\S]+?)%>/g,Ot=/<%([\s\S]+?)%>/g,It=/<%=([\s\S]+?)%>/g,Rt=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,zt=/^\w*$/,Et=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,St=/[\\^$.*+?()[\]{}|]/g,Wt=RegExp(St.source),Lt=/^\s+/,Ct=/\s/,Ut=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Bt=/\{\n\/\* \[wrapped with (.+)\] \*/,Tt=/,? & /,$t=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,Dt=/[()=,{}\[\]\/\s]/,Mt=/\\(\\)?/g,Ft=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,Nt=/\w*$/,Pt=/^[-+]0x[0-9a-f]+$/i,qt=/^0b[01]+$/i,Zt=/^\[object .+?Constructor\]$/,Kt=/^0o[0-7]+$/i,Vt=/^(?:0|[1-9]\d*)$/,Gt=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,Ht=/($^)/,Jt=/['\n\r\u2028\u2029\\]/g,Yt="\\ud800-\\udfff",Qt="\\u0300-\\u036f",Xt="\\ufe20-\\ufe2f",nr="\\u20d0-\\u20ff",tr=Qt+Xt+nr,rr="\\u2700-\\u27bf",er="a-z\\xdf-\\xf6\\xf8-\\xff",ur="\\xac\\xb1\\xd7\\xf7",ir="\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf",or="\\u2000-\\u206f",fr=" \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",cr="A-Z\\xc0-\\xd6\\xd8-\\xde",ar="\\ufe0e\\ufe0f",lr=ur+ir+or+fr,sr="['\u2019]",hr="["+Yt+"]",pr="["+lr+"]",_r="["+tr+"]",vr="\\d+",gr="["+rr+"]",yr="["+er+"]",dr="[^"+Yt+lr+vr+rr+er+cr+"]",br="\\ud83c[\\udffb-\\udfff]",wr="(?:"+_r+"|"+br+")",mr="[^"+Yt+"]",xr="(?:\\ud83c[\\udde6-\\uddff]){2}",jr="[\\ud800-\\udbff][\\udc00-\\udfff]",Ar="["+cr+"]",kr="\\u200d",Or="(?:"+yr+"|"+dr+")",Ir="(?:"+Ar+"|"+dr+")",Rr="(?:"+sr+"(?:d|ll|m|re|s|t|ve))?",zr="(?:"+sr+"(?:D|LL|M|RE|S|T|VE))?",Er=wr+"?",Sr="["+ar+"]?",Wr="(?:"+kr+"(?:"+[mr,xr,jr].join("|")+")"+Sr+Er+")*",Lr="\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",Cr="\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])",Ur=Sr+Er+Wr,Br="(?:"+[gr,xr,jr].join("|")+")"+Ur,Tr="(?:"+[mr+_r+"?",_r,xr,jr,hr].join("|")+")",$r=RegExp(sr,"g"),Dr=RegExp(_r,"g"),Mr=RegExp(br+"(?="+br+")|"+Tr+Ur,"g"),Fr=RegExp([Ar+"?"+yr+"+"+Rr+"(?="+[pr,Ar,"$"].join("|")+")",Ir+"+"+zr+"(?="+[pr,Ar+Or,"$"].join("|")+")",Ar+"?"+Or+"+"+Rr,Ar+"+"+zr,Cr,Lr,vr,Br].join("|"),"g"),Nr=RegExp("["+kr+Yt+tr+ar+"]"),Pr=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,qr=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],Zr=-1,Kr={};
|
||||||
for(this.__data__=new Lt;++n<r;)this.push(t[n])}function Dt(t,n){var r=t.__data__;return Pr(n)?(r=r.__data__,"__lodash_hash_undefined__"===(typeof n=="string"?r.string:r.hash)[n]):r.has(n)}function Ft(t){var n=-1,r=t?t.length:0;for(this.clear();++n<r;){var e=t[n];this.set(e[0],e[1])}}function Zt(t,n){var r=Vt(t,n);return 0>r?false:(r==t.length-1?t.pop():Bu.call(t,r,1),true)}function qt(t,n){var r=Vt(t,n);return 0>r?T:t[r][1]}function Vt(t,n){for(var r=t.length;r--;)if(be(t[r][0],n))return r;return-1}function Kt(t,n,r){
|
Kr[at]=Kr[lt]=Kr[st]=Kr[ht]=Kr[pt]=Kr[_t]=Kr[vt]=Kr[gt]=Kr[yt]=!0,Kr[Dn]=Kr[Mn]=Kr[ft]=Kr[Nn]=Kr[ct]=Kr[Pn]=Kr[Zn]=Kr[Kn]=Kr[Gn]=Kr[Hn]=Kr[Yn]=Kr[nt]=Kr[tt]=Kr[rt]=Kr[it]=!1;var Vr={};Vr[Dn]=Vr[Mn]=Vr[ft]=Vr[ct]=Vr[Nn]=Vr[Pn]=Vr[at]=Vr[lt]=Vr[st]=Vr[ht]=Vr[pt]=Vr[Gn]=Vr[Hn]=Vr[Yn]=Vr[nt]=Vr[tt]=Vr[rt]=Vr[et]=Vr[_t]=Vr[vt]=Vr[gt]=Vr[yt]=!0,Vr[Zn]=Vr[Kn]=Vr[it]=!1;var Gr={"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a",
|
||||||
var e=Vt(t,n);0>e?t.push([n,r]):t[e][1]=r}function Gt(t,n,r,e){return t===T||be(t,pu[r])&&!vu.call(e,r)?n:t}function Ht(t,n,r){(r===T||be(t[n],r))&&(typeof n!="number"||r!==T||n in t)||(t[n]=r)}function Qt(t,n,r){var e=t[n];vu.call(t,n)&&be(e,r)&&(r!==T||n in t)||(t[n]=r)}function Xt(t,n,r,e){return fo(t,function(t,u,o){n(e,t,r(t),o)}),e}function tn(t,n){return t&&ur(n,Ke(n),t)}function nn(t,n){for(var r=-1,e=null==t,u=n.length,o=Array(u);++r<u;)o[r]=e?T:qe(t,n[r]);return o}function rn(t){return we(t)?t:[];
|
"\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae",
|
||||||
}function en(t){return typeof t=="string"||Ue(t)?t:t+""}function un(t){return Qo(t)?t:yo(t)}function on(t,n,r){return t===t&&(r!==T&&(t=t>r?r:t),n!==T&&(t=n>t?n:t)),t}function fn(t,n,r,e,o,i,f){var c;if(e&&(c=i?e(t,o,i,f):e(t)),c!==T)return c;if(!Ie(t))return t;if(o=Qo(t)){if(c=Mr(t),!n)return er(t,c)}else{var a=zr(t),l="[object Function]"==a||"[object GeneratorFunction]"==a;if(Xo(t))return Xn(t,n);if("[object Object]"==a||"[object Arguments]"==a||l&&!i){if(M(t))return i?t:{};if(c=Lr(l?{}:t),!n)return ir(t,tn(c,t));
|
"\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a","\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g",
|
||||||
}else{if(!Ut[a])return i?t:{};c=$r(t,a,fn,n)}}if(f||(f=new Ft),i=f.get(t))return i;if(f.set(t,c),!o)var s=r?bn(t,Ke,Cr):Ke(t);return u(s||t,function(u,o){s&&(o=u,u=t[o]),Qt(c,o,fn(u,n,r,e,o,t,f))}),c}function cn(t){var n=Ke(t),r=n.length;return function(e){if(null==e)return!r;for(var u=r;u--;){var o=n[u],i=t[o],f=e[o];if(f===T&&!(o in Object(e))||!i(f))return false}return true}}function an(t){return Ie(t)?Su(t):{}}function ln(t,n,r){if(typeof t!="function")throw new su("Expected a function");return Wu(function(){
|
"\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I","\u0129":"i","\u012b":"i","\u012d":"i","\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O",
|
||||||
t.apply(T,r)},n)}function sn(t,n,r,e){var u=-1,o=f,i=true,l=t.length,s=[],h=n.length;if(!l)return s;r&&(n=a(n,O(r))),e?(o=c,i=false):n.length>=200&&(o=Dt,i=false,n=new $t(n));t:for(;++u<l;){var p=t[u],_=r?r(p):p;if(i&&_===_){for(var v=h;v--;)if(n[v]===_)continue t;s.push(p)}else o(n,_,e)||s.push(p)}return s}function hn(t,n){var r=true;return fo(t,function(t,e,u){return r=!!n(t,e,u)}),r}function pn(t,n){var r=[];return fo(t,function(t,e,u){n(t,e,u)&&r.push(t)}),r}function _n(t,n,r,e){e||(e=[]);for(var u=-1,o=t.length;++u<o;){
|
"\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r","\u0159":"r","\u015a":"S","\u015c":"S","\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w",
|
||||||
var i=t[u];n>0&&we(i)&&(r||Qo(i)||je(i))?n>1?_n(i,n-1,r,e):l(e,i):r||(e[e.length]=i)}return e}function vn(t,n){return t&&ao(t,n,Ke)}function gn(t,n){return t&&lo(t,n,Ke)}function dn(t,n){return i(n,function(n){return Oe(t[n])})}function yn(t,n){n=Nr(n,t)?[n]:un(n);for(var r=0,e=n.length;null!=t&&e>r;)t=t[n[r++]];return r&&r==e?t:T}function bn(t,n,r){return n=n(t),Qo(t)?n:l(n,r(t))}function xn(t,n){return vu.call(t,n)||typeof t=="object"&&n in t&&null===Uu(Object(t))}function jn(t,n){return n in Object(t);
|
"\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ","\u0133":"ij","\u0152":"Oe","\u0153":"oe","\u0149":"'n","\u017f":"s"},Hr={"&":"&","<":"<",">":">",'"':""","'":"'"},Jr={"&":"&","<":"<",">":">",""":'"',"'":"'"},Yr={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Qr=parseFloat,Xr=parseInt,ne="object"==typeof global&&global&&global.Object===Object&&global,te="object"==typeof self&&self&&self.Object===Object&&self,re=ne||te||Function("return this")(),ee="object"==typeof exports&&exports&&!exports.nodeType&&exports,ue=ee&&"object"==typeof module&&module&&!module.nodeType&&module,ie=ue&&ue.exports===ee,oe=ie&&ne.process,fe=function(){
|
||||||
}function mn(t,n,r){for(var e=r?c:f,u=t[0].length,o=t.length,i=o,l=Array(o),s=1/0,h=[];i--;){var p=t[i];i&&n&&(p=a(p,O(n))),s=Fu(p.length,s),l[i]=r||!n&&(120>u||120>p.length)?T:new $t(i&&p)}var p=t[0],_=-1,v=l[0];t:for(;++_<u&&s>h.length;){var g=p[_],d=n?n(g):g;if(v?!Dt(v,d):!e(h,d,r)){for(i=o;--i;){var y=l[i];if(y?!Dt(y,d):!e(t[i],d,r))continue t}v&&v.push(d),h.push(g)}}return h}function wn(t,n,r){var e={};return vn(t,function(t,u,o){n(e,r(t),u,o)}),e}function An(t,n,e){return Nr(n,t)||(n=un(n),
|
try{var n=ue&&ue.require&&ue.require("util").types;return n?n:oe&&oe.binding&&oe.binding("util")}catch(n){}}(),ce=fe&&fe.isArrayBuffer,ae=fe&&fe.isDate,le=fe&&fe.isMap,se=fe&&fe.isRegExp,he=fe&&fe.isSet,pe=fe&&fe.isTypedArray,_e=m("length"),ve=x(Gr),ge=x(Hr),ye=x(Jr),de=function p(x){function Z(n){if(cc(n)&&!bh(n)&&!(n instanceof Ct)){if(n instanceof Y)return n;if(bl.call(n,"__wrapped__"))return eo(n)}return new Y(n)}function J(){}function Y(n,t){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!t,
|
||||||
t=Kr(t,n),n=Xr(n)),n=null==t?t:t[n],null==n?T:r(n,t,e)}function On(t,n,r,e,u){if(t===n)n=true;else if(null==t||null==n||!Ie(t)&&!Se(n))n=t!==t&&n!==n;else t:{var o=Qo(t),i=Qo(n),f="[object Array]",c="[object Array]";o||(f=zr(t),f="[object Arguments]"==f?"[object Object]":f),i||(c=zr(n),c="[object Arguments]"==c?"[object Object]":c);var a="[object Object]"==f&&!M(t),i="[object Object]"==c&&!M(n);if((c=f==c)&&!a)u||(u=new Ft),n=o||Me(t)?kr(t,n,On,r,e,u):Er(t,n,f,On,r,e,u);else{if(!(2&e)&&(o=a&&vu.call(t,"__wrapped__"),
|
this.__index__=0,this.__values__=X}function Ct(n){this.__wrapped__=n,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=Un,this.__views__=[]}function $t(){var n=new Ct(this.__wrapped__);return n.__actions__=Tu(this.__actions__),n.__dir__=this.__dir__,n.__filtered__=this.__filtered__,n.__iteratees__=Tu(this.__iteratees__),n.__takeCount__=this.__takeCount__,n.__views__=Tu(this.__views__),n}function Yt(){if(this.__filtered__){var n=new Ct(this);n.__dir__=-1,
|
||||||
f=i&&vu.call(n,"__wrapped__"),o||f)){t=o?t.value():t,n=f?n.value():n,u||(u=new Ft),n=On(t,n,r,e,u);break t}if(c)n:if(u||(u=new Ft),o=2&e,f=Ke(t),i=f.length,c=Ke(n).length,i==c||o){for(a=i;a--;){var l=f[a];if(!(o?l in n:xn(n,l))){n=false;break n}}if(c=u.get(t))n=c==n;else{c=true,u.set(t,n);for(var s=o;++a<i;){var l=f[a],h=t[l],p=n[l];if(r)var _=o?r(p,h,l,n,t,u):r(h,p,l,t,n,u);if(_===T?h!==p&&!On(h,p,r,e,u):!_){c=false;break}s||(s="constructor"==l)}c&&!s&&(r=t.constructor,e=n.constructor,r!=e&&"constructor"in t&&"constructor"in n&&!(typeof r=="function"&&r instanceof r&&typeof e=="function"&&e instanceof e)&&(c=false)),
|
n.__filtered__=!0}else n=this.clone(),n.__dir__*=-1;return n}function Qt(){var n=this.__wrapped__.value(),t=this.__dir__,r=bh(n),e=t<0,u=r?n.length:0,i=Oi(0,u,this.__views__),o=i.start,f=i.end,c=f-o,a=e?f:o-1,l=this.__iteratees__,s=l.length,h=0,p=Hl(c,this.__takeCount__);if(!r||!e&&u==c&&p==c)return wu(n,this.__actions__);var _=[];n:for(;c--&&h<p;){a+=t;for(var v=-1,g=n[a];++v<s;){var y=l[v],d=y.iteratee,b=y.type,w=d(g);if(b==zn)g=w;else if(!w){if(b==Rn)continue n;break n}}_[h++]=g}return _}function Xt(n){
|
||||||
u["delete"](t),n=c}}else n=false;else n=false}}return n}function kn(t,n,r,e){var u=r.length,o=u,i=!e;if(null==t)return!o;for(t=Object(t);u--;){var f=r[u];if(i&&f[2]?f[1]!==t[f[0]]:!(f[0]in t))return false}for(;++u<o;){var f=r[u],c=f[0],a=t[c],l=f[1];if(i&&f[2]){if(a===T&&!(c in t))return false}else{if(f=new Ft,e)var s=e(a,l,c,t,n,f);if(s===T?!On(l,a,e,3,f):!s)return false}}return true}function En(t){return typeof t=="function"?t:null==t?ru:typeof t=="object"?Qo(t)?Wn(t[0],t[1]):Rn(t):iu(t)}function In(t){t=null==t?t:Object(t);
|
var t=-1,r=null==n?0:n.length;for(this.clear();++t<r;){var e=n[t];this.set(e[0],e[1])}}function nr(){this.__data__=is?is(null):{},this.size=0}function tr(n){var t=this.has(n)&&delete this.__data__[n];return this.size-=t?1:0,t}function rr(n){var t=this.__data__;if(is){var r=t[n];return r===on?X:r}return bl.call(t,n)?t[n]:X}function er(n){var t=this.__data__;return is?t[n]!==X:bl.call(t,n)}function ur(n,t){var r=this.__data__;return this.size+=this.has(n)?0:1,r[n]=is&&t===X?on:t,this}function ir(n){
|
||||||
var n,r=[];for(n in t)r.push(n);return r}function Sn(t,n){var r=-1,e=me(t)?Array(t.length):[];return fo(t,function(t,u,o){e[++r]=n(t,u,o)}),e}function Rn(t){var n=Rr(t);return 1==n.length&&n[0][2]?Tr(n[0][0],n[0][1]):function(r){return r===t||kn(r,t,n)}}function Wn(t,n){return Nr(t)&&n===n&&!Ie(n)?Tr(t,n):function(r){var e=qe(r,t);return e===T&&e===n?Ve(r,t):On(n,e,T,3)}}function Bn(t,n,r,e,o){if(t!==n){if(!Qo(n)&&!Me(n))var i=Ge(n);u(i||n,function(u,f){if(i&&(f=u,u=n[f]),Ie(u)){o||(o=new Ft);var c=f,a=o,l=t[c],s=n[c],h=a.get(s);
|
var t=-1,r=null==n?0:n.length;for(this.clear();++t<r;){var e=n[t];this.set(e[0],e[1])}}function or(){this.__data__=[],this.size=0}function fr(n){var t=this.__data__,r=Wr(t,n);return!(r<0)&&(r==t.length-1?t.pop():Ll.call(t,r,1),--this.size,!0)}function cr(n){var t=this.__data__,r=Wr(t,n);return r<0?X:t[r][1]}function ar(n){return Wr(this.__data__,n)>-1}function lr(n,t){var r=this.__data__,e=Wr(r,n);return e<0?(++this.size,r.push([n,t])):r[e][1]=t,this}function sr(n){var t=-1,r=null==n?0:n.length;for(this.clear();++t<r;){
|
||||||
if(h)Ht(t,c,h);else{var h=e?e(l,s,c+"",t,n,a):T,p=h===T;p&&(h=s,Qo(s)||Me(s)?Qo(l)?h=l:we(l)?h=er(l):(p=false,h=fn(s,true)):Be(s)||je(s)?je(l)?h=Pe(l):!Ie(l)||r&&Oe(l)?(p=false,h=fn(s,true)):h=l:p=false),a.set(s,h),p&&Bn(h,s,r,e,a),a["delete"](s),Ht(t,c,h)}}else c=e?e(t[f],u,f+"",t,n,o):T,c===T&&(c=u),Ht(t,f,c)})}}function Cn(t,n,r){var e=-1;return n=a(n.length?n:[ru],Sr()),t=Sn(t,function(t){return{a:a(n,function(n){return n(t)}),b:++e,c:t}}),j(t,function(t,n){var e;t:{e=-1;for(var u=t.a,o=n.a,i=u.length,f=r.length;++e<i;){
|
var e=n[t];this.set(e[0],e[1])}}function hr(){this.size=0,this.__data__={hash:new Xt,map:new(ts||ir),string:new Xt}}function pr(n){var t=xi(this,n).delete(n);return this.size-=t?1:0,t}function _r(n){return xi(this,n).get(n)}function vr(n){return xi(this,n).has(n)}function gr(n,t){var r=xi(this,n),e=r.size;return r.set(n,t),this.size+=r.size==e?0:1,this}function yr(n){var t=-1,r=null==n?0:n.length;for(this.__data__=new sr;++t<r;)this.add(n[t])}function dr(n){return this.__data__.set(n,on),this}function br(n){
|
||||||
var c=R(u[e],o[e]);if(c){e=f>e?c*("desc"==r[e]?-1:1):c;break t}}e=t.b-n.b}return e})}function zn(t,n){return t=Object(t),s(n,function(n,r){return r in t&&(n[r]=t[r]),n},{})}function Un(t,n){for(var r=-1,e=bn(t,Ge,vo),u=e.length,o={};++r<u;){var i=e[r],f=t[i];n(f,i)&&(o[i]=f)}return o}function Mn(t){return function(n){return null==n?T:n[t]}}function Ln(t){return function(n){return yn(n,t)}}function $n(t,n,r,e){var u=e?y:d,o=-1,i=n.length,f=t;for(r&&(f=a(t,O(r)));++o<i;)for(var c=0,l=n[o],l=r?r(l):l;-1<(c=u(f,l,c,e));)f!==t&&Bu.call(f,c,1),
|
return this.__data__.has(n)}function wr(n){this.size=(this.__data__=new ir(n)).size}function mr(){this.__data__=new ir,this.size=0}function xr(n){var t=this.__data__,r=t.delete(n);return this.size=t.size,r}function jr(n){return this.__data__.get(n)}function Ar(n){return this.__data__.has(n)}function kr(n,t){var r=this.__data__;if(r instanceof ir){var e=r.__data__;if(!ts||e.length<tn-1)return e.push([n,t]),this.size=++r.size,this;r=this.__data__=new sr(e)}return r.set(n,t),this.size=r.size,this}function Or(n,t){
|
||||||
Bu.call(t,c,1);return t}function Dn(t,n){for(var r=t?n.length:0,e=r-1;r--;){var u=n[r];if(e==r||u!=o){var o=u;if(L(u))Bu.call(t,u,1);else if(Nr(u,t))delete t[u];else{var u=un(u),i=Kr(t,u);null!=i&&delete i[Xr(u)]}}}}function Fn(t,n){return t+zu(Pu()*(n-t+1))}function Nn(t,n){var r="";if(!t||1>n||n>9007199254740991)return r;do n%2&&(r+=t),(n=zu(n/2))&&(t+=t);while(n);return r}function Pn(t,n,r,e){n=Nr(n,t)?[n]:un(n);for(var u=-1,o=n.length,i=o-1,f=t;null!=f&&++u<o;){var c=n[u];if(Ie(f)){var a=r;if(u!=i){
|
var r=bh(n),e=!r&&dh(n),u=!r&&!e&&mh(n),i=!r&&!e&&!u&&Oh(n),o=r||e||u||i,f=o?O(n.length,hl):[],c=f.length;for(var a in n)!t&&!bl.call(n,a)||o&&("length"==a||u&&("offset"==a||"parent"==a)||i&&("buffer"==a||"byteLength"==a||"byteOffset"==a)||Ci(a,c))||f.push(a);return f}function Ir(n){var t=n.length;return t?n[tu(0,t-1)]:X}function Rr(n,t){return Xi(Tu(n),Mr(t,0,n.length))}function zr(n){return Xi(Tu(n))}function Er(n,t,r){(r===X||Gf(n[t],r))&&(r!==X||t in n)||Br(n,t,r)}function Sr(n,t,r){var e=n[t];
|
||||||
var l=f[c],a=e?e(l,c,f):T;a===T&&(a=null==l?L(n[u+1])?[]:{}:l)}Qt(f,c,a)}f=f[c]}return t}function Zn(t,n,r){var e=-1,u=t.length;for(0>n&&(n=-n>u?0:u+n),r=r>u?u:r,0>r&&(r+=u),u=n>r?0:r-n>>>0,n>>>=0,r=Array(u);++e<u;)r[e]=t[e+n];return r}function qn(t,n){var r;return fo(t,function(t,e,u){return r=n(t,e,u),!r}),!!r}function Tn(t,n,r){var e=0,u=t?t.length:e;if(typeof n=="number"&&n===n&&2147483647>=u){for(;u>e;){var o=e+u>>>1,i=t[o];(r?n>=i:n>i)&&null!==i?e=o+1:u=o}return u}return Vn(t,n,ru,r)}function Vn(t,n,r,e){
|
bl.call(n,t)&&Gf(e,r)&&(r!==X||t in n)||Br(n,t,r)}function Wr(n,t){for(var r=n.length;r--;)if(Gf(n[r][0],t))return r;return-1}function Lr(n,t,r,e){return ys(n,function(n,u,i){t(e,n,r(n),i)}),e}function Cr(n,t){return n&&$u(t,Pc(t),n)}function Ur(n,t){return n&&$u(t,qc(t),n)}function Br(n,t,r){"__proto__"==t&&Tl?Tl(n,t,{configurable:!0,enumerable:!0,value:r,writable:!0}):n[t]=r}function Tr(n,t){for(var r=-1,e=t.length,u=il(e),i=null==n;++r<e;)u[r]=i?X:Mc(n,t[r]);return u}function Mr(n,t,r){return n===n&&(r!==X&&(n=n<=r?n:r),
|
||||||
n=r(n);for(var u=0,o=t?t.length:0,i=n!==n,f=null===n,c=n===T;o>u;){var a=zu((u+o)/2),l=r(t[a]),s=l!==T,h=l===l;(i?h||e:f?h&&s&&(e||null!=l):c?h&&(e||s):null==l?0:e?n>=l:n>l)?u=a+1:o=a}return Fu(o,4294967294)}function Kn(t,n){for(var r=0,e=t.length,u=t[0],o=n?n(u):u,i=o,f=1,c=[u];++r<e;)u=t[r],o=n?n(u):u,be(o,i)||(i=o,c[f++]=u);return c}function Gn(t,n,r){var e=-1,u=f,o=t.length,i=true,a=[],l=a;if(r)i=false,u=c;else if(o<200)l=n?[]:a;else{if(u=n?null:ho(t))return N(u);i=false,u=Dt,l=new $t}t:for(;++e<o;){
|
t!==X&&(n=n>=t?n:t)),n}function Fr(n,t,e,u,i,o){var f,c=t&an,a=t&ln,l=t&sn;if(e&&(f=i?e(n,u,i,o):e(n)),f!==X)return f;if(!fc(n))return n;var s=bh(n);if(s){if(f=zi(n),!c)return Tu(n,f)}else{var h=zs(n),p=h==Kn||h==Vn;if(mh(n))return Iu(n,c);if(h==Yn||h==Dn||p&&!i){if(f=a||p?{}:Ei(n),!c)return a?Mu(n,Ur(f,n)):Du(n,Cr(f,n))}else{if(!Vr[h])return i?n:{};f=Si(n,h,c)}}o||(o=new wr);var _=o.get(n);if(_)return _;o.set(n,f),kh(n)?n.forEach(function(r){f.add(Fr(r,t,e,r,n,o))}):jh(n)&&n.forEach(function(r,u){
|
||||||
var s=t[e],h=n?n(s):s;if(i&&h===h){for(var p=l.length;p--;)if(l[p]===h)continue t;n&&l.push(h),a.push(s)}else u(l,h,r)||(l!==a&&l.push(h),a.push(s))}return a}function Jn(t,n,r,e){for(var u=t.length,o=e?u:-1;(e?o--:++o<u)&&n(t[o],o,t););return r?Zn(t,e?0:o,e?o+1:u):Zn(t,e?o+1:0,e?u:o)}function Yn(t,n){var r=t;return r instanceof kt&&(r=r.value()),s(n,function(t,n){return n.func.apply(n.thisArg,l([t],n.args))},r)}function Hn(t,n,r){for(var e=-1,u=t.length;++e<u;)var o=o?l(sn(o,t[e],n,r),sn(t[e],o,n,r)):t[e];
|
f.set(u,Fr(r,t,e,u,n,o))});var v=l?a?di:yi:a?qc:Pc,g=s?X:v(n);return r(g||n,function(r,u){g&&(u=r,r=n[u]),Sr(f,u,Fr(r,t,e,u,n,o))}),f}function Nr(n){var t=Pc(n);return function(r){return Pr(r,n,t)}}function Pr(n,t,r){var e=r.length;if(null==n)return!e;for(n=ll(n);e--;){var u=r[e],i=t[u],o=n[u];if(o===X&&!(u in n)||!i(o))return!1}return!0}function Gr(n,t,r){if("function"!=typeof n)throw new pl(en);return Ws(function(){n.apply(X,r)},t)}function Hr(n,t,r,e){var u=-1,i=o,a=!0,l=n.length,s=[],h=t.length;
|
||||||
return o&&o.length?Gn(o,n,r):[]}function Qn(t,n,r){for(var e=-1,u=t.length,o=n.length,i={};++e<u;)r(i,t[e],o>e?n[e]:T);return i}function Xn(t,n){if(n)return t.slice();var r=new t.constructor(t.length);return t.copy(r),r}function tr(t){var n=new t.constructor(t.byteLength);return new Au(n).set(new Au(t)),n}function nr(t,n,r,e){var u=-1,o=t.length,i=r.length,f=-1,c=n.length,a=Du(o-i,0),l=Array(c+a);for(e=!e;++f<c;)l[f]=n[f];for(;++u<i;)(e||o>u)&&(l[r[u]]=t[u]);for(;a--;)l[f++]=t[u++];return l}function rr(t,n,r,e){
|
if(!l)return s;r&&(t=c(t,z(r))),e?(i=f,a=!1):t.length>=tn&&(i=S,a=!1,t=new yr(t));n:for(;++u<l;){var p=n[u],_=null==r?p:r(p);if(p=e||0!==p?p:0,a&&_===_){for(var v=h;v--;)if(t[v]===_)continue n;s.push(p)}else i(t,_,e)||s.push(p)}return s}function Jr(n,t){var r=!0;return ys(n,function(n,e,u){return r=!!t(n,e,u)}),r}function Yr(n,t,r){for(var e=-1,u=n.length;++e<u;){var i=n[e],o=t(i);if(null!=o&&(f===X?o===o&&!bc(o):r(o,f)))var f=o,c=i}return c}function ne(n,t,r,e){var u=n.length;for(r=kc(r),r<0&&(r=-r>u?0:u+r),
|
||||||
var u=-1,o=t.length,i=-1,f=r.length,c=-1,a=n.length,l=Du(o-f,0),s=Array(l+a);for(e=!e;++u<l;)s[u]=t[u];for(l=u;++c<a;)s[l+c]=n[c];for(;++i<f;)(e||o>u)&&(s[l+r[i]]=t[u++]);return s}function er(t,n){var r=-1,e=t.length;for(n||(n=Array(e));++r<e;)n[r]=t[r];return n}function ur(t,n,r){return or(t,n,r)}function or(t,n,r,e){r||(r={});for(var u=-1,o=n.length;++u<o;){var i=n[u],f=e?e(r[i],t[i],i,r,t):t[i];Qt(r,i,f)}return r}function ir(t,n){return ur(t,Cr(t),n)}function fr(t,n){return function(r,u){var o=Qo(r)?e:Xt,i=n?n():{};
|
e=e===X||e>u?u:kc(e),e<0&&(e+=u),e=r>e?0:Oc(e);r<e;)n[r++]=t;return n}function te(n,t){var r=[];return ys(n,function(n,e,u){t(n,e,u)&&r.push(n)}),r}function ee(n,t,r,e,u){var i=-1,o=n.length;for(r||(r=Li),u||(u=[]);++i<o;){var f=n[i];t>0&&r(f)?t>1?ee(f,t-1,r,e,u):a(u,f):e||(u[u.length]=f)}return u}function ue(n,t){return n&&bs(n,t,Pc)}function oe(n,t){return n&&ws(n,t,Pc)}function fe(n,t){return i(t,function(t){return uc(n[t])})}function _e(n,t){t=ku(t,n);for(var r=0,e=t.length;null!=n&&r<e;)n=n[no(t[r++])];
|
||||||
return o(r,t,Sr(u),i)}}function cr(t){return de(function(n,r){var e=-1,u=r.length,o=u>1?r[u-1]:T,i=u>2?r[2]:T,o=typeof o=="function"?(u--,o):T;for(i&&Fr(r[0],r[1],i)&&(o=3>u?T:o,u=1),n=Object(n);++e<u;)(i=r[e])&&t(n,i,e,o);return n})}function ar(t,n){return function(r,e){if(null==r)return r;if(!me(r))return t(r,e);for(var u=r.length,o=n?u:-1,i=Object(r);(n?o--:++o<u)&&false!==e(i[o],o,i););return r}}function lr(t){return function(n,r,e){var u=-1,o=Object(n);e=e(n);for(var i=e.length;i--;){var f=e[t?i:++u];
|
return r&&r==e?n:X}function de(n,t,r){var e=t(n);return bh(n)?e:a(e,r(n))}function we(n){return null==n?n===X?ut:Jn:Bl&&Bl in ll(n)?ki(n):Ki(n)}function me(n,t){return n>t}function xe(n,t){return null!=n&&bl.call(n,t)}function je(n,t){return null!=n&&t in ll(n)}function Ae(n,t,r){return n>=Hl(t,r)&&n<Gl(t,r)}function ke(n,t,r){for(var e=r?f:o,u=n[0].length,i=n.length,a=i,l=il(i),s=1/0,h=[];a--;){var p=n[a];a&&t&&(p=c(p,z(t))),s=Hl(p.length,s),l[a]=!r&&(t||u>=120&&p.length>=120)?new yr(a&&p):X}p=n[0];
|
||||||
if(false===r(o[f],f,o))break}return n}}function sr(t,n,r){function e(){return(this&&this!==Jt&&this instanceof e?o:t).apply(u?r:this,arguments)}var u=1&n,o=_r(t);return e}function hr(t){return function(n){n=Ze(n);var r=St.test(n)?n.match(It):T,e=r?r[0]:n.charAt(0);return n=r?r.slice(1).join(""):n.slice(1),e[t]()+n}}function pr(t){return function(n){return s(tu(Xe(n)),t,"")}}function _r(t){return function(){var n=arguments;switch(n.length){case 0:return new t;case 1:return new t(n[0]);case 2:return new t(n[0],n[1]);
|
var _=-1,v=l[0];n:for(;++_<u&&h.length<s;){var g=p[_],y=t?t(g):g;if(g=r||0!==g?g:0,!(v?S(v,y):e(h,y,r))){for(a=i;--a;){var d=l[a];if(!(d?S(d,y):e(n[a],y,r)))continue n}v&&v.push(y),h.push(g)}}return h}function Oe(n,t,r,e){return ue(n,function(n,u,i){t(e,r(n),u,i)}),e}function Ie(t,r,e){r=ku(r,t),t=Gi(t,r);var u=null==t?t:t[no(jo(r))];return null==u?X:n(u,t,e)}function Re(n){return cc(n)&&we(n)==Dn}function ze(n){return cc(n)&&we(n)==ft}function Ee(n){return cc(n)&&we(n)==Pn}function Se(n,t,r,e,u){
|
||||||
case 3:return new t(n[0],n[1],n[2]);case 4:return new t(n[0],n[1],n[2],n[3]);case 5:return new t(n[0],n[1],n[2],n[3],n[4]);case 6:return new t(n[0],n[1],n[2],n[3],n[4],n[5]);case 7:return new t(n[0],n[1],n[2],n[3],n[4],n[5],n[6])}var r=an(t.prototype),n=t.apply(r,n);return Ie(n)?n:r}}function vr(t,n,e){function u(){for(var i=arguments.length,f=Array(i),c=i,a=Br(u);c--;)f[c]=arguments[c];return c=3>i&&f[0]!==a&&f[i-1]!==a?[]:F(f,a),i-=c.length,e>i?wr(t,n,dr,u.placeholder,T,f,c,T,T,e-i):r(this&&this!==Jt&&this instanceof u?o:t,this,f);
|
return n===t||(null==n||null==t||!cc(n)&&!cc(t)?n!==n&&t!==t:We(n,t,r,e,Se,u))}function We(n,t,r,e,u,i){var o=bh(n),f=bh(t),c=o?Mn:zs(n),a=f?Mn:zs(t);c=c==Dn?Yn:c,a=a==Dn?Yn:a;var l=c==Yn,s=a==Yn,h=c==a;if(h&&mh(n)){if(!mh(t))return!1;o=!0,l=!1}if(h&&!l)return i||(i=new wr),o||Oh(n)?pi(n,t,r,e,u,i):_i(n,t,c,r,e,u,i);if(!(r&hn)){var p=l&&bl.call(n,"__wrapped__"),_=s&&bl.call(t,"__wrapped__");if(p||_){var v=p?n.value():n,g=_?t.value():t;return i||(i=new wr),u(v,g,r,e,i)}}return!!h&&(i||(i=new wr),vi(n,t,r,e,u,i));
|
||||||
}var o=_r(t);return u}function gr(t){return de(function(n){n=_n(n,1);var r=n.length,e=r,u=Ot.prototype.thru;for(t&&n.reverse();e--;){var o=n[e];if(typeof o!="function")throw new su("Expected a function");if(u&&!i&&"wrapper"==Ir(o))var i=new Ot([],true)}for(e=i?e:r;++e<r;)var o=n[e],u=Ir(o),f="wrapper"==u?po(o):T,i=f&&Zr(f[0])&&424==f[1]&&!f[4].length&&1==f[9]?i[Ir(f[0])].apply(i,f[3]):1==o.length&&Zr(o)?i[u]():i.thru(o);return function(){var t=arguments,e=t[0];if(i&&1==t.length&&Qo(e)&&e.length>=200)return i.plant(e).value();
|
}function Le(n){return cc(n)&&zs(n)==Gn}function Ce(n,t,r,e){var u=r.length,i=u,o=!e;if(null==n)return!i;for(n=ll(n);u--;){var f=r[u];if(o&&f[2]?f[1]!==n[f[0]]:!(f[0]in n))return!1}for(;++u<i;){f=r[u];var c=f[0],a=n[c],l=f[1];if(o&&f[2]){if(a===X&&!(c in n))return!1}else{var s=new wr;if(e)var h=e(a,l,c,n,t,s);if(!(h===X?Se(l,a,hn|pn,e,s):h))return!1}}return!0}function Ue(n){return!(!fc(n)||Di(n))&&(uc(n)?kl:Zt).test(to(n))}function Be(n){return cc(n)&&we(n)==nt}function Te(n){return cc(n)&&zs(n)==tt;
|
||||||
for(var u=0,t=r?n[u].apply(this,t):e;++u<r;)t=n[u].call(this,t);return t}})}function dr(t,n,r,e,u,o,i,f,c,a){function l(){for(var d=arguments.length,y=d,b=Array(d);y--;)b[y]=arguments[y];if(_){var x,j=Br(l),y=b.length;for(x=0;y--;)b[y]===j&&x++}if(e&&(b=nr(b,e,u,_)),o&&(b=rr(b,o,i,_)),d-=x,_&&a>d)return j=F(b,j),wr(t,n,dr,l.placeholder,r,b,j,f,c,a-d);if(j=h?r:this,y=p?j[t]:t,d=b.length,f){x=b.length;for(var m=Fu(f.length,x),w=er(b);m--;){var A=f[m];b[m]=L(A,x)?w[A]:T}}else v&&d>1&&b.reverse();return s&&d>c&&(b.length=c),
|
}function $e(n){return cc(n)&&oc(n.length)&&!!Kr[we(n)]}function De(n){return"function"==typeof n?n:null==n?La:"object"==typeof n?bh(n)?Ze(n[0],n[1]):qe(n):Fa(n)}function Me(n){if(!Mi(n))return Vl(n);var t=[];for(var r in ll(n))bl.call(n,r)&&"constructor"!=r&&t.push(r);return t}function Fe(n){if(!fc(n))return Zi(n);var t=Mi(n),r=[];for(var e in n)("constructor"!=e||!t&&bl.call(n,e))&&r.push(e);return r}function Ne(n,t){return n<t}function Pe(n,t){var r=-1,e=Hf(n)?il(n.length):[];return ys(n,function(n,u,i){
|
||||||
this&&this!==Jt&&this instanceof l&&(y=g||_r(y)),y.apply(j,b)}var s=128&n,h=1&n,p=2&n,_=24&n,v=512&n,g=p?T:_r(t);return l}function yr(t,n){return function(r,e){return wn(r,t,n(e))}}function br(t){return de(function(n){return n=a(n,Sr()),de(function(e){var u=this;return t(n,function(t){return r(t,u,e)})})})}function xr(t,n){n=n===T?" ":n+"";var r=n.length;return 2>r?r?Nn(n,t):n:(r=Nn(n,Cu(t/P(n))),St.test(n)?r.match(It).slice(0,t).join(""):r.slice(0,t))}function jr(t,n,e,u){function o(){for(var n=-1,c=arguments.length,a=-1,l=u.length,s=Array(l+c),h=this&&this!==Jt&&this instanceof o?f:t;++a<l;)s[a]=u[a];
|
e[++r]=t(n,u,i)}),e}function qe(n){var t=ji(n);return 1==t.length&&t[0][2]?Ni(t[0][0],t[0][1]):function(r){return r===n||Ce(r,n,t)}}function Ze(n,t){return Bi(n)&&Fi(t)?Ni(no(n),t):function(r){var e=Mc(r,n);return e===X&&e===t?Nc(r,n):Se(t,e,hn|pn)}}function Ke(n,t,r,e,u){n!==t&&bs(t,function(i,o){if(u||(u=new wr),fc(i))Ve(n,t,o,r,Ke,e,u);else{var f=e?e(Ji(n,o),i,o+"",n,t,u):X;f===X&&(f=i),Er(n,o,f)}},qc)}function Ve(n,t,r,e,u,i,o){var f=Ji(n,r),c=Ji(t,r),a=o.get(c);if(a)return Er(n,r,a),X;var l=i?i(f,c,r+"",n,t,o):X,s=l===X;
|
||||||
for(;c--;)s[a++]=arguments[++n];return r(h,i?e:this,s)}var i=1&n,f=_r(t);return o}function mr(t){return function(n,r,e){e&&typeof e!="number"&&Fr(n,r,e)&&(r=e=T),n=Ne(n),n=n===n?n:0,r===T?(r=n,n=0):r=Ne(r)||0,e=e===T?r>n?1:-1:Ne(e)||0;var u=-1;r=Du(Cu((r-n)/(e||1)),0);for(var o=Array(r);r--;)o[t?r:++u]=n,n+=e;return o}}function wr(t,n,r,e,u,o,i,f,c,a){var l=8&n;f=f?er(f):T;var s=l?i:T;i=l?T:i;var h=l?o:T;return o=l?T:o,n=(n|(l?32:64))&~(l?64:32),4&n||(n&=-4),n=[t,n,u,h,s,o,i,f,c,a],r=r.apply(T,n),
|
if(s){var h=bh(c),p=!h&&mh(c),_=!h&&!p&&Oh(c);l=c,h||p||_?bh(f)?l=f:Jf(f)?l=Tu(f):p?(s=!1,l=Iu(c,!0)):_?(s=!1,l=Wu(c,!0)):l=[]:gc(c)||dh(c)?(l=f,dh(f)?l=Rc(f):fc(f)&&!uc(f)||(l=Ei(c))):s=!1}s&&(o.set(c,l),u(l,c,e,i,o),o.delete(c)),Er(n,r,l)}function Ge(n,t){var r=n.length;if(r)return t+=t<0?r:0,Ci(t,r)?n[t]:X}function He(n,t,r){t=t.length?c(t,function(n){return bh(n)?function(t){return _e(t,1===n.length?n[0]:n)}:n}):[La];var e=-1;return t=c(t,z(mi())),A(Pe(n,function(n,r,u){return{criteria:c(t,function(t){
|
||||||
Zr(t)&&go(r,n),r.placeholder=e,r}function Ar(t){var n=au[t];return function(t,r){if(t=Ne(t),r=De(r)){var e=(Ze(t)+"e").split("e"),e=n(e[0]+"e"+(+e[1]+r)),e=(Ze(e)+"e").split("e");return+(e[0]+"e"+(+e[1]-r))}return n(t)}}function Or(t,n,r,e,u,o,i,f){var c=2&n;if(!c&&typeof t!="function")throw new su("Expected a function");var a=e?e.length:0;if(a||(n&=-97,e=u=T),i=i===T?i:Du(De(i),0),f=f===T?f:De(f),a-=u?u.length:0,64&n){var l=e,s=u;e=u=T}var h=c?T:po(t);return o=[t,n,r,e,u,l,s,o,i,f],h&&(r=o[1],t=h[1],
|
return t(n)}),index:++e,value:n}}),function(n,t){return Cu(n,t,r)})}function Je(n,t){return Ye(n,t,function(t,r){return Nc(n,r)})}function Ye(n,t,r){for(var e=-1,u=t.length,i={};++e<u;){var o=t[e],f=_e(n,o);r(f,o)&&fu(i,ku(o,n),f)}return i}function Qe(n){return function(t){return _e(t,n)}}function Xe(n,t,r,e){var u=e?d:y,i=-1,o=t.length,f=n;for(n===t&&(t=Tu(t)),r&&(f=c(n,z(r)));++i<o;)for(var a=0,l=t[i],s=r?r(l):l;(a=u(f,s,a,e))>-1;)f!==n&&Ll.call(f,a,1),Ll.call(n,a,1);return n}function nu(n,t){for(var r=n?t.length:0,e=r-1;r--;){
|
||||||
n=r|t,e=128==t&&8==r||128==t&&256==r&&h[8]>=o[7].length||384==t&&h[8]>=h[7].length&&8==r,131>n||e)&&(1&t&&(o[2]=h[2],n|=1&r?0:4),(r=h[3])&&(e=o[3],o[3]=e?nr(e,r,h[4]):er(r),o[4]=e?F(o[3],"__lodash_placeholder__"):er(h[4])),(r=h[5])&&(e=o[5],o[5]=e?rr(e,r,h[6]):er(r),o[6]=e?F(o[5],"__lodash_placeholder__"):er(h[6])),(r=h[7])&&(o[7]=er(r)),128&t&&(o[8]=null==o[8]?h[8]:Fu(o[8],h[8])),null==o[9]&&(o[9]=h[9]),o[0]=h[0],o[1]=n),t=o[0],n=o[1],r=o[2],e=o[3],u=o[4],f=o[9]=null==o[9]?c?0:t.length:Du(o[9]-a,0),
|
var u=t[r];if(r==e||u!==i){var i=u;Ci(u)?Ll.call(n,u,1):yu(n,u)}}return n}function tu(n,t){return n+Nl(Ql()*(t-n+1))}function ru(n,t,r,e){for(var u=-1,i=Gl(Fl((t-n)/(r||1)),0),o=il(i);i--;)o[e?i:++u]=n,n+=r;return o}function eu(n,t){var r="";if(!n||t<1||t>Wn)return r;do t%2&&(r+=n),t=Nl(t/2),t&&(n+=n);while(t);return r}function uu(n,t){return Ls(Vi(n,t,La),n+"")}function iu(n){return Ir(ra(n))}function ou(n,t){var r=ra(n);return Xi(r,Mr(t,0,r.length))}function fu(n,t,r,e){if(!fc(n))return n;t=ku(t,n);
|
||||||
!f&&24&n&&(n&=-25),(h?so:go)(n&&1!=n?8==n||16==n?vr(t,n,f):32!=n&&33!=n||u.length?dr.apply(T,o):jr(t,n,r,e):sr(t,n,r),o)}function kr(t,n,r,e,u,o){var i=-1,f=2&u,c=1&u,a=t.length,l=n.length;if(!(a==l||f&&l>a))return false;if(l=o.get(t))return l==n;for(l=true,o.set(t,n);++i<a;){var s=t[i],h=n[i];if(e)var _=f?e(h,s,i,n,t,o):e(s,h,i,t,n,o);if(_!==T){if(_)continue;l=false;break}if(c){if(!p(n,function(t){return s===t||r(s,t,e,u,o)})){l=false;break}}else if(s!==h&&!r(s,h,e,u,o)){l=false;break}}return o["delete"](t),l}
|
for(var u=-1,i=t.length,o=i-1,f=n;null!=f&&++u<i;){var c=no(t[u]),a=r;if("__proto__"===c||"constructor"===c||"prototype"===c)return n;if(u!=o){var l=f[c];a=e?e(l,c,f):X,a===X&&(a=fc(l)?l:Ci(t[u+1])?[]:{})}Sr(f,c,a),f=f[c]}return n}function cu(n){return Xi(ra(n))}function au(n,t,r){var e=-1,u=n.length;t<0&&(t=-t>u?0:u+t),r=r>u?u:r,r<0&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0;for(var i=il(u);++e<u;)i[e]=n[e+t];return i}function lu(n,t){var r;return ys(n,function(n,e,u){return r=t(n,e,u),!r}),!!r}function su(n,t,r){
|
||||||
function Er(t,n,r,e,u,o,i){switch(r){case"[object DataView]":if(t.byteLength!=n.byteLength||t.byteOffset!=n.byteOffset)break;t=t.buffer,n=n.buffer;case"[object ArrayBuffer]":if(t.byteLength!=n.byteLength||!e(new Au(t),new Au(n)))break;return true;case"[object Boolean]":case"[object Date]":return+t==+n;case"[object Error]":return t.name==n.name&&t.message==n.message;case"[object Number]":return t!=+t?n!=+n:t==+n;case"[object RegExp]":case"[object String]":return t==n+"";case"[object Map]":var f=D;case"[object Set]":
|
var e=0,u=null==n?e:n.length;if("number"==typeof t&&t===t&&u<=Tn){for(;e<u;){var i=e+u>>>1,o=n[i];null!==o&&!bc(o)&&(r?o<=t:o<t)?e=i+1:u=i}return u}return hu(n,t,La,r)}function hu(n,t,r,e){var u=0,i=null==n?0:n.length;if(0===i)return 0;t=r(t);for(var o=t!==t,f=null===t,c=bc(t),a=t===X;u<i;){var l=Nl((u+i)/2),s=r(n[l]),h=s!==X,p=null===s,_=s===s,v=bc(s);if(o)var g=e||_;else g=a?_&&(e||h):f?_&&h&&(e||!p):c?_&&h&&!p&&(e||!v):!p&&!v&&(e?s<=t:s<t);g?u=l+1:i=l}return Hl(i,Bn)}function pu(n,t){for(var r=-1,e=n.length,u=0,i=[];++r<e;){
|
||||||
if(f||(f=N),t.size!=n.size&&!(2&o))break;return(r=i.get(t))?r==n:(o|=1,i.set(t,n),kr(f(t),f(n),e,u,o,i));case"[object Symbol]":if(oo)return oo.call(t)==oo.call(n)}return false}function Ir(t){for(var n=t.name+"",r=Qu[n],e=vu.call(Qu,n)?r.length:0;e--;){var u=r[e],o=u.func;if(null==o||o==t)return u.name}return n}function Sr(){var t=xt.iteratee||eu,t=t===eu?En:t;return arguments.length?t(arguments[0],arguments[1]):t}function Rr(t){t=Je(t);for(var n=t.length;n--;){var r=t[n][1];t[n][2]=r===r&&!Ie(r)}return t;
|
var o=n[r],f=t?t(o):o;if(!r||!Gf(f,c)){var c=f;i[u++]=0===o?0:o}}return i}function _u(n){return"number"==typeof n?n:bc(n)?Cn:+n}function vu(n){if("string"==typeof n)return n;if(bh(n))return c(n,vu)+"";if(bc(n))return vs?vs.call(n):"";var t=n+"";return"0"==t&&1/n==-Sn?"-0":t}function gu(n,t,r){var e=-1,u=o,i=n.length,c=!0,a=[],l=a;if(r)c=!1,u=f;else if(i>=tn){var s=t?null:ks(n);if(s)return P(s);c=!1,u=S,l=new yr}else l=t?[]:a;n:for(;++e<i;){var h=n[e],p=t?t(h):h;if(h=r||0!==h?h:0,c&&p===p){for(var _=l.length;_--;)if(l[_]===p)continue n;
|
||||||
}function Wr(t,n){var r=t[n];return Re(r)?r:T}function Br(t){return(vu.call(xt,"placeholder")?xt:t).placeholder}function Cr(t){return Eu(Object(t))}function zr(t){return yu.call(t)}function Ur(t,n,r){n=Nr(n,t)?[n]:un(n);for(var e,u=-1,o=n.length;++u<o;){var i=n[u];if(!(e=null!=t&&r(t,i)))break;t=t[i]}return e?e:(o=t?t.length:0,!!o&&Ee(o)&&L(i,o)&&(Qo(t)||ze(t)||je(t)))}function Mr(t){var n=t.length,r=t.constructor(n);return n&&"string"==typeof t[0]&&vu.call(t,"index")&&(r.index=t.index,r.input=t.input),
|
t&&l.push(p),a.push(h)}else u(l,p,r)||(l!==a&&l.push(p),a.push(h))}return a}function yu(n,t){t=ku(t,n);var r=-1,e=t.length;if(!e)return!0;for(var u=null==n||"object"!=typeof n&&"function"!=typeof n;++r<e;){var i=t[r];if("string"==typeof i){if("__proto__"===i&&!bl.call(n,"__proto__"))return!1;if("constructor"===i&&r+1<e&&"string"==typeof t[r+1]&&"prototype"===t[r+1]){if(u&&0===r)continue;return!1}}}var o=Gi(n,t);return null==o||delete o[no(jo(t))]}function du(n,t,r,e){return fu(n,t,r(_e(n,t)),e)}function bu(n,t,r,e){
|
||||||
r}function Lr(t){return typeof t.constructor!="function"||qr(t)?{}:an(Uu(Object(t)))}function $r(r,e,u,o){var i=r.constructor;switch(e){case"[object ArrayBuffer]":return tr(r);case"[object Boolean]":case"[object Date]":return new i(+r);case"[object DataView]":return e=o?tr(r.buffer):r.buffer,new r.constructor(e,r.byteOffset,r.byteLength);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":
|
for(var u=n.length,i=e?u:-1;(e?i--:++i<u)&&t(n[i],i,n););return r?au(n,e?0:i,e?i+1:u):au(n,e?i+1:0,e?u:i)}function wu(n,t){var r=n;return r instanceof Ct&&(r=r.value()),l(t,function(n,t){return t.func.apply(t.thisArg,a([n],t.args))},r)}function mu(n,t,r){var e=n.length;if(e<2)return e?gu(n[0]):[];for(var u=-1,i=il(e);++u<e;)for(var o=n[u],f=-1;++f<e;)f!=u&&(i[u]=Hr(i[u]||o,n[f],t,r));return gu(ee(i,1),t,r)}function xu(n,t,r){for(var e=-1,u=n.length,i=t.length,o={};++e<u;){r(o,n[e],e<i?t[e]:X)}return o;
|
||||||
case"[object Uint16Array]":case"[object Uint32Array]":return e=o?tr(r.buffer):r.buffer,new r.constructor(e,r.byteOffset,r.length);case"[object Map]":return e=o?u(D(r),true):D(r),s(e,t,new r.constructor);case"[object Number]":case"[object String]":return new i(r);case"[object RegExp]":return e=new r.constructor(r.source,_t.exec(r)),e.lastIndex=r.lastIndex,e;case"[object Set]":return e=o?u(N(r),true):N(r),s(e,n,new r.constructor);case"[object Symbol]":return oo?Object(oo.call(r)):{}}}function Dr(t){var n=t?t.length:T;
|
}function ju(n){return Jf(n)?n:[]}function Au(n){return"function"==typeof n?n:La}function ku(n,t){return bh(n)?n:Bi(n,t)?[n]:Cs(Ec(n))}function Ou(n,t,r){var e=n.length;return r=r===X?e:r,!t&&r>=e?n:au(n,t,r)}function Iu(n,t){if(t)return n.slice();var r=n.length,e=zl?zl(r):new n.constructor(r);return n.copy(e),e}function Ru(n){var t=new n.constructor(n.byteLength);return new Rl(t).set(new Rl(n)),t}function zu(n,t){return new n.constructor(t?Ru(n.buffer):n.buffer,n.byteOffset,n.byteLength)}function Eu(n){
|
||||||
return Ee(n)&&(Qo(t)||ze(t)||je(t))?w(n,String):null}function Fr(t,n,r){if(!Ie(r))return false;var e=typeof n;return("number"==e?me(r)&&L(n,r.length):"string"==e&&n in r)?be(r[n],t):false}function Nr(t,n){var r=typeof t;return"number"==r||"symbol"==r?true:!Qo(t)&&(Ue(t)||ot.test(t)||!ut.test(t)||null!=n&&t in Object(n))}function Pr(t){var n=typeof t;return"number"==n||"boolean"==n||"string"==n&&"__proto__"!=t||null==t}function Zr(t){var n=Ir(t),r=xt[n];return typeof r=="function"&&n in kt.prototype?t===r?true:(n=po(r),
|
var t=new n.constructor(n.source,Nt.exec(n));return t.lastIndex=n.lastIndex,t}function Su(n){return _s?ll(_s.call(n)):{}}function Wu(n,t){return new n.constructor(t?Ru(n.buffer):n.buffer,n.byteOffset,n.length)}function Lu(n,t){if(n!==t){var r=n!==X,e=null===n,u=n===n,i=bc(n),o=t!==X,f=null===t,c=t===t,a=bc(t);if(!f&&!a&&!i&&n>t||i&&o&&c&&!f&&!a||e&&o&&c||!r&&c||!u)return 1;if(!e&&!i&&!a&&n<t||a&&r&&u&&!e&&!i||f&&r&&u||!o&&u||!c)return-1}return 0}function Cu(n,t,r){for(var e=-1,u=n.criteria,i=t.criteria,o=u.length,f=r.length;++e<o;){
|
||||||
!!n&&t===n[0]):false}function qr(t){var n=t&&t.constructor;return t===(typeof n=="function"&&n.prototype||pu)}function Tr(t,n){return function(r){return null==r?false:r[t]===n&&(n!==T||t in Object(r))}}function Vr(t,n,r,e,u,o){return Ie(t)&&Ie(n)&&Bn(t,n,T,Vr,o.set(n,t)),t}function Kr(t,n){return 1==n.length?t:yn(t,Zn(n,0,-1))}function Gr(t){if(Oe(t))try{return _u.call(t)}catch(n){}return Ze(t)}function Jr(t){if(t instanceof kt)return t.clone();var n=new Ot(t.__wrapped__,t.__chain__);return n.__actions__=er(t.__actions__),
|
var c=Lu(u[e],i[e]);if(c){if(e>=f)return c;return c*("desc"==r[e]?-1:1)}}return n.index-t.index}function Uu(n,t,r,e){for(var u=-1,i=n.length,o=r.length,f=-1,c=t.length,a=Gl(i-o,0),l=il(c+a),s=!e;++f<c;)l[f]=t[f];for(;++u<o;)(s||u<i)&&(l[r[u]]=n[u]);for(;a--;)l[f++]=n[u++];return l}function Bu(n,t,r,e){for(var u=-1,i=n.length,o=-1,f=r.length,c=-1,a=t.length,l=Gl(i-f,0),s=il(l+a),h=!e;++u<l;)s[u]=n[u];for(var p=u;++c<a;)s[p+c]=t[c];for(;++o<f;)(h||u<i)&&(s[p+r[o]]=n[u++]);return s}function Tu(n,t){
|
||||||
n.__index__=t.__index__,n.__values__=t.__values__,n}function Yr(t,n,r){var e=t?t.length:0;return e?(n=r||n===T?1:De(n),Zn(t,0>n?0:n,e)):[]}function Hr(t,n,r){var e=t?t.length:0;return e?(n=r||n===T?1:De(n),n=e-n,Zn(t,0,0>n?0:n)):[]}function Qr(t){return t?t[0]:T}function Xr(t){var n=t?t.length:0;return n?t[n-1]:T}function te(t,n){return t&&t.length&&n&&n.length?$n(t,n):t}function ne(t){return t?Zu.call(t):t}function re(t){if(!t||!t.length)return[];var n=0;return t=i(t,function(t){return we(t)?(n=Du(t.length,n),
|
var r=-1,e=n.length;for(t||(t=il(e));++r<e;)t[r]=n[r];return t}function $u(n,t,r,e){var u=!r;r||(r={});for(var i=-1,o=t.length;++i<o;){var f=t[i],c=e?e(r[f],n[f],f,r,n):X;c===X&&(c=n[f]),u?Br(r,f,c):Sr(r,f,c)}return r}function Du(n,t){return $u(n,Is(n),t)}function Mu(n,t){return $u(n,Rs(n),t)}function Fu(n,r){return function(e,u){var i=bh(e)?t:Lr,o=r?r():{};return i(e,n,mi(u,2),o)}}function Nu(n){return uu(function(t,r){var e=-1,u=r.length,i=u>1?r[u-1]:X,o=u>2?r[2]:X;for(i=n.length>3&&"function"==typeof i?(u--,
|
||||||
!0):void 0}),w(n,function(n){return a(t,Mn(n))})}function ee(t,n){if(!t||!t.length)return[];var e=re(t);return null==n?e:a(e,function(t){return r(n,T,t)})}function ue(t){return t=xt(t),t.__chain__=true,t}function oe(t,n){return n(t)}function ie(){return this}function fe(t,n){return typeof n=="function"&&Qo(t)?u(t,n):fo(t,Sr(n))}function ce(t,n){var r;if(typeof n=="function"&&Qo(t)){for(r=t.length;r--&&false!==n(t[r],r,t););r=t}else r=co(t,Sr(n));return r}function ae(t,n){return(Qo(t)?a:Sn)(t,Sr(n,3))}function le(t,n,r){
|
i):X,o&&Ui(r[0],r[1],o)&&(i=u<3?X:i,u=1),t=ll(t);++e<u;){var f=r[e];f&&n(t,f,e,i)}return t})}function Pu(n,t){return function(r,e){if(null==r)return r;if(!Hf(r))return n(r,e);for(var u=r.length,i=t?u:-1,o=ll(r);(t?i--:++i<u)&&e(o[i],i,o)!==!1;);return r}}function qu(n){return function(t,r,e){for(var u=-1,i=ll(t),o=e(t),f=o.length;f--;){var c=o[n?f:++u];if(r(i[c],c,i)===!1)break}return t}}function Zu(n,t,r){function e(){return(this&&this!==re&&this instanceof e?i:n).apply(u?r:this,arguments)}var u=t&_n,i=Gu(n);
|
||||||
var e=-1,u=$e(t),o=u.length,i=o-1;for(n=(r?Fr(t,n,r):n===T)?1:on(De(n),0,o);++e<n;)t=Fn(e,i),r=u[t],u[t]=u[e],u[e]=r;return u.length=n,u}function se(t,n,r){return n=r?T:n,n=t&&null==n?t.length:n,Or(t,128,T,T,T,T,n)}function he(t,n){var r;if(typeof n!="function")throw new su("Expected a function");return t=De(t),function(){return 0<--t&&(r=n.apply(this,arguments)),1>=t&&(n=T),r}}function pe(t,n,r){return n=r?T:n,t=Or(t,8,T,T,T,T,T,n),t.placeholder=pe.placeholder,t}function _e(t,n,r){return n=r?T:n,
|
return e}function Ku(n){return function(t){t=Ec(t);var r=T(t)?G(t):X,e=r?r[0]:t.charAt(0),u=r?Ou(r,1).join(""):t.slice(1);return e[n]()+u}}function Vu(n){return function(t){return l(Ra(ca(t).replace($r,"")),n,"")}}function Gu(n){return function(){var t=arguments;switch(t.length){case 0:return new n;case 1:return new n(t[0]);case 2:return new n(t[0],t[1]);case 3:return new n(t[0],t[1],t[2]);case 4:return new n(t[0],t[1],t[2],t[3]);case 5:return new n(t[0],t[1],t[2],t[3],t[4]);case 6:return new n(t[0],t[1],t[2],t[3],t[4],t[5]);
|
||||||
t=Or(t,16,T,T,T,T,T,n),t.placeholder=_e.placeholder,t}function ve(t,n,r){function e(n){var r=c,e=a;return c=a=T,p=n,l=t.apply(e,r)}function u(t){var r=t-h;return t-=p,!h||r>=n||0>r||false!==v&&t>=v}function o(){var t=Zo();if(u(t))return i(t);var r;r=t-p,t=n-(t-h),r=false===v?t:Fu(t,v-r),s=Wu(o,r)}function i(t){return Ou(s),s=T,g&&c?e(t):(c=a=T,l)}function f(){var t=Zo(),r=u(t);return c=arguments,a=this,h=t,r?s===T?(p=t=h,s=Wu(o,n),_?e(t):l):(Ou(s),s=Wu(o,n),e(h)):l}var c,a,l,s,h=0,p=0,_=false,v=false,g=true;if(typeof t!="function")throw new su("Expected a function");
|
case 7:return new n(t[0],t[1],t[2],t[3],t[4],t[5],t[6])}var r=gs(n.prototype),e=n.apply(r,t);return fc(e)?e:r}}function Hu(t,r,e){function u(){for(var o=arguments.length,f=il(o),c=o,a=wi(u);c--;)f[c]=arguments[c];var l=o<3&&f[0]!==a&&f[o-1]!==a?[]:N(f,a);return o-=l.length,o<e?oi(t,r,Qu,u.placeholder,X,f,l,X,X,e-o):n(this&&this!==re&&this instanceof u?i:t,this,f)}var i=Gu(t);return u}function Ju(n){return function(t,r,e){var u=ll(t);if(!Hf(t)){var i=mi(r,3);t=Pc(t),r=function(n){return i(u[n],n,u);
|
||||||
return n=Ne(n)||0,Ie(r)&&(_=!!r.leading,v="maxWait"in r&&Du(Ne(r.maxWait)||0,n),g="trailing"in r?!!r.trailing:g),f.cancel=function(){s!==T&&Ou(s),h=p=0,c=a=s=T},f.flush=function(){return s===T?l:i(Zo())},f}function ge(t,n){function r(){var e=arguments,u=n?n.apply(this,e):e[0],o=r.cache;return o.has(u)?o.get(u):(e=t.apply(this,e),r.cache=o.set(u,e),e)}if(typeof t!="function"||n&&typeof n!="function")throw new su("Expected a function");return r.cache=new(ge.Cache||Lt),r}function de(t,n){if(typeof t!="function")throw new su("Expected a function");
|
}}var o=n(t,r,e);return o>-1?u[i?t[o]:o]:X}}function Yu(n){return gi(function(t){var r=t.length,e=r,u=Y.prototype.thru;for(n&&t.reverse();e--;){var i=t[e];if("function"!=typeof i)throw new pl(en);if(u&&!o&&"wrapper"==bi(i))var o=new Y([],!0)}for(e=o?e:r;++e<r;){i=t[e];var f=bi(i),c="wrapper"==f?Os(i):X;o=c&&$i(c[0])&&c[1]==(mn|yn|bn|xn)&&!c[4].length&&1==c[9]?o[bi(c[0])].apply(o,c[3]):1==i.length&&$i(i)?o[f]():o.thru(i)}return function(){var n=arguments,e=n[0];if(o&&1==n.length&&bh(e))return o.plant(e).value();
|
||||||
return n=Du(n===T?t.length-1:De(n),0),function(){for(var e=arguments,u=-1,o=Du(e.length-n,0),i=Array(o);++u<o;)i[u]=e[n+u];switch(n){case 0:return t.call(this,i);case 1:return t.call(this,e[0],i);case 2:return t.call(this,e[0],e[1],i)}for(o=Array(n+1),u=-1;++u<n;)o[u]=e[u];return o[n]=i,r(t,this,o)}}function ye(){if(!arguments.length)return[];var t=arguments[0];return Qo(t)?t:[t]}function be(t,n){return t===n||t!==t&&n!==n}function xe(t,n){return t>n}function je(t){return we(t)&&vu.call(t,"callee")&&(!Ru.call(t,"callee")||"[object Arguments]"==yu.call(t));
|
for(var u=0,i=r?t[u].apply(this,n):e;++u<r;)i=t[u].call(this,i);return i}})}function Qu(n,t,r,e,u,i,o,f,c,a){function l(){for(var y=arguments.length,d=il(y),b=y;b--;)d[b]=arguments[b];if(_)var w=wi(l),m=C(d,w);if(e&&(d=Uu(d,e,u,_)),i&&(d=Bu(d,i,o,_)),y-=m,_&&y<a){return oi(n,t,Qu,l.placeholder,r,d,N(d,w),f,c,a-y)}var x=h?r:this,j=p?x[n]:n;return y=d.length,f?d=Hi(d,f):v&&y>1&&d.reverse(),s&&c<y&&(d.length=c),this&&this!==re&&this instanceof l&&(j=g||Gu(j)),j.apply(x,d)}var s=t&mn,h=t&_n,p=t&vn,_=t&(yn|dn),v=t&jn,g=p?X:Gu(n);
|
||||||
}function me(t){return null!=t&&Ee(_o(t))&&!Oe(t)}function we(t){return Se(t)&&me(t)}function Ae(t){return Se(t)?"[object Error]"==yu.call(t)||typeof t.message=="string"&&typeof t.name=="string":false}function Oe(t){return t=Ie(t)?yu.call(t):"","[object Function]"==t||"[object GeneratorFunction]"==t}function ke(t){return typeof t=="number"&&t==De(t)}function Ee(t){return typeof t=="number"&&t>-1&&0==t%1&&9007199254740991>=t}function Ie(t){var n=typeof t;return!!t&&("object"==n||"function"==n)}function Se(t){
|
return l}function Xu(n,t){return function(r,e){return Oe(r,n,t(e),{})}}function ni(n,t){return function(r,e){var u;if(r===X&&e===X)return t;if(r!==X&&(u=r),e!==X){if(u===X)return e;"string"==typeof r||"string"==typeof e?(r=vu(r),e=vu(e)):(r=_u(r),e=_u(e)),u=n(r,e)}return u}}function ti(t){return gi(function(r){return r=c(r,z(mi())),uu(function(e){var u=this;return t(r,function(t){return n(t,u,e)})})})}function ri(n,t){t=t===X?" ":vu(t);var r=t.length;if(r<2)return r?eu(t,n):t;var e=eu(t,Fl(n/V(t)));
|
||||||
return!!t&&typeof t=="object"}function Re(t){return Ie(t)?(Oe(t)||M(t)?xu:yt).test(Gr(t)):false}function We(t){return typeof t=="number"||Se(t)&&"[object Number]"==yu.call(t)}function Be(t){return!Se(t)||"[object Object]"!=yu.call(t)||M(t)?false:(t=Uu(Object(t)),null===t?true:(t=vu.call(t,"constructor")&&t.constructor,typeof t=="function"&&t instanceof t&&_u.call(t)==du))}function Ce(t){return Ie(t)&&"[object RegExp]"==yu.call(t)}function ze(t){return typeof t=="string"||!Qo(t)&&Se(t)&&"[object String]"==yu.call(t);
|
return T(t)?Ou(G(e),0,n).join(""):e.slice(0,n)}function ei(t,r,e,u){function i(){for(var r=-1,c=arguments.length,a=-1,l=u.length,s=il(l+c),h=this&&this!==re&&this instanceof i?f:t;++a<l;)s[a]=u[a];for(;c--;)s[a++]=arguments[++r];return n(h,o?e:this,s)}var o=r&_n,f=Gu(t);return i}function ui(n){return function(t,r,e){return e&&"number"!=typeof e&&Ui(t,r,e)&&(r=e=X),t=Ac(t),r===X?(r=t,t=0):r=Ac(r),e=e===X?t<r?1:-1:Ac(e),ru(t,r,e,n)}}function ii(n){return function(t,r){return"string"==typeof t&&"string"==typeof r||(t=Ic(t),
|
||||||
}function Ue(t){return typeof t=="symbol"||Se(t)&&"[object Symbol]"==yu.call(t)}function Me(t){return Se(t)&&Ee(t.length)&&!!zt[yu.call(t)]}function Le(t,n){return n>t}function $e(t){if(!t)return[];if(me(t))return ze(t)?t.match(It):er(t);if(Iu&&t[Iu])return $(t[Iu]());var n=zr(t);return("[object Map]"==n?D:"[object Set]"==n?N:He)(t)}function De(t){if(!t)return 0===t?t:0;if(t=Ne(t),t===V||t===-V)return 1.7976931348623157e308*(0>t?-1:1);var n=t%1;return t===t?n?t-n:t:0}function Fe(t){return t?on(De(t),0,4294967295):0;
|
r=Ic(r)),n(t,r)}}function oi(n,t,r,e,u,i,o,f,c,a){var l=t&yn,s=l?o:X,h=l?X:o,p=l?i:X,_=l?X:i;t|=l?bn:wn,t&=~(l?wn:bn),t&gn||(t&=~(_n|vn));var v=[n,t,u,p,s,_,h,f,c,a],g=r.apply(X,v);return $i(n)&&Ss(g,v),g.placeholder=e,Yi(g,n,t)}function fi(n){var t=al[n];return function(n,r){if(n=Ic(n),r=null==r?0:Hl(kc(r),292),r&&Zl(n)){var e=(Ec(n)+"e").split("e");return e=(Ec(t(e[0]+"e"+(+e[1]+r)))+"e").split("e"),+(e[0]+"e"+(+e[1]-r))}return t(n)}}function ci(n){return function(t){var r=zs(t);return r==Gn?M(t):r==tt?q(t):I(t,n(t));
|
||||||
}function Ne(t){if(typeof t=="number")return t;if(Ue(t))return K;if(Ie(t)&&(t=Oe(t.valueOf)?t.valueOf():t,t=Ie(t)?t+"":t),typeof t!="string")return 0===t?t:+t;t=t.replace(at,"");var n=dt.test(t);return n||bt.test(t)?Pt(t.slice(2),n?2:8):gt.test(t)?K:+t}function Pe(t){return ur(t,Ge(t))}function Ze(t){if(typeof t=="string")return t;if(null==t)return"";if(Ue(t))return io?io.call(t):"";var n=t+"";return"0"==n&&1/t==-V?"-0":n}function qe(t,n,r){return t=null==t?T:yn(t,n),t===T?r:t}function Te(t,n){return null!=t&&Ur(t,n,xn);
|
}}function ai(n,t,r,e,u,i,o,f){var c=t&vn;if(!c&&"function"!=typeof n)throw new pl(en);var a=e?e.length:0;if(a||(t&=~(bn|wn),e=u=X),o=o===X?o:Gl(kc(o),0),f=f===X?f:kc(f),a-=u?u.length:0,t&wn){var l=e,s=u;e=u=X}var h=c?X:Os(n),p=[n,t,r,e,u,l,s,i,o,f];if(h&&qi(p,h),n=p[0],t=p[1],r=p[2],e=p[3],u=p[4],f=p[9]=p[9]===X?c?0:n.length:Gl(p[9]-a,0),!f&&t&(yn|dn)&&(t&=~(yn|dn)),t&&t!=_n)_=t==yn||t==dn?Hu(n,t,f):t!=bn&&t!=(_n|bn)||u.length?Qu.apply(X,p):ei(n,t,r,e);else var _=Zu(n,t,r);return Yi((h?ms:Ss)(_,p),n,t);
|
||||||
}function Ve(t,n){return null!=t&&Ur(t,n,jn)}function Ke(t){var n=qr(t);if(!n&&!me(t))return $u(Object(t));var r,e=Dr(t),u=!!e,e=e||[],o=e.length;for(r in t)!xn(t,r)||u&&("length"==r||L(r,o))||n&&"constructor"==r||e.push(r);return e}function Ge(t){for(var n=-1,r=qr(t),e=In(t),u=e.length,o=Dr(t),i=!!o,o=o||[],f=o.length;++n<u;){var c=e[n];i&&("length"==c||L(c,f))||"constructor"==c&&(r||!vu.call(t,c))||o.push(c)}return o}function Je(t){return A(t,Ke(t))}function Ye(t){return A(t,Ge(t))}function He(t){
|
}function li(n,t,r,e){return n===X||Gf(n,gl[r])&&!bl.call(e,r)?t:n}function si(n,t,r,e,u,i){return fc(n)&&fc(t)&&(i.set(t,n),Ke(n,t,X,si,i),i.delete(t)),n}function hi(n){return gc(n)?X:n}function pi(n,t,r,e,u,i){var o=r&hn,f=n.length,c=t.length;if(f!=c&&!(o&&c>f))return!1;var a=i.get(n),l=i.get(t);if(a&&l)return a==t&&l==n;var s=-1,p=!0,_=r&pn?new yr:X;for(i.set(n,t),i.set(t,n);++s<f;){var v=n[s],g=t[s];if(e)var y=o?e(g,v,s,t,n,i):e(v,g,s,n,t,i);if(y!==X){if(y)continue;p=!1;break}if(_){if(!h(t,function(n,t){
|
||||||
return t?k(t,Ke(t)):[]}function Qe(t){return ji(Ze(t).toLowerCase())}function Xe(t){return(t=Ze(t))&&t.replace(jt,B).replace(Et,"")}function tu(t,n,r){return t=Ze(t),n=r?T:n,n===T&&(n=Bt.test(t)?Wt:Rt),t.match(n)||[]}function nu(t){return function(){return t}}function ru(t){return t}function eu(t){return En(typeof t=="function"?t:fn(t,true))}function uu(t,n,r){var e=Ke(n),o=dn(n,e);null!=r||Ie(n)&&(o.length||!e.length)||(r=n,n=t,t=this,o=dn(n,Ke(n)));var i=Ie(r)&&"chain"in r?r.chain:true,f=Oe(t);return u(o,function(r){
|
if(!S(_,t)&&(v===n||u(v,n,r,e,i)))return _.push(t)})){p=!1;break}}else if(v!==g&&!u(v,g,r,e,i)){p=!1;break}}return i.delete(n),i.delete(t),p}function _i(n,t,r,e,u,i,o){switch(r){case ct:if(n.byteLength!=t.byteLength||n.byteOffset!=t.byteOffset)return!1;n=n.buffer,t=t.buffer;case ft:return!(n.byteLength!=t.byteLength||!i(new Rl(n),new Rl(t)));case Nn:case Pn:case Hn:return Gf(+n,+t);case Zn:return n.name==t.name&&n.message==t.message;case nt:case rt:return n==t+"";case Gn:var f=M;case tt:var c=e&hn;
|
||||||
var e=n[r];t[r]=e,f&&(t.prototype[r]=function(){var n=this.__chain__;if(i||n){var r=t(this.__wrapped__);return(r.__actions__=er(this.__actions__)).push({func:e,args:arguments,thisArg:t}),r.__chain__=n,r}return e.apply(t,l([this.value()],arguments))})}),t}function ou(){}function iu(t){return Nr(t)?Mn(t):Ln(t)}S=S?Yt.defaults({},S,Yt.pick(Jt,Ct)):Jt;var fu=S.Date,cu=S.Error,au=S.Math,lu=S.RegExp,su=S.TypeError,hu=S.Array.prototype,pu=S.Object.prototype,_u=S.Function.prototype.toString,vu=pu.hasOwnProperty,gu=0,du=_u.call(Object),yu=pu.toString,bu=Jt._,xu=lu("^"+_u.call(vu).replace(ft,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),ju=Tt?S.Buffer:T,mu=S.Reflect,wu=S.Symbol,Au=S.Uint8Array,Ou=S.clearTimeout,ku=mu?mu.f:T,Eu=Object.getOwnPropertySymbols,Iu=typeof(Iu=wu&&wu.iterator)=="symbol"?Iu:T,Su=Object.create,Ru=pu.propertyIsEnumerable,Wu=S.setTimeout,Bu=hu.splice,Cu=au.ceil,zu=au.floor,Uu=Object.getPrototypeOf,Mu=S.isFinite,Lu=hu.join,$u=Object.keys,Du=au.max,Fu=au.min,Nu=S.parseInt,Pu=au.random,Zu=hu.reverse,qu=Wr(S,"DataView"),Tu=Wr(S,"Map"),Vu=Wr(S,"Promise"),Ku=Wr(S,"Set"),Gu=Wr(S,"WeakMap"),Ju=Wr(Object,"create"),Yu=Gu&&new Gu,Hu=!Ru.call({
|
if(f||(f=P),n.size!=t.size&&!c)return!1;var a=o.get(n);if(a)return a==t;e|=pn,o.set(n,t);var l=pi(f(n),f(t),e,u,i,o);return o.delete(n),l;case et:if(_s)return _s.call(n)==_s.call(t)}return!1}function vi(n,t,r,e,u,i){var o=r&hn,f=yi(n),c=f.length;if(c!=yi(t).length&&!o)return!1;for(var a=c;a--;){var l=f[a];if(!(o?l in t:bl.call(t,l)))return!1}var s=i.get(n),h=i.get(t);if(s&&h)return s==t&&h==n;var p=!0;i.set(n,t),i.set(t,n);for(var _=o;++a<c;){l=f[a];var v=n[l],g=t[l];if(e)var y=o?e(g,v,l,t,n,i):e(v,g,l,n,t,i);
|
||||||
valueOf:1},"valueOf"),Qu={},Xu=Gr(qu),to=Gr(Tu),no=Gr(Vu),ro=Gr(Ku),eo=Gr(Gu),uo=wu?wu.prototype:T,oo=uo?uo.valueOf:T,io=uo?uo.toString:T;xt.templateSettings={escape:nt,evaluate:rt,interpolate:et,variable:"",imports:{_:xt}},xt.prototype=At.prototype,xt.prototype.constructor=xt,Ot.prototype=an(At.prototype),Ot.prototype.constructor=Ot,kt.prototype=an(At.prototype),kt.prototype.constructor=kt,Mt.prototype=Ju?Ju(null):pu,Lt.prototype.clear=function(){this.__data__={hash:new Mt,map:Tu?new Tu:[],string:new Mt
|
if(!(y===X?v===g||u(v,g,r,e,i):y)){p=!1;break}_||(_="constructor"==l)}if(p&&!_){var d=n.constructor,b=t.constructor;d!=b&&"constructor"in n&&"constructor"in t&&!("function"==typeof d&&d instanceof d&&"function"==typeof b&&b instanceof b)&&(p=!1)}return i.delete(n),i.delete(t),p}function gi(n){return Ls(Vi(n,X,_o),n+"")}function yi(n){return de(n,Pc,Is)}function di(n){return de(n,qc,Rs)}function bi(n){for(var t=n.name+"",r=fs[t],e=bl.call(fs,t)?r.length:0;e--;){var u=r[e],i=u.func;if(null==i||i==n)return u.name;
|
||||||
}},Lt.prototype["delete"]=function(t){var n=this.__data__;return Pr(t)?(n=typeof t=="string"?n.string:n.hash,t=(Ju?n[t]!==T:vu.call(n,t))&&delete n[t]):t=Tu?n.map["delete"](t):Zt(n.map,t),t},Lt.prototype.get=function(t){var n=this.__data__;return Pr(t)?(n=typeof t=="string"?n.string:n.hash,Ju?(t=n[t],t="__lodash_hash_undefined__"===t?T:t):t=vu.call(n,t)?n[t]:T):t=Tu?n.map.get(t):qt(n.map,t),t},Lt.prototype.has=function(t){var n=this.__data__;return Pr(t)?(n=typeof t=="string"?n.string:n.hash,t=Ju?n[t]!==T:vu.call(n,t)):t=Tu?n.map.has(t):-1<Vt(n.map,t),
|
}return t}function wi(n){return(bl.call(Z,"placeholder")?Z:n).placeholder}function mi(){var n=Z.iteratee||Ca;return n=n===Ca?De:n,arguments.length?n(arguments[0],arguments[1]):n}function xi(n,t){var r=n.__data__;return Ti(t)?r["string"==typeof t?"string":"hash"]:r.map}function ji(n){for(var t=Pc(n),r=t.length;r--;){var e=t[r],u=n[e];t[r]=[e,u,Fi(u)]}return t}function Ai(n,t){var r=B(n,t);return Ue(r)?r:X}function ki(n){var t=bl.call(n,Bl),r=n[Bl];try{n[Bl]=X;var e=!0}catch(n){}var u=xl.call(n);return e&&(t?n[Bl]=r:delete n[Bl]),
|
||||||
t},Lt.prototype.set=function(t,n){var r=this.__data__;return Pr(t)?(typeof t=="string"?r.string:r.hash)[t]=Ju&&n===T?"__lodash_hash_undefined__":n:Tu?r.map.set(t,n):Kt(r.map,t,n),this},$t.prototype.push=function(t){var n=this.__data__;Pr(t)?(n=n.__data__,(typeof t=="string"?n.string:n.hash)[t]="__lodash_hash_undefined__"):n.set(t,"__lodash_hash_undefined__")},Ft.prototype.clear=function(){this.__data__={array:[],map:null}},Ft.prototype["delete"]=function(t){var n=this.__data__,r=n.array;return r?Zt(r,t):n.map["delete"](t);
|
u}function Oi(n,t,r){for(var e=-1,u=r.length;++e<u;){var i=r[e],o=i.size;switch(i.type){case"drop":n+=o;break;case"dropRight":t-=o;break;case"take":t=Hl(t,n+o);break;case"takeRight":n=Gl(n,t-o)}}return{start:n,end:t}}function Ii(n){var t=n.match(Bt);return t?t[1].split(Tt):[]}function Ri(n,t,r){t=ku(t,n);for(var e=-1,u=t.length,i=!1;++e<u;){var o=no(t[e]);if(!(i=null!=n&&r(n,o)))break;n=n[o]}return i||++e!=u?i:(u=null==n?0:n.length,!!u&&oc(u)&&Ci(o,u)&&(bh(n)||dh(n)))}function zi(n){var t=n.length,r=new n.constructor(t);
|
||||||
},Ft.prototype.get=function(t){var n=this.__data__,r=n.array;return r?qt(r,t):n.map.get(t)},Ft.prototype.has=function(t){var n=this.__data__,r=n.array;return r?-1<Vt(r,t):n.map.has(t)},Ft.prototype.set=function(t,n){var r=this.__data__,e=r.array;return e&&(199>e.length?Kt(e,t,n):(r.array=null,r.map=new Lt(e))),(r=r.map)&&r.set(t,n),this};var fo=ar(vn),co=ar(gn,true),ao=lr(),lo=lr(true);ku&&!Ru.call({valueOf:1},"valueOf")&&(In=function(t){return $(ku(t))});var so=Yu?function(t,n){return Yu.set(t,n),t}:ru,ho=Ku&&2===new Ku([1,2]).size?function(t){
|
return t&&"string"==typeof n[0]&&bl.call(n,"index")&&(r.index=n.index,r.input=n.input),r}function Ei(n){return"function"!=typeof n.constructor||Mi(n)?{}:gs(El(n))}function Si(n,t,r){var e=n.constructor;switch(t){case ft:return Ru(n);case Nn:case Pn:return new e(+n);case ct:return zu(n,r);case at:case lt:case st:case ht:case pt:case _t:case vt:case gt:case yt:return Wu(n,r);case Gn:return new e;case Hn:case rt:return new e(n);case nt:return Eu(n);case tt:return new e;case et:return Su(n)}}function Wi(n,t){
|
||||||
return new Ku(t)}:ou,po=Yu?function(t){return Yu.get(t)}:ou,_o=Mn("length");Eu||(Cr=function(){return[]});var vo=Eu?function(t){for(var n=[];t;)l(n,Cr(t)),t=Uu(Object(t));return n}:Cr;(qu&&"[object DataView]"!=zr(new qu(new ArrayBuffer(1)))||Tu&&"[object Map]"!=zr(new Tu)||Vu&&"[object Promise]"!=zr(Vu.resolve())||Ku&&"[object Set]"!=zr(new Ku)||Gu&&"[object WeakMap]"!=zr(new Gu))&&(zr=function(t){var n=yu.call(t);if(t=Gr("[object Object]"==n?t.constructor:null))switch(t){case Xu:return"[object DataView]";
|
var r=t.length;if(!r)return n;var e=r-1;return t[e]=(r>1?"& ":"")+t[e],t=t.join(r>2?", ":" "),n.replace(Ut,"{\n/* [wrapped with "+t+"] */\n")}function Li(n){return bh(n)||dh(n)||!!(Cl&&n&&n[Cl])}function Ci(n,t){var r=typeof n;return t=null==t?Wn:t,!!t&&("number"==r||"symbol"!=r&&Vt.test(n))&&n>-1&&n%1==0&&n<t}function Ui(n,t,r){if(!fc(r))return!1;var e=typeof t;return!!("number"==e?Hf(r)&&Ci(t,r.length):"string"==e&&t in r)&&Gf(r[t],n)}function Bi(n,t){if(bh(n))return!1;var r=typeof n;return!("number"!=r&&"symbol"!=r&&"boolean"!=r&&null!=n&&!bc(n))||(zt.test(n)||!Rt.test(n)||null!=t&&n in ll(t));
|
||||||
case to:return"[object Map]";case no:return"[object Promise]";case ro:return"[object Set]";case eo:return"[object WeakMap]"}return n});var go=function(){var t=0,n=0;return function(r,e){var u=Zo(),o=16-(u-n);if(n=u,o>0){if(150<=++t)return r}else t=0;return so(r,e)}}(),yo=ge(function(t){var n=[];return Ze(t).replace(it,function(t,r,e,u){n.push(e?u.replace(ht,"$1"):r||t)}),n}),bo=de(function(t,n){return we(t)?sn(t,_n(n,1,true)):[]}),xo=de(function(t,n){var r=Xr(n);return we(r)&&(r=T),we(t)?sn(t,_n(n,1,true),Sr(r)):[];
|
}function Ti(n){var t=typeof n;return"string"==t||"number"==t||"symbol"==t||"boolean"==t?"__proto__"!==n:null===n}function $i(n){var t=bi(n),r=Z[t];if("function"!=typeof r||!(t in Ct.prototype))return!1;if(n===r)return!0;var e=Os(r);return!!e&&n===e[0]}function Di(n){return!!ml&&ml in n}function Mi(n){var t=n&&n.constructor;return n===("function"==typeof t&&t.prototype||gl)}function Fi(n){return n===n&&!fc(n)}function Ni(n,t){return function(r){return null!=r&&(r[n]===t&&(t!==X||n in ll(r)))}}function Pi(n){
|
||||||
}),jo=de(function(t,n){var r=Xr(n);return we(r)&&(r=T),we(t)?sn(t,_n(n,1,true),T,r):[]}),mo=de(function(t){var n=a(t,rn);return n.length&&n[0]===t[0]?mn(n):[]}),wo=de(function(t){var n=Xr(t),r=a(t,rn);return n===Xr(r)?n=T:r.pop(),r.length&&r[0]===t[0]?mn(r,Sr(n)):[]}),Ao=de(function(t){var n=Xr(t),r=a(t,rn);return n===Xr(r)?n=T:r.pop(),r.length&&r[0]===t[0]?mn(r,T,n):[]}),Oo=de(te),ko=de(function(t,n){n=a(_n(n,1),String);var r=nn(t,n);return Dn(t,n.sort(R)),r}),Eo=de(function(t){return Gn(_n(t,1,true));
|
var t=Cf(n,function(n){return r.size===fn&&r.clear(),n}),r=t.cache;return t}function qi(n,t){var r=n[1],e=t[1],u=r|e,i=u<(_n|vn|mn),o=e==mn&&r==yn||e==mn&&r==xn&&n[7].length<=t[8]||e==(mn|xn)&&t[7].length<=t[8]&&r==yn;if(!i&&!o)return n;e&_n&&(n[2]=t[2],u|=r&_n?0:gn);var f=t[3];if(f){var c=n[3];n[3]=c?Uu(c,f,t[4]):f,n[4]=c?N(n[3],cn):t[4]}return f=t[5],f&&(c=n[5],n[5]=c?Bu(c,f,t[6]):f,n[6]=c?N(n[5],cn):t[6]),f=t[7],f&&(n[7]=f),e&mn&&(n[8]=null==n[8]?t[8]:Hl(n[8],t[8])),null==n[9]&&(n[9]=t[9]),n[0]=t[0],
|
||||||
}),Io=de(function(t){var n=Xr(t);return we(n)&&(n=T),Gn(_n(t,1,true),Sr(n))}),So=de(function(t){var n=Xr(t);return we(n)&&(n=T),Gn(_n(t,1,true),T,n)}),Ro=de(function(t,n){return we(t)?sn(t,n):[]}),Wo=de(function(t){return Hn(i(t,we))}),Bo=de(function(t){var n=Xr(t);return we(n)&&(n=T),Hn(i(t,we),Sr(n))}),Co=de(function(t){var n=Xr(t);return we(n)&&(n=T),Hn(i(t,we),T,n)}),zo=de(re),Uo=de(function(t){var n=t.length,n=n>1?t[n-1]:T,n=typeof n=="function"?(t.pop(),n):T;return ee(t,n)}),Mo=de(function(t){function n(n){
|
n[1]=u,n}function Zi(n){var t=[];if(null!=n)for(var r in ll(n))t.push(r);return t}function Ki(n){return xl.call(n)}function Vi(t,r,e){return r=Gl(r===X?t.length-1:r,0),function(){for(var u=arguments,i=-1,o=Gl(u.length-r,0),f=il(o);++i<o;)f[i]=u[r+i];i=-1;for(var c=il(r+1);++i<r;)c[i]=u[i];return c[r]=e(f),n(t,this,c)}}function Gi(n,t){return t.length<2?n:_e(n,au(t,0,-1))}function Hi(n,t){for(var r=n.length,e=Hl(t.length,r),u=Tu(n);e--;){var i=t[e];n[e]=Ci(i,r)?u[i]:X}return n}function Ji(n,t){if(("constructor"!==t||"function"!=typeof n[t])&&"__proto__"!=t)return n[t];
|
||||||
return nn(n,t)}t=_n(t,1);var r=t.length,e=r?t[0]:0,u=this.__wrapped__;return 1>=r&&!this.__actions__.length&&u instanceof kt&&L(e)?(u=u.slice(e,+e+(r?1:0)),u.__actions__.push({func:oe,args:[n],thisArg:T}),new Ot(u,this.__chain__).thru(function(t){return r&&!t.length&&t.push(T),t})):this.thru(n)}),Lo=fr(function(t,n,r){vu.call(t,r)?++t[r]:t[r]=1}),$o=fr(function(t,n,r){vu.call(t,r)?t[r].push(n):t[r]=[n]}),Do=de(function(t,n,e){var u=-1,o=typeof n=="function",i=Nr(n),f=me(t)?Array(t.length):[];return fo(t,function(t){
|
}function Yi(n,t,r){var e=t+"";return Ls(n,Wi(e,ro(Ii(e),r)))}function Qi(n){var t=0,r=0;return function(){var e=Jl(),u=In-(e-r);if(r=e,u>0){if(++t>=On)return arguments[0]}else t=0;return n.apply(X,arguments)}}function Xi(n,t){var r=-1,e=n.length,u=e-1;for(t=t===X?e:t;++r<t;){var i=tu(r,u),o=n[i];n[i]=n[r],n[r]=o}return n.length=t,n}function no(n){if("string"==typeof n||bc(n))return n;var t=n+"";return"0"==t&&1/n==-Sn?"-0":t}function to(n){if(null!=n){try{return dl.call(n)}catch(n){}try{return n+"";
|
||||||
var c=o?n:i&&null!=t?t[n]:T;f[++u]=c?r(c,t,e):An(t,n,e)}),f}),Fo=fr(function(t,n,r){t[r]=n}),No=fr(function(t,n,r){t[r?0:1].push(n)},function(){return[[],[]]}),Po=de(function(t,n){if(null==t)return[];var r=n.length;return r>1&&Fr(t,n[0],n[1])?n=[]:r>2&&Fr(n[0],n[1],n[2])&&(n.length=1),Cn(t,_n(n,1),[])}),Zo=fu.now,qo=de(function(t,n,r){var e=1;if(r.length)var u=F(r,Br(qo)),e=32|e;return Or(t,e,n,r,u)}),To=de(function(t,n,r){var e=3;if(r.length)var u=F(r,Br(To)),e=32|e;return Or(n,e,t,r,u)}),Vo=de(function(t,n){
|
}catch(n){}}return""}function ro(n,t){return r($n,function(r){var e="_."+r[0];t&r[1]&&!o(n,e)&&n.push(e)}),n.sort()}function eo(n){if(n instanceof Ct)return n.clone();var t=new Y(n.__wrapped__,n.__chain__);return t.__actions__=Tu(n.__actions__),t.__index__=n.__index__,t.__values__=n.__values__,t}function uo(n,t,r){t=(r?Ui(n,t,r):t===X)?1:Gl(kc(t),0);var e=null==n?0:n.length;if(!e||t<1)return[];for(var u=0,i=0,o=il(Fl(e/t));u<e;)o[i++]=au(n,u,u+=t);return o}function io(n){for(var t=-1,r=null==n?0:n.length,e=0,u=[];++t<r;){
|
||||||
return ln(t,1,n)}),Ko=de(function(t,n,r){return ln(t,Ne(n)||0,r)});ge.Cache=Lt;var Go=de(function(t,n){n=a(n,Sr());var e=n.length;return de(function(u){for(var o=-1,i=Fu(u.length,e);++o<i;)u[o]=n[o].call(this,u[o]);return r(t,this,u)})}),Jo=de(function(t,n){var r=F(n,Br(Jo));return Or(t,32,T,n,r)}),Yo=de(function(t,n){var r=F(n,Br(Yo));return Or(t,64,T,n,r)}),Ho=de(function(t,n){return Or(t,256,T,T,T,_n(n,1))}),Qo=Array.isArray,Xo=ju?function(t){return t instanceof ju}:nu(false),ti=cr(function(t,n){
|
var i=n[t];i&&(u[e++]=i)}return u}function oo(){var n=arguments.length;if(!n)return[];for(var t=il(n-1),r=arguments[0],e=n;e--;)t[e-1]=arguments[e];return a(bh(r)?Tu(r):[r],ee(t,1))}function fo(n,t,r){var e=null==n?0:n.length;return e?(t=r||t===X?1:kc(t),au(n,t<0?0:t,e)):[]}function co(n,t,r){var e=null==n?0:n.length;return e?(t=r||t===X?1:kc(t),t=e-t,au(n,0,t<0?0:t)):[]}function ao(n,t){return n&&n.length?bu(n,mi(t,3),!0,!0):[]}function lo(n,t){return n&&n.length?bu(n,mi(t,3),!0):[]}function so(n,t,r,e){
|
||||||
if(Hu||qr(n)||me(n))ur(n,Ke(n),t);else for(var r in n)vu.call(n,r)&&Qt(t,r,n[r])}),ni=cr(function(t,n){if(Hu||qr(n)||me(n))ur(n,Ge(n),t);else for(var r in n)Qt(t,r,n[r])}),ri=cr(function(t,n,r,e){or(n,Ge(n),t,e)}),ei=cr(function(t,n,r,e){or(n,Ke(n),t,e)}),ui=de(function(t,n){return nn(t,_n(n,1))}),oi=de(function(t){return t.push(T,Gt),r(ri,T,t)}),ii=de(function(t){return t.push(T,Vr),r(si,T,t)}),fi=yr(function(t,n,r){t[n]=r},nu(ru)),ci=yr(function(t,n,r){vu.call(t,n)?t[n].push(r):t[n]=[r]},Sr),ai=de(An),li=cr(function(t,n,r){
|
var u=null==n?0:n.length;return u?(r&&"number"!=typeof r&&Ui(n,t,r)&&(r=0,e=u),ne(n,t,r,e)):[]}function ho(n,t,r){var e=null==n?0:n.length;if(!e)return-1;var u=null==r?0:kc(r);return u<0&&(u=Gl(e+u,0)),g(n,mi(t,3),u)}function po(n,t,r){var e=null==n?0:n.length;if(!e)return-1;var u=e-1;return r!==X&&(u=kc(r),u=r<0?Gl(e+u,0):Hl(u,e-1)),g(n,mi(t,3),u,!0)}function _o(n){return(null==n?0:n.length)?ee(n,1):[]}function vo(n){return(null==n?0:n.length)?ee(n,Sn):[]}function go(n,t){return(null==n?0:n.length)?(t=t===X?1:kc(t),
|
||||||
Bn(t,n,r)}),si=cr(function(t,n,r,e){Bn(t,n,r,e)}),hi=de(function(t,n){return null==t?{}:(n=a(_n(n,1),en),zn(t,sn(bn(t,Ge,vo),n)))}),pi=de(function(t,n){return null==t?{}:zn(t,_n(n,1))}),_i=pr(function(t,n,r){return n=n.toLowerCase(),t+(r?Qe(n):n)}),vi=pr(function(t,n,r){return t+(r?"-":"")+n.toLowerCase()}),gi=pr(function(t,n,r){return t+(r?" ":"")+n.toLowerCase()}),di=hr("toLowerCase"),yi=pr(function(t,n,r){return t+(r?"_":"")+n.toLowerCase()}),bi=pr(function(t,n,r){return t+(r?" ":"")+ji(n)}),xi=pr(function(t,n,r){
|
ee(n,t)):[]}function yo(n){for(var t=-1,r=null==n?0:n.length,e={};++t<r;){var u=n[t];e[u[0]]=u[1]}return e}function bo(n){return n&&n.length?n[0]:X}function wo(n,t,r){var e=null==n?0:n.length;if(!e)return-1;var u=null==r?0:kc(r);return u<0&&(u=Gl(e+u,0)),y(n,t,u)}function mo(n){return(null==n?0:n.length)?au(n,0,-1):[]}function xo(n,t){return null==n?"":Kl.call(n,t)}function jo(n){var t=null==n?0:n.length;return t?n[t-1]:X}function Ao(n,t,r){var e=null==n?0:n.length;if(!e)return-1;var u=e;return r!==X&&(u=kc(r),
|
||||||
return t+(r?" ":"")+n.toUpperCase()}),ji=hr("toUpperCase"),mi=de(function(t,n){try{return r(t,T,n)}catch(e){return Ae(e)?e:new cu(e)}}),wi=de(function(t,n){return u(_n(n,1),function(n){t[n]=qo(t[n],t)}),t}),Ai=gr(),Oi=gr(true),ki=de(function(t,n){return function(r){return An(r,t,n)}}),Ei=de(function(t,n){return function(r){return An(t,r,n)}}),Ii=br(a),Si=br(o),Ri=br(p),Wi=mr(),Bi=mr(true),Ci=W(function(t,n){return t+n}),zi=Ar("ceil"),Ui=W(function(t,n){return t/n}),Mi=Ar("floor"),Li=W(function(t,n){return t*n;
|
u=u<0?Gl(e+u,0):Hl(u,e-1)),t===t?K(n,t,u):g(n,b,u,!0)}function ko(n,t){return n&&n.length?Ge(n,kc(t)):X}function Oo(n,t){return n&&n.length&&t&&t.length?Xe(n,t):n}function Io(n,t,r){return n&&n.length&&t&&t.length?Xe(n,t,mi(r,2)):n}function Ro(n,t,r){return n&&n.length&&t&&t.length?Xe(n,t,X,r):n}function zo(n,t){var r=[];if(!n||!n.length)return r;var e=-1,u=[],i=n.length;for(t=mi(t,3);++e<i;){var o=n[e];t(o,e,n)&&(r.push(o),u.push(e))}return nu(n,u),r}function Eo(n){return null==n?n:Xl.call(n)}function So(n,t,r){
|
||||||
}),$i=Ar("round"),Di=W(function(t,n){return t-n});return xt.after=function(t,n){if(typeof n!="function")throw new su("Expected a function");return t=De(t),function(){return 1>--t?n.apply(this,arguments):void 0}},xt.ary=se,xt.assign=ti,xt.assignIn=ni,xt.assignInWith=ri,xt.assignWith=ei,xt.at=ui,xt.before=he,xt.bind=qo,xt.bindAll=wi,xt.bindKey=To,xt.castArray=ye,xt.chain=ue,xt.chunk=function(t,n,r){if(n=(r?Fr(t,n,r):n===T)?1:Du(De(n),0),r=t?t.length:0,!r||1>n)return[];for(var e=0,u=0,o=Array(Cu(r/n));r>e;)o[u++]=Zn(t,e,e+=n);
|
var e=null==n?0:n.length;return e?(r&&"number"!=typeof r&&Ui(n,t,r)?(t=0,r=e):(t=null==t?0:kc(t),r=r===X?e:kc(r)),au(n,t,r)):[]}function Wo(n,t){return su(n,t)}function Lo(n,t,r){return hu(n,t,mi(r,2))}function Co(n,t){var r=null==n?0:n.length;if(r){var e=su(n,t);if(e<r&&Gf(n[e],t))return e}return-1}function Uo(n,t){return su(n,t,!0)}function Bo(n,t,r){return hu(n,t,mi(r,2),!0)}function To(n,t){if(null==n?0:n.length){var r=su(n,t,!0)-1;if(Gf(n[r],t))return r}return-1}function $o(n){return n&&n.length?pu(n):[];
|
||||||
return o},xt.compact=function(t){for(var n=-1,r=t?t.length:0,e=0,u=[];++n<r;){var o=t[n];o&&(u[e++]=o)}return u},xt.concat=function(){var t=arguments.length,n=ye(arguments[0]);if(2>t)return t?er(n):[];for(var r=Array(t-1);t--;)r[t-1]=arguments[t];for(var t=_n(r,1),r=-1,e=n.length,u=-1,o=t.length,i=Array(e+o);++r<e;)i[r]=n[r];for(;++u<o;)i[r++]=t[u];return i},xt.cond=function(t){var n=t?t.length:0,e=Sr();return t=n?a(t,function(t){if("function"!=typeof t[1])throw new su("Expected a function");return[e(t[0]),t[1]];
|
}function Do(n,t){return n&&n.length?pu(n,mi(t,2)):[]}function Mo(n){var t=null==n?0:n.length;return t?au(n,1,t):[]}function Fo(n,t,r){return n&&n.length?(t=r||t===X?1:kc(t),au(n,0,t<0?0:t)):[]}function No(n,t,r){var e=null==n?0:n.length;return e?(t=r||t===X?1:kc(t),t=e-t,au(n,t<0?0:t,e)):[]}function Po(n,t){return n&&n.length?bu(n,mi(t,3),!1,!0):[]}function qo(n,t){return n&&n.length?bu(n,mi(t,3)):[]}function Zo(n){return n&&n.length?gu(n):[]}function Ko(n,t){return n&&n.length?gu(n,mi(t,2)):[]}
|
||||||
}):[],de(function(e){for(var u=-1;++u<n;){var o=t[u];if(r(o[0],this,e))return r(o[1],this,e)}})},xt.conforms=function(t){return cn(fn(t,true))},xt.constant=nu,xt.countBy=Lo,xt.create=function(t,n){var r=an(t);return n?tn(r,n):r},xt.curry=pe,xt.curryRight=_e,xt.debounce=ve,xt.defaults=oi,xt.defaultsDeep=ii,xt.defer=Vo,xt.delay=Ko,xt.difference=bo,xt.differenceBy=xo,xt.differenceWith=jo,xt.drop=Yr,xt.dropRight=Hr,xt.dropRightWhile=function(t,n){return t&&t.length?Jn(t,Sr(n,3),true,true):[]},xt.dropWhile=function(t,n){
|
function Vo(n,t){return t="function"==typeof t?t:X,n&&n.length?gu(n,X,t):[]}function Go(n){if(!n||!n.length)return[];var t=0;return n=i(n,function(n){if(Jf(n))return t=Gl(n.length,t),!0}),O(t,function(t){return c(n,m(t))})}function Ho(t,r){if(!t||!t.length)return[];var e=Go(t);return null==r?e:c(e,function(t){return n(r,X,t)})}function Jo(n,t){return xu(n||[],t||[],Sr)}function Yo(n,t){return xu(n||[],t||[],fu)}function Qo(n){var t=Z(n);return t.__chain__=!0,t}function Xo(n,t){return t(n),n}function nf(n,t){
|
||||||
return t&&t.length?Jn(t,Sr(n,3),true):[]},xt.fill=function(t,n,r,e){var u=t?t.length:0;if(!u)return[];for(r&&typeof r!="number"&&Fr(t,n,r)&&(r=0,e=u),u=t.length,r=De(r),0>r&&(r=-r>u?0:u+r),e=e===T||e>u?u:De(e),0>e&&(e+=u),e=r>e?0:Fe(e);e>r;)t[r++]=n;return t},xt.filter=function(t,n){return(Qo(t)?i:pn)(t,Sr(n,3))},xt.flatMap=function(t,n){return _n(ae(t,n),1)},xt.flatMapDeep=function(t,n){return _n(ae(t,n),V)},xt.flatMapDepth=function(t,n,r){return r=r===T?1:De(r),_n(ae(t,n),r)},xt.flatten=function(t){
|
return t(n)}function tf(){return Qo(this)}function rf(){return new Y(this.value(),this.__chain__)}function ef(){this.__values__===X&&(this.__values__=jc(this.value()));var n=this.__index__>=this.__values__.length;return{done:n,value:n?X:this.__values__[this.__index__++]}}function uf(){return this}function of(n){for(var t,r=this;r instanceof J;){var e=eo(r);e.__index__=0,e.__values__=X,t?u.__wrapped__=e:t=e;var u=e;r=r.__wrapped__}return u.__wrapped__=n,t}function ff(){var n=this.__wrapped__;if(n instanceof Ct){
|
||||||
return t&&t.length?_n(t,1):[]},xt.flattenDeep=function(t){return t&&t.length?_n(t,V):[]},xt.flattenDepth=function(t,n){return t&&t.length?(n=n===T?1:De(n),_n(t,n)):[]},xt.flip=function(t){return Or(t,512)},xt.flow=Ai,xt.flowRight=Oi,xt.fromPairs=function(t){for(var n=-1,r=t?t.length:0,e={};++n<r;){var u=t[n];e[u[0]]=u[1]}return e},xt.functions=function(t){return null==t?[]:dn(t,Ke(t))},xt.functionsIn=function(t){return null==t?[]:dn(t,Ge(t))},xt.groupBy=$o,xt.initial=function(t){return Hr(t,1)},xt.intersection=mo,
|
var t=n;return this.__actions__.length&&(t=new Ct(this)),t=t.reverse(),t.__actions__.push({func:nf,args:[Eo],thisArg:X}),new Y(t,this.__chain__)}return this.thru(Eo)}function cf(){return wu(this.__wrapped__,this.__actions__)}function af(n,t,r){var e=bh(n)?u:Jr;return r&&Ui(n,t,r)&&(t=X),e(n,mi(t,3))}function lf(n,t){return(bh(n)?i:te)(n,mi(t,3))}function sf(n,t){return ee(yf(n,t),1)}function hf(n,t){return ee(yf(n,t),Sn)}function pf(n,t,r){return r=r===X?1:kc(r),ee(yf(n,t),r)}function _f(n,t){return(bh(n)?r:ys)(n,mi(t,3));
|
||||||
xt.intersectionBy=wo,xt.intersectionWith=Ao,xt.invert=fi,xt.invertBy=ci,xt.invokeMap=Do,xt.iteratee=eu,xt.keyBy=Fo,xt.keys=Ke,xt.keysIn=Ge,xt.map=ae,xt.mapKeys=function(t,n){var r={};return n=Sr(n,3),vn(t,function(t,e,u){r[n(t,e,u)]=t}),r},xt.mapValues=function(t,n){var r={};return n=Sr(n,3),vn(t,function(t,e,u){r[e]=n(t,e,u)}),r},xt.matches=function(t){return Rn(fn(t,true))},xt.matchesProperty=function(t,n){return Wn(t,fn(n,true))},xt.memoize=ge,xt.merge=li,xt.mergeWith=si,xt.method=ki,xt.methodOf=Ei,
|
}function vf(n,t){return(bh(n)?e:ds)(n,mi(t,3))}function gf(n,t,r,e){n=Hf(n)?n:ra(n),r=r&&!e?kc(r):0;var u=n.length;return r<0&&(r=Gl(u+r,0)),dc(n)?r<=u&&n.indexOf(t,r)>-1:!!u&&y(n,t,r)>-1}function yf(n,t){return(bh(n)?c:Pe)(n,mi(t,3))}function df(n,t,r,e){return null==n?[]:(bh(t)||(t=null==t?[]:[t]),r=e?X:r,bh(r)||(r=null==r?[]:[r]),He(n,t,r))}function bf(n,t,r){var e=bh(n)?l:j,u=arguments.length<3;return e(n,mi(t,4),r,u,ys)}function wf(n,t,r){var e=bh(n)?s:j,u=arguments.length<3;return e(n,mi(t,4),r,u,ds);
|
||||||
xt.mixin=uu,xt.negate=function(t){if(typeof t!="function")throw new su("Expected a function");return function(){return!t.apply(this,arguments)}},xt.nthArg=function(t){return t=De(t),function(){return arguments[t]}},xt.omit=hi,xt.omitBy=function(t,n){return n=Sr(n),Un(t,function(t,r){return!n(t,r)})},xt.once=function(t){return he(2,t)},xt.orderBy=function(t,n,r,e){return null==t?[]:(Qo(n)||(n=null==n?[]:[n]),r=e?T:r,Qo(r)||(r=null==r?[]:[r]),Cn(t,n,r))},xt.over=Ii,xt.overArgs=Go,xt.overEvery=Si,xt.overSome=Ri,
|
}function mf(n,t){return(bh(n)?i:te)(n,Uf(mi(t,3)))}function xf(n){return(bh(n)?Ir:iu)(n)}function jf(n,t,r){return t=(r?Ui(n,t,r):t===X)?1:kc(t),(bh(n)?Rr:ou)(n,t)}function Af(n){return(bh(n)?zr:cu)(n)}function kf(n){if(null==n)return 0;if(Hf(n))return dc(n)?V(n):n.length;var t=zs(n);return t==Gn||t==tt?n.size:Me(n).length}function Of(n,t,r){var e=bh(n)?h:lu;return r&&Ui(n,t,r)&&(t=X),e(n,mi(t,3))}function If(n,t){if("function"!=typeof t)throw new pl(en);return n=kc(n),function(){if(--n<1)return t.apply(this,arguments);
|
||||||
xt.partial=Jo,xt.partialRight=Yo,xt.partition=No,xt.pick=pi,xt.pickBy=function(t,n){return null==t?{}:Un(t,Sr(n))},xt.property=iu,xt.propertyOf=function(t){return function(n){return null==t?T:yn(t,n)}},xt.pull=Oo,xt.pullAll=te,xt.pullAllBy=function(t,n,r){return t&&t.length&&n&&n.length?$n(t,n,Sr(r)):t},xt.pullAllWith=function(t,n,r){return t&&t.length&&n&&n.length?$n(t,n,T,r):t},xt.pullAt=ko,xt.range=Wi,xt.rangeRight=Bi,xt.rearg=Ho,xt.reject=function(t,n){var r=Qo(t)?i:pn;return n=Sr(n,3),r(t,function(t,r,e){
|
}}function Rf(n,t,r){return t=r?X:t,t=n&&null==t?n.length:t,ai(n,mn,X,X,X,X,t)}function zf(n,t){var r;if("function"!=typeof t)throw new pl(en);return n=kc(n),function(){return--n>0&&(r=t.apply(this,arguments)),n<=1&&(t=X),r}}function Ef(n,t,r){t=r?X:t;var e=ai(n,yn,X,X,X,X,X,t);return e.placeholder=Ef.placeholder,e}function Sf(n,t,r){t=r?X:t;var e=ai(n,dn,X,X,X,X,X,t);return e.placeholder=Sf.placeholder,e}function Wf(n,t,r){function e(t){var r=h,e=p;return h=p=X,d=t,v=n.apply(e,r)}function u(n){return d=n,
|
||||||
return!n(t,r,e)})},xt.remove=function(t,n){var r=[];if(!t||!t.length)return r;var e=-1,u=[],o=t.length;for(n=Sr(n,3);++e<o;){var i=t[e];n(i,e,t)&&(r.push(i),u.push(e))}return Dn(t,u),r},xt.rest=de,xt.reverse=ne,xt.sampleSize=le,xt.set=function(t,n,r){return null==t?t:Pn(t,n,r)},xt.setWith=function(t,n,r,e){return e=typeof e=="function"?e:T,null==t?t:Pn(t,n,r,e)},xt.shuffle=function(t){return le(t,4294967295)},xt.slice=function(t,n,r){var e=t?t.length:0;return e?(r&&typeof r!="number"&&Fr(t,n,r)?(n=0,
|
g=Ws(f,t),b?e(n):v}function i(n){var r=n-y,e=n-d,u=t-r;return w?Hl(u,_-e):u}function o(n){var r=n-y,e=n-d;return y===X||r>=t||r<0||w&&e>=_}function f(){var n=fh();return o(n)?c(n):(g=Ws(f,i(n)),X)}function c(n){return g=X,m&&h?e(n):(h=p=X,v)}function a(){g!==X&&As(g),d=0,h=y=p=g=X}function l(){return g===X?v:c(fh())}function s(){var n=fh(),r=o(n);if(h=arguments,p=this,y=n,r){if(g===X)return u(y);if(w)return As(g),g=Ws(f,t),e(y)}return g===X&&(g=Ws(f,t)),v}var h,p,_,v,g,y,d=0,b=!1,w=!1,m=!0;if("function"!=typeof n)throw new pl(en);
|
||||||
r=e):(n=null==n?0:De(n),r=r===T?e:De(r)),Zn(t,n,r)):[]},xt.sortBy=Po,xt.sortedUniq=function(t){return t&&t.length?Kn(t):[]},xt.sortedUniqBy=function(t,n){return t&&t.length?Kn(t,Sr(n)):[]},xt.split=function(t,n,r){return Ze(t).split(n,r)},xt.spread=function(t,n){if(typeof t!="function")throw new su("Expected a function");return n=n===T?0:Du(De(n),0),de(function(e){var u=e[n];return e=e.slice(0,n),u&&l(e,u),r(t,this,e)})},xt.tail=function(t){return Yr(t,1)},xt.take=function(t,n,r){return t&&t.length?(n=r||n===T?1:De(n),
|
return t=Ic(t)||0,fc(r)&&(b=!!r.leading,w="maxWait"in r,_=w?Gl(Ic(r.maxWait)||0,t):_,m="trailing"in r?!!r.trailing:m),s.cancel=a,s.flush=l,s}function Lf(n){return ai(n,jn)}function Cf(n,t){if("function"!=typeof n||null!=t&&"function"!=typeof t)throw new pl(en);var r=function(){var e=arguments,u=t?t.apply(this,e):e[0],i=r.cache;if(i.has(u))return i.get(u);var o=n.apply(this,e);return r.cache=i.set(u,o)||i,o};return r.cache=new(Cf.Cache||sr),r}function Uf(n){if("function"!=typeof n)throw new pl(en);
|
||||||
Zn(t,0,0>n?0:n)):[]},xt.takeRight=function(t,n,r){var e=t?t.length:0;return e?(n=r||n===T?1:De(n),n=e-n,Zn(t,0>n?0:n,e)):[]},xt.takeRightWhile=function(t,n){return t&&t.length?Jn(t,Sr(n,3),false,true):[]},xt.takeWhile=function(t,n){return t&&t.length?Jn(t,Sr(n,3)):[]},xt.tap=function(t,n){return n(t),t},xt.throttle=function(t,n,r){var e=true,u=true;if(typeof t!="function")throw new su("Expected a function");return Ie(r)&&(e="leading"in r?!!r.leading:e,u="trailing"in r?!!r.trailing:u),ve(t,n,{leading:e,maxWait:n,
|
return function(){var t=arguments;switch(t.length){case 0:return!n.call(this);case 1:return!n.call(this,t[0]);case 2:return!n.call(this,t[0],t[1]);case 3:return!n.call(this,t[0],t[1],t[2])}return!n.apply(this,t)}}function Bf(n){return zf(2,n)}function Tf(n,t){if("function"!=typeof n)throw new pl(en);return t=t===X?t:kc(t),uu(n,t)}function $f(t,r){if("function"!=typeof t)throw new pl(en);return r=null==r?0:Gl(kc(r),0),uu(function(e){var u=e[r],i=Ou(e,0,r);return u&&a(i,u),n(t,this,i)})}function Df(n,t,r){
|
||||||
trailing:u})},xt.thru=oe,xt.toArray=$e,xt.toPairs=Je,xt.toPairsIn=Ye,xt.toPath=function(t){return Qo(t)?a(t,en):Ue(t)?[t]:er(yo(t))},xt.toPlainObject=Pe,xt.transform=function(t,n,r){var e=Qo(t)||Me(t);if(n=Sr(n,4),null==r)if(e||Ie(t)){var o=t.constructor;r=e?Qo(t)?new o:[]:Oe(o)?an(Uu(Object(t))):{}}else r={};return(e?u:vn)(t,function(t,e,u){return n(r,t,e,u)}),r},xt.unary=function(t){return se(t,1)},xt.union=Eo,xt.unionBy=Io,xt.unionWith=So,xt.uniq=function(t){return t&&t.length?Gn(t):[]},xt.uniqBy=function(t,n){
|
var e=!0,u=!0;if("function"!=typeof n)throw new pl(en);return fc(r)&&(e="leading"in r?!!r.leading:e,u="trailing"in r?!!r.trailing:u),Wf(n,t,{leading:e,maxWait:t,trailing:u})}function Mf(n){return Rf(n,1)}function Ff(n,t){return ph(Au(t),n)}function Nf(){if(!arguments.length)return[];var n=arguments[0];return bh(n)?n:[n]}function Pf(n){return Fr(n,sn)}function qf(n,t){return t="function"==typeof t?t:X,Fr(n,sn,t)}function Zf(n){return Fr(n,an|sn)}function Kf(n,t){return t="function"==typeof t?t:X,Fr(n,an|sn,t);
|
||||||
return t&&t.length?Gn(t,Sr(n)):[]},xt.uniqWith=function(t,n){return t&&t.length?Gn(t,T,n):[]},xt.unset=function(t,n){var r;if(null==t)r=true;else{r=t;var e=n,e=Nr(e,r)?[e]:un(e);r=Kr(r,e),e=Xr(e),r=null!=r&&Te(r,e)?delete r[e]:true}return r},xt.unzip=re,xt.unzipWith=ee,xt.update=function(t,n,r){return null==t?t:Pn(t,n,(typeof r=="function"?r:ru)(yn(t,n)),void 0)},xt.updateWith=function(t,n,r,e){return e=typeof e=="function"?e:T,null!=t&&(t=Pn(t,n,(typeof r=="function"?r:ru)(yn(t,n)),e)),t},xt.values=He,
|
}function Vf(n,t){return null==t||Pr(n,t,Pc(t))}function Gf(n,t){return n===t||n!==n&&t!==t}function Hf(n){return null!=n&&oc(n.length)&&!uc(n)}function Jf(n){return cc(n)&&Hf(n)}function Yf(n){return n===!0||n===!1||cc(n)&&we(n)==Nn}function Qf(n){return cc(n)&&1===n.nodeType&&!gc(n)}function Xf(n){if(null==n)return!0;if(Hf(n)&&(bh(n)||"string"==typeof n||"function"==typeof n.splice||mh(n)||Oh(n)||dh(n)))return!n.length;var t=zs(n);if(t==Gn||t==tt)return!n.size;if(Mi(n))return!Me(n).length;for(var r in n)if(bl.call(n,r))return!1;
|
||||||
xt.valuesIn=function(t){return null==t?[]:k(t,Ge(t))},xt.without=Ro,xt.words=tu,xt.wrap=function(t,n){return n=null==n?ru:n,Jo(n,t)},xt.xor=Wo,xt.xorBy=Bo,xt.xorWith=Co,xt.zip=zo,xt.zipObject=function(t,n){return Qn(t||[],n||[],Qt)},xt.zipObjectDeep=function(t,n){return Qn(t||[],n||[],Pn)},xt.zipWith=Uo,xt.entries=Je,xt.entriesIn=Ye,xt.extend=ni,xt.extendWith=ri,uu(xt,xt),xt.add=Ci,xt.attempt=mi,xt.camelCase=_i,xt.capitalize=Qe,xt.ceil=zi,xt.clamp=function(t,n,r){return r===T&&(r=n,n=T),r!==T&&(r=Ne(r),
|
return!0}function nc(n,t){return Se(n,t)}function tc(n,t,r){r="function"==typeof r?r:X;var e=r?r(n,t):X;return e===X?Se(n,t,X,r):!!e}function rc(n){if(!cc(n))return!1;var t=we(n);return t==Zn||t==qn||"string"==typeof n.message&&"string"==typeof n.name&&!gc(n)}function ec(n){return"number"==typeof n&&Zl(n)}function uc(n){if(!fc(n))return!1;var t=we(n);return t==Kn||t==Vn||t==Fn||t==Xn}function ic(n){return"number"==typeof n&&n==kc(n)}function oc(n){return"number"==typeof n&&n>-1&&n%1==0&&n<=Wn}function fc(n){
|
||||||
r=r===r?r:0),n!==T&&(n=Ne(n),n=n===n?n:0),on(Ne(t),n,r)},xt.clone=function(t){return fn(t,false,true)},xt.cloneDeep=function(t){return fn(t,true,true)},xt.cloneDeepWith=function(t,n){return fn(t,true,true,n)},xt.cloneWith=function(t,n){return fn(t,false,true,n)},xt.deburr=Xe,xt.divide=Ui,xt.endsWith=function(t,n,r){t=Ze(t),n=typeof n=="string"?n:n+"";var e=t.length;return r=r===T?e:on(De(r),0,e),r-=n.length,r>=0&&t.indexOf(n,r)==r},xt.eq=be,xt.escape=function(t){return(t=Ze(t))&&tt.test(t)?t.replace(Q,C):t},xt.escapeRegExp=function(t){
|
var t=typeof n;return null!=n&&("object"==t||"function"==t)}function cc(n){return null!=n&&"object"==typeof n}function ac(n,t){return n===t||Ce(n,t,ji(t))}function lc(n,t,r){return r="function"==typeof r?r:X,Ce(n,t,ji(t),r)}function sc(n){return vc(n)&&n!=+n}function hc(n){if(Es(n))throw new fl(rn);return Ue(n)}function pc(n){return null===n}function _c(n){return null==n}function vc(n){return"number"==typeof n||cc(n)&&we(n)==Hn}function gc(n){if(!cc(n)||we(n)!=Yn)return!1;var t=El(n);if(null===t)return!0;
|
||||||
return(t=Ze(t))&&ct.test(t)?t.replace(ft,"\\$&"):t},xt.every=function(t,n,r){var e=Qo(t)?o:hn;return r&&Fr(t,n,r)&&(n=T),e(t,Sr(n,3))},xt.find=function(t,n){if(n=Sr(n,3),Qo(t)){var r=g(t,n);return r>-1?t[r]:T}return v(t,n,fo)},xt.findIndex=function(t,n){return t&&t.length?g(t,Sr(n,3)):-1},xt.findKey=function(t,n){return v(t,Sr(n,3),vn,true)},xt.findLast=function(t,n){if(n=Sr(n,3),Qo(t)){var r=g(t,n,true);return r>-1?t[r]:T}return v(t,n,co)},xt.findLastIndex=function(t,n){return t&&t.length?g(t,Sr(n,3),true):-1;
|
var r=bl.call(t,"constructor")&&t.constructor;return"function"==typeof r&&r instanceof r&&dl.call(r)==jl}function yc(n){return ic(n)&&n>=-Wn&&n<=Wn}function dc(n){return"string"==typeof n||!bh(n)&&cc(n)&&we(n)==rt}function bc(n){return"symbol"==typeof n||cc(n)&&we(n)==et}function wc(n){return n===X}function mc(n){return cc(n)&&zs(n)==it}function xc(n){return cc(n)&&we(n)==ot}function jc(n){if(!n)return[];if(Hf(n))return dc(n)?G(n):Tu(n);if(Ul&&n[Ul])return D(n[Ul]());var t=zs(n);return(t==Gn?M:t==tt?P:ra)(n);
|
||||||
},xt.findLastKey=function(t,n){return v(t,Sr(n,3),gn,true)},xt.floor=Mi,xt.forEach=fe,xt.forEachRight=ce,xt.forIn=function(t,n){return null==t?t:ao(t,Sr(n),Ge)},xt.forInRight=function(t,n){return null==t?t:lo(t,Sr(n),Ge)},xt.forOwn=function(t,n){return t&&vn(t,Sr(n))},xt.forOwnRight=function(t,n){return t&&gn(t,Sr(n))},xt.get=qe,xt.gt=xe,xt.gte=function(t,n){return t>=n},xt.has=Te,xt.hasIn=Ve,xt.head=Qr,xt.identity=ru,xt.includes=function(t,n,r,e){return t=me(t)?t:He(t),r=r&&!e?De(r):0,e=t.length,0>r&&(r=Du(e+r,0)),
|
}function Ac(n){if(!n)return 0===n?n:0;if(n=Ic(n),n===Sn||n===-Sn){return(n<0?-1:1)*Ln}return n===n?n:0}function kc(n){var t=Ac(n),r=t%1;return t===t?r?t-r:t:0}function Oc(n){return n?Mr(kc(n),0,Un):0}function Ic(n){if("number"==typeof n)return n;if(bc(n))return Cn;if(fc(n)){var t="function"==typeof n.valueOf?n.valueOf():n;n=fc(t)?t+"":t}if("string"!=typeof n)return 0===n?n:+n;n=R(n);var r=qt.test(n);return r||Kt.test(n)?Xr(n.slice(2),r?2:8):Pt.test(n)?Cn:+n}function Rc(n){return $u(n,qc(n))}function zc(n){
|
||||||
ze(t)?e>=r&&-1<t.indexOf(n,r):!!e&&-1<d(t,n,r)},xt.indexOf=function(t,n,r){var e=t?t.length:0;return e?(r=De(r),0>r&&(r=Du(e+r,0)),d(t,n,r)):-1},xt.inRange=function(t,n,r){return n=Ne(n)||0,r===T?(r=n,n=0):r=Ne(r)||0,t=Ne(t),t>=Fu(n,r)&&t<Du(n,r)},xt.invoke=ai,xt.isArguments=je,xt.isArray=Qo,xt.isArrayBuffer=function(t){return Se(t)&&"[object ArrayBuffer]"==yu.call(t)},xt.isArrayLike=me,xt.isArrayLikeObject=we,xt.isBoolean=function(t){return true===t||false===t||Se(t)&&"[object Boolean]"==yu.call(t)},xt.isBuffer=Xo,
|
return n?Mr(kc(n),-Wn,Wn):0===n?n:0}function Ec(n){return null==n?"":vu(n)}function Sc(n,t){var r=gs(n);return null==t?r:Cr(r,t)}function Wc(n,t){return v(n,mi(t,3),ue)}function Lc(n,t){return v(n,mi(t,3),oe)}function Cc(n,t){return null==n?n:bs(n,mi(t,3),qc)}function Uc(n,t){return null==n?n:ws(n,mi(t,3),qc)}function Bc(n,t){return n&&ue(n,mi(t,3))}function Tc(n,t){return n&&oe(n,mi(t,3))}function $c(n){return null==n?[]:fe(n,Pc(n))}function Dc(n){return null==n?[]:fe(n,qc(n))}function Mc(n,t,r){
|
||||||
xt.isDate=function(t){return Se(t)&&"[object Date]"==yu.call(t)},xt.isElement=function(t){return!!t&&1===t.nodeType&&Se(t)&&!Be(t)},xt.isEmpty=function(t){if(me(t)&&(Qo(t)||ze(t)||Oe(t.splice)||je(t)||Xo(t)))return!t.length;if(Se(t)){var n=zr(t);if("[object Map]"==n||"[object Set]"==n)return!t.size}for(var r in t)if(vu.call(t,r))return false;return!(Hu&&Ke(t).length)},xt.isEqual=function(t,n){return On(t,n)},xt.isEqualWith=function(t,n,r){var e=(r=typeof r=="function"?r:T)?r(t,n):T;return e===T?On(t,n,r):!!e;
|
var e=null==n?X:_e(n,t);return e===X?r:e}function Fc(n,t){return null!=n&&Ri(n,t,xe)}function Nc(n,t){return null!=n&&Ri(n,t,je)}function Pc(n){return Hf(n)?Or(n):Me(n)}function qc(n){return Hf(n)?Or(n,!0):Fe(n)}function Zc(n,t){var r={};return t=mi(t,3),ue(n,function(n,e,u){Br(r,t(n,e,u),n)}),r}function Kc(n,t){var r={};return t=mi(t,3),ue(n,function(n,e,u){Br(r,e,t(n,e,u))}),r}function Vc(n,t){return Gc(n,Uf(mi(t)))}function Gc(n,t){if(null==n)return{};var r=c(di(n),function(n){return[n]});return t=mi(t),
|
||||||
},xt.isError=Ae,xt.isFinite=function(t){return typeof t=="number"&&Mu(t)},xt.isFunction=Oe,xt.isInteger=ke,xt.isLength=Ee,xt.isMap=function(t){return Se(t)&&"[object Map]"==zr(t)},xt.isMatch=function(t,n){return t===n||kn(t,n,Rr(n))},xt.isMatchWith=function(t,n,r){return r=typeof r=="function"?r:T,kn(t,n,Rr(n),r)},xt.isNaN=function(t){return We(t)&&t!=+t},xt.isNative=Re,xt.isNil=function(t){return null==t},xt.isNull=function(t){return null===t},xt.isNumber=We,xt.isObject=Ie,xt.isObjectLike=Se,xt.isPlainObject=Be,
|
Ye(n,r,function(n,r){return t(n,r[0])})}function Hc(n,t,r){t=ku(t,n);var e=-1,u=t.length;for(u||(u=1,n=X);++e<u;){var i=null==n?X:n[no(t[e])];i===X&&(e=u,i=r),n=uc(i)?i.call(n):i}return n}function Jc(n,t,r){return null==n?n:fu(n,t,r)}function Yc(n,t,r,e){return e="function"==typeof e?e:X,null==n?n:fu(n,t,r,e)}function Qc(n,t,e){var u=bh(n),i=u||mh(n)||Oh(n);if(t=mi(t,4),null==e){var o=n&&n.constructor;e=i?u?new o:[]:fc(n)&&uc(o)?gs(El(n)):{}}return(i?r:ue)(n,function(n,r,u){return t(e,n,r,u)}),e}
|
||||||
xt.isRegExp=Ce,xt.isSafeInteger=function(t){return ke(t)&&t>=-9007199254740991&&9007199254740991>=t},xt.isSet=function(t){return Se(t)&&"[object Set]"==zr(t)},xt.isString=ze,xt.isSymbol=Ue,xt.isTypedArray=Me,xt.isUndefined=function(t){return t===T},xt.isWeakMap=function(t){return Se(t)&&"[object WeakMap]"==zr(t)},xt.isWeakSet=function(t){return Se(t)&&"[object WeakSet]"==yu.call(t)},xt.join=function(t,n){return t?Lu.call(t,n):""},xt.kebabCase=vi,xt.last=Xr,xt.lastIndexOf=function(t,n,r){var e=t?t.length:0;
|
function Xc(n,t){return null==n||yu(n,t)}function na(n,t,r){return null==n?n:du(n,t,Au(r))}function ta(n,t,r,e){return e="function"==typeof e?e:X,null==n?n:du(n,t,Au(r),e)}function ra(n){return null==n?[]:E(n,Pc(n))}function ea(n){return null==n?[]:E(n,qc(n))}function ua(n,t,r){return r===X&&(r=t,t=X),r!==X&&(r=Ic(r),r=r===r?r:0),t!==X&&(t=Ic(t),t=t===t?t:0),Mr(Ic(n),t,r)}function ia(n,t,r){return t=Ac(t),r===X?(r=t,t=0):r=Ac(r),n=Ic(n),Ae(n,t,r)}function oa(n,t,r){if(r&&"boolean"!=typeof r&&Ui(n,t,r)&&(t=r=X),
|
||||||
if(!e)return-1;var u=e;if(r!==T&&(u=De(r),u=(0>u?Du(e+u,0):Fu(u,e-1))+1),n!==n)return U(t,u,true);for(;u--;)if(t[u]===n)return u;return-1},xt.lowerCase=gi,xt.lowerFirst=di,xt.lt=Le,xt.lte=function(t,n){return n>=t},xt.max=function(t){return t&&t.length?_(t,ru,xe):T},xt.maxBy=function(t,n){return t&&t.length?_(t,Sr(n),xe):T},xt.mean=function(t){return b(t,ru)},xt.meanBy=function(t,n){return b(t,Sr(n))},xt.min=function(t){return t&&t.length?_(t,ru,Le):T},xt.minBy=function(t,n){return t&&t.length?_(t,Sr(n),Le):T;
|
r===X&&("boolean"==typeof t?(r=t,t=X):"boolean"==typeof n&&(r=n,n=X)),n===X&&t===X?(n=0,t=1):(n=Ac(n),t===X?(t=n,n=0):t=Ac(t)),n>t){var e=n;n=t,t=e}if(r||n%1||t%1){var u=Ql();return Hl(n+u*(t-n+Qr("1e-"+((u+"").length-1))),t)}return tu(n,t)}function fa(n){return Qh(Ec(n).toLowerCase())}function ca(n){return n=Ec(n),n&&n.replace(Gt,ve).replace(Dr,"")}function aa(n,t,r){n=Ec(n),t=vu(t);var e=n.length;r=r===X?e:Mr(kc(r),0,e);var u=r;return r-=t.length,r>=0&&n.slice(r,u)==t}function la(n){return n=Ec(n),
|
||||||
},xt.multiply=Li,xt.noConflict=function(){return Jt._===this&&(Jt._=bu),this},xt.noop=ou,xt.now=Zo,xt.pad=function(t,n,r){t=Ze(t);var e=(n=De(n))?P(t):0;return n&&n>e?(n=(n-e)/2,xr(zu(n),r)+t+xr(Cu(n),r)):t},xt.padEnd=function(t,n,r){t=Ze(t);var e=(n=De(n))?P(t):0;return n&&n>e?t+xr(n-e,r):t},xt.padStart=function(t,n,r){t=Ze(t);var e=(n=De(n))?P(t):0;return n&&n>e?xr(n-e,r)+t:t},xt.parseInt=function(t,n,r){return r||null==n?n=0:n&&(n=+n),t=Ze(t).replace(at,""),Nu(t,n||(vt.test(t)?16:10))},xt.random=function(t,n,r){
|
n&&At.test(n)?n.replace(xt,ge):n}function sa(n){return n=Ec(n),n&&Wt.test(n)?n.replace(St,"\\$&"):n}function ha(n,t,r){n=Ec(n),t=kc(t);var e=t?V(n):0;if(!t||e>=t)return n;var u=(t-e)/2;return ri(Nl(u),r)+n+ri(Fl(u),r)}function pa(n,t,r){n=Ec(n),t=kc(t);var e=t?V(n):0;return t&&e<t?n+ri(t-e,r):n}function _a(n,t,r){n=Ec(n),t=kc(t);var e=t?V(n):0;return t&&e<t?ri(t-e,r)+n:n}function va(n,t,r){return r||null==t?t=0:t&&(t=+t),Yl(Ec(n).replace(Lt,""),t||0)}function ga(n,t,r){return t=(r?Ui(n,t,r):t===X)?1:kc(t),
|
||||||
if(r&&typeof r!="boolean"&&Fr(t,n,r)&&(n=r=T),r===T&&(typeof n=="boolean"?(r=n,n=T):typeof t=="boolean"&&(r=t,t=T)),t===T&&n===T?(t=0,n=1):(t=Ne(t)||0,n===T?(n=t,t=0):n=Ne(n)||0),t>n){var e=t;t=n,n=e}return r||t%1||n%1?(r=Pu(),Fu(t+r*(n-t+Nt("1e-"+((r+"").length-1))),n)):Fn(t,n)},xt.reduce=function(t,n,r){var e=Qo(t)?s:x,u=3>arguments.length;return e(t,Sr(n,4),r,u,fo)},xt.reduceRight=function(t,n,r){var e=Qo(t)?h:x,u=3>arguments.length;return e(t,Sr(n,4),r,u,co)},xt.repeat=function(t,n,r){return n=(r?Fr(t,n,r):n===T)?1:De(n),
|
eu(Ec(n),t)}function ya(){var n=arguments,t=Ec(n[0]);return n.length<3?t:t.replace(n[1],n[2])}function da(n,t,r){return r&&"number"!=typeof r&&Ui(n,t,r)&&(t=r=X),(r=r===X?Un:r>>>0)?(n=Ec(n),n&&("string"==typeof t||null!=t&&!Ah(t))&&(t=vu(t),!t&&T(n))?Ou(G(n),0,r):n.split(t,r)):[]}function ba(n,t,r){return n=Ec(n),r=null==r?0:Mr(kc(r),0,n.length),t=vu(t),n.slice(r,r+t.length)==t}function wa(n,t,r){var e=Z.templateSettings;r&&Ui(n,t,r)&&(t=X),n=Ec(n),t=Sh({},t,e,li);var u,i,o=Sh({},t.imports,e.imports,li),f=Pc(o),c=E(o,f),a=0,l=t.interpolate||Ht,s="__p += '",h=sl((t.escape||Ht).source+"|"+l.source+"|"+(l===It?Ft:Ht).source+"|"+(t.evaluate||Ht).source+"|$","g"),p="//# sourceURL="+(bl.call(t,"sourceURL")?(t.sourceURL+"").replace(/\s/g," "):"lodash.templateSources["+ ++Zr+"]")+"\n";
|
||||||
Nn(Ze(t),n)},xt.replace=function(){var t=arguments,n=Ze(t[0]);return 3>t.length?n:n.replace(t[1],t[2])},xt.result=function(t,n,r){n=Nr(n,t)?[n]:un(n);var e=-1,u=n.length;for(u||(t=T,u=1);++e<u;){var o=null==t?T:t[n[e]];o===T&&(e=u,o=r),t=Oe(o)?o.call(t):o}return t},xt.round=$i,xt.runInContext=q,xt.sample=function(t){t=me(t)?t:He(t);var n=t.length;return n>0?t[Fn(0,n-1)]:T},xt.size=function(t){if(null==t)return 0;if(me(t)){var n=t.length;return n&&ze(t)?P(t):n}return Se(t)&&(n=zr(t),"[object Map]"==n||"[object Set]"==n)?t.size:Ke(t).length;
|
n.replace(h,function(t,r,e,o,f,c){return e||(e=o),s+=n.slice(a,c).replace(Jt,U),r&&(u=!0,s+="' +\n__e("+r+") +\n'"),f&&(i=!0,s+="';\n"+f+";\n__p += '"),e&&(s+="' +\n((__t = ("+e+")) == null ? '' : __t) +\n'"),a=c+t.length,t}),s+="';\n";var _=bl.call(t,"variable")&&t.variable;if(_){if(Dt.test(_))throw new fl(un)}else s="with (obj) {\n"+s+"\n}\n";s=(i?s.replace(dt,""):s).replace(bt,"$1").replace(wt,"$1;"),s="function("+(_||"obj")+") {\n"+(_?"":"obj || (obj = {});\n")+"var __t, __p = ''"+(u?", __e = _.escape":"")+(i?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+s+"return __p\n}";
|
||||||
},xt.snakeCase=yi,xt.some=function(t,n,r){var e=Qo(t)?p:qn;return r&&Fr(t,n,r)&&(n=T),e(t,Sr(n,3))},xt.sortedIndex=function(t,n){return Tn(t,n)},xt.sortedIndexBy=function(t,n,r){return Vn(t,n,Sr(r))},xt.sortedIndexOf=function(t,n){var r=t?t.length:0;if(r){var e=Tn(t,n);if(r>e&&be(t[e],n))return e}return-1},xt.sortedLastIndex=function(t,n){return Tn(t,n,true)},xt.sortedLastIndexBy=function(t,n,r){return Vn(t,n,Sr(r),true)},xt.sortedLastIndexOf=function(t,n){if(t&&t.length){var r=Tn(t,n,true)-1;if(be(t[r],n))return r;
|
var v=Xh(function(){return cl(f,p+"return "+s).apply(X,c)});if(v.source=s,rc(v))throw v;return v}function ma(n){return Ec(n).toLowerCase()}function xa(n){return Ec(n).toUpperCase()}function ja(n,t,r){if(n=Ec(n),n&&(r||t===X))return R(n);if(!n||!(t=vu(t)))return n;var e=G(n),u=G(t);return Ou(e,W(e,u),L(e,u)+1).join("")}function Aa(n,t,r){if(n=Ec(n),n&&(r||t===X))return n.slice(0,H(n)+1);if(!n||!(t=vu(t)))return n;var e=G(n);return Ou(e,0,L(e,G(t))+1).join("")}function ka(n,t,r){if(n=Ec(n),n&&(r||t===X))return n.replace(Lt,"");
|
||||||
}return-1},xt.startCase=bi,xt.startsWith=function(t,n,r){return t=Ze(t),r=on(De(r),0,t.length),t.lastIndexOf(n,r)==r},xt.subtract=Di,xt.sum=function(t){return t&&t.length?m(t,ru):0},xt.sumBy=function(t,n){return t&&t.length?m(t,Sr(n)):0},xt.template=function(t,n,r){var e=xt.templateSettings;r&&Fr(t,n,r)&&(n=T),t=Ze(t),n=ri({},n,e,Gt),r=ri({},n.imports,e.imports,Gt);var u,o,i=Ke(r),f=k(r,i),c=0;r=n.interpolate||mt;var a="__p+='";r=lu((n.escape||mt).source+"|"+r.source+"|"+(r===et?pt:mt).source+"|"+(n.evaluate||mt).source+"|$","g");
|
if(!n||!(t=vu(t)))return n;var e=G(n);return Ou(e,W(e,G(t))).join("")}function Oa(n,t){var r=An,e=kn;if(fc(t)){var u="separator"in t?t.separator:u;r="length"in t?kc(t.length):r,e="omission"in t?vu(t.omission):e}n=Ec(n);var i=n.length;if(T(n)){var o=G(n);i=o.length}if(r>=i)return n;var f=r-V(e);if(f<1)return e;var c=o?Ou(o,0,f).join(""):n.slice(0,f);if(u===X)return c+e;if(o&&(f+=c.length-f),Ah(u)){if(n.slice(f).search(u)){var a,l=c;for(u.global||(u=sl(u.source,Ec(Nt.exec(u))+"g")),u.lastIndex=0;a=u.exec(l);)var s=a.index;
|
||||||
var l="sourceURL"in n?"//# sourceURL="+n.sourceURL+"\n":"";if(t.replace(r,function(n,r,e,i,f,l){return e||(e=i),a+=t.slice(c,l).replace(wt,z),r&&(u=true,a+="'+__e("+r+")+'"),f&&(o=true,a+="';"+f+";\n__p+='"),e&&(a+="'+((__t=("+e+"))==null?'':__t)+'"),c=l+n.length,n}),a+="';",(n=n.variable)||(a="with(obj){"+a+"}"),a=(o?a.replace(G,""):a).replace(J,"$1").replace(Y,"$1;"),a="function("+(n||"obj")+"){"+(n?"":"obj||(obj={});")+"var __t,__p=''"+(u?",__e=_.escape":"")+(o?",__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}":";")+a+"return __p}",
|
c=c.slice(0,s===X?f:s)}}else if(n.indexOf(vu(u),f)!=f){var h=c.lastIndexOf(u);h>-1&&(c=c.slice(0,h))}return c+e}function Ia(n){return n=Ec(n),n&&jt.test(n)?n.replace(mt,ye):n}function Ra(n,t,r){return n=Ec(n),t=r?X:t,t===X?$(n)?Q(n):_(n):n.match(t)||[]}function za(t){var r=null==t?0:t.length,e=mi();return t=r?c(t,function(n){if("function"!=typeof n[1])throw new pl(en);return[e(n[0]),n[1]]}):[],uu(function(e){for(var u=-1;++u<r;){var i=t[u];if(n(i[0],this,e))return n(i[1],this,e)}})}function Ea(n){
|
||||||
n=mi(function(){return Function(i,l+"return "+a).apply(T,f)}),n.source=a,Ae(n))throw n;return n},xt.times=function(t,n){if(t=De(t),1>t||t>9007199254740991)return[];var r=4294967295,e=Fu(t,4294967295);for(n=Sr(n),t-=4294967295,e=w(e,n);++r<t;)n(r);return e},xt.toInteger=De,xt.toLength=Fe,xt.toLower=function(t){return Ze(t).toLowerCase()},xt.toNumber=Ne,xt.toSafeInteger=function(t){return on(De(t),-9007199254740991,9007199254740991)},xt.toString=Ze,xt.toUpper=function(t){return Ze(t).toUpperCase()},
|
return Nr(Fr(n,an))}function Sa(n){return function(){return n}}function Wa(n,t){return null==n||n!==n?t:n}function La(n){return n}function Ca(n){return De("function"==typeof n?n:Fr(n,an))}function Ua(n){return qe(Fr(n,an))}function Ba(n,t){return Ze(n,Fr(t,an))}function Ta(n,t,e){var u=Pc(t),i=fe(t,u);null!=e||fc(t)&&(i.length||!u.length)||(e=t,t=n,n=this,i=fe(t,Pc(t)));var o=!(fc(e)&&"chain"in e&&!e.chain),f=uc(n);return r(i,function(r){var e=t[r];n[r]=e,f&&(n.prototype[r]=function(){var t=this.__chain__;
|
||||||
xt.trim=function(t,n,r){return(t=Ze(t))?r||n===T?t.replace(at,""):(n+="")?(t=t.match(It),n=n.match(It),t.slice(E(t,n),I(t,n)+1).join("")):t:t},xt.trimEnd=function(t,n,r){return(t=Ze(t))?r||n===T?t.replace(st,""):(n+="")?(t=t.match(It),t.slice(0,I(t,n.match(It))+1).join("")):t:t},xt.trimStart=function(t,n,r){return(t=Ze(t))?r||n===T?t.replace(lt,""):(n+="")?(t=t.match(It),t.slice(E(t,n.match(It))).join("")):t:t},xt.truncate=function(t,n){var r=30,e="...";if(Ie(n))var u="separator"in n?n.separator:u,r="length"in n?De(n.length):r,e="omission"in n?Ze(n.omission):e;
|
if(o||t){var r=n(this.__wrapped__);return(r.__actions__=Tu(this.__actions__)).push({func:e,args:arguments,thisArg:n}),r.__chain__=t,r}return e.apply(n,a([this.value()],arguments))})}),n}function $a(){return re._===this&&(re._=Al),this}function Da(){}function Ma(n){return n=kc(n),uu(function(t){return Ge(t,n)})}function Fa(n){return Bi(n)?m(no(n)):Qe(n)}function Na(n){return function(t){return null==n?X:_e(n,t)}}function Pa(){return[]}function qa(){return!1}function Za(){return{}}function Ka(){return"";
|
||||||
t=Ze(t);var o=t.length;if(St.test(t))var i=t.match(It),o=i.length;if(r>=o)return t;if(o=r-P(e),1>o)return e;if(r=i?i.slice(0,o).join(""):t.slice(0,o),u===T)return r+e;if(i&&(o+=r.length-o),Ce(u)){if(t.slice(o).search(u)){var f=r;for(u.global||(u=lu(u.source,Ze(_t.exec(u))+"g")),u.lastIndex=0;i=u.exec(f);)var c=i.index;r=r.slice(0,c===T?o:c)}}else t.indexOf(u,o)!=o&&(u=r.lastIndexOf(u),u>-1&&(r=r.slice(0,u)));return r+e},xt.unescape=function(t){return(t=Ze(t))&&X.test(t)?t.replace(H,Z):t},xt.uniqueId=function(t){
|
}function Va(){return!0}function Ga(n,t){if(n=kc(n),n<1||n>Wn)return[];var r=Un,e=Hl(n,Un);t=mi(t),n-=Un;for(var u=O(e,t);++r<n;)t(r);return u}function Ha(n){return bh(n)?c(n,no):bc(n)?[n]:Tu(Cs(Ec(n)))}function Ja(n){var t=++wl;return Ec(n)+t}function Ya(n){return n&&n.length?Yr(n,La,me):X}function Qa(n,t){return n&&n.length?Yr(n,mi(t,2),me):X}function Xa(n){return w(n,La)}function nl(n,t){return w(n,mi(t,2))}function tl(n){return n&&n.length?Yr(n,La,Ne):X}function rl(n,t){return n&&n.length?Yr(n,mi(t,2),Ne):X;
|
||||||
var n=++gu;return Ze(t)+n},xt.upperCase=xi,xt.upperFirst=ji,xt.each=fe,xt.eachRight=ce,xt.first=Qr,uu(xt,function(){var t={};return vn(xt,function(n,r){vu.call(xt.prototype,r)||(t[r]=n)}),t}(),{chain:false}),xt.VERSION="4.8.0",u("bind bindKey curry curryRight partial partialRight".split(" "),function(t){xt[t].placeholder=xt}),u(["drop","take"],function(t,n){kt.prototype[t]=function(r){var e=this.__filtered__;if(e&&!n)return new kt(this);r=r===T?1:Du(De(r),0);var u=this.clone();return e?u.__takeCount__=Fu(r,u.__takeCount__):u.__views__.push({
|
}function el(n){return n&&n.length?k(n,La):0}function ul(n,t){return n&&n.length?k(n,mi(t,2)):0}x=null==x?re:be.defaults(re.Object(),x,be.pick(re,qr));var il=x.Array,ol=x.Date,fl=x.Error,cl=x.Function,al=x.Math,ll=x.Object,sl=x.RegExp,hl=x.String,pl=x.TypeError,_l=il.prototype,vl=cl.prototype,gl=ll.prototype,yl=x["__core-js_shared__"],dl=vl.toString,bl=gl.hasOwnProperty,wl=0,ml=function(){var n=/[^.]+$/.exec(yl&&yl.keys&&yl.keys.IE_PROTO||"");return n?"Symbol(src)_1."+n:""}(),xl=gl.toString,jl=dl.call(ll),Al=re._,kl=sl("^"+dl.call(bl).replace(St,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Ol=ie?x.Buffer:X,Il=x.Symbol,Rl=x.Uint8Array,zl=Ol?Ol.allocUnsafe:X,El=F(ll.getPrototypeOf,ll),Sl=ll.create,Wl=gl.propertyIsEnumerable,Ll=_l.splice,Cl=Il?Il.isConcatSpreadable:X,Ul=Il?Il.iterator:X,Bl=Il?Il.toStringTag:X,Tl=function(){
|
||||||
size:Fu(r,4294967295),type:t+(0>u.__dir__?"Right":"")}),u},kt.prototype[t+"Right"]=function(n){return this.reverse()[t](n).reverse()}}),u(["filter","map","takeWhile"],function(t,n){var r=n+1,e=1==r||3==r;kt.prototype[t]=function(t){var n=this.clone();return n.__iteratees__.push({iteratee:Sr(t,3),type:r}),n.__filtered__=n.__filtered__||e,n}}),u(["head","last"],function(t,n){var r="take"+(n?"Right":"");kt.prototype[t]=function(){return this[r](1).value()[0]}}),u(["initial","tail"],function(t,n){var r="drop"+(n?"":"Right");
|
try{var n=Ai(ll,"defineProperty");return n({},"",{}),n}catch(n){}}(),$l=x.clearTimeout!==re.clearTimeout&&x.clearTimeout,Dl=ol&&ol.now!==re.Date.now&&ol.now,Ml=x.setTimeout!==re.setTimeout&&x.setTimeout,Fl=al.ceil,Nl=al.floor,Pl=ll.getOwnPropertySymbols,ql=Ol?Ol.isBuffer:X,Zl=x.isFinite,Kl=_l.join,Vl=F(ll.keys,ll),Gl=al.max,Hl=al.min,Jl=ol.now,Yl=x.parseInt,Ql=al.random,Xl=_l.reverse,ns=Ai(x,"DataView"),ts=Ai(x,"Map"),rs=Ai(x,"Promise"),es=Ai(x,"Set"),us=Ai(x,"WeakMap"),is=Ai(ll,"create"),os=us&&new us,fs={},cs=to(ns),as=to(ts),ls=to(rs),ss=to(es),hs=to(us),ps=Il?Il.prototype:X,_s=ps?ps.valueOf:X,vs=ps?ps.toString:X,gs=function(){
|
||||||
kt.prototype[t]=function(){return this.__filtered__?new kt(this):this[r](1)}}),kt.prototype.compact=function(){return this.filter(ru)},kt.prototype.find=function(t){return this.filter(t).head()},kt.prototype.findLast=function(t){return this.reverse().find(t)},kt.prototype.invokeMap=de(function(t,n){return typeof t=="function"?new kt(this):this.map(function(r){return An(r,t,n)})}),kt.prototype.reject=function(t){return t=Sr(t,3),this.filter(function(n){return!t(n)})},kt.prototype.slice=function(t,n){
|
function n(){}return function(t){if(!fc(t))return{};if(Sl)return Sl(t);n.prototype=t;var r=new n;return n.prototype=X,r}}();Z.templateSettings={escape:kt,evaluate:Ot,interpolate:It,variable:"",imports:{_:Z}},Z.prototype=J.prototype,Z.prototype.constructor=Z,Y.prototype=gs(J.prototype),Y.prototype.constructor=Y,Ct.prototype=gs(J.prototype),Ct.prototype.constructor=Ct,Xt.prototype.clear=nr,Xt.prototype.delete=tr,Xt.prototype.get=rr,Xt.prototype.has=er,Xt.prototype.set=ur,ir.prototype.clear=or,ir.prototype.delete=fr,
|
||||||
t=De(t);var r=this;return r.__filtered__&&(t>0||0>n)?new kt(r):(0>t?r=r.takeRight(-t):t&&(r=r.drop(t)),n!==T&&(n=De(n),r=0>n?r.dropRight(-n):r.take(n-t)),r)},kt.prototype.takeRightWhile=function(t){return this.reverse().takeWhile(t).reverse()},kt.prototype.toArray=function(){return this.take(4294967295)},vn(kt.prototype,function(t,n){var r=/^(?:filter|find|map|reject)|While$/.test(n),e=/^(?:head|last)$/.test(n),u=xt[e?"take"+("last"==n?"Right":""):n],o=e||/^find/.test(n);u&&(xt.prototype[n]=function(){
|
ir.prototype.get=cr,ir.prototype.has=ar,ir.prototype.set=lr,sr.prototype.clear=hr,sr.prototype.delete=pr,sr.prototype.get=_r,sr.prototype.has=vr,sr.prototype.set=gr,yr.prototype.add=yr.prototype.push=dr,yr.prototype.has=br,wr.prototype.clear=mr,wr.prototype.delete=xr,wr.prototype.get=jr,wr.prototype.has=Ar,wr.prototype.set=kr;var ys=Pu(ue),ds=Pu(oe,!0),bs=qu(),ws=qu(!0),ms=os?function(n,t){return os.set(n,t),n}:La,xs=Tl?function(n,t){return Tl(n,"toString",{configurable:!0,enumerable:!1,value:Sa(t),
|
||||||
function n(t){return t=u.apply(xt,l([t],f)),e&&h?t[0]:t}var i=this.__wrapped__,f=e?[1]:arguments,c=i instanceof kt,a=f[0],s=c||Qo(i);s&&r&&typeof a=="function"&&1!=a.length&&(c=s=false);var h=this.__chain__,p=!!this.__actions__.length,a=o&&!h,c=c&&!p;return!o&&s?(i=c?i:new kt(this),i=t.apply(i,f),i.__actions__.push({func:oe,args:[n],thisArg:T}),new Ot(i,h)):a&&c?t.apply(this,f):(i=this.thru(n),a?e?i.value()[0]:i.value():i)})}),u("pop push shift sort splice unshift".split(" "),function(t){var n=hu[t],r=/^(?:push|sort|unshift)$/.test(t)?"tap":"thru",e=/^(?:pop|shift)$/.test(t);
|
writable:!0})}:La,js=uu,As=$l||function(n){return re.clearTimeout(n)},ks=es&&1/P(new es([,-0]))[1]==Sn?function(n){return new es(n)}:Da,Os=os?function(n){return os.get(n)}:Da,Is=Pl?function(n){return null==n?[]:(n=ll(n),i(Pl(n),function(t){return Wl.call(n,t)}))}:Pa,Rs=Pl?function(n){for(var t=[];n;)a(t,Is(n)),n=El(n);return t}:Pa,zs=we;(ns&&zs(new ns(new ArrayBuffer(1)))!=ct||ts&&zs(new ts)!=Gn||rs&&zs(rs.resolve())!=Qn||es&&zs(new es)!=tt||us&&zs(new us)!=it)&&(zs=function(n){var t=we(n),r=t==Yn?n.constructor:X,e=r?to(r):"";
|
||||||
xt.prototype[t]=function(){var t=arguments;if(e&&!this.__chain__){var u=this.value();return n.apply(Qo(u)?u:[],t)}return this[r](function(r){return n.apply(Qo(r)?r:[],t)})}}),vn(kt.prototype,function(t,n){var r=xt[n];if(r){var e=r.name+"";(Qu[e]||(Qu[e]=[])).push({name:n,func:r})}}),Qu[dr(T,2).name]=[{name:"wrapper",func:T}],kt.prototype.clone=function(){var t=new kt(this.__wrapped__);return t.__actions__=er(this.__actions__),t.__dir__=this.__dir__,t.__filtered__=this.__filtered__,t.__iteratees__=er(this.__iteratees__),
|
if(e)switch(e){case cs:return ct;case as:return Gn;case ls:return Qn;case ss:return tt;case hs:return it}return t});var Es=yl?uc:qa,Ss=Qi(ms),Ws=Ml||function(n,t){return re.setTimeout(n,t)},Ls=Qi(xs),Cs=Pi(function(n){var t=[];return 46===n.charCodeAt(0)&&t.push(""),n.replace(Et,function(n,r,e,u){t.push(e?u.replace(Mt,"$1"):r||n)}),t}),Us=uu(function(n,t){return Jf(n)?Hr(n,ee(t,1,Jf,!0)):[]}),Bs=uu(function(n,t){var r=jo(t);return Jf(r)&&(r=X),Jf(n)?Hr(n,ee(t,1,Jf,!0),mi(r,2)):[]}),Ts=uu(function(n,t){
|
||||||
t.__takeCount__=this.__takeCount__,t.__views__=er(this.__views__),t},kt.prototype.reverse=function(){if(this.__filtered__){var t=new kt(this);t.__dir__=-1,t.__filtered__=true}else t=this.clone(),t.__dir__*=-1;return t},kt.prototype.value=function(){var t,n=this.__wrapped__.value(),r=this.__dir__,e=Qo(n),u=0>r,o=e?n.length:0;t=o;for(var i=this.__views__,f=0,c=-1,a=i.length;++c<a;){var l=i[c],s=l.size;switch(l.type){case"drop":f+=s;break;case"dropRight":t-=s;break;case"take":t=Fu(t,f+s);break;case"takeRight":
|
var r=jo(t);return Jf(r)&&(r=X),Jf(n)?Hr(n,ee(t,1,Jf,!0),X,r):[]}),$s=uu(function(n){var t=c(n,ju);return t.length&&t[0]===n[0]?ke(t):[]}),Ds=uu(function(n){var t=jo(n),r=c(n,ju);return t===jo(r)?t=X:r.pop(),r.length&&r[0]===n[0]?ke(r,mi(t,2)):[]}),Ms=uu(function(n){var t=jo(n),r=c(n,ju);return t="function"==typeof t?t:X,t&&r.pop(),r.length&&r[0]===n[0]?ke(r,X,t):[]}),Fs=uu(Oo),Ns=gi(function(n,t){var r=null==n?0:n.length,e=Tr(n,t);return nu(n,c(t,function(n){return Ci(n,r)?+n:n}).sort(Lu)),e}),Ps=uu(function(n){
|
||||||
f=Du(f,t-s)}}if(t={start:f,end:t},i=t.start,f=t.end,t=f-i,u=u?f:i-1,i=this.__iteratees__,f=i.length,c=0,a=Fu(t,this.__takeCount__),!e||200>o||o==t&&a==t)return Yn(n,this.__actions__);e=[];t:for(;t--&&a>c;){for(u+=r,o=-1,l=n[u];++o<f;){var h=i[o],s=h.type,h=(0,h.iteratee)(l);if(2==s)l=h;else if(!h){if(1==s)continue t;break t}}e[c++]=l}return e},xt.prototype.at=Mo,xt.prototype.chain=function(){return ue(this)},xt.prototype.commit=function(){return new Ot(this.value(),this.__chain__)},xt.prototype.next=function(){
|
return gu(ee(n,1,Jf,!0))}),qs=uu(function(n){var t=jo(n);return Jf(t)&&(t=X),gu(ee(n,1,Jf,!0),mi(t,2))}),Zs=uu(function(n){var t=jo(n);return t="function"==typeof t?t:X,gu(ee(n,1,Jf,!0),X,t)}),Ks=uu(function(n,t){return Jf(n)?Hr(n,t):[]}),Vs=uu(function(n){return mu(i(n,Jf))}),Gs=uu(function(n){var t=jo(n);return Jf(t)&&(t=X),mu(i(n,Jf),mi(t,2))}),Hs=uu(function(n){var t=jo(n);return t="function"==typeof t?t:X,mu(i(n,Jf),X,t)}),Js=uu(Go),Ys=uu(function(n){var t=n.length,r=t>1?n[t-1]:X;return r="function"==typeof r?(n.pop(),
|
||||||
this.__values__===T&&(this.__values__=$e(this.value()));var t=this.__index__>=this.__values__.length,n=t?T:this.__values__[this.__index__++];return{done:t,value:n}},xt.prototype.plant=function(t){for(var n,r=this;r instanceof At;){var e=Jr(r);e.__index__=0,e.__values__=T,n?u.__wrapped__=e:n=e;var u=e,r=r.__wrapped__}return u.__wrapped__=t,n},xt.prototype.reverse=function(){var t=this.__wrapped__;return t instanceof kt?(this.__actions__.length&&(t=new kt(this)),t=t.reverse(),t.__actions__.push({func:oe,
|
r):X,Ho(n,r)}),Qs=gi(function(n){var t=n.length,r=t?n[0]:0,e=this.__wrapped__,u=function(t){return Tr(t,n)};return!(t>1||this.__actions__.length)&&e instanceof Ct&&Ci(r)?(e=e.slice(r,+r+(t?1:0)),e.__actions__.push({func:nf,args:[u],thisArg:X}),new Y(e,this.__chain__).thru(function(n){return t&&!n.length&&n.push(X),n})):this.thru(u)}),Xs=Fu(function(n,t,r){bl.call(n,r)?++n[r]:Br(n,r,1)}),nh=Ju(ho),th=Ju(po),rh=Fu(function(n,t,r){bl.call(n,r)?n[r].push(t):Br(n,r,[t])}),eh=uu(function(t,r,e){var u=-1,i="function"==typeof r,o=Hf(t)?il(t.length):[];
|
||||||
args:[ne],thisArg:T}),new Ot(t,this.__chain__)):this.thru(ne)},xt.prototype.toJSON=xt.prototype.valueOf=xt.prototype.value=function(){return Yn(this.__wrapped__,this.__actions__)},Iu&&(xt.prototype[Iu]=ie),xt}var T,V=1/0,K=NaN,G=/\b__p\+='';/g,J=/\b(__p\+=)''\+/g,Y=/(__e\(.*?\)|\b__t\))\+'';/g,H=/&(?:amp|lt|gt|quot|#39|#96);/g,Q=/[&<>"'`]/g,X=RegExp(H.source),tt=RegExp(Q.source),nt=/<%-([\s\S]+?)%>/g,rt=/<%([\s\S]+?)%>/g,et=/<%=([\s\S]+?)%>/g,ut=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,ot=/^\w*$/,it=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]/g,ft=/[\\^$.*+?()[\]{}|]/g,ct=RegExp(ft.source),at=/^\s+|\s+$/g,lt=/^\s+/,st=/\s+$/,ht=/\\(\\)?/g,pt=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,_t=/\w*$/,vt=/^0x/i,gt=/^[-+]0x[0-9a-f]+$/i,dt=/^0b[01]+$/i,yt=/^\[object .+?Constructor\]$/,bt=/^0o[0-7]+$/i,xt=/^(?:0|[1-9]\d*)$/,jt=/[\xc0-\xd6\xd8-\xde\xdf-\xf6\xf8-\xff]/g,mt=/($^)/,wt=/['\n\r\u2028\u2029\\]/g,At="[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0]|\\ud83c[\\udffb-\\udfff])?(?:\\u200d(?:[^\\ud800-\\udfff]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff])[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0]|\\ud83c[\\udffb-\\udfff])?)*",Ot="(?:[\\u2700-\\u27bf]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff])"+At,kt="(?:[^\\ud800-\\udfff][\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0]?|[\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff]|[\\ud800-\\udfff])",Et=RegExp("[\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0]","g"),It=RegExp("\\ud83c[\\udffb-\\udfff](?=\\ud83c[\\udffb-\\udfff])|"+kt+At,"g"),St=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0\\ufe0e\\ufe0f]"),Rt=/[a-zA-Z0-9]+/g,Wt=RegExp(["[A-Z\\xc0-\\xd6\\xd8-\\xde]?[a-z\\xdf-\\xf6\\xf8-\\xff]+(?=[\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2018\\u2019\\u201c\\u201d \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000]|[A-Z\\xc0-\\xd6\\xd8-\\xde]|$)|(?:[A-Z\\xc0-\\xd6\\xd8-\\xde]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2018\\u2019\\u201c\\u201d \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])+(?=[\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2018\\u2019\\u201c\\u201d \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000]|[A-Z\\xc0-\\xd6\\xd8-\\xde](?:[a-z\\xdf-\\xf6\\xf8-\\xff]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2018\\u2019\\u201c\\u201d \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])|$)|[A-Z\\xc0-\\xd6\\xd8-\\xde]?(?:[a-z\\xdf-\\xf6\\xf8-\\xff]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2018\\u2019\\u201c\\u201d \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])+|[A-Z\\xc0-\\xd6\\xd8-\\xde]+|\\d+",Ot].join("|"),"g"),Bt=/[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Ct="Array Buffer DataView Date Error Float32Array Float64Array Function Int8Array Int16Array Int32Array Map Math Object Promise Reflect RegExp Set String Symbol TypeError Uint8Array Uint8ClampedArray Uint16Array Uint32Array WeakMap _ clearTimeout isFinite parseInt setTimeout".split(" "),zt={};
|
return ys(t,function(t){o[++u]=i?n(r,t,e):Ie(t,r,e)}),o}),uh=Fu(function(n,t,r){Br(n,r,t)}),ih=Fu(function(n,t,r){n[r?0:1].push(t)},function(){return[[],[]]}),oh=uu(function(n,t){if(null==n)return[];var r=t.length;return r>1&&Ui(n,t[0],t[1])?t=[]:r>2&&Ui(t[0],t[1],t[2])&&(t=[t[0]]),He(n,ee(t,1),[])}),fh=Dl||function(){return re.Date.now()},ch=uu(function(n,t,r){var e=_n;if(r.length){var u=N(r,wi(ch));e|=bn}return ai(n,e,t,r,u)}),ah=uu(function(n,t,r){var e=_n|vn;if(r.length){var u=N(r,wi(ah));e|=bn;
|
||||||
zt["[object Float32Array]"]=zt["[object Float64Array]"]=zt["[object Int8Array]"]=zt["[object Int16Array]"]=zt["[object Int32Array]"]=zt["[object Uint8Array]"]=zt["[object Uint8ClampedArray]"]=zt["[object Uint16Array]"]=zt["[object Uint32Array]"]=true,zt["[object Arguments]"]=zt["[object Array]"]=zt["[object ArrayBuffer]"]=zt["[object Boolean]"]=zt["[object DataView]"]=zt["[object Date]"]=zt["[object Error]"]=zt["[object Function]"]=zt["[object Map]"]=zt["[object Number]"]=zt["[object Object]"]=zt["[object RegExp]"]=zt["[object Set]"]=zt["[object String]"]=zt["[object WeakMap]"]=false;
|
}return ai(t,e,n,r,u)}),lh=uu(function(n,t){return Gr(n,1,t)}),sh=uu(function(n,t,r){return Gr(n,Ic(t)||0,r)});Cf.Cache=sr;var hh=js(function(t,r){r=1==r.length&&bh(r[0])?c(r[0],z(mi())):c(ee(r,1),z(mi()));var e=r.length;return uu(function(u){for(var i=-1,o=Hl(u.length,e);++i<o;)u[i]=r[i].call(this,u[i]);return n(t,this,u)})}),ph=uu(function(n,t){return ai(n,bn,X,t,N(t,wi(ph)))}),_h=uu(function(n,t){return ai(n,wn,X,t,N(t,wi(_h)))}),vh=gi(function(n,t){return ai(n,xn,X,X,X,t)}),gh=ii(me),yh=ii(function(n,t){
|
||||||
var Ut={};Ut["[object Arguments]"]=Ut["[object Array]"]=Ut["[object ArrayBuffer]"]=Ut["[object DataView]"]=Ut["[object Boolean]"]=Ut["[object Date]"]=Ut["[object Float32Array]"]=Ut["[object Float64Array]"]=Ut["[object Int8Array]"]=Ut["[object Int16Array]"]=Ut["[object Int32Array]"]=Ut["[object Map]"]=Ut["[object Number]"]=Ut["[object Object]"]=Ut["[object RegExp]"]=Ut["[object Set]"]=Ut["[object String]"]=Ut["[object Symbol]"]=Ut["[object Uint8Array]"]=Ut["[object Uint8ClampedArray]"]=Ut["[object Uint16Array]"]=Ut["[object Uint32Array]"]=true,
|
return n>=t}),dh=Re(function(){return arguments}())?Re:function(n){return cc(n)&&bl.call(n,"callee")&&!Wl.call(n,"callee")},bh=il.isArray,wh=ce?z(ce):ze,mh=ql||qa,xh=ae?z(ae):Ee,jh=le?z(le):Le,Ah=se?z(se):Be,kh=he?z(he):Te,Oh=pe?z(pe):$e,Ih=ii(Ne),Rh=ii(function(n,t){return n<=t}),zh=Nu(function(n,t){if(Mi(t)||Hf(t))return $u(t,Pc(t),n),X;for(var r in t)bl.call(t,r)&&Sr(n,r,t[r])}),Eh=Nu(function(n,t){$u(t,qc(t),n)}),Sh=Nu(function(n,t,r,e){$u(t,qc(t),n,e)}),Wh=Nu(function(n,t,r,e){$u(t,Pc(t),n,e);
|
||||||
Ut["[object Error]"]=Ut["[object Function]"]=Ut["[object WeakMap]"]=false;var Mt={"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O",
|
}),Lh=gi(Tr),Ch=uu(function(n,t){n=ll(n);var r=-1,e=t.length,u=e>2?t[2]:X;for(u&&Ui(t[0],t[1],u)&&(e=1);++r<e;)for(var i=t[r],o=qc(i),f=-1,c=o.length;++f<c;){var a=o[f],l=n[a];(l===X||Gf(l,gl[a])&&!bl.call(n,a))&&(n[a]=i[a])}return n}),Uh=uu(function(t){return t.push(X,si),n(Mh,X,t)}),Bh=Xu(function(n,t,r){null!=t&&"function"!=typeof t.toString&&(t=xl.call(t)),n[t]=r},Sa(La)),Th=Xu(function(n,t,r){null!=t&&"function"!=typeof t.toString&&(t=xl.call(t)),bl.call(n,t)?n[t].push(r):n[t]=[r]},mi),$h=uu(Ie),Dh=Nu(function(n,t,r){
|
||||||
"\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss"},Lt={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},$t={"&":"&","<":"<",">":">",""":'"',"'":"'","`":"`"},Dt={"function":true,object:true},Ft={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"
|
Ke(n,t,r)}),Mh=Nu(function(n,t,r,e){Ke(n,t,r,e)}),Fh=gi(function(n,t){var r={};if(null==n)return r;var e=!1;t=c(t,function(t){return t=ku(t,n),e||(e=t.length>1),t}),$u(n,di(n),r),e&&(r=Fr(r,an|ln|sn,hi));for(var u=t.length;u--;)yu(r,t[u]);return r}),Nh=gi(function(n,t){return null==n?{}:Je(n,t)}),Ph=ci(Pc),qh=ci(qc),Zh=Vu(function(n,t,r){return t=t.toLowerCase(),n+(r?fa(t):t)}),Kh=Vu(function(n,t,r){return n+(r?"-":"")+t.toLowerCase()}),Vh=Vu(function(n,t,r){return n+(r?" ":"")+t.toLowerCase()}),Gh=Ku("toLowerCase"),Hh=Vu(function(n,t,r){
|
||||||
},Nt=parseFloat,Pt=parseInt,Zt=Dt[typeof exports]&&exports&&!exports.nodeType?exports:T,qt=Dt[typeof module]&&module&&!module.nodeType?module:T,Tt=qt&&qt.exports===Zt?Zt:T,Vt=S(Dt[typeof self]&&self),Kt=S(Dt[typeof window]&&window),Gt=S(Dt[typeof this]&&this),Jt=S(Zt&&qt&&typeof global=="object"&&global)||Kt!==(Gt&&Gt.window)&&Kt||Vt||Gt||Function("return this")(),Yt=q();(Kt||Vt||{})._=Yt,typeof define=="function"&&typeof define.amd=="object"&&define.amd? define(function(){return Yt}):Zt&&qt?(Tt&&((qt.exports=Yt)._=Yt),
|
return n+(r?"_":"")+t.toLowerCase()}),Jh=Vu(function(n,t,r){return n+(r?" ":"")+Qh(t)}),Yh=Vu(function(n,t,r){return n+(r?" ":"")+t.toUpperCase()}),Qh=Ku("toUpperCase"),Xh=uu(function(t,r){try{return n(t,X,r)}catch(n){return rc(n)?n:new fl(n)}}),np=gi(function(n,t){return r(t,function(t){t=no(t),Br(n,t,ch(n[t],n))}),n}),tp=Yu(),rp=Yu(!0),ep=uu(function(n,t){return function(r){return Ie(r,n,t)}}),up=uu(function(n,t){return function(r){return Ie(n,r,t)}}),ip=ti(c),op=ti(u),fp=ti(h),cp=ui(),ap=ui(!0),lp=ni(function(n,t){
|
||||||
Zt._=Yt):Jt._=Yt}).call(this);
|
return n+t},0),sp=fi("ceil"),hp=ni(function(n,t){return n/t},1),pp=fi("floor"),_p=ni(function(n,t){return n*t},1),vp=fi("round"),gp=ni(function(n,t){return n-t},0);return Z.after=If,Z.ary=Rf,Z.assign=zh,Z.assignIn=Eh,Z.assignInWith=Sh,Z.assignWith=Wh,Z.at=Lh,Z.before=zf,Z.bind=ch,Z.bindAll=np,Z.bindKey=ah,Z.castArray=Nf,Z.chain=Qo,Z.chunk=uo,Z.compact=io,Z.concat=oo,Z.cond=za,Z.conforms=Ea,Z.constant=Sa,Z.countBy=Xs,Z.create=Sc,Z.curry=Ef,Z.curryRight=Sf,Z.debounce=Wf,Z.defaults=Ch,Z.defaultsDeep=Uh,
|
||||||
|
Z.defer=lh,Z.delay=sh,Z.difference=Us,Z.differenceBy=Bs,Z.differenceWith=Ts,Z.drop=fo,Z.dropRight=co,Z.dropRightWhile=ao,Z.dropWhile=lo,Z.fill=so,Z.filter=lf,Z.flatMap=sf,Z.flatMapDeep=hf,Z.flatMapDepth=pf,Z.flatten=_o,Z.flattenDeep=vo,Z.flattenDepth=go,Z.flip=Lf,Z.flow=tp,Z.flowRight=rp,Z.fromPairs=yo,Z.functions=$c,Z.functionsIn=Dc,Z.groupBy=rh,Z.initial=mo,Z.intersection=$s,Z.intersectionBy=Ds,Z.intersectionWith=Ms,Z.invert=Bh,Z.invertBy=Th,Z.invokeMap=eh,Z.iteratee=Ca,Z.keyBy=uh,Z.keys=Pc,Z.keysIn=qc,
|
||||||
|
Z.map=yf,Z.mapKeys=Zc,Z.mapValues=Kc,Z.matches=Ua,Z.matchesProperty=Ba,Z.memoize=Cf,Z.merge=Dh,Z.mergeWith=Mh,Z.method=ep,Z.methodOf=up,Z.mixin=Ta,Z.negate=Uf,Z.nthArg=Ma,Z.omit=Fh,Z.omitBy=Vc,Z.once=Bf,Z.orderBy=df,Z.over=ip,Z.overArgs=hh,Z.overEvery=op,Z.overSome=fp,Z.partial=ph,Z.partialRight=_h,Z.partition=ih,Z.pick=Nh,Z.pickBy=Gc,Z.property=Fa,Z.propertyOf=Na,Z.pull=Fs,Z.pullAll=Oo,Z.pullAllBy=Io,Z.pullAllWith=Ro,Z.pullAt=Ns,Z.range=cp,Z.rangeRight=ap,Z.rearg=vh,Z.reject=mf,Z.remove=zo,Z.rest=Tf,
|
||||||
|
Z.reverse=Eo,Z.sampleSize=jf,Z.set=Jc,Z.setWith=Yc,Z.shuffle=Af,Z.slice=So,Z.sortBy=oh,Z.sortedUniq=$o,Z.sortedUniqBy=Do,Z.split=da,Z.spread=$f,Z.tail=Mo,Z.take=Fo,Z.takeRight=No,Z.takeRightWhile=Po,Z.takeWhile=qo,Z.tap=Xo,Z.throttle=Df,Z.thru=nf,Z.toArray=jc,Z.toPairs=Ph,Z.toPairsIn=qh,Z.toPath=Ha,Z.toPlainObject=Rc,Z.transform=Qc,Z.unary=Mf,Z.union=Ps,Z.unionBy=qs,Z.unionWith=Zs,Z.uniq=Zo,Z.uniqBy=Ko,Z.uniqWith=Vo,Z.unset=Xc,Z.unzip=Go,Z.unzipWith=Ho,Z.update=na,Z.updateWith=ta,Z.values=ra,Z.valuesIn=ea,
|
||||||
|
Z.without=Ks,Z.words=Ra,Z.wrap=Ff,Z.xor=Vs,Z.xorBy=Gs,Z.xorWith=Hs,Z.zip=Js,Z.zipObject=Jo,Z.zipObjectDeep=Yo,Z.zipWith=Ys,Z.entries=Ph,Z.entriesIn=qh,Z.extend=Eh,Z.extendWith=Sh,Ta(Z,Z),Z.add=lp,Z.attempt=Xh,Z.camelCase=Zh,Z.capitalize=fa,Z.ceil=sp,Z.clamp=ua,Z.clone=Pf,Z.cloneDeep=Zf,Z.cloneDeepWith=Kf,Z.cloneWith=qf,Z.conformsTo=Vf,Z.deburr=ca,Z.defaultTo=Wa,Z.divide=hp,Z.endsWith=aa,Z.eq=Gf,Z.escape=la,Z.escapeRegExp=sa,Z.every=af,Z.find=nh,Z.findIndex=ho,Z.findKey=Wc,Z.findLast=th,Z.findLastIndex=po,
|
||||||
|
Z.findLastKey=Lc,Z.floor=pp,Z.forEach=_f,Z.forEachRight=vf,Z.forIn=Cc,Z.forInRight=Uc,Z.forOwn=Bc,Z.forOwnRight=Tc,Z.get=Mc,Z.gt=gh,Z.gte=yh,Z.has=Fc,Z.hasIn=Nc,Z.head=bo,Z.identity=La,Z.includes=gf,Z.indexOf=wo,Z.inRange=ia,Z.invoke=$h,Z.isArguments=dh,Z.isArray=bh,Z.isArrayBuffer=wh,Z.isArrayLike=Hf,Z.isArrayLikeObject=Jf,Z.isBoolean=Yf,Z.isBuffer=mh,Z.isDate=xh,Z.isElement=Qf,Z.isEmpty=Xf,Z.isEqual=nc,Z.isEqualWith=tc,Z.isError=rc,Z.isFinite=ec,Z.isFunction=uc,Z.isInteger=ic,Z.isLength=oc,Z.isMap=jh,
|
||||||
|
Z.isMatch=ac,Z.isMatchWith=lc,Z.isNaN=sc,Z.isNative=hc,Z.isNil=_c,Z.isNull=pc,Z.isNumber=vc,Z.isObject=fc,Z.isObjectLike=cc,Z.isPlainObject=gc,Z.isRegExp=Ah,Z.isSafeInteger=yc,Z.isSet=kh,Z.isString=dc,Z.isSymbol=bc,Z.isTypedArray=Oh,Z.isUndefined=wc,Z.isWeakMap=mc,Z.isWeakSet=xc,Z.join=xo,Z.kebabCase=Kh,Z.last=jo,Z.lastIndexOf=Ao,Z.lowerCase=Vh,Z.lowerFirst=Gh,Z.lt=Ih,Z.lte=Rh,Z.max=Ya,Z.maxBy=Qa,Z.mean=Xa,Z.meanBy=nl,Z.min=tl,Z.minBy=rl,Z.stubArray=Pa,Z.stubFalse=qa,Z.stubObject=Za,Z.stubString=Ka,
|
||||||
|
Z.stubTrue=Va,Z.multiply=_p,Z.nth=ko,Z.noConflict=$a,Z.noop=Da,Z.now=fh,Z.pad=ha,Z.padEnd=pa,Z.padStart=_a,Z.parseInt=va,Z.random=oa,Z.reduce=bf,Z.reduceRight=wf,Z.repeat=ga,Z.replace=ya,Z.result=Hc,Z.round=vp,Z.runInContext=p,Z.sample=xf,Z.size=kf,Z.snakeCase=Hh,Z.some=Of,Z.sortedIndex=Wo,Z.sortedIndexBy=Lo,Z.sortedIndexOf=Co,Z.sortedLastIndex=Uo,Z.sortedLastIndexBy=Bo,Z.sortedLastIndexOf=To,Z.startCase=Jh,Z.startsWith=ba,Z.subtract=gp,Z.sum=el,Z.sumBy=ul,Z.template=wa,Z.times=Ga,Z.toFinite=Ac,Z.toInteger=kc,
|
||||||
|
Z.toLength=Oc,Z.toLower=ma,Z.toNumber=Ic,Z.toSafeInteger=zc,Z.toString=Ec,Z.toUpper=xa,Z.trim=ja,Z.trimEnd=Aa,Z.trimStart=ka,Z.truncate=Oa,Z.unescape=Ia,Z.uniqueId=Ja,Z.upperCase=Yh,Z.upperFirst=Qh,Z.each=_f,Z.eachRight=vf,Z.first=bo,Ta(Z,function(){var n={};return ue(Z,function(t,r){bl.call(Z.prototype,r)||(n[r]=t)}),n}(),{chain:!1}),Z.VERSION=nn,r(["bind","bindKey","curry","curryRight","partial","partialRight"],function(n){Z[n].placeholder=Z}),r(["drop","take"],function(n,t){Ct.prototype[n]=function(r){
|
||||||
|
r=r===X?1:Gl(kc(r),0);var e=this.__filtered__&&!t?new Ct(this):this.clone();return e.__filtered__?e.__takeCount__=Hl(r,e.__takeCount__):e.__views__.push({size:Hl(r,Un),type:n+(e.__dir__<0?"Right":"")}),e},Ct.prototype[n+"Right"]=function(t){return this.reverse()[n](t).reverse()}}),r(["filter","map","takeWhile"],function(n,t){var r=t+1,e=r==Rn||r==En;Ct.prototype[n]=function(n){var t=this.clone();return t.__iteratees__.push({iteratee:mi(n,3),type:r}),t.__filtered__=t.__filtered__||e,t}}),r(["head","last"],function(n,t){
|
||||||
|
var r="take"+(t?"Right":"");Ct.prototype[n]=function(){return this[r](1).value()[0]}}),r(["initial","tail"],function(n,t){var r="drop"+(t?"":"Right");Ct.prototype[n]=function(){return this.__filtered__?new Ct(this):this[r](1)}}),Ct.prototype.compact=function(){return this.filter(La)},Ct.prototype.find=function(n){return this.filter(n).head()},Ct.prototype.findLast=function(n){return this.reverse().find(n)},Ct.prototype.invokeMap=uu(function(n,t){return"function"==typeof n?new Ct(this):this.map(function(r){
|
||||||
|
return Ie(r,n,t)})}),Ct.prototype.reject=function(n){return this.filter(Uf(mi(n)))},Ct.prototype.slice=function(n,t){n=kc(n);var r=this;return r.__filtered__&&(n>0||t<0)?new Ct(r):(n<0?r=r.takeRight(-n):n&&(r=r.drop(n)),t!==X&&(t=kc(t),r=t<0?r.dropRight(-t):r.take(t-n)),r)},Ct.prototype.takeRightWhile=function(n){return this.reverse().takeWhile(n).reverse()},Ct.prototype.toArray=function(){return this.take(Un)},ue(Ct.prototype,function(n,t){var r=/^(?:filter|find|map|reject)|While$/.test(t),e=/^(?:head|last)$/.test(t),u=Z[e?"take"+("last"==t?"Right":""):t],i=e||/^find/.test(t);
|
||||||
|
u&&(Z.prototype[t]=function(){var t=this.__wrapped__,o=e?[1]:arguments,f=t instanceof Ct,c=o[0],l=f||bh(t),s=function(n){var t=u.apply(Z,a([n],o));return e&&h?t[0]:t};l&&r&&"function"==typeof c&&1!=c.length&&(f=l=!1);var h=this.__chain__,p=!!this.__actions__.length,_=i&&!h,v=f&&!p;if(!i&&l){t=v?t:new Ct(this);var g=n.apply(t,o);return g.__actions__.push({func:nf,args:[s],thisArg:X}),new Y(g,h)}return _&&v?n.apply(this,o):(g=this.thru(s),_?e?g.value()[0]:g.value():g)})}),r(["pop","push","shift","sort","splice","unshift"],function(n){
|
||||||
|
var t=_l[n],r=/^(?:push|sort|unshift)$/.test(n)?"tap":"thru",e=/^(?:pop|shift)$/.test(n);Z.prototype[n]=function(){var n=arguments;if(e&&!this.__chain__){var u=this.value();return t.apply(bh(u)?u:[],n)}return this[r](function(r){return t.apply(bh(r)?r:[],n)})}}),ue(Ct.prototype,function(n,t){var r=Z[t];if(r){var e=r.name+"";bl.call(fs,e)||(fs[e]=[]),fs[e].push({name:t,func:r})}}),fs[Qu(X,vn).name]=[{name:"wrapper",func:X}],Ct.prototype.clone=$t,Ct.prototype.reverse=Yt,Ct.prototype.value=Qt,Z.prototype.at=Qs,
|
||||||
|
Z.prototype.chain=tf,Z.prototype.commit=rf,Z.prototype.next=ef,Z.prototype.plant=of,Z.prototype.reverse=ff,Z.prototype.toJSON=Z.prototype.valueOf=Z.prototype.value=cf,Z.prototype.first=Z.prototype.head,Ul&&(Z.prototype[Ul]=uf),Z},be=de();"function"==typeof define&&"object"==typeof define.amd&&define.amd?(re._=be,define(function(){return be})):ue?((ue.exports=be)._=be,ee._=be):re._=be}).call(this);
|
||||||
185
dist/mapping.fp.js
vendored
185
dist/mapping.fp.js
vendored
@@ -52,7 +52,7 @@ return /******/ (function(modules) { // webpackBootstrap
|
|||||||
/************************************************************************/
|
/************************************************************************/
|
||||||
/******/ ([
|
/******/ ([
|
||||||
/* 0 */
|
/* 0 */
|
||||||
/***/ function(module, exports) {
|
/***/ (function(module, exports) {
|
||||||
|
|
||||||
/** Used to map aliases to their real names. */
|
/** Used to map aliases to their real names. */
|
||||||
exports.aliasToReal = {
|
exports.aliasToReal = {
|
||||||
@@ -63,11 +63,20 @@ return /******/ (function(modules) { // webpackBootstrap
|
|||||||
'entries': 'toPairs',
|
'entries': 'toPairs',
|
||||||
'entriesIn': 'toPairsIn',
|
'entriesIn': 'toPairsIn',
|
||||||
'extend': 'assignIn',
|
'extend': 'assignIn',
|
||||||
|
'extendAll': 'assignInAll',
|
||||||
|
'extendAllWith': 'assignInAllWith',
|
||||||
'extendWith': 'assignInWith',
|
'extendWith': 'assignInWith',
|
||||||
'first': 'head',
|
'first': 'head',
|
||||||
|
|
||||||
|
// Methods that are curried variants of others.
|
||||||
|
'conforms': 'conformsTo',
|
||||||
|
'matches': 'isMatch',
|
||||||
|
'property': 'get',
|
||||||
|
|
||||||
// Ramda aliases.
|
// Ramda aliases.
|
||||||
'__': 'placeholder',
|
'__': 'placeholder',
|
||||||
|
'F': 'stubFalse',
|
||||||
|
'T': 'stubTrue',
|
||||||
'all': 'every',
|
'all': 'every',
|
||||||
'allPass': 'overEvery',
|
'allPass': 'overEvery',
|
||||||
'always': 'constant',
|
'always': 'constant',
|
||||||
@@ -81,68 +90,84 @@ return /******/ (function(modules) { // webpackBootstrap
|
|||||||
'contains': 'includes',
|
'contains': 'includes',
|
||||||
'dissoc': 'unset',
|
'dissoc': 'unset',
|
||||||
'dissocPath': 'unset',
|
'dissocPath': 'unset',
|
||||||
|
'dropLast': 'dropRight',
|
||||||
|
'dropLastWhile': 'dropRightWhile',
|
||||||
'equals': 'isEqual',
|
'equals': 'isEqual',
|
||||||
'identical': 'eq',
|
'identical': 'eq',
|
||||||
|
'indexBy': 'keyBy',
|
||||||
'init': 'initial',
|
'init': 'initial',
|
||||||
'invertObj': 'invert',
|
'invertObj': 'invert',
|
||||||
'juxt': 'over',
|
'juxt': 'over',
|
||||||
'mapObj': 'mapValues',
|
|
||||||
'omitAll': 'omit',
|
'omitAll': 'omit',
|
||||||
'nAry': 'ary',
|
'nAry': 'ary',
|
||||||
'path': 'get',
|
'path': 'get',
|
||||||
'pathEq': 'matchesProperty',
|
'pathEq': 'matchesProperty',
|
||||||
'pathOr': 'getOr',
|
'pathOr': 'getOr',
|
||||||
|
'paths': 'at',
|
||||||
'pickAll': 'pick',
|
'pickAll': 'pick',
|
||||||
'pipe': 'flow',
|
'pipe': 'flow',
|
||||||
|
'pluck': 'map',
|
||||||
'prop': 'get',
|
'prop': 'get',
|
||||||
'propOf': 'propertyOf',
|
'propEq': 'matchesProperty',
|
||||||
'propOr': 'getOr',
|
'propOr': 'getOr',
|
||||||
|
'props': 'at',
|
||||||
|
'symmetricDifference': 'xor',
|
||||||
|
'symmetricDifferenceBy': 'xorBy',
|
||||||
|
'symmetricDifferenceWith': 'xorWith',
|
||||||
|
'takeLast': 'takeRight',
|
||||||
|
'takeLastWhile': 'takeRightWhile',
|
||||||
'unapply': 'rest',
|
'unapply': 'rest',
|
||||||
'unnest': 'flatten',
|
'unnest': 'flatten',
|
||||||
'useWith': 'overArgs',
|
'useWith': 'overArgs',
|
||||||
'whereEq': 'filter',
|
'where': 'conformsTo',
|
||||||
|
'whereEq': 'isMatch',
|
||||||
'zipObj': 'zipObject'
|
'zipObj': 'zipObject'
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Used to map ary to method names. */
|
/** Used to map ary to method names. */
|
||||||
exports.aryMethod = {
|
exports.aryMethod = {
|
||||||
'1': [
|
'1': [
|
||||||
'attempt', 'castArray', 'ceil', 'create', 'curry', 'curryRight', 'floor',
|
'assignAll', 'assignInAll', 'attempt', 'castArray', 'ceil', 'create',
|
||||||
'flow', 'flowRight', 'fromPairs', 'invert', 'iteratee', 'memoize', 'method',
|
'curry', 'curryRight', 'defaultsAll', 'defaultsDeepAll', 'floor', 'flow',
|
||||||
'methodOf', 'mixin', 'over', 'overEvery', 'overSome', 'rest', 'reverse',
|
'flowRight', 'fromPairs', 'invert', 'iteratee', 'memoize', 'method', 'mergeAll',
|
||||||
|
'methodOf', 'mixin', 'nthArg', 'over', 'overEvery', 'overSome','rest', 'reverse',
|
||||||
'round', 'runInContext', 'spread', 'template', 'trim', 'trimEnd', 'trimStart',
|
'round', 'runInContext', 'spread', 'template', 'trim', 'trimEnd', 'trimStart',
|
||||||
'uniqueId', 'words'
|
'uniqueId', 'words', 'zipAll'
|
||||||
],
|
],
|
||||||
'2': [
|
'2': [
|
||||||
'add', 'after', 'ary', 'assign', 'assignIn', 'at', 'before', 'bind', 'bindAll',
|
'add', 'after', 'ary', 'assign', 'assignAllWith', 'assignIn', 'assignInAllWith',
|
||||||
'bindKey', 'chunk', 'cloneDeepWith', 'cloneWith', 'concat', 'countBy', 'curryN',
|
'at', 'before', 'bind', 'bindAll', 'bindKey', 'chunk', 'cloneDeepWith',
|
||||||
'curryRightN', 'debounce', 'defaults', 'defaultsDeep', 'delay', 'difference',
|
'cloneWith', 'concat', 'conformsTo', 'countBy', 'curryN', 'curryRightN',
|
||||||
'divide', 'drop', 'dropRight', 'dropRightWhile', 'dropWhile', 'endsWith',
|
'debounce', 'defaults', 'defaultsDeep', 'defaultTo', 'delay', 'difference',
|
||||||
'eq', 'every', 'filter', 'find', 'find', 'findIndex', 'findKey', 'findLast',
|
'divide', 'drop', 'dropRight', 'dropRightWhile', 'dropWhile', 'endsWith', 'eq',
|
||||||
'findLastIndex', 'findLastKey', 'flatMap', 'flatMapDeep', 'flattenDepth',
|
'every', 'filter', 'find', 'findIndex', 'findKey', 'findLast', 'findLastIndex',
|
||||||
'forEach', 'forEachRight', 'forIn', 'forInRight', 'forOwn', 'forOwnRight',
|
'findLastKey', 'flatMap', 'flatMapDeep', 'flattenDepth', 'forEach',
|
||||||
'get', 'groupBy', 'gt', 'gte', 'has', 'hasIn', 'includes', 'indexOf',
|
'forEachRight', 'forIn', 'forInRight', 'forOwn', 'forOwnRight', 'get',
|
||||||
'intersection', 'invertBy', 'invoke', 'invokeMap', 'isEqual', 'isMatch',
|
'groupBy', 'gt', 'gte', 'has', 'hasIn', 'includes', 'indexOf', 'intersection',
|
||||||
'join', 'keyBy', 'lastIndexOf', 'lt', 'lte', 'map', 'mapKeys', 'mapValues',
|
'invertBy', 'invoke', 'invokeMap', 'isEqual', 'isMatch', 'join', 'keyBy',
|
||||||
'matchesProperty', 'maxBy', 'meanBy', 'merge', 'minBy', 'multiply', 'omit', 'omitBy',
|
'lastIndexOf', 'lt', 'lte', 'map', 'mapKeys', 'mapValues', 'matchesProperty',
|
||||||
'overArgs', 'pad', 'padEnd', 'padStart', 'parseInt', 'partial', 'partialRight',
|
'maxBy', 'meanBy', 'merge', 'mergeAllWith', 'minBy', 'multiply', 'nth', 'omit',
|
||||||
'partition', 'pick', 'pickBy', 'pull', 'pullAll', 'pullAt', 'random', 'range',
|
'omitBy', 'overArgs', 'pad', 'padEnd', 'padStart', 'parseInt', 'partial',
|
||||||
'rangeRight', 'rearg', 'reject', 'remove', 'repeat', 'restFrom', 'result',
|
'partialRight', 'partition', 'pick', 'pickBy', 'propertyOf', 'pull', 'pullAll',
|
||||||
'sampleSize', 'some', 'sortBy', 'sortedIndex', 'sortedIndexOf', 'sortedLastIndex',
|
'pullAt', 'random', 'range', 'rangeRight', 'rearg', 'reject', 'remove',
|
||||||
'sortedLastIndexOf', 'sortedUniqBy', 'split', 'spreadFrom', 'startsWith',
|
'repeat', 'restFrom', 'result', 'sampleSize', 'some', 'sortBy', 'sortedIndex',
|
||||||
'subtract', 'sumBy', 'take', 'takeRight', 'takeRightWhile', 'takeWhile', 'tap',
|
'sortedIndexOf', 'sortedLastIndex', 'sortedLastIndexOf', 'sortedUniqBy',
|
||||||
'throttle', 'thru', 'times', 'trimChars', 'trimCharsEnd', 'trimCharsStart',
|
'split', 'spreadFrom', 'startsWith', 'subtract', 'sumBy', 'take', 'takeRight',
|
||||||
'truncate', 'union', 'uniqBy', 'uniqWith', 'unset', 'unzipWith', 'without',
|
'takeRightWhile', 'takeWhile', 'tap', 'throttle', 'thru', 'times', 'trimChars',
|
||||||
'wrap', 'xor', 'zip', 'zipObject', 'zipObjectDeep'
|
'trimCharsEnd', 'trimCharsStart', 'truncate', 'union', 'uniqBy', 'uniqWith',
|
||||||
|
'unset', 'unzipWith', 'without', 'wrap', 'xor', 'zip', 'zipObject',
|
||||||
|
'zipObjectDeep'
|
||||||
],
|
],
|
||||||
'3': [
|
'3': [
|
||||||
'assignInWith', 'assignWith', 'clamp', 'differenceBy', 'differenceWith',
|
'assignInWith', 'assignWith', 'clamp', 'differenceBy', 'differenceWith',
|
||||||
'getOr', 'inRange', 'intersectionBy', 'intersectionWith', 'invokeArgs',
|
'findFrom', 'findIndexFrom', 'findLastFrom', 'findLastIndexFrom', 'getOr',
|
||||||
'invokeArgsMap', 'isEqualWith', 'isMatchWith', 'flatMapDepth', 'mergeWith',
|
'includesFrom', 'indexOfFrom', 'inRange', 'intersectionBy', 'intersectionWith',
|
||||||
'orderBy', 'padChars', 'padCharsEnd', 'padCharsStart', 'pullAllBy',
|
'invokeArgs', 'invokeArgsMap', 'isEqualWith', 'isMatchWith', 'flatMapDepth',
|
||||||
'pullAllWith', 'reduce', 'reduceRight', 'replace', 'set', 'slice',
|
'lastIndexOfFrom', 'mergeWith', 'orderBy', 'padChars', 'padCharsEnd',
|
||||||
'sortedIndexBy', 'sortedLastIndexBy', 'transform', 'unionBy', 'unionWith',
|
'padCharsStart', 'pullAllBy', 'pullAllWith', 'rangeStep', 'rangeStepRight',
|
||||||
'update', 'xorBy', 'xorWith', 'zipWith'
|
'reduce', 'reduceRight', 'replace', 'set', 'slice', 'sortedIndexBy',
|
||||||
|
'sortedLastIndexBy', 'transform', 'unionBy', 'unionWith', 'update', 'xorBy',
|
||||||
|
'xorWith', 'zipWith'
|
||||||
],
|
],
|
||||||
'4': [
|
'4': [
|
||||||
'fill', 'setWith', 'updateWith'
|
'fill', 'setWith', 'updateWith'
|
||||||
@@ -163,10 +188,14 @@ return /******/ (function(modules) { // webpackBootstrap
|
|||||||
'every': 1,
|
'every': 1,
|
||||||
'filter': 1,
|
'filter': 1,
|
||||||
'find': 1,
|
'find': 1,
|
||||||
|
'findFrom': 1,
|
||||||
'findIndex': 1,
|
'findIndex': 1,
|
||||||
|
'findIndexFrom': 1,
|
||||||
'findKey': 1,
|
'findKey': 1,
|
||||||
'findLast': 1,
|
'findLast': 1,
|
||||||
|
'findLastFrom': 1,
|
||||||
'findLastIndex': 1,
|
'findLastIndex': 1,
|
||||||
|
'findLastIndexFrom': 1,
|
||||||
'findLastKey': 1,
|
'findLastKey': 1,
|
||||||
'flatMap': 1,
|
'flatMap': 1,
|
||||||
'flatMapDeep': 1,
|
'flatMapDeep': 1,
|
||||||
@@ -194,40 +223,59 @@ return /******/ (function(modules) { // webpackBootstrap
|
|||||||
|
|
||||||
/** Used to map method names to iteratee rearg configs. */
|
/** Used to map method names to iteratee rearg configs. */
|
||||||
exports.iterateeRearg = {
|
exports.iterateeRearg = {
|
||||||
'mapKeys': [1]
|
'mapKeys': [1],
|
||||||
|
'reduceRight': [1, 0]
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Used to map method names to rearg configs. */
|
/** Used to map method names to rearg configs. */
|
||||||
exports.methodRearg = {
|
exports.methodRearg = {
|
||||||
|
'assignInAllWith': [1, 0],
|
||||||
'assignInWith': [1, 2, 0],
|
'assignInWith': [1, 2, 0],
|
||||||
|
'assignAllWith': [1, 0],
|
||||||
'assignWith': [1, 2, 0],
|
'assignWith': [1, 2, 0],
|
||||||
|
'differenceBy': [1, 2, 0],
|
||||||
|
'differenceWith': [1, 2, 0],
|
||||||
'getOr': [2, 1, 0],
|
'getOr': [2, 1, 0],
|
||||||
|
'intersectionBy': [1, 2, 0],
|
||||||
|
'intersectionWith': [1, 2, 0],
|
||||||
'isEqualWith': [1, 2, 0],
|
'isEqualWith': [1, 2, 0],
|
||||||
'isMatchWith': [2, 1, 0],
|
'isMatchWith': [2, 1, 0],
|
||||||
|
'mergeAllWith': [1, 0],
|
||||||
'mergeWith': [1, 2, 0],
|
'mergeWith': [1, 2, 0],
|
||||||
'padChars': [2, 1, 0],
|
'padChars': [2, 1, 0],
|
||||||
'padCharsEnd': [2, 1, 0],
|
'padCharsEnd': [2, 1, 0],
|
||||||
'padCharsStart': [2, 1, 0],
|
'padCharsStart': [2, 1, 0],
|
||||||
'pullAllBy': [2, 1, 0],
|
'pullAllBy': [2, 1, 0],
|
||||||
'pullAllWith': [2, 1, 0],
|
'pullAllWith': [2, 1, 0],
|
||||||
|
'rangeStep': [1, 2, 0],
|
||||||
|
'rangeStepRight': [1, 2, 0],
|
||||||
'setWith': [3, 1, 2, 0],
|
'setWith': [3, 1, 2, 0],
|
||||||
'sortedIndexBy': [2, 1, 0],
|
'sortedIndexBy': [2, 1, 0],
|
||||||
'sortedLastIndexBy': [2, 1, 0],
|
'sortedLastIndexBy': [2, 1, 0],
|
||||||
|
'unionBy': [1, 2, 0],
|
||||||
|
'unionWith': [1, 2, 0],
|
||||||
'updateWith': [3, 1, 2, 0],
|
'updateWith': [3, 1, 2, 0],
|
||||||
|
'xorBy': [1, 2, 0],
|
||||||
|
'xorWith': [1, 2, 0],
|
||||||
'zipWith': [1, 2, 0]
|
'zipWith': [1, 2, 0]
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Used to map method names to spread configs. */
|
/** Used to map method names to spread configs. */
|
||||||
exports.methodSpread = {
|
exports.methodSpread = {
|
||||||
'invokeArgs': 2,
|
'assignAll': { 'start': 0 },
|
||||||
'invokeArgsMap': 2,
|
'assignAllWith': { 'start': 0 },
|
||||||
'over': 0,
|
'assignInAll': { 'start': 0 },
|
||||||
'overArgs': 1,
|
'assignInAllWith': { 'start': 0 },
|
||||||
'overEvery': 0,
|
'defaultsAll': { 'start': 0 },
|
||||||
'overSome': 0,
|
'defaultsDeepAll': { 'start': 0 },
|
||||||
'partial': 1,
|
'invokeArgs': { 'start': 2 },
|
||||||
'partialRight': 1,
|
'invokeArgsMap': { 'start': 2 },
|
||||||
'without': 1
|
'mergeAll': { 'start': 0 },
|
||||||
|
'mergeAllWith': { 'start': 0 },
|
||||||
|
'partial': { 'start': 1 },
|
||||||
|
'partialRight': { 'start': 1 },
|
||||||
|
'without': { 'start': 1 },
|
||||||
|
'zipAll': { 'start': 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Used to identify methods which mutate arrays or objects. */
|
/** Used to identify methods which mutate arrays or objects. */
|
||||||
@@ -244,13 +292,21 @@ return /******/ (function(modules) { // webpackBootstrap
|
|||||||
},
|
},
|
||||||
'object': {
|
'object': {
|
||||||
'assign': true,
|
'assign': true,
|
||||||
|
'assignAll': true,
|
||||||
|
'assignAllWith': true,
|
||||||
'assignIn': true,
|
'assignIn': true,
|
||||||
|
'assignInAll': true,
|
||||||
|
'assignInAllWith': true,
|
||||||
'assignInWith': true,
|
'assignInWith': true,
|
||||||
'assignWith': true,
|
'assignWith': true,
|
||||||
'defaults': true,
|
'defaults': true,
|
||||||
|
'defaultsAll': true,
|
||||||
'defaultsDeep': true,
|
'defaultsDeep': true,
|
||||||
|
'defaultsDeepAll': true,
|
||||||
'merge': true,
|
'merge': true,
|
||||||
'mergeWith': true
|
'mergeAll': true,
|
||||||
|
'mergeAllWith': true,
|
||||||
|
'mergeWith': true,
|
||||||
},
|
},
|
||||||
'set': {
|
'set': {
|
||||||
'set': true,
|
'set': true,
|
||||||
@@ -261,16 +317,6 @@ return /******/ (function(modules) { // webpackBootstrap
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Used to track methods with placeholder support */
|
|
||||||
exports.placeholder = {
|
|
||||||
'bind': true,
|
|
||||||
'bindKey': true,
|
|
||||||
'curry': true,
|
|
||||||
'curryRight': true,
|
|
||||||
'partial': true,
|
|
||||||
'partialRight': true
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Used to map real names to their aliases. */
|
/** Used to map real names to their aliases. */
|
||||||
exports.realToAlias = (function() {
|
exports.realToAlias = (function() {
|
||||||
var hasOwnProperty = Object.prototype.hasOwnProperty,
|
var hasOwnProperty = Object.prototype.hasOwnProperty,
|
||||||
@@ -290,19 +336,38 @@ return /******/ (function(modules) { // webpackBootstrap
|
|||||||
|
|
||||||
/** Used to map method names to other names. */
|
/** Used to map method names to other names. */
|
||||||
exports.remap = {
|
exports.remap = {
|
||||||
|
'assignAll': 'assign',
|
||||||
|
'assignAllWith': 'assignWith',
|
||||||
|
'assignInAll': 'assignIn',
|
||||||
|
'assignInAllWith': 'assignInWith',
|
||||||
'curryN': 'curry',
|
'curryN': 'curry',
|
||||||
'curryRightN': 'curryRight',
|
'curryRightN': 'curryRight',
|
||||||
|
'defaultsAll': 'defaults',
|
||||||
|
'defaultsDeepAll': 'defaultsDeep',
|
||||||
|
'findFrom': 'find',
|
||||||
|
'findIndexFrom': 'findIndex',
|
||||||
|
'findLastFrom': 'findLast',
|
||||||
|
'findLastIndexFrom': 'findLastIndex',
|
||||||
'getOr': 'get',
|
'getOr': 'get',
|
||||||
|
'includesFrom': 'includes',
|
||||||
|
'indexOfFrom': 'indexOf',
|
||||||
'invokeArgs': 'invoke',
|
'invokeArgs': 'invoke',
|
||||||
'invokeArgsMap': 'invokeMap',
|
'invokeArgsMap': 'invokeMap',
|
||||||
|
'lastIndexOfFrom': 'lastIndexOf',
|
||||||
|
'mergeAll': 'merge',
|
||||||
|
'mergeAllWith': 'mergeWith',
|
||||||
'padChars': 'pad',
|
'padChars': 'pad',
|
||||||
'padCharsEnd': 'padEnd',
|
'padCharsEnd': 'padEnd',
|
||||||
'padCharsStart': 'padStart',
|
'padCharsStart': 'padStart',
|
||||||
|
'propertyOf': 'get',
|
||||||
|
'rangeStep': 'range',
|
||||||
|
'rangeStepRight': 'rangeRight',
|
||||||
'restFrom': 'rest',
|
'restFrom': 'rest',
|
||||||
'spreadFrom': 'spread',
|
'spreadFrom': 'spread',
|
||||||
'trimChars': 'trim',
|
'trimChars': 'trim',
|
||||||
'trimCharsEnd': 'trimEnd',
|
'trimCharsEnd': 'trimEnd',
|
||||||
'trimCharsStart': 'trimStart'
|
'trimCharsStart': 'trimStart',
|
||||||
|
'zipAll': 'zip'
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Used to track methods that skip fixing their arity. */
|
/** Used to track methods that skip fixing their arity. */
|
||||||
@@ -312,6 +377,7 @@ return /******/ (function(modules) { // webpackBootstrap
|
|||||||
'flowRight': true,
|
'flowRight': true,
|
||||||
'iteratee': true,
|
'iteratee': true,
|
||||||
'mixin': true,
|
'mixin': true,
|
||||||
|
'rearg': true,
|
||||||
'runInContext': true
|
'runInContext': true
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -337,17 +403,18 @@ return /******/ (function(modules) { // webpackBootstrap
|
|||||||
'overArgs': true,
|
'overArgs': true,
|
||||||
'partial': true,
|
'partial': true,
|
||||||
'partialRight': true,
|
'partialRight': true,
|
||||||
|
'propertyOf': true,
|
||||||
'random': true,
|
'random': true,
|
||||||
'range': true,
|
'range': true,
|
||||||
'rangeRight': true,
|
'rangeRight': true,
|
||||||
'subtract': true,
|
'subtract': true,
|
||||||
'without': true,
|
|
||||||
'zip': true,
|
'zip': true,
|
||||||
'zipObject': true
|
'zipObject': true,
|
||||||
|
'zipObjectDeep': true
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/***/ }
|
/***/ })
|
||||||
/******/ ])
|
/******/ ])
|
||||||
});
|
});
|
||||||
;
|
;
|
||||||
3491
doc/README.md
3491
doc/README.md
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,9 @@
|
|||||||
var mapping = require('./_mapping'),
|
var mapping = require('./_mapping'),
|
||||||
mutateMap = mapping.mutate,
|
|
||||||
fallbackHolder = require('./placeholder');
|
fallbackHolder = require('./placeholder');
|
||||||
|
|
||||||
|
/** Built-in value reference. */
|
||||||
|
var push = Array.prototype.push;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a function, with an arity of `n`, that invokes `func` with the
|
* Creates a function, with an arity of `n`, that invokes `func` with the
|
||||||
* arguments it receives.
|
* arguments it receives.
|
||||||
@@ -62,6 +64,37 @@ function createCloner(func) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A specialized version of `_.spread` which flattens the spread array into
|
||||||
|
* the arguments of the invoked `func`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Function} func The function to spread arguments over.
|
||||||
|
* @param {number} start The start position of the spread.
|
||||||
|
* @returns {Function} Returns the new function.
|
||||||
|
*/
|
||||||
|
function flatSpread(func, start) {
|
||||||
|
return function() {
|
||||||
|
var length = arguments.length,
|
||||||
|
lastIndex = length - 1,
|
||||||
|
args = Array(length);
|
||||||
|
|
||||||
|
while (length--) {
|
||||||
|
args[length] = arguments[length];
|
||||||
|
}
|
||||||
|
var array = args[start],
|
||||||
|
otherArgs = args.slice(0, start);
|
||||||
|
|
||||||
|
if (array) {
|
||||||
|
push.apply(otherArgs, array);
|
||||||
|
}
|
||||||
|
if (start != lastIndex) {
|
||||||
|
push.apply(otherArgs, args.slice(start + 1));
|
||||||
|
}
|
||||||
|
return func.apply(this, otherArgs);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a function that wraps `func` and uses `cloner` to clone the first
|
* Creates a function that wraps `func` and uses `cloner` to clone the first
|
||||||
* argument it receives.
|
* argument it receives.
|
||||||
@@ -71,11 +104,11 @@ function createCloner(func) {
|
|||||||
* @param {Function} cloner The function to clone arguments.
|
* @param {Function} cloner The function to clone arguments.
|
||||||
* @returns {Function} Returns the new immutable function.
|
* @returns {Function} Returns the new immutable function.
|
||||||
*/
|
*/
|
||||||
function immutWrap(func, cloner) {
|
function wrapImmutable(func, cloner) {
|
||||||
return function() {
|
return function() {
|
||||||
var length = arguments.length;
|
var length = arguments.length;
|
||||||
if (!length) {
|
if (!length) {
|
||||||
return result;
|
return;
|
||||||
}
|
}
|
||||||
var args = Array(length);
|
var args = Array(length);
|
||||||
while (length--) {
|
while (length--) {
|
||||||
@@ -103,8 +136,7 @@ function immutWrap(func, cloner) {
|
|||||||
* @returns {Function|Object} Returns the converted function or object.
|
* @returns {Function|Object} Returns the converted function or object.
|
||||||
*/
|
*/
|
||||||
function baseConvert(util, name, func, options) {
|
function baseConvert(util, name, func, options) {
|
||||||
var setPlaceholder,
|
var isLib = typeof name == 'function',
|
||||||
isLib = typeof name == 'function',
|
|
||||||
isObj = name === Object(name);
|
isObj = name === Object(name);
|
||||||
|
|
||||||
if (isObj) {
|
if (isObj) {
|
||||||
@@ -125,10 +157,10 @@ function baseConvert(util, name, func, options) {
|
|||||||
'rearg': 'rearg' in options ? options.rearg : true
|
'rearg': 'rearg' in options ? options.rearg : true
|
||||||
};
|
};
|
||||||
|
|
||||||
var forceCurry = ('curry' in options) && options.curry,
|
var defaultHolder = isLib ? func : fallbackHolder,
|
||||||
|
forceCurry = ('curry' in options) && options.curry,
|
||||||
forceFixed = ('fixed' in options) && options.fixed,
|
forceFixed = ('fixed' in options) && options.fixed,
|
||||||
forceRearg = ('rearg' in options) && options.rearg,
|
forceRearg = ('rearg' in options) && options.rearg,
|
||||||
placeholder = isLib ? func : fallbackHolder,
|
|
||||||
pristine = isLib ? func.runInContext() : undefined;
|
pristine = isLib ? func.runInContext() : undefined;
|
||||||
|
|
||||||
var helpers = isLib ? func : {
|
var helpers = isLib ? func : {
|
||||||
@@ -138,11 +170,13 @@ function baseConvert(util, name, func, options) {
|
|||||||
'curry': util.curry,
|
'curry': util.curry,
|
||||||
'forEach': util.forEach,
|
'forEach': util.forEach,
|
||||||
'isArray': util.isArray,
|
'isArray': util.isArray,
|
||||||
|
'isError': util.isError,
|
||||||
'isFunction': util.isFunction,
|
'isFunction': util.isFunction,
|
||||||
|
'isWeakMap': util.isWeakMap,
|
||||||
'iteratee': util.iteratee,
|
'iteratee': util.iteratee,
|
||||||
'keys': util.keys,
|
'keys': util.keys,
|
||||||
'rearg': util.rearg,
|
'rearg': util.rearg,
|
||||||
'spread': util.spread,
|
'toInteger': util.toInteger,
|
||||||
'toPath': util.toPath
|
'toPath': util.toPath
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -152,10 +186,12 @@ function baseConvert(util, name, func, options) {
|
|||||||
curry = helpers.curry,
|
curry = helpers.curry,
|
||||||
each = helpers.forEach,
|
each = helpers.forEach,
|
||||||
isArray = helpers.isArray,
|
isArray = helpers.isArray,
|
||||||
|
isError = helpers.isError,
|
||||||
isFunction = helpers.isFunction,
|
isFunction = helpers.isFunction,
|
||||||
|
isWeakMap = helpers.isWeakMap,
|
||||||
keys = helpers.keys,
|
keys = helpers.keys,
|
||||||
rearg = helpers.rearg,
|
rearg = helpers.rearg,
|
||||||
spread = helpers.spread,
|
toInteger = helpers.toInteger,
|
||||||
toPath = helpers.toPath;
|
toPath = helpers.toPath;
|
||||||
|
|
||||||
var aryMethodKeys = keys(mapping.aryMethod);
|
var aryMethodKeys = keys(mapping.aryMethod);
|
||||||
@@ -189,30 +225,38 @@ function baseConvert(util, name, func, options) {
|
|||||||
if (!isFunction(func)) {
|
if (!isFunction(func)) {
|
||||||
return mixin(func, Object(source));
|
return mixin(func, Object(source));
|
||||||
}
|
}
|
||||||
var methods = [],
|
var pairs = [];
|
||||||
methodNames = [];
|
|
||||||
|
|
||||||
each(keys(source), function(key) {
|
each(keys(source), function(key) {
|
||||||
var value = source[key];
|
if (isFunction(source[key])) {
|
||||||
if (isFunction(value)) {
|
pairs.push([key, func.prototype[key]]);
|
||||||
methodNames.push(key);
|
|
||||||
methods.push(func.prototype[key]);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
mixin(func, Object(source));
|
mixin(func, Object(source));
|
||||||
|
|
||||||
each(methodNames, function(methodName, index) {
|
each(pairs, function(pair) {
|
||||||
var method = methods[index];
|
var value = pair[1];
|
||||||
if (isFunction(method)) {
|
if (isFunction(value)) {
|
||||||
func.prototype[methodName] = method;
|
func.prototype[pair[0]] = value;
|
||||||
} else {
|
} else {
|
||||||
delete func.prototype[methodName];
|
delete func.prototype[pair[0]];
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return func;
|
return func;
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
'nthArg': function(nthArg) {
|
||||||
|
return function(n) {
|
||||||
|
var arity = n < 0 ? 1 : (toInteger(n) + 1);
|
||||||
|
return curry(nthArg(n), arity);
|
||||||
|
};
|
||||||
|
},
|
||||||
|
'rearg': function(rearg) {
|
||||||
|
return function(func, indexes) {
|
||||||
|
var arity = indexes ? indexes.length : 0;
|
||||||
|
return curry(rearg(func, indexes), arity);
|
||||||
|
};
|
||||||
|
},
|
||||||
'runInContext': function(runInContext) {
|
'runInContext': function(runInContext) {
|
||||||
return function(context) {
|
return function(context) {
|
||||||
return baseConvert(util, runInContext(context), options);
|
return baseConvert(util, runInContext(context), options);
|
||||||
@@ -222,6 +266,77 @@ function baseConvert(util, name, func, options) {
|
|||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
/*--------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Casts `func` to a function with an arity capped iteratee if needed.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} name The name of the function to inspect.
|
||||||
|
* @param {Function} func The function to inspect.
|
||||||
|
* @returns {Function} Returns the cast function.
|
||||||
|
*/
|
||||||
|
function castCap(name, func) {
|
||||||
|
if (config.cap) {
|
||||||
|
var indexes = mapping.iterateeRearg[name];
|
||||||
|
if (indexes) {
|
||||||
|
return iterateeRearg(func, indexes);
|
||||||
|
}
|
||||||
|
var n = !isLib && mapping.iterateeAry[name];
|
||||||
|
if (n) {
|
||||||
|
return iterateeAry(func, n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return func;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Casts `func` to a curried function if needed.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} name The name of the function to inspect.
|
||||||
|
* @param {Function} func The function to inspect.
|
||||||
|
* @param {number} n The arity of `func`.
|
||||||
|
* @returns {Function} Returns the cast function.
|
||||||
|
*/
|
||||||
|
function castCurry(name, func, n) {
|
||||||
|
return (forceCurry || (config.curry && n > 1))
|
||||||
|
? curry(func, n)
|
||||||
|
: func;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Casts `func` to a fixed arity function if needed.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} name The name of the function to inspect.
|
||||||
|
* @param {Function} func The function to inspect.
|
||||||
|
* @param {number} n The arity cap.
|
||||||
|
* @returns {Function} Returns the cast function.
|
||||||
|
*/
|
||||||
|
function castFixed(name, func, n) {
|
||||||
|
if (config.fixed && (forceFixed || !mapping.skipFixed[name])) {
|
||||||
|
var data = mapping.methodSpread[name],
|
||||||
|
start = data && data.start;
|
||||||
|
|
||||||
|
return start === undefined ? ary(func, n) : flatSpread(func, start);
|
||||||
|
}
|
||||||
|
return func;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Casts `func` to an rearged function if needed.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} name The name of the function to inspect.
|
||||||
|
* @param {Function} func The function to inspect.
|
||||||
|
* @param {number} n The arity of `func`.
|
||||||
|
* @returns {Function} Returns the cast function.
|
||||||
|
*/
|
||||||
|
function castRearg(name, func, n) {
|
||||||
|
return (config.rearg && n > 1 && (forceRearg || !mapping.skipRearg[name]))
|
||||||
|
? rearg(func, mapping.methodRearg[name] || mapping.aryRearg[n])
|
||||||
|
: func;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a clone of `object` by `path`.
|
* Creates a clone of `object` by `path`.
|
||||||
*
|
*
|
||||||
@@ -235,6 +350,7 @@ function baseConvert(util, name, func, options) {
|
|||||||
|
|
||||||
var index = -1,
|
var index = -1,
|
||||||
length = path.length,
|
length = path.length,
|
||||||
|
lastIndex = length - 1,
|
||||||
result = clone(Object(object)),
|
result = clone(Object(object)),
|
||||||
nested = result;
|
nested = result;
|
||||||
|
|
||||||
@@ -242,8 +358,9 @@ function baseConvert(util, name, func, options) {
|
|||||||
var key = path[index],
|
var key = path[index],
|
||||||
value = nested[key];
|
value = nested[key];
|
||||||
|
|
||||||
if (value != null) {
|
if (value != null &&
|
||||||
nested[key] = clone(Object(value));
|
!(isFunction(value) || isError(value) || isWeakMap(value))) {
|
||||||
|
nested[key] = clone(index == lastIndex ? value : Object(value));
|
||||||
}
|
}
|
||||||
nested = nested[key];
|
nested = nested[key];
|
||||||
}
|
}
|
||||||
@@ -269,13 +386,16 @@ function baseConvert(util, name, func, options) {
|
|||||||
* @returns {Function} Returns the new converter function.
|
* @returns {Function} Returns the new converter function.
|
||||||
*/
|
*/
|
||||||
function createConverter(name, func) {
|
function createConverter(name, func) {
|
||||||
var oldOptions = options;
|
var realName = mapping.aliasToReal[name] || name,
|
||||||
|
methodName = mapping.remap[realName] || realName,
|
||||||
|
oldOptions = options;
|
||||||
|
|
||||||
return function(options) {
|
return function(options) {
|
||||||
var newUtil = isLib ? pristine : helpers,
|
var newUtil = isLib ? pristine : helpers,
|
||||||
newFunc = isLib ? pristine[name] : func,
|
newFunc = isLib ? pristine[methodName] : func,
|
||||||
newOptions = assign(assign({}, oldOptions), options);
|
newOptions = assign(assign({}, oldOptions), options);
|
||||||
|
|
||||||
return baseConvert(newUtil, name, newFunc, newOptions);
|
return baseConvert(newUtil, realName, newFunc, newOptions);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -313,12 +433,11 @@ function baseConvert(util, name, func, options) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a function that invokes `func` with its first argument passed
|
* Creates a function that invokes `func` with its first argument transformed.
|
||||||
* thru `transform`.
|
|
||||||
*
|
*
|
||||||
* @private
|
* @private
|
||||||
* @param {Function} func The function to wrap.
|
* @param {Function} func The function to wrap.
|
||||||
* @param {...Function} transform The functions to transform the first argument.
|
* @param {Function} transform The argument transform.
|
||||||
* @returns {Function} Returns the new function.
|
* @returns {Function} Returns the new function.
|
||||||
*/
|
*/
|
||||||
function overArg(func, transform) {
|
function overArg(func, transform) {
|
||||||
@@ -346,54 +465,38 @@ function baseConvert(util, name, func, options) {
|
|||||||
* @param {Function} func The function to wrap.
|
* @param {Function} func The function to wrap.
|
||||||
* @returns {Function} Returns the converted function.
|
* @returns {Function} Returns the converted function.
|
||||||
*/
|
*/
|
||||||
function wrap(name, func) {
|
function wrap(name, func, placeholder) {
|
||||||
name = mapping.aliasToReal[name] || name;
|
|
||||||
|
|
||||||
var result,
|
var result,
|
||||||
|
realName = mapping.aliasToReal[name] || name,
|
||||||
wrapped = func,
|
wrapped = func,
|
||||||
wrapper = wrappers[name];
|
wrapper = wrappers[realName];
|
||||||
|
|
||||||
if (wrapper) {
|
if (wrapper) {
|
||||||
wrapped = wrapper(func);
|
wrapped = wrapper(func);
|
||||||
}
|
}
|
||||||
else if (config.immutable) {
|
else if (config.immutable) {
|
||||||
if (mutateMap.array[name]) {
|
if (mapping.mutate.array[realName]) {
|
||||||
wrapped = immutWrap(func, cloneArray);
|
wrapped = wrapImmutable(func, cloneArray);
|
||||||
}
|
}
|
||||||
else if (mutateMap.object[name]) {
|
else if (mapping.mutate.object[realName]) {
|
||||||
wrapped = immutWrap(func, createCloner(func));
|
wrapped = wrapImmutable(func, createCloner(func));
|
||||||
}
|
}
|
||||||
else if (mutateMap.set[name]) {
|
else if (mapping.mutate.set[realName]) {
|
||||||
wrapped = immutWrap(func, cloneByPath);
|
wrapped = wrapImmutable(func, cloneByPath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
each(aryMethodKeys, function(aryKey) {
|
each(aryMethodKeys, function(aryKey) {
|
||||||
each(mapping.aryMethod[aryKey], function(otherName) {
|
each(mapping.aryMethod[aryKey], function(otherName) {
|
||||||
if (name == otherName) {
|
if (realName == otherName) {
|
||||||
var aryN = !isLib && mapping.iterateeAry[name],
|
var data = mapping.methodSpread[realName],
|
||||||
reargIndexes = mapping.iterateeRearg[name],
|
afterRearg = data && data.afterRearg;
|
||||||
spreadStart = mapping.methodSpread[name];
|
|
||||||
|
|
||||||
result = wrapped;
|
result = afterRearg
|
||||||
if (config.fixed && (forceFixed || !mapping.skipFixed[name])) {
|
? castFixed(realName, castRearg(realName, wrapped, aryKey), aryKey)
|
||||||
result = spreadStart === undefined
|
: castRearg(realName, castFixed(realName, wrapped, aryKey), aryKey);
|
||||||
? ary(result, aryKey)
|
|
||||||
: spread(result, spreadStart);
|
result = castCap(realName, result);
|
||||||
}
|
result = castCurry(realName, result, aryKey);
|
||||||
if (config.rearg && aryKey > 1 && (forceRearg || !mapping.skipRearg[name])) {
|
|
||||||
result = rearg(result, mapping.methodRearg[name] || mapping.aryRearg[aryKey]);
|
|
||||||
}
|
|
||||||
if (config.cap) {
|
|
||||||
if (reargIndexes) {
|
|
||||||
result = iterateeRearg(result, reargIndexes);
|
|
||||||
} else if (aryN) {
|
|
||||||
result = iterateeAry(result, aryN);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (forceCurry || (config.curry && aryKey > 1)) {
|
|
||||||
forceCurry && console.log(forceCurry, name);
|
|
||||||
result = curry(result, aryKey);
|
|
||||||
}
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -406,18 +509,16 @@ function baseConvert(util, name, func, options) {
|
|||||||
return func.apply(this, arguments);
|
return func.apply(this, arguments);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
result.convert = createConverter(name, func);
|
result.convert = createConverter(realName, func);
|
||||||
if (mapping.placeholder[name]) {
|
result.placeholder = func.placeholder = placeholder;
|
||||||
setPlaceholder = true;
|
|
||||||
result.placeholder = func.placeholder = placeholder;
|
|
||||||
}
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
/*--------------------------------------------------------------------------*/
|
||||||
|
|
||||||
if (!isObj) {
|
if (!isObj) {
|
||||||
return wrap(name, func);
|
return wrap(name, func, defaultHolder);
|
||||||
}
|
}
|
||||||
var _ = func;
|
var _ = func;
|
||||||
|
|
||||||
@@ -427,7 +528,7 @@ function baseConvert(util, name, func, options) {
|
|||||||
each(mapping.aryMethod[aryKey], function(key) {
|
each(mapping.aryMethod[aryKey], function(key) {
|
||||||
var func = _[mapping.remap[key] || key];
|
var func = _[mapping.remap[key] || key];
|
||||||
if (func) {
|
if (func) {
|
||||||
pairs.push([key, wrap(key, func)]);
|
pairs.push([key, wrap(key, func, _)]);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -453,9 +554,8 @@ function baseConvert(util, name, func, options) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
_.convert = convertLib;
|
_.convert = convertLib;
|
||||||
if (setPlaceholder) {
|
_.placeholder = _;
|
||||||
_.placeholder = placeholder;
|
|
||||||
}
|
|
||||||
// Assign aliases.
|
// Assign aliases.
|
||||||
each(keys(_), function(key) {
|
each(keys(_), function(key) {
|
||||||
each(mapping.realToAlias[key] || [], function(alias) {
|
each(mapping.realToAlias[key] || [], function(alias) {
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ function browserConvert(lodash, options) {
|
|||||||
return baseConvert(lodash, lodash, options);
|
return baseConvert(lodash, lodash, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (typeof _ == 'function') {
|
if (typeof _ == 'function' && typeof _.runInContext == 'function') {
|
||||||
_ = browserConvert(_.runInContext());
|
_ = browserConvert(_.runInContext());
|
||||||
}
|
}
|
||||||
module.exports = browserConvert;
|
module.exports = browserConvert;
|
||||||
|
|||||||
181
fp/_mapping.js
181
fp/_mapping.js
@@ -7,11 +7,20 @@ exports.aliasToReal = {
|
|||||||
'entries': 'toPairs',
|
'entries': 'toPairs',
|
||||||
'entriesIn': 'toPairsIn',
|
'entriesIn': 'toPairsIn',
|
||||||
'extend': 'assignIn',
|
'extend': 'assignIn',
|
||||||
|
'extendAll': 'assignInAll',
|
||||||
|
'extendAllWith': 'assignInAllWith',
|
||||||
'extendWith': 'assignInWith',
|
'extendWith': 'assignInWith',
|
||||||
'first': 'head',
|
'first': 'head',
|
||||||
|
|
||||||
|
// Methods that are curried variants of others.
|
||||||
|
'conforms': 'conformsTo',
|
||||||
|
'matches': 'isMatch',
|
||||||
|
'property': 'get',
|
||||||
|
|
||||||
// Ramda aliases.
|
// Ramda aliases.
|
||||||
'__': 'placeholder',
|
'__': 'placeholder',
|
||||||
|
'F': 'stubFalse',
|
||||||
|
'T': 'stubTrue',
|
||||||
'all': 'every',
|
'all': 'every',
|
||||||
'allPass': 'overEvery',
|
'allPass': 'overEvery',
|
||||||
'always': 'constant',
|
'always': 'constant',
|
||||||
@@ -25,68 +34,84 @@ exports.aliasToReal = {
|
|||||||
'contains': 'includes',
|
'contains': 'includes',
|
||||||
'dissoc': 'unset',
|
'dissoc': 'unset',
|
||||||
'dissocPath': 'unset',
|
'dissocPath': 'unset',
|
||||||
|
'dropLast': 'dropRight',
|
||||||
|
'dropLastWhile': 'dropRightWhile',
|
||||||
'equals': 'isEqual',
|
'equals': 'isEqual',
|
||||||
'identical': 'eq',
|
'identical': 'eq',
|
||||||
|
'indexBy': 'keyBy',
|
||||||
'init': 'initial',
|
'init': 'initial',
|
||||||
'invertObj': 'invert',
|
'invertObj': 'invert',
|
||||||
'juxt': 'over',
|
'juxt': 'over',
|
||||||
'mapObj': 'mapValues',
|
|
||||||
'omitAll': 'omit',
|
'omitAll': 'omit',
|
||||||
'nAry': 'ary',
|
'nAry': 'ary',
|
||||||
'path': 'get',
|
'path': 'get',
|
||||||
'pathEq': 'matchesProperty',
|
'pathEq': 'matchesProperty',
|
||||||
'pathOr': 'getOr',
|
'pathOr': 'getOr',
|
||||||
|
'paths': 'at',
|
||||||
'pickAll': 'pick',
|
'pickAll': 'pick',
|
||||||
'pipe': 'flow',
|
'pipe': 'flow',
|
||||||
|
'pluck': 'map',
|
||||||
'prop': 'get',
|
'prop': 'get',
|
||||||
'propOf': 'propertyOf',
|
'propEq': 'matchesProperty',
|
||||||
'propOr': 'getOr',
|
'propOr': 'getOr',
|
||||||
|
'props': 'at',
|
||||||
|
'symmetricDifference': 'xor',
|
||||||
|
'symmetricDifferenceBy': 'xorBy',
|
||||||
|
'symmetricDifferenceWith': 'xorWith',
|
||||||
|
'takeLast': 'takeRight',
|
||||||
|
'takeLastWhile': 'takeRightWhile',
|
||||||
'unapply': 'rest',
|
'unapply': 'rest',
|
||||||
'unnest': 'flatten',
|
'unnest': 'flatten',
|
||||||
'useWith': 'overArgs',
|
'useWith': 'overArgs',
|
||||||
'whereEq': 'filter',
|
'where': 'conformsTo',
|
||||||
|
'whereEq': 'isMatch',
|
||||||
'zipObj': 'zipObject'
|
'zipObj': 'zipObject'
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Used to map ary to method names. */
|
/** Used to map ary to method names. */
|
||||||
exports.aryMethod = {
|
exports.aryMethod = {
|
||||||
'1': [
|
'1': [
|
||||||
'attempt', 'castArray', 'ceil', 'create', 'curry', 'curryRight', 'floor',
|
'assignAll', 'assignInAll', 'attempt', 'castArray', 'ceil', 'create',
|
||||||
'flow', 'flowRight', 'fromPairs', 'invert', 'iteratee', 'memoize', 'method',
|
'curry', 'curryRight', 'defaultsAll', 'defaultsDeepAll', 'floor', 'flow',
|
||||||
'methodOf', 'mixin', 'over', 'overEvery', 'overSome', 'rest', 'reverse',
|
'flowRight', 'fromPairs', 'invert', 'iteratee', 'memoize', 'method', 'mergeAll',
|
||||||
|
'methodOf', 'mixin', 'nthArg', 'over', 'overEvery', 'overSome','rest', 'reverse',
|
||||||
'round', 'runInContext', 'spread', 'template', 'trim', 'trimEnd', 'trimStart',
|
'round', 'runInContext', 'spread', 'template', 'trim', 'trimEnd', 'trimStart',
|
||||||
'uniqueId', 'words'
|
'uniqueId', 'words', 'zipAll'
|
||||||
],
|
],
|
||||||
'2': [
|
'2': [
|
||||||
'add', 'after', 'ary', 'assign', 'assignIn', 'at', 'before', 'bind', 'bindAll',
|
'add', 'after', 'ary', 'assign', 'assignAllWith', 'assignIn', 'assignInAllWith',
|
||||||
'bindKey', 'chunk', 'cloneDeepWith', 'cloneWith', 'concat', 'countBy', 'curryN',
|
'at', 'before', 'bind', 'bindAll', 'bindKey', 'chunk', 'cloneDeepWith',
|
||||||
'curryRightN', 'debounce', 'defaults', 'defaultsDeep', 'delay', 'difference',
|
'cloneWith', 'concat', 'conformsTo', 'countBy', 'curryN', 'curryRightN',
|
||||||
'divide', 'drop', 'dropRight', 'dropRightWhile', 'dropWhile', 'endsWith',
|
'debounce', 'defaults', 'defaultsDeep', 'defaultTo', 'delay', 'difference',
|
||||||
'eq', 'every', 'filter', 'find', 'find', 'findIndex', 'findKey', 'findLast',
|
'divide', 'drop', 'dropRight', 'dropRightWhile', 'dropWhile', 'endsWith', 'eq',
|
||||||
'findLastIndex', 'findLastKey', 'flatMap', 'flatMapDeep', 'flattenDepth',
|
'every', 'filter', 'find', 'findIndex', 'findKey', 'findLast', 'findLastIndex',
|
||||||
'forEach', 'forEachRight', 'forIn', 'forInRight', 'forOwn', 'forOwnRight',
|
'findLastKey', 'flatMap', 'flatMapDeep', 'flattenDepth', 'forEach',
|
||||||
'get', 'groupBy', 'gt', 'gte', 'has', 'hasIn', 'includes', 'indexOf',
|
'forEachRight', 'forIn', 'forInRight', 'forOwn', 'forOwnRight', 'get',
|
||||||
'intersection', 'invertBy', 'invoke', 'invokeMap', 'isEqual', 'isMatch',
|
'groupBy', 'gt', 'gte', 'has', 'hasIn', 'includes', 'indexOf', 'intersection',
|
||||||
'join', 'keyBy', 'lastIndexOf', 'lt', 'lte', 'map', 'mapKeys', 'mapValues',
|
'invertBy', 'invoke', 'invokeMap', 'isEqual', 'isMatch', 'join', 'keyBy',
|
||||||
'matchesProperty', 'maxBy', 'meanBy', 'merge', 'minBy', 'multiply', 'omit', 'omitBy',
|
'lastIndexOf', 'lt', 'lte', 'map', 'mapKeys', 'mapValues', 'matchesProperty',
|
||||||
'overArgs', 'pad', 'padEnd', 'padStart', 'parseInt', 'partial', 'partialRight',
|
'maxBy', 'meanBy', 'merge', 'mergeAllWith', 'minBy', 'multiply', 'nth', 'omit',
|
||||||
'partition', 'pick', 'pickBy', 'pull', 'pullAll', 'pullAt', 'random', 'range',
|
'omitBy', 'overArgs', 'pad', 'padEnd', 'padStart', 'parseInt', 'partial',
|
||||||
'rangeRight', 'rearg', 'reject', 'remove', 'repeat', 'restFrom', 'result',
|
'partialRight', 'partition', 'pick', 'pickBy', 'propertyOf', 'pull', 'pullAll',
|
||||||
'sampleSize', 'some', 'sortBy', 'sortedIndex', 'sortedIndexOf', 'sortedLastIndex',
|
'pullAt', 'random', 'range', 'rangeRight', 'rearg', 'reject', 'remove',
|
||||||
'sortedLastIndexOf', 'sortedUniqBy', 'split', 'spreadFrom', 'startsWith',
|
'repeat', 'restFrom', 'result', 'sampleSize', 'some', 'sortBy', 'sortedIndex',
|
||||||
'subtract', 'sumBy', 'take', 'takeRight', 'takeRightWhile', 'takeWhile', 'tap',
|
'sortedIndexOf', 'sortedLastIndex', 'sortedLastIndexOf', 'sortedUniqBy',
|
||||||
'throttle', 'thru', 'times', 'trimChars', 'trimCharsEnd', 'trimCharsStart',
|
'split', 'spreadFrom', 'startsWith', 'subtract', 'sumBy', 'take', 'takeRight',
|
||||||
'truncate', 'union', 'uniqBy', 'uniqWith', 'unset', 'unzipWith', 'without',
|
'takeRightWhile', 'takeWhile', 'tap', 'throttle', 'thru', 'times', 'trimChars',
|
||||||
'wrap', 'xor', 'zip', 'zipObject', 'zipObjectDeep'
|
'trimCharsEnd', 'trimCharsStart', 'truncate', 'union', 'uniqBy', 'uniqWith',
|
||||||
|
'unset', 'unzipWith', 'without', 'wrap', 'xor', 'zip', 'zipObject',
|
||||||
|
'zipObjectDeep'
|
||||||
],
|
],
|
||||||
'3': [
|
'3': [
|
||||||
'assignInWith', 'assignWith', 'clamp', 'differenceBy', 'differenceWith',
|
'assignInWith', 'assignWith', 'clamp', 'differenceBy', 'differenceWith',
|
||||||
'getOr', 'inRange', 'intersectionBy', 'intersectionWith', 'invokeArgs',
|
'findFrom', 'findIndexFrom', 'findLastFrom', 'findLastIndexFrom', 'getOr',
|
||||||
'invokeArgsMap', 'isEqualWith', 'isMatchWith', 'flatMapDepth', 'mergeWith',
|
'includesFrom', 'indexOfFrom', 'inRange', 'intersectionBy', 'intersectionWith',
|
||||||
'orderBy', 'padChars', 'padCharsEnd', 'padCharsStart', 'pullAllBy',
|
'invokeArgs', 'invokeArgsMap', 'isEqualWith', 'isMatchWith', 'flatMapDepth',
|
||||||
'pullAllWith', 'reduce', 'reduceRight', 'replace', 'set', 'slice',
|
'lastIndexOfFrom', 'mergeWith', 'orderBy', 'padChars', 'padCharsEnd',
|
||||||
'sortedIndexBy', 'sortedLastIndexBy', 'transform', 'unionBy', 'unionWith',
|
'padCharsStart', 'pullAllBy', 'pullAllWith', 'rangeStep', 'rangeStepRight',
|
||||||
'update', 'xorBy', 'xorWith', 'zipWith'
|
'reduce', 'reduceRight', 'replace', 'set', 'slice', 'sortedIndexBy',
|
||||||
|
'sortedLastIndexBy', 'transform', 'unionBy', 'unionWith', 'update', 'xorBy',
|
||||||
|
'xorWith', 'zipWith'
|
||||||
],
|
],
|
||||||
'4': [
|
'4': [
|
||||||
'fill', 'setWith', 'updateWith'
|
'fill', 'setWith', 'updateWith'
|
||||||
@@ -107,10 +132,14 @@ exports.iterateeAry = {
|
|||||||
'every': 1,
|
'every': 1,
|
||||||
'filter': 1,
|
'filter': 1,
|
||||||
'find': 1,
|
'find': 1,
|
||||||
|
'findFrom': 1,
|
||||||
'findIndex': 1,
|
'findIndex': 1,
|
||||||
|
'findIndexFrom': 1,
|
||||||
'findKey': 1,
|
'findKey': 1,
|
||||||
'findLast': 1,
|
'findLast': 1,
|
||||||
|
'findLastFrom': 1,
|
||||||
'findLastIndex': 1,
|
'findLastIndex': 1,
|
||||||
|
'findLastIndexFrom': 1,
|
||||||
'findLastKey': 1,
|
'findLastKey': 1,
|
||||||
'flatMap': 1,
|
'flatMap': 1,
|
||||||
'flatMapDeep': 1,
|
'flatMapDeep': 1,
|
||||||
@@ -138,40 +167,59 @@ exports.iterateeAry = {
|
|||||||
|
|
||||||
/** Used to map method names to iteratee rearg configs. */
|
/** Used to map method names to iteratee rearg configs. */
|
||||||
exports.iterateeRearg = {
|
exports.iterateeRearg = {
|
||||||
'mapKeys': [1]
|
'mapKeys': [1],
|
||||||
|
'reduceRight': [1, 0]
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Used to map method names to rearg configs. */
|
/** Used to map method names to rearg configs. */
|
||||||
exports.methodRearg = {
|
exports.methodRearg = {
|
||||||
|
'assignInAllWith': [1, 0],
|
||||||
'assignInWith': [1, 2, 0],
|
'assignInWith': [1, 2, 0],
|
||||||
|
'assignAllWith': [1, 0],
|
||||||
'assignWith': [1, 2, 0],
|
'assignWith': [1, 2, 0],
|
||||||
|
'differenceBy': [1, 2, 0],
|
||||||
|
'differenceWith': [1, 2, 0],
|
||||||
'getOr': [2, 1, 0],
|
'getOr': [2, 1, 0],
|
||||||
|
'intersectionBy': [1, 2, 0],
|
||||||
|
'intersectionWith': [1, 2, 0],
|
||||||
'isEqualWith': [1, 2, 0],
|
'isEqualWith': [1, 2, 0],
|
||||||
'isMatchWith': [2, 1, 0],
|
'isMatchWith': [2, 1, 0],
|
||||||
|
'mergeAllWith': [1, 0],
|
||||||
'mergeWith': [1, 2, 0],
|
'mergeWith': [1, 2, 0],
|
||||||
'padChars': [2, 1, 0],
|
'padChars': [2, 1, 0],
|
||||||
'padCharsEnd': [2, 1, 0],
|
'padCharsEnd': [2, 1, 0],
|
||||||
'padCharsStart': [2, 1, 0],
|
'padCharsStart': [2, 1, 0],
|
||||||
'pullAllBy': [2, 1, 0],
|
'pullAllBy': [2, 1, 0],
|
||||||
'pullAllWith': [2, 1, 0],
|
'pullAllWith': [2, 1, 0],
|
||||||
|
'rangeStep': [1, 2, 0],
|
||||||
|
'rangeStepRight': [1, 2, 0],
|
||||||
'setWith': [3, 1, 2, 0],
|
'setWith': [3, 1, 2, 0],
|
||||||
'sortedIndexBy': [2, 1, 0],
|
'sortedIndexBy': [2, 1, 0],
|
||||||
'sortedLastIndexBy': [2, 1, 0],
|
'sortedLastIndexBy': [2, 1, 0],
|
||||||
|
'unionBy': [1, 2, 0],
|
||||||
|
'unionWith': [1, 2, 0],
|
||||||
'updateWith': [3, 1, 2, 0],
|
'updateWith': [3, 1, 2, 0],
|
||||||
|
'xorBy': [1, 2, 0],
|
||||||
|
'xorWith': [1, 2, 0],
|
||||||
'zipWith': [1, 2, 0]
|
'zipWith': [1, 2, 0]
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Used to map method names to spread configs. */
|
/** Used to map method names to spread configs. */
|
||||||
exports.methodSpread = {
|
exports.methodSpread = {
|
||||||
'invokeArgs': 2,
|
'assignAll': { 'start': 0 },
|
||||||
'invokeArgsMap': 2,
|
'assignAllWith': { 'start': 0 },
|
||||||
'over': 0,
|
'assignInAll': { 'start': 0 },
|
||||||
'overArgs': 1,
|
'assignInAllWith': { 'start': 0 },
|
||||||
'overEvery': 0,
|
'defaultsAll': { 'start': 0 },
|
||||||
'overSome': 0,
|
'defaultsDeepAll': { 'start': 0 },
|
||||||
'partial': 1,
|
'invokeArgs': { 'start': 2 },
|
||||||
'partialRight': 1,
|
'invokeArgsMap': { 'start': 2 },
|
||||||
'without': 1
|
'mergeAll': { 'start': 0 },
|
||||||
|
'mergeAllWith': { 'start': 0 },
|
||||||
|
'partial': { 'start': 1 },
|
||||||
|
'partialRight': { 'start': 1 },
|
||||||
|
'without': { 'start': 1 },
|
||||||
|
'zipAll': { 'start': 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Used to identify methods which mutate arrays or objects. */
|
/** Used to identify methods which mutate arrays or objects. */
|
||||||
@@ -188,13 +236,21 @@ exports.mutate = {
|
|||||||
},
|
},
|
||||||
'object': {
|
'object': {
|
||||||
'assign': true,
|
'assign': true,
|
||||||
|
'assignAll': true,
|
||||||
|
'assignAllWith': true,
|
||||||
'assignIn': true,
|
'assignIn': true,
|
||||||
|
'assignInAll': true,
|
||||||
|
'assignInAllWith': true,
|
||||||
'assignInWith': true,
|
'assignInWith': true,
|
||||||
'assignWith': true,
|
'assignWith': true,
|
||||||
'defaults': true,
|
'defaults': true,
|
||||||
|
'defaultsAll': true,
|
||||||
'defaultsDeep': true,
|
'defaultsDeep': true,
|
||||||
|
'defaultsDeepAll': true,
|
||||||
'merge': true,
|
'merge': true,
|
||||||
'mergeWith': true
|
'mergeAll': true,
|
||||||
|
'mergeAllWith': true,
|
||||||
|
'mergeWith': true,
|
||||||
},
|
},
|
||||||
'set': {
|
'set': {
|
||||||
'set': true,
|
'set': true,
|
||||||
@@ -205,16 +261,6 @@ exports.mutate = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Used to track methods with placeholder support */
|
|
||||||
exports.placeholder = {
|
|
||||||
'bind': true,
|
|
||||||
'bindKey': true,
|
|
||||||
'curry': true,
|
|
||||||
'curryRight': true,
|
|
||||||
'partial': true,
|
|
||||||
'partialRight': true
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Used to map real names to their aliases. */
|
/** Used to map real names to their aliases. */
|
||||||
exports.realToAlias = (function() {
|
exports.realToAlias = (function() {
|
||||||
var hasOwnProperty = Object.prototype.hasOwnProperty,
|
var hasOwnProperty = Object.prototype.hasOwnProperty,
|
||||||
@@ -234,19 +280,38 @@ exports.realToAlias = (function() {
|
|||||||
|
|
||||||
/** Used to map method names to other names. */
|
/** Used to map method names to other names. */
|
||||||
exports.remap = {
|
exports.remap = {
|
||||||
|
'assignAll': 'assign',
|
||||||
|
'assignAllWith': 'assignWith',
|
||||||
|
'assignInAll': 'assignIn',
|
||||||
|
'assignInAllWith': 'assignInWith',
|
||||||
'curryN': 'curry',
|
'curryN': 'curry',
|
||||||
'curryRightN': 'curryRight',
|
'curryRightN': 'curryRight',
|
||||||
|
'defaultsAll': 'defaults',
|
||||||
|
'defaultsDeepAll': 'defaultsDeep',
|
||||||
|
'findFrom': 'find',
|
||||||
|
'findIndexFrom': 'findIndex',
|
||||||
|
'findLastFrom': 'findLast',
|
||||||
|
'findLastIndexFrom': 'findLastIndex',
|
||||||
'getOr': 'get',
|
'getOr': 'get',
|
||||||
|
'includesFrom': 'includes',
|
||||||
|
'indexOfFrom': 'indexOf',
|
||||||
'invokeArgs': 'invoke',
|
'invokeArgs': 'invoke',
|
||||||
'invokeArgsMap': 'invokeMap',
|
'invokeArgsMap': 'invokeMap',
|
||||||
|
'lastIndexOfFrom': 'lastIndexOf',
|
||||||
|
'mergeAll': 'merge',
|
||||||
|
'mergeAllWith': 'mergeWith',
|
||||||
'padChars': 'pad',
|
'padChars': 'pad',
|
||||||
'padCharsEnd': 'padEnd',
|
'padCharsEnd': 'padEnd',
|
||||||
'padCharsStart': 'padStart',
|
'padCharsStart': 'padStart',
|
||||||
|
'propertyOf': 'get',
|
||||||
|
'rangeStep': 'range',
|
||||||
|
'rangeStepRight': 'rangeRight',
|
||||||
'restFrom': 'rest',
|
'restFrom': 'rest',
|
||||||
'spreadFrom': 'spread',
|
'spreadFrom': 'spread',
|
||||||
'trimChars': 'trim',
|
'trimChars': 'trim',
|
||||||
'trimCharsEnd': 'trimEnd',
|
'trimCharsEnd': 'trimEnd',
|
||||||
'trimCharsStart': 'trimStart'
|
'trimCharsStart': 'trimStart',
|
||||||
|
'zipAll': 'zip'
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Used to track methods that skip fixing their arity. */
|
/** Used to track methods that skip fixing their arity. */
|
||||||
@@ -256,6 +321,7 @@ exports.skipFixed = {
|
|||||||
'flowRight': true,
|
'flowRight': true,
|
||||||
'iteratee': true,
|
'iteratee': true,
|
||||||
'mixin': true,
|
'mixin': true,
|
||||||
|
'rearg': true,
|
||||||
'runInContext': true
|
'runInContext': true
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -281,11 +347,12 @@ exports.skipRearg = {
|
|||||||
'overArgs': true,
|
'overArgs': true,
|
||||||
'partial': true,
|
'partial': true,
|
||||||
'partialRight': true,
|
'partialRight': true,
|
||||||
|
'propertyOf': true,
|
||||||
'random': true,
|
'random': true,
|
||||||
'range': true,
|
'range': true,
|
||||||
'rangeRight': true,
|
'rangeRight': true,
|
||||||
'subtract': true,
|
'subtract': true,
|
||||||
'without': true,
|
|
||||||
'zip': true,
|
'zip': true,
|
||||||
'zipObject': true
|
'zipObject': true,
|
||||||
|
'zipObjectDeep': true
|
||||||
};
|
};
|
||||||
|
|||||||
184
incident_response_plan.md
Normal file
184
incident_response_plan.md
Normal file
@@ -0,0 +1,184 @@
|
|||||||
|
# Incident Response Plan
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
Security is a top priority for Lodash. This document outlines the **formal process** for handling **security reports**, including how to **triage**, **assess**, and **disclose** vulnerabilities responsibly.
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
The [Security Triage Team][] will use this document as a process guide when a security vulnerability is reported, from triage to resolution. This process must align with the project's [SECURITY policy](SECURITY.md) and cannot diverge significantly.
|
||||||
|
|
||||||
|
|
||||||
|
## Security Report Handling Flowchart
|
||||||
|
The following diagram details the **decision-making process** for handling security reports:
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart TD
|
||||||
|
A[Security Report Received] --> B[Assign Security Report Coordinator]
|
||||||
|
B --> E{Premature Disclosure?}
|
||||||
|
|
||||||
|
E -- No --> J[Proceed with Standard Private Process]
|
||||||
|
E -- Yes --> F[Privatize Disclosure]
|
||||||
|
F --> G[Handle Related PRs & Issues]
|
||||||
|
G --> H[Request GitHub to Remove Public PR/Issues]
|
||||||
|
H --> I[Create Public Placeholder Issue]
|
||||||
|
I --> J[Acknowledge within 5 days to the Reporter]
|
||||||
|
J --> K[Create Issue in Triage Repo for Visibility]
|
||||||
|
|
||||||
|
K --> L[Assess Report]
|
||||||
|
L --> M{Enough Information?}
|
||||||
|
|
||||||
|
M -- No --> N[Request Additional Info]
|
||||||
|
N --> L[Assess Report]
|
||||||
|
|
||||||
|
M -- Yes --> O{Valid Vulnerability?}
|
||||||
|
O -- No --> X[Close Report as Invalid]
|
||||||
|
X --> Y[Acknowledge within 10 days to the Reporter]
|
||||||
|
|
||||||
|
O -- Yes --> Q[Create Advisory]
|
||||||
|
Q --> Q1[Calculate CVSS Score]
|
||||||
|
Q1 --> Q2[Request a CVE]
|
||||||
|
|
||||||
|
Q2 --> R{Patch Required?}
|
||||||
|
|
||||||
|
R -- No --> Z[Public Disclosure]
|
||||||
|
|
||||||
|
R -- Yes --> T[Develop Patch]
|
||||||
|
T --> U[Test Solution]
|
||||||
|
U --> V[Add Regression Testing]
|
||||||
|
V --> W[Create a Security Release with CVE Included]
|
||||||
|
W --> Z[Public Disclosure]
|
||||||
|
Z --> Z1[Notify Community]
|
||||||
|
Z1 --> Z2[Official Blog Post]
|
||||||
|
Z1 --> Z3[Social Media Announcements]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Roles & Responsibilities
|
||||||
|
|
||||||
|
### Finder
|
||||||
|
|
||||||
|
This person identifies a potential security vulnerability in the project. The Finder may or may not be the same person as the Reporter. If the Finder is not the Reporter, they may share the details with someone else who submits the report to the Security Triage Team.
|
||||||
|
|
||||||
|
**Responsibilities**
|
||||||
|
- Identify potential security vulnerabilities in the project.
|
||||||
|
- Share sufficient details about the vulnerability with the Reporter or directly with the Security Triage Team.
|
||||||
|
|
||||||
|
**Expectations**
|
||||||
|
- Follow responsible disclosure guidelines by ensuring the vulnerability is reported privately before public disclosure.
|
||||||
|
- Provide clear and accurate information about the vulnerability to facilitate the reporting process.
|
||||||
|
|
||||||
|
### Reporter
|
||||||
|
|
||||||
|
This person submits a security report to the Security Triage Team and provides detailed information about the suspected vulnerability. It is expected that the Reporter will cooperate with the Security Triage Team during this process and follow responsible disclosure guidelines.
|
||||||
|
|
||||||
|
**Responsibilities**
|
||||||
|
- Submit a security report to the Security Triage Team.
|
||||||
|
|
||||||
|
**Expectations**
|
||||||
|
- Provide detailed information about the suspected vulnerability.
|
||||||
|
- Follow responsible disclosure guidelines (report privately before public disclosure).
|
||||||
|
- Cooperate with the Security Triage Team by providing additional details when needed.
|
||||||
|
- Test and verify patches (when applicable).
|
||||||
|
- Respect security timelines and avoid premature public disclosure.
|
||||||
|
|
||||||
|
### Coordinator
|
||||||
|
|
||||||
|
This person acts as the focal point for a specific security report and ensures the report follows all responsible disclosure guidelines. The SRC coordinates the remediation process if a vulnerability is confirmed and ensures that the security report follows the process and necessary actions are taken. While the SRC is not necessarily responsible for performing analysis, remediation, or patching, they may take on these tasks if they also hold the role of Analyst or Remediation Developer.
|
||||||
|
|
||||||
|
**Responsibilities**
|
||||||
|
- Acknowledge receipt of security reports within the required timeframe.
|
||||||
|
- Orchestrate the embargo and identify the minimum set of individuals involved.
|
||||||
|
- Remind everyone involved that they must not notify/involve any other individuals. If someone else needs to be involved, that must go through the Coordinator.
|
||||||
|
- Assign an Analyst to assess and validate the report.
|
||||||
|
- Ensure communication with the reporter throughout the process.
|
||||||
|
- Coordinate the remediation process if a vulnerability is confirmed.
|
||||||
|
- Oversee the advisory & CVE request process if applicable.
|
||||||
|
- Escalate critical vulnerabilities when necessary.
|
||||||
|
- Track all security reports for visibility and reporting.
|
||||||
|
|
||||||
|
**Requirements**
|
||||||
|
- Must be a member of the Security Triage Team.
|
||||||
|
|
||||||
|
|
||||||
|
### Analyst
|
||||||
|
|
||||||
|
**Responsibilities**
|
||||||
|
- Determine if the reported issue is a real vulnerability, and is in within the scope of our [threat model](threat-model.md)
|
||||||
|
- Validate proof-of-concept exploits
|
||||||
|
- Assess the security report and determine its severity (assist in CVSS).
|
||||||
|
- Validate the reported vulnerability against best practices.
|
||||||
|
- Identify potential mitigation strategies and workarounds.
|
||||||
|
- Prepare a report for the Security Report Coordinator.
|
||||||
|
|
||||||
|
### Remediation Developer
|
||||||
|
|
||||||
|
**Responsibilities**
|
||||||
|
- Develop a patch or solution based on the reported vulnerability.
|
||||||
|
- Ensure the patch follows best practices and is testable.
|
||||||
|
- Add test(s) to the existing test suite to confirm the vulnerability (pre-patch) and confirm the fix (post-patch).
|
||||||
|
- Test the patch to ensure it works as expected.
|
||||||
|
- Create a pull request to merge the patch into the project.
|
||||||
|
|
||||||
|
## Runbook
|
||||||
|
|
||||||
|
The following sections outline the **step-by-step process**, explaining each decision, scenario, and possible actions. In this guide we also include links that are private (limited to the Security Triage Team), a general overview of the process in flowchart format can be found [here](#security-report-handling-flowchart).
|
||||||
|
|
||||||
|
### Step 0: Security Report Received
|
||||||
|
|
||||||
|
A security vulnerability report is received via [official channels](SECURITY.md#reporting-a-security-issue) or otherwise (i.e. via third-party advisory services, blog post, social media, etc.).
|
||||||
|
|
||||||
|
Ideally, the report must contain **clear and detailed information** like (Affected versions, a small PoC/sample project demonstrating the issue, steps to reproduce, expected vs. actual behavior, potential impact...) but this might not be the case depending on the communication channel used. Later on we will try to collect this information and refine the report.
|
||||||
|
|
||||||
|
### Step 1: Assign Security Report Coordinator (SRC) and consolidate the report
|
||||||
|
|
||||||
|
1.1 One person from the Security Triage Team will volunteer and self-assign to oversee the case. It is expected that the person will remain assigned until the end of the process, so they effectively take the role of [the Security Report Coordinator (SRC)](#security-report-coordinator-src).
|
||||||
|
|
||||||
|
> [!Note]
|
||||||
|
> While this document refers to a single SRC for simplicity, in practice, having two coordinators is acceptable and often beneficial. A second coordinator can assist with tasks such as reviewing the advisory content before it is published, ensuring accuracy and completeness.
|
||||||
|
|
||||||
|
1.2 If the report was created accidentally or intentionally in a public channel (e.g. GitHub issues), it is important to share this information ASAP in the private slack channel `#lodash-security-triage` so the Security Triage Team is aware of it. At this stage, our priority is to remove the report from public view as soon as possible and let the reporter know what happened next.
|
||||||
|
|
||||||
|
1.2.1 In the case of a report made public in a Pull request or issue under the Lodash GitHub organization the following process will be followed (by a Lodash TSC Member):
|
||||||
|
|
||||||
|
* Move the issue to the private repository called [lodash/security-triage](https://github.com/lodash/security-triage).
|
||||||
|
* For any related pull requests, create an associated issue in [lodash/security-triage](https://github.com/lodash/security-triage) repository. Add a copy of the patch for the pull request to the issue. Add screenshots of discussion from the pull request to the issue.
|
||||||
|
* [Open a ticket with GitHub](https://support.github.com/contact) to delete the pull request using Lodash (team) as the account organization.
|
||||||
|
* Force-push to the PR branch to overwrite the code with a placeholder commit (if "allow edits by maintainers" is enabled). This ensures sensitive information is removed immediately.
|
||||||
|
* In the PR comments, notify the author about the force-push and explain the reason:
|
||||||
|
> FYI @xxxx, we force-pushed to your branch to remove sensitive information while we work on releases in private.
|
||||||
|
* Open a new issue in the public repository with the title `FYI - pull request deleted #YYYY`. Include an explanation for the user:
|
||||||
|
> FYI @xxxx we asked GitHub to delete your pull request while we work on releases in private.
|
||||||
|
* Update the team in the slack channel #lodash-security-triage`.
|
||||||
|
|
||||||
|
1.2.2 In the case that the report is made public in a different channel that we don't own/control, the Lodash TSC will attempt to mitigate this by trying to remove the report from public view (reporting to support, asking the reporter to remove the report, etc...).
|
||||||
|
|
||||||
|
|
||||||
|
1.3 At this stage the Security Report Coordinator (SRC) will create a (private) issue in [lodash/security-triage](https://github.com/lodash/security-triage) repository with the existing information from the security report unless it already exists (step 1.2.1). This issue will serve as the central discussion point for this particular report. At this stage is expected from the Security Report Coordinator (SRC) to acknowledge receipt of the security report to the reporter.
|
||||||
|
|
||||||
|
> [!Note]
|
||||||
|
> It is expected that the issue will be assigned to the Security Report Coordinator (SRC) and will remain open until the end of the process.
|
||||||
|
|
||||||
|
### Step 2: Review the Report and determine its severity
|
||||||
|
|
||||||
|
2.1 It is expected from the security triage team to review the report and determine its severity, also evaluating the impact on the project(s). In some cases the report might be too vague to properly determine its severity. In this case the Security Report Coordinator (SRC) will need to reach out to the reporter for more information and refine the report.
|
||||||
|
|
||||||
|
2.2 At this stage we are capable of determining the severity of the report based on the information provided and also if the report is still relevant. In case that the team has considered the report to be irrelevant or not valid, the Security Report Coordinator (SRC) will need to close the issue and inform the reporter that the report has been dismissed, ideally we can provide a reason for dismissal to prevent the report from being resubmitted within the project(s) in the future.
|
||||||
|
|
||||||
|
2.3 If the report is considered relevant and valid, the Security Report Coordinator (SRC) will create an advisory and request a CVE number. The Security Report Coordinator (SRC) will also include the remediation developer(s), analyst(s) and potentially the reporter in the advisory, so they can start to work on private fork to fix the security issue.
|
||||||
|
|
||||||
|
### Step 3: Patch and release
|
||||||
|
|
||||||
|
3.1 The security triage team will determine if this vulnerability will be patched and work on it. In case that the vulnerability won't be patched jump to step 4.
|
||||||
|
|
||||||
|
3.2 The mitigation team (remediation developer(s), analyst(s), reporter(s)) will work on the patch(es), re-evaluate the report once the patch is ready and include regression tests (when possible).
|
||||||
|
|
||||||
|
3.3 The Lodash TSC will announce publicly on a public issue that there is security patch available and the plan to do a release with an specific date (ideally) and the versions affected without providing additional information to prevent early disclosure.
|
||||||
|
|
||||||
|
3.4 The Lodash TSC will create the releases and publish them to npm.
|
||||||
|
|
||||||
|
### Step 4: Public disclosure
|
||||||
|
|
||||||
|
4.1 At this stage the Security Report Coordinator (SRC) will make the advisory public and close the coordination issue (opened in step 1).
|
||||||
|
|
||||||
|
4.2 The Security Report Coordinator (SRC) can ask the Lodash TSC to coordinate blog post or social media announcements using the OpenJS Foundation channels.
|
||||||
|
|
||||||
|
[Security Triage Team]: GOVERNANCE.md#security-triage-team
|
||||||
71
lib/common/file.js
Normal file
71
lib/common/file.js
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
const _ = require('lodash');
|
||||||
|
const fs = require('fs-extra');
|
||||||
|
const glob = require('glob');
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
|
const minify = require('../common/minify.js');
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a [fs.copy](https://github.com/jprichardson/node-fs-extra#copy)
|
||||||
|
* function with `srcPath` and `destPath` partially applied.
|
||||||
|
*
|
||||||
|
* @memberOf file
|
||||||
|
* @param {string} srcPath The path of the file to copy.
|
||||||
|
* @param {string} destPath The path to copy the file to.
|
||||||
|
* @returns {Function} Returns the partially applied function.
|
||||||
|
*/
|
||||||
|
function copy(srcPath, destPath) {
|
||||||
|
return _.partial(fs.copy, srcPath, destPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an object of base name and compiled template pairs that match `pattern`.
|
||||||
|
*
|
||||||
|
* @memberOf file
|
||||||
|
* @param {string} pattern The glob pattern to be match.
|
||||||
|
* @returns {Object} Returns the object of compiled templates.
|
||||||
|
*/
|
||||||
|
function globTemplate(pattern) {
|
||||||
|
return _.transform(glob.sync(pattern), (result, filePath) => {
|
||||||
|
const key = path.basename(filePath, path.extname(filePath));
|
||||||
|
result[key] = _.template(fs.readFileSync(filePath, 'utf8'));
|
||||||
|
}, {});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a `minify` function with `srcPath` and `destPath` partially applied.
|
||||||
|
*
|
||||||
|
* @memberOf file
|
||||||
|
* @param {string} srcPath The path of the file to minify.
|
||||||
|
* @param {string} destPath The path to write the file to.
|
||||||
|
* @returns {Function} Returns the partially applied function.
|
||||||
|
*/
|
||||||
|
function min(srcPath, destPath) {
|
||||||
|
return _.partial(minify, srcPath, destPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a [fs.writeFile](https://nodejs.org/api/fs.html#fs_fs_writefile_file_data_options_callback)
|
||||||
|
* function with `filePath` and `data` partially applied.
|
||||||
|
*
|
||||||
|
* @memberOf file
|
||||||
|
* @param {string} destPath The path to write the file to.
|
||||||
|
* @param {string} data The data to write to the file.
|
||||||
|
* @returns {Function} Returns the partially applied function.
|
||||||
|
*/
|
||||||
|
function write(destPath, data) {
|
||||||
|
return _.partial(fs.writeFile, destPath, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
copy,
|
||||||
|
globTemplate,
|
||||||
|
min,
|
||||||
|
write
|
||||||
|
};
|
||||||
9
lib/common/mapping.js
Normal file
9
lib/common/mapping.js
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
const _mapping = require('../../fp/_mapping');
|
||||||
|
const util = require('./util');
|
||||||
|
const Hash = util.Hash;
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
module.exports = new Hash(_mapping);
|
||||||
@@ -1,13 +1,26 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var _ = require('lodash'),
|
const _ = require('lodash');
|
||||||
fs = require('fs-extra'),
|
const fs = require('fs-extra');
|
||||||
uglify = require('uglify-js');
|
const uglify = require('uglify-js');
|
||||||
|
|
||||||
var uglifyOptions = require('./uglify.options');
|
const uglifyOptions = require('./uglify.options');
|
||||||
|
|
||||||
/*----------------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Asynchronously minifies the file at `srcPath`, writes it to `destPath`, and
|
||||||
|
* invokes `callback` upon completion. The callback is invoked with one argument:
|
||||||
|
* (error).
|
||||||
|
*
|
||||||
|
* If unspecified, `destPath` is `srcPath` with an extension of `.min.js`.
|
||||||
|
* (e.g. the `destPath` of `path/to/foo.js` would be `path/to/foo.min.js`)
|
||||||
|
*
|
||||||
|
* @param {string} srcPath The path of the file to minify.
|
||||||
|
* @param {string} [destPath] The path to write the file to.
|
||||||
|
* @param {Function} callback The function invoked upon completion.
|
||||||
|
* @param {Object} [option] The UglifyJS options object.
|
||||||
|
*/
|
||||||
function minify(srcPath, destPath, callback, options) {
|
function minify(srcPath, destPath, callback, options) {
|
||||||
if (_.isFunction(destPath)) {
|
if (_.isFunction(destPath)) {
|
||||||
if (_.isObject(callback)) {
|
if (_.isObject(callback)) {
|
||||||
@@ -19,7 +32,7 @@ function minify(srcPath, destPath, callback, options) {
|
|||||||
if (!destPath) {
|
if (!destPath) {
|
||||||
destPath = srcPath.replace(/(?=\.js$)/, '.min');
|
destPath = srcPath.replace(/(?=\.js$)/, '.min');
|
||||||
}
|
}
|
||||||
var output = uglify.minify(srcPath, _.defaults(options || {}, uglifyOptions));
|
const output = uglify.minify(srcPath, _.defaults(options || {}, uglifyOptions));
|
||||||
fs.writeFile(destPath, output.code, 'utf-8', callback);
|
fs.writeFile(destPath, output.code, 'utf-8', callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,16 +1,22 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The UglifyJS options object for
|
||||||
|
* [compress](https://github.com/mishoo/UglifyJS2#compressor-options),
|
||||||
|
* [mangle](https://github.com/mishoo/UglifyJS2#mangler-options), and
|
||||||
|
* [output](https://github.com/mishoo/UglifyJS2#beautifier-options) options.
|
||||||
|
*/
|
||||||
module.exports = {
|
module.exports = {
|
||||||
'compress': {
|
'compress': {
|
||||||
|
'collapse_vars': true,
|
||||||
|
'negate_iife': false,
|
||||||
'pure_getters': true,
|
'pure_getters': true,
|
||||||
'unsafe': true,
|
'unsafe': true,
|
||||||
'unsafe_comps': true,
|
|
||||||
'warnings': false
|
'warnings': false
|
||||||
},
|
},
|
||||||
'mangle': {
|
|
||||||
'except': ['define']
|
|
||||||
},
|
|
||||||
'output': {
|
'output': {
|
||||||
'ascii_only': true,
|
'ascii_only': true,
|
||||||
'comments': /^!|@cc_on|@license|@preserve/i,
|
'comments': /@license/,
|
||||||
'max_line_len': 500
|
'max_line_len': 500
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,36 +1,40 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var _ = require('lodash'),
|
const _ = require('lodash');
|
||||||
fs = require('fs-extra'),
|
|
||||||
glob = require('glob'),
|
|
||||||
path = require('path');
|
|
||||||
|
|
||||||
var minify = require('../common/minify.js');
|
|
||||||
|
|
||||||
/*----------------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
function copyFile(srcPath, destPath) {
|
/**
|
||||||
return _.partial(fs.copy, srcPath, destPath);
|
* Creates a hash object. If a `properties` object is provided, its own
|
||||||
|
* enumerable properties are assigned to the created hash.
|
||||||
|
*
|
||||||
|
* @memberOf util
|
||||||
|
* @param {Object} [properties] The properties to assign to the hash.
|
||||||
|
* @returns {Object} Returns the new hash object.
|
||||||
|
*/
|
||||||
|
function Hash(properties) {
|
||||||
|
return _.transform(properties, (result, value, key) => {
|
||||||
|
result[key] = (_.isPlainObject(value) && !(value instanceof Hash))
|
||||||
|
? new Hash(value)
|
||||||
|
: value;
|
||||||
|
}, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
function globTemplate(pattern) {
|
Hash.prototype = Object.create(null);
|
||||||
return _.transform(glob.sync(pattern), function(result, filePath) {
|
|
||||||
var key = path.basename(filePath, path.extname(filePath));
|
|
||||||
result[key] = _.template(fs.readFileSync(filePath, 'utf8'));
|
|
||||||
}, {});
|
|
||||||
}
|
|
||||||
|
|
||||||
function minFile(srcPath, destPath) {
|
/**
|
||||||
return _.partial(minify, srcPath, destPath);
|
* This method throws any error it receives.
|
||||||
}
|
*
|
||||||
|
* @memberOf util
|
||||||
function writeFile(filePath, data) {
|
* @param {Object} [error] The error object.
|
||||||
return _.partial(fs.writeFile, filePath, data);
|
*/
|
||||||
|
function pitch(error) {
|
||||||
|
if (error != null) {
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
'copyFile': copyFile,
|
Hash,
|
||||||
'globTemplate': globTemplate,
|
pitch
|
||||||
'minFile': minFile,
|
|
||||||
'writeFile': writeFile
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,18 +1,19 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var _ = require('lodash'),
|
const _ = require('lodash');
|
||||||
async = require('async'),
|
const async = require('async');
|
||||||
path = require('path'),
|
const path = require('path');
|
||||||
webpack = require('webpack');
|
const webpack = require('webpack');
|
||||||
|
|
||||||
var util = require('../common/util');
|
const file = require('../common/file');
|
||||||
|
const util = require('../common/util');
|
||||||
|
|
||||||
var basePath = path.join(__dirname, '..', '..'),
|
const basePath = path.join(__dirname, '..', '..');
|
||||||
distPath = path.join(basePath, 'dist'),
|
const distPath = path.join(basePath, 'dist');
|
||||||
fpPath = path.join(basePath, 'fp'),
|
const fpPath = path.join(basePath, 'fp');
|
||||||
filename = 'lodash.fp.js';
|
const filename = 'lodash.fp.js';
|
||||||
|
|
||||||
var fpConfig = {
|
const fpConfig = {
|
||||||
'entry': path.join(fpPath, '_convertBrowser.js'),
|
'entry': path.join(fpPath, '_convertBrowser.js'),
|
||||||
'output': {
|
'output': {
|
||||||
'path': distPath,
|
'path': distPath,
|
||||||
@@ -26,7 +27,7 @@ var fpConfig = {
|
|||||||
]
|
]
|
||||||
};
|
};
|
||||||
|
|
||||||
var mappingConfig = {
|
const mappingConfig = {
|
||||||
'entry': path.join(fpPath, '_mapping.js'),
|
'entry': path.join(fpPath, '_mapping.js'),
|
||||||
'output': {
|
'output': {
|
||||||
'path': distPath,
|
'path': distPath,
|
||||||
@@ -38,18 +39,18 @@ var mappingConfig = {
|
|||||||
|
|
||||||
/*----------------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
function onComplete(error) {
|
/**
|
||||||
if (error) {
|
* Creates browser builds of the FP converter and mappings at the `target` path.
|
||||||
throw error;
|
*
|
||||||
}
|
* @private
|
||||||
}
|
* @param {string} target The output directory path.
|
||||||
|
*/
|
||||||
function build() {
|
function build() {
|
||||||
async.series([
|
async.series([
|
||||||
_.partial(webpack, mappingConfig),
|
_.partial(webpack, mappingConfig),
|
||||||
_.partial(webpack, fpConfig),
|
_.partial(webpack, fpConfig),
|
||||||
util.minFile(path.join(distPath, filename))
|
file.min(path.join(distPath, filename))
|
||||||
], onComplete);
|
], util.pitch);
|
||||||
}
|
}
|
||||||
|
|
||||||
build();
|
build();
|
||||||
|
|||||||
@@ -1,43 +1,57 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var _ = require('lodash'),
|
const _ = require('lodash');
|
||||||
fs = require('fs-extra'),
|
const fs = require('fs-extra');
|
||||||
path = require('path'),
|
const path = require('path');
|
||||||
util = require('../common/util');
|
|
||||||
|
|
||||||
var mapping = require('../../fp/_mapping'),
|
const file = require('../common/file');
|
||||||
templatePath = path.join(__dirname, 'template/doc'),
|
const mapping = require('../common/mapping');
|
||||||
template = util.globTemplate(path.join(templatePath, '*.jst'));
|
const util = require('../common/util');
|
||||||
|
|
||||||
var argNames = ['a', 'b', 'c', 'd'];
|
const templatePath = path.join(__dirname, 'template/doc');
|
||||||
|
const template = file.globTemplate(path.join(templatePath, '*.jst'));
|
||||||
|
|
||||||
var templateData = {
|
const argNames = ['a', 'b', 'c', 'd'];
|
||||||
'mapping': mapping,
|
|
||||||
'toArgOrder': toArgOrder,
|
const templateData = {
|
||||||
'toFuncList': toFuncList
|
mapping,
|
||||||
|
toArgOrder,
|
||||||
|
toFuncList
|
||||||
};
|
};
|
||||||
|
|
||||||
function toArgOrder(array) {
|
/**
|
||||||
var reordered = [];
|
* Converts arranged argument `indexes` into a named argument string
|
||||||
_.each(array, function(newIndex, index) {
|
* representation of their order.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {number[]} indexes The arranged argument indexes.
|
||||||
|
* @returns {string} Returns the named argument string.
|
||||||
|
*/
|
||||||
|
function toArgOrder(indexes) {
|
||||||
|
const reordered = [];
|
||||||
|
_.each(indexes, (newIndex, index) => {
|
||||||
reordered[newIndex] = argNames[index];
|
reordered[newIndex] = argNames[index];
|
||||||
});
|
});
|
||||||
return '`(' + reordered.join(', ') + ')`';
|
return '`(' + reordered.join(', ') + ')`';
|
||||||
}
|
}
|
||||||
|
|
||||||
function toFuncList(array) {
|
/**
|
||||||
var chunks = _.chunk(array.slice().sort(), 5),
|
* Converts `funcNames` into a chunked list string representation.
|
||||||
lastChunk = _.last(chunks),
|
*
|
||||||
last = lastChunk ? lastChunk.pop() : undefined;
|
* @private
|
||||||
|
* @param {string[]} funcNames The function names.
|
||||||
|
* @returns {string} Returns the function list string.
|
||||||
|
*/
|
||||||
|
function toFuncList(funcNames) {
|
||||||
|
let chunks = _.chunk(funcNames.slice().sort(), 5);
|
||||||
|
let lastChunk = _.last(chunks);
|
||||||
|
const lastName = lastChunk ? lastChunk.pop() : undefined;
|
||||||
|
|
||||||
chunks = _.reject(chunks, _.isEmpty);
|
chunks = _.reject(chunks, _.isEmpty);
|
||||||
lastChunk = _.last(chunks);
|
lastChunk = _.last(chunks);
|
||||||
|
|
||||||
var result = '`' + _.map(chunks, function(chunk) {
|
let result = '`' + _.map(chunks, chunk => chunk.join('`, `') + '`').join(',\n`');
|
||||||
return chunk.join('`, `') + '`';
|
if (lastName == null) {
|
||||||
}).join(',\n`');
|
|
||||||
|
|
||||||
if (last == null) {
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
if (_.size(chunks) > 1 || _.size(lastChunk) > 1) {
|
if (_.size(chunks) > 1 || _.size(lastChunk) > 1) {
|
||||||
@@ -45,20 +59,20 @@ function toFuncList(array) {
|
|||||||
}
|
}
|
||||||
result += ' &';
|
result += ' &';
|
||||||
result += _.size(lastChunk) < 5 ? ' ' : '\n';
|
result += _.size(lastChunk) < 5 ? ' ' : '\n';
|
||||||
return result + '`' + last + '`';
|
return result + '`' + lastName + '`';
|
||||||
}
|
}
|
||||||
|
|
||||||
/*----------------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
function onComplete(error) {
|
/**
|
||||||
if (error) {
|
* Creates the FP-Guide wiki at the `target` path.
|
||||||
throw error;
|
*
|
||||||
}
|
* @private
|
||||||
}
|
* @param {string} target The output file path.
|
||||||
|
*/
|
||||||
function build(target) {
|
function build(target) {
|
||||||
target = path.resolve(target);
|
target = path.resolve(target);
|
||||||
fs.writeFile(target, template.wiki(templateData), onComplete);
|
fs.writeFile(target, template.wiki(templateData), util.pitch);
|
||||||
}
|
}
|
||||||
|
|
||||||
build(_.last(process.argv));
|
build(_.last(process.argv));
|
||||||
|
|||||||
@@ -1,24 +1,25 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var _ = require('lodash'),
|
const _ = require('lodash');
|
||||||
async = require('async'),
|
const async = require('async');
|
||||||
glob = require('glob'),
|
const glob = require('glob');
|
||||||
path = require('path');
|
const path = require('path');
|
||||||
|
|
||||||
var util = require('../common/util');
|
const file = require('../common/file');
|
||||||
|
const mapping = require('../common/mapping');
|
||||||
|
const util = require('../common/util');
|
||||||
|
|
||||||
var mapping = require('../../fp/_mapping'),
|
const templatePath = path.join(__dirname, 'template/modules');
|
||||||
templatePath = path.join(__dirname, 'template/modules'),
|
const template = file.globTemplate(path.join(templatePath, '*.jst'));
|
||||||
template = util.globTemplate(path.join(templatePath, '*.jst'));
|
|
||||||
|
|
||||||
var aryMethods = _.union(
|
const aryMethods = _.union(
|
||||||
mapping.aryMethod[1],
|
mapping.aryMethod[1],
|
||||||
mapping.aryMethod[2],
|
mapping.aryMethod[2],
|
||||||
mapping.aryMethod[3],
|
mapping.aryMethod[3],
|
||||||
mapping.aryMethod[4]
|
mapping.aryMethod[4]
|
||||||
);
|
);
|
||||||
|
|
||||||
var categories = [
|
const categories = [
|
||||||
'array',
|
'array',
|
||||||
'collection',
|
'collection',
|
||||||
'date',
|
'date',
|
||||||
@@ -32,7 +33,7 @@ var categories = [
|
|||||||
'util'
|
'util'
|
||||||
];
|
];
|
||||||
|
|
||||||
var ignored = [
|
const ignored = [
|
||||||
'_*.js',
|
'_*.js',
|
||||||
'core.js',
|
'core.js',
|
||||||
'core.min.js',
|
'core.min.js',
|
||||||
@@ -42,21 +43,50 @@ var ignored = [
|
|||||||
'lodash.min.js'
|
'lodash.min.js'
|
||||||
];
|
];
|
||||||
|
|
||||||
function isAlias(funcName) {
|
/**
|
||||||
return _.has(mapping.aliasToReal, funcName);
|
* Checks if `name` is a method alias.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} name The name to check.
|
||||||
|
* @returns {boolean} Returns `true` if `name` is a method alias, else `false`.
|
||||||
|
*/
|
||||||
|
function isAlias(name) {
|
||||||
|
return _.has(mapping.aliasToReal, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
function isCategory(funcName) {
|
/**
|
||||||
return _.includes(categories, funcName);
|
* Checks if `name` is a category name.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} name The name to check.
|
||||||
|
* @returns {boolean} Returns `true` if `name` is a category name, else `false`.
|
||||||
|
*/
|
||||||
|
function isCategory(name) {
|
||||||
|
return _.includes(categories, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
function isThru(funcName) {
|
/**
|
||||||
return !_.includes(aryMethods, funcName);
|
* Checks if `name` belongs to a method that's passed thru and not wrapped.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} name The name to check.
|
||||||
|
* @returns {boolean} Returns `true` if `name` is of a pass thru method,
|
||||||
|
* else `false`.
|
||||||
|
*/
|
||||||
|
function isThru(name) {
|
||||||
|
return !_.includes(aryMethods, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets metadata for `func`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Function} func The function to query.
|
||||||
|
* @returns {*} Returns the metadata for `func`.
|
||||||
|
*/
|
||||||
function getTemplate(moduleName) {
|
function getTemplate(moduleName) {
|
||||||
var data = {
|
const data = {
|
||||||
'name': _.result(mapping.aliasToReal, moduleName, moduleName),
|
'name': _.get(mapping.aliasToReal, moduleName, moduleName),
|
||||||
'mapping': mapping
|
'mapping': mapping
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -74,47 +104,47 @@ function getTemplate(moduleName) {
|
|||||||
|
|
||||||
/*----------------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
function onComplete(error) {
|
/**
|
||||||
if (error) {
|
* Creates FP modules at the `target` path.
|
||||||
throw error;
|
*
|
||||||
}
|
* @private
|
||||||
}
|
* @param {string} target The output directory path.
|
||||||
|
*/
|
||||||
function build(target) {
|
function build(target) {
|
||||||
target = path.resolve(target);
|
target = path.resolve(target);
|
||||||
|
|
||||||
var fpPath = path.join(target, 'fp');
|
const fpPath = path.join(target, 'fp');
|
||||||
|
|
||||||
// Glob existing lodash module paths.
|
// Glob existing lodash module paths.
|
||||||
var modulePaths = glob.sync(path.join(target, '*.js'), {
|
const modulePaths = glob.sync(path.join(target, '*.js'), {
|
||||||
'nodir': true,
|
'nodir': true,
|
||||||
'ignore': ignored.map(function(filename) {
|
'ignore': ignored.map(filename => {
|
||||||
return path.join(target, filename);
|
return path.join(target, filename);
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
// Add FP alias and remapped module paths.
|
// Add FP alias and remapped module paths.
|
||||||
_.each([mapping.aliasToReal, mapping.remap], function(data) {
|
_.each([mapping.aliasToReal, mapping.remap], data => {
|
||||||
_.forOwn(data, function(realName, alias) {
|
_.forOwn(data, (realName, alias) => {
|
||||||
var modulePath = path.join(target, alias + '.js');
|
const modulePath = path.join(target, alias + '.js');
|
||||||
if (!_.includes(modulePaths, modulePath)) {
|
if (!_.includes(modulePaths, modulePath)) {
|
||||||
modulePaths.push(modulePath);
|
modulePaths.push(modulePath);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
var actions = modulePaths.map(function(modulePath) {
|
const actions = modulePaths.map(modulePath => {
|
||||||
var moduleName = path.basename(modulePath, '.js');
|
const moduleName = path.basename(modulePath, '.js');
|
||||||
return util.writeFile(path.join(fpPath, moduleName + '.js'), getTemplate(moduleName));
|
return file.write(path.join(fpPath, moduleName + '.js'), getTemplate(moduleName));
|
||||||
});
|
});
|
||||||
|
|
||||||
actions.unshift(util.copyFile(path.join(__dirname, '../../fp'), fpPath));
|
actions.unshift(file.copy(path.join(__dirname, '../../fp'), fpPath));
|
||||||
actions.push(util.writeFile(path.join(fpPath, '_falseOptions.js'), template._falseOptions()));
|
actions.push(file.write(path.join(fpPath, '_falseOptions.js'), template._falseOptions()));
|
||||||
actions.push(util.writeFile(path.join(fpPath, '_util.js'), template._util()));
|
actions.push(file.write(path.join(fpPath, '_util.js'), template._util()));
|
||||||
actions.push(util.writeFile(path.join(target, 'fp.js'), template.fp()));
|
actions.push(file.write(path.join(target, 'fp.js'), template.fp()));
|
||||||
actions.push(util.writeFile(path.join(fpPath, 'convert.js'), template.convert()));
|
actions.push(file.write(path.join(fpPath, 'convert.js'), template.convert()));
|
||||||
|
|
||||||
async.series(actions, onComplete);
|
async.series(actions, util.pitch);
|
||||||
}
|
}
|
||||||
|
|
||||||
build(_.last(process.argv));
|
build(_.last(process.argv));
|
||||||
|
|||||||
@@ -1,14 +1,28 @@
|
|||||||
## lodash/fp
|
## lodash/fp
|
||||||
|
|
||||||
The `lodash/fp` module is an instance of `lodash` with its methods wrapped to
|
The `lodash/fp` module promotes a more
|
||||||
produce immutable auto-curried iteratee-first data-last methods.
|
[functional programming](https://en.wikipedia.org/wiki/Functional_programming)
|
||||||
|
(FP) friendly style by exporting an instance of `lodash` with its methods wrapped
|
||||||
|
to produce immutable auto-curried iteratee-first data-last methods.
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
In a browser:
|
In a browser:
|
||||||
```html
|
```html
|
||||||
<script src='path/to/lodash.js'></script>
|
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>
|
||||||
<script src='path/to/lodash.fp.js'></script>
|
<script>
|
||||||
|
// Loading `lodash.fp.js` converts `_` to its fp variant.
|
||||||
|
_.defaults({ 'a': 2, 'b': 2 })({ 'a': 1 });
|
||||||
|
// ➜ { 'a': 1, 'b': 2 }
|
||||||
|
|
||||||
|
// Use `noConflict` to restore the pre-fp variant.
|
||||||
|
var fp = _.noConflict();
|
||||||
|
|
||||||
|
_.defaults({ 'a': 1 }, { 'a': 2, 'b': 2 });
|
||||||
|
// ➜ { 'a': 1, 'b': 2 }
|
||||||
|
fp.defaults({ 'a': 2, 'b': 2 })({ 'a': 1 });
|
||||||
|
// ➜ { 'a': 1, 'b': 2 }
|
||||||
|
</script>
|
||||||
```
|
```
|
||||||
|
|
||||||
In Node.js:
|
In Node.js:
|
||||||
@@ -33,13 +47,15 @@ to convert each method.
|
|||||||
|
|
||||||
Iteratee arguments are capped to avoid gotchas with variadic iteratees.
|
Iteratee arguments are capped to avoid gotchas with variadic iteratees.
|
||||||
```js
|
```js
|
||||||
// The `lodash/map` iteratee recieves three arguments: (value, index|key, collection).
|
// The `lodash/map` iteratee receives three arguments:
|
||||||
|
// (value, index|key, collection)
|
||||||
_.map(['6', '8', '10'], parseInt);
|
_.map(['6', '8', '10'], parseInt);
|
||||||
// → [6, NaN, 2]
|
// ➜ [6, NaN, 2]
|
||||||
|
|
||||||
// The `lodash/fp/map` iteratee is capped at one argument: (value).
|
// The `lodash/fp/map` iteratee is capped at one argument:
|
||||||
|
// (value)
|
||||||
fp.map(parseInt)(['6', '8', '10']);
|
fp.map(parseInt)(['6', '8', '10']);
|
||||||
// → [6, 8, 10]
|
// ➜ [6, 8, 10]
|
||||||
```
|
```
|
||||||
|
|
||||||
Methods that cap iteratees to one argument:<br>
|
Methods that cap iteratees to one argument:<br>
|
||||||
@@ -48,70 +64,78 @@ Methods that cap iteratees to one argument:<br>
|
|||||||
Methods that cap iteratees to two arguments:<br>
|
Methods that cap iteratees to two arguments:<br>
|
||||||
<%= toFuncList(_.keys(_.pickBy(mapping.iterateeAry, _.partial(_.eq, _, 2)))) %>
|
<%= toFuncList(_.keys(_.pickBy(mapping.iterateeAry, _.partial(_.eq, _, 2)))) %>
|
||||||
|
|
||||||
The iteratee of `mapKeys` is invoked with one argument: (key)
|
The iteratee of `mapKeys` is capped to one argument: `(key)`
|
||||||
|
|
||||||
#### Fixed Arity
|
#### Fixed Arity
|
||||||
|
|
||||||
Methods have fixed arities to support auto-currying.
|
Methods have fixed arities to support auto-currying.
|
||||||
```js
|
```js
|
||||||
// The `lodash/padStart` method accepts an optional `chars` param.
|
// `lodash/padStart` accepts an optional `chars` param.
|
||||||
_.padStart('a', 3, '-')
|
_.padStart('a', 3, '-')
|
||||||
// → '--a'
|
// ➜ '--a'
|
||||||
|
|
||||||
// The `lodash/fp/padStart` method does not.
|
// `lodash/fp/padStart` does not.
|
||||||
fp.padStart(3)('a');
|
fp.padStart(3)('a');
|
||||||
// → ' a'
|
// ➜ ' a'
|
||||||
fp.padCharsStart('-')(3)('a');
|
fp.padCharsStart('-')(3)('a');
|
||||||
// → '--a'
|
// ➜ '--a'
|
||||||
```
|
```
|
||||||
|
|
||||||
Methods with a fixed arity of one:<br>
|
Methods with a fixed arity of one:<br>
|
||||||
<%= toFuncList(mapping.aryMethod[1]) %>
|
<%= toFuncList(_.difference(mapping.aryMethod[1], _.keys(mapping.skipFixed))) %>
|
||||||
|
|
||||||
Methods with a fixed arity of two:<br>
|
Methods with a fixed arity of two:<br>
|
||||||
<%= toFuncList(mapping.aryMethod[2]) %>
|
<%= toFuncList(_.difference(mapping.aryMethod[2], _.keys(mapping.skipFixed))) %>
|
||||||
|
|
||||||
Methods with a fixed arity of three:<br>
|
Methods with a fixed arity of three:<br>
|
||||||
<%= toFuncList(mapping.aryMethod[3]) %>
|
<%= toFuncList(_.difference(mapping.aryMethod[3], _.keys(mapping.skipFixed))) %>
|
||||||
|
|
||||||
Methods with a fixed arity of four:<br>
|
Methods with a fixed arity of four:<br>
|
||||||
<%= toFuncList(mapping.aryMethod[4]) %>
|
<%= toFuncList(_.difference(mapping.aryMethod[4], _.keys(mapping.skipFixed))) %>
|
||||||
|
|
||||||
#### Rearranged Arguments
|
#### Rearranged Arguments
|
||||||
|
|
||||||
Method arguments are rearranged to make composition easier.
|
Method arguments are rearranged to make composition easier.
|
||||||
```js
|
```js
|
||||||
// The `lodash/filter` method accepts (collection, iteratee).
|
// `lodash/filter` is data-first iteratee-last:
|
||||||
|
// (collection, iteratee)
|
||||||
var compact = _.partial(_.filter, _, Boolean);
|
var compact = _.partial(_.filter, _, Boolean);
|
||||||
compact(['a', null, 'c']);
|
compact(['a', null, 'c']);
|
||||||
// → ['a', 'c']
|
// ➜ ['a', 'c']
|
||||||
|
|
||||||
// The `lodash/fp/filter` method accepts (iteratee, collection)
|
// `lodash/fp/filter` is iteratee-first data-last:
|
||||||
|
// (iteratee, collection)
|
||||||
var compact = fp.filter(Boolean);
|
var compact = fp.filter(Boolean);
|
||||||
compact(['a', null, 'c']);
|
compact(['a', null, 'c']);
|
||||||
// → ['a', 'c']
|
// ➜ ['a', 'c']
|
||||||
```
|
```
|
||||||
|
|
||||||
Methods with a fixed arity of two have an argument order of:<br>
|
##### Most methods follow these rules
|
||||||
|
|
||||||
|
A fixed arity of two has an argument order of:<br>
|
||||||
<%= toArgOrder(mapping.aryRearg[2]) %>
|
<%= toArgOrder(mapping.aryRearg[2]) %>
|
||||||
|
|
||||||
Methods with a fixed arity of three have an argument order of:<br>
|
A fixed arity of three has an argument order of:<br>
|
||||||
<%= toArgOrder(mapping.aryRearg[3]) %>
|
<%= toArgOrder(mapping.aryRearg[3]) %>
|
||||||
|
|
||||||
Methods with a fixed arity of four have an argument order of:<br>
|
A fixed arity of four has an argument order of:<br>
|
||||||
<%= toArgOrder(mapping.aryRearg[4]) %>
|
<%= toArgOrder(mapping.aryRearg[4]) %>
|
||||||
|
|
||||||
Methods with custom argument orders:<br>
|
##### Exceptions to the rules
|
||||||
<%= _.map(_.keys(mapping.methodRearg), function(methodName) {
|
|
||||||
var orders = mapping.methodRearg[methodName];
|
Methods that accept an array as their last, second to last, or only argument:<br>
|
||||||
return ' * `_.' + methodName + '` has an order of ' + toArgOrder(orders);
|
<%= toFuncList(_.keys(mapping.methodSpread)) %>
|
||||||
}).join('\n') %>
|
|
||||||
|
|
||||||
Methods with unchanged argument orders:<br>
|
Methods with unchanged argument orders:<br>
|
||||||
<%= toFuncList(_.keys(mapping.skipRearg)) %>
|
<%= toFuncList(_.keys(mapping.skipRearg)) %>
|
||||||
|
|
||||||
The methods `partial` & `partialRight` accept an array of arguments to partially
|
Methods with custom argument orders:<br>
|
||||||
apply as their second parameter.
|
<%= _.map(_.keys(mapping.methodRearg), methodName => {
|
||||||
|
const orders = mapping.methodRearg[methodName];
|
||||||
|
return ' * `_.' + methodName + '` has an order of ' + toArgOrder(orders);
|
||||||
|
}).join('\n') %>
|
||||||
|
|
||||||
|
The iteratee of `reduceRight` has an argument order of: `(b, a)`
|
||||||
|
|
||||||
#### New Methods
|
#### New Methods
|
||||||
|
|
||||||
@@ -125,16 +149,31 @@ Methods created to accommodate Lodash’s variadic methods:<br>
|
|||||||
#### Aliases
|
#### Aliases
|
||||||
|
|
||||||
There are <%= _.size(mapping.aliasToReal) %> method aliases:<br>
|
There are <%= _.size(mapping.aliasToReal) %> method aliases:<br>
|
||||||
<%= _.map(_.keys(mapping.aliasToReal).sort(), function(alias) {
|
<%= _.map(_.keys(mapping.aliasToReal).sort(), alias => {
|
||||||
var realName = mapping.aliasToReal[alias];
|
const realName = mapping.aliasToReal[alias];
|
||||||
return ' * `_.' + alias + '` is an alias of `_.' + realName + '`';
|
return ' * `_.' + alias + '` is an alias of `_.' + realName + '`';
|
||||||
}).join('\n') %>
|
}).join('\n') %>
|
||||||
|
|
||||||
|
## Placeholders
|
||||||
|
|
||||||
|
The placeholder argument, which defaults to `_`, may be used to fill in method
|
||||||
|
arguments in a different order. Placeholders are filled by the first available
|
||||||
|
arguments of the curried returned function.
|
||||||
|
```js
|
||||||
|
// The equivalent of `2 > 5`.
|
||||||
|
_.gt(2)(5);
|
||||||
|
// ➜ false
|
||||||
|
|
||||||
|
// The equivalent of `_.gt(5, 2)` or `5 > 2`.
|
||||||
|
_.gt(_, 2)(5);
|
||||||
|
// ➜ true
|
||||||
|
```
|
||||||
|
|
||||||
## Chaining
|
## Chaining
|
||||||
|
|
||||||
The `lodash/fp` module **does not** convert chain sequence methods. See
|
The `lodash/fp` module **does not** convert chain sequence methods. See
|
||||||
[Izaak Schroeder’s article](https://medium.com/making-internets/why-using-chain-is-a-mistake-9bc1f80d51ba)
|
[Izaak Schroeder’s article](https://medium.com/making-internets/why-using-chain-is-a-mistake-9bc1f80d51ba)
|
||||||
for more details.
|
on using functional composition as an alternative to method chaining.
|
||||||
|
|
||||||
## Convert
|
## Convert
|
||||||
|
|
||||||
@@ -182,3 +221,8 @@ var fp = convert({
|
|||||||
// Convert by `lodash` instance.
|
// Convert by `lodash` instance.
|
||||||
var fp = convert(lodash.runInContext());
|
var fp = convert(lodash.runInContext());
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Tooling
|
||||||
|
|
||||||
|
Use [eslint-plugin-lodash-fp](https://www.npmjs.com/package/eslint-plugin-lodash-fp)
|
||||||
|
to help use `lodash/fp` more efficiently.
|
||||||
|
|||||||
@@ -4,4 +4,4 @@ module.exports = {
|
|||||||
'fixed': false,
|
'fixed': false,
|
||||||
'immutable': false,
|
'immutable': false,
|
||||||
'rearg': false
|
'rearg': false
|
||||||
});
|
};
|
||||||
|
|||||||
@@ -5,10 +5,12 @@ module.exports = {
|
|||||||
'curry': require('../curry'),
|
'curry': require('../curry'),
|
||||||
'forEach': require('../_arrayEach'),
|
'forEach': require('../_arrayEach'),
|
||||||
'isArray': require('../isArray'),
|
'isArray': require('../isArray'),
|
||||||
|
'isError': require('../isError'),
|
||||||
'isFunction': require('../isFunction'),
|
'isFunction': require('../isFunction'),
|
||||||
|
'isWeakMap': require('../isWeakMap'),
|
||||||
'iteratee': require('../iteratee'),
|
'iteratee': require('../iteratee'),
|
||||||
'keys': require('../_baseKeys'),
|
'keys': require('../_baseKeys'),
|
||||||
'rearg': require('../rearg'),
|
'rearg': require('../rearg'),
|
||||||
'spread': require('../spread'),
|
'toInteger': require('../toInteger'),
|
||||||
'toPath': require('../toPath')
|
'toPath': require('../toPath')
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
var convert = require('./convert'),
|
var convert = require('./convert'),
|
||||||
func = convert('<%= name %>', require('../<%= _.result(mapping.remap, name, name) %>'));
|
func = convert('<%= name %>', require('../<%= _.get(mapping.remap, name, name) %>'));
|
||||||
|
|
||||||
func.placeholder = require('./placeholder');
|
func.placeholder = require('./placeholder');
|
||||||
module.exports = func;
|
module.exports = func;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
var convert = require('./convert'),
|
var convert = require('./convert'),
|
||||||
func = convert('<%= name %>', require('../<%= _.result(mapping.remap, name, name) %>'), require('./_falseOptions'));
|
func = convert('<%= name %>', require('../<%= _.get(mapping.remap, name, name) %>'), require('./_falseOptions'));
|
||||||
|
|
||||||
func.placeholder = require('./placeholder');
|
func.placeholder = require('./placeholder');
|
||||||
module.exports = func;
|
module.exports = func;
|
||||||
|
|||||||
@@ -1,31 +1,31 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var _ = require('lodash'),
|
const async = require('async');
|
||||||
async = require('async'),
|
const path = require('path');
|
||||||
path = require('path');
|
|
||||||
|
|
||||||
var util = require('../common/util');
|
const file = require('../common/file');
|
||||||
|
const util = require('../common/util');
|
||||||
|
|
||||||
var basePath = path.join(__dirname, '..', '..'),
|
const basePath = path.join(__dirname, '..', '..');
|
||||||
distPath = path.join(basePath, 'dist'),
|
const distPath = path.join(basePath, 'dist');
|
||||||
filename = 'lodash.js';
|
const filename = 'lodash.js';
|
||||||
|
|
||||||
var baseLodash = path.join(basePath, filename),
|
const baseLodash = path.join(basePath, filename);
|
||||||
distLodash = path.join(distPath, filename);
|
const distLodash = path.join(distPath, filename);
|
||||||
|
|
||||||
/*----------------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
function onComplete(error) {
|
/**
|
||||||
if (error) {
|
* Creates browser builds of Lodash at the `target` path.
|
||||||
throw error;
|
*
|
||||||
}
|
* @private
|
||||||
}
|
* @param {string} target The output directory path.
|
||||||
|
*/
|
||||||
function build() {
|
function build() {
|
||||||
async.series([
|
async.series([
|
||||||
util.copyFile(baseLodash, distLodash),
|
file.copy(baseLodash, distLodash),
|
||||||
util.minFile(distLodash)
|
file.min(distLodash)
|
||||||
], onComplete);
|
], util.pitch);
|
||||||
}
|
}
|
||||||
|
|
||||||
build();
|
build();
|
||||||
|
|||||||
@@ -1,60 +1,83 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var _ = require('lodash'),
|
const _ = require('lodash');
|
||||||
docdown = require('docdown'),
|
const docdown = require('docdown');
|
||||||
fs = require('fs-extra'),
|
const fs = require('fs-extra');
|
||||||
path = require('path');
|
const path = require('path');
|
||||||
|
|
||||||
var basePath = path.join(__dirname, '..', '..'),
|
const util = require('../common/util');
|
||||||
docPath = path.join(basePath, 'doc'),
|
|
||||||
readmePath = path.join(docPath, 'README.md');
|
|
||||||
|
|
||||||
var pkg = require('../../package.json'),
|
const basePath = path.join(__dirname, '..', '..');
|
||||||
version = pkg.version;
|
const docPath = path.join(basePath, 'doc');
|
||||||
|
const readmePath = path.join(docPath, 'README.md');
|
||||||
|
|
||||||
var config = {
|
const pkg = require('../../package.json');
|
||||||
|
const version = pkg.version;
|
||||||
|
|
||||||
|
const config = {
|
||||||
'base': {
|
'base': {
|
||||||
'entryLinks': [
|
|
||||||
'<% if (name == "templateSettings" || !/^(?:methods|properties|seq)$/i.test(category)) {' +
|
|
||||||
'print("[Ⓝ](https://www.npmjs.com/package/lodash." + name.toLowerCase() + " \\"See the npm package\\")")' +
|
|
||||||
'} %>'
|
|
||||||
],
|
|
||||||
'path': path.join(basePath, 'lodash.js'),
|
'path': path.join(basePath, 'lodash.js'),
|
||||||
'title': '<a href="https://lodash.com/">lodash</a> <span>v' + version + '</span>',
|
'title': `<a href="https://lodash.com/">lodash</a> <span>v${ version }</span>`,
|
||||||
'toc': 'categories',
|
'toc': 'categories',
|
||||||
'url': 'https://github.com/lodash/lodash/blob/' + version + '/lodash.js'
|
'url': `https://github.com/lodash/lodash/blob/${ version }/lodash.js`
|
||||||
},
|
},
|
||||||
'github': {
|
'github': {
|
||||||
'hash': 'github'
|
'style': 'github',
|
||||||
|
'sublinks': [npmLink('Ⓝ', 'See the npm package')]
|
||||||
},
|
},
|
||||||
'site': {
|
'site': {
|
||||||
'tocLink': '#docs'
|
'entryLink': '<a href="${entryHref}" class="fa fa-link"></a>',
|
||||||
|
'sourceLink': '[source](${sourceHref})',
|
||||||
|
'tocHref': '',
|
||||||
|
'tocLink': '',
|
||||||
|
'sublinks': [npmLink('npm package')]
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
function postprocess(string) {
|
/**
|
||||||
// Fix docdown bugs.
|
* Composes a npm link from `text` and optional `title`.
|
||||||
return string
|
*
|
||||||
// Repair the default value of `chars`.
|
* @private
|
||||||
// See https://github.com/eslint/doctrine/issues/157 for more details.
|
* @param {string} text The link text.
|
||||||
.replace(/\bchars=''/g, "chars=' '")
|
* @param {string} [title] The link title.
|
||||||
// Wrap symbol property identifiers in brackets.
|
* @returns {string} Returns the composed npm link.
|
||||||
.replace(/\.(Symbol\.(?:[a-z]+[A-Z]?)+)/g, '[$1]');
|
*/
|
||||||
|
function npmLink(text, title) {
|
||||||
|
return (
|
||||||
|
'<% if (name == "templateSettings" || !/^(?:methods|properties|seq)$/i.test(category)) {' +
|
||||||
|
'print(' +
|
||||||
|
'"[' + text + '](https://www.npmjs.com/package/lodash." + name.toLowerCase() + ' +
|
||||||
|
'"' + (title == null ? '' : ' \\"' + title + '\\"') + ')"' +
|
||||||
|
');' +
|
||||||
|
'} %>'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Post-process `markdown` to make adjustments.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} markdown The markdown to process.
|
||||||
|
* @returns {string} Returns the processed markdown.
|
||||||
|
*/
|
||||||
|
function postprocess(markdown) {
|
||||||
|
// Wrap symbol property identifiers in brackets.
|
||||||
|
return markdown.replace(/\.(Symbol\.(?:[a-z]+[A-Z]?)+)/g, '[$1]');
|
||||||
}
|
}
|
||||||
|
|
||||||
/*----------------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
function onComplete(error) {
|
/**
|
||||||
if (error) {
|
* Creates the documentation markdown formatted for 'github' or 'site'.
|
||||||
throw error;
|
*
|
||||||
}
|
* @private
|
||||||
}
|
* @param {string} type The format type.
|
||||||
|
*/
|
||||||
function build(type) {
|
function build(type) {
|
||||||
var options = _.defaults({}, config.base, config[type]),
|
const options = _.defaults({}, config.base, config[type]);
|
||||||
markdown = docdown(options);
|
const markdown = docdown(options);
|
||||||
|
|
||||||
fs.writeFile(readmePath, postprocess(markdown), onComplete);
|
fs.writeFile(readmePath, postprocess(markdown), util.pitch);
|
||||||
}
|
}
|
||||||
|
|
||||||
build(_.last(process.argv));
|
build(_.last(process.argv));
|
||||||
|
|||||||
@@ -1,15 +1,16 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var _ = require('lodash'),
|
const _ = require('lodash');
|
||||||
async = require('async'),
|
const async = require('async');
|
||||||
path = require('path');
|
const path = require('path');
|
||||||
|
|
||||||
var util = require('../common/util');
|
const file = require('../common/file');
|
||||||
|
const util = require('../common/util');
|
||||||
|
|
||||||
var basePath = path.join(__dirname, '..', '..'),
|
const basePath = path.join(__dirname, '..', '..');
|
||||||
distPath = path.join(basePath, 'dist');
|
const distPath = path.join(basePath, 'dist');
|
||||||
|
|
||||||
var filePairs = [
|
const filePairs = [
|
||||||
[path.join(distPath, 'lodash.core.js'), 'core.js'],
|
[path.join(distPath, 'lodash.core.js'), 'core.js'],
|
||||||
[path.join(distPath, 'lodash.core.min.js'), 'core.min.js'],
|
[path.join(distPath, 'lodash.core.min.js'), 'core.min.js'],
|
||||||
[path.join(distPath, 'lodash.min.js'), 'lodash.min.js']
|
[path.join(distPath, 'lodash.min.js'), 'lodash.min.js']
|
||||||
@@ -17,18 +18,17 @@ var filePairs = [
|
|||||||
|
|
||||||
/*----------------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
function onComplete(error) {
|
/**
|
||||||
if (error) {
|
* Creates supplementary Lodash modules at the `target` path.
|
||||||
throw error;
|
*
|
||||||
}
|
* @private
|
||||||
}
|
* @param {string} target The output directory path.
|
||||||
|
*/
|
||||||
function build(target) {
|
function build(target) {
|
||||||
var actions = _.map(filePairs, function(pair) {
|
const actions = _.map(filePairs, pair =>
|
||||||
return util.copyFile(pair[0], path.join(target, pair[1]));
|
file.copy(pair[0], path.join(target, pair[1])));
|
||||||
});
|
|
||||||
|
|
||||||
async.series(actions, onComplete);
|
async.series(actions, util.pitch);
|
||||||
}
|
}
|
||||||
|
|
||||||
build(_.last(process.argv));
|
build(_.last(process.argv));
|
||||||
|
|||||||
239
lib/main/build-site.js
Normal file
239
lib/main/build-site.js
Normal file
@@ -0,0 +1,239 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
const _ = require('lodash');
|
||||||
|
const cheerio = require('cheerio');
|
||||||
|
const fs = require('fs');
|
||||||
|
const marky = require('marky-markdown');
|
||||||
|
const path = require('path');
|
||||||
|
const util = require('../common/util');
|
||||||
|
|
||||||
|
const basePath = path.join(__dirname, '..', '..');
|
||||||
|
const docPath = path.join(basePath, 'doc');
|
||||||
|
const readmePath = path.join(docPath, 'README.md');
|
||||||
|
|
||||||
|
const highlights = {
|
||||||
|
'html': [
|
||||||
|
'string'
|
||||||
|
],
|
||||||
|
'js': [
|
||||||
|
'comment',
|
||||||
|
'console',
|
||||||
|
'delimiter',
|
||||||
|
'method',
|
||||||
|
'modifier',
|
||||||
|
'name',
|
||||||
|
'numeric',
|
||||||
|
'string',
|
||||||
|
'support',
|
||||||
|
'type'
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
const exts = _.keys(highlights);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts Lodash method references into documentation links.
|
||||||
|
*
|
||||||
|
* Searches for inline code references matching `_.word` (e.g., `_.map`, `_.filter`)
|
||||||
|
* in documentation body text and wraps them in anchor links. Excludes code within
|
||||||
|
* headers as those already have proper anchors.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} $ The Cheerio object.
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* // Body text: <code>_.map</code> → <a href="#map"><code>_.map</code></a>
|
||||||
|
* // Headers: <h3><code>_.VERSION</code></h3> → unchanged (excluded)
|
||||||
|
*/
|
||||||
|
function autoLink($) {
|
||||||
|
$('.doc-container code:not(:header code)').each(function() {
|
||||||
|
const $code = $(this);
|
||||||
|
const html = $code.html();
|
||||||
|
if (/^_\.\w+$/.test(html)) {
|
||||||
|
const id = html.split('.')[1];
|
||||||
|
$code.replaceWith(`<a href="#${ id }"><code>_.${ id }</code></a>`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes horizontal rules from the document.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} $ The Cheerio object.
|
||||||
|
*/
|
||||||
|
function removeHorizontalRules($) {
|
||||||
|
$('hr').remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes marky-markdown specific ids and class names.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} $ The Cheerio object.
|
||||||
|
*/
|
||||||
|
function removeMarkyAttributes($) {
|
||||||
|
$('[id^="user-content-"]')
|
||||||
|
.attr('class', null)
|
||||||
|
.attr('id', null);
|
||||||
|
|
||||||
|
$(':header:not(h3) > a').each(function() {
|
||||||
|
const $a = $(this);
|
||||||
|
$a.replaceWith($a.html());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Renames "_" id and anchor references to "lodash".
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} $ The Cheerio object.
|
||||||
|
*/
|
||||||
|
function renameLodashId($) {
|
||||||
|
$('#_').attr('id', 'lodash');
|
||||||
|
$('[href="#_"]').attr('href', '#lodash');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Repairs broken marky-markdown headers.
|
||||||
|
* See https://github.com/npm/marky-markdown/issues/217 for more details.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} $ The Cheerio object.
|
||||||
|
*/
|
||||||
|
function repairMarkyHeaders($) {
|
||||||
|
$('p:empty + h3').prev().remove();
|
||||||
|
|
||||||
|
$('h3 ~ p:empty').each(function() {
|
||||||
|
const $p = $(this);
|
||||||
|
let node = this.prev;
|
||||||
|
while ((node = node.prev) && node.name != 'h3' && node.name != 'p') {
|
||||||
|
$p.prepend(node.next);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$('h3 code em').parent().each(function() {
|
||||||
|
const $code = $(this);
|
||||||
|
$code.html($code.html().replace(/<\/?em>/g, '_'));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cleans up highlights blocks by removing extraneous class names and elements.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} $ The Cheerio object.
|
||||||
|
*/
|
||||||
|
function tidyHighlights($) {
|
||||||
|
$('.highlight').each(function() {
|
||||||
|
let $spans;
|
||||||
|
const $parent = $(this);
|
||||||
|
const classes = $parent.find('.source,.text').first().attr('class').split(' ');
|
||||||
|
const ext = _(classes).intersection(exts).last();
|
||||||
|
|
||||||
|
$parent.addClass(ext);
|
||||||
|
|
||||||
|
// Remove line indicators for single line snippets.
|
||||||
|
$parent.children('pre').each(function() {
|
||||||
|
const $divs = $(this).children('div');
|
||||||
|
if ($divs.length == 1) {
|
||||||
|
$divs.replaceWith($divs.html());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// Remove extraneous class names.
|
||||||
|
$parent.find('[class]').each(function() {
|
||||||
|
const $element = $(this);
|
||||||
|
const classes = $element.attr('class').split(' ');
|
||||||
|
const attr = _(classes).intersection(highlights[ext]).join(' ');
|
||||||
|
$element.attr('class', attr || null);
|
||||||
|
});
|
||||||
|
// Collapse nested comment highlights.
|
||||||
|
$parent.find(`[class~="comment"]`).each(function() {
|
||||||
|
const $element = $(this);
|
||||||
|
$element.text($element.text().trim());
|
||||||
|
});
|
||||||
|
// Collapse nested string highlights.
|
||||||
|
$parent.find(`[class~="string"]`).each(function() {
|
||||||
|
const $element = $(this);
|
||||||
|
$element.text($element.text());
|
||||||
|
});
|
||||||
|
// Collapse nested spans.
|
||||||
|
while (($spans = $parent.find('span:not([class])')).length) {
|
||||||
|
$spans.each(function() {
|
||||||
|
let $span = $(this);
|
||||||
|
while ($span[0] && $span[0].name == 'span' && !$span.attr('class')) {
|
||||||
|
const $parent = $span.parent();
|
||||||
|
$span.replaceWith($span.html());
|
||||||
|
$span = $parent;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates the documentation HTML.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function build() {
|
||||||
|
const markdown = fs
|
||||||
|
// Load markdown.
|
||||||
|
.readFileSync(readmePath, 'utf8')
|
||||||
|
// Uncomment docdown HTML hints.
|
||||||
|
.replace(/(<)!--\s*|\s*--(>)/g, '$1$2')
|
||||||
|
// Convert docdown-generated [source] and [npm package] links to HTML.
|
||||||
|
// These appear as markdown immediately after h3 tags, which marky-markdown
|
||||||
|
// doesn't process (it treats content after HTML blocks as plain text).
|
||||||
|
// Pattern 1: Dual links for methods with npm packages.
|
||||||
|
.replace(/(<h3[^>]*>.*?<\/h3>)\n\[source\]\(([^)]+)\) \[npm package\]\(([^)]+)\)/g, (match, h3, href1, href2) =>
|
||||||
|
`${h3}\n<p><a href="${ href1 }">source</a> <a href="${ href2 }">npm package</a></p>`
|
||||||
|
)
|
||||||
|
// Pattern 2: Standalone [source] links for properties without npm packages.
|
||||||
|
.replace(/(<h3[^>]*>.*?<\/h3>)\n\[source\]\(([^)]+)\)(?! \[npm package\])/g, (match, h3, href) =>
|
||||||
|
`${h3}\n<p><a href="${ href }">source</a></p>`
|
||||||
|
);
|
||||||
|
|
||||||
|
const $ = cheerio.load(marky(markdown, {
|
||||||
|
'enableHeadingLinkIcons': false,
|
||||||
|
'sanitize': false
|
||||||
|
}));
|
||||||
|
|
||||||
|
const $header = $('h1').first().remove();
|
||||||
|
const version = $header.find('span').first().text().trim().slice(1);
|
||||||
|
|
||||||
|
// Auto-link Lodash method references.
|
||||||
|
autoLink($);
|
||||||
|
// Rename "_" id references to "lodash".
|
||||||
|
renameLodashId($);
|
||||||
|
// Remove docdown horizontal rules.
|
||||||
|
removeHorizontalRules($);
|
||||||
|
// Remove marky-markdown attribute additions.
|
||||||
|
removeMarkyAttributes($);
|
||||||
|
// Repair marky-markdown wrapping around headers.
|
||||||
|
repairMarkyHeaders($);
|
||||||
|
// Cleanup highlights.
|
||||||
|
tidyHighlights($);
|
||||||
|
|
||||||
|
const html = [
|
||||||
|
// Append YAML front matter.
|
||||||
|
'---',
|
||||||
|
'id: docs',
|
||||||
|
'layout: docs',
|
||||||
|
'title: Lodash Documentation',
|
||||||
|
'version: ' + (version || null),
|
||||||
|
'---',
|
||||||
|
'',
|
||||||
|
// Wrap in raw tags to avoid Liquid template tag processing.
|
||||||
|
'{% raw %}',
|
||||||
|
$.html().trim(),
|
||||||
|
'{% endraw %}',
|
||||||
|
''
|
||||||
|
].join('\n');
|
||||||
|
|
||||||
|
fs.writeFile(path.join(docPath, version + '.html'), html, util.pitch);
|
||||||
|
}
|
||||||
|
|
||||||
|
build();
|
||||||
5845
package-lock.json
generated
Normal file
5845
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
61
package.json
61
package.json
@@ -1,33 +1,11 @@
|
|||||||
{
|
{
|
||||||
"name": "lodash",
|
"name": "lodash",
|
||||||
"version": "4.8.0",
|
"version": "4.17.21",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"private": true,
|
"private": true,
|
||||||
"main": "lodash.js",
|
"main": "lodash.js",
|
||||||
"devDependencies": {
|
"engines": {
|
||||||
"async": "^1.5.2",
|
"node": ">=4.0.0"
|
||||||
"benchmark": "^2.1.0",
|
|
||||||
"chalk": "^1.1.3",
|
|
||||||
"codecov.io": "~0.1.6",
|
|
||||||
"coveralls": "^2.11.9",
|
|
||||||
"curl-amd": "~0.8.12",
|
|
||||||
"docdown": "~0.5.0",
|
|
||||||
"dojo": "^1.11.1",
|
|
||||||
"ecstatic": "^1.4.0",
|
|
||||||
"fs-extra": "~0.26.7",
|
|
||||||
"glob": "^7.0.3",
|
|
||||||
"istanbul": "0.4.2",
|
|
||||||
"jquery": "^2.2.2",
|
|
||||||
"jscs": "^2.11.0",
|
|
||||||
"lodash": "4.5.0",
|
|
||||||
"platform": "^1.3.1",
|
|
||||||
"qunit-extras": "^1.5.0",
|
|
||||||
"qunitjs": "~1.23.0",
|
|
||||||
"request": "^2.69.0",
|
|
||||||
"requirejs": "^2.2.0",
|
|
||||||
"sauce-tunnel": "^2.4.0",
|
|
||||||
"uglify-js": "2.6.2",
|
|
||||||
"webpack": "^1.12.14"
|
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "npm run build:main && npm run build:fp",
|
"build": "npm run build:main && npm run build:fp",
|
||||||
@@ -35,9 +13,10 @@
|
|||||||
"build:fp-modules": "node lib/fp/build-modules.js",
|
"build:fp-modules": "node lib/fp/build-modules.js",
|
||||||
"build:main": "node lib/main/build-dist.js",
|
"build:main": "node lib/main/build-dist.js",
|
||||||
"build:main-modules": "node lib/main/build-modules.js",
|
"build:main-modules": "node lib/main/build-modules.js",
|
||||||
"doc": "node lib/main/build-doc github",
|
"doc": "node lib/main/build-doc github && npm run test:doc",
|
||||||
"doc:fp": "node lib/fp/build-doc",
|
"doc:fp": "node lib/fp/build-doc",
|
||||||
"doc:site": "node lib/main/build-doc site",
|
"doc:site": "node lib/main/build-doc site",
|
||||||
|
"doc:sitehtml": "optional-dev-dependency marky-markdown@^9.0.1 && npm run doc:site && node lib/main/build-site",
|
||||||
"pretest": "npm run build",
|
"pretest": "npm run build",
|
||||||
"style": "npm run style:main && npm run style:fp && npm run style:perf && npm run style:test",
|
"style": "npm run style:main && npm run style:fp && npm run style:perf && npm run style:test",
|
||||||
"style:fp": "jscs fp/*.js lib/**/*.js",
|
"style:fp": "jscs fp/*.js lib/**/*.js",
|
||||||
@@ -45,8 +24,38 @@
|
|||||||
"style:perf": "jscs perf/*.js perf/**/*.js",
|
"style:perf": "jscs perf/*.js perf/**/*.js",
|
||||||
"style:test": "jscs test/*.js test/**/*.js",
|
"style:test": "jscs test/*.js test/**/*.js",
|
||||||
"test": "npm run test:main && npm run test:fp",
|
"test": "npm run test:main && npm run test:fp",
|
||||||
|
"test:doc": "markdown-doctest doc/*.md",
|
||||||
"test:fp": "node test/test-fp",
|
"test:fp": "node test/test-fp",
|
||||||
"test:main": "node test/test",
|
"test:main": "node test/test",
|
||||||
"validate": "npm run style && npm run test"
|
"validate": "npm run style && npm run test"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"async": "^2.6.3",
|
||||||
|
"benchmark": "^2.1.3",
|
||||||
|
"chalk": "^1.1.3",
|
||||||
|
"cheerio": "^0.22.0",
|
||||||
|
"codecov.io": "~0.1.6",
|
||||||
|
"coveralls": "^2.11.15",
|
||||||
|
"curl-amd": "~0.8.12",
|
||||||
|
"docdown": "~0.7.2",
|
||||||
|
"dojo": "^1.15.0",
|
||||||
|
"ecstatic": "^2.2.2",
|
||||||
|
"fs-extra": "~1.0.0",
|
||||||
|
"glob": "^7.1.4",
|
||||||
|
"istanbul": "0.4.5",
|
||||||
|
"jquery": "^3.4.1",
|
||||||
|
"jscs": "^3.0.7",
|
||||||
|
"lodash": "4.17.20",
|
||||||
|
"lodash-doc-globals": "^0.1.1",
|
||||||
|
"markdown-doctest": "^0.9.1",
|
||||||
|
"optional-dev-dependency": "^2.0.0",
|
||||||
|
"platform": "^1.3.3",
|
||||||
|
"qunit-extras": "^3.0.0",
|
||||||
|
"qunitjs": "^2.1.0",
|
||||||
|
"request": "^2.88.0",
|
||||||
|
"requirejs": "^2.3.6",
|
||||||
|
"sauce-tunnel": "^2.5.0",
|
||||||
|
"uglify-js": "2.7.5",
|
||||||
|
"webpack": "^1.14.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,27 +15,8 @@
|
|||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
/*--------------------------------------------------------------------------*/
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers an event listener on an element.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {Element} element The element.
|
|
||||||
* @param {string} eventName The name of the event.
|
|
||||||
* @param {Function} handler The event handler.
|
|
||||||
* @returns {Element} The element.
|
|
||||||
*/
|
|
||||||
function addListener(element, eventName, handler) {
|
|
||||||
if (typeof element.addEventListener != 'undefined') {
|
|
||||||
element.addEventListener(eventName, handler, false);
|
|
||||||
} else if (typeof element.attachEvent != 'undefined') {
|
|
||||||
element.attachEvent('on' + eventName, handler);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
// Initialize controls.
|
// Initialize controls.
|
||||||
addListener(window, 'load', function() {
|
addEventListener('load', function() {
|
||||||
function eventHandler(event) {
|
function eventHandler(event) {
|
||||||
var buildIndex = buildList.selectedIndex,
|
var buildIndex = buildList.selectedIndex,
|
||||||
otherIndex = otherList.selectedIndex,
|
otherIndex = otherList.selectedIndex,
|
||||||
@@ -58,7 +39,7 @@
|
|||||||
span1.innerHTML =
|
span1.innerHTML =
|
||||||
'<label for="perf-build">Build: </label>' +
|
'<label for="perf-build">Build: </label>' +
|
||||||
'<select id="perf-build">' +
|
'<select id="perf-build">' +
|
||||||
'<option value="lodash">lodash</option>' +
|
'<option value="lodash">lodash (production)</option>' +
|
||||||
'</select>';
|
'</select>';
|
||||||
|
|
||||||
var span2 = document.createElement('span');
|
var span2 = document.createElement('span');
|
||||||
@@ -96,8 +77,8 @@
|
|||||||
return -1;
|
return -1;
|
||||||
}());
|
}());
|
||||||
|
|
||||||
addListener(buildList, 'change', eventHandler);
|
buildList.addEventListener('change', eventHandler);
|
||||||
addListener(otherList, 'change', eventHandler);
|
otherList.addEventListener('change', eventHandler);
|
||||||
});
|
});
|
||||||
|
|
||||||
// The lodash build file path.
|
// The lodash build file path.
|
||||||
|
|||||||
@@ -10,16 +10,27 @@
|
|||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
#FirebugUI {
|
#FirebugUI {
|
||||||
top: 2em;
|
top: 2.5em;
|
||||||
}
|
}
|
||||||
#perf-toolbar {
|
#perf-toolbar {
|
||||||
background-color: #EEE;
|
background-color: #EEE;
|
||||||
color: #5E740B;
|
color: #5E740B;
|
||||||
font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;
|
font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;
|
||||||
font-size: small;
|
font-size: small;
|
||||||
padding: 0.5em 0 0.5em 2em;
|
padding: 0.5em 1em 0.5em 1em;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
#perf-toolbar label {
|
||||||
|
display: inline-block;
|
||||||
|
margin-right: 0.5em;
|
||||||
|
}
|
||||||
|
#perf-toolbar span {
|
||||||
|
display: inline-block;
|
||||||
|
float: right;
|
||||||
|
line-height: 2.1em;
|
||||||
|
margin-left: 1em;
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
;(function() {
|
;(function() {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
/** Used to access the Firebug Lite panel (set by `run`). */
|
/** Used to access the Firebug Lite panel (set by `run`). */
|
||||||
var fbPanel;
|
var fbPanel;
|
||||||
@@ -82,12 +83,6 @@
|
|||||||
/** Used to queue benchmark suites. */
|
/** Used to queue benchmark suites. */
|
||||||
var suites = [];
|
var suites = [];
|
||||||
|
|
||||||
/** Used to resolve a value's internal [[Class]]. */
|
|
||||||
var toString = Object.prototype.toString;
|
|
||||||
|
|
||||||
/** Detect if in a browser environment. */
|
|
||||||
var isBrowser = isHostType(root, 'document') && isHostType(root, 'navigator');
|
|
||||||
|
|
||||||
/** Use a single "load" function. */
|
/** Use a single "load" function. */
|
||||||
var load = (typeof require == 'function' && !amd)
|
var load = (typeof require == 'function' && !amd)
|
||||||
? require
|
? require
|
||||||
|
|||||||
28
playwright.config.js
Normal file
28
playwright.config.js
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
const { devices } = require('@playwright/test');
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
retries: 0,
|
||||||
|
testDir: './test',
|
||||||
|
testMatch: '**/*.spec.js',
|
||||||
|
use: {
|
||||||
|
baseURL: 'http://localhost:9001',
|
||||||
|
headless: true,
|
||||||
|
},
|
||||||
|
projects: [
|
||||||
|
{ name: 'Chromium', use: { browserName: 'chromium' } },
|
||||||
|
{ name: 'Firefox', use: { browserName: 'firefox' } },
|
||||||
|
{ name: 'WebKit', use: { browserName: 'webkit' } },
|
||||||
|
{
|
||||||
|
name: 'Microsoft Edge',
|
||||||
|
use: { browserName: 'chromium', channel: 'msedge' },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Mobile Safari',
|
||||||
|
use: { ...devices['iPhone 12'], browserName: 'webkit' },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Mobile Chrome',
|
||||||
|
use: { ...devices['Pixel 5'], browserName: 'chromium' },
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
17
renovate.json
Normal file
17
renovate.json
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
||||||
|
"extends": [
|
||||||
|
"config:base"
|
||||||
|
],
|
||||||
|
"enabledManagers": ["npm", "github-actions"],
|
||||||
|
"packageRules": [
|
||||||
|
{
|
||||||
|
"matchManagers": ["npm"],
|
||||||
|
"matchUpdateTypes": ["major"],
|
||||||
|
"enabled": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"prHourlyLimit": 0,
|
||||||
|
"prConcurrentLimit": 10,
|
||||||
|
"minimumReleaseAge": "14d"
|
||||||
|
}
|
||||||
@@ -15,27 +15,8 @@
|
|||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
/*--------------------------------------------------------------------------*/
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers an event listener on an element.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {Element} element The element.
|
|
||||||
* @param {string} eventName The name of the event.
|
|
||||||
* @param {Function} handler The event handler.
|
|
||||||
* @returns {Element} The element.
|
|
||||||
*/
|
|
||||||
function addListener(element, eventName, handler) {
|
|
||||||
if (typeof element.addEventListener != 'undefined') {
|
|
||||||
element.addEventListener(eventName, handler, false);
|
|
||||||
} else if (typeof element.attachEvent != 'undefined') {
|
|
||||||
element.attachEvent('on' + eventName, handler);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
// Initialize controls.
|
// Initialize controls.
|
||||||
addListener(window, 'load', function() {
|
addEventListener('load', function() {
|
||||||
function eventHandler(event) {
|
function eventHandler(event) {
|
||||||
var buildIndex = buildList.selectedIndex,
|
var buildIndex = buildList.selectedIndex,
|
||||||
loaderIndex = loaderList.selectedIndex,
|
loaderIndex = loaderList.selectedIndex,
|
||||||
@@ -59,8 +40,8 @@
|
|||||||
setTimeout(init, 15);
|
setTimeout(init, 15);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
toolbar.appendChild(span1);
|
toolbar.insertBefore(span2, toolbar.lastChild);
|
||||||
toolbar.appendChild(span2);
|
toolbar.insertBefore(span1, span2);
|
||||||
|
|
||||||
buildList.selectedIndex = (function() {
|
buildList.selectedIndex = (function() {
|
||||||
switch (build) {
|
switch (build) {
|
||||||
@@ -84,12 +65,11 @@
|
|||||||
return -1;
|
return -1;
|
||||||
}());
|
}());
|
||||||
|
|
||||||
addListener(buildList, 'change', eventHandler);
|
buildList.addEventListener('change', eventHandler);
|
||||||
addListener(loaderList, 'change', eventHandler);
|
loaderList.addEventListener('change', eventHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
var span1 = document.createElement('span');
|
var span1 = document.createElement('span');
|
||||||
span1.style.cssText = 'float:right';
|
|
||||||
span1.innerHTML =
|
span1.innerHTML =
|
||||||
'<label for="qunit-build">Build: </label>' +
|
'<label for="qunit-build">Build: </label>' +
|
||||||
'<select id="qunit-build">' +
|
'<select id="qunit-build">' +
|
||||||
@@ -100,7 +80,6 @@
|
|||||||
'</select>';
|
'</select>';
|
||||||
|
|
||||||
var span2 = document.createElement('span');
|
var span2 = document.createElement('span');
|
||||||
span2.style.cssText = 'float:right';
|
|
||||||
span2.innerHTML =
|
span2.innerHTML =
|
||||||
'<label for="qunit-loader">Loader: </label>' +
|
'<label for="qunit-loader">Loader: </label>' +
|
||||||
'<select id="qunit-loader">' +
|
'<select id="qunit-loader">' +
|
||||||
@@ -110,6 +89,12 @@
|
|||||||
'<option value="requirejs">RequireJS</option>' +
|
'<option value="requirejs">RequireJS</option>' +
|
||||||
'</select>';
|
'</select>';
|
||||||
|
|
||||||
|
span1.style.cssText =
|
||||||
|
span2.style.cssText = 'display:inline-block;float:right;line-height:2.1em;margin-left:1em;margin-top:0;';
|
||||||
|
|
||||||
|
span1.firstChild.style.cssText =
|
||||||
|
span2.firstChild.style.cssText = 'display:inline-block;margin-right:.5em;';
|
||||||
|
|
||||||
var buildList = span1.lastChild,
|
var buildList = span1.lastChild,
|
||||||
loaderList = span2.lastChild;
|
loaderList = span2.lastChild;
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
self.console || (self.console = { 'log': function() {} });
|
self.console || (self.console = { 'log': function() {} });
|
||||||
|
|
||||||
addEventListener('message', function(e) {
|
addEventListener('message', function(e) {
|
||||||
@@ -12,4 +14,4 @@ addEventListener('message', function(e) {
|
|||||||
}
|
}
|
||||||
postMessage(_.VERSION);
|
postMessage(_.VERSION);
|
||||||
}
|
}
|
||||||
}, false);
|
});
|
||||||
|
|||||||
@@ -40,36 +40,38 @@
|
|||||||
var lodash = _.noConflict();
|
var lodash = _.noConflict();
|
||||||
|
|
||||||
return function(_) {
|
return function(_) {
|
||||||
lodash.defaultsDeep(_, { 'templateSettings': lodash.templateSettings });
|
lodash(_)
|
||||||
lodash.mixin(_, lodash.pick(lodash, lodash.difference([
|
.defaultsDeep({ 'templateSettings': lodash.templateSettings })
|
||||||
'countBy',
|
.mixin(lodash.pick(lodash, lodash.difference([
|
||||||
'debounce',
|
'countBy',
|
||||||
'difference',
|
'debounce',
|
||||||
'find',
|
'difference',
|
||||||
'findIndex',
|
'find',
|
||||||
'findLastIndex',
|
'findIndex',
|
||||||
'groupBy',
|
'findLastIndex',
|
||||||
'includes',
|
'groupBy',
|
||||||
'invert',
|
'includes',
|
||||||
'invokeMap',
|
'invert',
|
||||||
'keyBy',
|
'invokeMap',
|
||||||
'omit',
|
'keyBy',
|
||||||
'partition',
|
'omit',
|
||||||
'reduceRight',
|
'partition',
|
||||||
'reject',
|
'reduceRight',
|
||||||
'sample',
|
'reject',
|
||||||
'without'
|
'sample',
|
||||||
], lodash.functions(_))));
|
'without'
|
||||||
|
], lodash.functions(_))))
|
||||||
|
.value();
|
||||||
|
|
||||||
lodash.forOwn(keyMap, function(realName, otherName) {
|
lodash.forOwn(keyMap, function(realName, otherName) {
|
||||||
_[otherName] = lodash[realName];
|
_[otherName] = lodash[realName];
|
||||||
_.prototype[otherName] = lodash.prototype[realName];
|
_.prototype[otherName] = lodash.prototype[realName];
|
||||||
});
|
});
|
||||||
|
|
||||||
lodash.forOwn(aliasToReal, function(realName, alias) {
|
lodash.forOwn(aliasToReal, function(realName, alias) {
|
||||||
_[alias] = _[realName];
|
_[alias] = _[realName];
|
||||||
_.prototype[alias] = _.prototype[realName];
|
_.prototype[alias] = _.prototype[realName];
|
||||||
});
|
});
|
||||||
|
return _;
|
||||||
};
|
};
|
||||||
}());
|
}());
|
||||||
|
|
||||||
@@ -147,7 +149,7 @@
|
|||||||
QUnit.config.autostart = false;
|
QUnit.config.autostart = false;
|
||||||
|
|
||||||
require(getConfig(), ['underscore'], function(lodash) {
|
require(getConfig(), ['underscore'], function(lodash) {
|
||||||
mixinPrereqs(lodash);
|
_ = mixinPrereqs(lodash);
|
||||||
require(getConfig(), ['backbone'], function() {
|
require(getConfig(), ['backbone'], function() {
|
||||||
require(getConfig(), [
|
require(getConfig(), [
|
||||||
'test/setup/dom-setup',
|
'test/setup/dom-setup',
|
||||||
@@ -159,9 +161,7 @@
|
|||||||
'test/router',
|
'test/router',
|
||||||
'test/view',
|
'test/view',
|
||||||
'test/sync'
|
'test/sync'
|
||||||
], function() {
|
], QUnit.start);
|
||||||
QUnit.start();
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}());
|
}());
|
||||||
|
|||||||
@@ -83,17 +83,7 @@
|
|||||||
|
|
||||||
// Set bad shims.
|
// Set bad shims.
|
||||||
setProperty(Object, '_create', Object.create);
|
setProperty(Object, '_create', Object.create);
|
||||||
setProperty(Object, 'create', (function() {
|
setProperty(Object, 'create', undefined);
|
||||||
function object() {}
|
|
||||||
return function(prototype) {
|
|
||||||
if (prototype === Object(prototype)) {
|
|
||||||
object.prototype = prototype;
|
|
||||||
var result = new object;
|
|
||||||
object.prototype = undefined;
|
|
||||||
}
|
|
||||||
return result || {};
|
|
||||||
};
|
|
||||||
}()));
|
|
||||||
|
|
||||||
setProperty(Object, '_getOwnPropertySymbols', Object.getOwnPropertySymbols);
|
setProperty(Object, '_getOwnPropertySymbols', Object.getOwnPropertySymbols);
|
||||||
setProperty(Object, 'getOwnPropertySymbols', undefined);
|
setProperty(Object, 'getOwnPropertySymbols', undefined);
|
||||||
|
|||||||
23
test/playwright-runner.spec.js
Normal file
23
test/playwright-runner.spec.js
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
const { test, expect } = require('@playwright/test');
|
||||||
|
|
||||||
|
test.describe.configure({ mode: 'parallel' });
|
||||||
|
|
||||||
|
test('index', async ({ page }) => {
|
||||||
|
await page.goto('http://localhost:9001/test/index.html');
|
||||||
|
await expect(page.locator('text=0 failed')).toBeVisible({ timeout: 60000 });
|
||||||
|
});
|
||||||
|
|
||||||
|
test('fp', async ({ page }) => {
|
||||||
|
await page.goto('http://localhost:9001/test/fp.html');
|
||||||
|
await expect(page.locator('text=0 failed')).toBeVisible({ timeout: 60000 });
|
||||||
|
});
|
||||||
|
|
||||||
|
test('backbone', async ({ page }) => {
|
||||||
|
await page.goto('http://localhost:9001/test/backbone.html');
|
||||||
|
await expect(page.locator('text=0 failed')).toBeVisible({ timeout: 60000 });
|
||||||
|
});
|
||||||
|
|
||||||
|
test('underscore', async ({ page }) => {
|
||||||
|
await page.goto('http://localhost:9001/test/underscore.html');
|
||||||
|
await expect(page.locator('text=0 failed')).toBeVisible({ timeout: 60000 });
|
||||||
|
});
|
||||||
@@ -1,922 +0,0 @@
|
|||||||
#!/usr/bin/env node
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
/** Environment shortcut. */
|
|
||||||
var env = process.env;
|
|
||||||
|
|
||||||
if (env.TRAVIS_SECURE_ENV_VARS == 'false') {
|
|
||||||
console.log('Skipping Sauce Labs jobs; secure environment variables are unavailable');
|
|
||||||
process.exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Load Node.js modules. */
|
|
||||||
var EventEmitter = require('events').EventEmitter,
|
|
||||||
http = require('http'),
|
|
||||||
path = require('path'),
|
|
||||||
url = require('url'),
|
|
||||||
util = require('util');
|
|
||||||
|
|
||||||
/** Load other modules. */
|
|
||||||
var _ = require('../lodash.js'),
|
|
||||||
chalk = require('chalk'),
|
|
||||||
ecstatic = require('ecstatic'),
|
|
||||||
request = require('request'),
|
|
||||||
SauceTunnel = require('sauce-tunnel');
|
|
||||||
|
|
||||||
/** Used for Sauce Labs credentials. */
|
|
||||||
var accessKey = env.SAUCE_ACCESS_KEY,
|
|
||||||
username = env.SAUCE_USERNAME;
|
|
||||||
|
|
||||||
/** Used as the default maximum number of times to retry a job and tunnel. */
|
|
||||||
var maxJobRetries = 3,
|
|
||||||
maxTunnelRetries = 3;
|
|
||||||
|
|
||||||
/** Used as the static file server middleware. */
|
|
||||||
var mount = ecstatic({
|
|
||||||
'cache': 'no-cache',
|
|
||||||
'root': process.cwd()
|
|
||||||
});
|
|
||||||
|
|
||||||
/** Used as the list of ports supported by Sauce Connect. */
|
|
||||||
var ports = [
|
|
||||||
80, 443, 888, 2000, 2001, 2020, 2109, 2222, 2310, 3000, 3001, 3030, 3210,
|
|
||||||
3333, 4000, 4001, 4040, 4321, 4502, 4503, 4567, 5000, 5001, 5050, 5555, 5432,
|
|
||||||
6000, 6001, 6060, 6666, 6543, 7000, 7070, 7774, 7777, 8000, 8001, 8003, 8031,
|
|
||||||
8080, 8081, 8765, 8777, 8888, 9000, 9001, 9080, 9090, 9876, 9877, 9999, 49221,
|
|
||||||
55001
|
|
||||||
];
|
|
||||||
|
|
||||||
/** Used by `logInline` to clear previously logged messages. */
|
|
||||||
var prevLine = '';
|
|
||||||
|
|
||||||
/** Method shortcut. */
|
|
||||||
var push = Array.prototype.push;
|
|
||||||
|
|
||||||
/** Used to detect error messages. */
|
|
||||||
var reError = /(?:\be|E)rror\b/;
|
|
||||||
|
|
||||||
/** Used to detect valid job ids. */
|
|
||||||
var reJobId = /^[a-z0-9]{32}$/;
|
|
||||||
|
|
||||||
/** Used to display the wait throbber. */
|
|
||||||
var throbberDelay = 500,
|
|
||||||
waitCount = -1;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Used as Sauce Labs config values.
|
|
||||||
* See the [Sauce Labs documentation](https://docs.saucelabs.com/reference/test-configuration/)
|
|
||||||
* for more details.
|
|
||||||
*/
|
|
||||||
var advisor = getOption('advisor', false),
|
|
||||||
build = getOption('build', (env.TRAVIS_COMMIT || '').slice(0, 10)),
|
|
||||||
commandTimeout = getOption('commandTimeout', 90),
|
|
||||||
compatMode = getOption('compatMode', null),
|
|
||||||
customData = Function('return {' + getOption('customData', '').replace(/^\{|}$/g, '') + '}')(),
|
|
||||||
deviceOrientation = getOption('deviceOrientation', 'portrait'),
|
|
||||||
framework = getOption('framework', 'qunit'),
|
|
||||||
idleTimeout = getOption('idleTimeout', 60),
|
|
||||||
jobName = getOption('name', 'unit tests'),
|
|
||||||
maxDuration = getOption('maxDuration', 180),
|
|
||||||
port = ports[Math.min(_.sortedIndex(ports, getOption('port', 9001)), ports.length - 1)],
|
|
||||||
publicAccess = getOption('public', true),
|
|
||||||
queueTimeout = getOption('queueTimeout', 240),
|
|
||||||
recordVideo = getOption('recordVideo', true),
|
|
||||||
recordScreenshots = getOption('recordScreenshots', false),
|
|
||||||
runner = getOption('runner', 'test/index.html').replace(/^\W+/, ''),
|
|
||||||
runnerUrl = getOption('runnerUrl', 'http://localhost:' + port + '/' + runner),
|
|
||||||
statusInterval = getOption('statusInterval', 5),
|
|
||||||
tags = getOption('tags', []),
|
|
||||||
throttled = getOption('throttled', 10),
|
|
||||||
tunneled = getOption('tunneled', true),
|
|
||||||
tunnelId = getOption('tunnelId', 'tunnel_' + (env.TRAVIS_JOB_ID || 0)),
|
|
||||||
tunnelTimeout = getOption('tunnelTimeout', 120),
|
|
||||||
videoUploadOnPass = getOption('videoUploadOnPass', false);
|
|
||||||
|
|
||||||
/** Used to convert Sauce Labs browser identifiers to their formal names. */
|
|
||||||
var browserNameMap = {
|
|
||||||
'googlechrome': 'Chrome',
|
|
||||||
'iehta': 'Internet Explorer',
|
|
||||||
'ipad': 'iPad',
|
|
||||||
'iphone': 'iPhone',
|
|
||||||
'microsoftedge': 'Edge'
|
|
||||||
};
|
|
||||||
|
|
||||||
/** List of platforms to load the runner on. */
|
|
||||||
var platforms = [
|
|
||||||
['Linux', 'android', '5.1'],
|
|
||||||
['Windows 10', 'chrome', '49'],
|
|
||||||
['Windows 10', 'chrome', '48'],
|
|
||||||
['Windows 10', 'firefox', '45'],
|
|
||||||
['Windows 10', 'firefox', '44'],
|
|
||||||
['Windows 10', 'microsoftedge', '13'],
|
|
||||||
['Windows 10', 'internet explorer', '11'],
|
|
||||||
['Windows 8', 'internet explorer', '10'],
|
|
||||||
['Windows 7', 'internet explorer', '9'],
|
|
||||||
// ['OS X 10.10', 'ipad', '9.1'],
|
|
||||||
['OS X 10.11', 'safari', '9'],
|
|
||||||
['OS X 10.10', 'safari', '8']
|
|
||||||
];
|
|
||||||
|
|
||||||
/** Used to tailor the `platforms` array. */
|
|
||||||
var isAMD = _.includes(tags, 'amd'),
|
|
||||||
isBackbone = _.includes(tags, 'backbone'),
|
|
||||||
isModern = _.includes(tags, 'modern');
|
|
||||||
|
|
||||||
// The platforms to test IE compatibility modes.
|
|
||||||
if (compatMode) {
|
|
||||||
platforms = [
|
|
||||||
['Windows 10', 'internet explorer', '11'],
|
|
||||||
['Windows 8', 'internet explorer', '10'],
|
|
||||||
['Windows 7', 'internet explorer', '9'],
|
|
||||||
['Windows 7', 'internet explorer', '8']
|
|
||||||
];
|
|
||||||
}
|
|
||||||
// The platforms for AMD tests.
|
|
||||||
if (isAMD) {
|
|
||||||
platforms = _.filter(platforms, function(platform) {
|
|
||||||
var browser = browserName(platform[1]),
|
|
||||||
version = +platform[2];
|
|
||||||
|
|
||||||
switch (browser) {
|
|
||||||
case 'Android': return version >= 4.4;
|
|
||||||
case 'Opera': return version >= 10;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
// The platforms for Backbone tests.
|
|
||||||
if (isBackbone) {
|
|
||||||
platforms = _.filter(platforms, function(platform) {
|
|
||||||
var browser = browserName(platform[1]),
|
|
||||||
version = +platform[2];
|
|
||||||
|
|
||||||
switch (browser) {
|
|
||||||
case 'Firefox': return version >= 4;
|
|
||||||
case 'Internet Explorer': return version >= 7;
|
|
||||||
case 'iPad': return version >= 5;
|
|
||||||
case 'Opera': return version >= 12;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
// The platforms for modern builds.
|
|
||||||
if (isModern) {
|
|
||||||
platforms = _.filter(platforms, function(platform) {
|
|
||||||
var browser = browserName(platform[1]),
|
|
||||||
version = +platform[2];
|
|
||||||
|
|
||||||
switch (browser) {
|
|
||||||
case 'Android': return version >= 4.1;
|
|
||||||
case 'Firefox': return version >= 10;
|
|
||||||
case 'Internet Explorer': return version >= 9;
|
|
||||||
case 'iPad': return version >= 6;
|
|
||||||
case 'Opera': return version >= 12;
|
|
||||||
case 'Safari': return version >= 6;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Used as the default `Job` options object. */
|
|
||||||
var jobOptions = {
|
|
||||||
'build': build,
|
|
||||||
'command-timeout': commandTimeout,
|
|
||||||
'custom-data': customData,
|
|
||||||
'device-orientation': deviceOrientation,
|
|
||||||
'framework': framework,
|
|
||||||
'idle-timeout': idleTimeout,
|
|
||||||
'max-duration': maxDuration,
|
|
||||||
'name': jobName,
|
|
||||||
'public': publicAccess,
|
|
||||||
'platforms': platforms,
|
|
||||||
'record-screenshots': recordScreenshots,
|
|
||||||
'record-video': recordVideo,
|
|
||||||
'sauce-advisor': advisor,
|
|
||||||
'tags': tags,
|
|
||||||
'url': runnerUrl,
|
|
||||||
'video-upload-on-pass': videoUploadOnPass
|
|
||||||
};
|
|
||||||
|
|
||||||
if (publicAccess === true) {
|
|
||||||
jobOptions['public'] = 'public';
|
|
||||||
}
|
|
||||||
if (tunneled) {
|
|
||||||
jobOptions['tunnel-identifier'] = tunnelId;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*----------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Resolves the formal browser name for a given Sauce Labs browser identifier.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {string} identifier The browser identifier.
|
|
||||||
* @returns {string} Returns the formal browser name.
|
|
||||||
*/
|
|
||||||
function browserName(identifier) {
|
|
||||||
return browserNameMap[identifier] || capitalizeWords(identifier);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Capitalizes the first character of each word in `string`.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {string} string The string to augment.
|
|
||||||
* @returns {string} Returns the augmented string.
|
|
||||||
*/
|
|
||||||
function capitalizeWords(string) {
|
|
||||||
return _.map(string.split(' '), _.capitalize).join(' ');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the value for the given option name. If no value is available the
|
|
||||||
* `defaultValue` is returned.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {string} name The name of the option.
|
|
||||||
* @param {*} defaultValue The default option value.
|
|
||||||
* @returns {*} Returns the option value.
|
|
||||||
*/
|
|
||||||
function getOption(name, defaultValue) {
|
|
||||||
var isArr = _.isArray(defaultValue);
|
|
||||||
return _.reduce(process.argv, function(result, value) {
|
|
||||||
if (isArr) {
|
|
||||||
value = optionToArray(name, value);
|
|
||||||
return _.isEmpty(value) ? result : value;
|
|
||||||
}
|
|
||||||
value = optionToValue(name, value);
|
|
||||||
|
|
||||||
return value == null ? result : value;
|
|
||||||
}, defaultValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if `value` is a job ID.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {*} value The value to check.
|
|
||||||
* @returns {boolean} Returns `true` if `value` is a job ID, else `false`.
|
|
||||||
*/
|
|
||||||
function isJobId(value) {
|
|
||||||
return reJobId.test(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Writes an inline message to standard output.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {string} [text=''] The text to log.
|
|
||||||
*/
|
|
||||||
function logInline(text) {
|
|
||||||
var blankLine = _.repeat(' ', _.size(prevLine));
|
|
||||||
prevLine = text = _.truncate(text, { 'length': 40 });
|
|
||||||
process.stdout.write(text + blankLine.slice(text.length) + '\r');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Writes the wait throbber to standard output.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
function logThrobber() {
|
|
||||||
logInline('Please wait' + _.repeat('.', (++waitCount % 3) + 1));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Converts a comma separated option value into an array.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {string} name The name of the option to inspect.
|
|
||||||
* @param {string} string The options string.
|
|
||||||
* @returns {Array} Returns the new converted array.
|
|
||||||
*/
|
|
||||||
function optionToArray(name, string) {
|
|
||||||
return _.compact(_.invokeMap((optionToValue(name, string) || '').split(/, */), 'trim'));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extracts the option value from an option string.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {string} name The name of the option to inspect.
|
|
||||||
* @param {string} string The options string.
|
|
||||||
* @returns {string|undefined} Returns the option value, else `undefined`.
|
|
||||||
*/
|
|
||||||
function optionToValue(name, string) {
|
|
||||||
var result = string.match(RegExp('^' + name + '(?:=([\\s\\S]+))?$'));
|
|
||||||
if (result) {
|
|
||||||
result = _.result(result, 1);
|
|
||||||
result = result ? _.trim(result) : true;
|
|
||||||
}
|
|
||||||
if (result === 'false') {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return result || undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*----------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The `Job#remove` and `Tunnel#stop` callback used by `Jobs#restart`
|
|
||||||
* and `Tunnel#restart` respectively.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
function onGenericRestart() {
|
|
||||||
this.restarting = false;
|
|
||||||
this.emit('restart');
|
|
||||||
this.start();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The `request.put` and `SauceTunnel#stop` callback used by `Jobs#stop`
|
|
||||||
* and `Tunnel#stop` respectively.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {Object} [error] The error object.
|
|
||||||
*/
|
|
||||||
function onGenericStop(error) {
|
|
||||||
this.running = this.stopping = false;
|
|
||||||
this.emit('stop', error);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The `request.del` callback used by `Jobs#remove`.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
function onJobRemove(error, res, body) {
|
|
||||||
this.id = this.taskId = this.url = null;
|
|
||||||
this.removing = false;
|
|
||||||
this.emit('remove');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The `Job#remove` callback used by `Jobs#reset`.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
function onJobReset() {
|
|
||||||
this.attempts = 0;
|
|
||||||
this.failed = this.resetting = false;
|
|
||||||
this._pollerId = this.id = this.result = this.taskId = this.url = null;
|
|
||||||
this.emit('reset');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The `request.post` callback used by `Jobs#start`.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {Object} [error] The error object.
|
|
||||||
* @param {Object} res The response data object.
|
|
||||||
* @param {Object} body The response body JSON object.
|
|
||||||
*/
|
|
||||||
function onJobStart(error, res, body) {
|
|
||||||
this.starting = false;
|
|
||||||
|
|
||||||
if (this.stopping) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var statusCode = _.result(res, 'statusCode'),
|
|
||||||
taskId = _.first(_.result(body, 'js tests'));
|
|
||||||
|
|
||||||
if (error || !taskId || statusCode != 200) {
|
|
||||||
if (this.attempts < this.retries) {
|
|
||||||
this.restart();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var na = 'unavailable',
|
|
||||||
bodyStr = _.isObject(body) ? '\n' + JSON.stringify(body) : na,
|
|
||||||
statusStr = _.isFinite(statusCode) ? statusCode : na;
|
|
||||||
|
|
||||||
logInline();
|
|
||||||
console.error('Failed to start job; status: %s, body: %s', statusStr, bodyStr);
|
|
||||||
if (error) {
|
|
||||||
console.error(error);
|
|
||||||
}
|
|
||||||
this.failed = true;
|
|
||||||
this.emit('complete');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.running = true;
|
|
||||||
this.taskId = taskId;
|
|
||||||
this.timestamp = _.now();
|
|
||||||
this.emit('start');
|
|
||||||
this.status();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The `request.post` callback used by `Job#status`.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {Object} [error] The error object.
|
|
||||||
* @param {Object} res The response data object.
|
|
||||||
* @param {Object} body The response body JSON object.
|
|
||||||
*/
|
|
||||||
function onJobStatus(error, res, body) {
|
|
||||||
this.checking = false;
|
|
||||||
|
|
||||||
if (!this.running || this.stopping) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var completed = _.result(body, 'completed', false),
|
|
||||||
data = _.first(_.result(body, 'js tests')),
|
|
||||||
elapsed = (_.now() - this.timestamp) / 1000,
|
|
||||||
jobId = _.result(data, 'job_id', null),
|
|
||||||
jobResult = _.result(data, 'result', null),
|
|
||||||
jobStatus = _.result(data, 'status', ''),
|
|
||||||
jobUrl = _.result(data, 'url', null),
|
|
||||||
expired = (elapsed >= queueTimeout && !_.includes(jobStatus, 'in progress')),
|
|
||||||
options = this.options,
|
|
||||||
platform = options.platforms[0];
|
|
||||||
|
|
||||||
if (_.isObject(jobResult)) {
|
|
||||||
var message = _.result(jobResult, 'message');
|
|
||||||
} else {
|
|
||||||
if (typeof jobResult == 'string') {
|
|
||||||
message = jobResult;
|
|
||||||
}
|
|
||||||
jobResult = null;
|
|
||||||
}
|
|
||||||
if (isJobId(jobId)) {
|
|
||||||
this.id = jobId;
|
|
||||||
this.result = jobResult;
|
|
||||||
this.url = jobUrl;
|
|
||||||
} else {
|
|
||||||
completed = false;
|
|
||||||
}
|
|
||||||
this.emit('status', jobStatus);
|
|
||||||
|
|
||||||
if (!completed && !expired) {
|
|
||||||
this._pollerId = _.delay(_.bind(this.status, this), this.statusInterval * 1000);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var description = browserName(platform[1]) + ' ' + platform[2] + ' on ' + capitalizeWords(platform[0]),
|
|
||||||
errored = !jobResult || !jobResult.passed || reError.test(message) || reError.test(jobStatus),
|
|
||||||
failures = _.result(jobResult, 'failed'),
|
|
||||||
label = options.name + ':',
|
|
||||||
tunnel = this.tunnel;
|
|
||||||
|
|
||||||
if (errored || failures) {
|
|
||||||
if (errored && this.attempts < this.retries) {
|
|
||||||
this.restart();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var details = 'See ' + jobUrl + ' for details.';
|
|
||||||
this.failed = true;
|
|
||||||
|
|
||||||
logInline();
|
|
||||||
if (failures) {
|
|
||||||
console.error(label + ' %s ' + chalk.red('failed') + ' %d test' + (failures > 1 ? 's' : '') + '. %s', description, failures, details);
|
|
||||||
}
|
|
||||||
else if (tunnel.attempts < tunnel.retries) {
|
|
||||||
tunnel.restart();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (typeof message == 'undefined') {
|
|
||||||
message = 'Results are unavailable. ' + details;
|
|
||||||
}
|
|
||||||
console.error(label, description, chalk.red('failed') + ';', message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
logInline();
|
|
||||||
console.log(label, description, chalk.green('passed'));
|
|
||||||
}
|
|
||||||
this.running = false;
|
|
||||||
this.emit('complete');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The `SauceTunnel#start` callback used by `Tunnel#start`.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {boolean} success The connection success indicator.
|
|
||||||
*/
|
|
||||||
function onTunnelStart(success) {
|
|
||||||
this.starting = false;
|
|
||||||
|
|
||||||
if (this._timeoutId) {
|
|
||||||
clearTimeout(this._timeoutId);
|
|
||||||
this._timeoutId = null;
|
|
||||||
}
|
|
||||||
if (!success) {
|
|
||||||
if (this.attempts < this.retries) {
|
|
||||||
this.restart();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
logInline();
|
|
||||||
console.error('Failed to open Sauce Connect tunnel');
|
|
||||||
process.exit(2);
|
|
||||||
}
|
|
||||||
logInline();
|
|
||||||
console.log('Sauce Connect tunnel opened');
|
|
||||||
|
|
||||||
var jobs = this.jobs;
|
|
||||||
push.apply(jobs.queue, jobs.all);
|
|
||||||
|
|
||||||
this.running = true;
|
|
||||||
this.emit('start');
|
|
||||||
|
|
||||||
console.log('Starting jobs...');
|
|
||||||
this.dequeue();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*----------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Job constructor.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {Object} [properties] The properties to initialize a job with.
|
|
||||||
*/
|
|
||||||
function Job(properties) {
|
|
||||||
EventEmitter.call(this);
|
|
||||||
|
|
||||||
this.options = {};
|
|
||||||
_.merge(this, properties);
|
|
||||||
_.defaults(this.options, _.cloneDeep(jobOptions));
|
|
||||||
|
|
||||||
this.attempts = 0;
|
|
||||||
this.checking = this.failed = this.removing = this.resetting = this.restarting = this.running = this.starting = this.stopping = false;
|
|
||||||
this._pollerId = this.id = this.result = this.taskId = this.url = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
util.inherits(Job, EventEmitter);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes the job.
|
|
||||||
*
|
|
||||||
* @memberOf Job
|
|
||||||
* @param {Function} callback The function called once the job is removed.
|
|
||||||
* @param {Object} Returns the job instance.
|
|
||||||
*/
|
|
||||||
Job.prototype.remove = function(callback) {
|
|
||||||
this.once('remove', _.iteratee(callback));
|
|
||||||
if (this.removing) {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
this.removing = true;
|
|
||||||
return this.stop(function() {
|
|
||||||
var onRemove = _.bind(onJobRemove, this);
|
|
||||||
if (!this.id) {
|
|
||||||
_.defer(onRemove);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
request.del(_.template('https://saucelabs.com/rest/v1/${user}/jobs/${id}')(this), {
|
|
||||||
'auth': { 'user': this.user, 'pass': this.pass }
|
|
||||||
}, onRemove);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Resets the job.
|
|
||||||
*
|
|
||||||
* @memberOf Job
|
|
||||||
* @param {Function} callback The function called once the job is reset.
|
|
||||||
* @param {Object} Returns the job instance.
|
|
||||||
*/
|
|
||||||
Job.prototype.reset = function(callback) {
|
|
||||||
this.once('reset', _.iteratee(callback));
|
|
||||||
if (this.resetting) {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
this.resetting = true;
|
|
||||||
return this.remove(onJobReset);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Restarts the job.
|
|
||||||
*
|
|
||||||
* @memberOf Job
|
|
||||||
* @param {Function} callback The function called once the job is restarted.
|
|
||||||
* @param {Object} Returns the job instance.
|
|
||||||
*/
|
|
||||||
Job.prototype.restart = function(callback) {
|
|
||||||
this.once('restart', _.iteratee(callback));
|
|
||||||
if (this.restarting) {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
this.restarting = true;
|
|
||||||
|
|
||||||
var options = this.options,
|
|
||||||
platform = options.platforms[0],
|
|
||||||
description = browserName(platform[1]) + ' ' + platform[2] + ' on ' + capitalizeWords(platform[0]),
|
|
||||||
label = options.name + ':';
|
|
||||||
|
|
||||||
logInline();
|
|
||||||
console.log('%s %s restart %d of %d', label, description, ++this.attempts, this.retries);
|
|
||||||
|
|
||||||
return this.remove(onGenericRestart);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Starts the job.
|
|
||||||
*
|
|
||||||
* @memberOf Job
|
|
||||||
* @param {Function} callback The function called once the job is started.
|
|
||||||
* @param {Object} Returns the job instance.
|
|
||||||
*/
|
|
||||||
Job.prototype.start = function(callback) {
|
|
||||||
this.once('start', _.iteratee(callback));
|
|
||||||
if (this.starting || this.running) {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
this.starting = true;
|
|
||||||
request.post(_.template('https://saucelabs.com/rest/v1/${user}/js-tests')(this), {
|
|
||||||
'auth': { 'user': this.user, 'pass': this.pass },
|
|
||||||
'json': this.options
|
|
||||||
}, _.bind(onJobStart, this));
|
|
||||||
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks the status of a job.
|
|
||||||
*
|
|
||||||
* @memberOf Job
|
|
||||||
* @param {Function} callback The function called once the status is resolved.
|
|
||||||
* @param {Object} Returns the job instance.
|
|
||||||
*/
|
|
||||||
Job.prototype.status = function(callback) {
|
|
||||||
this.once('status', _.iteratee(callback));
|
|
||||||
if (this.checking || this.removing || this.resetting || this.restarting || this.starting || this.stopping) {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
this._pollerId = null;
|
|
||||||
this.checking = true;
|
|
||||||
request.post(_.template('https://saucelabs.com/rest/v1/${user}/js-tests/status')(this), {
|
|
||||||
'auth': { 'user': this.user, 'pass': this.pass },
|
|
||||||
'json': { 'js tests': [this.taskId] }
|
|
||||||
}, _.bind(onJobStatus, this));
|
|
||||||
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Stops the job.
|
|
||||||
*
|
|
||||||
* @memberOf Job
|
|
||||||
* @param {Function} callback The function called once the job is stopped.
|
|
||||||
* @param {Object} Returns the job instance.
|
|
||||||
*/
|
|
||||||
Job.prototype.stop = function(callback) {
|
|
||||||
this.once('stop', _.iteratee(callback));
|
|
||||||
if (this.stopping) {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
this.stopping = true;
|
|
||||||
if (this._pollerId) {
|
|
||||||
clearTimeout(this._pollerId);
|
|
||||||
this._pollerId = null;
|
|
||||||
this.checking = false;
|
|
||||||
}
|
|
||||||
var onStop = _.bind(onGenericStop, this);
|
|
||||||
if (!this.running || !this.id) {
|
|
||||||
_.defer(onStop);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
request.put(_.template('https://saucelabs.com/rest/v1/${user}/jobs/${id}/stop')(this), {
|
|
||||||
'auth': { 'user': this.user, 'pass': this.pass }
|
|
||||||
}, onStop);
|
|
||||||
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*----------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Tunnel constructor.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {Object} [properties] The properties to initialize the tunnel with.
|
|
||||||
*/
|
|
||||||
function Tunnel(properties) {
|
|
||||||
EventEmitter.call(this);
|
|
||||||
|
|
||||||
_.merge(this, properties);
|
|
||||||
|
|
||||||
var active = [],
|
|
||||||
queue = [];
|
|
||||||
|
|
||||||
var all = _.map(this.platforms, _.bind(function(platform) {
|
|
||||||
return new Job(_.merge({
|
|
||||||
'user': this.user,
|
|
||||||
'pass': this.pass,
|
|
||||||
'tunnel': this,
|
|
||||||
'options': { 'platforms': [platform] }
|
|
||||||
}, this.job));
|
|
||||||
}, this));
|
|
||||||
|
|
||||||
var completed = 0,
|
|
||||||
restarted = [],
|
|
||||||
success = true,
|
|
||||||
total = all.length,
|
|
||||||
tunnel = this;
|
|
||||||
|
|
||||||
_.invokeMap(all, 'on', 'complete', function() {
|
|
||||||
_.pull(active, this);
|
|
||||||
if (success) {
|
|
||||||
success = !this.failed;
|
|
||||||
}
|
|
||||||
if (++completed == total) {
|
|
||||||
tunnel.stop(_.partial(tunnel.emit, 'complete', success));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
tunnel.dequeue();
|
|
||||||
});
|
|
||||||
|
|
||||||
_.invokeMap(all, 'on', 'restart', function() {
|
|
||||||
if (!_.includes(restarted, this)) {
|
|
||||||
restarted.push(this);
|
|
||||||
}
|
|
||||||
// Restart tunnel if all active jobs have restarted.
|
|
||||||
var threshold = Math.min(all.length, _.isFinite(throttled) ? throttled : 3);
|
|
||||||
if (tunnel.attempts < tunnel.retries &&
|
|
||||||
active.length >= threshold && _.isEmpty(_.difference(active, restarted))) {
|
|
||||||
tunnel.restart();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
this.on('restart', function() {
|
|
||||||
completed = 0;
|
|
||||||
success = true;
|
|
||||||
restarted.length = 0;
|
|
||||||
});
|
|
||||||
|
|
||||||
this._timeoutId = null;
|
|
||||||
this.attempts = 0;
|
|
||||||
this.restarting = this.running = this.starting = this.stopping = false;
|
|
||||||
this.jobs = { 'active': active, 'all': all, 'queue': queue };
|
|
||||||
this.connection = new SauceTunnel(this.user, this.pass, this.id, this.tunneled, ['-P', '0']);
|
|
||||||
}
|
|
||||||
|
|
||||||
util.inherits(Tunnel, EventEmitter);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Restarts the tunnel.
|
|
||||||
*
|
|
||||||
* @memberOf Tunnel
|
|
||||||
* @param {Function} callback The function called once the tunnel is restarted.
|
|
||||||
*/
|
|
||||||
Tunnel.prototype.restart = function(callback) {
|
|
||||||
this.once('restart', _.iteratee(callback));
|
|
||||||
if (this.restarting) {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
this.restarting = true;
|
|
||||||
|
|
||||||
logInline();
|
|
||||||
console.log('Tunnel %s: restart %d of %d', this.id, ++this.attempts, this.retries);
|
|
||||||
|
|
||||||
var jobs = this.jobs,
|
|
||||||
active = jobs.active,
|
|
||||||
all = jobs.all;
|
|
||||||
|
|
||||||
var reset = _.after(all.length, _.bind(this.stop, this, onGenericRestart)),
|
|
||||||
stop = _.after(active.length, _.partial(_.invokeMap, all, 'reset', reset));
|
|
||||||
|
|
||||||
if (_.isEmpty(active)) {
|
|
||||||
_.defer(stop);
|
|
||||||
}
|
|
||||||
if (_.isEmpty(all)) {
|
|
||||||
_.defer(reset);
|
|
||||||
}
|
|
||||||
_.invokeMap(active, 'stop', function() {
|
|
||||||
_.pull(active, this);
|
|
||||||
stop();
|
|
||||||
});
|
|
||||||
|
|
||||||
if (this._timeoutId) {
|
|
||||||
clearTimeout(this._timeoutId);
|
|
||||||
this._timeoutId = null;
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Starts the tunnel.
|
|
||||||
*
|
|
||||||
* @memberOf Tunnel
|
|
||||||
* @param {Function} callback The function called once the tunnel is started.
|
|
||||||
* @param {Object} Returns the tunnel instance.
|
|
||||||
*/
|
|
||||||
Tunnel.prototype.start = function(callback) {
|
|
||||||
this.once('start', _.iteratee(callback));
|
|
||||||
if (this.starting || this.running) {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
this.starting = true;
|
|
||||||
|
|
||||||
logInline();
|
|
||||||
console.log('Opening Sauce Connect tunnel...');
|
|
||||||
|
|
||||||
var onStart = _.bind(onTunnelStart, this);
|
|
||||||
if (this.timeout) {
|
|
||||||
this._timeoutId = _.delay(onStart, this.timeout * 1000, false);
|
|
||||||
}
|
|
||||||
this.connection.start(onStart);
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes jobs from the queue and starts them.
|
|
||||||
*
|
|
||||||
* @memberOf Tunnel
|
|
||||||
* @param {Object} Returns the tunnel instance.
|
|
||||||
*/
|
|
||||||
Tunnel.prototype.dequeue = function() {
|
|
||||||
var jobs = this.jobs,
|
|
||||||
active = jobs.active,
|
|
||||||
queue = jobs.queue,
|
|
||||||
throttled = this.throttled;
|
|
||||||
|
|
||||||
while (queue.length && (active.length < throttled)) {
|
|
||||||
active.push(queue.shift().start());
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Stops the tunnel.
|
|
||||||
*
|
|
||||||
* @memberOf Tunnel
|
|
||||||
* @param {Function} callback The function called once the tunnel is stopped.
|
|
||||||
* @param {Object} Returns the tunnel instance.
|
|
||||||
*/
|
|
||||||
Tunnel.prototype.stop = function(callback) {
|
|
||||||
this.once('stop', _.iteratee(callback));
|
|
||||||
if (this.stopping) {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
this.stopping = true;
|
|
||||||
|
|
||||||
logInline();
|
|
||||||
console.log('Shutting down Sauce Connect tunnel...');
|
|
||||||
|
|
||||||
var jobs = this.jobs,
|
|
||||||
active = jobs.active;
|
|
||||||
|
|
||||||
var stop = _.after(active.length, _.bind(function() {
|
|
||||||
var onStop = _.bind(onGenericStop, this);
|
|
||||||
if (this.running) {
|
|
||||||
this.connection.stop(onStop);
|
|
||||||
} else {
|
|
||||||
onStop();
|
|
||||||
}
|
|
||||||
}, this));
|
|
||||||
|
|
||||||
jobs.queue.length = 0;
|
|
||||||
if (_.isEmpty(active)) {
|
|
||||||
_.defer(stop);
|
|
||||||
}
|
|
||||||
_.invokeMap(active, 'stop', function() {
|
|
||||||
_.pull(active, this);
|
|
||||||
stop();
|
|
||||||
});
|
|
||||||
|
|
||||||
if (this._timeoutId) {
|
|
||||||
clearTimeout(this._timeoutId);
|
|
||||||
this._timeoutId = null;
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*----------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
// Cleanup any inline logs when exited via `ctrl+c`.
|
|
||||||
process.on('SIGINT', function() {
|
|
||||||
logInline();
|
|
||||||
process.exit();
|
|
||||||
});
|
|
||||||
|
|
||||||
// Create a web server for the current working directory.
|
|
||||||
http.createServer(function(req, res) {
|
|
||||||
// See http://msdn.microsoft.com/en-us/library/ff955275(v=vs.85).aspx.
|
|
||||||
if (compatMode && path.extname(url.parse(req.url).pathname) == '.html') {
|
|
||||||
res.setHeader('X-UA-Compatible', 'IE=' + compatMode);
|
|
||||||
}
|
|
||||||
mount(req, res);
|
|
||||||
}).listen(port);
|
|
||||||
|
|
||||||
// Setup Sauce Connect so we can use this server from Sauce Labs.
|
|
||||||
var tunnel = new Tunnel({
|
|
||||||
'user': username,
|
|
||||||
'pass': accessKey,
|
|
||||||
'id': tunnelId,
|
|
||||||
'job': { 'retries': maxJobRetries, 'statusInterval': statusInterval },
|
|
||||||
'platforms': platforms,
|
|
||||||
'retries': maxTunnelRetries,
|
|
||||||
'throttled': throttled,
|
|
||||||
'tunneled': tunneled,
|
|
||||||
'timeout': tunnelTimeout
|
|
||||||
});
|
|
||||||
|
|
||||||
tunnel.on('complete', function(success) {
|
|
||||||
process.exit(success ? 0 : 1);
|
|
||||||
});
|
|
||||||
|
|
||||||
tunnel.start();
|
|
||||||
|
|
||||||
setInterval(logThrobber, throbberDelay);
|
|
||||||
1363
test/test-fp.js
1363
test/test-fp.js
File diff suppressed because it is too large
Load Diff
8279
test/test.js
8279
test/test.js
File diff suppressed because it is too large
Load Diff
@@ -56,9 +56,6 @@
|
|||||||
'works on an arguments object',
|
'works on an arguments object',
|
||||||
'can handle very deep arrays'
|
'can handle very deep arrays'
|
||||||
],
|
],
|
||||||
'head': [
|
|
||||||
'is an alias for first'
|
|
||||||
],
|
|
||||||
'indexOf': [
|
'indexOf': [
|
||||||
"sorted indexOf doesn't uses binary search",
|
"sorted indexOf doesn't uses binary search",
|
||||||
'0'
|
'0'
|
||||||
@@ -86,9 +83,6 @@
|
|||||||
'an array of pairs zipped together into an object',
|
'an array of pairs zipped together into an object',
|
||||||
'an object converted to pairs and back to an object'
|
'an object converted to pairs and back to an object'
|
||||||
],
|
],
|
||||||
'range': [
|
|
||||||
'range with two arguments a & b, b<a generates an empty array'
|
|
||||||
],
|
|
||||||
'rest': [
|
'rest': [
|
||||||
'returns the whole array when index is 0',
|
'returns the whole array when index is 0',
|
||||||
'returns elements starting at the given index',
|
'returns elements starting at the given index',
|
||||||
@@ -129,7 +123,8 @@
|
|||||||
'Iterating objects with sketchy length properties': true,
|
'Iterating objects with sketchy length properties': true,
|
||||||
'Resistant to collection length and properties changing while iterating': true,
|
'Resistant to collection length and properties changing while iterating': true,
|
||||||
'countBy': [
|
'countBy': [
|
||||||
'true'
|
'{}',
|
||||||
|
'[{}]'
|
||||||
],
|
],
|
||||||
'each': [
|
'each': [
|
||||||
'context object property accessed'
|
'context object property accessed'
|
||||||
@@ -141,24 +136,17 @@
|
|||||||
],
|
],
|
||||||
'filter': [
|
'filter': [
|
||||||
'given context',
|
'given context',
|
||||||
'[{"a":1,"b":2},{"a":1,"b":3},{"a":1,"b":4}]',
|
|
||||||
'[{"a":1,"b":2},{"a":2,"b":2}]',
|
|
||||||
'Empty object accepts all items',
|
|
||||||
'OO-filter'
|
'OO-filter'
|
||||||
],
|
],
|
||||||
'find': [
|
'find': [
|
||||||
'{"a":1,"b":4}',
|
|
||||||
'undefined when not found',
|
|
||||||
'undefined when searching empty list',
|
|
||||||
'works on objects',
|
|
||||||
'undefined',
|
|
||||||
'called with context'
|
'called with context'
|
||||||
],
|
],
|
||||||
'findWhere': [
|
'findWhere': [
|
||||||
'checks properties given function'
|
'checks properties given function'
|
||||||
],
|
],
|
||||||
'groupBy': [
|
'groupBy': [
|
||||||
'true'
|
'{}',
|
||||||
|
'[{}]'
|
||||||
],
|
],
|
||||||
'includes': [
|
'includes': [
|
||||||
"doesn't delegate to binary search"
|
"doesn't delegate to binary search"
|
||||||
@@ -198,8 +186,7 @@
|
|||||||
'partition': [
|
'partition': [
|
||||||
'can reference the array index',
|
'can reference the array index',
|
||||||
'Died on test #8',
|
'Died on test #8',
|
||||||
'partition takes a context argument',
|
'partition takes a context argument'
|
||||||
'function(a){[code]}'
|
|
||||||
],
|
],
|
||||||
'pluck': [
|
'pluck': [
|
||||||
'[1]'
|
'[1]'
|
||||||
@@ -223,39 +210,36 @@
|
|||||||
'checks properties given function'
|
'checks properties given function'
|
||||||
],
|
],
|
||||||
'Can use various collection methods on NodeLists': [
|
'Can use various collection methods on NodeLists': [
|
||||||
'<span id="id2"></span>',
|
'<span id="id2"></span>'
|
||||||
'<span id="id1"></span>'
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
'Functions': {
|
'Functions': {
|
||||||
'debounce asap': true,
|
'debounce asap': true,
|
||||||
'debounce asap cancel': true,
|
'debounce asap cancel': true,
|
||||||
'debounce after system time is set backwards': true,
|
|
||||||
'debounce asap recursively': true,
|
'debounce asap recursively': true,
|
||||||
|
'debounce after system time is set backwards': true,
|
||||||
|
'debounce re-entrant': true,
|
||||||
'throttle repeatedly with results': true,
|
'throttle repeatedly with results': true,
|
||||||
'more throttle does not trigger leading call when leading is set to false': true,
|
'more throttle does not trigger leading call when leading is set to false': true,
|
||||||
'throttle does not trigger trailing call when trailing is set to false': true,
|
'throttle does not trigger trailing call when trailing is set to false': true,
|
||||||
'before': [
|
'before': true,
|
||||||
'stores a memo to the last value',
|
|
||||||
'provides context'
|
|
||||||
],
|
|
||||||
'bind': [
|
'bind': [
|
||||||
'Died on test #2'
|
'Died on test #2'
|
||||||
],
|
],
|
||||||
'bindAll': [
|
'bindAll': [
|
||||||
'throws an error for bindAll with no functions named'
|
'throws an error for bindAll with no functions named'
|
||||||
],
|
],
|
||||||
|
'debounce': [
|
||||||
|
'incr was debounced'
|
||||||
|
],
|
||||||
|
'iteratee': [
|
||||||
|
'"bbiz"',
|
||||||
|
'"foo"',
|
||||||
|
'1'
|
||||||
|
],
|
||||||
'memoize': [
|
'memoize': [
|
||||||
'{"bar":"BAR","foo":"FOO"}',
|
'{"bar":"BAR","foo":"FOO"}',
|
||||||
'Died on test #8'
|
'Died on test #8'
|
||||||
],
|
|
||||||
'partial':[
|
|
||||||
'can partially apply with placeholders',
|
|
||||||
'accepts more arguments than the number of placeholders',
|
|
||||||
'accepts fewer arguments than the number of placeholders',
|
|
||||||
'unfilled placeholders are undefined',
|
|
||||||
'keeps prototype',
|
|
||||||
'allows the placeholder to be swapped out'
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
'Objects': {
|
'Objects': {
|
||||||
@@ -265,10 +249,6 @@
|
|||||||
'is not fooled by sparse arrays with additional properties',
|
'is not fooled by sparse arrays with additional properties',
|
||||||
'[]'
|
'[]'
|
||||||
],
|
],
|
||||||
'defaults': [
|
|
||||||
'defaults skips nulls',
|
|
||||||
'defaults skips undefined'
|
|
||||||
],
|
|
||||||
'extend': [
|
'extend': [
|
||||||
'extending null results in null',
|
'extending null results in null',
|
||||||
'extending undefined results in undefined'
|
'extending undefined results in undefined'
|
||||||
@@ -285,15 +265,13 @@
|
|||||||
'Commutative equality is implemented for `0` and `-0`',
|
'Commutative equality is implemented for `0` and `-0`',
|
||||||
'`new Number(0)` and `-0` are not equal',
|
'`new Number(0)` and `-0` are not equal',
|
||||||
'Commutative equality is implemented for `new Number(0)` and `-0`',
|
'Commutative equality is implemented for `new Number(0)` and `-0`',
|
||||||
|
'Invalid dates are not equal',
|
||||||
'false'
|
'false'
|
||||||
],
|
],
|
||||||
'isFinite': [
|
'isFinite': [
|
||||||
'Numeric strings are numbers',
|
'Numeric strings are numbers',
|
||||||
'Number instances can be finite'
|
'Number instances can be finite'
|
||||||
],
|
],
|
||||||
'isMatch': [
|
|
||||||
'doesnt falsey match constructor on undefined/null'
|
|
||||||
],
|
|
||||||
'isSet': [
|
'isSet': [
|
||||||
'Died on test #9'
|
'Died on test #9'
|
||||||
],
|
],
|
||||||
@@ -309,10 +287,6 @@
|
|||||||
'called with context',
|
'called with context',
|
||||||
'mapValue identity'
|
'mapValue identity'
|
||||||
],
|
],
|
||||||
'matcher': [
|
|
||||||
'null matches null',
|
|
||||||
'treats primitives as empty'
|
|
||||||
],
|
|
||||||
'omit': [
|
'omit': [
|
||||||
'can accept a predicate',
|
'can accept a predicate',
|
||||||
'function is given context'
|
'function is given context'
|
||||||
@@ -323,7 +297,12 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
'Utility': {
|
'Utility': {
|
||||||
'noConflict (node vm)': true,
|
'_.escape & unescape': [
|
||||||
|
'` is escaped',
|
||||||
|
'` can be unescaped',
|
||||||
|
'can escape multiple occurances of `',
|
||||||
|
'multiple occurrences of ` can be unescaped'
|
||||||
|
],
|
||||||
'now': [
|
'now': [
|
||||||
'Produces the correct time in milliseconds'
|
'Produces the correct time in milliseconds'
|
||||||
],
|
],
|
||||||
@@ -370,18 +349,20 @@
|
|||||||
var lodash = _.noConflict();
|
var lodash = _.noConflict();
|
||||||
|
|
||||||
return function(_) {
|
return function(_) {
|
||||||
lodash.defaultsDeep(_, { 'templateSettings': lodash.templateSettings });
|
lodash(_)
|
||||||
lodash.mixin(_, lodash.pick(lodash, lodash.difference(lodash.functions(lodash), lodash.functions(_))));
|
.defaultsDeep({ 'templateSettings': lodash.templateSettings })
|
||||||
|
.mixin(lodash.pick(lodash, lodash.difference(lodash.functions(lodash), lodash.functions(_))))
|
||||||
|
.value();
|
||||||
|
|
||||||
lodash.forOwn(keyMap, function(realName, otherName) {
|
lodash.forOwn(keyMap, function(realName, otherName) {
|
||||||
_[otherName] = lodash[realName];
|
_[otherName] = lodash[realName];
|
||||||
_.prototype[otherName] = lodash.prototype[realName];
|
_.prototype[otherName] = lodash.prototype[realName];
|
||||||
});
|
});
|
||||||
|
|
||||||
lodash.forOwn(aliasToReal, function(realName, alias) {
|
lodash.forOwn(aliasToReal, function(realName, alias) {
|
||||||
_[alias] = _[realName];
|
_[alias] = _[realName];
|
||||||
_.prototype[alias] = _.prototype[realName];
|
_.prototype[alias] = _.prototype[realName];
|
||||||
});
|
});
|
||||||
|
return _;
|
||||||
};
|
};
|
||||||
}());
|
}());
|
||||||
|
|
||||||
@@ -463,9 +444,12 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
QUnit.config.autostart = false;
|
QUnit.config.autostart = false;
|
||||||
|
QUnit.config.excused.Functions.iteratee = true;
|
||||||
|
QUnit.config.excused.Utility.noConflict = true;
|
||||||
|
QUnit.config.excused.Utility['noConflict (node vm)'] = true;
|
||||||
|
|
||||||
require(getConfig(), [moduleId], function(lodash) {
|
require(getConfig(), [moduleId], function(lodash) {
|
||||||
mixinPrereqs(lodash);
|
_ = mixinPrereqs(lodash);
|
||||||
require(getConfig(), [
|
require(getConfig(), [
|
||||||
'test/collections',
|
'test/collections',
|
||||||
'test/arrays',
|
'test/arrays',
|
||||||
@@ -474,9 +458,7 @@
|
|||||||
'test/cross-document',
|
'test/cross-document',
|
||||||
'test/utility',
|
'test/utility',
|
||||||
'test/chaining'
|
'test/chaining'
|
||||||
], function() {
|
], QUnit.start);
|
||||||
QUnit.start();
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
}());
|
}());
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
82
threat-model.md
Normal file
82
threat-model.md
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
# The Lodash Threat Model
|
||||||
|
|
||||||
|
The Lodash threat model defines what Lodash trusts and does not trust when executing within a JavaScript environment. Lodash is a general-purpose utility library that operates within the same trust boundaries as the code that calls it. Therefore, vulnerabilities requiring the compromise of trusted elements — such as the JavaScript runtime, the host environment, or developer-controlled inputs — lie outside the scope of this threat model.
|
||||||
|
|
||||||
|
For a vulnerability to be considered within scope, it must result from Lodash itself violating its documented behavior or failing to maintain integrity, confidentiality, or availability under its standard usage assumptions.
|
||||||
|
|
||||||
|
|
||||||
|
## Elements Lodash Does NOT Trust
|
||||||
|
|
||||||
|
1. **Data provided to Lodash functions**
|
||||||
|
Lodash treats all input data (arrays, objects, strings, functions, etc.) as untrusted. It does not attempt to validate or sanitize the semantic correctness of inputs — it operates on values as they are given.
|
||||||
|
*If an untrusted input can cause Lodash to execute behavior beyond what is documented — such as prototype pollution, type confusion, memory exhaustion, or code injection — that would indicate a security vulnerability.*
|
||||||
|
|
||||||
|
2. **Untrusted network sources or user-controlled data**
|
||||||
|
Any input derived from unvalidated user input, network responses, file contents, or deserialized data is untrusted. Lodash does not perform input isolation or sandboxing.
|
||||||
|
|
||||||
|
3. **Tampering with Lodash internals at runtime**
|
||||||
|
Modifying Lodash’s internal symbols, monkey-patching its functions, or overwriting internal references at runtime is outside the trusted boundary.
|
||||||
|
*If such modification changes Lodash behavior, that reflects a compromise of trusted code, not a Lodash vulnerability.*
|
||||||
|
|
||||||
|
|
||||||
|
## Elements Lodash Trusts
|
||||||
|
|
||||||
|
1. **The JavaScript runtime and its standard library**
|
||||||
|
Lodash assumes a correct, uncompromised runtime environment (e.g., Node.js, browser). Vulnerabilities in the runtime (e.g., prototype chain issues, engine crashes) are out of scope.
|
||||||
|
|
||||||
|
2. **The environment and its configuration**
|
||||||
|
Lodash relies on the correct functioning of the host environment (Node.js, browser, Deno, etc.) and any global objects or APIs it uses (e.g., `Object`, `Array`, `Function`, `JSON`).
|
||||||
|
|
||||||
|
3. **The code that invokes Lodash**
|
||||||
|
The application or library using Lodash is responsible for validating user input, performing security checks, and handling execution context appropriately.
|
||||||
|
|
||||||
|
4. **Installed package integrity**
|
||||||
|
Lodash assumes that the package installed (via npm, cdn, etc.) has not been tampered with and originates from the legitimate Lodash distribution channel.
|
||||||
|
*Supply-chain compromise or malicious clones are not considered Lodash vulnerabilities.*
|
||||||
|
|
||||||
|
5. **The privileges and permissions of the execution context**
|
||||||
|
Lodash inherits the privileges of the user or process that invokes it. Misuse or over-privileged execution environments (e.g., running as root, or with excessive browser permissions) are not within scope.
|
||||||
|
|
||||||
|
## Examples of Vulnerabilities (in scope)
|
||||||
|
|
||||||
|
- **Prototype Pollution ([CWE-1321](https://cwe.mitre.org/data/definitions/1321.html))**
|
||||||
|
If a Lodash function (e.g., `merge`, `defaultsDeep`, or `set`) allows modification of `Object.prototype` properties via untrusted input (e.g., `__proto__` keys) due to insufficient sanitization, it is in scope.
|
||||||
|
This class of vulnerability has been observed in prior Lodash versions (e.g., [CVE-2019-10744](https://www.cve.org/CVERecord?id=CVE-2019-10744)).
|
||||||
|
|
||||||
|
- **Unexpected code execution ([CWE-94](https://cwe.mitre.org/data/definitions/94.html))**
|
||||||
|
If a Lodash method (e.g., `template()`) executes attacker-controlled input as code without documented warnings or sanitization requirements, that is a Lodash vulnerability (e.g., [CVE-2021-23337](https://nvd.nist.gov/vuln/detail/CVE-2021-23337)).
|
||||||
|
|
||||||
|
- **Denial of Service (DoS) through logic flaws ([CWE-400](https://cwe.mitre.org/data/definitions/400.html))**
|
||||||
|
If Lodash enters unbounded recursion, excessive memory usage, or hangs when operating on otherwise valid inputs within documented usage limits, this is a vulnerability in Lodash (e.g, [CVE-2020-28500](https://www.cve.org/CVERecord?id=CVE-2020-28500)).
|
||||||
|
|
||||||
|
|
||||||
|
## Examples of Non-Vulnerabilities (out of scope)
|
||||||
|
|
||||||
|
### Malicious Third-Party Packages ([CWE-1357](https://cwe.mitre.org/data/definitions/1357.html))
|
||||||
|
|
||||||
|
If a project includes a malicious dependency that overrides Lodash behavior or injects malicious code into Lodash’s namespace, it does not represent a Lodash vulnerability. Lodash trusts its runtime and installation context.
|
||||||
|
|
||||||
|
### Unvalidated Application Input
|
||||||
|
|
||||||
|
Applications using Lodash are responsible for input validation. Passing attacker-controlled data directly into Lodash functions (e.g., `_.merge(req.body, config)`) is an application bug, not a Lodash vulnerability.
|
||||||
|
|
||||||
|
### Prototype Pollution via Trusted Code
|
||||||
|
|
||||||
|
If a developer intentionally merges user input into global objects or fails to isolate data structures, that is a misuse of Lodash’s documented API, not a Lodash defect.
|
||||||
|
|
||||||
|
### Vulnerabilities in the JavaScript Runtime or Platform
|
||||||
|
|
||||||
|
If a Lodash method triggers a bug in the JavaScript engine (e.g., V8, SpiderMonkey, JavaScriptCore) that leads to memory corruption or incorrect behavior, the vulnerability lies in the engine, not Lodash.
|
||||||
|
|
||||||
|
### Environmental Misconfiguration ([CWE-15](https://cwe.mitre.org/data/definitions/15.html))
|
||||||
|
|
||||||
|
Issues arising from misconfigured execution environments, such as running outdated Node.js versions or insecure Content Security Policies in browsers, are not considered Lodash vulnerabilities.
|
||||||
|
|
||||||
|
### Supply Chain Compromise
|
||||||
|
|
||||||
|
Tampering with Lodash packages in the npm registry, MITM attacks during installation, or local file system manipulation are not vulnerabilities in Lodash itself.
|
||||||
|
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
Lodash is a utility library operating entirely within the trust boundary of its caller. Vulnerabilities in scope are limited to cases where **Lodash fails to uphold its documented behavior** in the presence of **untrusted input**, without assuming compromise of trusted components such as the runtime, the operating system, or the invoking application code.
|
||||||
40
vendor/backbone/backbone.js
vendored
40
vendor/backbone/backbone.js
vendored
@@ -1,4 +1,4 @@
|
|||||||
// Backbone.js 1.3.2
|
// Backbone.js 1.3.3
|
||||||
|
|
||||||
// (c) 2010-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
// (c) 2010-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
||||||
// Backbone may be freely distributed under the MIT license.
|
// Backbone may be freely distributed under the MIT license.
|
||||||
@@ -44,7 +44,7 @@
|
|||||||
var slice = Array.prototype.slice;
|
var slice = Array.prototype.slice;
|
||||||
|
|
||||||
// Current version of the library. Keep in sync with `package.json`.
|
// Current version of the library. Keep in sync with `package.json`.
|
||||||
Backbone.VERSION = '1.3.2';
|
Backbone.VERSION = '1.3.3';
|
||||||
|
|
||||||
// For Backbone's purposes, jQuery, Zepto, Ender, or My Library (kidding) owns
|
// For Backbone's purposes, jQuery, Zepto, Ender, or My Library (kidding) owns
|
||||||
// the `$` variable.
|
// the `$` variable.
|
||||||
@@ -394,6 +394,7 @@
|
|||||||
var Model = Backbone.Model = function(attributes, options) {
|
var Model = Backbone.Model = function(attributes, options) {
|
||||||
var attrs = attributes || {};
|
var attrs = attributes || {};
|
||||||
options || (options = {});
|
options || (options = {});
|
||||||
|
this.preinitialize.apply(this, arguments);
|
||||||
this.cid = _.uniqueId(this.cidPrefix);
|
this.cid = _.uniqueId(this.cidPrefix);
|
||||||
this.attributes = {};
|
this.attributes = {};
|
||||||
if (options.collection) this.collection = options.collection;
|
if (options.collection) this.collection = options.collection;
|
||||||
@@ -422,6 +423,10 @@
|
|||||||
// You may want to override this if you're experiencing name clashes with model ids.
|
// You may want to override this if you're experiencing name clashes with model ids.
|
||||||
cidPrefix: 'c',
|
cidPrefix: 'c',
|
||||||
|
|
||||||
|
// preinitialize is an empty function by default. You can override it with a function
|
||||||
|
// or object. preinitialize will run before any instantiation logic is run in the Model.
|
||||||
|
preinitialize: function(){},
|
||||||
|
|
||||||
// Initialize is an empty function by default. Override it with your own
|
// Initialize is an empty function by default. Override it with your own
|
||||||
// initialization logic.
|
// initialization logic.
|
||||||
initialize: function(){},
|
initialize: function(){},
|
||||||
@@ -562,12 +567,14 @@
|
|||||||
if (!diff) return this.hasChanged() ? _.clone(this.changed) : false;
|
if (!diff) return this.hasChanged() ? _.clone(this.changed) : false;
|
||||||
var old = this._changing ? this._previousAttributes : this.attributes;
|
var old = this._changing ? this._previousAttributes : this.attributes;
|
||||||
var changed = {};
|
var changed = {};
|
||||||
|
var hasChanged;
|
||||||
for (var attr in diff) {
|
for (var attr in diff) {
|
||||||
var val = diff[attr];
|
var val = diff[attr];
|
||||||
if (_.isEqual(old[attr], val)) continue;
|
if (_.isEqual(old[attr], val)) continue;
|
||||||
changed[attr] = val;
|
changed[attr] = val;
|
||||||
|
hasChanged = true;
|
||||||
}
|
}
|
||||||
return _.size(changed) ? changed : false;
|
return hasChanged ? changed : false;
|
||||||
},
|
},
|
||||||
|
|
||||||
// Get the previous value of an attribute, recorded at the time the last
|
// Get the previous value of an attribute, recorded at the time the last
|
||||||
@@ -754,6 +761,7 @@
|
|||||||
// its models in sort order, as they're added and removed.
|
// its models in sort order, as they're added and removed.
|
||||||
var Collection = Backbone.Collection = function(models, options) {
|
var Collection = Backbone.Collection = function(models, options) {
|
||||||
options || (options = {});
|
options || (options = {});
|
||||||
|
this.preinitialize.apply(this, arguments);
|
||||||
if (options.model) this.model = options.model;
|
if (options.model) this.model = options.model;
|
||||||
if (options.comparator !== void 0) this.comparator = options.comparator;
|
if (options.comparator !== void 0) this.comparator = options.comparator;
|
||||||
this._reset();
|
this._reset();
|
||||||
@@ -783,6 +791,11 @@
|
|||||||
// This should be overridden in most cases.
|
// This should be overridden in most cases.
|
||||||
model: Model,
|
model: Model,
|
||||||
|
|
||||||
|
|
||||||
|
// preinitialize is an empty function by default. You can override it with a function
|
||||||
|
// or object. preinitialize will run before any instantiation logic is run in the Collection.
|
||||||
|
preinitialize: function(){},
|
||||||
|
|
||||||
// Initialize is an empty function by default. Override it with your own
|
// Initialize is an empty function by default. Override it with your own
|
||||||
// initialization logic.
|
// initialization logic.
|
||||||
initialize: function(){},
|
initialize: function(){},
|
||||||
@@ -1219,6 +1232,7 @@
|
|||||||
// if an existing element is not provided...
|
// if an existing element is not provided...
|
||||||
var View = Backbone.View = function(options) {
|
var View = Backbone.View = function(options) {
|
||||||
this.cid = _.uniqueId('view');
|
this.cid = _.uniqueId('view');
|
||||||
|
this.preinitialize.apply(this, arguments);
|
||||||
_.extend(this, _.pick(options, viewOptions));
|
_.extend(this, _.pick(options, viewOptions));
|
||||||
this._ensureElement();
|
this._ensureElement();
|
||||||
this.initialize.apply(this, arguments);
|
this.initialize.apply(this, arguments);
|
||||||
@@ -1242,6 +1256,10 @@
|
|||||||
return this.$el.find(selector);
|
return this.$el.find(selector);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// preinitialize is an empty function by default. You can override it with a function
|
||||||
|
// or object. preinitialize will run before any instantiation logic is run in the View
|
||||||
|
preinitialize: function(){},
|
||||||
|
|
||||||
// Initialize is an empty function by default. Override it with your own
|
// Initialize is an empty function by default. Override it with your own
|
||||||
// initialization logic.
|
// initialization logic.
|
||||||
initialize: function(){},
|
initialize: function(){},
|
||||||
@@ -1467,6 +1485,7 @@
|
|||||||
// matched. Creating a new one sets its `routes` hash, if not set statically.
|
// matched. Creating a new one sets its `routes` hash, if not set statically.
|
||||||
var Router = Backbone.Router = function(options) {
|
var Router = Backbone.Router = function(options) {
|
||||||
options || (options = {});
|
options || (options = {});
|
||||||
|
this.preinitialize.apply(this, arguments);
|
||||||
if (options.routes) this.routes = options.routes;
|
if (options.routes) this.routes = options.routes;
|
||||||
this._bindRoutes();
|
this._bindRoutes();
|
||||||
this.initialize.apply(this, arguments);
|
this.initialize.apply(this, arguments);
|
||||||
@@ -1482,6 +1501,10 @@
|
|||||||
// Set up all inheritable **Backbone.Router** properties and methods.
|
// Set up all inheritable **Backbone.Router** properties and methods.
|
||||||
_.extend(Router.prototype, Events, {
|
_.extend(Router.prototype, Events, {
|
||||||
|
|
||||||
|
// preinitialize is an empty function by default. You can override it with a function
|
||||||
|
// or object. preinitialize will run before any instantiation logic is run in the Router.
|
||||||
|
preinitialize: function(){},
|
||||||
|
|
||||||
// Initialize is an empty function by default. Override it with your own
|
// Initialize is an empty function by default. Override it with your own
|
||||||
// initialization logic.
|
// initialization logic.
|
||||||
initialize: function(){},
|
initialize: function(){},
|
||||||
@@ -1812,11 +1835,14 @@
|
|||||||
}
|
}
|
||||||
var url = rootPath + fragment;
|
var url = rootPath + fragment;
|
||||||
|
|
||||||
// Strip the hash and decode for matching.
|
// Strip the fragment of the query and hash for matching.
|
||||||
fragment = this.decodeFragment(fragment.replace(pathStripper, ''));
|
fragment = fragment.replace(pathStripper, '');
|
||||||
|
|
||||||
if (this.fragment === fragment) return;
|
// Decode for matching.
|
||||||
this.fragment = fragment;
|
var decodedFragment = this.decodeFragment(fragment);
|
||||||
|
|
||||||
|
if (this.fragment === decodedFragment) return;
|
||||||
|
this.fragment = decodedFragment;
|
||||||
|
|
||||||
// If pushState is available, we use it to set the fragment as a real URL.
|
// If pushState is available, we use it to set the fragment as a real URL.
|
||||||
if (this._usePushState) {
|
if (this._usePushState) {
|
||||||
|
|||||||
37
vendor/backbone/test/collection.js
vendored
37
vendor/backbone/test/collection.js
vendored
@@ -1,4 +1,4 @@
|
|||||||
(function() {
|
(function(QUnit) {
|
||||||
|
|
||||||
var a, b, c, d, e, col, otherCol;
|
var a, b, c, d, e, col, otherCol;
|
||||||
|
|
||||||
@@ -593,7 +593,7 @@
|
|||||||
assert.equal(error, 'fail');
|
assert.equal(error, 'fail');
|
||||||
assert.equal(options.validationError, 'fail');
|
assert.equal(options.validationError, 'fail');
|
||||||
});
|
});
|
||||||
assert.equal(collection.create({'foo': 'bar'}, {validate: true}), false);
|
assert.equal(collection.create({foo: 'bar'}, {validate: true}), false);
|
||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test('create will pass extra options to success callback', function(assert) {
|
QUnit.test('create will pass extra options to success callback', function(assert) {
|
||||||
@@ -661,6 +661,31 @@
|
|||||||
assert.equal(coll.one, 1);
|
assert.equal(coll.one, 1);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
QUnit.test('preinitialize', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var Collection = Backbone.Collection.extend({
|
||||||
|
preinitialize: function() {
|
||||||
|
this.one = 1;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var coll = new Collection;
|
||||||
|
assert.equal(coll.one, 1);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('preinitialize occurs before the collection is set up', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var Collection = Backbone.Collection.extend({
|
||||||
|
preinitialize: function() {
|
||||||
|
assert.notEqual(this.model, FooModel);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var FooModel = Backbone.Model.extend({id: 'foo'});
|
||||||
|
var coll = new Collection({}, {
|
||||||
|
model: FooModel
|
||||||
|
});
|
||||||
|
assert.equal(coll.model, FooModel);
|
||||||
|
});
|
||||||
|
|
||||||
QUnit.test('toJSON', function(assert) {
|
QUnit.test('toJSON', function(assert) {
|
||||||
assert.expect(1);
|
assert.expect(1);
|
||||||
assert.equal(JSON.stringify(col), '[{"id":3,"label":"a"},{"id":2,"label":"b"},{"id":1,"label":"c"},{"id":0,"label":"d"}]');
|
assert.equal(JSON.stringify(col), '[{"id":3,"label":"a"},{"id":2,"label":"b"},{"id":1,"label":"c"},{"id":0,"label":"d"}]');
|
||||||
@@ -1724,10 +1749,10 @@
|
|||||||
return new M(attrs);
|
return new M(attrs);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
var c2 = new C2({'_id': 1});
|
var c2 = new C2({_id: 1});
|
||||||
assert.equal(c2.get(1), void 0);
|
assert.equal(c2.get(1), void 0);
|
||||||
assert.equal(c2.modelId(c2.at(0).attributes), void 0);
|
assert.equal(c2.modelId(c2.at(0).attributes), void 0);
|
||||||
var m = new M({'_id': 2});
|
var m = new M({_id: 2});
|
||||||
c2.add(m);
|
c2.add(m);
|
||||||
assert.equal(c2.get(2), void 0);
|
assert.equal(c2.get(2), void 0);
|
||||||
assert.equal(c2.modelId(m.attributes), void 0);
|
assert.equal(c2.modelId(m.attributes), void 0);
|
||||||
@@ -1898,7 +1923,7 @@
|
|||||||
assert.deepEqual(changed.merged, []);
|
assert.deepEqual(changed.merged, []);
|
||||||
assert.ok(changed.removed.length === 2);
|
assert.ok(changed.removed.length === 2);
|
||||||
|
|
||||||
assert.ok(changed.removed.indexOf(model) > -1 && changed.removed.indexOf(model2) > -1);
|
assert.ok(_.indexOf(changed.removed, model) > -1 && _.indexOf(changed.removed, model2) > -1);
|
||||||
});
|
});
|
||||||
collection.remove([model, model2]);
|
collection.remove([model, model2]);
|
||||||
});
|
});
|
||||||
@@ -1995,4 +2020,4 @@
|
|||||||
assert.equal(fired, false);
|
assert.equal(fired, false);
|
||||||
});
|
});
|
||||||
|
|
||||||
})();
|
})(QUnit);
|
||||||
|
|||||||
4
vendor/backbone/test/events.js
vendored
4
vendor/backbone/test/events.js
vendored
@@ -1,4 +1,4 @@
|
|||||||
(function() {
|
(function(QUnit) {
|
||||||
|
|
||||||
QUnit.module('Backbone.Events');
|
QUnit.module('Backbone.Events');
|
||||||
|
|
||||||
@@ -703,4 +703,4 @@
|
|||||||
two.trigger('y', 2);
|
two.trigger('y', 2);
|
||||||
});
|
});
|
||||||
|
|
||||||
})();
|
})(QUnit);
|
||||||
|
|||||||
34
vendor/backbone/test/model.js
vendored
34
vendor/backbone/test/model.js
vendored
@@ -1,4 +1,4 @@
|
|||||||
(function() {
|
(function(QUnit) {
|
||||||
|
|
||||||
var ProxyModel = Backbone.Model.extend();
|
var ProxyModel = Backbone.Model.extend();
|
||||||
var Klass = Backbone.Collection.extend({
|
var Klass = Backbone.Collection.extend({
|
||||||
@@ -63,6 +63,36 @@
|
|||||||
assert.equal(model.get('value'), 2);
|
assert.equal(model.get('value'), 2);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
QUnit.test('preinitialize', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var Model = Backbone.Model.extend({
|
||||||
|
|
||||||
|
preinitialize: function() {
|
||||||
|
this.one = 1;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var model = new Model({}, {collection: collection});
|
||||||
|
assert.equal(model.one, 1);
|
||||||
|
assert.equal(model.collection, collection);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('preinitialize occurs before the model is set up', function(assert) {
|
||||||
|
assert.expect(6);
|
||||||
|
var Model = Backbone.Model.extend({
|
||||||
|
|
||||||
|
preinitialize: function() {
|
||||||
|
assert.equal(this.collection, undefined);
|
||||||
|
assert.equal(this.cid, undefined);
|
||||||
|
assert.equal(this.id, undefined);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var model = new Model({id: 'foo'}, {collection: collection});
|
||||||
|
assert.equal(model.collection, collection);
|
||||||
|
assert.equal(model.id, 'foo');
|
||||||
|
assert.notEqual(model.cid, undefined);
|
||||||
|
});
|
||||||
|
|
||||||
QUnit.test('parse can return null', function(assert) {
|
QUnit.test('parse can return null', function(assert) {
|
||||||
assert.expect(1);
|
assert.expect(1);
|
||||||
var Model = Backbone.Model.extend({
|
var Model = Backbone.Model.extend({
|
||||||
@@ -1415,4 +1445,4 @@
|
|||||||
assert.equal(model.id, 3);
|
assert.equal(model.id, 3);
|
||||||
});
|
});
|
||||||
|
|
||||||
})();
|
})(QUnit);
|
||||||
|
|||||||
4
vendor/backbone/test/noconflict.js
vendored
4
vendor/backbone/test/noconflict.js
vendored
@@ -1,4 +1,4 @@
|
|||||||
(function() {
|
(function(QUnit) {
|
||||||
|
|
||||||
QUnit.module('Backbone.noConflict');
|
QUnit.module('Backbone.noConflict');
|
||||||
|
|
||||||
@@ -10,4 +10,4 @@
|
|||||||
assert.equal(window.Backbone, noconflictBackbone, 'Backbone is still pointing to the original Backbone');
|
assert.equal(window.Backbone, noconflictBackbone, 'Backbone is still pointing to the original Backbone');
|
||||||
});
|
});
|
||||||
|
|
||||||
})();
|
})(QUnit);
|
||||||
|
|||||||
107
vendor/backbone/test/router.js
vendored
107
vendor/backbone/test/router.js
vendored
@@ -1,4 +1,4 @@
|
|||||||
(function() {
|
(function(QUnit) {
|
||||||
|
|
||||||
var router = null;
|
var router = null;
|
||||||
var location = null;
|
var location = null;
|
||||||
@@ -28,7 +28,8 @@
|
|||||||
'fragment',
|
'fragment',
|
||||||
'pathname',
|
'pathname',
|
||||||
'protocol'
|
'protocol'
|
||||||
));
|
));
|
||||||
|
|
||||||
// In IE, anchor.pathname does not contain a leading slash though
|
// In IE, anchor.pathname does not contain a leading slash though
|
||||||
// window.location.pathname does.
|
// window.location.pathname does.
|
||||||
if (!/^\//.test(this.pathname)) this.pathname = '/' + this.pathname;
|
if (!/^\//.test(this.pathname)) this.pathname = '/' + this.pathname;
|
||||||
@@ -42,7 +43,7 @@
|
|||||||
|
|
||||||
QUnit.module('Backbone.Router', {
|
QUnit.module('Backbone.Router', {
|
||||||
|
|
||||||
setup: function() {
|
beforeEach: function() {
|
||||||
location = new Location('http://example.com');
|
location = new Location('http://example.com');
|
||||||
Backbone.history = _.extend(new Backbone.History, {location: location});
|
Backbone.history = _.extend(new Backbone.History, {location: location});
|
||||||
router = new Router({testing: 101});
|
router = new Router({testing: 101});
|
||||||
@@ -53,7 +54,7 @@
|
|||||||
Backbone.history.on('route', onRoute);
|
Backbone.history.on('route', onRoute);
|
||||||
},
|
},
|
||||||
|
|
||||||
teardown: function() {
|
afterEach: function() {
|
||||||
Backbone.history.stop();
|
Backbone.history.stop();
|
||||||
Backbone.history.off('route', onRoute);
|
Backbone.history.off('route', onRoute);
|
||||||
}
|
}
|
||||||
@@ -95,6 +96,10 @@
|
|||||||
'*anything': 'anything'
|
'*anything': 'anything'
|
||||||
},
|
},
|
||||||
|
|
||||||
|
preinitialize: function(options) {
|
||||||
|
this.testpreinit = 'foo';
|
||||||
|
},
|
||||||
|
|
||||||
initialize: function(options) {
|
initialize: function(options) {
|
||||||
this.testing = options.testing;
|
this.testing = options.testing;
|
||||||
this.route('implicit', 'implicit');
|
this.route('implicit', 'implicit');
|
||||||
@@ -121,19 +126,19 @@
|
|||||||
this.charType = 'escaped';
|
this.charType = 'escaped';
|
||||||
},
|
},
|
||||||
|
|
||||||
contacts: function(){
|
contacts: function() {
|
||||||
this.contact = 'index';
|
this.contact = 'index';
|
||||||
},
|
},
|
||||||
|
|
||||||
newContact: function(){
|
newContact: function() {
|
||||||
this.contact = 'new';
|
this.contact = 'new';
|
||||||
},
|
},
|
||||||
|
|
||||||
loadContact: function(){
|
loadContact: function() {
|
||||||
this.contact = 'load';
|
this.contact = 'load';
|
||||||
},
|
},
|
||||||
|
|
||||||
optionalItem: function(arg){
|
optionalItem: function(arg) {
|
||||||
this.arg = arg !== void 0 ? arg : null;
|
this.arg = arg !== void 0 ? arg : null;
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -181,6 +186,11 @@
|
|||||||
assert.equal(router.testing, 101);
|
assert.equal(router.testing, 101);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
QUnit.test('preinitialize', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
assert.equal(router.testpreinit, 'foo');
|
||||||
|
});
|
||||||
|
|
||||||
QUnit.test('routes (simple)', function(assert) {
|
QUnit.test('routes (simple)', function(assert) {
|
||||||
assert.expect(4);
|
assert.expect(4);
|
||||||
location.replace('http://example.com#search/news');
|
location.replace('http://example.com#search/news');
|
||||||
@@ -234,10 +244,11 @@
|
|||||||
assert.ok(Backbone.history.navigate('search/manhattan/p20', true));
|
assert.ok(Backbone.history.navigate('search/manhattan/p20', true));
|
||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test('route precedence via navigate', function(assert){
|
QUnit.test('route precedence via navigate', function(assert) {
|
||||||
assert.expect(6);
|
assert.expect(6);
|
||||||
// check both 0.9.x and backwards-compatibility options
|
|
||||||
_.each([{trigger: true}, true], function( options ){
|
// Check both 0.9.x and backwards-compatibility options
|
||||||
|
_.each([{trigger: true}, true], function(options) {
|
||||||
Backbone.history.navigate('contacts', options);
|
Backbone.history.navigate('contacts', options);
|
||||||
assert.equal(router.contact, 'index');
|
assert.equal(router.contact, 'index');
|
||||||
Backbone.history.navigate('contacts/new', options);
|
Backbone.history.navigate('contacts/new', options);
|
||||||
@@ -249,7 +260,7 @@
|
|||||||
|
|
||||||
QUnit.test('loadUrl is not called for identical routes.', function(assert) {
|
QUnit.test('loadUrl is not called for identical routes.', function(assert) {
|
||||||
assert.expect(0);
|
assert.expect(0);
|
||||||
Backbone.history.loadUrl = function(){ assert.ok(false); };
|
Backbone.history.loadUrl = function() { assert.ok(false); };
|
||||||
location.replace('http://example.com#route');
|
location.replace('http://example.com#route');
|
||||||
Backbone.history.navigate('route');
|
Backbone.history.navigate('route');
|
||||||
Backbone.history.navigate('/route');
|
Backbone.history.navigate('/route');
|
||||||
@@ -345,9 +356,9 @@
|
|||||||
assert.strictEqual(router.path, 'c/d/e');
|
assert.strictEqual(router.path, 'c/d/e');
|
||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test("fires event when router doesn't have callback on it", function(assert) {
|
QUnit.test('fires event when router doesn\'t have callback on it', function(assert) {
|
||||||
assert.expect(1);
|
assert.expect(1);
|
||||||
router.on('route:noCallback', function(){ assert.ok(true); });
|
router.on('route:noCallback', function() { assert.ok(true); });
|
||||||
location.replace('http://example.com#noCallback');
|
location.replace('http://example.com#noCallback');
|
||||||
Backbone.history.checkUrl();
|
Backbone.history.checkUrl();
|
||||||
});
|
});
|
||||||
@@ -536,8 +547,8 @@
|
|||||||
Backbone.history = _.extend(new Backbone.History, {
|
Backbone.history = _.extend(new Backbone.History, {
|
||||||
location: location,
|
location: location,
|
||||||
history: {
|
history: {
|
||||||
pushState: function(){},
|
pushState: function() {},
|
||||||
replaceState: function(){}
|
replaceState: function() {}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
Backbone.history.start({root: 'root'});
|
Backbone.history.start({root: 'root'});
|
||||||
@@ -551,8 +562,8 @@
|
|||||||
Backbone.history = _.extend(new Backbone.History, {
|
Backbone.history = _.extend(new Backbone.History, {
|
||||||
location: location,
|
location: location,
|
||||||
history: {
|
history: {
|
||||||
pushState: function(){},
|
pushState: function() {},
|
||||||
replaceState: function(state, title, url){
|
replaceState: function(state, title, url) {
|
||||||
assert.strictEqual(url, '/root/x/y');
|
assert.strictEqual(url, '/root/x/y');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -570,8 +581,8 @@
|
|||||||
Backbone.history = _.extend(new Backbone.History, {
|
Backbone.history = _.extend(new Backbone.History, {
|
||||||
location: location,
|
location: location,
|
||||||
history: {
|
history: {
|
||||||
pushState: function(){},
|
pushState: function() {},
|
||||||
replaceState: function(){}
|
replaceState: function() {}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
Backbone.history.start({root: ''});
|
Backbone.history.start({root: ''});
|
||||||
@@ -625,8 +636,8 @@
|
|||||||
Backbone.history = _.extend(new Backbone.History, {
|
Backbone.history = _.extend(new Backbone.History, {
|
||||||
location: location,
|
location: location,
|
||||||
history: {
|
history: {
|
||||||
pushState: function(){},
|
pushState: function() {},
|
||||||
replaceState: function(state, title, url){
|
replaceState: function(state, title, url) {
|
||||||
assert.strictEqual(url, '/root/x/y?a=b');
|
assert.strictEqual(url, '/root/x/y?a=b');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -641,8 +652,8 @@
|
|||||||
assert.expect(1);
|
assert.expect(1);
|
||||||
var MyRouter = Backbone.Router.extend({
|
var MyRouter = Backbone.Router.extend({
|
||||||
routes: {'': 'empty'},
|
routes: {'': 'empty'},
|
||||||
empty: function(){},
|
empty: function() {},
|
||||||
route: function(route){
|
route: function(route) {
|
||||||
assert.strictEqual(route, '');
|
assert.strictEqual(route, '');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -655,7 +666,8 @@
|
|||||||
assert.strictEqual(history.getFragment('fragment '), 'fragment');
|
assert.strictEqual(history.getFragment('fragment '), 'fragment');
|
||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test('#1820 - Leading slash and trailing space.', 1, function(assert) {
|
QUnit.test('#1820 - Leading slash and trailing space.', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
var history = new Backbone.History;
|
var history = new Backbone.History;
|
||||||
assert.strictEqual(history.getFragment('/fragment '), 'fragment');
|
assert.strictEqual(history.getFragment('/fragment '), 'fragment');
|
||||||
});
|
});
|
||||||
@@ -670,7 +682,7 @@
|
|||||||
assert.strictEqual(router.z, '123');
|
assert.strictEqual(router.z, '123');
|
||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test("#2062 - Trigger 'route' event on router instance.", function(assert) {
|
QUnit.test('#2062 - Trigger "route" event on router instance.', function(assert) {
|
||||||
assert.expect(2);
|
assert.expect(2);
|
||||||
router.on('route', function(name, args) {
|
router.on('route', function(name, args) {
|
||||||
assert.strictEqual(name, 'routeEvent');
|
assert.strictEqual(name, 'routeEvent');
|
||||||
@@ -709,8 +721,8 @@
|
|||||||
Backbone.history = _.extend(new Backbone.History, {
|
Backbone.history = _.extend(new Backbone.History, {
|
||||||
location: location,
|
location: location,
|
||||||
history: {
|
history: {
|
||||||
pushState: function(){},
|
pushState: function() {},
|
||||||
replaceState: function(){ assert.ok(false); }
|
replaceState: function() { assert.ok(false); }
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
Backbone.history.start({
|
Backbone.history.start({
|
||||||
@@ -726,8 +738,8 @@
|
|||||||
Backbone.history = _.extend(new Backbone.History, {
|
Backbone.history = _.extend(new Backbone.History, {
|
||||||
location: location,
|
location: location,
|
||||||
history: {
|
history: {
|
||||||
pushState: function(){},
|
pushState: function() {},
|
||||||
replaceState: function(){}
|
replaceState: function() {}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -753,7 +765,7 @@
|
|||||||
Backbone.history = _.extend(new Backbone.History, {
|
Backbone.history = _.extend(new Backbone.History, {
|
||||||
location: location,
|
location: location,
|
||||||
history: {
|
history: {
|
||||||
pushState: function(state, title, url){
|
pushState: function(state, title, url) {
|
||||||
assert.strictEqual(url, '/root');
|
assert.strictEqual(url, '/root');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -785,7 +797,7 @@
|
|||||||
Backbone.history = _.extend(new Backbone.History, {
|
Backbone.history = _.extend(new Backbone.History, {
|
||||||
location: location,
|
location: location,
|
||||||
history: {
|
history: {
|
||||||
pushState: function(state, title, url){
|
pushState: function(state, title, url) {
|
||||||
assert.strictEqual(url, '/root?x=1');
|
assert.strictEqual(url, '/root?x=1');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -823,7 +835,7 @@
|
|||||||
assert.expect(1);
|
assert.expect(1);
|
||||||
var MyRouter = Backbone.Router.extend({
|
var MyRouter = Backbone.Router.extend({
|
||||||
routes: {
|
routes: {
|
||||||
path: function(params){
|
path: function(params) {
|
||||||
assert.strictEqual(params, 'x=y%3Fz');
|
assert.strictEqual(params, 'x=y%3Fz');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -921,7 +933,7 @@
|
|||||||
Backbone.history = _.extend(new Backbone.History, {location: location});
|
Backbone.history = _.extend(new Backbone.History, {location: location});
|
||||||
var MyRouter = Backbone.Router.extend({
|
var MyRouter = Backbone.Router.extend({
|
||||||
routes: {'foo/:id/bar': 'foo'},
|
routes: {'foo/:id/bar': 'foo'},
|
||||||
foo: function(){},
|
foo: function() {},
|
||||||
execute: function(callback, args, name) {
|
execute: function(callback, args, name) {
|
||||||
assert.strictEqual(callback, this.foo);
|
assert.strictEqual(callback, this.foo);
|
||||||
assert.deepEqual(args, ['123', 'x=y']);
|
assert.deepEqual(args, ['123', 'x=y']);
|
||||||
@@ -953,8 +965,8 @@
|
|||||||
Backbone.history = _.extend(new Backbone.History, {
|
Backbone.history = _.extend(new Backbone.History, {
|
||||||
location: location,
|
location: location,
|
||||||
history: {
|
history: {
|
||||||
pushState: function(){ assert.ok(false); },
|
pushState: function() { assert.ok(false); },
|
||||||
replaceState: function(){ assert.ok(false); }
|
replaceState: function() { assert.ok(false); }
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
Backbone.history.start({pushState: true});
|
Backbone.history.start({pushState: true});
|
||||||
@@ -991,14 +1003,14 @@
|
|||||||
Backbone.history.start({root: '/root', pushState: true});
|
Backbone.history.start({root: '/root', pushState: true});
|
||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test("Paths that don't match the root should not match no root", function(assert) {
|
QUnit.test('Paths that don\'t match the root should not match no root', function(assert) {
|
||||||
assert.expect(0);
|
assert.expect(0);
|
||||||
location.replace('http://example.com/foo');
|
location.replace('http://example.com/foo');
|
||||||
Backbone.history.stop();
|
Backbone.history.stop();
|
||||||
Backbone.history = _.extend(new Backbone.History, {location: location});
|
Backbone.history = _.extend(new Backbone.History, {location: location});
|
||||||
var MyRouter = Backbone.Router.extend({
|
var MyRouter = Backbone.Router.extend({
|
||||||
routes: {
|
routes: {
|
||||||
foo: function(){
|
foo: function() {
|
||||||
assert.ok(false, 'should not match unless root matches');
|
assert.ok(false, 'should not match unless root matches');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1007,14 +1019,14 @@
|
|||||||
Backbone.history.start({root: 'root', pushState: true});
|
Backbone.history.start({root: 'root', pushState: true});
|
||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test("Paths that don't match the root should not match roots of the same length", function(assert) {
|
QUnit.test('Paths that don\'t match the root should not match roots of the same length', function(assert) {
|
||||||
assert.expect(0);
|
assert.expect(0);
|
||||||
location.replace('http://example.com/xxxx/foo');
|
location.replace('http://example.com/xxxx/foo');
|
||||||
Backbone.history.stop();
|
Backbone.history.stop();
|
||||||
Backbone.history = _.extend(new Backbone.History, {location: location});
|
Backbone.history = _.extend(new Backbone.History, {location: location});
|
||||||
var MyRouter = Backbone.Router.extend({
|
var MyRouter = Backbone.Router.extend({
|
||||||
routes: {
|
routes: {
|
||||||
foo: function(){
|
foo: function() {
|
||||||
assert.ok(false, 'should not match unless root matches');
|
assert.ok(false, 'should not match unless root matches');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1029,7 +1041,7 @@
|
|||||||
Backbone.history.stop();
|
Backbone.history.stop();
|
||||||
Backbone.history = _.extend(new Backbone.History, {location: location});
|
Backbone.history = _.extend(new Backbone.History, {location: location});
|
||||||
var MyRouter = Backbone.Router.extend({
|
var MyRouter = Backbone.Router.extend({
|
||||||
routes: {foo: function(){ assert.ok(true); }}
|
routes: {foo: function() { assert.ok(true); }}
|
||||||
});
|
});
|
||||||
var myRouter = new MyRouter;
|
var myRouter = new MyRouter;
|
||||||
Backbone.history.start({root: 'x+y.z', pushState: true});
|
Backbone.history.start({root: 'x+y.z', pushState: true});
|
||||||
@@ -1041,7 +1053,7 @@
|
|||||||
Backbone.history.stop();
|
Backbone.history.stop();
|
||||||
Backbone.history = _.extend(new Backbone.History, {location: location});
|
Backbone.history = _.extend(new Backbone.History, {location: location});
|
||||||
var MyRouter = Backbone.Router.extend({
|
var MyRouter = Backbone.Router.extend({
|
||||||
routes: {foo: function(){ assert.ok(true); }}
|
routes: {foo: function() { assert.ok(true); }}
|
||||||
});
|
});
|
||||||
var myRouter = new MyRouter;
|
var myRouter = new MyRouter;
|
||||||
Backbone.history.start({root: '®ooτ', pushState: true});
|
Backbone.history.start({root: '®ooτ', pushState: true});
|
||||||
@@ -1053,10 +1065,17 @@
|
|||||||
Backbone.history.stop();
|
Backbone.history.stop();
|
||||||
Backbone.history = _.extend(new Backbone.History, {location: location});
|
Backbone.history = _.extend(new Backbone.History, {location: location});
|
||||||
var MyRouter = Backbone.Router.extend({
|
var MyRouter = Backbone.Router.extend({
|
||||||
routes: {'': function(){ assert.ok(true); }}
|
routes: {'': function() { assert.ok(true); }}
|
||||||
});
|
});
|
||||||
var myRouter = new MyRouter;
|
var myRouter = new MyRouter;
|
||||||
Backbone.history.start({root: '®ooτ', pushState: true});
|
Backbone.history.start({root: '®ooτ', pushState: true});
|
||||||
});
|
});
|
||||||
|
|
||||||
})();
|
QUnit.test('#4025 - navigate updates URL hash as is', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var route = 'search/has%20space';
|
||||||
|
Backbone.history.navigate(route);
|
||||||
|
assert.strictEqual(location.hash, '#' + route);
|
||||||
|
});
|
||||||
|
|
||||||
|
})(QUnit);
|
||||||
|
|||||||
6
vendor/backbone/test/setup/environment.js
vendored
6
vendor/backbone/test/setup/environment.js
vendored
@@ -1,4 +1,4 @@
|
|||||||
(function() {
|
(function(QUnit) {
|
||||||
|
|
||||||
var sync = Backbone.sync;
|
var sync = Backbone.sync;
|
||||||
var ajax = Backbone.ajax;
|
var ajax = Backbone.ajax;
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
var env = QUnit.config.current.testEnvironment;
|
var env = QUnit.config.current.testEnvironment;
|
||||||
|
|
||||||
// We never want to actually call these during tests.
|
// We never want to actually call these during tests.
|
||||||
history.pushState = history.replaceState = function(){};
|
history.pushState = history.replaceState = function() {};
|
||||||
|
|
||||||
// Capture ajax settings for comparison.
|
// Capture ajax settings for comparison.
|
||||||
Backbone.ajax = function(settings) {
|
Backbone.ajax = function(settings) {
|
||||||
@@ -42,4 +42,4 @@
|
|||||||
history.replaceState = replaceState;
|
history.replaceState = replaceState;
|
||||||
});
|
});
|
||||||
|
|
||||||
})();
|
})(QUnit);
|
||||||
|
|||||||
6
vendor/backbone/test/sync.js
vendored
6
vendor/backbone/test/sync.js
vendored
@@ -1,4 +1,4 @@
|
|||||||
(function() {
|
(function(QUnit) {
|
||||||
|
|
||||||
var Library = Backbone.Collection.extend({
|
var Library = Backbone.Collection.extend({
|
||||||
url: function() { return '/library'; }
|
url: function() { return '/library'; }
|
||||||
@@ -158,7 +158,7 @@
|
|||||||
|
|
||||||
QUnit.test('Backbone.ajax', function(assert) {
|
QUnit.test('Backbone.ajax', function(assert) {
|
||||||
assert.expect(1);
|
assert.expect(1);
|
||||||
Backbone.ajax = function(settings){
|
Backbone.ajax = function(settings) {
|
||||||
assert.strictEqual(settings.url, '/test');
|
assert.strictEqual(settings.url, '/test');
|
||||||
};
|
};
|
||||||
var model = new Backbone.Model();
|
var model = new Backbone.Model();
|
||||||
@@ -236,4 +236,4 @@
|
|||||||
this.ajaxSettings.error({}, 'textStatus', 'errorThrown');
|
this.ajaxSettings.error({}, 'textStatus', 'errorThrown');
|
||||||
});
|
});
|
||||||
|
|
||||||
})();
|
})(QUnit);
|
||||||
|
|||||||
52
vendor/backbone/test/view.js
vendored
52
vendor/backbone/test/view.js
vendored
@@ -1,19 +1,24 @@
|
|||||||
(function() {
|
(function(QUnit) {
|
||||||
|
|
||||||
var view;
|
var view;
|
||||||
|
|
||||||
QUnit.module('Backbone.View', {
|
QUnit.module('Backbone.View', {
|
||||||
|
|
||||||
beforeEach: function(assert) {
|
beforeEach: function() {
|
||||||
$('#qunit-fixture').append(
|
$('#qunit-fixture').append(
|
||||||
'<div id="testElement"><h1>Test</h1></div>'
|
'<div id="testElement"><h1>Test</h1></div>'
|
||||||
);
|
);
|
||||||
|
|
||||||
view = new Backbone.View({
|
view = new Backbone.View({
|
||||||
id: 'test-view',
|
id: 'test-view',
|
||||||
className: 'test-view',
|
className: 'test-view',
|
||||||
other: 'non-special-option'
|
other: 'non-special-option'
|
||||||
});
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
afterEach: function() {
|
||||||
|
$('#testElement').remove();
|
||||||
|
$('#test-view').remove();
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
@@ -56,6 +61,28 @@
|
|||||||
assert.strictEqual(new View().one, 1);
|
assert.strictEqual(new View().one, 1);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
QUnit.test('preinitialize', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var View = Backbone.View.extend({
|
||||||
|
preinitialize: function() {
|
||||||
|
this.one = 1;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.strictEqual(new View().one, 1);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('preinitialize occurs before the view is set up', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var View = Backbone.View.extend({
|
||||||
|
preinitialize: function() {
|
||||||
|
assert.equal(this.el, undefined);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var _view = new View({});
|
||||||
|
assert.notEqual(_view.el, undefined);
|
||||||
|
});
|
||||||
|
|
||||||
QUnit.test('render', function(assert) {
|
QUnit.test('render', function(assert) {
|
||||||
assert.expect(1);
|
assert.expect(1);
|
||||||
var myView = new Backbone.View;
|
var myView = new Backbone.View;
|
||||||
@@ -67,8 +94,8 @@
|
|||||||
var counter1 = 0, counter2 = 0;
|
var counter1 = 0, counter2 = 0;
|
||||||
|
|
||||||
var myView = new Backbone.View({el: '#testElement'});
|
var myView = new Backbone.View({el: '#testElement'});
|
||||||
myView.increment = function(){ counter1++; };
|
myView.increment = function() { counter1++; };
|
||||||
myView.$el.on('click', function(){ counter2++; });
|
myView.$el.on('click', function() { counter2++; });
|
||||||
|
|
||||||
var events = {'click h1': 'increment'};
|
var events = {'click h1': 'increment'};
|
||||||
|
|
||||||
@@ -124,11 +151,10 @@
|
|||||||
assert.equal(myView.counter, 3);
|
assert.equal(myView.counter, 3);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
QUnit.test('delegateEvents ignore undefined methods', function(assert) {
|
QUnit.test('delegateEvents ignore undefined methods', function(assert) {
|
||||||
assert.expect(0);
|
assert.expect(0);
|
||||||
var myView = new Backbone.View({el: '<p></p>'});
|
var myView = new Backbone.View({el: '<p></p>'});
|
||||||
myView.delegateEvents({'click': 'undefinedMethod'});
|
myView.delegateEvents({click: 'undefinedMethod'});
|
||||||
myView.$el.trigger('click');
|
myView.$el.trigger('click');
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -137,8 +163,8 @@
|
|||||||
var counter1 = 0, counter2 = 0;
|
var counter1 = 0, counter2 = 0;
|
||||||
|
|
||||||
var myView = new Backbone.View({el: '#testElement'});
|
var myView = new Backbone.View({el: '#testElement'});
|
||||||
myView.increment = function(){ counter1++; };
|
myView.increment = function() { counter1++; };
|
||||||
myView.$el.on('click', function(){ counter2++; });
|
myView.$el.on('click', function() { counter2++; });
|
||||||
|
|
||||||
var events = {'click h1': 'increment'};
|
var events = {'click h1': 'increment'};
|
||||||
|
|
||||||
@@ -198,7 +224,7 @@
|
|||||||
assert.expect(2);
|
assert.expect(2);
|
||||||
var myView = new Backbone.View({el: '#testElement'});
|
var myView = new Backbone.View({el: '#testElement'});
|
||||||
myView.delegate('click', function() { assert.ok(true); });
|
myView.delegate('click', function() { assert.ok(true); });
|
||||||
var handler = function(){ assert.ok(false); };
|
var handler = function() { assert.ok(false); };
|
||||||
myView.delegate('click', 'h1', handler);
|
myView.delegate('click', 'h1', handler);
|
||||||
myView.undelegate('click', 'h1', handler);
|
myView.undelegate('click', 'h1', handler);
|
||||||
myView.$('h1').trigger('click');
|
myView.$('h1').trigger('click');
|
||||||
@@ -400,8 +426,8 @@
|
|||||||
assert.expect(0);
|
assert.expect(0);
|
||||||
var View = Backbone.View.extend({
|
var View = Backbone.View.extend({
|
||||||
initialize: function() {
|
initialize: function() {
|
||||||
this.listenTo(this.model, 'all x', function(){ assert.ok(false); });
|
this.listenTo(this.model, 'all x', function() { assert.ok(false); });
|
||||||
this.listenTo(this.collection, 'all x', function(){ assert.ok(false); });
|
this.listenTo(this.collection, 'all x', function() { assert.ok(false); });
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -487,4 +513,4 @@
|
|||||||
assert.notEqual($oldEl, myView.$el);
|
assert.notEqual($oldEl, myView.$el);
|
||||||
});
|
});
|
||||||
|
|
||||||
})();
|
})(QUnit);
|
||||||
|
|||||||
8
vendor/underscore/test/arrays.js
vendored
8
vendor/underscore/test/arrays.js
vendored
@@ -15,6 +15,10 @@
|
|||||||
result = _.map([[1, 2, 3], [1, 2, 3]], _.first);
|
result = _.map([[1, 2, 3], [1, 2, 3]], _.first);
|
||||||
assert.deepEqual(result, [1, 1], 'works well with _.map');
|
assert.deepEqual(result, [1, 1], 'works well with _.map');
|
||||||
assert.equal(_.first(null), void 0, 'returns undefined when called on null');
|
assert.equal(_.first(null), void 0, 'returns undefined when called on null');
|
||||||
|
|
||||||
|
Array.prototype[0] = 'boo';
|
||||||
|
assert.equal(_.first([]), void 0, 'return undefined when called on a empty array');
|
||||||
|
delete Array.prototype[0];
|
||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test('head', function(assert) {
|
QUnit.test('head', function(assert) {
|
||||||
@@ -66,6 +70,10 @@
|
|||||||
result = _.map([[1, 2, 3], [1, 2, 3]], _.last);
|
result = _.map([[1, 2, 3], [1, 2, 3]], _.last);
|
||||||
assert.deepEqual(result, [3, 3], 'works well with _.map');
|
assert.deepEqual(result, [3, 3], 'works well with _.map');
|
||||||
assert.equal(_.last(null), void 0, 'returns undefined when called on null');
|
assert.equal(_.last(null), void 0, 'returns undefined when called on null');
|
||||||
|
|
||||||
|
var arr = [];
|
||||||
|
arr[-1] = 'boo';
|
||||||
|
assert.equal(_.last(arr), void 0, 'return undefined when called on a empty array');
|
||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test('compact', function(assert) {
|
QUnit.test('compact', function(assert) {
|
||||||
|
|||||||
118
vendor/underscore/test/collections.js
vendored
118
vendor/underscore/test/collections.js
vendored
@@ -188,7 +188,7 @@
|
|||||||
var prod = _.reduce([1, 2, 3, 4], function(memo, num){ return memo * num; });
|
var prod = _.reduce([1, 2, 3, 4], function(memo, num){ return memo * num; });
|
||||||
assert.equal(prod, 24, 'can reduce via multiplication');
|
assert.equal(prod, 24, 'can reduce via multiplication');
|
||||||
|
|
||||||
assert.ok(_.reduce(null, _.noop, 138) === 138, 'handles a null (with initial value) properly');
|
assert.strictEqual(_.reduce(null, _.noop, 138), 138, 'handles a null (with initial value) properly');
|
||||||
assert.equal(_.reduce([], _.noop, void 0), void 0, 'undefined can be passed as a special case');
|
assert.equal(_.reduce([], _.noop, void 0), void 0, 'undefined can be passed as a special case');
|
||||||
assert.equal(_.reduce([_], _.noop), _, 'collection of length one with no initial value returns the first item');
|
assert.equal(_.reduce([_], _.noop), _, 'collection of length one with no initial value returns the first item');
|
||||||
assert.equal(_.reduce([], _.noop), void 0, 'returns undefined when collection is empty and no initial value');
|
assert.equal(_.reduce([], _.noop), void 0, 'returns undefined when collection is empty and no initial value');
|
||||||
@@ -212,7 +212,7 @@
|
|||||||
var sum = _.reduceRight({a: 1, b: 2, c: 3}, function(memo, num){ return memo + num; });
|
var sum = _.reduceRight({a: 1, b: 2, c: 3}, function(memo, num){ return memo + num; });
|
||||||
assert.equal(sum, 6, 'default initial value on object');
|
assert.equal(sum, 6, 'default initial value on object');
|
||||||
|
|
||||||
assert.ok(_.reduceRight(null, _.noop, 138) === 138, 'handles a null (with initial value) properly');
|
assert.strictEqual(_.reduceRight(null, _.noop, 138), 138, 'handles a null (with initial value) properly');
|
||||||
assert.equal(_.reduceRight([_], _.noop), _, 'collection of length one with no initial value returns the first item');
|
assert.equal(_.reduceRight([_], _.noop), _, 'collection of length one with no initial value returns the first item');
|
||||||
|
|
||||||
assert.equal(_.reduceRight([], _.noop, void 0), void 0, 'undefined can be passed as a special case');
|
assert.equal(_.reduceRight([], _.noop, void 0), void 0, 'undefined can be passed as a special case');
|
||||||
@@ -268,8 +268,8 @@
|
|||||||
var list = [{a: 1, b: 2}, {a: 2, b: 2}, {a: 1, b: 3}, {a: 1, b: 4}, {a: 2, b: 4}];
|
var list = [{a: 1, b: 2}, {a: 2, b: 2}, {a: 1, b: 3}, {a: 1, b: 4}, {a: 2, b: 4}];
|
||||||
assert.deepEqual(_.find(list, {a: 1}), {a: 1, b: 2}, 'can be used as findWhere');
|
assert.deepEqual(_.find(list, {a: 1}), {a: 1, b: 2}, 'can be used as findWhere');
|
||||||
assert.deepEqual(_.find(list, {b: 4}), {a: 1, b: 4});
|
assert.deepEqual(_.find(list, {b: 4}), {a: 1, b: 4});
|
||||||
assert.ok(!_.find(list, {c: 1}), 'undefined when not found');
|
assert.notOk(_.find(list, {c: 1}), 'undefined when not found');
|
||||||
assert.ok(!_.find([], {c: 1}), 'undefined when searching empty list');
|
assert.notOk(_.find([], {c: 1}), 'undefined when searching empty list');
|
||||||
|
|
||||||
var result = _.find([1, 2, 3], function(num){ return num * 2 === 4; });
|
var result = _.find([1, 2, 3], function(num){ return num * 2 === 4; });
|
||||||
assert.equal(result, 2, 'found the first "2" and broke the loop');
|
assert.equal(result, 2, 'found the first "2" and broke the loop');
|
||||||
@@ -348,25 +348,25 @@
|
|||||||
QUnit.test('every', function(assert) {
|
QUnit.test('every', function(assert) {
|
||||||
assert.ok(_.every([], _.identity), 'the empty set');
|
assert.ok(_.every([], _.identity), 'the empty set');
|
||||||
assert.ok(_.every([true, true, true], _.identity), 'every true values');
|
assert.ok(_.every([true, true, true], _.identity), 'every true values');
|
||||||
assert.ok(!_.every([true, false, true], _.identity), 'one false value');
|
assert.notOk(_.every([true, false, true], _.identity), 'one false value');
|
||||||
assert.ok(_.every([0, 10, 28], function(num){ return num % 2 === 0; }), 'even numbers');
|
assert.ok(_.every([0, 10, 28], function(num){ return num % 2 === 0; }), 'even numbers');
|
||||||
assert.ok(!_.every([0, 11, 28], function(num){ return num % 2 === 0; }), 'an odd number');
|
assert.notOk(_.every([0, 11, 28], function(num){ return num % 2 === 0; }), 'an odd number');
|
||||||
assert.ok(_.every([1], _.identity) === true, 'cast to boolean - true');
|
assert.strictEqual(_.every([1], _.identity), true, 'cast to boolean - true');
|
||||||
assert.ok(_.every([0], _.identity) === false, 'cast to boolean - false');
|
assert.strictEqual(_.every([0], _.identity), false, 'cast to boolean - false');
|
||||||
assert.ok(!_.every([void 0, void 0, void 0], _.identity), 'works with arrays of undefined');
|
assert.notOk(_.every([void 0, void 0, void 0], _.identity), 'works with arrays of undefined');
|
||||||
|
|
||||||
var list = [{a: 1, b: 2}, {a: 2, b: 2}, {a: 1, b: 3}, {a: 1, b: 4}];
|
var list = [{a: 1, b: 2}, {a: 2, b: 2}, {a: 1, b: 3}, {a: 1, b: 4}];
|
||||||
assert.ok(!_.every(list, {a: 1, b: 2}), 'Can be called with object');
|
assert.notOk(_.every(list, {a: 1, b: 2}), 'Can be called with object');
|
||||||
assert.ok(_.every(list, 'a'), 'String mapped to object property');
|
assert.ok(_.every(list, 'a'), 'String mapped to object property');
|
||||||
|
|
||||||
list = [{a: 1, b: 2}, {a: 2, b: 2, c: true}];
|
list = [{a: 1, b: 2}, {a: 2, b: 2, c: true}];
|
||||||
assert.ok(_.every(list, {b: 2}), 'Can be called with object');
|
assert.ok(_.every(list, {b: 2}), 'Can be called with object');
|
||||||
assert.ok(!_.every(list, 'c'), 'String mapped to object property');
|
assert.notOk(_.every(list, 'c'), 'String mapped to object property');
|
||||||
|
|
||||||
assert.ok(_.every({a: 1, b: 2, c: 3, d: 4}, _.isNumber), 'takes objects');
|
assert.ok(_.every({a: 1, b: 2, c: 3, d: 4}, _.isNumber), 'takes objects');
|
||||||
assert.ok(!_.every({a: 1, b: 2, c: 3, d: 4}, _.isObject), 'takes objects');
|
assert.notOk(_.every({a: 1, b: 2, c: 3, d: 4}, _.isObject), 'takes objects');
|
||||||
assert.ok(_.every(['a', 'b', 'c', 'd'], _.hasOwnProperty, {a: 1, b: 2, c: 3, d: 4}), 'context works');
|
assert.ok(_.every(['a', 'b', 'c', 'd'], _.hasOwnProperty, {a: 1, b: 2, c: 3, d: 4}), 'context works');
|
||||||
assert.ok(!_.every(['a', 'b', 'c', 'd', 'f'], _.hasOwnProperty, {a: 1, b: 2, c: 3, d: 4}), 'context works');
|
assert.notOk(_.every(['a', 'b', 'c', 'd', 'f'], _.hasOwnProperty, {a: 1, b: 2, c: 3, d: 4}), 'context works');
|
||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test('all', function(assert) {
|
QUnit.test('all', function(assert) {
|
||||||
@@ -374,29 +374,29 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test('some', function(assert) {
|
QUnit.test('some', function(assert) {
|
||||||
assert.ok(!_.some([]), 'the empty set');
|
assert.notOk(_.some([]), 'the empty set');
|
||||||
assert.ok(!_.some([false, false, false]), 'all false values');
|
assert.notOk(_.some([false, false, false]), 'all false values');
|
||||||
assert.ok(_.some([false, false, true]), 'one true value');
|
assert.ok(_.some([false, false, true]), 'one true value');
|
||||||
assert.ok(_.some([null, 0, 'yes', false]), 'a string');
|
assert.ok(_.some([null, 0, 'yes', false]), 'a string');
|
||||||
assert.ok(!_.some([null, 0, '', false]), 'falsy values');
|
assert.notOk(_.some([null, 0, '', false]), 'falsy values');
|
||||||
assert.ok(!_.some([1, 11, 29], function(num){ return num % 2 === 0; }), 'all odd numbers');
|
assert.notOk(_.some([1, 11, 29], function(num){ return num % 2 === 0; }), 'all odd numbers');
|
||||||
assert.ok(_.some([1, 10, 29], function(num){ return num % 2 === 0; }), 'an even number');
|
assert.ok(_.some([1, 10, 29], function(num){ return num % 2 === 0; }), 'an even number');
|
||||||
assert.ok(_.some([1], _.identity) === true, 'cast to boolean - true');
|
assert.strictEqual(_.some([1], _.identity), true, 'cast to boolean - true');
|
||||||
assert.ok(_.some([0], _.identity) === false, 'cast to boolean - false');
|
assert.strictEqual(_.some([0], _.identity), false, 'cast to boolean - false');
|
||||||
assert.ok(_.some([false, false, true]));
|
assert.ok(_.some([false, false, true]));
|
||||||
|
|
||||||
var list = [{a: 1, b: 2}, {a: 2, b: 2}, {a: 1, b: 3}, {a: 1, b: 4}];
|
var list = [{a: 1, b: 2}, {a: 2, b: 2}, {a: 1, b: 3}, {a: 1, b: 4}];
|
||||||
assert.ok(!_.some(list, {a: 5, b: 2}), 'Can be called with object');
|
assert.notOk(_.some(list, {a: 5, b: 2}), 'Can be called with object');
|
||||||
assert.ok(_.some(list, 'a'), 'String mapped to object property');
|
assert.ok(_.some(list, 'a'), 'String mapped to object property');
|
||||||
|
|
||||||
list = [{a: 1, b: 2}, {a: 2, b: 2, c: true}];
|
list = [{a: 1, b: 2}, {a: 2, b: 2, c: true}];
|
||||||
assert.ok(_.some(list, {b: 2}), 'Can be called with object');
|
assert.ok(_.some(list, {b: 2}), 'Can be called with object');
|
||||||
assert.ok(!_.some(list, 'd'), 'String mapped to object property');
|
assert.notOk(_.some(list, 'd'), 'String mapped to object property');
|
||||||
|
|
||||||
assert.ok(_.some({a: '1', b: '2', c: '3', d: '4', e: 6}, _.isNumber), 'takes objects');
|
assert.ok(_.some({a: '1', b: '2', c: '3', d: '4', e: 6}, _.isNumber), 'takes objects');
|
||||||
assert.ok(!_.some({a: 1, b: 2, c: 3, d: 4}, _.isObject), 'takes objects');
|
assert.notOk(_.some({a: 1, b: 2, c: 3, d: 4}, _.isObject), 'takes objects');
|
||||||
assert.ok(_.some(['a', 'b', 'c', 'd'], _.hasOwnProperty, {a: 1, b: 2, c: 3, d: 4}), 'context works');
|
assert.ok(_.some(['a', 'b', 'c', 'd'], _.hasOwnProperty, {a: 1, b: 2, c: 3, d: 4}), 'context works');
|
||||||
assert.ok(!_.some(['x', 'y', 'z'], _.hasOwnProperty, {a: 1, b: 2, c: 3, d: 4}), 'context works');
|
assert.notOk(_.some(['x', 'y', 'z'], _.hasOwnProperty, {a: 1, b: 2, c: 3, d: 4}), 'context works');
|
||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test('any', function(assert) {
|
QUnit.test('any', function(assert) {
|
||||||
@@ -408,11 +408,11 @@
|
|||||||
assert.strictEqual(_.includes(val, 'hasOwnProperty'), false);
|
assert.strictEqual(_.includes(val, 'hasOwnProperty'), false);
|
||||||
});
|
});
|
||||||
assert.strictEqual(_.includes([1, 2, 3], 2), true, 'two is in the array');
|
assert.strictEqual(_.includes([1, 2, 3], 2), true, 'two is in the array');
|
||||||
assert.ok(!_.includes([1, 3, 9], 2), 'two is not in the array');
|
assert.notOk(_.includes([1, 3, 9], 2), 'two is not in the array');
|
||||||
|
|
||||||
assert.strictEqual(_.includes([5, 4, 3, 2, 1], 5, true), true, 'doesn\'t delegate to binary search');
|
assert.strictEqual(_.includes([5, 4, 3, 2, 1], 5, true), true, 'doesn\'t delegate to binary search');
|
||||||
|
|
||||||
assert.ok(_.includes({moe: 1, larry: 3, curly: 9}, 3) === true, '_.includes on objects checks their values');
|
assert.strictEqual(_.includes({moe: 1, larry: 3, curly: 9}, 3), true, '_.includes on objects checks their values');
|
||||||
assert.ok(_([1, 2, 3]).includes(2), 'OO-style includes');
|
assert.ok(_([1, 2, 3]).includes(2), 'OO-style includes');
|
||||||
|
|
||||||
var numbers = [1, 2, 3, 1, 2, 3, 1, 2, 3];
|
var numbers = [1, 2, 3, 1, 2, 3, 1, 2, 3];
|
||||||
@@ -549,7 +549,7 @@
|
|||||||
assert.equal(-Infinity, _.max(void 0), 'can handle null/undefined');
|
assert.equal(-Infinity, _.max(void 0), 'can handle null/undefined');
|
||||||
assert.equal(-Infinity, _.max(null, _.identity), 'can handle null/undefined');
|
assert.equal(-Infinity, _.max(null, _.identity), 'can handle null/undefined');
|
||||||
|
|
||||||
assert.equal(3, _.max([1, 2, 3]), 'can perform a regular Math.max');
|
assert.equal(_.max([1, 2, 3]), 3, 'can perform a regular Math.max');
|
||||||
|
|
||||||
var neg = _.max([1, 2, 3], function(num){ return -num; });
|
var neg = _.max([1, 2, 3], function(num){ return -num; });
|
||||||
assert.equal(neg, 1, 'can perform a computation-based max');
|
assert.equal(neg, 1, 'can perform a computation-based max');
|
||||||
@@ -558,24 +558,24 @@
|
|||||||
assert.equal(-Infinity, _.max([]), 'Maximum value of an empty array');
|
assert.equal(-Infinity, _.max([]), 'Maximum value of an empty array');
|
||||||
assert.equal(_.max({a: 'a'}), -Infinity, 'Maximum value of a non-numeric collection');
|
assert.equal(_.max({a: 'a'}), -Infinity, 'Maximum value of a non-numeric collection');
|
||||||
|
|
||||||
assert.equal(299999, _.max(_.range(1, 300000)), 'Maximum value of a too-big array');
|
assert.equal(_.max(_.range(1, 300000)), 299999, 'Maximum value of a too-big array');
|
||||||
|
|
||||||
assert.equal(3, _.max([1, 2, 3, 'test']), 'Finds correct max in array starting with num and containing a NaN');
|
assert.equal(_.max([1, 2, 3, 'test']), 3, 'Finds correct max in array starting with num and containing a NaN');
|
||||||
assert.equal(3, _.max(['test', 1, 2, 3]), 'Finds correct max in array starting with NaN');
|
assert.equal(_.max(['test', 1, 2, 3]), 3, 'Finds correct max in array starting with NaN');
|
||||||
|
|
||||||
assert.equal(3, _.max([1, 2, 3, null]), 'Finds correct max in array starting with num and containing a `null`');
|
assert.equal(_.max([1, 2, 3, null]), 3, 'Finds correct max in array starting with num and containing a `null`');
|
||||||
assert.equal(3, _.max([null, 1, 2, 3]), 'Finds correct max in array starting with a `null`');
|
assert.equal(_.max([null, 1, 2, 3]), 3, 'Finds correct max in array starting with a `null`');
|
||||||
|
|
||||||
assert.equal(3, _.max([1, 2, 3, '']), 'Finds correct max in array starting with num and containing an empty string');
|
assert.equal(_.max([1, 2, 3, '']), 3, 'Finds correct max in array starting with num and containing an empty string');
|
||||||
assert.equal(3, _.max(['', 1, 2, 3]), 'Finds correct max in array starting with an empty string');
|
assert.equal(_.max(['', 1, 2, 3]), 3, 'Finds correct max in array starting with an empty string');
|
||||||
|
|
||||||
assert.equal(3, _.max([1, 2, 3, false]), 'Finds correct max in array starting with num and containing a false');
|
assert.equal(_.max([1, 2, 3, false]), 3, 'Finds correct max in array starting with num and containing a false');
|
||||||
assert.equal(3, _.max([false, 1, 2, 3]), 'Finds correct max in array starting with a false');
|
assert.equal(_.max([false, 1, 2, 3]), 3, 'Finds correct max in array starting with a false');
|
||||||
|
|
||||||
assert.equal(4, _.max([0, 1, 2, 3, 4]), 'Finds correct max in array containing a zero');
|
assert.equal(_.max([0, 1, 2, 3, 4]), 4, 'Finds correct max in array containing a zero');
|
||||||
assert.equal(0, _.max([-3, -2, -1, 0]), 'Finds correct max in array containing negative numbers');
|
assert.equal(_.max([-3, -2, -1, 0]), 0, 'Finds correct max in array containing negative numbers');
|
||||||
|
|
||||||
assert.deepEqual([3, 6], _.map([[1, 2, 3], [4, 5, 6]], _.max), 'Finds correct max in array when mapping through multiple arrays');
|
assert.deepEqual(_.map([[1, 2, 3], [4, 5, 6]], _.max), [3, 6], 'Finds correct max in array when mapping through multiple arrays');
|
||||||
|
|
||||||
var a = {x: -Infinity};
|
var a = {x: -Infinity};
|
||||||
var b = {x: -Infinity};
|
var b = {x: -Infinity};
|
||||||
@@ -590,35 +590,35 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test('min', function(assert) {
|
QUnit.test('min', function(assert) {
|
||||||
assert.equal(Infinity, _.min(null), 'can handle null/undefined');
|
assert.equal(_.min(null), Infinity, 'can handle null/undefined');
|
||||||
assert.equal(Infinity, _.min(void 0), 'can handle null/undefined');
|
assert.equal(_.min(void 0), Infinity, 'can handle null/undefined');
|
||||||
assert.equal(Infinity, _.min(null, _.identity), 'can handle null/undefined');
|
assert.equal(_.min(null, _.identity), Infinity, 'can handle null/undefined');
|
||||||
|
|
||||||
assert.equal(1, _.min([1, 2, 3]), 'can perform a regular Math.min');
|
assert.equal(_.min([1, 2, 3]), 1, 'can perform a regular Math.min');
|
||||||
|
|
||||||
var neg = _.min([1, 2, 3], function(num){ return -num; });
|
var neg = _.min([1, 2, 3], function(num){ return -num; });
|
||||||
assert.equal(neg, 3, 'can perform a computation-based min');
|
assert.equal(neg, 3, 'can perform a computation-based min');
|
||||||
|
|
||||||
assert.equal(Infinity, _.min({}), 'Minimum value of an empty object');
|
assert.equal(_.min({}), Infinity, 'Minimum value of an empty object');
|
||||||
assert.equal(Infinity, _.min([]), 'Minimum value of an empty array');
|
assert.equal(_.min([]), Infinity, 'Minimum value of an empty array');
|
||||||
assert.equal(_.min({a: 'a'}), Infinity, 'Minimum value of a non-numeric collection');
|
assert.equal(_.min({a: 'a'}), Infinity, 'Minimum value of a non-numeric collection');
|
||||||
|
|
||||||
assert.deepEqual([1, 4], _.map([[1, 2, 3], [4, 5, 6]], _.min), 'Finds correct min in array when mapping through multiple arrays');
|
assert.deepEqual(_.map([[1, 2, 3], [4, 5, 6]], _.min), [1, 4], 'Finds correct min in array when mapping through multiple arrays');
|
||||||
|
|
||||||
var now = new Date(9999999999);
|
var now = new Date(9999999999);
|
||||||
var then = new Date(0);
|
var then = new Date(0);
|
||||||
assert.equal(_.min([now, then]), then);
|
assert.equal(_.min([now, then]), then);
|
||||||
|
|
||||||
assert.equal(1, _.min(_.range(1, 300000)), 'Minimum value of a too-big array');
|
assert.equal(_.min(_.range(1, 300000)), 1, 'Minimum value of a too-big array');
|
||||||
|
|
||||||
assert.equal(1, _.min([1, 2, 3, 'test']), 'Finds correct min in array starting with num and containing a NaN');
|
assert.equal(_.min([1, 2, 3, 'test']), 1, 'Finds correct min in array starting with num and containing a NaN');
|
||||||
assert.equal(1, _.min(['test', 1, 2, 3]), 'Finds correct min in array starting with NaN');
|
assert.equal(_.min(['test', 1, 2, 3]), 1, 'Finds correct min in array starting with NaN');
|
||||||
|
|
||||||
assert.equal(1, _.min([1, 2, 3, null]), 'Finds correct min in array starting with num and containing a `null`');
|
assert.equal(_.min([1, 2, 3, null]), 1, 'Finds correct min in array starting with num and containing a `null`');
|
||||||
assert.equal(1, _.min([null, 1, 2, 3]), 'Finds correct min in array starting with a `null`');
|
assert.equal(_.min([null, 1, 2, 3]), 1, 'Finds correct min in array starting with a `null`');
|
||||||
|
|
||||||
assert.equal(0, _.min([0, 1, 2, 3, 4]), 'Finds correct min in array containing a zero');
|
assert.equal(_.min([0, 1, 2, 3, 4]), 0, 'Finds correct min in array containing a zero');
|
||||||
assert.equal(-3, _.min([-3, -2, -1, 0]), 'Finds correct min in array containing negative numbers');
|
assert.equal(_.min([-3, -2, -1, 0]), -3, 'Finds correct min in array containing negative numbers');
|
||||||
|
|
||||||
var a = {x: Infinity};
|
var a = {x: Infinity};
|
||||||
var b = {x: Infinity};
|
var b = {x: Infinity};
|
||||||
@@ -692,7 +692,7 @@
|
|||||||
assert.deepEqual(grouped['5'], ['three', 'seven', 'eight']);
|
assert.deepEqual(grouped['5'], ['three', 'seven', 'eight']);
|
||||||
|
|
||||||
var context = {};
|
var context = {};
|
||||||
_.groupBy([{}], function(){ assert.ok(this === context); }, context);
|
_.groupBy([{}], function(){ assert.strictEqual(this, context); }, context);
|
||||||
|
|
||||||
grouped = _.groupBy([4.2, 6.1, 6.4], function(num) {
|
grouped = _.groupBy([4.2, 6.1, 6.4], function(num) {
|
||||||
return Math.floor(num) > 4 ? 'hasOwnProperty' : 'constructor';
|
return Math.floor(num) > 4 ? 'hasOwnProperty' : 'constructor';
|
||||||
@@ -701,7 +701,7 @@
|
|||||||
assert.equal(grouped.hasOwnProperty.length, 2);
|
assert.equal(grouped.hasOwnProperty.length, 2);
|
||||||
|
|
||||||
var array = [{}];
|
var array = [{}];
|
||||||
_.groupBy(array, function(value, index, obj){ assert.ok(obj === array); });
|
_.groupBy(array, function(value, index, obj){ assert.strictEqual(obj, array); });
|
||||||
|
|
||||||
array = [1, 2, 1, 2, 3];
|
array = [1, 2, 1, 2, 3];
|
||||||
grouped = _.groupBy(array);
|
grouped = _.groupBy(array);
|
||||||
@@ -747,7 +747,7 @@
|
|||||||
assert.equal(grouped['5'], 3);
|
assert.equal(grouped['5'], 3);
|
||||||
|
|
||||||
var context = {};
|
var context = {};
|
||||||
_.countBy([{}], function(){ assert.ok(this === context); }, context);
|
_.countBy([{}], function(){ assert.strictEqual(this, context); }, context);
|
||||||
|
|
||||||
grouped = _.countBy([4.2, 6.1, 6.4], function(num) {
|
grouped = _.countBy([4.2, 6.1, 6.4], function(num) {
|
||||||
return Math.floor(num) > 4 ? 'hasOwnProperty' : 'constructor';
|
return Math.floor(num) > 4 ? 'hasOwnProperty' : 'constructor';
|
||||||
@@ -756,7 +756,7 @@
|
|||||||
assert.equal(grouped.hasOwnProperty, 2);
|
assert.equal(grouped.hasOwnProperty, 2);
|
||||||
|
|
||||||
var array = [{}];
|
var array = [{}];
|
||||||
_.countBy(array, function(value, index, obj){ assert.ok(obj === array); });
|
_.countBy(array, function(value, index, obj){ assert.strictEqual(obj, array); });
|
||||||
|
|
||||||
array = [1, 2, 1, 2, 3];
|
array = [1, 2, 1, 2, 3];
|
||||||
grouped = _.countBy(array);
|
grouped = _.countBy(array);
|
||||||
@@ -797,10 +797,10 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test('toArray', function(assert) {
|
QUnit.test('toArray', function(assert) {
|
||||||
assert.ok(!_.isArray(arguments), 'arguments object is not an array');
|
assert.notOk(_.isArray(arguments), 'arguments object is not an array');
|
||||||
assert.ok(_.isArray(_.toArray(arguments)), 'arguments object converted into array');
|
assert.ok(_.isArray(_.toArray(arguments)), 'arguments object converted into array');
|
||||||
var a = [1, 2, 3];
|
var a = [1, 2, 3];
|
||||||
assert.ok(_.toArray(a) !== a, 'array is cloned');
|
assert.notStrictEqual(_.toArray(a), a, 'array is cloned');
|
||||||
assert.deepEqual(_.toArray(a), [1, 2, 3], 'cloned array contains same elements');
|
assert.deepEqual(_.toArray(a), [1, 2, 3], 'cloned array contains same elements');
|
||||||
|
|
||||||
var numbers = _.toArray({one: 1, two: 2, three: 3});
|
var numbers = _.toArray({one: 1, two: 2, three: 3});
|
||||||
@@ -882,7 +882,7 @@
|
|||||||
assert.deepEqual(_.map(elementChildren, 'id'), ['id1', 'id2']);
|
assert.deepEqual(_.map(elementChildren, 'id'), ['id1', 'id2']);
|
||||||
assert.deepEqual(_.map(parent.childNodes, 'nodeType'), [1, 3, 1]);
|
assert.deepEqual(_.map(parent.childNodes, 'nodeType'), [1, 3, 1]);
|
||||||
|
|
||||||
assert.ok(!_.every(parent.childNodes, _.isElement));
|
assert.notOk(_.every(parent.childNodes, _.isElement));
|
||||||
assert.ok(_.some(parent.childNodes, _.isElement));
|
assert.ok(_.some(parent.childNodes, _.isElement));
|
||||||
|
|
||||||
function compareNode(node) {
|
function compareNode(node) {
|
||||||
|
|||||||
20
vendor/underscore/test/cross-document.js
vendored
20
vendor/underscore/test/cross-document.js
vendored
@@ -35,7 +35,7 @@
|
|||||||
|
|
||||||
QUnit.test('isEqual', function(assert) {
|
QUnit.test('isEqual', function(assert) {
|
||||||
|
|
||||||
assert.ok(!_.isEqual(iNumber, 101));
|
assert.notOk(_.isEqual(iNumber, 101));
|
||||||
assert.ok(_.isEqual(iNumber, 100));
|
assert.ok(_.isEqual(iNumber, 100));
|
||||||
|
|
||||||
// Objects from another frame.
|
// Objects from another frame.
|
||||||
@@ -46,13 +46,13 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test('isEmpty', function(assert) {
|
QUnit.test('isEmpty', function(assert) {
|
||||||
assert.ok(!_([iNumber]).isEmpty(), '[1] is not empty');
|
assert.notOk(_([iNumber]).isEmpty(), '[1] is not empty');
|
||||||
assert.ok(!_.isEmpty(iArray), '[] is empty');
|
assert.notOk(_.isEmpty(iArray), '[] is empty');
|
||||||
assert.ok(_.isEmpty(iObject), '{} is empty');
|
assert.ok(_.isEmpty(iObject), '{} is empty');
|
||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test('isElement', function(assert) {
|
QUnit.test('isElement', function(assert) {
|
||||||
assert.ok(!_.isElement('div'), 'strings are not dom elements');
|
assert.notOk(_.isElement('div'), 'strings are not dom elements');
|
||||||
assert.ok(_.isElement(document.body), 'the body tag is a DOM element');
|
assert.ok(_.isElement(document.body), 'the body tag is a DOM element');
|
||||||
assert.ok(_.isElement(iElement), 'even from another frame');
|
assert.ok(_.isElement(iElement), 'even from another frame');
|
||||||
});
|
});
|
||||||
@@ -113,12 +113,12 @@
|
|||||||
if (typeof ActiveXObject != 'undefined') {
|
if (typeof ActiveXObject != 'undefined') {
|
||||||
QUnit.test('IE host objects', function(assert) {
|
QUnit.test('IE host objects', function(assert) {
|
||||||
var xml = new ActiveXObject('Msxml2.DOMDocument.3.0');
|
var xml = new ActiveXObject('Msxml2.DOMDocument.3.0');
|
||||||
assert.ok(!_.isNumber(xml));
|
assert.notOk(_.isNumber(xml));
|
||||||
assert.ok(!_.isBoolean(xml));
|
assert.notOk(_.isBoolean(xml));
|
||||||
assert.ok(!_.isNaN(xml));
|
assert.notOk(_.isNaN(xml));
|
||||||
assert.ok(!_.isFunction(xml));
|
assert.notOk(_.isFunction(xml));
|
||||||
assert.ok(!_.isNull(xml));
|
assert.notOk(_.isNull(xml));
|
||||||
assert.ok(!_.isUndefined(xml));
|
assert.notOk(_.isUndefined(xml));
|
||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test('#1621 IE 11 compat mode DOM elements are not functions', function(assert) {
|
QUnit.test('#1621 IE 11 compat mode DOM elements are not functions', function(assert) {
|
||||||
|
|||||||
39
vendor/underscore/test/functions.js
vendored
39
vendor/underscore/test/functions.js
vendored
@@ -180,7 +180,7 @@
|
|||||||
var done = assert.async();
|
var done = assert.async();
|
||||||
var delayed = false;
|
var delayed = false;
|
||||||
_.delay(function(){ delayed = true; }, 100);
|
_.delay(function(){ delayed = true; }, 100);
|
||||||
setTimeout(function(){ assert.ok(!delayed, "didn't delay the function quite yet"); }, 50);
|
setTimeout(function(){ assert.notOk(delayed, "didn't delay the function quite yet"); }, 50);
|
||||||
setTimeout(function(){ assert.ok(delayed, 'delayed the function'); done(); }, 150);
|
setTimeout(function(){ assert.ok(delayed, 'delayed the function'); done(); }, 150);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -694,6 +694,43 @@
|
|||||||
assert.deepEqual(_.toArray(cb(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)), _.range(1, 11));
|
assert.deepEqual(_.toArray(cb(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)), _.range(1, 11));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Test custom iteratee
|
||||||
|
var builtinIteratee = _.iteratee;
|
||||||
|
_.iteratee = function(value) {
|
||||||
|
// RegEx values return a function that returns the number of matches
|
||||||
|
if (_.isRegExp(value)) return function(obj) {
|
||||||
|
return (obj.match(value) || []).length;
|
||||||
|
};
|
||||||
|
return value;
|
||||||
|
};
|
||||||
|
|
||||||
|
var collection = ['foo', 'bar', 'bbiz'];
|
||||||
|
|
||||||
|
// Test all methods that claim to be transformed through `_.iteratee`
|
||||||
|
assert.deepEqual(_.countBy(collection, /b/g), {0: 1, 1: 1, 2: 1});
|
||||||
|
assert.equal(_.every(collection, /b/g), false);
|
||||||
|
assert.deepEqual(_.filter(collection, /b/g), ['bar', 'bbiz']);
|
||||||
|
assert.equal(_.find(collection, /b/g), 'bar');
|
||||||
|
assert.equal(_.findIndex(collection, /b/g), 1);
|
||||||
|
assert.equal(_.findKey(collection, /b/g), 1);
|
||||||
|
assert.equal(_.findLastIndex(collection, /b/g), 2);
|
||||||
|
assert.deepEqual(_.groupBy(collection, /b/g), {0: ['foo'], 1: ['bar'], 2: ['bbiz']});
|
||||||
|
assert.deepEqual(_.indexBy(collection, /b/g), {0: 'foo', 1: 'bar', 2: 'bbiz'});
|
||||||
|
assert.deepEqual(_.map(collection, /b/g), [0, 1, 2]);
|
||||||
|
assert.equal(_.max(collection, /b/g), 'bbiz');
|
||||||
|
assert.equal(_.min(collection, /b/g), 'foo');
|
||||||
|
assert.deepEqual(_.partition(collection, /b/g), [['bar', 'bbiz'], ['foo']]);
|
||||||
|
assert.deepEqual(_.reject(collection, /b/g), ['foo']);
|
||||||
|
assert.equal(_.some(collection, /b/g), true);
|
||||||
|
assert.deepEqual(_.sortBy(collection, /b/g), ['foo', 'bar', 'bbiz']);
|
||||||
|
assert.equal(_.sortedIndex(collection, 'blah', /b/g), 1);
|
||||||
|
assert.deepEqual(_.uniq(collection, /b/g), ['foo', 'bar', 'bbiz']);
|
||||||
|
|
||||||
|
var objCollection = {a: 'foo', b: 'bar', c: 'bbiz'};
|
||||||
|
assert.deepEqual(_.mapObject(objCollection, /b/g), {a: 0, b: 1, c: 2});
|
||||||
|
|
||||||
|
// Restore the builtin iteratee
|
||||||
|
_.iteratee = builtinIteratee;
|
||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test('restArgs', function(assert) {
|
QUnit.test('restArgs', function(assert) {
|
||||||
|
|||||||
323
vendor/underscore/test/objects.js
vendored
323
vendor/underscore/test/objects.js
vendored
@@ -123,7 +123,7 @@
|
|||||||
subObj.c = 'd';
|
subObj.c = 'd';
|
||||||
assert.deepEqual(_.extend({}, subObj), {a: 'b', c: 'd'}, 'extend copies all properties from source');
|
assert.deepEqual(_.extend({}, subObj), {a: 'b', c: 'd'}, 'extend copies all properties from source');
|
||||||
_.extend(subObj, {});
|
_.extend(subObj, {});
|
||||||
assert.ok(!subObj.hasOwnProperty('a'), "extend does not convert destination object's 'in' properties to 'own' properties");
|
assert.notOk(subObj.hasOwnProperty('a'), "extend does not convert destination object's 'in' properties to 'own' properties");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
result = {};
|
result = {};
|
||||||
@@ -205,7 +205,7 @@
|
|||||||
return this[key] === 3 && this === instance;
|
return this[key] === 3 && this === instance;
|
||||||
}, instance), {c: 3}, 'function is given context');
|
}, instance), {c: 3}, 'function is given context');
|
||||||
|
|
||||||
assert.ok(!_.has(_.pick({}, 'foo'), 'foo'), 'does not set own property if property not in object');
|
assert.notOk(_.has(_.pick({}, 'foo'), 'foo'), 'does not set own property if property not in object');
|
||||||
_.pick(data, function(value, key, obj) {
|
_.pick(data, function(value, key, obj) {
|
||||||
assert.equal(obj, data, 'passes same object as third parameter of iteratee');
|
assert.equal(obj, data, 'passes same object as third parameter of iteratee');
|
||||||
});
|
});
|
||||||
@@ -309,7 +309,7 @@
|
|||||||
|
|
||||||
Child.prototype.foo = 'foo';
|
Child.prototype.foo = 'foo';
|
||||||
var created = _.create(Child.prototype, new Child);
|
var created = _.create(Child.prototype, new Child);
|
||||||
assert.ok(!created.hasOwnProperty('foo'), 'should only add own properties');
|
assert.notOk(created.hasOwnProperty('foo'), 'should only add own properties');
|
||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test('isEqual', function(assert) {
|
QUnit.test('isEqual', function(assert) {
|
||||||
@@ -326,10 +326,10 @@
|
|||||||
assert.ok(_.isEqual(null, null), '`null` is equal to `null`');
|
assert.ok(_.isEqual(null, null), '`null` is equal to `null`');
|
||||||
assert.ok(_.isEqual(), '`undefined` is equal to `undefined`');
|
assert.ok(_.isEqual(), '`undefined` is equal to `undefined`');
|
||||||
|
|
||||||
assert.ok(!_.isEqual(0, -0), '`0` is not equal to `-0`');
|
assert.notOk(_.isEqual(0, -0), '`0` is not equal to `-0`');
|
||||||
assert.ok(!_.isEqual(-0, 0), 'Commutative equality is implemented for `0` and `-0`');
|
assert.notOk(_.isEqual(-0, 0), 'Commutative equality is implemented for `0` and `-0`');
|
||||||
assert.ok(!_.isEqual(null, void 0), '`null` is not equal to `undefined`');
|
assert.notOk(_.isEqual(null, void 0), '`null` is not equal to `undefined`');
|
||||||
assert.ok(!_.isEqual(void 0, null), 'Commutative equality is implemented for `null` and `undefined`');
|
assert.notOk(_.isEqual(void 0, null), 'Commutative equality is implemented for `null` and `undefined`');
|
||||||
|
|
||||||
// String object and primitive comparisons.
|
// String object and primitive comparisons.
|
||||||
assert.ok(_.isEqual('Curly', 'Curly'), 'Identical string primitives are equal');
|
assert.ok(_.isEqual('Curly', 'Curly'), 'Identical string primitives are equal');
|
||||||
@@ -337,76 +337,76 @@
|
|||||||
assert.ok(_.isEqual(new String('Curly'), 'Curly'), 'String primitives and their corresponding object wrappers are equal');
|
assert.ok(_.isEqual(new String('Curly'), 'Curly'), 'String primitives and their corresponding object wrappers are equal');
|
||||||
assert.ok(_.isEqual('Curly', new String('Curly')), 'Commutative equality is implemented for string objects and primitives');
|
assert.ok(_.isEqual('Curly', new String('Curly')), 'Commutative equality is implemented for string objects and primitives');
|
||||||
|
|
||||||
assert.ok(!_.isEqual('Curly', 'Larry'), 'String primitives with different values are not equal');
|
assert.notOk(_.isEqual('Curly', 'Larry'), 'String primitives with different values are not equal');
|
||||||
assert.ok(!_.isEqual(new String('Curly'), new String('Larry')), 'String objects with different primitive values are not equal');
|
assert.notOk(_.isEqual(new String('Curly'), new String('Larry')), 'String objects with different primitive values are not equal');
|
||||||
assert.ok(!_.isEqual(new String('Curly'), {toString: function(){ return 'Curly'; }}), 'String objects and objects with a custom `toString` method are not equal');
|
assert.notOk(_.isEqual(new String('Curly'), {toString: function(){ return 'Curly'; }}), 'String objects and objects with a custom `toString` method are not equal');
|
||||||
|
|
||||||
// Number object and primitive comparisons.
|
// Number object and primitive comparisons.
|
||||||
assert.ok(_.isEqual(75, 75), 'Identical number primitives are equal');
|
assert.ok(_.isEqual(75, 75), 'Identical number primitives are equal');
|
||||||
assert.ok(_.isEqual(new Number(75), new Number(75)), 'Number objects with identical primitive values are equal');
|
assert.ok(_.isEqual(new Number(75), new Number(75)), 'Number objects with identical primitive values are equal');
|
||||||
assert.ok(_.isEqual(75, new Number(75)), 'Number primitives and their corresponding object wrappers are equal');
|
assert.ok(_.isEqual(75, new Number(75)), 'Number primitives and their corresponding object wrappers are equal');
|
||||||
assert.ok(_.isEqual(new Number(75), 75), 'Commutative equality is implemented for number objects and primitives');
|
assert.ok(_.isEqual(new Number(75), 75), 'Commutative equality is implemented for number objects and primitives');
|
||||||
assert.ok(!_.isEqual(new Number(0), -0), '`new Number(0)` and `-0` are not equal');
|
assert.notOk(_.isEqual(new Number(0), -0), '`new Number(0)` and `-0` are not equal');
|
||||||
assert.ok(!_.isEqual(0, new Number(-0)), 'Commutative equality is implemented for `new Number(0)` and `-0`');
|
assert.notOk(_.isEqual(0, new Number(-0)), 'Commutative equality is implemented for `new Number(0)` and `-0`');
|
||||||
|
|
||||||
assert.ok(!_.isEqual(new Number(75), new Number(63)), 'Number objects with different primitive values are not equal');
|
assert.notOk(_.isEqual(new Number(75), new Number(63)), 'Number objects with different primitive values are not equal');
|
||||||
assert.ok(!_.isEqual(new Number(63), {valueOf: function(){ return 63; }}), 'Number objects and objects with a `valueOf` method are not equal');
|
assert.notOk(_.isEqual(new Number(63), {valueOf: function(){ return 63; }}), 'Number objects and objects with a `valueOf` method are not equal');
|
||||||
|
|
||||||
// Comparisons involving `NaN`.
|
// Comparisons involving `NaN`.
|
||||||
assert.ok(_.isEqual(NaN, NaN), '`NaN` is equal to `NaN`');
|
assert.ok(_.isEqual(NaN, NaN), '`NaN` is equal to `NaN`');
|
||||||
assert.ok(_.isEqual(new Number(NaN), NaN), 'Object(`NaN`) is equal to `NaN`');
|
assert.ok(_.isEqual(new Number(NaN), NaN), 'Object(`NaN`) is equal to `NaN`');
|
||||||
assert.ok(!_.isEqual(61, NaN), 'A number primitive is not equal to `NaN`');
|
assert.notOk(_.isEqual(61, NaN), 'A number primitive is not equal to `NaN`');
|
||||||
assert.ok(!_.isEqual(new Number(79), NaN), 'A number object is not equal to `NaN`');
|
assert.notOk(_.isEqual(new Number(79), NaN), 'A number object is not equal to `NaN`');
|
||||||
assert.ok(!_.isEqual(Infinity, NaN), '`Infinity` is not equal to `NaN`');
|
assert.notOk(_.isEqual(Infinity, NaN), '`Infinity` is not equal to `NaN`');
|
||||||
|
|
||||||
// Boolean object and primitive comparisons.
|
// Boolean object and primitive comparisons.
|
||||||
assert.ok(_.isEqual(true, true), 'Identical boolean primitives are equal');
|
assert.ok(_.isEqual(true, true), 'Identical boolean primitives are equal');
|
||||||
assert.ok(_.isEqual(new Boolean, new Boolean), 'Boolean objects with identical primitive values are equal');
|
assert.ok(_.isEqual(new Boolean, new Boolean), 'Boolean objects with identical primitive values are equal');
|
||||||
assert.ok(_.isEqual(true, new Boolean(true)), 'Boolean primitives and their corresponding object wrappers are equal');
|
assert.ok(_.isEqual(true, new Boolean(true)), 'Boolean primitives and their corresponding object wrappers are equal');
|
||||||
assert.ok(_.isEqual(new Boolean(true), true), 'Commutative equality is implemented for booleans');
|
assert.ok(_.isEqual(new Boolean(true), true), 'Commutative equality is implemented for booleans');
|
||||||
assert.ok(!_.isEqual(new Boolean(true), new Boolean), 'Boolean objects with different primitive values are not equal');
|
assert.notOk(_.isEqual(new Boolean(true), new Boolean), 'Boolean objects with different primitive values are not equal');
|
||||||
|
|
||||||
// Common type coercions.
|
// Common type coercions.
|
||||||
assert.ok(!_.isEqual(new Boolean(false), true), '`new Boolean(false)` is not equal to `true`');
|
assert.notOk(_.isEqual(new Boolean(false), true), '`new Boolean(false)` is not equal to `true`');
|
||||||
assert.ok(!_.isEqual('75', 75), 'String and number primitives with like values are not equal');
|
assert.notOk(_.isEqual('75', 75), 'String and number primitives with like values are not equal');
|
||||||
assert.ok(!_.isEqual(new Number(63), new String(63)), 'String and number objects with like values are not equal');
|
assert.notOk(_.isEqual(new Number(63), new String(63)), 'String and number objects with like values are not equal');
|
||||||
assert.ok(!_.isEqual(75, '75'), 'Commutative equality is implemented for like string and number values');
|
assert.notOk(_.isEqual(75, '75'), 'Commutative equality is implemented for like string and number values');
|
||||||
assert.ok(!_.isEqual(0, ''), 'Number and string primitives with like values are not equal');
|
assert.notOk(_.isEqual(0, ''), 'Number and string primitives with like values are not equal');
|
||||||
assert.ok(!_.isEqual(1, true), 'Number and boolean primitives with like values are not equal');
|
assert.notOk(_.isEqual(1, true), 'Number and boolean primitives with like values are not equal');
|
||||||
assert.ok(!_.isEqual(new Boolean(false), new Number(0)), 'Boolean and number objects with like values are not equal');
|
assert.notOk(_.isEqual(new Boolean(false), new Number(0)), 'Boolean and number objects with like values are not equal');
|
||||||
assert.ok(!_.isEqual(false, new String('')), 'Boolean primitives and string objects with like values are not equal');
|
assert.notOk(_.isEqual(false, new String('')), 'Boolean primitives and string objects with like values are not equal');
|
||||||
assert.ok(!_.isEqual(12564504e5, new Date(2009, 9, 25)), 'Dates and their corresponding numeric primitive values are not equal');
|
assert.notOk(_.isEqual(12564504e5, new Date(2009, 9, 25)), 'Dates and their corresponding numeric primitive values are not equal');
|
||||||
|
|
||||||
// Dates.
|
// Dates.
|
||||||
assert.ok(_.isEqual(new Date(2009, 9, 25), new Date(2009, 9, 25)), 'Date objects referencing identical times are equal');
|
assert.ok(_.isEqual(new Date(2009, 9, 25), new Date(2009, 9, 25)), 'Date objects referencing identical times are equal');
|
||||||
assert.ok(!_.isEqual(new Date(2009, 9, 25), new Date(2009, 11, 13)), 'Date objects referencing different times are not equal');
|
assert.notOk(_.isEqual(new Date(2009, 9, 25), new Date(2009, 11, 13)), 'Date objects referencing different times are not equal');
|
||||||
assert.ok(!_.isEqual(new Date(2009, 11, 13), {
|
assert.notOk(_.isEqual(new Date(2009, 11, 13), {
|
||||||
getTime: function(){
|
getTime: function(){
|
||||||
return 12606876e5;
|
return 12606876e5;
|
||||||
}
|
}
|
||||||
}), 'Date objects and objects with a `getTime` method are not equal');
|
}), 'Date objects and objects with a `getTime` method are not equal');
|
||||||
assert.ok(!_.isEqual(new Date('Curly'), new Date('Curly')), 'Invalid dates are not equal');
|
assert.notOk(_.isEqual(new Date('Curly'), new Date('Curly')), 'Invalid dates are not equal');
|
||||||
|
|
||||||
// Functions.
|
// Functions.
|
||||||
assert.ok(!_.isEqual(First, Second), 'Different functions with identical bodies and source code representations are not equal');
|
assert.notOk(_.isEqual(First, Second), 'Different functions with identical bodies and source code representations are not equal');
|
||||||
|
|
||||||
// RegExps.
|
// RegExps.
|
||||||
assert.ok(_.isEqual(/(?:)/gim, /(?:)/gim), 'RegExps with equivalent patterns and flags are equal');
|
assert.ok(_.isEqual(/(?:)/gim, /(?:)/gim), 'RegExps with equivalent patterns and flags are equal');
|
||||||
assert.ok(_.isEqual(/(?:)/gi, /(?:)/ig), 'Flag order is not significant');
|
assert.ok(_.isEqual(/(?:)/gi, /(?:)/ig), 'Flag order is not significant');
|
||||||
assert.ok(!_.isEqual(/(?:)/g, /(?:)/gi), 'RegExps with equivalent patterns and different flags are not equal');
|
assert.notOk(_.isEqual(/(?:)/g, /(?:)/gi), 'RegExps with equivalent patterns and different flags are not equal');
|
||||||
assert.ok(!_.isEqual(/Moe/gim, /Curly/gim), 'RegExps with different patterns and equivalent flags are not equal');
|
assert.notOk(_.isEqual(/Moe/gim, /Curly/gim), 'RegExps with different patterns and equivalent flags are not equal');
|
||||||
assert.ok(!_.isEqual(/(?:)/gi, /(?:)/g), 'Commutative equality is implemented for RegExps');
|
assert.notOk(_.isEqual(/(?:)/gi, /(?:)/g), 'Commutative equality is implemented for RegExps');
|
||||||
assert.ok(!_.isEqual(/Curly/g, {source: 'Larry', global: true, ignoreCase: false, multiline: false}), 'RegExps and RegExp-like objects are not equal');
|
assert.notOk(_.isEqual(/Curly/g, {source: 'Larry', global: true, ignoreCase: false, multiline: false}), 'RegExps and RegExp-like objects are not equal');
|
||||||
|
|
||||||
// Empty arrays, array-like objects, and object literals.
|
// Empty arrays, array-like objects, and object literals.
|
||||||
assert.ok(_.isEqual({}, {}), 'Empty object literals are equal');
|
assert.ok(_.isEqual({}, {}), 'Empty object literals are equal');
|
||||||
assert.ok(_.isEqual([], []), 'Empty array literals are equal');
|
assert.ok(_.isEqual([], []), 'Empty array literals are equal');
|
||||||
assert.ok(_.isEqual([{}], [{}]), 'Empty nested arrays and objects are equal');
|
assert.ok(_.isEqual([{}], [{}]), 'Empty nested arrays and objects are equal');
|
||||||
assert.ok(!_.isEqual({length: 0}, []), 'Array-like objects and arrays are not equal.');
|
assert.notOk(_.isEqual({length: 0}, []), 'Array-like objects and arrays are not equal.');
|
||||||
assert.ok(!_.isEqual([], {length: 0}), 'Commutative equality is implemented for array-like objects');
|
assert.notOk(_.isEqual([], {length: 0}), 'Commutative equality is implemented for array-like objects');
|
||||||
|
|
||||||
assert.ok(!_.isEqual({}, []), 'Object literals and array literals are not equal');
|
assert.notOk(_.isEqual({}, []), 'Object literals and array literals are not equal');
|
||||||
assert.ok(!_.isEqual([], {}), 'Commutative equality is implemented for objects and arrays');
|
assert.notOk(_.isEqual([], {}), 'Commutative equality is implemented for objects and arrays');
|
||||||
|
|
||||||
// Arrays with primitive and object values.
|
// Arrays with primitive and object values.
|
||||||
assert.ok(_.isEqual([1, 'Larry', true], [1, 'Larry', true]), 'Arrays containing identical primitives are equal');
|
assert.ok(_.isEqual([1, 'Larry', true], [1, 'Larry', true]), 'Arrays containing identical primitives are equal');
|
||||||
@@ -424,14 +424,14 @@
|
|||||||
// Array elements and properties.
|
// Array elements and properties.
|
||||||
assert.ok(_.isEqual(a, b), 'Arrays containing equivalent elements and different non-numeric properties are equal');
|
assert.ok(_.isEqual(a, b), 'Arrays containing equivalent elements and different non-numeric properties are equal');
|
||||||
a.push('White Rocks');
|
a.push('White Rocks');
|
||||||
assert.ok(!_.isEqual(a, b), 'Arrays of different lengths are not equal');
|
assert.notOk(_.isEqual(a, b), 'Arrays of different lengths are not equal');
|
||||||
a.push('East Boulder');
|
a.push('East Boulder');
|
||||||
b.push('Gunbarrel Ranch', 'Teller Farm');
|
b.push('Gunbarrel Ranch', 'Teller Farm');
|
||||||
assert.ok(!_.isEqual(a, b), 'Arrays of identical lengths containing different elements are not equal');
|
assert.notOk(_.isEqual(a, b), 'Arrays of identical lengths containing different elements are not equal');
|
||||||
|
|
||||||
// Sparse arrays.
|
// Sparse arrays.
|
||||||
assert.ok(_.isEqual(Array(3), Array(3)), 'Sparse arrays of identical lengths are equal');
|
assert.ok(_.isEqual(Array(3), Array(3)), 'Sparse arrays of identical lengths are equal');
|
||||||
assert.ok(!_.isEqual(Array(3), Array(6)), 'Sparse arrays of different lengths are not equal when both are empty');
|
assert.notOk(_.isEqual(Array(3), Array(6)), 'Sparse arrays of different lengths are not equal when both are empty');
|
||||||
|
|
||||||
var sparse = [];
|
var sparse = [];
|
||||||
sparse[1] = 5;
|
sparse[1] = 5;
|
||||||
@@ -440,11 +440,11 @@
|
|||||||
// Simple objects.
|
// Simple objects.
|
||||||
assert.ok(_.isEqual({a: 'Curly', b: 1, c: true}, {a: 'Curly', b: 1, c: true}), 'Objects containing identical primitives are equal');
|
assert.ok(_.isEqual({a: 'Curly', b: 1, c: true}, {a: 'Curly', b: 1, c: true}), 'Objects containing identical primitives are equal');
|
||||||
assert.ok(_.isEqual({a: /Curly/g, b: new Date(2009, 11, 13)}, {a: /Curly/g, b: new Date(2009, 11, 13)}), 'Objects containing equivalent members are equal');
|
assert.ok(_.isEqual({a: /Curly/g, b: new Date(2009, 11, 13)}, {a: /Curly/g, b: new Date(2009, 11, 13)}), 'Objects containing equivalent members are equal');
|
||||||
assert.ok(!_.isEqual({a: 63, b: 75}, {a: 61, b: 55}), 'Objects of identical sizes with different values are not equal');
|
assert.notOk(_.isEqual({a: 63, b: 75}, {a: 61, b: 55}), 'Objects of identical sizes with different values are not equal');
|
||||||
assert.ok(!_.isEqual({a: 63, b: 75}, {a: 61, c: 55}), 'Objects of identical sizes with different property names are not equal');
|
assert.notOk(_.isEqual({a: 63, b: 75}, {a: 61, c: 55}), 'Objects of identical sizes with different property names are not equal');
|
||||||
assert.ok(!_.isEqual({a: 1, b: 2}, {a: 1}), 'Objects of different sizes are not equal');
|
assert.notOk(_.isEqual({a: 1, b: 2}, {a: 1}), 'Objects of different sizes are not equal');
|
||||||
assert.ok(!_.isEqual({a: 1}, {a: 1, b: 2}), 'Commutative equality is implemented for objects');
|
assert.notOk(_.isEqual({a: 1}, {a: 1, b: 2}), 'Commutative equality is implemented for objects');
|
||||||
assert.ok(!_.isEqual({x: 1, y: void 0}, {x: 1, z: 2}), 'Objects with identical keys and different values are not equivalent');
|
assert.notOk(_.isEqual({x: 1, y: void 0}, {x: 1, z: 2}), 'Objects with identical keys and different values are not equivalent');
|
||||||
|
|
||||||
// `A` contains nested objects and arrays.
|
// `A` contains nested objects and arrays.
|
||||||
a = {
|
a = {
|
||||||
@@ -479,9 +479,9 @@
|
|||||||
|
|
||||||
// Instances.
|
// Instances.
|
||||||
assert.ok(_.isEqual(new First, new First), 'Object instances are equal');
|
assert.ok(_.isEqual(new First, new First), 'Object instances are equal');
|
||||||
assert.ok(!_.isEqual(new First, new Second), 'Objects with different constructors and identical own properties are not equal');
|
assert.notOk(_.isEqual(new First, new Second), 'Objects with different constructors and identical own properties are not equal');
|
||||||
assert.ok(!_.isEqual({value: 1}, new First), 'Object instances and objects sharing equivalent properties are not equal');
|
assert.notOk(_.isEqual({value: 1}, new First), 'Object instances and objects sharing equivalent properties are not equal');
|
||||||
assert.ok(!_.isEqual({value: 2}, new Second), 'The prototype chain of objects should not be examined');
|
assert.notOk(_.isEqual({value: 2}, new Second), 'The prototype chain of objects should not be examined');
|
||||||
|
|
||||||
// Circular Arrays.
|
// Circular Arrays.
|
||||||
(a = []).push(a);
|
(a = []).push(a);
|
||||||
@@ -492,13 +492,13 @@
|
|||||||
assert.ok(_.isEqual(a, b), 'Arrays containing circular references and equivalent properties are equal');
|
assert.ok(_.isEqual(a, b), 'Arrays containing circular references and equivalent properties are equal');
|
||||||
a.push('Shemp');
|
a.push('Shemp');
|
||||||
b.push('Curly');
|
b.push('Curly');
|
||||||
assert.ok(!_.isEqual(a, b), 'Arrays containing circular references and different properties are not equal');
|
assert.notOk(_.isEqual(a, b), 'Arrays containing circular references and different properties are not equal');
|
||||||
|
|
||||||
// More circular arrays #767.
|
// More circular arrays #767.
|
||||||
a = ['everything is checked but', 'this', 'is not'];
|
a = ['everything is checked but', 'this', 'is not'];
|
||||||
a[1] = a;
|
a[1] = a;
|
||||||
b = ['everything is checked but', ['this', 'array'], 'is not'];
|
b = ['everything is checked but', ['this', 'array'], 'is not'];
|
||||||
assert.ok(!_.isEqual(a, b), 'Comparison of circular references with non-circular references are not equal');
|
assert.notOk(_.isEqual(a, b), 'Comparison of circular references with non-circular references are not equal');
|
||||||
|
|
||||||
// Circular Objects.
|
// Circular Objects.
|
||||||
a = {abc: null};
|
a = {abc: null};
|
||||||
@@ -511,13 +511,13 @@
|
|||||||
assert.ok(_.isEqual(a, b), 'Objects containing circular references and equivalent properties are equal');
|
assert.ok(_.isEqual(a, b), 'Objects containing circular references and equivalent properties are equal');
|
||||||
a.def = new Number(75);
|
a.def = new Number(75);
|
||||||
b.def = new Number(63);
|
b.def = new Number(63);
|
||||||
assert.ok(!_.isEqual(a, b), 'Objects containing circular references and different properties are not equal');
|
assert.notOk(_.isEqual(a, b), 'Objects containing circular references and different properties are not equal');
|
||||||
|
|
||||||
// More circular objects #767.
|
// More circular objects #767.
|
||||||
a = {everything: 'is checked', but: 'this', is: 'not'};
|
a = {everything: 'is checked', but: 'this', is: 'not'};
|
||||||
a.but = a;
|
a.but = a;
|
||||||
b = {everything: 'is checked', but: {that: 'object'}, is: 'not'};
|
b = {everything: 'is checked', but: {that: 'object'}, is: 'not'};
|
||||||
assert.ok(!_.isEqual(a, b), 'Comparison of circular references with non-circular object references are not equal');
|
assert.notOk(_.isEqual(a, b), 'Comparison of circular references with non-circular object references are not equal');
|
||||||
|
|
||||||
// Cyclic Structures.
|
// Cyclic Structures.
|
||||||
a = [{abc: null}];
|
a = [{abc: null}];
|
||||||
@@ -530,7 +530,7 @@
|
|||||||
assert.ok(_.isEqual(a, b), 'Cyclic structures containing equivalent properties are equal');
|
assert.ok(_.isEqual(a, b), 'Cyclic structures containing equivalent properties are equal');
|
||||||
a[0].def = new String('Larry');
|
a[0].def = new String('Larry');
|
||||||
b[0].def = new String('Curly');
|
b[0].def = new String('Curly');
|
||||||
assert.ok(!_.isEqual(a, b), 'Cyclic structures containing different properties are not equal');
|
assert.notOk(_.isEqual(a, b), 'Cyclic structures containing different properties are not equal');
|
||||||
|
|
||||||
// Complex Circular References.
|
// Complex Circular References.
|
||||||
a = {foo: {b: {foo: {c: {foo: null}}}}};
|
a = {foo: {b: {foo: {c: {foo: null}}}}};
|
||||||
@@ -540,7 +540,7 @@
|
|||||||
assert.ok(_.isEqual(a, b), 'Cyclic structures with nested and identically-named properties are equal');
|
assert.ok(_.isEqual(a, b), 'Cyclic structures with nested and identically-named properties are equal');
|
||||||
|
|
||||||
// Chaining.
|
// Chaining.
|
||||||
assert.ok(!_.isEqual(_({x: 1, y: void 0}).chain(), _({x: 1, z: 2}).chain()), 'Chained objects containing different values are not equal');
|
assert.notOk(_.isEqual(_({x: 1, y: void 0}).chain(), _({x: 1, z: 2}).chain()), 'Chained objects containing different values are not equal');
|
||||||
|
|
||||||
a = _({x: 1, y: 2}).chain();
|
a = _({x: 1, y: 2}).chain();
|
||||||
b = _({x: 1, y: 2}).chain();
|
b = _({x: 1, y: 2}).chain();
|
||||||
@@ -576,15 +576,15 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test('isEmpty', function(assert) {
|
QUnit.test('isEmpty', function(assert) {
|
||||||
assert.ok(!_([1]).isEmpty(), '[1] is not empty');
|
assert.notOk(_([1]).isEmpty(), '[1] is not empty');
|
||||||
assert.ok(_.isEmpty([]), '[] is empty');
|
assert.ok(_.isEmpty([]), '[] is empty');
|
||||||
assert.ok(!_.isEmpty({one: 1}), '{one: 1} is not empty');
|
assert.notOk(_.isEmpty({one: 1}), '{one: 1} is not empty');
|
||||||
assert.ok(_.isEmpty({}), '{} is empty');
|
assert.ok(_.isEmpty({}), '{} is empty');
|
||||||
assert.ok(_.isEmpty(new RegExp('')), 'objects with prototype properties are empty');
|
assert.ok(_.isEmpty(new RegExp('')), 'objects with prototype properties are empty');
|
||||||
assert.ok(_.isEmpty(null), 'null is empty');
|
assert.ok(_.isEmpty(null), 'null is empty');
|
||||||
assert.ok(_.isEmpty(), 'undefined is empty');
|
assert.ok(_.isEmpty(), 'undefined is empty');
|
||||||
assert.ok(_.isEmpty(''), 'the empty string is empty');
|
assert.ok(_.isEmpty(''), 'the empty string is empty');
|
||||||
assert.ok(!_.isEmpty('moe'), 'but other strings are not');
|
assert.notOk(_.isEmpty('moe'), 'but other strings are not');
|
||||||
|
|
||||||
var obj = {one: 1};
|
var obj = {one: 1};
|
||||||
delete obj.one;
|
delete obj.one;
|
||||||
@@ -592,27 +592,27 @@
|
|||||||
|
|
||||||
var args = function(){ return arguments; };
|
var args = function(){ return arguments; };
|
||||||
assert.ok(_.isEmpty(args()), 'empty arguments object is empty');
|
assert.ok(_.isEmpty(args()), 'empty arguments object is empty');
|
||||||
assert.ok(!_.isEmpty(args('')), 'non-empty arguments object is not empty');
|
assert.notOk(_.isEmpty(args('')), 'non-empty arguments object is not empty');
|
||||||
|
|
||||||
// covers collecting non-enumerable properties in IE < 9
|
// covers collecting non-enumerable properties in IE < 9
|
||||||
var nonEnumProp = {toString: 5};
|
var nonEnumProp = {toString: 5};
|
||||||
assert.ok(!_.isEmpty(nonEnumProp), 'non-enumerable property is not empty');
|
assert.notOk(_.isEmpty(nonEnumProp), 'non-enumerable property is not empty');
|
||||||
});
|
});
|
||||||
|
|
||||||
if (typeof document === 'object') {
|
if (typeof document === 'object') {
|
||||||
QUnit.test('isElement', function(assert) {
|
QUnit.test('isElement', function(assert) {
|
||||||
assert.ok(!_.isElement('div'), 'strings are not dom elements');
|
assert.notOk(_.isElement('div'), 'strings are not dom elements');
|
||||||
assert.ok(_.isElement(testElement), 'an element is a DOM element');
|
assert.ok(_.isElement(testElement), 'an element is a DOM element');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
QUnit.test('isArguments', function(assert) {
|
QUnit.test('isArguments', function(assert) {
|
||||||
var args = (function(){ return arguments; }(1, 2, 3));
|
var args = (function(){ return arguments; }(1, 2, 3));
|
||||||
assert.ok(!_.isArguments('string'), 'a string is not an arguments object');
|
assert.notOk(_.isArguments('string'), 'a string is not an arguments object');
|
||||||
assert.ok(!_.isArguments(_.isArguments), 'a function is not an arguments object');
|
assert.notOk(_.isArguments(_.isArguments), 'a function is not an arguments object');
|
||||||
assert.ok(_.isArguments(args), 'but the arguments object is an arguments object');
|
assert.ok(_.isArguments(args), 'but the arguments object is an arguments object');
|
||||||
assert.ok(!_.isArguments(_.toArray(args)), 'but not when it\'s converted into an array');
|
assert.notOk(_.isArguments(_.toArray(args)), 'but not when it\'s converted into an array');
|
||||||
assert.ok(!_.isArguments([1, 2, 3]), 'and not vanilla arrays.');
|
assert.notOk(_.isArguments([1, 2, 3]), 'and not vanilla arrays.');
|
||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test('isObject', function(assert) {
|
QUnit.test('isObject', function(assert) {
|
||||||
@@ -622,24 +622,24 @@
|
|||||||
assert.ok(_.isObject(testElement), 'and DOM element');
|
assert.ok(_.isObject(testElement), 'and DOM element');
|
||||||
}
|
}
|
||||||
assert.ok(_.isObject(function() {}), 'and functions');
|
assert.ok(_.isObject(function() {}), 'and functions');
|
||||||
assert.ok(!_.isObject(null), 'but not null');
|
assert.notOk(_.isObject(null), 'but not null');
|
||||||
assert.ok(!_.isObject(void 0), 'and not undefined');
|
assert.notOk(_.isObject(void 0), 'and not undefined');
|
||||||
assert.ok(!_.isObject('string'), 'and not string');
|
assert.notOk(_.isObject('string'), 'and not string');
|
||||||
assert.ok(!_.isObject(12), 'and not number');
|
assert.notOk(_.isObject(12), 'and not number');
|
||||||
assert.ok(!_.isObject(true), 'and not boolean');
|
assert.notOk(_.isObject(true), 'and not boolean');
|
||||||
assert.ok(_.isObject(new String('string')), 'but new String()');
|
assert.ok(_.isObject(new String('string')), 'but new String()');
|
||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test('isArray', function(assert) {
|
QUnit.test('isArray', function(assert) {
|
||||||
assert.ok(!_.isArray(void 0), 'undefined vars are not arrays');
|
assert.notOk(_.isArray(void 0), 'undefined vars are not arrays');
|
||||||
assert.ok(!_.isArray(arguments), 'the arguments object is not an array');
|
assert.notOk(_.isArray(arguments), 'the arguments object is not an array');
|
||||||
assert.ok(_.isArray([1, 2, 3]), 'but arrays are');
|
assert.ok(_.isArray([1, 2, 3]), 'but arrays are');
|
||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test('isString', function(assert) {
|
QUnit.test('isString', function(assert) {
|
||||||
var obj = new String('I am a string object');
|
var obj = new String('I am a string object');
|
||||||
if (testElement) {
|
if (testElement) {
|
||||||
assert.ok(!_.isString(testElement), 'an element is not a string');
|
assert.notOk(_.isString(testElement), 'an element is not a string');
|
||||||
}
|
}
|
||||||
assert.ok(_.isString([1, 2, 3].join(', ')), 'but strings are');
|
assert.ok(_.isString([1, 2, 3].join(', ')), 'but strings are');
|
||||||
assert.strictEqual(_.isString('I am a string literal'), true, 'string literals are');
|
assert.strictEqual(_.isString('I am a string literal'), true, 'string literals are');
|
||||||
@@ -648,9 +648,9 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test('isSymbol', function(assert) {
|
QUnit.test('isSymbol', function(assert) {
|
||||||
assert.ok(!_.isSymbol(0), 'numbers are not symbols');
|
assert.notOk(_.isSymbol(0), 'numbers are not symbols');
|
||||||
assert.ok(!_.isSymbol(''), 'strings are not symbols');
|
assert.notOk(_.isSymbol(''), 'strings are not symbols');
|
||||||
assert.ok(!_.isSymbol(_.isSymbol), 'functions are not symbols');
|
assert.notOk(_.isSymbol(_.isSymbol), 'functions are not symbols');
|
||||||
if (typeof Symbol === 'function') {
|
if (typeof Symbol === 'function') {
|
||||||
assert.ok(_.isSymbol(Symbol()), 'symbols are symbols');
|
assert.ok(_.isSymbol(Symbol()), 'symbols are symbols');
|
||||||
assert.ok(_.isSymbol(Symbol('description')), 'described symbols are symbols');
|
assert.ok(_.isSymbol(Symbol('description')), 'described symbols are symbols');
|
||||||
@@ -659,43 +659,43 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test('isNumber', function(assert) {
|
QUnit.test('isNumber', function(assert) {
|
||||||
assert.ok(!_.isNumber('string'), 'a string is not a number');
|
assert.notOk(_.isNumber('string'), 'a string is not a number');
|
||||||
assert.ok(!_.isNumber(arguments), 'the arguments object is not a number');
|
assert.notOk(_.isNumber(arguments), 'the arguments object is not a number');
|
||||||
assert.ok(!_.isNumber(void 0), 'undefined is not a number');
|
assert.notOk(_.isNumber(void 0), 'undefined is not a number');
|
||||||
assert.ok(_.isNumber(3 * 4 - 7 / 10), 'but numbers are');
|
assert.ok(_.isNumber(3 * 4 - 7 / 10), 'but numbers are');
|
||||||
assert.ok(_.isNumber(NaN), 'NaN *is* a number');
|
assert.ok(_.isNumber(NaN), 'NaN *is* a number');
|
||||||
assert.ok(_.isNumber(Infinity), 'Infinity is a number');
|
assert.ok(_.isNumber(Infinity), 'Infinity is a number');
|
||||||
assert.ok(!_.isNumber('1'), 'numeric strings are not numbers');
|
assert.notOk(_.isNumber('1'), 'numeric strings are not numbers');
|
||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test('isBoolean', function(assert) {
|
QUnit.test('isBoolean', function(assert) {
|
||||||
assert.ok(!_.isBoolean(2), 'a number is not a boolean');
|
assert.notOk(_.isBoolean(2), 'a number is not a boolean');
|
||||||
assert.ok(!_.isBoolean('string'), 'a string is not a boolean');
|
assert.notOk(_.isBoolean('string'), 'a string is not a boolean');
|
||||||
assert.ok(!_.isBoolean('false'), 'the string "false" is not a boolean');
|
assert.notOk(_.isBoolean('false'), 'the string "false" is not a boolean');
|
||||||
assert.ok(!_.isBoolean('true'), 'the string "true" is not a boolean');
|
assert.notOk(_.isBoolean('true'), 'the string "true" is not a boolean');
|
||||||
assert.ok(!_.isBoolean(arguments), 'the arguments object is not a boolean');
|
assert.notOk(_.isBoolean(arguments), 'the arguments object is not a boolean');
|
||||||
assert.ok(!_.isBoolean(void 0), 'undefined is not a boolean');
|
assert.notOk(_.isBoolean(void 0), 'undefined is not a boolean');
|
||||||
assert.ok(!_.isBoolean(NaN), 'NaN is not a boolean');
|
assert.notOk(_.isBoolean(NaN), 'NaN is not a boolean');
|
||||||
assert.ok(!_.isBoolean(null), 'null is not a boolean');
|
assert.notOk(_.isBoolean(null), 'null is not a boolean');
|
||||||
assert.ok(_.isBoolean(true), 'but true is');
|
assert.ok(_.isBoolean(true), 'but true is');
|
||||||
assert.ok(_.isBoolean(false), 'and so is false');
|
assert.ok(_.isBoolean(false), 'and so is false');
|
||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test('isMap', function(assert) {
|
QUnit.test('isMap', function(assert) {
|
||||||
assert.ok(!_.isMap('string'), 'a string is not a map');
|
assert.notOk(_.isMap('string'), 'a string is not a map');
|
||||||
assert.ok(!_.isMap(2), 'a number is not a map');
|
assert.notOk(_.isMap(2), 'a number is not a map');
|
||||||
assert.ok(!_.isMap({}), 'an object is not a map');
|
assert.notOk(_.isMap({}), 'an object is not a map');
|
||||||
assert.ok(!_.isMap(false), 'a boolean is not a map');
|
assert.notOk(_.isMap(false), 'a boolean is not a map');
|
||||||
assert.ok(!_.isMap(void 0), 'undefined is not a map');
|
assert.notOk(_.isMap(void 0), 'undefined is not a map');
|
||||||
assert.ok(!_.isMap([1, 2, 3]), 'an array is not a map');
|
assert.notOk(_.isMap([1, 2, 3]), 'an array is not a map');
|
||||||
if (typeof Set === 'function') {
|
if (typeof Set === 'function') {
|
||||||
assert.ok(!_.isMap(new Set()), 'a set is not a map');
|
assert.notOk(_.isMap(new Set()), 'a set is not a map');
|
||||||
}
|
}
|
||||||
if (typeof WeakSet === 'function') {
|
if (typeof WeakSet === 'function') {
|
||||||
assert.ok(!_.isMap(new WeakSet()), 'a weakset is not a map');
|
assert.notOk(_.isMap(new WeakSet()), 'a weakset is not a map');
|
||||||
}
|
}
|
||||||
if (typeof WeakMap === 'function') {
|
if (typeof WeakMap === 'function') {
|
||||||
assert.ok(!_.isMap(new WeakMap()), 'a weakmap is not a map');
|
assert.notOk(_.isMap(new WeakMap()), 'a weakmap is not a map');
|
||||||
}
|
}
|
||||||
if (typeof Map === 'function') {
|
if (typeof Map === 'function') {
|
||||||
var keyString = 'a string';
|
var keyString = 'a string';
|
||||||
@@ -706,20 +706,20 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test('isWeakMap', function(assert) {
|
QUnit.test('isWeakMap', function(assert) {
|
||||||
assert.ok(!_.isWeakMap('string'), 'a string is not a weakmap');
|
assert.notOk(_.isWeakMap('string'), 'a string is not a weakmap');
|
||||||
assert.ok(!_.isWeakMap(2), 'a number is not a weakmap');
|
assert.notOk(_.isWeakMap(2), 'a number is not a weakmap');
|
||||||
assert.ok(!_.isWeakMap({}), 'an object is not a weakmap');
|
assert.notOk(_.isWeakMap({}), 'an object is not a weakmap');
|
||||||
assert.ok(!_.isWeakMap(false), 'a boolean is not a weakmap');
|
assert.notOk(_.isWeakMap(false), 'a boolean is not a weakmap');
|
||||||
assert.ok(!_.isWeakMap(void 0), 'undefined is not a weakmap');
|
assert.notOk(_.isWeakMap(void 0), 'undefined is not a weakmap');
|
||||||
assert.ok(!_.isWeakMap([1, 2, 3]), 'an array is not a weakmap');
|
assert.notOk(_.isWeakMap([1, 2, 3]), 'an array is not a weakmap');
|
||||||
if (typeof Set === 'function') {
|
if (typeof Set === 'function') {
|
||||||
assert.ok(!_.isWeakMap(new Set()), 'a set is not a weakmap');
|
assert.notOk(_.isWeakMap(new Set()), 'a set is not a weakmap');
|
||||||
}
|
}
|
||||||
if (typeof WeakSet === 'function') {
|
if (typeof WeakSet === 'function') {
|
||||||
assert.ok(!_.isWeakMap(new WeakSet()), 'a weakset is not a weakmap');
|
assert.notOk(_.isWeakMap(new WeakSet()), 'a weakset is not a weakmap');
|
||||||
}
|
}
|
||||||
if (typeof Map === 'function') {
|
if (typeof Map === 'function') {
|
||||||
assert.ok(!_.isWeakMap(new Map()), 'a map is not a weakmap');
|
assert.notOk(_.isWeakMap(new Map()), 'a map is not a weakmap');
|
||||||
}
|
}
|
||||||
if (typeof WeakMap === 'function') {
|
if (typeof WeakMap === 'function') {
|
||||||
var keyObj = {}, obj = new WeakMap();
|
var keyObj = {}, obj = new WeakMap();
|
||||||
@@ -729,20 +729,20 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test('isSet', function(assert) {
|
QUnit.test('isSet', function(assert) {
|
||||||
assert.ok(!_.isSet('string'), 'a string is not a set');
|
assert.notOk(_.isSet('string'), 'a string is not a set');
|
||||||
assert.ok(!_.isSet(2), 'a number is not a set');
|
assert.notOk(_.isSet(2), 'a number is not a set');
|
||||||
assert.ok(!_.isSet({}), 'an object is not a set');
|
assert.notOk(_.isSet({}), 'an object is not a set');
|
||||||
assert.ok(!_.isSet(false), 'a boolean is not a set');
|
assert.notOk(_.isSet(false), 'a boolean is not a set');
|
||||||
assert.ok(!_.isSet(void 0), 'undefined is not a set');
|
assert.notOk(_.isSet(void 0), 'undefined is not a set');
|
||||||
assert.ok(!_.isSet([1, 2, 3]), 'an array is not a set');
|
assert.notOk(_.isSet([1, 2, 3]), 'an array is not a set');
|
||||||
if (typeof Map === 'function') {
|
if (typeof Map === 'function') {
|
||||||
assert.ok(!_.isSet(new Map()), 'a map is not a set');
|
assert.notOk(_.isSet(new Map()), 'a map is not a set');
|
||||||
}
|
}
|
||||||
if (typeof WeakMap === 'function') {
|
if (typeof WeakMap === 'function') {
|
||||||
assert.ok(!_.isSet(new WeakMap()), 'a weakmap is not a set');
|
assert.notOk(_.isSet(new WeakMap()), 'a weakmap is not a set');
|
||||||
}
|
}
|
||||||
if (typeof WeakSet === 'function') {
|
if (typeof WeakSet === 'function') {
|
||||||
assert.ok(!_.isSet(new WeakSet()), 'a weakset is not a set');
|
assert.notOk(_.isSet(new WeakSet()), 'a weakset is not a set');
|
||||||
}
|
}
|
||||||
if (typeof Set === 'function') {
|
if (typeof Set === 'function') {
|
||||||
var obj = new Set();
|
var obj = new Set();
|
||||||
@@ -753,20 +753,20 @@
|
|||||||
|
|
||||||
QUnit.test('isWeakSet', function(assert) {
|
QUnit.test('isWeakSet', function(assert) {
|
||||||
|
|
||||||
assert.ok(!_.isWeakSet('string'), 'a string is not a weakset');
|
assert.notOk(_.isWeakSet('string'), 'a string is not a weakset');
|
||||||
assert.ok(!_.isWeakSet(2), 'a number is not a weakset');
|
assert.notOk(_.isWeakSet(2), 'a number is not a weakset');
|
||||||
assert.ok(!_.isWeakSet({}), 'an object is not a weakset');
|
assert.notOk(_.isWeakSet({}), 'an object is not a weakset');
|
||||||
assert.ok(!_.isWeakSet(false), 'a boolean is not a weakset');
|
assert.notOk(_.isWeakSet(false), 'a boolean is not a weakset');
|
||||||
assert.ok(!_.isWeakSet(void 0), 'undefined is not a weakset');
|
assert.notOk(_.isWeakSet(void 0), 'undefined is not a weakset');
|
||||||
assert.ok(!_.isWeakSet([1, 2, 3]), 'an array is not a weakset');
|
assert.notOk(_.isWeakSet([1, 2, 3]), 'an array is not a weakset');
|
||||||
if (typeof Map === 'function') {
|
if (typeof Map === 'function') {
|
||||||
assert.ok(!_.isWeakSet(new Map()), 'a map is not a weakset');
|
assert.notOk(_.isWeakSet(new Map()), 'a map is not a weakset');
|
||||||
}
|
}
|
||||||
if (typeof WeakMap === 'function') {
|
if (typeof WeakMap === 'function') {
|
||||||
assert.ok(!_.isWeakSet(new WeakMap()), 'a weakmap is not a weakset');
|
assert.notOk(_.isWeakSet(new WeakMap()), 'a weakmap is not a weakset');
|
||||||
}
|
}
|
||||||
if (typeof Set === 'function') {
|
if (typeof Set === 'function') {
|
||||||
assert.ok(!_.isWeakSet(new Set()), 'a set is not a weakset');
|
assert.notOk(_.isWeakSet(new Set()), 'a set is not a weakset');
|
||||||
}
|
}
|
||||||
if (typeof WeakSet === 'function') {
|
if (typeof WeakSet === 'function') {
|
||||||
var obj = new WeakSet();
|
var obj = new WeakSet();
|
||||||
@@ -776,19 +776,19 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test('isFunction', function(assert) {
|
QUnit.test('isFunction', function(assert) {
|
||||||
assert.ok(!_.isFunction(void 0), 'undefined vars are not functions');
|
assert.notOk(_.isFunction(void 0), 'undefined vars are not functions');
|
||||||
assert.ok(!_.isFunction([1, 2, 3]), 'arrays are not functions');
|
assert.notOk(_.isFunction([1, 2, 3]), 'arrays are not functions');
|
||||||
assert.ok(!_.isFunction('moe'), 'strings are not functions');
|
assert.notOk(_.isFunction('moe'), 'strings are not functions');
|
||||||
assert.ok(_.isFunction(_.isFunction), 'but functions are');
|
assert.ok(_.isFunction(_.isFunction), 'but functions are');
|
||||||
assert.ok(_.isFunction(function(){}), 'even anonymous ones');
|
assert.ok(_.isFunction(function(){}), 'even anonymous ones');
|
||||||
|
|
||||||
if (testElement) {
|
if (testElement) {
|
||||||
assert.ok(!_.isFunction(testElement), 'elements are not functions');
|
assert.notOk(_.isFunction(testElement), 'elements are not functions');
|
||||||
}
|
}
|
||||||
|
|
||||||
var nodelist = typeof document != 'undefined' && document.childNodes;
|
var nodelist = typeof document != 'undefined' && document.childNodes;
|
||||||
if (nodelist) {
|
if (nodelist) {
|
||||||
assert.ok(!_.isFunction(nodelist));
|
assert.notOk(_.isFunction(nodelist));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -806,65 +806,68 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
QUnit.test('isDate', function(assert) {
|
QUnit.test('isDate', function(assert) {
|
||||||
assert.ok(!_.isDate(100), 'numbers are not dates');
|
assert.notOk(_.isDate(100), 'numbers are not dates');
|
||||||
assert.ok(!_.isDate({}), 'objects are not dates');
|
assert.notOk(_.isDate({}), 'objects are not dates');
|
||||||
assert.ok(_.isDate(new Date()), 'but dates are');
|
assert.ok(_.isDate(new Date()), 'but dates are');
|
||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test('isRegExp', function(assert) {
|
QUnit.test('isRegExp', function(assert) {
|
||||||
assert.ok(!_.isRegExp(_.identity), 'functions are not RegExps');
|
assert.notOk(_.isRegExp(_.identity), 'functions are not RegExps');
|
||||||
assert.ok(_.isRegExp(/identity/), 'but RegExps are');
|
assert.ok(_.isRegExp(/identity/), 'but RegExps are');
|
||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test('isFinite', function(assert) {
|
QUnit.test('isFinite', function(assert) {
|
||||||
assert.ok(!_.isFinite(void 0), 'undefined is not finite');
|
assert.notOk(_.isFinite(void 0), 'undefined is not finite');
|
||||||
assert.ok(!_.isFinite(null), 'null is not finite');
|
assert.notOk(_.isFinite(null), 'null is not finite');
|
||||||
assert.ok(!_.isFinite(NaN), 'NaN is not finite');
|
assert.notOk(_.isFinite(NaN), 'NaN is not finite');
|
||||||
assert.ok(!_.isFinite(Infinity), 'Infinity is not finite');
|
assert.notOk(_.isFinite(Infinity), 'Infinity is not finite');
|
||||||
assert.ok(!_.isFinite(-Infinity), '-Infinity is not finite');
|
assert.notOk(_.isFinite(-Infinity), '-Infinity is not finite');
|
||||||
assert.ok(_.isFinite('12'), 'Numeric strings are numbers');
|
assert.ok(_.isFinite('12'), 'Numeric strings are numbers');
|
||||||
assert.ok(!_.isFinite('1a'), 'Non numeric strings are not numbers');
|
assert.notOk(_.isFinite('1a'), 'Non numeric strings are not numbers');
|
||||||
assert.ok(!_.isFinite(''), 'Empty strings are not numbers');
|
assert.notOk(_.isFinite(''), 'Empty strings are not numbers');
|
||||||
var obj = new Number(5);
|
var obj = new Number(5);
|
||||||
assert.ok(_.isFinite(obj), 'Number instances can be finite');
|
assert.ok(_.isFinite(obj), 'Number instances can be finite');
|
||||||
assert.ok(_.isFinite(0), '0 is finite');
|
assert.ok(_.isFinite(0), '0 is finite');
|
||||||
assert.ok(_.isFinite(123), 'Ints are finite');
|
assert.ok(_.isFinite(123), 'Ints are finite');
|
||||||
assert.ok(_.isFinite(-12.44), 'Floats are finite');
|
assert.ok(_.isFinite(-12.44), 'Floats are finite');
|
||||||
if (typeof Symbol === 'function') {
|
if (typeof Symbol === 'function') {
|
||||||
assert.ok(!_.isFinite(Symbol()), 'symbols are not numbers');
|
assert.notOk(_.isFinite(Symbol()), 'symbols are not numbers');
|
||||||
assert.ok(!_.isFinite(Symbol('description')), 'described symbols are not numbers');
|
assert.notOk(_.isFinite(Symbol('description')), 'described symbols are not numbers');
|
||||||
assert.ok(!_.isFinite(Object(Symbol())), 'boxed symbols are not numbers');
|
assert.notOk(_.isFinite(Object(Symbol())), 'boxed symbols are not numbers');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test('isNaN', function(assert) {
|
QUnit.test('isNaN', function(assert) {
|
||||||
assert.ok(!_.isNaN(void 0), 'undefined is not NaN');
|
assert.notOk(_.isNaN(void 0), 'undefined is not NaN');
|
||||||
assert.ok(!_.isNaN(null), 'null is not NaN');
|
assert.notOk(_.isNaN(null), 'null is not NaN');
|
||||||
assert.ok(!_.isNaN(0), '0 is not NaN');
|
assert.notOk(_.isNaN(0), '0 is not NaN');
|
||||||
assert.ok(!_.isNaN(new Number(0)), 'wrapped 0 is not NaN');
|
assert.notOk(_.isNaN(new Number(0)), 'wrapped 0 is not NaN');
|
||||||
assert.ok(_.isNaN(NaN), 'but NaN is');
|
assert.ok(_.isNaN(NaN), 'but NaN is');
|
||||||
assert.ok(_.isNaN(new Number(NaN)), 'wrapped NaN is still NaN');
|
assert.ok(_.isNaN(new Number(NaN)), 'wrapped NaN is still NaN');
|
||||||
|
if (typeof Symbol !== 'undefined'){
|
||||||
|
assert.notOk(_.isNaN(Symbol()), 'symbol is not NaN');
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test('isNull', function(assert) {
|
QUnit.test('isNull', function(assert) {
|
||||||
assert.ok(!_.isNull(void 0), 'undefined is not null');
|
assert.notOk(_.isNull(void 0), 'undefined is not null');
|
||||||
assert.ok(!_.isNull(NaN), 'NaN is not null');
|
assert.notOk(_.isNull(NaN), 'NaN is not null');
|
||||||
assert.ok(_.isNull(null), 'but null is');
|
assert.ok(_.isNull(null), 'but null is');
|
||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test('isUndefined', function(assert) {
|
QUnit.test('isUndefined', function(assert) {
|
||||||
assert.ok(!_.isUndefined(1), 'numbers are defined');
|
assert.notOk(_.isUndefined(1), 'numbers are defined');
|
||||||
assert.ok(!_.isUndefined(null), 'null is defined');
|
assert.notOk(_.isUndefined(null), 'null is defined');
|
||||||
assert.ok(!_.isUndefined(false), 'false is defined');
|
assert.notOk(_.isUndefined(false), 'false is defined');
|
||||||
assert.ok(!_.isUndefined(NaN), 'NaN is defined');
|
assert.notOk(_.isUndefined(NaN), 'NaN is defined');
|
||||||
assert.ok(_.isUndefined(), 'nothing is undefined');
|
assert.ok(_.isUndefined(), 'nothing is undefined');
|
||||||
assert.ok(_.isUndefined(void 0), 'undefined is undefined');
|
assert.ok(_.isUndefined(void 0), 'undefined is undefined');
|
||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test('isError', function(assert) {
|
QUnit.test('isError', function(assert) {
|
||||||
assert.ok(!_.isError(1), 'numbers are not Errors');
|
assert.notOk(_.isError(1), 'numbers are not Errors');
|
||||||
assert.ok(!_.isError(null), 'null is not an Error');
|
assert.notOk(_.isError(null), 'null is not an Error');
|
||||||
assert.ok(!_.isError(Error), 'functions are not Errors');
|
assert.notOk(_.isError(Error), 'functions are not Errors');
|
||||||
assert.ok(_.isError(new Error()), 'Errors are Errors');
|
assert.ok(_.isError(new Error()), 'Errors are Errors');
|
||||||
assert.ok(_.isError(new EvalError()), 'EvalErrors are Errors');
|
assert.ok(_.isError(new EvalError()), 'EvalErrors are Errors');
|
||||||
assert.ok(_.isError(new RangeError()), 'RangeErrors are Errors');
|
assert.ok(_.isError(new RangeError()), 'RangeErrors are Errors');
|
||||||
@@ -893,13 +896,13 @@
|
|||||||
QUnit.test('has', function(assert) {
|
QUnit.test('has', function(assert) {
|
||||||
var obj = {foo: 'bar', func: function(){}};
|
var obj = {foo: 'bar', func: function(){}};
|
||||||
assert.ok(_.has(obj, 'foo'), 'has() checks that the object has a property.');
|
assert.ok(_.has(obj, 'foo'), 'has() checks that the object has a property.');
|
||||||
assert.ok(!_.has(obj, 'baz'), "has() returns false if the object doesn't have the property.");
|
assert.notOk(_.has(obj, 'baz'), "has() returns false if the object doesn't have the property.");
|
||||||
assert.ok(_.has(obj, 'func'), 'has() works for functions too.');
|
assert.ok(_.has(obj, 'func'), 'has() works for functions too.');
|
||||||
obj.hasOwnProperty = null;
|
obj.hasOwnProperty = null;
|
||||||
assert.ok(_.has(obj, 'foo'), 'has() works even when the hasOwnProperty method is deleted.');
|
assert.ok(_.has(obj, 'foo'), 'has() works even when the hasOwnProperty method is deleted.');
|
||||||
var child = {};
|
var child = {};
|
||||||
child.prototype = obj;
|
child.prototype = obj;
|
||||||
assert.ok(!_.has(child, 'foo'), 'has() does not check the prototype chain for a property.');
|
assert.notOk(_.has(child, 'foo'), 'has() does not check the prototype chain for a property.');
|
||||||
assert.strictEqual(_.has(null, 'foo'), false, 'has() returns false for null');
|
assert.strictEqual(_.has(null, 'foo'), false, 'has() returns false for null');
|
||||||
assert.strictEqual(_.has(void 0, 'foo'), false, 'has() returns false for undefined');
|
assert.strictEqual(_.has(void 0, 'foo'), false, 'has() returns false for undefined');
|
||||||
});
|
});
|
||||||
@@ -958,8 +961,8 @@
|
|||||||
assert.equal(_.matcher({})(null), true, 'Empty spec called with null object returns true');
|
assert.equal(_.matcher({})(null), true, 'Empty spec called with null object returns true');
|
||||||
assert.equal(_.matcher({a: 1})(null), false, 'Non-empty spec called with null object returns false');
|
assert.equal(_.matcher({a: 1})(null), false, 'Non-empty spec called with null object returns false');
|
||||||
|
|
||||||
assert.ok(_.find(stooges, _.matcher({hair: false})) === curly, 'returns a predicate that can be used by finding functions.');
|
assert.strictEqual(_.find(stooges, _.matcher({hair: false})), curly, 'returns a predicate that can be used by finding functions.');
|
||||||
assert.ok(_.find(stooges, _.matcher(moe)) === moe, 'can be used to locate an object exists in a collection.');
|
assert.strictEqual(_.find(stooges, _.matcher(moe)), moe, 'can be used to locate an object exists in a collection.');
|
||||||
assert.deepEqual(_.filter([null, void 0], _.matcher({a: 1})), [], 'Do not throw on null values.');
|
assert.deepEqual(_.filter([null, void 0], _.matcher({a: 1})), [], 'Do not throw on null values.');
|
||||||
|
|
||||||
assert.deepEqual(_.filter([null, void 0], _.matcher(null)), [null, void 0], 'null matches null');
|
assert.deepEqual(_.filter([null, void 0], _.matcher(null)), [null, void 0], 'null matches null');
|
||||||
|
|||||||
17
vendor/underscore/test/utility.js
vendored
17
vendor/underscore/test/utility.js
vendored
@@ -52,8 +52,8 @@
|
|||||||
QUnit.test('#750 - Return _ instance.', function(assert) {
|
QUnit.test('#750 - Return _ instance.', function(assert) {
|
||||||
assert.expect(2);
|
assert.expect(2);
|
||||||
var instance = _([]);
|
var instance = _([]);
|
||||||
assert.ok(_(instance) === instance);
|
assert.strictEqual(_(instance), instance);
|
||||||
assert.ok(new _(instance) === instance);
|
assert.strictEqual(new _(instance), instance);
|
||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test('identity', function(assert) {
|
QUnit.test('identity', function(assert) {
|
||||||
@@ -137,11 +137,12 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test('mixin', function(assert) {
|
QUnit.test('mixin', function(assert) {
|
||||||
_.mixin({
|
var ret = _.mixin({
|
||||||
myReverse: function(string) {
|
myReverse: function(string) {
|
||||||
return string.split('').reverse().join('');
|
return string.split('').reverse().join('');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
assert.equal(ret, _, 'returns the _ object to facilitate chaining');
|
||||||
assert.equal(_.myReverse('panacea'), 'aecanap', 'mixed in a function to _');
|
assert.equal(_.myReverse('panacea'), 'aecanap', 'mixed in a function to _');
|
||||||
assert.equal(_('champ').myReverse(), 'pmahc', 'mixed in a function to the OOP wrapper');
|
assert.equal(_('champ').myReverse(), 'pmahc', 'mixed in a function to the OOP wrapper');
|
||||||
});
|
});
|
||||||
@@ -188,7 +189,7 @@
|
|||||||
var str = 'some string & another string & yet another';
|
var str = 'some string & another string & yet another';
|
||||||
var escaped = _.escape(str);
|
var escaped = _.escape(str);
|
||||||
|
|
||||||
assert.ok(escaped.indexOf('&') !== -1, 'handles & aka &');
|
assert.notStrictEqual(escaped.indexOf('&'), -1, 'handles & aka &');
|
||||||
assert.equal(_.unescape(str), str, 'can unescape &');
|
assert.equal(_.unescape(str), str, 'can unescape &');
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -370,9 +371,9 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test('#547 - _.templateSettings is unchanged by custom settings.', function(assert) {
|
QUnit.test('#547 - _.templateSettings is unchanged by custom settings.', function(assert) {
|
||||||
assert.ok(!_.templateSettings.variable);
|
assert.notOk(_.templateSettings.variable);
|
||||||
_.template('', {}, {variable: 'x'});
|
_.template('', {}, {variable: 'x'});
|
||||||
assert.ok(!_.templateSettings.variable);
|
assert.notOk(_.templateSettings.variable);
|
||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test('#556 - undefined template variables.', function(assert) {
|
QUnit.test('#556 - undefined template variables.', function(assert) {
|
||||||
@@ -397,11 +398,11 @@
|
|||||||
assert.expect(2);
|
assert.expect(2);
|
||||||
var count = 0;
|
var count = 0;
|
||||||
var template = _.template('<%= f() %>');
|
var template = _.template('<%= f() %>');
|
||||||
template({f: function(){ assert.ok(!count++); }});
|
template({f: function(){ assert.notOk(count++); }});
|
||||||
|
|
||||||
var countEscaped = 0;
|
var countEscaped = 0;
|
||||||
var templateEscaped = _.template('<%- f() %>');
|
var templateEscaped = _.template('<%- f() %>');
|
||||||
templateEscaped({f: function(){ assert.ok(!countEscaped++); }});
|
templateEscaped({f: function(){ assert.notOk(countEscaped++); }});
|
||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test('#746 - _.template settings are not modified.', function(assert) {
|
QUnit.test('#746 - _.template settings are not modified.', function(assert) {
|
||||||
|
|||||||
24
vendor/underscore/underscore.js
vendored
24
vendor/underscore/underscore.js
vendored
@@ -84,18 +84,23 @@
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var builtinIteratee;
|
||||||
|
|
||||||
// An internal function to generate callbacks that can be applied to each
|
// An internal function to generate callbacks that can be applied to each
|
||||||
// element in a collection, returning the desired result — either `identity`,
|
// element in a collection, returning the desired result — either `identity`,
|
||||||
// an arbitrary callback, a property matcher, or a property accessor.
|
// an arbitrary callback, a property matcher, or a property accessor.
|
||||||
var cb = function(value, context, argCount) {
|
var cb = function(value, context, argCount) {
|
||||||
|
if (_.iteratee !== builtinIteratee) return _.iteratee(value, context);
|
||||||
if (value == null) return _.identity;
|
if (value == null) return _.identity;
|
||||||
if (_.isFunction(value)) return optimizeCb(value, context, argCount);
|
if (_.isFunction(value)) return optimizeCb(value, context, argCount);
|
||||||
if (_.isObject(value)) return _.matcher(value);
|
if (_.isObject(value)) return _.matcher(value);
|
||||||
return _.property(value);
|
return _.property(value);
|
||||||
};
|
};
|
||||||
|
|
||||||
// An external wrapper for the internal callback generator.
|
// External wrapper for our callback generator. Users may customize
|
||||||
_.iteratee = function(value, context) {
|
// `_.iteratee` if they want additional predicate/iteratee shorthand styles.
|
||||||
|
// This abstraction hides the internal-only argCount argument.
|
||||||
|
_.iteratee = builtinIteratee = function(value, context) {
|
||||||
return cb(value, context, Infinity);
|
return cb(value, context, Infinity);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -439,7 +444,7 @@
|
|||||||
// Keep surrogate pair characters together
|
// Keep surrogate pair characters together
|
||||||
return obj.match(reStrSymbol);
|
return obj.match(reStrSymbol);
|
||||||
}
|
}
|
||||||
if (isArrayLike(obj)) return _.map(obj);
|
if (isArrayLike(obj)) return _.map(obj, _.identity);
|
||||||
return _.values(obj);
|
return _.values(obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -462,7 +467,7 @@
|
|||||||
// values in the array. Aliased as `head` and `take`. The **guard** check
|
// values in the array. Aliased as `head` and `take`. The **guard** check
|
||||||
// allows it to work with `_.map`.
|
// allows it to work with `_.map`.
|
||||||
_.first = _.head = _.take = function(array, n, guard) {
|
_.first = _.head = _.take = function(array, n, guard) {
|
||||||
if (array == null) return void 0;
|
if (array == null || array.length < 1) return void 0;
|
||||||
if (n == null || guard) return array[0];
|
if (n == null || guard) return array[0];
|
||||||
return _.initial(array, array.length - n);
|
return _.initial(array, array.length - n);
|
||||||
};
|
};
|
||||||
@@ -477,7 +482,7 @@
|
|||||||
// Get the last element of an array. Passing **n** will return the last N
|
// Get the last element of an array. Passing **n** will return the last N
|
||||||
// values in the array.
|
// values in the array.
|
||||||
_.last = function(array, n, guard) {
|
_.last = function(array, n, guard) {
|
||||||
if (array == null) return void 0;
|
if (array == null || array.length < 1) return void 0;
|
||||||
if (n == null || guard) return array[array.length - 1];
|
if (n == null || guard) return array[array.length - 1];
|
||||||
return _.rest(array, Math.max(0, array.length - n));
|
return _.rest(array, Math.max(0, array.length - n));
|
||||||
};
|
};
|
||||||
@@ -491,7 +496,7 @@
|
|||||||
|
|
||||||
// Trim out all falsy values from an array.
|
// Trim out all falsy values from an array.
|
||||||
_.compact = function(array) {
|
_.compact = function(array) {
|
||||||
return _.filter(array);
|
return _.filter(array, Boolean);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Internal implementation of a recursive `flatten` function.
|
// Internal implementation of a recursive `flatten` function.
|
||||||
@@ -1094,7 +1099,7 @@
|
|||||||
return result;
|
return result;
|
||||||
});
|
});
|
||||||
|
|
||||||
// Return a copy of the object without the blacklisted properties.
|
// Return a copy of the object without the blacklisted properties.
|
||||||
_.omit = restArgs(function(obj, keys) {
|
_.omit = restArgs(function(obj, keys) {
|
||||||
var iteratee = keys[0], context;
|
var iteratee = keys[0], context;
|
||||||
if (_.isFunction(iteratee)) {
|
if (_.isFunction(iteratee)) {
|
||||||
@@ -1403,7 +1408,7 @@
|
|||||||
return new Date().getTime();
|
return new Date().getTime();
|
||||||
};
|
};
|
||||||
|
|
||||||
// List of HTML entities for escaping.
|
// List of HTML entities for escaping.
|
||||||
var escapeMap = {
|
var escapeMap = {
|
||||||
'&': '&',
|
'&': '&',
|
||||||
'<': '<',
|
'<': '<',
|
||||||
@@ -1568,6 +1573,7 @@
|
|||||||
return chainResult(this, func.apply(_, args));
|
return chainResult(this, func.apply(_, args));
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
return _;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Add all of the Underscore functions to the wrapper object.
|
// Add all of the Underscore functions to the wrapper object.
|
||||||
@@ -1602,7 +1608,7 @@
|
|||||||
_.prototype.valueOf = _.prototype.toJSON = _.prototype.value;
|
_.prototype.valueOf = _.prototype.toJSON = _.prototype.value;
|
||||||
|
|
||||||
_.prototype.toString = function() {
|
_.prototype.toString = function() {
|
||||||
return '' + this._wrapped;
|
return String(this._wrapped);
|
||||||
};
|
};
|
||||||
|
|
||||||
// AMD registration happens at the end for compatibility with AMD loaders
|
// AMD registration happens at the end for compatibility with AMD loaders
|
||||||
|
|||||||
Reference in New Issue
Block a user