mirror of
https://github.com/LukeHagar/vercel.git
synced 2025-12-27 19:00:11 +00:00
Compare commits
3718 Commits
4.2.2
...
@now/node@
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a36c2eabb3 | ||
|
|
be93c55c0b | ||
|
|
eeefbeaed4 | ||
|
|
027bc6ab5a | ||
|
|
890de6a625 | ||
|
|
537d508a1e | ||
|
|
3b98cdac4b | ||
|
|
aaf7d6b1cd | ||
|
|
d4b6814d40 | ||
|
|
a85f11aaef | ||
|
|
090c3ef9fc | ||
|
|
46c8cb1a68 | ||
|
|
faeb053ea6 | ||
|
|
708a09b86a | ||
|
|
89403e93e4 | ||
|
|
ecb0c08fe2 | ||
|
|
0b88c158b9 | ||
|
|
ec3a38107a | ||
|
|
0c0f1c6eb5 | ||
|
|
ed296ef733 | ||
|
|
246f47ec95 | ||
|
|
9d95b99b72 | ||
|
|
3de8ae9d7e | ||
|
|
44f6e1904e | ||
|
|
d9c84fc4ce | ||
|
|
b5142d935b | ||
|
|
718a451110 | ||
|
|
9755847855 | ||
|
|
abc417b6b3 | ||
|
|
d6f71c8d7b | ||
|
|
d90892dc9c | ||
|
|
60d2f8b96c | ||
|
|
2488adf80d | ||
|
|
9deb5b31d2 | ||
|
|
ae55823c3c | ||
|
|
d3395553fe | ||
|
|
e742dd3a48 | ||
|
|
4f0f44e746 | ||
|
|
0da98a7f5d | ||
|
|
685989ae57 | ||
|
|
6bc121e7b1 | ||
|
|
56d3fed954 | ||
|
|
40bbff9bee | ||
|
|
66ab011f4a | ||
|
|
f4237d3db0 | ||
|
|
6f9a083dba | ||
|
|
688fcc6a5b | ||
|
|
847102cf62 | ||
|
|
25d5b9c9cf | ||
|
|
271bab786e | ||
|
|
028e023aba | ||
|
|
39719eed20 | ||
|
|
438339258d | ||
|
|
be445c987c | ||
|
|
93fef7885b | ||
|
|
899c9962ad | ||
|
|
2b601d2424 | ||
|
|
3e36b05434 | ||
|
|
59c9665c3f | ||
|
|
901137c7f6 | ||
|
|
e594e7bbbb | ||
|
|
a477b1c22e | ||
|
|
22ac20d838 | ||
|
|
3794234d7a | ||
|
|
92a40db048 | ||
|
|
502aad7c2b | ||
|
|
b49afb61a6 | ||
|
|
d380902ad3 | ||
|
|
ffaed62094 | ||
|
|
b0adeb68fe | ||
|
|
2372832654 | ||
|
|
e6a9586b7e | ||
|
|
9687415eed | ||
|
|
49b375ed6a | ||
|
|
906dea096e | ||
|
|
3225a83084 | ||
|
|
87794cfcc5 | ||
|
|
79ad0ce0c4 | ||
|
|
fda5987465 | ||
|
|
5cfdd5a6b2 | ||
|
|
bd6e0f9f93 | ||
|
|
aa8d002309 | ||
|
|
42ce9aca86 | ||
|
|
156f596189 | ||
|
|
8acfd5bf71 | ||
|
|
76c99ebb28 | ||
|
|
5fb119b99c | ||
|
|
99b766d9cb | ||
|
|
c207cf9b40 | ||
|
|
dd00ac4621 | ||
|
|
3d18a067a0 | ||
|
|
c48571a799 | ||
|
|
6eeb6983d9 | ||
|
|
aee33f040d | ||
|
|
b100677b3b | ||
|
|
9241b3ae2f | ||
|
|
1088da6871 | ||
|
|
f7b4dd4458 | ||
|
|
fb85b6b27a | ||
|
|
2e5e9b9a6f | ||
|
|
d3cc306e5b | ||
|
|
d6c6a2a271 | ||
|
|
6171a58ae3 | ||
|
|
5a6d1a135f | ||
|
|
68deab9007 | ||
|
|
d6114e2bef | ||
|
|
5fdc55f3fb | ||
|
|
751b166536 | ||
|
|
6ffc8d97f4 | ||
|
|
67a80d6b83 | ||
|
|
934cf772bc | ||
|
|
b01a24afdb | ||
|
|
0ad75b52bf | ||
|
|
050772e78a | ||
|
|
7c05dc1420 | ||
|
|
bdd25ac727 | ||
|
|
3a27328828 | ||
|
|
c076a5620f | ||
|
|
2bd8ef9eed | ||
|
|
500014f2fc | ||
|
|
17687e9bcd | ||
|
|
90354e9fe7 | ||
|
|
6236631beb | ||
|
|
75aefdddd6 | ||
|
|
566d82e873 | ||
|
|
44ae0b654e | ||
|
|
d8cfaae596 | ||
|
|
a40e0f21ee | ||
|
|
ac1f506c98 | ||
|
|
68d5bdcf3d | ||
|
|
beb51f8c67 | ||
|
|
b881cb7111 | ||
|
|
d83bc59257 | ||
|
|
5be9f297de | ||
|
|
51d440431e | ||
|
|
7cf061122c | ||
|
|
1254368505 | ||
|
|
9d4b830c5f | ||
|
|
37401b4363 | ||
|
|
10fe08e14f | ||
|
|
0ecdb35d50 | ||
|
|
caee8fe9ef | ||
|
|
7d92c27b2d | ||
|
|
701eabbaba | ||
|
|
e74a1b2d1a | ||
|
|
e087b02333 | ||
|
|
eea7f902b5 | ||
|
|
db7583201b | ||
|
|
023001a8b1 | ||
|
|
4ff8ab2435 | ||
|
|
d2cccbfce6 | ||
|
|
970e6c400c | ||
|
|
b4cb7345a1 | ||
|
|
7e75d8c1a3 | ||
|
|
a4ea551160 | ||
|
|
f56ad447a0 | ||
|
|
7656422057 | ||
|
|
afa2231add | ||
|
|
21fe0a2006 | ||
|
|
23acd3cec6 | ||
|
|
7892f88a42 | ||
|
|
aae0e3bec7 | ||
|
|
0f8bf39421 | ||
|
|
36fd96cc6c | ||
|
|
3de08e9f3b | ||
|
|
3e739724b3 | ||
|
|
847e538c69 | ||
|
|
64684dd486 | ||
|
|
a229747249 | ||
|
|
d1b59c3543 | ||
|
|
b241441e37 | ||
|
|
40bfa25b1b | ||
|
|
c5a4386c1d | ||
|
|
b3aa3be4b8 | ||
|
|
528aefcc1e | ||
|
|
620ee2b7e4 | ||
|
|
d55acc246a | ||
|
|
2a59db3029 | ||
|
|
990dec0fec | ||
|
|
162b17b249 | ||
|
|
e0aea30618 | ||
|
|
49cba94178 | ||
|
|
7dd87815f3 | ||
|
|
f6fdde816f | ||
|
|
4c8c6ff236 | ||
|
|
46b615a963 | ||
|
|
8e293dd633 | ||
|
|
e040753b27 | ||
|
|
463aaf094d | ||
|
|
bf867b028d | ||
|
|
6dfefc2fe4 | ||
|
|
9ba8a8454c | ||
|
|
9c72839bfa | ||
|
|
2e24c92799 | ||
|
|
fa98c8aeeb | ||
|
|
f92e3496b1 | ||
|
|
0ceea76aa4 | ||
|
|
897d11a1e1 | ||
|
|
8ed59fcdd3 | ||
|
|
7f211cc7fc | ||
|
|
c511147c7c | ||
|
|
2f7f965188 | ||
|
|
24da26e7cf | ||
|
|
f8f9d656e8 | ||
|
|
b357f3055d | ||
|
|
f9c1f519f4 | ||
|
|
057f9f7045 | ||
|
|
58ec38437d | ||
|
|
2964bf50e0 | ||
|
|
c9572c352a | ||
|
|
b69f176143 | ||
|
|
484dcd5dc1 | ||
|
|
a3412113b7 | ||
|
|
693043bc27 | ||
|
|
82a5bafb42 | ||
|
|
1c8c4c6f72 | ||
|
|
28a2e354d3 | ||
|
|
c89e478fc1 | ||
|
|
7e29a24ea6 | ||
|
|
5fc9b7d36d | ||
|
|
a211c648ed | ||
|
|
c24d8de960 | ||
|
|
34f6e52335 | ||
|
|
77348ea71e | ||
|
|
a1273d1c9e | ||
|
|
4e6e51af9c | ||
|
|
a6366eaff6 | ||
|
|
1403cf47b2 | ||
|
|
6a5a964b55 | ||
|
|
1c40d693c1 | ||
|
|
9cff4ca2c3 | ||
|
|
d1f675bd46 | ||
|
|
cce292f639 | ||
|
|
adbf2d9c31 | ||
|
|
06e94a1f6f | ||
|
|
92e396830a | ||
|
|
f4df1dfe41 | ||
|
|
be3bc4273d | ||
|
|
b12ed4127e | ||
|
|
b6311d5897 | ||
|
|
cb40985b0e | ||
|
|
7ace8b7103 | ||
|
|
aea17f0c6f | ||
|
|
5d56eeb871 | ||
|
|
f3cb60f707 | ||
|
|
1e57be0710 | ||
|
|
ee8e4bfb20 | ||
|
|
7355182586 | ||
|
|
e0683d51fa | ||
|
|
1f1d5ca8bf | ||
|
|
4dfd11ad8e | ||
|
|
d46e106dba | ||
|
|
cd7eabb6b6 | ||
|
|
bfedde6a4d | ||
|
|
ece00674b6 | ||
|
|
aa51f9005a | ||
|
|
836d0dd6ec | ||
|
|
1947813f04 | ||
|
|
9a1eeb6fca | ||
|
|
ca8f347e3a | ||
|
|
51146f5baf | ||
|
|
f2bd36b4f9 | ||
|
|
818018ce42 | ||
|
|
89114179da | ||
|
|
d50c72f2c3 | ||
|
|
ce241e7690 | ||
|
|
b72cbfb708 | ||
|
|
ef7b60225d | ||
|
|
b3718d9378 | ||
|
|
c8c56bcdb1 | ||
|
|
a84b9273b2 | ||
|
|
3d67ad16ff | ||
|
|
dd5d4491e2 | ||
|
|
7dd1199ce0 | ||
|
|
ee7b64ff3a | ||
|
|
6efe7d04bc | ||
|
|
b7f8f7c366 | ||
|
|
9adbb10fca | ||
|
|
6646b97a65 | ||
|
|
939c3a11d7 | ||
|
|
363c3ea39f | ||
|
|
935fca6986 | ||
|
|
7e20c585a1 | ||
|
|
7ecdfbb043 | ||
|
|
2a39f61f34 | ||
|
|
6e0182af02 | ||
|
|
1fd630460c | ||
|
|
4583880377 | ||
|
|
abacaf8d40 | ||
|
|
de8829ccfe | ||
|
|
ba18a3a0cb | ||
|
|
0a0f13994f | ||
|
|
eff29463e7 | ||
|
|
9c62b74122 | ||
|
|
5f19e63409 | ||
|
|
1fd4c3a278 | ||
|
|
281b385188 | ||
|
|
4e4b672af9 | ||
|
|
b70ac1ca1c | ||
|
|
36fc64d0ed | ||
|
|
2dee810e74 | ||
|
|
4fa468299f | ||
|
|
90eac2cf54 | ||
|
|
63ad08074c | ||
|
|
31fcc56dbd | ||
|
|
958b067303 | ||
|
|
6af183c7f1 | ||
|
|
92d9f2d809 | ||
|
|
4d7aaff8d0 | ||
|
|
68b19c8122 | ||
|
|
5b600fea44 | ||
|
|
2c867295e6 | ||
|
|
996c0ffffc | ||
|
|
2344357113 | ||
|
|
e919c591fe | ||
|
|
88516137de | ||
|
|
f515138074 | ||
|
|
6d04016054 | ||
|
|
eb968d813c | ||
|
|
37881e0830 | ||
|
|
e3dd13ba9e | ||
|
|
9054b7f2f5 | ||
|
|
17cd17ac96 | ||
|
|
d7c2d071c1 | ||
|
|
483a117a6a | ||
|
|
3c630343d0 | ||
|
|
fe61b31197 | ||
|
|
af14d0af4b | ||
|
|
e04e6bb188 | ||
|
|
e36f3d355e | ||
|
|
24891e3ce8 | ||
|
|
147c703cce | ||
|
|
3aa92c3f27 | ||
|
|
0d29e37dcb | ||
|
|
089b29c2ca | ||
|
|
af513c249c | ||
|
|
d567b5f2fc | ||
|
|
c336353020 | ||
|
|
523b9de1e0 | ||
|
|
6151f11657 | ||
|
|
c0d3847aab | ||
|
|
93d295ac5c | ||
|
|
8430de13c2 | ||
|
|
c78af57d76 | ||
|
|
172605d77d | ||
|
|
d7dc5a0c45 | ||
|
|
75edd0bab5 | ||
|
|
ac60b3660c | ||
|
|
372a674625 | ||
|
|
fafeadb7ba | ||
|
|
966b1e763f | ||
|
|
6e22c07ecc | ||
|
|
857e4ef874 | ||
|
|
aa03f69bdc | ||
|
|
8fc77139e0 | ||
|
|
bb60e1a5fe | ||
|
|
87802cb002 | ||
|
|
cac9f807cc | ||
|
|
a0b1254820 | ||
|
|
0faff4132b | ||
|
|
1793a1287d | ||
|
|
5b572239c1 | ||
|
|
f6a66d937e | ||
|
|
2cf9a2f489 | ||
|
|
454f4dcc61 | ||
|
|
6e1065fde2 | ||
|
|
80ce06b20c | ||
|
|
99f3ab8b64 | ||
|
|
ca4f6d2491 | ||
|
|
dcd57e148f | ||
|
|
18fa193a17 | ||
|
|
34dce350be | ||
|
|
c7caa7b905 | ||
|
|
2ceb2a78aa | ||
|
|
d97da21afc | ||
|
|
7b52b26ff0 | ||
|
|
3c958a4429 | ||
|
|
d8660b1db3 | ||
|
|
0996640798 | ||
|
|
079f4ba6bf | ||
|
|
bdf78efbfb | ||
|
|
07ba180ede | ||
|
|
94a2b017d4 | ||
|
|
37c06c89d0 | ||
|
|
42ffc2dafb | ||
|
|
cf65fabe27 | ||
|
|
03b5a0c0bf | ||
|
|
f76abe3372 | ||
|
|
cdd43b74ae | ||
|
|
fa633d0e02 | ||
|
|
9b46e60c09 | ||
|
|
58eef7f394 | ||
|
|
e97e0fbb64 | ||
|
|
b82876fd82 | ||
|
|
02ad32ec22 | ||
|
|
433fe35c93 | ||
|
|
90c59d6ae2 | ||
|
|
33672c3d78 | ||
|
|
59ae7a989a | ||
|
|
5767e9e8c2 | ||
|
|
e62b9e8ed9 | ||
|
|
59597ccd17 | ||
|
|
7be49c66ef | ||
|
|
1380e25ef3 | ||
|
|
e825ce746f | ||
|
|
dc9b9c240a | ||
|
|
84d8f73a2d | ||
|
|
b24cfb605b | ||
|
|
57f66fe62f | ||
|
|
d2cd4a3c5a | ||
|
|
4e58951808 | ||
|
|
fbd805aad7 | ||
|
|
2a2705c6e3 | ||
|
|
986c957183 | ||
|
|
c5d063e876 | ||
|
|
110e1445fa | ||
|
|
f9355cbc77 | ||
|
|
0a9bbd902f | ||
|
|
c8c960f785 | ||
|
|
fb0f4beca6 | ||
|
|
21398d7214 | ||
|
|
a5a56836a8 | ||
|
|
e7fd1e3c3f | ||
|
|
64b24bde56 | ||
|
|
613958d6a5 | ||
|
|
21e4ebc7a9 | ||
|
|
16ef6229e4 | ||
|
|
9ecb011732 | ||
|
|
de48e28fa1 | ||
|
|
3aecb0905a | ||
|
|
c1b2da1d57 | ||
|
|
c4bee64abd | ||
|
|
dbf9c5c46b | ||
|
|
630ec06d48 | ||
|
|
d38e464bfe | ||
|
|
49bd2439a7 | ||
|
|
e97314a3c7 | ||
|
|
acb46cef14 | ||
|
|
06b9ff233e | ||
|
|
a189e72fbe | ||
|
|
75e6b15199 | ||
|
|
85170d7231 | ||
|
|
500c36f5d4 | ||
|
|
eeffb55021 | ||
|
|
69dbbeac44 | ||
|
|
1fe8317f1e | ||
|
|
69486c3adb | ||
|
|
6398ef194c | ||
|
|
e6692bb79b | ||
|
|
94fba1d7af | ||
|
|
223d8f4774 | ||
|
|
42e7a7e4e3 | ||
|
|
6716fdd49b | ||
|
|
3b69092fd8 | ||
|
|
aa8eaedbc8 | ||
|
|
f519ed373f | ||
|
|
851dff4b03 | ||
|
|
e4d691eda1 | ||
|
|
d9bb6c8a54 | ||
|
|
c3020e3071 | ||
|
|
e3f31e3e52 | ||
|
|
8c40e1be0f | ||
|
|
b278c7148b | ||
|
|
2791338e04 | ||
|
|
0af87dc2be | ||
|
|
32134dd1f5 | ||
|
|
bdd4441d5c | ||
|
|
99bc1ae7b6 | ||
|
|
c5ebaa11ea | ||
|
|
934fbc8992 | ||
|
|
72cb5515fd | ||
|
|
c7f0770d53 | ||
|
|
7ea49e8ada | ||
|
|
cae6ce96b3 | ||
|
|
3699dfd756 | ||
|
|
6dca96d877 | ||
|
|
88c14b27a2 | ||
|
|
0d2a9539f6 | ||
|
|
bae160bd7c | ||
|
|
92852ecff2 | ||
|
|
ac0c841cb8 | ||
|
|
53e4b71f89 | ||
|
|
017a2692ca | ||
|
|
311f89eecb | ||
|
|
40d2bc4743 | ||
|
|
37160cbc8b | ||
|
|
3807a2b018 | ||
|
|
b6697dd432 | ||
|
|
6c33496e8a | ||
|
|
89f32625ed | ||
|
|
8253e76ec0 | ||
|
|
e0b3e9606a | ||
|
|
dc75a303f7 | ||
|
|
c1eb8ec78c | ||
|
|
12435f25fd | ||
|
|
d4dc5222cf | ||
|
|
bf1e59b2d3 | ||
|
|
3657e4a36e | ||
|
|
09efc1d865 | ||
|
|
32aa94bf3d | ||
|
|
3201227430 | ||
|
|
09a421c23b | ||
|
|
73ce59b492 | ||
|
|
7911d5857d | ||
|
|
05a44a0c70 | ||
|
|
efd8863f8b | ||
|
|
6699028342 | ||
|
|
aa9a234a0b | ||
|
|
91f836818c | ||
|
|
5e37bdc54c | ||
|
|
31c48df795 | ||
|
|
0383b9112b | ||
|
|
f4fe8be4df | ||
|
|
cc643e373d | ||
|
|
651429cb52 | ||
|
|
a374a5ce96 | ||
|
|
bbb4501e9b | ||
|
|
947f9093be | ||
|
|
42f16b6d1e | ||
|
|
9ae747a612 | ||
|
|
9217c5e436 | ||
|
|
d23e7b1054 | ||
|
|
d23eab61cf | ||
|
|
e631de4cfe | ||
|
|
0814bef36f | ||
|
|
ddce65416c | ||
|
|
9e66f9bb08 | ||
|
|
961fbfde55 | ||
|
|
22550c0c48 | ||
|
|
4336f48d22 | ||
|
|
cf299562e3 | ||
|
|
2cd5b35603 | ||
|
|
81abab81f7 | ||
|
|
ad0d7bd560 | ||
|
|
140d10e87b | ||
|
|
6bebc49607 | ||
|
|
22bded50b6 | ||
|
|
b5b02be3c2 | ||
|
|
776f372eb3 | ||
|
|
81279fd40b | ||
|
|
3342485d29 | ||
|
|
028ee848f5 | ||
|
|
7e64c3b8a9 | ||
|
|
704031f7b2 | ||
|
|
5e3c184735 | ||
|
|
88a8022787 | ||
|
|
96844dc4a5 | ||
|
|
a09acd6969 | ||
|
|
4e232f78de | ||
|
|
b146a04772 | ||
|
|
eaaa50e616 | ||
|
|
c893eaeb7a | ||
|
|
5bf7d7fd07 | ||
|
|
ca8fc92b94 | ||
|
|
9956e85f12 | ||
|
|
7fa4739c78 | ||
|
|
0ef2e2a7ec | ||
|
|
8fd1752acf | ||
|
|
14a1446faf | ||
|
|
0c2c8c5ae5 | ||
|
|
a3aa855290 | ||
|
|
511b27ad39 | ||
|
|
e22ce7da0a | ||
|
|
d9a4ce06bc | ||
|
|
77fb14cc60 | ||
|
|
17c397211e | ||
|
|
6ca83644bc | ||
|
|
d1946ea9b6 | ||
|
|
cc9eae3b71 | ||
|
|
7bbc17df4b | ||
|
|
df6b2be482 | ||
|
|
5ff6263fb7 | ||
|
|
04dc8aaf73 | ||
|
|
5435805e58 | ||
|
|
903f819c5d | ||
|
|
5d927b2d25 | ||
|
|
b7a260cc6d | ||
|
|
e8ba8fb97b | ||
|
|
dd1d9d856b | ||
|
|
a853cb84cd | ||
|
|
eef4c65e5f | ||
|
|
3f64594a22 | ||
|
|
a07082ca5c | ||
|
|
81c27771bc | ||
|
|
502f78e835 | ||
|
|
d8935cf121 | ||
|
|
e3c61ac5b7 | ||
|
|
e8e95b8df6 | ||
|
|
f55be4f2de | ||
|
|
ef081cc4b8 | ||
|
|
8e2444d3cd | ||
|
|
f26407e282 | ||
|
|
cded895bf7 | ||
|
|
1211ee4fb3 | ||
|
|
a42bdefe1a | ||
|
|
f025f1007b | ||
|
|
1c11a57371 | ||
|
|
db2d033484 | ||
|
|
40537c9eba | ||
|
|
5cabcb7a27 | ||
|
|
1be9ac59f0 | ||
|
|
64356baed3 | ||
|
|
c944706a0f | ||
|
|
f15deaa51e | ||
|
|
61c3b94460 | ||
|
|
89b018240f | ||
|
|
0124dc9969 | ||
|
|
936441c8a6 | ||
|
|
c80570e096 | ||
|
|
11c67e1c4c | ||
|
|
0d1c0e0f30 | ||
|
|
f50572813e | ||
|
|
648b3a4ae2 | ||
|
|
3f5f71f8ab | ||
|
|
2a44179898 | ||
|
|
efe114fa86 | ||
|
|
4445d5e00f | ||
|
|
96b3c1ee7f | ||
|
|
e1a770ac29 | ||
|
|
db1a2e6482 | ||
|
|
ecdde7c367 | ||
|
|
4d31291ea4 | ||
|
|
b70bd670fd | ||
|
|
d3017649e0 | ||
|
|
e970584219 | ||
|
|
4a6ddf8b1d | ||
|
|
c6205293a9 | ||
|
|
cb47f7bf4b | ||
|
|
a60f107e4b | ||
|
|
eeb1b2442c | ||
|
|
129f234aaa | ||
|
|
331c352e2b | ||
|
|
2ccbaea9dd | ||
|
|
069eca3c62 | ||
|
|
305e364f8b | ||
|
|
4068805ae0 | ||
|
|
9a1e7a4a7a | ||
|
|
bbad3d1b96 | ||
|
|
c62116d9a4 | ||
|
|
c94086ff21 | ||
|
|
e99caa7b97 | ||
|
|
658b9e9007 | ||
|
|
3ef27ae45c | ||
|
|
e669cd1152 | ||
|
|
b22aa7c0cf | ||
|
|
582cbb61fb | ||
|
|
7f4197cf43 | ||
|
|
30889db487 | ||
|
|
2d08d5d23e | ||
|
|
59e7367e03 | ||
|
|
84af278e86 | ||
|
|
67d9ee39e2 | ||
|
|
6c67bb81f7 | ||
|
|
aba19701c0 | ||
|
|
bb79402999 | ||
|
|
420bc4b244 | ||
|
|
323c3d74cb | ||
|
|
4ecec8a8f6 | ||
|
|
98883f9978 | ||
|
|
37cf3be437 | ||
|
|
6e43c322cc | ||
|
|
4b6387bdb5 | ||
|
|
bcd770c0fe | ||
|
|
bb8c7e9f3b | ||
|
|
6e469272c3 | ||
|
|
5e7fa71148 | ||
|
|
12d9a4b4f4 | ||
|
|
084ab2d0e5 | ||
|
|
4ca0d936aa | ||
|
|
5d5a55e7e1 | ||
|
|
e033e5e0ca | ||
|
|
7cb36ef1dd | ||
|
|
9aafb168e9 | ||
|
|
fbb5caf955 | ||
|
|
3f93da550b | ||
|
|
a194e0cc6e | ||
|
|
62e3949c65 | ||
|
|
b007200bcf | ||
|
|
c191861639 | ||
|
|
c820509c29 | ||
|
|
199f98153f | ||
|
|
05d88da887 | ||
|
|
a64b96f87b | ||
|
|
f179864986 | ||
|
|
73af1b3d91 | ||
|
|
56afa1b464 | ||
|
|
0e0f453e4e | ||
|
|
78d25d97fb | ||
|
|
d6ce0e4c23 | ||
|
|
434de228cc | ||
|
|
d75b0c9578 | ||
|
|
16e24e8464 | ||
|
|
8365d7c4de | ||
|
|
a958492256 | ||
|
|
6285ac589d | ||
|
|
2ac87b0144 | ||
|
|
21fd1761ae | ||
|
|
3664a2da8b | ||
|
|
8a6f3c61bb | ||
|
|
f5f7dd9e8a | ||
|
|
0a429bb2f3 | ||
|
|
468ccb7598 | ||
|
|
e47f6f55dc | ||
|
|
17deed91b2 | ||
|
|
cc0bd9f0a2 | ||
|
|
f6f99fef25 | ||
|
|
eb252edc7f | ||
|
|
f3213dbcdc | ||
|
|
c637da7710 | ||
|
|
ab05595582 | ||
|
|
ba8e714329 | ||
|
|
ef86bb0bd9 | ||
|
|
be18b54bfd | ||
|
|
ed168db23c | ||
|
|
236f5f4159 | ||
|
|
e44a91634e | ||
|
|
8b9426eb6c | ||
|
|
c62c57f122 | ||
|
|
c81db0c8d2 | ||
|
|
1c64990e9f | ||
|
|
f1dc7fd14a | ||
|
|
6079d4be25 | ||
|
|
2c4b8335ce | ||
|
|
9bd2f22d5c | ||
|
|
7c421f92e1 | ||
|
|
0626db51bd | ||
|
|
dc29a8b816 | ||
|
|
e00e5e18ea | ||
|
|
d0999e7937 | ||
|
|
158cfad978 | ||
|
|
9145b43a62 | ||
|
|
479d271356 | ||
|
|
8119f4cad2 | ||
|
|
e73b32e9cc | ||
|
|
45bd08e4e5 | ||
|
|
4528243b5c | ||
|
|
bd741cfbeb | ||
|
|
b3b10f0fd7 | ||
|
|
084c014fff | ||
|
|
63614e5303 | ||
|
|
099d2c8195 | ||
|
|
ae813423d8 | ||
|
|
2a5f3f779e | ||
|
|
89e1d83ad4 | ||
|
|
ce23f9e204 | ||
|
|
743eb21682 | ||
|
|
b9f5de2b7a | ||
|
|
229a62d8b6 | ||
|
|
b0ad5238f7 | ||
|
|
774e0a0ebb | ||
|
|
ec7a258b37 | ||
|
|
52a6e60f78 | ||
|
|
a7cb747130 | ||
|
|
5fbe136485 | ||
|
|
918d60576f | ||
|
|
e6c56a69ce | ||
|
|
62111977fd | ||
|
|
d93c76d5e6 | ||
|
|
e0814d6ed5 | ||
|
|
5e6a241baa | ||
|
|
8cbebc936e | ||
|
|
90f7f8620c | ||
|
|
59bbe7e0c9 | ||
|
|
151b66a3f9 | ||
|
|
d9f3367a77 | ||
|
|
f3f6880632 | ||
|
|
59335cdd81 | ||
|
|
a93c09a794 | ||
|
|
b60768a8b3 | ||
|
|
da96ead170 | ||
|
|
45f7dc126c | ||
|
|
7d41511564 | ||
|
|
a4e184007d | ||
|
|
2055eb32b8 | ||
|
|
3ae3cbf34b | ||
|
|
56d4a75d39 | ||
|
|
c86a9217c4 | ||
|
|
dc7c6166e3 | ||
|
|
25facf4934 | ||
|
|
7f0ce26472 | ||
|
|
031067869a | ||
|
|
2e30bbef7e | ||
|
|
13d04a069e | ||
|
|
26b3d36101 | ||
|
|
3db861fcc4 | ||
|
|
00c05b95e4 | ||
|
|
9ee83b858c | ||
|
|
e4a181321a | ||
|
|
dd6f6aa418 | ||
|
|
b37bfbc1ed | ||
|
|
dd06c4c63d | ||
|
|
a6174cde03 | ||
|
|
c85ab97321 | ||
|
|
957fe9084a | ||
|
|
70f72e5bb8 | ||
|
|
4feb961091 | ||
|
|
6ddc252978 | ||
|
|
5eca7cf5f7 | ||
|
|
76486246c5 | ||
|
|
740a7c8886 | ||
|
|
40b69b4924 | ||
|
|
c5ef4b1dc5 | ||
|
|
ef793bf7e9 | ||
|
|
2be1dd4fcb | ||
|
|
a734eb79d9 | ||
|
|
24dc2a36de | ||
|
|
12881c1b57 | ||
|
|
c66188a6f2 | ||
|
|
61457b532a | ||
|
|
d2ff3749ca | ||
|
|
38bc7cc6d6 | ||
|
|
413fdd7c39 | ||
|
|
f48bb493b0 | ||
|
|
962c5db9fe | ||
|
|
9e961b479c | ||
|
|
718100fafc | ||
|
|
2b38f545d0 | ||
|
|
55b1327119 | ||
|
|
a75ec505ad | ||
|
|
df580d4873 | ||
|
|
78567ff89b | ||
|
|
36b1e129b4 | ||
|
|
331b6e0a23 | ||
|
|
605a9f68e7 | ||
|
|
fc72ecb223 | ||
|
|
ca51cbcc6b | ||
|
|
4e4bc98194 | ||
|
|
3efa988f5e | ||
|
|
d3366403fe | ||
|
|
5860645cdb | ||
|
|
3ff2004929 | ||
|
|
9a38260a2b | ||
|
|
96fca45a41 | ||
|
|
cb106185cb | ||
|
|
cd6d98b314 | ||
|
|
0aa8fa09cb | ||
|
|
d71f74fa54 | ||
|
|
47ce713a86 | ||
|
|
3c5b94855a | ||
|
|
6ce8acc4db | ||
|
|
a9edec1619 | ||
|
|
8638d17d87 | ||
|
|
db6ae2998b | ||
|
|
d667a83af5 | ||
|
|
f2a1fb50da | ||
|
|
eb356a5d3d | ||
|
|
efe0ca57f0 | ||
|
|
409b7099be | ||
|
|
e6653992a7 | ||
|
|
c133e81f6e | ||
|
|
28bfcb4c58 | ||
|
|
5cf8f8a70a | ||
|
|
b31ab033c2 | ||
|
|
24a3b99ee3 | ||
|
|
0fb6c77dec | ||
|
|
8da0534d4f | ||
|
|
79e0792a57 | ||
|
|
3e5ddad5ca | ||
|
|
92cff5c947 | ||
|
|
4f8cf6793b | ||
|
|
2877563064 | ||
|
|
dea74233c6 | ||
|
|
4fbd75f384 | ||
|
|
21bd8297e0 | ||
|
|
188150da26 | ||
|
|
83d50374ff | ||
|
|
2b3d4cd449 | ||
|
|
0ef680484d | ||
|
|
54ee476f91 | ||
|
|
4d81ee8c87 | ||
|
|
33cd5d6c1d | ||
|
|
24525ec768 | ||
|
|
482ca7a8a6 | ||
|
|
e8c81fbd81 | ||
|
|
6322be2bf7 | ||
|
|
88a0fb2009 | ||
|
|
ba007f89ff | ||
|
|
00129ea452 | ||
|
|
924b0ff427 | ||
|
|
70571d10c1 | ||
|
|
aee22a3d38 | ||
|
|
81162c0ccf | ||
|
|
69e7c57975 | ||
|
|
4e796ca952 | ||
|
|
518d0313f7 | ||
|
|
6ea080d48b | ||
|
|
748e34757e | ||
|
|
c93c458cd4 | ||
|
|
3c10787621 | ||
|
|
f60a9f0c58 | ||
|
|
544d26dea9 | ||
|
|
9244e43ccf | ||
|
|
d44b147684 | ||
|
|
bb5fbc28a0 | ||
|
|
3a501a0c08 | ||
|
|
1fe5dbd7cd | ||
|
|
7a97a40039 | ||
|
|
cda6a2cbb6 | ||
|
|
50a87c4965 | ||
|
|
9a6ad1ae43 | ||
|
|
687ef375c8 | ||
|
|
538525e639 | ||
|
|
aff5a0cbed | ||
|
|
b1b1529bd6 | ||
|
|
bb934f0146 | ||
|
|
7d2c5dc39a | ||
|
|
9894869427 | ||
|
|
8e0c1da441 | ||
|
|
6a165e8377 | ||
|
|
eeed5a8273 | ||
|
|
75d98c649a | ||
|
|
d54cc4df51 | ||
|
|
f211f1fa70 | ||
|
|
f60a373479 | ||
|
|
80a82ba276 | ||
|
|
8a3d0fb370 | ||
|
|
20c2930a90 | ||
|
|
bccf602496 | ||
|
|
ed92ef8952 | ||
|
|
1b9c14bd30 | ||
|
|
c287cbeb22 | ||
|
|
d29b1b9cfa | ||
|
|
49293ae44b | ||
|
|
39103f5ae6 | ||
|
|
af2c894fb9 | ||
|
|
42f9745420 | ||
|
|
f016f05c11 | ||
|
|
257f5f293e | ||
|
|
35c3d87055 | ||
|
|
a78813bd74 | ||
|
|
05c2f69523 | ||
|
|
e389a836e1 | ||
|
|
64c526fe1d | ||
|
|
e132d74aa8 | ||
|
|
975c8dc5fc | ||
|
|
3d2929b345 | ||
|
|
c91e529782 | ||
|
|
495ba3bf98 | ||
|
|
c799886f53 | ||
|
|
f6552c48d6 | ||
|
|
577cd76ae6 | ||
|
|
bcbaad4371 | ||
|
|
91c80ca0a9 | ||
|
|
e7e0ab7d0d | ||
|
|
0b6b74938f | ||
|
|
bed4efeef0 | ||
|
|
53f0adb88a | ||
|
|
61c82890c1 | ||
|
|
176a750ece | ||
|
|
88cdcdf979 | ||
|
|
bf12602aca | ||
|
|
bafb14526d | ||
|
|
778b77e829 | ||
|
|
91a1a4828a | ||
|
|
5a187b97ab | ||
|
|
d78cd371ed | ||
|
|
a720d5b181 | ||
|
|
dd50eae762 | ||
|
|
4ceb4c8984 | ||
|
|
f9c262f4bb | ||
|
|
57d9c6e39b | ||
|
|
e45e403bb3 | ||
|
|
2fe38b1527 | ||
|
|
f6a38717f2 | ||
|
|
31c0ac8a54 | ||
|
|
256ca8796f | ||
|
|
17c659124b | ||
|
|
bcac213114 | ||
|
|
7f4b2bdc87 | ||
|
|
94a958f460 | ||
|
|
7a02249f37 | ||
|
|
94681f28c6 | ||
|
|
9fd1cee6f0 | ||
|
|
2054bb06f1 | ||
|
|
c0b5a01cae | ||
|
|
0bbe5f7806 | ||
|
|
9e25d8e11c | ||
|
|
8623c5201c | ||
|
|
862728f889 | ||
|
|
ad4e20c7e6 | ||
|
|
62d782255a | ||
|
|
3f18d24915 | ||
|
|
23318d9fc9 | ||
|
|
c413cc7349 | ||
|
|
f268a1b390 | ||
|
|
19dd33b037 | ||
|
|
a29890c8ee | ||
|
|
6e3a495914 | ||
|
|
e1005deeb3 | ||
|
|
c61502e24c | ||
|
|
7674a4af4a | ||
|
|
0245a04db9 | ||
|
|
340537bc0b | ||
|
|
c9383b2535 | ||
|
|
3774792740 | ||
|
|
a9b3ee96cd | ||
|
|
b6946e2f15 | ||
|
|
a4ad8c64e6 | ||
|
|
eae9f9ed42 | ||
|
|
dfa134e8e4 | ||
|
|
bb7b99bcf9 | ||
|
|
074e96e117 | ||
|
|
0b82c74c58 | ||
|
|
29d18dccb2 | ||
|
|
89057232eb | ||
|
|
8a2d3d0c2c | ||
|
|
a01c210bf0 | ||
|
|
53515e6142 | ||
|
|
2aeab737d9 | ||
|
|
5cc4af257e | ||
|
|
1979e2074f | ||
|
|
e788743f58 | ||
|
|
dae525e56a | ||
|
|
0e32313395 | ||
|
|
2ea1b00fda | ||
|
|
398b371ded | ||
|
|
64caeeb115 | ||
|
|
e5e33549f8 | ||
|
|
da89cecaab | ||
|
|
e821d28ccd | ||
|
|
d812b18d52 | ||
|
|
d7ef4b533f | ||
|
|
a5e857df7b | ||
|
|
3cd2de7728 | ||
|
|
8e32c66840 | ||
|
|
7716bb5439 | ||
|
|
42a8dc14b0 | ||
|
|
c3001fe708 | ||
|
|
8309ec6327 | ||
|
|
921a54ed22 | ||
|
|
c82350dca6 | ||
|
|
7e3a5a7e2c | ||
|
|
ada83ccb63 | ||
|
|
a4220a0e7d | ||
|
|
92be615c3c | ||
|
|
847dace212 | ||
|
|
5a43516354 | ||
|
|
868d4522db | ||
|
|
4d0c638688 | ||
|
|
0080c456d8 | ||
|
|
cd36a835eb | ||
|
|
01b9913204 | ||
|
|
d58a189265 | ||
|
|
97ff4515ae | ||
|
|
ad6c04b78d | ||
|
|
68c1f7163f | ||
|
|
b94e8a1563 | ||
|
|
60a5659dff | ||
|
|
06b8ccb672 | ||
|
|
ca06186cfe | ||
|
|
b5349fe6a5 | ||
|
|
7ac3c75ee8 | ||
|
|
00437fe3f8 | ||
|
|
930648da13 | ||
|
|
4945218ea6 | ||
|
|
12c3987e94 | ||
|
|
18cedcb7e6 | ||
|
|
925af8066d | ||
|
|
5f46eb9dd7 | ||
|
|
24245bd4bb | ||
|
|
005dd24b18 | ||
|
|
116ee34a10 | ||
|
|
81cf441f66 | ||
|
|
c5a588744a | ||
|
|
48c126a911 | ||
|
|
18c295a88e | ||
|
|
893871e043 | ||
|
|
9f9ce09acc | ||
|
|
f2b1c89a53 | ||
|
|
8e1ca16d38 | ||
|
|
9291efcfc3 | ||
|
|
271d7ffc29 | ||
|
|
6d4a552c96 | ||
|
|
350d63eacd | ||
|
|
a7d4ce8c3f | ||
|
|
a4fdc8561c | ||
|
|
08fff2a145 | ||
|
|
6b4b73ee94 | ||
|
|
98d511b03c | ||
|
|
ad5aa576f3 | ||
|
|
855940c6fc | ||
|
|
ac794e704d | ||
|
|
09e663d86e | ||
|
|
20ee6752ad | ||
|
|
586e76f930 | ||
|
|
27730b4568 | ||
|
|
00c792297a | ||
|
|
ee80ea59f4 | ||
|
|
d355e9e202 | ||
|
|
8289c159c5 | ||
|
|
d11f8e4ebf | ||
|
|
43bf805392 | ||
|
|
e57cf657fe | ||
|
|
020f9d8da5 | ||
|
|
fd99217303 | ||
|
|
a40f0b6d65 | ||
|
|
69f81e0ab9 | ||
|
|
37a3fb0497 | ||
|
|
77d07f838f | ||
|
|
1f81d80505 | ||
|
|
7e950496ae | ||
|
|
ec43780e1b | ||
|
|
66fe14d8e2 | ||
|
|
a29abc7d45 | ||
|
|
5d329e0bc3 | ||
|
|
2de9edeed4 | ||
|
|
954d433f6f | ||
|
|
b18196b394 | ||
|
|
926c14e0ef | ||
|
|
c2c986e780 | ||
|
|
26e87093e1 | ||
|
|
ba0323e434 | ||
|
|
55229e1ed7 | ||
|
|
064213ce52 | ||
|
|
f0802c681c | ||
|
|
a6d2ab7d77 | ||
|
|
c5ced92978 | ||
|
|
7efe32f9c8 | ||
|
|
60f163d540 | ||
|
|
f507f28f30 | ||
|
|
54ae7001ec | ||
|
|
d044cfe142 | ||
|
|
3a1c68b439 | ||
|
|
e0489dc171 | ||
|
|
9919701e2d | ||
|
|
9ed9ba472e | ||
|
|
8513ff260b | ||
|
|
900c2a11f7 | ||
|
|
00ffd8d46c | ||
|
|
1a9958c71e | ||
|
|
6688935436 | ||
|
|
0541ac8284 | ||
|
|
cf4eebbc95 | ||
|
|
3383798bf1 | ||
|
|
aba51841a2 | ||
|
|
1712405cd3 | ||
|
|
cfc326b1ce | ||
|
|
dab4c6bf66 | ||
|
|
e21ece1626 | ||
|
|
f80f1f79a6 | ||
|
|
2414767026 | ||
|
|
887b2ccc6b | ||
|
|
27186a377e | ||
|
|
f5fca3a0fb | ||
|
|
4b75f20f9b | ||
|
|
64fe29bfea | ||
|
|
eea09ca6cc | ||
|
|
f7919230fc | ||
|
|
5e092cde57 | ||
|
|
96bb51f266 | ||
|
|
164d29ccbe | ||
|
|
4eb46d0436 | ||
|
|
e0c6bb4094 | ||
|
|
3926055a5e | ||
|
|
8c00134ad1 | ||
|
|
6a104004e0 | ||
|
|
52df58b7dc | ||
|
|
983d58c5a6 | ||
|
|
ec46e616db | ||
|
|
3758e57cb8 | ||
|
|
1eaa8f76ea | ||
|
|
8e64d0b5ef | ||
|
|
baceee2ecf | ||
|
|
a23b7dd2bc | ||
|
|
ad8b141c1c | ||
|
|
9b23d61720 | ||
|
|
d993650a84 | ||
|
|
f0dbb33fd1 | ||
|
|
0225163353 | ||
|
|
9dbe89f5aa | ||
|
|
f89effaa66 | ||
|
|
b7e37af8f1 | ||
|
|
1436e636d3 | ||
|
|
b22b3787ff | ||
|
|
e700ad78ee | ||
|
|
85ccf59a08 | ||
|
|
094277cb2e | ||
|
|
e5c7e2d8f0 | ||
|
|
3ee7babf4a | ||
|
|
d2c33bbb06 | ||
|
|
c5c22620a6 | ||
|
|
fb7b890e40 | ||
|
|
4e8512e660 | ||
|
|
29de58b5a7 | ||
|
|
7a36b9c6a3 | ||
|
|
85ba820b27 | ||
|
|
54ff8ca196 | ||
|
|
e630eaebcd | ||
|
|
493e972720 | ||
|
|
e008b6e1cb | ||
|
|
9f40a7cca6 | ||
|
|
9be5970378 | ||
|
|
2214516689 | ||
|
|
c739d564a9 | ||
|
|
dd6dbbfc9b | ||
|
|
498615b6b3 | ||
|
|
491da80c90 | ||
|
|
7ceeaf9a6a | ||
|
|
d6e09b098e | ||
|
|
9056ba54c3 | ||
|
|
964d5b3238 | ||
|
|
8c035be63f | ||
|
|
b7f6d4a859 | ||
|
|
03404e9858 | ||
|
|
236edcc535 | ||
|
|
822b12cc96 | ||
|
|
79d8157798 | ||
|
|
12795f7298 | ||
|
|
86f6df6607 | ||
|
|
b837aca0f8 | ||
|
|
557ea38869 | ||
|
|
6a78563b32 | ||
|
|
ec6f71aed9 | ||
|
|
faccd7fb9e | ||
|
|
796bc0acee | ||
|
|
ae2638f7a9 | ||
|
|
51b7716cc7 | ||
|
|
6c264fe243 | ||
|
|
1380c9fb2c | ||
|
|
9827f1cb69 | ||
|
|
8fe220c330 | ||
|
|
9b5b360465 | ||
|
|
a8d4b7826f | ||
|
|
593bcb1025 | ||
|
|
ece9f46798 | ||
|
|
c368f98ded | ||
|
|
5f1e77cd67 | ||
|
|
a5b4f0bd87 | ||
|
|
aab2acf008 | ||
|
|
d740df9600 | ||
|
|
cb464939a0 | ||
|
|
0f2b35175c | ||
|
|
33fe99ea43 | ||
|
|
22344045b8 | ||
|
|
a81ed47ebc | ||
|
|
e245b2fd90 | ||
|
|
ba6ddc380d | ||
|
|
402ec684eb | ||
|
|
8b8af21445 | ||
|
|
1ead4f2e2c | ||
|
|
43047cfa24 | ||
|
|
33dc9a5767 | ||
|
|
8bf7ed52c4 | ||
|
|
a495b19793 | ||
|
|
42b24b4904 | ||
|
|
10347279ba | ||
|
|
a31c29fc13 | ||
|
|
9d110bd1c9 | ||
|
|
9d247a4fb6 | ||
|
|
33f6db1daf | ||
|
|
cf7e0e14f5 | ||
|
|
88a896684f | ||
|
|
55f5aa5b79 | ||
|
|
a4be2eb79d | ||
|
|
81c7705690 | ||
|
|
4dda34fe28 | ||
|
|
5a05f6896f | ||
|
|
e8f7158d52 | ||
|
|
fa10b78b30 | ||
|
|
b9be120b17 | ||
|
|
4020eb1254 | ||
|
|
15178f0332 | ||
|
|
04c11e266a | ||
|
|
7bd40f0aae | ||
|
|
ca17c6da36 | ||
|
|
16b99a6f72 | ||
|
|
de7c0aec39 | ||
|
|
6232078ad3 | ||
|
|
418d550f2a | ||
|
|
81b0e995e1 | ||
|
|
22fd52c8db | ||
|
|
6a20529b89 | ||
|
|
1988f820bf | ||
|
|
0bafb6286a | ||
|
|
80ebd659fc | ||
|
|
2d16c36f8d | ||
|
|
ca1930cb44 | ||
|
|
91b4e7a308 | ||
|
|
4fac67f39e | ||
|
|
88a4f52ccd | ||
|
|
e975ddca8b | ||
|
|
225afafe43 | ||
|
|
1bafb4686f | ||
|
|
2777ec3e2c | ||
|
|
6f817971d0 | ||
|
|
9358b01cac | ||
|
|
a8f8da9906 | ||
|
|
b2d8550777 | ||
|
|
51b6031eab | ||
|
|
370961e872 | ||
|
|
43e2970620 | ||
|
|
385c4e4a2f | ||
|
|
39591b4776 | ||
|
|
2f0218aaa5 | ||
|
|
9ed897c6be | ||
|
|
b53d907b74 | ||
|
|
7c4ab3989a | ||
|
|
2c6faa5eab | ||
|
|
2707149352 | ||
|
|
2834c188e7 | ||
|
|
7aa2a27fc9 | ||
|
|
742be77cfb | ||
|
|
44946520ef | ||
|
|
35d45f7493 | ||
|
|
a6fa395822 | ||
|
|
48ff96d9e7 | ||
|
|
0f31bc1f68 | ||
|
|
6f3ff2abf0 | ||
|
|
3398e6da27 | ||
|
|
22f7d69a7e | ||
|
|
cb76d02dcc | ||
|
|
49d5802e3d | ||
|
|
38164f980b | ||
|
|
1cff0342e8 | ||
|
|
b6117e4a63 | ||
|
|
48c6510135 | ||
|
|
4e505f40f7 | ||
|
|
a3fe672b2a | ||
|
|
e029e875d8 | ||
|
|
ef6e6c8d0d | ||
|
|
4a4e9764de | ||
|
|
53e0f89311 | ||
|
|
871a89bf50 | ||
|
|
4260b6c390 | ||
|
|
648fb6f949 | ||
|
|
709fd1bf12 | ||
|
|
cf51fdb026 | ||
|
|
1e8a825e94 | ||
|
|
2ab71798de | ||
|
|
683de6048e | ||
|
|
49e619ce11 | ||
|
|
fc5c8dd74f | ||
|
|
fb46cc7761 | ||
|
|
332867a9f5 | ||
|
|
dfea510e68 | ||
|
|
baff58eecc | ||
|
|
0db933b6a3 | ||
|
|
d47591ccda | ||
|
|
4552ad9b36 | ||
|
|
78a04905f1 | ||
|
|
3caa922e76 | ||
|
|
6e5915a664 | ||
|
|
a1631dfd9f | ||
|
|
db15047cc1 | ||
|
|
ba8c641c58 | ||
|
|
3d17f3b38b | ||
|
|
5ca3cae9e8 | ||
|
|
97d3413621 | ||
|
|
bddab3c5d1 | ||
|
|
24572b554b | ||
|
|
35109800d5 | ||
|
|
1c009266cc | ||
|
|
5ec45459e5 | ||
|
|
37964c1e0f | ||
|
|
ea8add7316 | ||
|
|
baed2da509 | ||
|
|
7be66960b7 | ||
|
|
ab6f72e44d | ||
|
|
14aaf3b375 | ||
|
|
ecaee451c8 | ||
|
|
a43d6f9792 | ||
|
|
251083bf38 | ||
|
|
6426b1e430 | ||
|
|
635b20d4ab | ||
|
|
78aea6ab13 | ||
|
|
3fa104a531 | ||
|
|
864c937de1 | ||
|
|
8114ede173 | ||
|
|
7294f8f2e1 | ||
|
|
f53feed8f5 | ||
|
|
18dc7cb3f4 | ||
|
|
5d8b27ebbe | ||
|
|
8a347d0a7a | ||
|
|
4e884fb59d | ||
|
|
1bf4af7269 | ||
|
|
e383c2c4d6 | ||
|
|
8fce8bb75d | ||
|
|
ee158a7862 | ||
|
|
c80a5b6f9d | ||
|
|
97763ce5e8 | ||
|
|
f5f0c9eccd | ||
|
|
2822c314eb | ||
|
|
2f170dbd45 | ||
|
|
b5ed4c48ed | ||
|
|
672cd5efbb | ||
|
|
37d410c6cf | ||
|
|
d270a07e2a | ||
|
|
1f66976beb | ||
|
|
ff601a4c70 | ||
|
|
73d23126f5 | ||
|
|
f38669576a | ||
|
|
c7ed5d7850 | ||
|
|
67a918401c | ||
|
|
08f0e02f42 | ||
|
|
0748cb7698 | ||
|
|
76c9a233b9 | ||
|
|
b3f584686b | ||
|
|
18f06fde2a | ||
|
|
c13545d585 | ||
|
|
112497d55e | ||
|
|
91069f6d38 | ||
|
|
2cf846ead3 | ||
|
|
310e1b4247 | ||
|
|
2f12b08616 | ||
|
|
744ef92faa | ||
|
|
aa8d77e571 | ||
|
|
6f8c9fe548 | ||
|
|
b6ded9a7fe | ||
|
|
468fa88139 | ||
|
|
1aa46713c2 | ||
|
|
9029a51707 | ||
|
|
6df363e2da | ||
|
|
36f5b265c8 | ||
|
|
929ea187ce | ||
|
|
822f203f5a | ||
|
|
54d02b6ab2 | ||
|
|
5a1b6e6569 | ||
|
|
f9919fe854 | ||
|
|
73de0f228a | ||
|
|
f8f5a554e1 | ||
|
|
b93e8edb83 | ||
|
|
4fe1a3831d | ||
|
|
9d73f7735e | ||
|
|
a0209f4667 | ||
|
|
60b36cb3f8 | ||
|
|
454ce02565 | ||
|
|
2be128639c | ||
|
|
8557c4baf0 | ||
|
|
037283ed07 | ||
|
|
122a83e556 | ||
|
|
c13fc9d406 | ||
|
|
4595449561 | ||
|
|
fb474e5a5f | ||
|
|
582fb18c22 | ||
|
|
26c4f91c58 | ||
|
|
aa1d41f89c | ||
|
|
a23ad79c99 | ||
|
|
18f3c50003 | ||
|
|
28a478311c | ||
|
|
01d380a7e7 | ||
|
|
276860aead | ||
|
|
2ccbaba654 | ||
|
|
737aa45a81 | ||
|
|
e39dfdd329 | ||
|
|
71f6711ab4 | ||
|
|
4849381e60 | ||
|
|
1dcd5a7e4e | ||
|
|
8e4d7d769e | ||
|
|
56fabb8b87 | ||
|
|
c4bd356fc7 | ||
|
|
97ec2d1011 | ||
|
|
35e9bb4e5e | ||
|
|
5a0ff896a2 | ||
|
|
03915685eb | ||
|
|
0dae0401ee | ||
|
|
b706a526a4 | ||
|
|
071c523dd6 | ||
|
|
8de99d13f5 | ||
|
|
db9ed9ea54 | ||
|
|
defb2f1776 | ||
|
|
de560ea31a | ||
|
|
f90179761f | ||
|
|
e35ce0591f | ||
|
|
5ccf7013fe | ||
|
|
74d2a7da58 | ||
|
|
691e9ea1ee | ||
|
|
3ea00009aa | ||
|
|
048434a564 | ||
|
|
0334b75cfa | ||
|
|
ce0ed935c8 | ||
|
|
ad89a63091 | ||
|
|
d148edcb67 | ||
|
|
36d2e29954 | ||
|
|
76d3643e0f | ||
|
|
a12e228cc4 | ||
|
|
669ee6a65f | ||
|
|
a7f734fadf | ||
|
|
8405c2d6cd | ||
|
|
10316c871b | ||
|
|
3b94b105fe | ||
|
|
d7abf96414 | ||
|
|
2c4d9d5af0 | ||
|
|
e14ddc11ee | ||
|
|
11eb122ecc | ||
|
|
40be8ef688 | ||
|
|
d7a72a92f2 | ||
|
|
6338809487 | ||
|
|
68408df4d6 | ||
|
|
7266a97b54 | ||
|
|
808038160f | ||
|
|
994b01719e | ||
|
|
6e6330bf07 | ||
|
|
f8b4958986 | ||
|
|
b7530d494c | ||
|
|
e6aed4bd71 | ||
|
|
57d6723adb | ||
|
|
c0ee3f071e | ||
|
|
54cfe2e99e | ||
|
|
10af9ce5c5 | ||
|
|
d4fbbd6dfe | ||
|
|
9994fc0824 | ||
|
|
c7beaaab94 | ||
|
|
25f6cb7522 | ||
|
|
0a69920b3f | ||
|
|
adad86401f | ||
|
|
6b3a5880b1 | ||
|
|
de4e340338 | ||
|
|
c10519acc2 | ||
|
|
dfb4e8921a | ||
|
|
ba02d56a4e | ||
|
|
e03d16462f | ||
|
|
0547a82a5c | ||
|
|
6e51e5db30 | ||
|
|
7a9e12affa | ||
|
|
011d41af57 | ||
|
|
469e8c0505 | ||
|
|
16c2946e32 | ||
|
|
d59bc07b89 | ||
|
|
ce4d9d21d6 | ||
|
|
e7d101c37e | ||
|
|
b0f83bd1a0 | ||
|
|
9016f25504 | ||
|
|
02134807d8 | ||
|
|
fb4da34562 | ||
|
|
0da322560c | ||
|
|
4aece1395e | ||
|
|
cc06b39905 | ||
|
|
de9eebdf76 | ||
|
|
db1af88681 | ||
|
|
7979110f2b | ||
|
|
9a81b5a598 | ||
|
|
23d44347ac | ||
|
|
6f2526a75a | ||
|
|
2bd4341c07 | ||
|
|
2f3581fe1c | ||
|
|
6ddb7246d8 | ||
|
|
ce2773491a | ||
|
|
614b9c412a | ||
|
|
479f224240 | ||
|
|
2dfd4e84e1 | ||
|
|
b8abd8e6b2 | ||
|
|
6748053233 | ||
|
|
3cc3b17b1d | ||
|
|
1d525023df | ||
|
|
be1ebdbdd3 | ||
|
|
90aae568c5 | ||
|
|
c311ecbc07 | ||
|
|
1a676c0203 | ||
|
|
692a08c134 | ||
|
|
321ee681c5 | ||
|
|
8847783063 | ||
|
|
9c0cf1eb9e | ||
|
|
688d50b662 | ||
|
|
0f74a0695c | ||
|
|
e85c416d01 | ||
|
|
6ac63baaa5 | ||
|
|
96c630b27c | ||
|
|
ff353a264e | ||
|
|
45097563f0 | ||
|
|
12370a8033 | ||
|
|
d1c67b013b | ||
|
|
3dda3e84bf | ||
|
|
a1a85732d4 | ||
|
|
bc4a2c8dce | ||
|
|
f22c288bf4 | ||
|
|
37a63e1c70 | ||
|
|
0c50c5a1a6 | ||
|
|
f2c487162f | ||
|
|
430696f486 | ||
|
|
2426547762 | ||
|
|
e877467a98 | ||
|
|
060c3de74e | ||
|
|
4039ae9772 | ||
|
|
88842d5a54 | ||
|
|
44d02b78ac | ||
|
|
c3d5a7b8ff | ||
|
|
403d24d934 | ||
|
|
943fe8989b | ||
|
|
893fe29514 | ||
|
|
568559daa5 | ||
|
|
9e713e0565 | ||
|
|
4c297d2ab4 | ||
|
|
53ccc9e02b | ||
|
|
477b30583e | ||
|
|
315bbbe25e | ||
|
|
62cc84fc9a | ||
|
|
e28bf1152c | ||
|
|
9519b3b0e7 | ||
|
|
b7462211e6 | ||
|
|
13d447a81b | ||
|
|
049d6e61df | ||
|
|
482aba0c45 | ||
|
|
f9a931dbd2 | ||
|
|
583b566133 | ||
|
|
4f639e608b | ||
|
|
ec376e272d | ||
|
|
c13d250577 | ||
|
|
70c2c42416 | ||
|
|
ec56091f98 | ||
|
|
4325aa9eb4 | ||
|
|
e01549a978 | ||
|
|
2d855391b6 | ||
|
|
feb88e5aa3 | ||
|
|
257a8e7be1 | ||
|
|
f0473e9155 | ||
|
|
e0a3a39faa | ||
|
|
c24afe3714 | ||
|
|
705fdfba38 | ||
|
|
210d4f9d5c | ||
|
|
8396f17c40 | ||
|
|
cc22b4a005 | ||
|
|
c372f1b66b | ||
|
|
bd1aa229e3 | ||
|
|
1819c69de5 | ||
|
|
f8cbe364be | ||
|
|
4fb043c46a | ||
|
|
4995318418 | ||
|
|
6eaf6ecd14 | ||
|
|
822971fc7d | ||
|
|
fb48402f87 | ||
|
|
fd241c1e85 | ||
|
|
a3fc36e573 | ||
|
|
402b4d3457 | ||
|
|
62625df203 | ||
|
|
658c220c85 | ||
|
|
4190a6bfbc | ||
|
|
7aea928a5a | ||
|
|
58d4326511 | ||
|
|
f7b782440a | ||
|
|
17422184e4 | ||
|
|
c765e7efbb | ||
|
|
a3f4c6290d | ||
|
|
242be8da28 | ||
|
|
67157c5a92 | ||
|
|
f3764abd19 | ||
|
|
c0cd13abcd | ||
|
|
6fab380cd9 | ||
|
|
3732f89362 | ||
|
|
5a49c41b20 | ||
|
|
810e27c08d | ||
|
|
37e3c6132c | ||
|
|
4a6e565027 | ||
|
|
03f45f5d3e | ||
|
|
0c5bae6f37 | ||
|
|
f9f29485ad | ||
|
|
9033bcddfe | ||
|
|
f1873c51d2 | ||
|
|
af3594e106 | ||
|
|
3e8a8ac79f | ||
|
|
bc7153883d | ||
|
|
92826db86b | ||
|
|
9ea2216d4a | ||
|
|
df6eb070d8 | ||
|
|
632d7b0651 | ||
|
|
fd3c110c02 | ||
|
|
6c8dc90267 | ||
|
|
3f57d1381e | ||
|
|
02b3c5f535 | ||
|
|
e25388066d | ||
|
|
a7f823609d | ||
|
|
f9362a1e53 | ||
|
|
7a9d5e646f | ||
|
|
1108daa8ed | ||
|
|
d59de91fd6 | ||
|
|
0cfc31f4ad | ||
|
|
e1df47dedc | ||
|
|
b6e4e0d670 | ||
|
|
5d0338a278 | ||
|
|
57aad64c23 | ||
|
|
743db0d265 | ||
|
|
a96a3c6623 | ||
|
|
60c17953c9 | ||
|
|
2068de722c | ||
|
|
33d86505e8 | ||
|
|
2a52d04064 | ||
|
|
7911bc6aea | ||
|
|
733d908c89 | ||
|
|
798ea44c60 | ||
|
|
4e11f7f064 | ||
|
|
52d214f1ff | ||
|
|
3a0b5c33cd | ||
|
|
809356afed | ||
|
|
1b01015a8c | ||
|
|
ef2d75394a | ||
|
|
c0c4a7f254 | ||
|
|
08d4a3759b | ||
|
|
b29f602ce9 | ||
|
|
09c8144f31 | ||
|
|
b3bd8c5929 | ||
|
|
99790b1560 | ||
|
|
31441e8890 | ||
|
|
f693acbaa9 | ||
|
|
c1548a8cbb | ||
|
|
fc7a75cae2 | ||
|
|
adced907c9 | ||
|
|
49ae9d43ad | ||
|
|
b40ae12e63 | ||
|
|
121343e1dd | ||
|
|
a4294cfe84 | ||
|
|
0ae9fa8342 | ||
|
|
833d0b293f | ||
|
|
c86e750883 | ||
|
|
75dd772811 | ||
|
|
ea9a870604 | ||
|
|
c7e5427200 | ||
|
|
f4849cd55e | ||
|
|
ce7d75d6b2 | ||
|
|
96ddda0009 | ||
|
|
635115f94b | ||
|
|
9bb1d799d8 | ||
|
|
eabd15092c | ||
|
|
720aee7250 | ||
|
|
47ca5f3072 | ||
|
|
5e85389792 | ||
|
|
42eb69bb95 | ||
|
|
0ce633a1ea | ||
|
|
93d0019153 | ||
|
|
f89417c06c | ||
|
|
6344a08c91 | ||
|
|
a981c711b6 | ||
|
|
3b250af6d6 | ||
|
|
70de080be7 | ||
|
|
f629787d04 | ||
|
|
e20ba6e741 | ||
|
|
00d30d2ddc | ||
|
|
9921d282d3 | ||
|
|
b70678a8a9 | ||
|
|
3fc9051268 | ||
|
|
09c9ff5ecd | ||
|
|
2678656f12 | ||
|
|
eb2a7b56b0 | ||
|
|
f33329d396 | ||
|
|
436c7fe0ad | ||
|
|
7c837caef9 | ||
|
|
fbe751e348 | ||
|
|
dc95b8584d | ||
|
|
4e715bc408 | ||
|
|
9093fcebcd | ||
|
|
d6e1508ffc | ||
|
|
02b59926d5 | ||
|
|
a78770c11e | ||
|
|
d3d72f0bb3 | ||
|
|
09aa8400ab | ||
|
|
41cea25bb0 | ||
|
|
7d7340bbfc | ||
|
|
0bf2115701 | ||
|
|
6f386e7ca2 | ||
|
|
ae2dfd41d2 | ||
|
|
473eae1c65 | ||
|
|
b0ab91d794 | ||
|
|
d059597a63 | ||
|
|
8ee47fbc90 | ||
|
|
8d33b2c866 | ||
|
|
0e2d23f01c | ||
|
|
d8d51b7128 | ||
|
|
2fea26772d | ||
|
|
0357bfdbaa | ||
|
|
52a76299c5 | ||
|
|
8de3151b8f | ||
|
|
2b3ceba353 | ||
|
|
378274bc3f | ||
|
|
c3145b0801 | ||
|
|
5aca7dafec | ||
|
|
803b1ae91b | ||
|
|
402c4e75a2 | ||
|
|
7a1859d1dd | ||
|
|
927117d5db | ||
|
|
837f433b5c | ||
|
|
b5b18ffefe | ||
|
|
48451e3f81 | ||
|
|
ec9e334f9a | ||
|
|
d430953d1e | ||
|
|
f099496aba | ||
|
|
78ac52c3b4 | ||
|
|
60ea982ed8 | ||
|
|
dc80b099bf | ||
|
|
f40e0a8ff9 | ||
|
|
9341136f16 | ||
|
|
d1261dd0a5 | ||
|
|
7486b6fb60 | ||
|
|
6e3993ecf8 | ||
|
|
81c5c15437 | ||
|
|
d66bf78e23 | ||
|
|
48786382ec | ||
|
|
f646ddfc0f | ||
|
|
2102441cd0 | ||
|
|
95149c3fe4 | ||
|
|
0bfbd40810 | ||
|
|
b3a70e980e | ||
|
|
952c369646 | ||
|
|
3effec0dd5 | ||
|
|
2d563e1694 | ||
|
|
e9ceac13b8 | ||
|
|
06a0607287 | ||
|
|
7e159646fb | ||
|
|
d2781430d3 | ||
|
|
1bb8c80342 | ||
|
|
01e83247ee | ||
|
|
12653f97ad | ||
|
|
6bcb8651a0 | ||
|
|
0071ca68be | ||
|
|
a89bbdfdf9 | ||
|
|
c7bd599e16 | ||
|
|
4440bb3741 | ||
|
|
ef7ead405c | ||
|
|
c66a5b580d | ||
|
|
f145b6a7d2 | ||
|
|
c61c90a224 | ||
|
|
bb222b2466 | ||
|
|
1a0cc26f69 | ||
|
|
4337f0bab0 | ||
|
|
6b37797de9 | ||
|
|
1843ac4d31 | ||
|
|
6399253318 | ||
|
|
f3638fb871 | ||
|
|
dc88a310cb | ||
|
|
aea9bd4882 | ||
|
|
b69bb4346c | ||
|
|
f95cdb30a1 | ||
|
|
8308b2a4f3 | ||
|
|
c89a19ab84 | ||
|
|
8eaebdee4e | ||
|
|
9af6aa4ba3 | ||
|
|
dff2704662 | ||
|
|
4849352b34 | ||
|
|
87700d9ab9 | ||
|
|
07041e1b7b | ||
|
|
f0c97a33d9 | ||
|
|
424ad79c36 | ||
|
|
c51f902a0c | ||
|
|
9a5d097f57 | ||
|
|
3b9e5b91b1 | ||
|
|
19c74080b8 | ||
|
|
a5dd13912c | ||
|
|
046fb8c38e | ||
|
|
16acc6c424 | ||
|
|
9b74c2db3e | ||
|
|
c462c27751 | ||
|
|
ba33cd9106 | ||
|
|
e26f31babd | ||
|
|
618bcf236c | ||
|
|
1264b33b49 | ||
|
|
101de40cc6 | ||
|
|
9e4dc9e0db | ||
|
|
d851a5b2d0 | ||
|
|
16fed01d72 | ||
|
|
3ad9b03066 | ||
|
|
f794c99462 | ||
|
|
9e79e06da9 | ||
|
|
45bf56671a | ||
|
|
937fb75eb2 | ||
|
|
c69c0fd915 | ||
|
|
4c4d5c7baa | ||
|
|
1e9d2cf9a0 | ||
|
|
5579aba636 | ||
|
|
c66ad6a60f | ||
|
|
8e7f087a68 | ||
|
|
72142c32a1 | ||
|
|
5999ec7acd | ||
|
|
af401cdc9b | ||
|
|
5405828d4d | ||
|
|
5b16110d0b | ||
|
|
f879e3ebdd | ||
|
|
a0b838c947 | ||
|
|
eb2fac75cd | ||
|
|
f0b1e57dcb | ||
|
|
f8f12b0596 | ||
|
|
de25859329 | ||
|
|
b4430de8de | ||
|
|
6d6c4aa4b8 | ||
|
|
baadff146e | ||
|
|
0b85490804 | ||
|
|
8d256228a0 | ||
|
|
5ad1af6d91 | ||
|
|
38b3095b82 | ||
|
|
9289d0cd43 | ||
|
|
d834c0fc0a | ||
|
|
7a995c3801 | ||
|
|
2f41a2bc09 | ||
|
|
e1a80c30be | ||
|
|
19994ccf60 | ||
|
|
1a59b0605f | ||
|
|
1c9aeee901 | ||
|
|
31bfaa0569 | ||
|
|
b24182df5b | ||
|
|
38923e1f91 | ||
|
|
258d7a3feb | ||
|
|
2dd5cd3f63 | ||
|
|
aefee0fad2 | ||
|
|
aa2f53f2d5 | ||
|
|
7e92912972 | ||
|
|
bf2abe724f | ||
|
|
a0bce9b3c5 | ||
|
|
8e5b7fdc19 | ||
|
|
5d6e1e6210 | ||
|
|
ba9cae2d56 | ||
|
|
4b243346e8 | ||
|
|
a9fe32611f | ||
|
|
7d54ccc668 | ||
|
|
946e5cb78c | ||
|
|
4ee63506f8 | ||
|
|
1a239f92f4 | ||
|
|
4f15b724ac | ||
|
|
1c68a24a70 | ||
|
|
d863acbc65 | ||
|
|
c736f2ccb4 | ||
|
|
3942b88565 | ||
|
|
a5ac2aca10 | ||
|
|
55ced7a3e5 | ||
|
|
0f2c677035 | ||
|
|
402b9e3daa | ||
|
|
3c20c4b690 | ||
|
|
7493f7d485 | ||
|
|
ccbe18b520 | ||
|
|
3ee1cf1eee | ||
|
|
d2931a540a | ||
|
|
9596a415bf | ||
|
|
4e1ebfc541 | ||
|
|
ca086e01c7 | ||
|
|
8bde0bc204 | ||
|
|
28df25e804 | ||
|
|
fa5cb50df9 | ||
|
|
b847e02ff8 | ||
|
|
4dae0cd0d5 | ||
|
|
4dfacb63a1 | ||
|
|
3e7411440b | ||
|
|
52fa239ae1 | ||
|
|
fdaed3fd8f | ||
|
|
531a2dc12c | ||
|
|
0e011570be | ||
|
|
8a3235ce6f | ||
|
|
e054c17e31 | ||
|
|
e785d967bf | ||
|
|
55004d4a6a | ||
|
|
c7b6b4fc3e | ||
|
|
4d60b96a75 | ||
|
|
ac7ff6a4a7 | ||
|
|
d768b93441 | ||
|
|
0f0b546fa6 | ||
|
|
ed454218b6 | ||
|
|
b2345de9cc | ||
|
|
5dc393f397 | ||
|
|
ecf0df8c6e | ||
|
|
ca654d938b | ||
|
|
0b0fb6bf1f | ||
|
|
2da216d9ca | ||
|
|
9e512690ff | ||
|
|
ec25aae9ea | ||
|
|
ce85bb0578 | ||
|
|
4c9538d51f | ||
|
|
dc5157a252 | ||
|
|
9cc6d7f4da | ||
|
|
4c96c2feef | ||
|
|
25eeafb6c3 | ||
|
|
da8801d236 | ||
|
|
18b301e2a6 | ||
|
|
35f52410d9 | ||
|
|
cf55c05691 | ||
|
|
60da071e7d | ||
|
|
80fe47ef79 | ||
|
|
c0e4ed05bf | ||
|
|
a300096620 | ||
|
|
c3281a6cbc | ||
|
|
fcf3f63796 | ||
|
|
a86c1d980b | ||
|
|
4f1e6c4a6f | ||
|
|
d0ffac21d3 | ||
|
|
721639ae6b | ||
|
|
0ade88209d | ||
|
|
553f299299 | ||
|
|
07dd59b017 | ||
|
|
869a48f392 | ||
|
|
5ffa933b7f | ||
|
|
e14681e6c4 | ||
|
|
48f790c60f | ||
|
|
be9360fbf3 | ||
|
|
3fc07738cb | ||
|
|
299452eb8d | ||
|
|
655bce7795 | ||
|
|
0289b38e4e | ||
|
|
bceb401d19 | ||
|
|
cef74ff787 | ||
|
|
de3b1c896f | ||
|
|
c94bbbc3d3 | ||
|
|
877737d872 | ||
|
|
2c47baeed4 | ||
|
|
df01e07f66 | ||
|
|
61bd0b7038 | ||
|
|
e8570dd47f | ||
|
|
4f549a1fa5 | ||
|
|
0321a03e38 | ||
|
|
ba28773dae | ||
|
|
fcb3f7fb4f | ||
|
|
1db52a9384 | ||
|
|
47986470a3 | ||
|
|
4ddafa700f | ||
|
|
2d90f1b02d | ||
|
|
19d67cb42b | ||
|
|
df2e5c8ab0 | ||
|
|
02d43366c7 | ||
|
|
b51ceb26f8 | ||
|
|
96f559c513 | ||
|
|
1ed613d5be | ||
|
|
2cba7cad2a | ||
|
|
57c684abf3 | ||
|
|
eb3970d779 | ||
|
|
e160e4e578 | ||
|
|
2378b78c69 | ||
|
|
3b500bad64 | ||
|
|
39f09d1b4b | ||
|
|
b876da60aa | ||
|
|
48f85b4450 | ||
|
|
ab81bbea68 | ||
|
|
1f2a0d6163 | ||
|
|
6af4b9ecd5 | ||
|
|
7441730b24 | ||
|
|
f444350a4f | ||
|
|
9b922c9f7d | ||
|
|
0892443104 | ||
|
|
b1bce843d4 | ||
|
|
c97a0cffe1 | ||
|
|
8ff7340eb2 | ||
|
|
067bd9f75e | ||
|
|
9dcf4d0264 | ||
|
|
4a38798595 | ||
|
|
b6213b17ae | ||
|
|
b80804dae5 | ||
|
|
8e4d885268 | ||
|
|
869375a6ac | ||
|
|
51f229b0bd | ||
|
|
c6a16a0279 | ||
|
|
cb460beb86 | ||
|
|
6e8cc57b65 | ||
|
|
d18ae25c19 | ||
|
|
16c0a93d46 | ||
|
|
857129c60f | ||
|
|
84e6a52834 | ||
|
|
9a47c6c6d5 | ||
|
|
62176311c9 | ||
|
|
17362c0cad | ||
|
|
e022bffe40 | ||
|
|
ae03014b87 | ||
|
|
6defc8eb31 | ||
|
|
6635e72598 | ||
|
|
0eacea6fcd | ||
|
|
f3381e95ef | ||
|
|
294f1d7983 | ||
|
|
9bfb33d88c | ||
|
|
12b874507f | ||
|
|
cee97582fc | ||
|
|
fae3c2e1bd | ||
|
|
ed89a92f39 | ||
|
|
c4e2a63f76 | ||
|
|
c66b6843a4 | ||
|
|
9fc03bbc9a | ||
|
|
36c875a7f7 | ||
|
|
0baa065fce | ||
|
|
075c1522f8 | ||
|
|
48b175fa43 | ||
|
|
4d35ea9bf3 | ||
|
|
9c52309fb3 | ||
|
|
ebaa5dc70b | ||
|
|
62368fda23 | ||
|
|
6b89eca022 | ||
|
|
5f9c5b1cf4 | ||
|
|
57f6895f92 | ||
|
|
000c02247d | ||
|
|
6b899188c4 | ||
|
|
24f0efc0e2 | ||
|
|
b6bbb28757 | ||
|
|
fee4e23c11 | ||
|
|
adac5826bd | ||
|
|
8e1cd54c92 | ||
|
|
8b3dff12e8 | ||
|
|
e2885e2a00 | ||
|
|
c82b18f772 | ||
|
|
2642e15aff | ||
|
|
6879e0e819 | ||
|
|
bf4dac5c3b | ||
|
|
8729214f8b | ||
|
|
d3fd83c2ac | ||
|
|
ff6073a932 | ||
|
|
2cfee720a3 | ||
|
|
da5c75c911 | ||
|
|
e6802d89aa | ||
|
|
061e3d212d | ||
|
|
04bb549e36 | ||
|
|
731e36a393 | ||
|
|
e94b0dfa88 | ||
|
|
5cf6016d50 | ||
|
|
cde888ed2b | ||
|
|
fe07405971 | ||
|
|
68fcb587a9 | ||
|
|
93165ef0b2 | ||
|
|
a616124cc6 | ||
|
|
2ccb8f9a17 | ||
|
|
4b58fac608 | ||
|
|
a4a3d8a6eb | ||
|
|
dbcb18bffc | ||
|
|
c154d600fd | ||
|
|
25bdc3b5a8 | ||
|
|
71dce28494 | ||
|
|
cf39c76986 | ||
|
|
e779b8342d | ||
|
|
f229f09715 | ||
|
|
a499580b4d | ||
|
|
4fd952b0da | ||
|
|
234ed2718f | ||
|
|
77c1818572 | ||
|
|
b704aca0fe | ||
|
|
8226f81026 | ||
|
|
1b062aa597 | ||
|
|
80d166ad0d | ||
|
|
2b7e21b31d | ||
|
|
3f863cace4 | ||
|
|
737536297c | ||
|
|
c157e08179 | ||
|
|
96ff68a8a1 | ||
|
|
46fc00918e | ||
|
|
c9017b5bf9 | ||
|
|
89dc51fab5 | ||
|
|
78067113d7 | ||
|
|
bef3abbe2c | ||
|
|
be98a38c9a | ||
|
|
59717b32a5 | ||
|
|
1255c24898 | ||
|
|
4e0b923552 | ||
|
|
0ee868e009 | ||
|
|
ef9a6ac6aa | ||
|
|
075dea2b8f | ||
|
|
60c0d725c9 | ||
|
|
a6ab26f93c | ||
|
|
59450f470a | ||
|
|
09dfd736db | ||
|
|
520d3e2a06 | ||
|
|
3852c9bf3f | ||
|
|
f3d9208d08 | ||
|
|
f3ed32e06b | ||
|
|
eded40049d | ||
|
|
56e1a37ae1 | ||
|
|
c62236791a | ||
|
|
bbe6ff820a | ||
|
|
47679469ac | ||
|
|
49d29b2a0d | ||
|
|
f330d2c7ed | ||
|
|
f7e79a31a0 | ||
|
|
2d8c995756 | ||
|
|
dbdc0ed52f | ||
|
|
fd59f931fa | ||
|
|
70a0a594b4 | ||
|
|
4273d62460 | ||
|
|
5139c1fa3f | ||
|
|
b78f61e03d | ||
|
|
847c71ecf2 | ||
|
|
c493d651db | ||
|
|
42253cdb53 | ||
|
|
e4bcb809f3 | ||
|
|
06c954f8fe | ||
|
|
9567656b45 | ||
|
|
3d2edff0d3 | ||
|
|
966737be23 | ||
|
|
6c1188a787 | ||
|
|
f93538cf1e | ||
|
|
69d5c480a1 | ||
|
|
39fffe6874 | ||
|
|
a75ae8a1b1 | ||
|
|
550ce4ea2a | ||
|
|
c1d49fe8aa | ||
|
|
577831f775 | ||
|
|
57aa4dbce4 | ||
|
|
16b351de2e | ||
|
|
098ad6e98c | ||
|
|
248fdbaddf | ||
|
|
badd37e150 | ||
|
|
60de863a2c | ||
|
|
417a1abcf7 | ||
|
|
d36ecec9c4 | ||
|
|
6272e1fba3 | ||
|
|
d717381df4 | ||
|
|
3fa28867bd | ||
|
|
e1058f0ab3 | ||
|
|
7a2895d3a3 | ||
|
|
58f156a491 | ||
|
|
02ee8602cd | ||
|
|
e999f5dd72 | ||
|
|
aa2913ea07 | ||
|
|
2f07212e20 | ||
|
|
5e1b099285 | ||
|
|
87b1f5a5fb | ||
|
|
43eeaa1abf | ||
|
|
ae8cbdce0a | ||
|
|
95de48c03f | ||
|
|
164ae1fac1 | ||
|
|
5ea4fd9a5e | ||
|
|
1f3d9e7e0f | ||
|
|
05e4528b1c | ||
|
|
40789776bc | ||
|
|
6123df568c | ||
|
|
705cb5fed3 | ||
|
|
c5ce183705 | ||
|
|
2cf750b309 | ||
|
|
ac85a4f313 | ||
|
|
76904d1d13 | ||
|
|
75759edd26 | ||
|
|
2a5dc1dba6 | ||
|
|
0cbf50b7ff | ||
|
|
a3f5b805bb | ||
|
|
c337877501 | ||
|
|
a6e9dd850a | ||
|
|
bb110697a3 | ||
|
|
2d2f671681 | ||
|
|
a14d4057de | ||
|
|
210240ce66 | ||
|
|
ff7f6c5a19 | ||
|
|
e03d036131 | ||
|
|
d21f7fe75c | ||
|
|
54805cd2a0 | ||
|
|
5bb5f18b7e | ||
|
|
33b9c6b03c | ||
|
|
c7da2e732a | ||
|
|
4b4beaa892 | ||
|
|
11e03c331a | ||
|
|
417901d048 | ||
|
|
fc7b267ccf | ||
|
|
e13596acae | ||
|
|
8eb065181f | ||
|
|
1d97219fef | ||
|
|
d312f94825 | ||
|
|
5c78a80923 | ||
|
|
8f365cdd66 | ||
|
|
478a6f7369 | ||
|
|
e309123296 | ||
|
|
bff8c8d549 | ||
|
|
e189ab86be | ||
|
|
777646cb0e | ||
|
|
39e23f7144 | ||
|
|
1563cc9b4f | ||
|
|
ec09c16e0a | ||
|
|
12d3a2057b | ||
|
|
b68b5c0ea3 | ||
|
|
46dfeb8ca9 | ||
|
|
fb7e0b9fb6 | ||
|
|
6771ad43af | ||
|
|
1881b9c6cb | ||
|
|
6d32834716 | ||
|
|
5121541af3 | ||
|
|
dae6b7a980 | ||
|
|
aed6209f6a | ||
|
|
40514cd51c | ||
|
|
b44a590aa0 | ||
|
|
24e302ac06 | ||
|
|
8d3095ecf3 | ||
|
|
936b5fc983 | ||
|
|
473d6617f2 | ||
|
|
563b16e180 | ||
|
|
47a646f5f1 | ||
|
|
1d2dfcd686 | ||
|
|
fcf50b5aeb | ||
|
|
a3835d2e8a | ||
|
|
d89481966e | ||
|
|
dcb2508a0d | ||
|
|
3148ce0f31 | ||
|
|
f65363856a | ||
|
|
2bb4c2e467 | ||
|
|
e205b57352 | ||
|
|
f44a1dbf21 | ||
|
|
790a7c577e | ||
|
|
4d29f1a848 | ||
|
|
b7fe2f606c | ||
|
|
6e81c1795c | ||
|
|
1a19e1df42 | ||
|
|
be5ba54a3f | ||
|
|
4eaa10f104 | ||
|
|
141d8e4467 | ||
|
|
edbfeab75f | ||
|
|
e48ea10ebb | ||
|
|
6001899745 | ||
|
|
8565af5526 | ||
|
|
511d3bae8f | ||
|
|
87e2339b26 | ||
|
|
c1659eae06 | ||
|
|
8df233fef1 | ||
|
|
4b97410cc0 | ||
|
|
edc397209c | ||
|
|
975def8281 | ||
|
|
aadf8097d1 | ||
|
|
40d8b74b1b | ||
|
|
d910135e84 | ||
|
|
186d1e452a | ||
|
|
8c4d42891c | ||
|
|
3672374d23 | ||
|
|
68820cb76a | ||
|
|
2c725b0360 | ||
|
|
cb525d368d | ||
|
|
9ff9d3f174 | ||
|
|
86540fa7fd | ||
|
|
1538c80a7d | ||
|
|
0225fcfe51 | ||
|
|
a62a60b5e6 | ||
|
|
57f3861de6 | ||
|
|
d4382007d6 | ||
|
|
d27963dd32 | ||
|
|
04c365a251 | ||
|
|
7dfe4690ce | ||
|
|
92bcf1b7c9 | ||
|
|
a8839d1904 | ||
|
|
8a15d5c65a | ||
|
|
a7283efe8e | ||
|
|
c46e70ba8c | ||
|
|
f64374225d | ||
|
|
7537eac6a7 | ||
|
|
72e0ec6af7 | ||
|
|
e2880d2434 | ||
|
|
8296de16ef | ||
|
|
8873c3fe28 | ||
|
|
8c4d54e50b | ||
|
|
be926ae491 | ||
|
|
6547bb709e | ||
|
|
c9e88b6ca4 | ||
|
|
a94136c3a7 | ||
|
|
5cff5e9dfd | ||
|
|
cb07a748c2 | ||
|
|
c7b985bdc6 | ||
|
|
bf32ca0e4a | ||
|
|
a4e52de0e3 | ||
|
|
e43e9b11a0 | ||
|
|
3672f3e925 | ||
|
|
9ccea637ab | ||
|
|
847b9e97c4 | ||
|
|
baad689286 | ||
|
|
8b2efb6367 | ||
|
|
5e7afc4385 | ||
|
|
a5e3f0d65a | ||
|
|
d724b7a631 | ||
|
|
cd5ca57ca3 | ||
|
|
fd59680b8e | ||
|
|
24a1561ddc | ||
|
|
64ae48dc93 | ||
|
|
5e17fe5ad6 | ||
|
|
b216adadc0 | ||
|
|
5078c95667 | ||
|
|
7612d77647 | ||
|
|
09b366b273 | ||
|
|
0d76041c10 | ||
|
|
59be596d24 | ||
|
|
cfee3bfff4 | ||
|
|
fca499925c | ||
|
|
63e51a3c98 | ||
|
|
7f3128b3e5 | ||
|
|
d379ce1011 | ||
|
|
c235813ae7 | ||
|
|
3ee18e7051 | ||
|
|
cb87e8f21c | ||
|
|
14fc5d8796 | ||
|
|
9fb0077385 | ||
|
|
d4c90da151 | ||
|
|
722c0a8bc2 | ||
|
|
55585204b3 | ||
|
|
2e9c7265b6 | ||
|
|
d9e77b784a | ||
|
|
b5b296ad7f | ||
|
|
acdfde5aa2 | ||
|
|
0eddfbd28c | ||
|
|
4156f465da | ||
|
|
90905d598b | ||
|
|
037f0610bc | ||
|
|
dd45f8f2ab | ||
|
|
0e3f241389 | ||
|
|
83abedf811 | ||
|
|
94128271ed | ||
|
|
d454c84f61 | ||
|
|
a4c98e07a5 | ||
|
|
85715630bd | ||
|
|
759442edac | ||
|
|
45d8d4a84f | ||
|
|
690882c97a | ||
|
|
38c90e29ad | ||
|
|
83a853054c | ||
|
|
eb51f69c8a | ||
|
|
835679cd0c | ||
|
|
76bff85b7f | ||
|
|
e03836e4a1 | ||
|
|
d4ec54135a | ||
|
|
b29785d851 | ||
|
|
148870d706 | ||
|
|
ed1f7e335d | ||
|
|
861a193446 | ||
|
|
a4935c33b4 | ||
|
|
eaf4695194 | ||
|
|
c312d42302 | ||
|
|
aa3919f870 | ||
|
|
0e18114d6d | ||
|
|
0e5a300a14 | ||
|
|
95a68395b9 | ||
|
|
a8a2a6c066 | ||
|
|
8b3512cb07 | ||
|
|
945facdd2c | ||
|
|
8676ed4cff | ||
|
|
6d7917c879 | ||
|
|
686b9aa92f | ||
|
|
381d5993e6 | ||
|
|
e4d4afa840 | ||
|
|
81cf286ea4 | ||
|
|
e834625728 | ||
|
|
a7c22eb08c | ||
|
|
8475cde41b | ||
|
|
837c358371 | ||
|
|
9743db27e7 | ||
|
|
e82c550da8 | ||
|
|
baa1404771 | ||
|
|
9beb114ae5 | ||
|
|
1162463777 | ||
|
|
33356b3240 | ||
|
|
3b3faa21a1 | ||
|
|
776d89b70a | ||
|
|
ce725143e6 | ||
|
|
677805c33a | ||
|
|
3d3f1fe39b | ||
|
|
123c68ad2b | ||
|
|
86861c58af | ||
|
|
d4ddb6b3f9 | ||
|
|
afc2b0380a | ||
|
|
e4ba6040cc | ||
|
|
0fc7de40d4 | ||
|
|
3cb4a9c8dd | ||
|
|
7d19db4686 | ||
|
|
0371874dbb | ||
|
|
6cbd61554a | ||
|
|
d681289457 | ||
|
|
bc1c3c3f5b | ||
|
|
5ae4287c0f | ||
|
|
cde9f56886 | ||
|
|
2b6b006bbd | ||
|
|
48a490790c | ||
|
|
b96b7fc3a7 | ||
|
|
54e1bcafc0 | ||
|
|
7e98d0a22b | ||
|
|
dfdd002708 | ||
|
|
001c5f04b2 | ||
|
|
c27b4a6aaf | ||
|
|
8f17ffd817 | ||
|
|
7ef2be299d | ||
|
|
9feb6ebff2 | ||
|
|
0a7d688d32 | ||
|
|
8cb2fe1284 | ||
|
|
12a8aa8a40 | ||
|
|
ea18c2c7ce | ||
|
|
b721acb49e | ||
|
|
024a3d16db | ||
|
|
75e493332e | ||
|
|
ff0b772b62 | ||
|
|
e6e375232e | ||
|
|
08c4ab8a0c | ||
|
|
eb746ae0f8 | ||
|
|
f86647fc26 | ||
|
|
f310f6a86f | ||
|
|
58c6acd265 | ||
|
|
c7d97e3866 | ||
|
|
0890144c61 | ||
|
|
69a7d91b57 | ||
|
|
a9016c88f6 | ||
|
|
e8990742cf | ||
|
|
82eefe68e2 | ||
|
|
538e1e7b9c | ||
|
|
c12d2f4226 | ||
|
|
b4428d099b | ||
|
|
0acf907f47 | ||
|
|
d837756200 | ||
|
|
f51400a3a1 | ||
|
|
e763ee5301 | ||
|
|
fd978699e8 | ||
|
|
bbd9585829 | ||
|
|
54cf1ebb31 | ||
|
|
6fc77c6cfa | ||
|
|
f54566725e | ||
|
|
ff34e3dfb1 | ||
|
|
f8372e3bb9 | ||
|
|
6728be7b1a | ||
|
|
65e1a1e731 | ||
|
|
0b7a726f08 | ||
|
|
b53aef6254 | ||
|
|
ba4612042c | ||
|
|
0d22fef2a0 | ||
|
|
6f6ff45062 | ||
|
|
8ba2ae634f | ||
|
|
cd9478e853 | ||
|
|
b9364ed4fc | ||
|
|
2715e8e9d8 | ||
|
|
f987c93cf0 | ||
|
|
5c254a7151 | ||
|
|
f253e29f33 | ||
|
|
f37fa13eab | ||
|
|
64765b393a | ||
|
|
fc1eae21ea | ||
|
|
454a15cb25 | ||
|
|
54c84b4ce0 | ||
|
|
146bcba794 | ||
|
|
84b8b85f8d | ||
|
|
2a2a7a7bd9 | ||
|
|
d3dd1b731d | ||
|
|
d608ee7390 | ||
|
|
addc237f7a | ||
|
|
034763218b | ||
|
|
4e2e0950c7 | ||
|
|
ddc7e97ab6 | ||
|
|
a21759ee42 | ||
|
|
cc4beb94cf | ||
|
|
18c6822b67 | ||
|
|
9ced8b7e75 | ||
|
|
67c556f2e3 | ||
|
|
cea3072f1a | ||
|
|
2e09ca0286 | ||
|
|
0bfafa9311 | ||
|
|
4eefc34629 | ||
|
|
4d3f882dc0 | ||
|
|
3a802fbb70 | ||
|
|
6f00b03d24 | ||
|
|
dd77a721d6 | ||
|
|
b44bd7c2ca | ||
|
|
26e9922016 | ||
|
|
e7ffddb4ee | ||
|
|
22c73ff5af | ||
|
|
934f8b8cc3 | ||
|
|
66c726f3ee | ||
|
|
a49e6640a3 | ||
|
|
88b935ba4f | ||
|
|
98744f5bdf | ||
|
|
0e0855370e | ||
|
|
26b11b8939 | ||
|
|
e1f8c752c8 | ||
|
|
b68c631a5a | ||
|
|
91b691ba0a | ||
|
|
4aec88d4af | ||
|
|
9b0bdc3f13 | ||
|
|
7f2e14061d | ||
|
|
7c96f2d08c | ||
|
|
e1c5af561d | ||
|
|
594c715943 | ||
|
|
6ca2931de8 | ||
|
|
01363a5ef9 | ||
|
|
0f1471fee4 | ||
|
|
0e7ce49ad4 | ||
|
|
1b9ece5137 | ||
|
|
27a7490585 | ||
|
|
885f5a8225 | ||
|
|
6ba3e8d035 | ||
|
|
babe6f1a09 | ||
|
|
482754fc00 | ||
|
|
a98539b1d3 | ||
|
|
3224ce7e58 | ||
|
|
9b325e55dd | ||
|
|
105d68681a | ||
|
|
d7a852af8b | ||
|
|
469b1e8989 | ||
|
|
2c53007070 | ||
|
|
86f9e8bb2f | ||
|
|
abdb261717 | ||
|
|
f9cca94951 | ||
|
|
029e5f8e0a | ||
|
|
d278d517df | ||
|
|
41046531d5 | ||
|
|
d039fb0bbe | ||
|
|
baff437e69 | ||
|
|
0b895845a1 | ||
|
|
d47fd0e10a | ||
|
|
fc46bc077f | ||
|
|
16b7ff9a25 | ||
|
|
ccb79a1096 | ||
|
|
fd557ac9fe | ||
|
|
f643f6c28a | ||
|
|
362fc0b3d8 | ||
|
|
3329bbf053 | ||
|
|
3357a5de77 | ||
|
|
ad780bdcd8 | ||
|
|
d1c3ac5015 | ||
|
|
91409f44b5 | ||
|
|
f6eb444841 | ||
|
|
f4cc42e25c | ||
|
|
570c6849ca | ||
|
|
cc5d396758 | ||
|
|
281c236945 | ||
|
|
b90cfde7c0 | ||
|
|
c46d3dbd10 | ||
|
|
d3fed8a717 | ||
|
|
7cc55b6cb1 | ||
|
|
9847355983 | ||
|
|
267b4c904c | ||
|
|
859790da87 | ||
|
|
214da9a221 | ||
|
|
4579919077 | ||
|
|
d2509e45db | ||
|
|
793e1b11da | ||
|
|
0e9a21a263 | ||
|
|
c37d741cf2 | ||
|
|
893fbd899e | ||
|
|
6d14a1bbd4 | ||
|
|
c70d86c738 | ||
|
|
ab8f7e21a3 | ||
|
|
b7f56a6b9d | ||
|
|
2212130beb | ||
|
|
294171ed37 | ||
|
|
c025aa7596 | ||
|
|
73035bd549 | ||
|
|
3a3fdef1a8 | ||
|
|
7602daaaef | ||
|
|
6d5b6c6e73 | ||
|
|
f44e177e43 | ||
|
|
137552beed | ||
|
|
8bca751e8e | ||
|
|
b26228ebde | ||
|
|
0e43f85176 | ||
|
|
11e645f334 | ||
|
|
10eb83207b | ||
|
|
3a16b092f2 | ||
|
|
889d30322f | ||
|
|
ed66a4b7f0 | ||
|
|
7b31ea29a1 | ||
|
|
70ef3433a8 | ||
|
|
efd3d97305 | ||
|
|
05ba34f602 | ||
|
|
cff85f78af | ||
|
|
cb015d8219 | ||
|
|
50bd83abd8 | ||
|
|
ce7d482830 | ||
|
|
6e48216234 | ||
|
|
05299eefb0 | ||
|
|
a360a0b3f1 | ||
|
|
d819f5dc93 | ||
|
|
08508d1555 | ||
|
|
4a6290bd1a | ||
|
|
a226f6bffa | ||
|
|
059882fdb9 | ||
|
|
cf079e70d2 | ||
|
|
49c470d131 | ||
|
|
3df6f62af8 | ||
|
|
c9966aaf84 | ||
|
|
d6c63921b8 | ||
|
|
8a844f1880 | ||
|
|
650efbac89 | ||
|
|
7b149d0eb7 | ||
|
|
627b570aa0 | ||
|
|
17c5710b55 | ||
|
|
86e19e46f5 | ||
|
|
d57d90381c | ||
|
|
3882c64a1d | ||
|
|
a5a18821cc | ||
|
|
3fb89120f9 | ||
|
|
93daac8be9 | ||
|
|
4dc9982f1d | ||
|
|
781f79a87a | ||
|
|
74b7bf6aeb | ||
|
|
003dac4d1e | ||
|
|
7e81abb2b6 | ||
|
|
2bcac63885 | ||
|
|
1f8343f350 | ||
|
|
f27f5180d6 | ||
|
|
baa5fa8019 | ||
|
|
179e88b24f | ||
|
|
a9fd348ca2 | ||
|
|
b3ba4e232b | ||
|
|
fee759f68d | ||
|
|
05a6db2956 | ||
|
|
ae3a19c4e1 | ||
|
|
4e29f3fd5d | ||
|
|
a7aa1bbff7 | ||
|
|
d741019cb5 | ||
|
|
48b6c7bab8 | ||
|
|
f536ac3f03 | ||
|
|
87f289bef1 | ||
|
|
82d8c26e1e | ||
|
|
ee2843bd3b | ||
|
|
40ff0071d7 | ||
|
|
b7e374cae5 | ||
|
|
d42d695d85 | ||
|
|
1d0943eaa4 | ||
|
|
290e187925 | ||
|
|
0031b273cb | ||
|
|
92f5041105 | ||
|
|
614e403b43 | ||
|
|
abbbee14fa | ||
|
|
34f52809e7 | ||
|
|
20aad0e7e9 | ||
|
|
51171cd9e7 | ||
|
|
9fea77787b | ||
|
|
297f07e4e4 | ||
|
|
220cea23cd | ||
|
|
4594540c2e | ||
|
|
b61d05c8f8 | ||
|
|
e7383d32de | ||
|
|
83e1f67052 | ||
|
|
c6f12dcb35 | ||
|
|
d1554d07d4 | ||
|
|
c4793b9a88 | ||
|
|
0a8f874096 | ||
|
|
14e4cd7bfb | ||
|
|
0c97fb327f | ||
|
|
4acb5c464b | ||
|
|
80e66ad010 | ||
|
|
21cb5f2ad3 | ||
|
|
f4c47fd3f4 | ||
|
|
4978716725 | ||
|
|
c9358c4877 | ||
|
|
14d198cd30 | ||
|
|
809c41d21a | ||
|
|
3469220226 | ||
|
|
f4715dfdec | ||
|
|
8f8ee5fb73 | ||
|
|
be754d8619 | ||
|
|
2ff7f2c68c | ||
|
|
2c95f2c9a9 | ||
|
|
c8d2530620 | ||
|
|
2eb736f97d | ||
|
|
c73c0ba9f4 | ||
|
|
04470a68c0 | ||
|
|
f72dcefebd | ||
|
|
030317ba67 | ||
|
|
d36df53043 | ||
|
|
d8faea8332 | ||
|
|
42f131086f | ||
|
|
0450be2653 | ||
|
|
ccb1900af7 | ||
|
|
dd9b75cbf1 | ||
|
|
4401e4d3ee | ||
|
|
a6fe7953e3 | ||
|
|
d72ab61e6f | ||
|
|
d96473f5ed | ||
|
|
f5fefa88a4 | ||
|
|
b3234d2f5e | ||
|
|
dfe8163daf | ||
|
|
4391dae4b0 | ||
|
|
e991904d02 | ||
|
|
6d40ccb04a | ||
|
|
e2518666ea | ||
|
|
e83fb66513 | ||
|
|
3f5d3b3238 | ||
|
|
db2c31d917 | ||
|
|
b8306ef3ba | ||
|
|
94ac6b9272 | ||
|
|
86da780308 | ||
|
|
eab8692a58 | ||
|
|
c1d16f9965 | ||
|
|
a63cb28723 | ||
|
|
837dd124ea | ||
|
|
7177cad905 | ||
|
|
c2f7f118e9 | ||
|
|
3be1165552 | ||
|
|
844f940123 | ||
|
|
cb7c81c66a | ||
|
|
3a009fccf0 | ||
|
|
e6f2364c71 | ||
|
|
aed5cdb1a8 | ||
|
|
44fd600abb | ||
|
|
17f593e004 | ||
|
|
37636d84d9 | ||
|
|
5a87eafb87 | ||
|
|
8cf760d9d5 | ||
|
|
31c11dc06c | ||
|
|
ef66da7f3f | ||
|
|
8bc1b3f715 | ||
|
|
cceafabcd3 | ||
|
|
7c19bda30d | ||
|
|
2588253b3d | ||
|
|
5b56483a93 | ||
|
|
3d52e8aeac | ||
|
|
50d59902d6 | ||
|
|
f4c14be2f2 | ||
|
|
86bf608be3 | ||
|
|
cf62cdd6f2 | ||
|
|
5ccb953be1 | ||
|
|
0d7b3a27e9 | ||
|
|
587201f723 | ||
|
|
caeceb7edc | ||
|
|
6d9aa9134f | ||
|
|
f392aa6d7a | ||
|
|
f92e592533 | ||
|
|
9b23518273 | ||
|
|
527650f210 | ||
|
|
cc9f9eb85d | ||
|
|
8f4991ab70 | ||
|
|
7b98381471 | ||
|
|
615756552d | ||
|
|
8c16f42826 | ||
|
|
c4259323d3 | ||
|
|
7b8c3934e2 | ||
|
|
930d085fe3 | ||
|
|
d9469898f2 | ||
|
|
e9c2d3790a | ||
|
|
635a99cb31 | ||
|
|
aae2f5619f | ||
|
|
d0bc560625 | ||
|
|
1572fefe8c | ||
|
|
1508486dc1 | ||
|
|
c43c6c2c3c | ||
|
|
5cb792bfbf | ||
|
|
56c0385d53 | ||
|
|
372b31461c | ||
|
|
aa63219743 | ||
|
|
0ffaf5afd7 | ||
|
|
00f8d88578 | ||
|
|
e4ffdc024e | ||
|
|
b166bc7903 | ||
|
|
d5369224a4 | ||
|
|
a1ca1c047b | ||
|
|
8cc806c4d7 | ||
|
|
a9bd2b8818 | ||
|
|
ee3e7f0288 | ||
|
|
038c5c0e38 | ||
|
|
2525cd9efb | ||
|
|
cc1e2462f4 | ||
|
|
d1071e1cd2 | ||
|
|
c37f3602fb | ||
|
|
ca8e26f857 | ||
|
|
af468f2c8e | ||
|
|
96084a09c0 | ||
|
|
a0a8ac46f5 | ||
|
|
5f30faabde | ||
|
|
0c83b0fddf | ||
|
|
a12fd8cbe2 | ||
|
|
ee8084c98a | ||
|
|
f00f874898 | ||
|
|
8d752a9bc7 | ||
|
|
7c891ac7d2 | ||
|
|
f95cbe080f | ||
|
|
147580785f | ||
|
|
a5ddfa1ba0 | ||
|
|
1edaa48351 | ||
|
|
b0238d827c | ||
|
|
cde0620851 | ||
|
|
e188d37348 | ||
|
|
d08d9d91ae | ||
|
|
e87a5b8644 | ||
|
|
76bf75d3bf | ||
|
|
de12cba1df | ||
|
|
6e476ad454 | ||
|
|
f8defc0499 | ||
|
|
7ad65696f6 | ||
|
|
df4e15ed56 | ||
|
|
b6a4e3d2f4 | ||
|
|
ac81d4657c | ||
|
|
b81488ac6b | ||
|
|
d1bbf85f37 | ||
|
|
7f71e693c5 | ||
|
|
5d16bf5976 | ||
|
|
c7addf7c47 | ||
|
|
68562d9f6f | ||
|
|
e2eb3180c1 | ||
|
|
a6af5c8696 | ||
|
|
c4969b17dd | ||
|
|
0d8b4a8386 | ||
|
|
9bf7963f01 | ||
|
|
28069beddc | ||
|
|
b25af90e99 | ||
|
|
7258da68a8 | ||
|
|
17cb604161 | ||
|
|
4d31dd23fd | ||
|
|
1898fe813e | ||
|
|
7d85470634 | ||
|
|
37d0584a30 | ||
|
|
59598e529b | ||
|
|
de9c1ca9a9 | ||
|
|
1c131f2f25 | ||
|
|
c608435e32 | ||
|
|
78d7c5cef5 | ||
|
|
f2c5230424 | ||
|
|
b4636ca7ef | ||
|
|
a357e21bb6 | ||
|
|
c93eed08fc | ||
|
|
33e7e410d2 | ||
|
|
7811824a2c | ||
|
|
d6bd77b903 | ||
|
|
b36b970006 | ||
|
|
f8969d2561 | ||
|
|
132eabf450 | ||
|
|
ae1db0097e | ||
|
|
d0d8f11e15 | ||
|
|
05ea32fea1 | ||
|
|
8bb187f01e | ||
|
|
9f18f60fc8 | ||
|
|
c8e20a4038 | ||
|
|
ef9c3c9c1f | ||
|
|
e60e8ddc6b | ||
|
|
fd4c1dea76 | ||
|
|
243ca1e06a | ||
|
|
6456b00441 | ||
|
|
5b17f5f08b | ||
|
|
dd4df0ba4c | ||
|
|
699752f631 | ||
|
|
a31f88848d | ||
|
|
065c9363f9 | ||
|
|
c47302b2aa | ||
|
|
7274d41b43 | ||
|
|
3f306a1bfb | ||
|
|
c9f5d4286b | ||
|
|
75be1ebc9c | ||
|
|
7c3b2da48c | ||
|
|
c70a645516 | ||
|
|
c580d55be7 | ||
|
|
caa7ef61ec | ||
|
|
65dbb158ce | ||
|
|
5463e8b5d8 | ||
|
|
a63123e206 | ||
|
|
846c02c9e4 | ||
|
|
101b728d9b | ||
|
|
63514669ea | ||
|
|
44397246bc | ||
|
|
d9a58fc8ce | ||
|
|
57943d0f0a | ||
|
|
a6ceb44a5c | ||
|
|
bbc1b509f0 | ||
|
|
8936a1bf42 | ||
|
|
abc70e8558 | ||
|
|
c9c68b561c | ||
|
|
c6c64a1953 | ||
|
|
bcce2c5ffc | ||
|
|
058a30aec3 | ||
|
|
7ba73f909c | ||
|
|
90db214ac1 | ||
|
|
887b625114 | ||
|
|
260aa944d5 | ||
|
|
aa25de5cf8 | ||
|
|
4ee4dd3645 | ||
|
|
acf1ae9771 | ||
|
|
42c6d6b52b | ||
|
|
32384c847f | ||
|
|
15b8f857f0 | ||
|
|
ef9862cbfb | ||
|
|
21251548a7 | ||
|
|
83fe413b96 | ||
|
|
9a018b41cd | ||
|
|
2804bedab6 | ||
|
|
934d159bc8 | ||
|
|
dc4327e883 | ||
|
|
0826958221 | ||
|
|
401f503d43 | ||
|
|
75c6bcb291 | ||
|
|
92c561af9b | ||
|
|
0a2f38b424 | ||
|
|
77d2bcc119 | ||
|
|
555d0538e8 | ||
|
|
4c619ecb6c | ||
|
|
9c74c887c3 | ||
|
|
33d7a02297 | ||
|
|
3dd2752b63 | ||
|
|
81b86c0798 | ||
|
|
d370205fda | ||
|
|
388e235d01 | ||
|
|
529fb33f3b | ||
|
|
45874fe1ce | ||
|
|
01334ea74e | ||
|
|
7f86e54675 | ||
|
|
b86368a49f | ||
|
|
63f88b66eb | ||
|
|
148673057d | ||
|
|
2ce875df79 | ||
|
|
9a705f6c85 | ||
|
|
8097f53aab | ||
|
|
e04aa38dc2 | ||
|
|
ba0e5bd131 | ||
|
|
0afd40f47c | ||
|
|
5124f3d1bc | ||
|
|
aa461b564d | ||
|
|
c68fed4fc5 | ||
|
|
6f7ffafdc7 | ||
|
|
2c3808ce77 | ||
|
|
7774d7d72a | ||
|
|
b3cd68bbb3 | ||
|
|
d69435c93f | ||
|
|
b052388050 | ||
|
|
39566519e4 | ||
|
|
2d08379f87 | ||
|
|
68a0332fce | ||
|
|
41f58d27db | ||
|
|
1047edd986 | ||
|
|
611401e2e1 | ||
|
|
853760b8c6 | ||
|
|
97d6604691 | ||
|
|
cfcd6005ff | ||
|
|
b06ef97ec8 | ||
|
|
e6e92a27b4 | ||
|
|
aeaf03a420 | ||
|
|
826f983fb0 | ||
|
|
12cbf0c0b8 | ||
|
|
66e70c8074 | ||
|
|
35eeeba9b4 | ||
|
|
eef37799b7 | ||
|
|
0c4e00bb1b | ||
|
|
45cb08e925 | ||
|
|
9a78e75466 | ||
|
|
7b656d4ad4 | ||
|
|
57ad585bed | ||
|
|
b5af6276e1 | ||
|
|
fe5231a665 | ||
|
|
450d2098e7 | ||
|
|
472d1ffab0 | ||
|
|
861b2a5f3b | ||
|
|
bdb360704b | ||
|
|
3b9c861269 | ||
|
|
90e2f4b6f5 | ||
|
|
d7b0c3b303 | ||
|
|
1dbbbbb085 | ||
|
|
a6a7627c90 | ||
|
|
20e9906d18 | ||
|
|
01dadf2d8d | ||
|
|
e524770fb7 | ||
|
|
8d7bae3792 | ||
|
|
5713718512 | ||
|
|
0a8f602644 | ||
|
|
128b2b7faa | ||
|
|
871b56ee42 | ||
|
|
6cd5308725 | ||
|
|
8cfe55b400 | ||
|
|
c49ba28bbf | ||
|
|
82112c79d6 | ||
|
|
d30dcf4db7 | ||
|
|
9fc096d2d5 | ||
|
|
8a6f967032 | ||
|
|
6a35a8b84a | ||
|
|
336427afda | ||
|
|
4444ca712a | ||
|
|
ba1f96a1fd | ||
|
|
697fd8b7c9 | ||
|
|
74951214e3 | ||
|
|
35c6e89b4a | ||
|
|
3aa19d366a | ||
|
|
b369779321 | ||
|
|
da923fa879 | ||
|
|
94952c0bd0 | ||
|
|
a4f012e5a6 | ||
|
|
5abf1dfb94 | ||
|
|
0ca7d1fe44 | ||
|
|
8083740804 | ||
|
|
fd68ad8a79 | ||
|
|
d4714b05eb | ||
|
|
48d76a734a | ||
|
|
9ce5ae8d95 | ||
|
|
0b9bc73521 | ||
|
|
d8b559d952 | ||
|
|
ee4d441543 | ||
|
|
e91d767186 | ||
|
|
3f0b06a642 | ||
|
|
4338c6a205 | ||
|
|
935fd58fd9 | ||
|
|
0d806f95ce | ||
|
|
01b7f35845 | ||
|
|
50194b30ae | ||
|
|
b0a3e92416 | ||
|
|
03bb490673 | ||
|
|
7e02ca947e | ||
|
|
592b4c71aa | ||
|
|
42b88df32f | ||
|
|
ab8bd45ca2 | ||
|
|
1a6a3f854c | ||
|
|
923a6de903 | ||
|
|
4861177900 | ||
|
|
ce36c4d507 | ||
|
|
f0655e785e | ||
|
|
af697e5715 | ||
|
|
8b06b0b302 | ||
|
|
72265c49c6 | ||
|
|
56a5adeb3a | ||
|
|
b339fcb309 | ||
|
|
b033558aeb | ||
|
|
8c83b52b1a | ||
|
|
cce5bfad82 | ||
|
|
0ae01581cc | ||
|
|
a02d7012be | ||
|
|
2a0d4555dc | ||
|
|
0b1acc13a8 | ||
|
|
9e9f53fd64 | ||
|
|
75c2b86e48 | ||
|
|
fad6109cf2 | ||
|
|
d888e59af2 | ||
|
|
8dd0cf7e58 | ||
|
|
cef988b078 | ||
|
|
0a327e3ae8 | ||
|
|
ac7ae6629a | ||
|
|
696f8a20be | ||
|
|
6f56046c2a | ||
|
|
72e8c0be62 | ||
|
|
f8c0288bb3 | ||
|
|
734c78f8fc | ||
|
|
7a916bd3da | ||
|
|
da5f1ac3ae | ||
|
|
80e1ee829f | ||
|
|
3874ab76cb | ||
|
|
058fb5334d | ||
|
|
da15ce73f0 | ||
|
|
6332196b27 | ||
|
|
7c5b04b39e | ||
|
|
86deb0a1c6 | ||
|
|
00f5d39114 | ||
|
|
1af69b9800 | ||
|
|
5670d93877 | ||
|
|
3bd40ae9c9 | ||
|
|
c4d9383d86 | ||
|
|
17cc5d1630 | ||
|
|
aa4f7d1ccc | ||
|
|
1ebb39ff67 | ||
|
|
1bfaaea8cb | ||
|
|
b5361468dd | ||
|
|
9a4cb75151 | ||
|
|
4d985b5521 | ||
|
|
1134f65cda | ||
|
|
daad07abbf | ||
|
|
f86f074a80 | ||
|
|
ebcc92c879 | ||
|
|
bbb33417ee | ||
|
|
a9e6e6c247 | ||
|
|
929a14cc84 | ||
|
|
134056883c | ||
|
|
f0bb4e3cdc | ||
|
|
8fafe75793 | ||
|
|
cc74eaf4c7 | ||
|
|
900f2bd306 | ||
|
|
f4c536cc87 | ||
|
|
f67af44f21 | ||
|
|
9a9736bdd2 | ||
|
|
8d919874a5 | ||
|
|
5ef6f7be3d | ||
|
|
77e95e28b9 | ||
|
|
38f240bb64 | ||
|
|
8bfcf68215 | ||
|
|
dd4db2427f | ||
|
|
c1b6b819ae | ||
|
|
fdfdf8039b | ||
|
|
665e36eddf | ||
|
|
c156dd8698 | ||
|
|
a5cdaae401 | ||
|
|
e5cd439383 | ||
|
|
4c7536ba51 | ||
|
|
9b36c27598 | ||
|
|
2fd34580f3 | ||
|
|
cf97a06610 | ||
|
|
9492e395ca | ||
|
|
c3f9a0ea75 | ||
|
|
0586987441 | ||
|
|
aa38e055e7 | ||
|
|
96bafc0e0d | ||
|
|
bd35c4091f | ||
|
|
7fee74a0c0 | ||
|
|
d0562dd3bf | ||
|
|
25e59997f5 | ||
|
|
b6a0e8730c | ||
|
|
20816b5a34 | ||
|
|
62bece4a2f | ||
|
|
9c5cb06bd0 | ||
|
|
c32c36a98f | ||
|
|
10a1d9125c | ||
|
|
1db1fbd9b4 | ||
|
|
8435180f13 | ||
|
|
3e677e3a34 | ||
|
|
6f4f252875 | ||
|
|
2f723a3c1b | ||
|
|
f6685729ae | ||
|
|
b9e7eb1d0b | ||
|
|
9b297cf76f | ||
|
|
ce2fe449cd | ||
|
|
fc082a8416 | ||
|
|
5b38f092d7 | ||
|
|
48a1ad5280 | ||
|
|
5e36b2f2e3 | ||
|
|
ded122806f | ||
|
|
fbf58ef698 | ||
|
|
f8339c53d8 | ||
|
|
1b83978ac4 | ||
|
|
110abfce03 | ||
|
|
71a04d2811 | ||
|
|
3bfd534700 | ||
|
|
110c959902 | ||
|
|
c5d0f10455 | ||
|
|
2a50c2bd7f | ||
|
|
36a2fee6e6 | ||
|
|
5a49cf0102 | ||
|
|
d383505b7c | ||
|
|
9ce4085a7b | ||
|
|
61631dc227 | ||
|
|
575c0f46ee | ||
|
|
2f810ef60f | ||
|
|
ca1be7b501 | ||
|
|
7336c8cb0e | ||
|
|
d8de1bcd91 | ||
|
|
733a288677 | ||
|
|
372f2b4e4d | ||
|
|
55879b3e32 | ||
|
|
67801791c5 | ||
|
|
ed90053a12 | ||
|
|
d75c3f9348 | ||
|
|
cba609effd | ||
|
|
0b82f77def | ||
|
|
ee6c78edd0 | ||
|
|
913e99364b | ||
|
|
e51e713564 | ||
|
|
98ec36da64 | ||
|
|
18cfb8ce75 | ||
|
|
e0fa631b99 | ||
|
|
f84e4e76a9 | ||
|
|
a1f7dd1bea | ||
|
|
0ee23be289 | ||
|
|
36d7cfd4eb | ||
|
|
b4db734ec6 | ||
|
|
a1a646e303 | ||
|
|
c508751bc3 | ||
|
|
98a654ab67 | ||
|
|
0f4a493aa9 | ||
|
|
cbe4af8eaa | ||
|
|
17796a682d | ||
|
|
ebf6c27aa3 | ||
|
|
7746efff3e | ||
|
|
4f0651b26b | ||
|
|
870c95c870 | ||
|
|
f3b6f9edb0 | ||
|
|
ebd3db90b0 | ||
|
|
9d7cac8acb | ||
|
|
55dec6e419 | ||
|
|
c847179be1 | ||
|
|
ecbef2ac9d | ||
|
|
341c22ac31 | ||
|
|
d2642f9601 | ||
|
|
1f5a2dbd65 | ||
|
|
9d9fd7e097 | ||
|
|
6efdb0fb9d | ||
|
|
30ed4bcc64 | ||
|
|
06f5ebf111 | ||
|
|
fb67971bfd | ||
|
|
c7535de719 | ||
|
|
d2617270bb | ||
|
|
7e37d8825c | ||
|
|
35e7b994ef | ||
|
|
3bb9011e2a | ||
|
|
cfcfe4a729 | ||
|
|
9be5808029 | ||
|
|
b612fbc02b | ||
|
|
6ba6999bb9 | ||
|
|
e787d72a2f | ||
|
|
8f2f359462 | ||
|
|
1ff8139f74 | ||
|
|
340b8721ac | ||
|
|
d8c8bb62bc | ||
|
|
39bda5f6b6 | ||
|
|
cf40198b22 | ||
|
|
ac31ded446 | ||
|
|
ba9567941d | ||
|
|
100b37b475 | ||
|
|
2b908305d0 | ||
|
|
9d29e64038 | ||
|
|
b5fcb44c64 | ||
|
|
602e121742 | ||
|
|
4bdaa3fa26 | ||
|
|
8973f7c184 | ||
|
|
21cbdc2059 | ||
|
|
43f7262bff | ||
|
|
4ae45b4e7e | ||
|
|
f4c6054acb | ||
|
|
6169cc2f5b | ||
|
|
817184951d | ||
|
|
cad1fbd31d | ||
|
|
648da4e85a | ||
|
|
71c586ec7b | ||
|
|
776c759de8 | ||
|
|
1ec72f0eef | ||
|
|
e061c9bbc4 | ||
|
|
dc03fb4d4e | ||
|
|
4db2c0619d | ||
|
|
9fe6e928f8 | ||
|
|
2003bb67bf | ||
|
|
3e64c39390 | ||
|
|
d0dae3b01a | ||
|
|
2e548e5838 | ||
|
|
475e662992 | ||
|
|
0b5998d4b2 | ||
|
|
185c78a0fe | ||
|
|
4c5a0a0050 | ||
|
|
316d711a9c | ||
|
|
dd43a3a57f | ||
|
|
5be95dc6f8 | ||
|
|
2bc4a1e601 | ||
|
|
6bddeabdb3 | ||
|
|
2db1e514e2 | ||
|
|
4b163c4835 | ||
|
|
f5c1261553 | ||
|
|
4a1e04fe46 | ||
|
|
a9c862a228 | ||
|
|
66a0641214 | ||
|
|
3647ce7bd9 | ||
|
|
ed34ef6f74 | ||
|
|
153b20cee5 | ||
|
|
1cb7b3c8e4 | ||
|
|
21b0c13b6b | ||
|
|
d4bcf75055 | ||
|
|
4a7cefa922 | ||
|
|
9b138191d9 | ||
|
|
c74a88c2b6 | ||
|
|
f035cd7415 | ||
|
|
816b23177d | ||
|
|
1d2b6bc3e1 | ||
|
|
8869a98597 | ||
|
|
4db07394a3 | ||
|
|
8f79c9d6f1 | ||
|
|
dd956e6cf7 | ||
|
|
e11dde4c97 | ||
|
|
517a811e08 | ||
|
|
84ecbcb772 | ||
|
|
8dacdf8241 | ||
|
|
9fcf9c004e | ||
|
|
4dcab272df | ||
|
|
55d25a19d5 | ||
|
|
6eae5d1ab2 | ||
|
|
7fcda07cc7 | ||
|
|
b2a4c7e7f5 | ||
|
|
7e21d71a04 | ||
|
|
1daaf3037b | ||
|
|
50b7f87854 | ||
|
|
0392b5e318 | ||
|
|
d793695dcc | ||
|
|
a604c1f558 | ||
|
|
ebcda315a5 | ||
|
|
17b7a5464d | ||
|
|
301166831a | ||
|
|
89e08bc2e7 | ||
|
|
95042e1a77 | ||
|
|
d60251703c | ||
|
|
8d971d7b2b | ||
|
|
a88ecb9936 | ||
|
|
b6a714f6c7 | ||
|
|
9d30b4fcd3 | ||
|
|
9fbeb61ff7 | ||
|
|
ea9af7d746 | ||
|
|
8a603c04d8 | ||
|
|
12edb30d20 | ||
|
|
9089fb8a41 | ||
|
|
e2cc19e8d5 | ||
|
|
27319e34b4 | ||
|
|
1fc76f1b60 | ||
|
|
020365fd55 | ||
|
|
348b19e54d | ||
|
|
588ba5acf1 | ||
|
|
1fba7da419 | ||
|
|
3711d09352 | ||
|
|
0fe740f847 | ||
|
|
925eb96882 | ||
|
|
5080520616 | ||
|
|
ac2a75fe41 | ||
|
|
627ded2ee7 | ||
|
|
10862abef2 | ||
|
|
566f8bc17a | ||
|
|
d108fe9d67 | ||
|
|
212e8a9d67 | ||
|
|
0d2d056d37 | ||
|
|
390eaef7b5 | ||
|
|
15b9b258ed | ||
|
|
c36b2c0fbf | ||
|
|
8ed0575796 | ||
|
|
b74b349230 | ||
|
|
499bba0324 | ||
|
|
fc4e07611a | ||
|
|
96389a2898 | ||
|
|
bcfe6881e0 | ||
|
|
2d0b0ef2e7 | ||
|
|
931745ff81 | ||
|
|
d6e9640d02 | ||
|
|
b6da4e8501 | ||
|
|
1660e425e7 | ||
|
|
4f47b0527a | ||
|
|
5e81689ede | ||
|
|
18410e9b38 | ||
|
|
f1a42eb6ab | ||
|
|
ba1543e3e8 | ||
|
|
493d9123fd | ||
|
|
3b11fd1d7e | ||
|
|
01c49c9b1e | ||
|
|
c69de6b3ec | ||
|
|
3bef4d1b4e | ||
|
|
2873dcc4e4 | ||
|
|
8c5130fd02 | ||
|
|
f19672a398 | ||
|
|
d186767b58 | ||
|
|
6a9cb8d095 | ||
|
|
f29cb1c69e | ||
|
|
f2b1de2e5c | ||
|
|
b7a8f23475 | ||
|
|
a48c099ffa | ||
|
|
a68004ad8b | ||
|
|
1fd521ab27 | ||
|
|
9c44a813ea | ||
|
|
3ef666ba8d | ||
|
|
29a81e1dd6 | ||
|
|
5d3d9d4f37 | ||
|
|
1e86a4fb13 | ||
|
|
a933176241 | ||
|
|
3fc4dc3725 | ||
|
|
207dd6f46b | ||
|
|
3411f7f066 | ||
|
|
cfa03a6622 | ||
|
|
a1aae0da52 | ||
|
|
9e36331621 | ||
|
|
4c9034ad10 | ||
|
|
55184e917f | ||
|
|
6bc6089d2f | ||
|
|
5000b2a90c | ||
|
|
7845b34b2b | ||
|
|
cea8aea3c0 | ||
|
|
6b6297e061 | ||
|
|
24ce1c2b98 | ||
|
|
f791b6bd62 | ||
|
|
44f5b9f0a3 | ||
|
|
20d93f317d | ||
|
|
5367cecd5f | ||
|
|
841d452928 | ||
|
|
033393fc20 | ||
|
|
804267ae4b | ||
|
|
a503ec33ba | ||
|
|
882ea23372 | ||
|
|
491de33f3d | ||
|
|
81a2b874b9 | ||
|
|
28a3e0f7ce | ||
|
|
23bc156a07 | ||
|
|
fdc161c6d4 | ||
|
|
f5b87517c6 | ||
|
|
1224aa6d87 | ||
|
|
567210270a | ||
|
|
ff5d38644c | ||
|
|
06e95223be | ||
|
|
501dbdb13c | ||
|
|
23abd2a826 | ||
|
|
dd4d374552 | ||
|
|
8d427de1e3 | ||
|
|
3c8f8a00ae | ||
|
|
15bed6b4e5 | ||
|
|
fe0c4a35cf | ||
|
|
5536960871 | ||
|
|
1b882989de | ||
|
|
bfb83d7f1a | ||
|
|
672a16168c | ||
|
|
9654b36f77 | ||
|
|
f92e556b7c | ||
|
|
c9dabd9a53 | ||
|
|
bbee653c29 | ||
|
|
8eee576d7c | ||
|
|
4f29b6fb8c | ||
|
|
9802391cc8 | ||
|
|
d737b56470 | ||
|
|
b035f500dd | ||
|
|
adda12a2ef | ||
|
|
769f8c298a | ||
|
|
dd1071366d | ||
|
|
bc8fd3346a | ||
|
|
91ddc55d5b | ||
|
|
2b21208b07 | ||
|
|
aa4d874b9e | ||
|
|
53ca25ef79 | ||
|
|
529f6d4248 | ||
|
|
a7414e69a7 | ||
|
|
82116771c7 | ||
|
|
a4c22f0c06 | ||
|
|
b189d4ce97 | ||
|
|
41bebe8e12 | ||
|
|
7352306deb | ||
|
|
7c1b09c823 | ||
|
|
5657943b73 | ||
|
|
3253586096 | ||
|
|
6602b8ac36 | ||
|
|
cde2647587 | ||
|
|
34151c8193 | ||
|
|
84204d7b59 | ||
|
|
3973798a99 | ||
|
|
bc26a57d7c | ||
|
|
6c86472f57 | ||
|
|
e6601b549c | ||
|
|
5040b71173 | ||
|
|
1076bdc348 | ||
|
|
559cfcb427 | ||
|
|
f66032b1b6 | ||
|
|
2ebd4be0d8 | ||
|
|
4f64762ffc | ||
|
|
8cdc0ac9c0 | ||
|
|
42c1e16d3a | ||
|
|
14dbbcec41 | ||
|
|
9483e8a736 | ||
|
|
4763e4cbff | ||
|
|
095569969b | ||
|
|
ea7dadeb67 | ||
|
|
45e55d58e2 | ||
|
|
91de162fd5 | ||
|
|
73b5464d1a | ||
|
|
ba713d2fdb | ||
|
|
cce19f01b3 | ||
|
|
db31624fd7 | ||
|
|
d3a37e052b | ||
|
|
60837a0368 | ||
|
|
37107ddc9a | ||
|
|
809ce879c0 | ||
|
|
0981262132 | ||
|
|
d6c29ace51 | ||
|
|
97e6db13f2 | ||
|
|
9213e8acda | ||
|
|
51e2951dee | ||
|
|
14a3a0205d | ||
|
|
7e0f5f1a56 | ||
|
|
68a3f51dff | ||
|
|
3902a7da62 | ||
|
|
08049e2e05 | ||
|
|
26b9d64b61 | ||
|
|
cd470813da | ||
|
|
49a2a645c8 | ||
|
|
b35e7e7411 | ||
|
|
8ebd5b91ec | ||
|
|
1478009c22 | ||
|
|
b6dadac9f5 | ||
|
|
a1e5ba0b26 | ||
|
|
8b306e657b | ||
|
|
b0593c1f33 | ||
|
|
9e22ad34d2 | ||
|
|
bc0b06721a | ||
|
|
bde309850e | ||
|
|
b67e683f38 | ||
|
|
a09abbcad4 | ||
|
|
c05405e193 | ||
|
|
c97edc61b5 | ||
|
|
04f457550e | ||
|
|
0cf8c73602 | ||
|
|
013061a6a3 | ||
|
|
c51743153d | ||
|
|
0f10a7bcda | ||
|
|
f421eee664 | ||
|
|
1773cfc817 | ||
|
|
0d92683420 | ||
|
|
9964d0e4fd | ||
|
|
5f48a289d5 | ||
|
|
554170e3b4 | ||
|
|
66557d79bb | ||
|
|
f165778e55 | ||
|
|
b0a88b377c | ||
|
|
c90ca1b859 | ||
|
|
0c4f9dcd62 | ||
|
|
09c3de40cc | ||
|
|
03def6c052 | ||
|
|
cc8e0b8e4a | ||
|
|
e0e5d03949 | ||
|
|
9889a3b3d0 | ||
|
|
eb48779827 | ||
|
|
2a25bfcee4 | ||
|
|
1248c46295 | ||
|
|
c1ba650ec4 | ||
|
|
b2fe453993 | ||
|
|
594534250d | ||
|
|
d24bb92dea | ||
|
|
5a295017ec | ||
|
|
e59e7616c7 | ||
|
|
60b1859317 | ||
|
|
befcceefd0 | ||
|
|
930c2eb90a | ||
|
|
22150f5fd6 | ||
|
|
6d92cfd0b8 | ||
|
|
5682d00bf3 | ||
|
|
425b54e6f3 | ||
|
|
3714ed7fa6 | ||
|
|
f1dbdc58f6 | ||
|
|
676ac019ab | ||
|
|
2055271732 | ||
|
|
99f677652b | ||
|
|
4af632dfa5 | ||
|
|
270532221c | ||
|
|
a5ba36ad65 | ||
|
|
9b3c14862b | ||
|
|
08279a03e3 | ||
|
|
a5e26ac2ab | ||
|
|
f3736dc6b9 | ||
|
|
c8d8daa334 | ||
|
|
7e16fd0eda | ||
|
|
fb9f3962b8 | ||
|
|
c2b39a0965 | ||
|
|
8064465322 | ||
|
|
05ed90e2a2 | ||
|
|
9717d06a55 | ||
|
|
f8d345dc17 | ||
|
|
cba4f154c6 | ||
|
|
0962246f03 | ||
|
|
0915a19f48 | ||
|
|
719b3a2630 | ||
|
|
6e266cfbcd | ||
|
|
b954d26d6d | ||
|
|
83c003cba9 | ||
|
|
264d6fa3c4 | ||
|
|
9837b7ff28 | ||
|
|
0ac9896e7c | ||
|
|
2d38d38c95 | ||
|
|
b6b736baa2 | ||
|
|
6f76fc4612 | ||
|
|
1f30e8ccac | ||
|
|
002e254f18 | ||
|
|
676d2858f5 | ||
|
|
a5321ae623 | ||
|
|
c6b4823574 | ||
|
|
35ccd93cb0 | ||
|
|
a75cb9cd62 | ||
|
|
7d75703825 | ||
|
|
97437870ca | ||
|
|
b1663954fe | ||
|
|
9c280f896f | ||
|
|
b190c0fff5 | ||
|
|
1f85f6d5db | ||
|
|
7d19ad2e83 | ||
|
|
d0e256f0eb | ||
|
|
d3f33b144a | ||
|
|
a49a033408 | ||
|
|
417fc70572 | ||
|
|
468b690f9f | ||
|
|
6827853915 | ||
|
|
4dd2f5c96c | ||
|
|
4119c17abe | ||
|
|
20d5c5bfd6 | ||
|
|
c7c47a935d | ||
|
|
9d1d47a591 | ||
|
|
6ba3544fa7 | ||
|
|
82e9193180 | ||
|
|
74f7812778 | ||
|
|
ea35eb19ee | ||
|
|
d6edca4d01 | ||
|
|
694258813a | ||
|
|
9c873db26c | ||
|
|
3cdaece9cd | ||
|
|
4d68d8d842 | ||
|
|
14cd7e02ee | ||
|
|
b276eff149 | ||
|
|
a3bb086e5a | ||
|
|
55633bbd33 | ||
|
|
edde07a21f | ||
|
|
c2c2285136 | ||
|
|
38db333353 | ||
|
|
a604ac647a | ||
|
|
ea6f43658a | ||
|
|
d3ed44132d | ||
|
|
33cc1160cd | ||
|
|
61962e841f | ||
|
|
e7386ebce5 | ||
|
|
349c0c9244 | ||
|
|
0d11148da4 | ||
|
|
d09b641db3 | ||
|
|
e5babe0c7c | ||
|
|
150e79a814 | ||
|
|
133d0d93da | ||
|
|
5a3f30ca0e | ||
|
|
82ccf3da37 | ||
|
|
1ae05ffddf | ||
|
|
b257d1e92b | ||
|
|
1fcae7b182 | ||
|
|
10b543fd0f | ||
|
|
719add7e13 | ||
|
|
d137549694 | ||
|
|
b60f412d6f | ||
|
|
681b2aef28 | ||
|
|
1c746c53a7 | ||
|
|
0d78192acb | ||
|
|
103c6abbdc | ||
|
|
797cdd8308 | ||
|
|
3bf077fe2d | ||
|
|
b0ca5dc638 | ||
|
|
0be4c893e2 | ||
|
|
712af5ddb2 | ||
|
|
21fe658968 | ||
|
|
8a1cfb3a46 | ||
|
|
b47a93bed6 | ||
|
|
4d0efbc1c4 | ||
|
|
abaa83eee7 | ||
|
|
657059aae4 | ||
|
|
0257687b2d | ||
|
|
41ccd6bbc9 | ||
|
|
06d51b2bd4 | ||
|
|
d422f772aa | ||
|
|
80964bc4f3 | ||
|
|
bd2efa8e7f | ||
|
|
7c14fd7cb1 | ||
|
|
c495fdcf99 | ||
|
|
9d8ab51657 | ||
|
|
52c63854d5 | ||
|
|
5e68fa683c | ||
|
|
737086b30b | ||
|
|
4df3eabaf9 | ||
|
|
3b231f2841 | ||
|
|
3ec770b56c | ||
|
|
ae9dd8f441 | ||
|
|
0f52271757 | ||
|
|
2f85a6a966 | ||
|
|
2b4f6dd4cb | ||
|
|
525d802ee3 | ||
|
|
fb7bfdbc4e | ||
|
|
a3d66c3ccd | ||
|
|
bc7759786b | ||
|
|
c0d1a4fc9e | ||
|
|
e019a2ab77 | ||
|
|
b239630f7b | ||
|
|
2ed971a458 | ||
|
|
ddfc2217fd | ||
|
|
183f2486e2 | ||
|
|
01e9ee8c2e | ||
|
|
a0c63e70e4 | ||
|
|
afee7770df | ||
|
|
47a5c69c26 | ||
|
|
5a97704d28 | ||
|
|
dd8cc832cd | ||
|
|
f238309319 | ||
|
|
26c135cdce | ||
|
|
5f0de768c3 | ||
|
|
94738e65dd | ||
|
|
75c30279cc | ||
|
|
5e5ac5dab9 | ||
|
|
8c8db8ecf8 | ||
|
|
de8470fe02 | ||
|
|
f7ea829fb8 | ||
|
|
23b3e79299 | ||
|
|
036205fa44 | ||
|
|
8cde1663c5 | ||
|
|
3786f53dc8 | ||
|
|
c545968ff6 | ||
|
|
b90aaf4375 | ||
|
|
8b86db4777 | ||
|
|
dab9978ba6 | ||
|
|
d1ce432c65 |
501
.circleci/config.yml
Normal file
501
.circleci/config.yml
Normal file
@@ -0,0 +1,501 @@
|
||||
version: 2
|
||||
jobs:
|
||||
install:
|
||||
docker:
|
||||
- image: circleci/node:10
|
||||
working_directory: ~/repo
|
||||
environment:
|
||||
GOPATH: $HOME/go
|
||||
steps:
|
||||
- checkout
|
||||
- restore_cache:
|
||||
keys:
|
||||
- v1-dependencies-{{ checksum "yarn.lock" }}
|
||||
# fallback to using the latest cache if no exact match is found
|
||||
- v1-dependencies-
|
||||
- run:
|
||||
name: Updating apt packages
|
||||
command: sudo apt-get update
|
||||
- run:
|
||||
name: Installing the latest version of Go
|
||||
command: sudo apt-get install golang-go
|
||||
- run:
|
||||
name: Installing Dependencies
|
||||
command: yarn install --check-files --frozen-lockfile
|
||||
- save_cache:
|
||||
paths:
|
||||
- node_modules
|
||||
- packages/gatsby-plugin-now/node_modules
|
||||
- packages/now-build-utils/node_modules
|
||||
- packages/now-cgi/node_modules
|
||||
- packages/now-cli/node_modules
|
||||
- packages/now-client/node_modules
|
||||
- packages/now-go/node_modules
|
||||
- packages/now-next/node_modules
|
||||
- packages/now-node/node_modules
|
||||
- packages/now-node-bridge/node_modules
|
||||
- packages/now-python/node_modules
|
||||
- packages/now-routing-utils/node_modules
|
||||
- packages/now-ruby/node_modules
|
||||
- packages/now-static-build/node_modules
|
||||
key: v1-dependencies-{{ checksum "yarn.lock" }}
|
||||
- persist_to_workspace:
|
||||
root: .
|
||||
paths:
|
||||
- node_modules
|
||||
- packages/gatsby-plugin-now/node_modules
|
||||
- packages/now-build-utils/node_modules
|
||||
- packages/now-cgi/node_modules
|
||||
- packages/now-cli/node_modules
|
||||
- packages/now-client/node_modules
|
||||
- packages/now-go/node_modules
|
||||
- packages/now-next/node_modules
|
||||
- packages/now-node/node_modules
|
||||
- packages/now-node-bridge/node_modules
|
||||
- packages/now-python/node_modules
|
||||
- packages/now-routing-utils/node_modules
|
||||
- packages/now-ruby/node_modules
|
||||
- packages/now-static-build/node_modules
|
||||
|
||||
build:
|
||||
docker:
|
||||
- image: circleci/node:10
|
||||
working_directory: ~/repo
|
||||
steps:
|
||||
- checkout
|
||||
- attach_workspace:
|
||||
at: .
|
||||
- run:
|
||||
name: Linking dependencies
|
||||
command: yarn bootstrap
|
||||
- run:
|
||||
name: Building
|
||||
command: yarn build
|
||||
- store_artifacts:
|
||||
path: packages/now-cli/dist
|
||||
- persist_to_workspace:
|
||||
root: .
|
||||
paths:
|
||||
- packages/gatsby-plugin-now/test/fixtures
|
||||
- packages/now-build-utils/dist
|
||||
- packages/now-cgi/dist
|
||||
- packages/now-cli/dist
|
||||
- packages/now-cli/assets
|
||||
- packages/now-client/dist
|
||||
- packages/now-go/dist
|
||||
- packages/now-next/dist
|
||||
- packages/now-node/dist
|
||||
- packages/now-node/test/fixtures/15-helpers/ts/types.d.ts
|
||||
- packages/now-node/test/fixtures/11-symlinks/symlink
|
||||
- packages/now-node-bridge/index.js
|
||||
- packages/now-node-bridge/bridge.js
|
||||
- packages/now-python/dist
|
||||
- packages/now-routing-utils/dist
|
||||
- packages/now-ruby/dist
|
||||
- packages/now-static-build/dist
|
||||
- packages/now-static-build/test/fixtures/10a-gatsby-redirects/plugins
|
||||
|
||||
test-lint:
|
||||
docker:
|
||||
- image: circleci/node:10
|
||||
working_directory: ~/repo
|
||||
steps:
|
||||
- checkout
|
||||
- attach_workspace:
|
||||
at: .
|
||||
- run:
|
||||
name: Compiling `now dev` HTML error templates
|
||||
command: node packages/now-cli/scripts/compile-templates.js
|
||||
- run:
|
||||
name: Linting Code
|
||||
command: yarn test-lint
|
||||
|
||||
test-integration-macos-node-8:
|
||||
macos:
|
||||
xcode: '9.0.1'
|
||||
working_directory: ~/repo
|
||||
steps:
|
||||
- checkout
|
||||
- attach_workspace:
|
||||
at: .
|
||||
- run:
|
||||
name: Output version
|
||||
command: node --version
|
||||
- run:
|
||||
name: Running Integration Tests
|
||||
command: yarn test-integration --clean false
|
||||
|
||||
test-integration-macos-node-10:
|
||||
macos:
|
||||
xcode: '10.0.0'
|
||||
working_directory: ~/repo
|
||||
steps:
|
||||
- checkout
|
||||
- attach_workspace:
|
||||
at: .
|
||||
- run:
|
||||
name: Output version
|
||||
command: node --version
|
||||
- run:
|
||||
name: Running Integration Tests
|
||||
command: yarn test-integration --clean false
|
||||
|
||||
test-integration-macos-node-12:
|
||||
macos:
|
||||
xcode: '10.3.0'
|
||||
working_directory: ~/repo
|
||||
steps:
|
||||
- checkout
|
||||
- attach_workspace:
|
||||
at: .
|
||||
- run:
|
||||
name: Output version
|
||||
command: node --version
|
||||
- run:
|
||||
name: Running Integration Tests
|
||||
command: yarn test-integration --clean false
|
||||
|
||||
test-integration-linux-node-8:
|
||||
docker:
|
||||
- image: circleci/node:8
|
||||
working_directory: ~/repo
|
||||
steps:
|
||||
- checkout
|
||||
- attach_workspace:
|
||||
at: .
|
||||
- run:
|
||||
name: Output version
|
||||
command: node --version
|
||||
- run:
|
||||
name: Running Integration Tests
|
||||
command: yarn test-integration --clean false
|
||||
|
||||
test-integration-linux-node-10:
|
||||
docker:
|
||||
- image: circleci/node:10
|
||||
working_directory: ~/repo
|
||||
steps:
|
||||
- checkout
|
||||
- attach_workspace:
|
||||
at: .
|
||||
- run:
|
||||
name: Output version
|
||||
command: node --version
|
||||
- run:
|
||||
name: Running Integration Tests
|
||||
command: yarn test-integration --clean false
|
||||
|
||||
test-integration-linux-node-12:
|
||||
docker:
|
||||
- image: circleci/node:12
|
||||
working_directory: ~/repo
|
||||
steps:
|
||||
- checkout
|
||||
- attach_workspace:
|
||||
at: .
|
||||
- run:
|
||||
name: Output version
|
||||
command: node --version
|
||||
- run:
|
||||
name: Running Integration Tests
|
||||
command: yarn test-integration --clean false
|
||||
|
||||
test-integration-macos-now-dev-node-8:
|
||||
macos:
|
||||
xcode: '9.0.1'
|
||||
working_directory: ~/repo
|
||||
steps:
|
||||
- checkout
|
||||
- attach_workspace:
|
||||
at: .
|
||||
- run:
|
||||
name: Output version
|
||||
command: node --version
|
||||
- run:
|
||||
name: Downloading Hugo
|
||||
command: curl -L -O https://github.com/gohugoio/hugo/releases/download/v0.56.0/hugo_0.56.0_macOS-64bit.tar.gz && tar -xzf hugo_0.56.0_macOS-64bit.tar.gz && mv ./hugo packages/now-cli/test/dev/fixtures/08-hugo/
|
||||
- run:
|
||||
name: Running Integration Tests for `now dev`
|
||||
command: yarn test-integration-now-dev --clean false
|
||||
|
||||
test-integration-macos-now-dev-node-10:
|
||||
macos:
|
||||
xcode: '10.0.0'
|
||||
working_directory: ~/repo
|
||||
steps:
|
||||
- checkout
|
||||
- attach_workspace:
|
||||
at: .
|
||||
- run:
|
||||
name: Output version
|
||||
command: node --version
|
||||
- run:
|
||||
name: Downloading Hugo
|
||||
command: curl -L -O https://github.com/gohugoio/hugo/releases/download/v0.56.0/hugo_0.56.0_macOS-64bit.tar.gz && tar -xzf hugo_0.56.0_macOS-64bit.tar.gz && mv ./hugo packages/now-cli/test/dev/fixtures/08-hugo/
|
||||
- run:
|
||||
name: Running Integration Tests for `now dev`
|
||||
command: yarn test-integration-now-dev --clean false
|
||||
|
||||
test-integration-macos-now-dev-node-12:
|
||||
macos:
|
||||
xcode: '10.3.0'
|
||||
working_directory: ~/repo
|
||||
steps:
|
||||
- checkout
|
||||
- attach_workspace:
|
||||
at: .
|
||||
- run:
|
||||
name: Output version
|
||||
command: node --version
|
||||
- run:
|
||||
name: Downloading Hugo
|
||||
command: curl -L -O https://github.com/gohugoio/hugo/releases/download/v0.56.0/hugo_0.56.0_macOS-64bit.tar.gz && tar -xzf hugo_0.56.0_macOS-64bit.tar.gz && mv ./hugo packages/now-cli/test/dev/fixtures/08-hugo/
|
||||
- run:
|
||||
name: Running Integration Tests for `now dev`
|
||||
command: yarn test-integration-now-dev --clean false
|
||||
|
||||
test-integration-linux-now-dev-node-8:
|
||||
docker:
|
||||
- image: circleci/node:8
|
||||
working_directory: ~/repo
|
||||
steps:
|
||||
- checkout
|
||||
- attach_workspace:
|
||||
at: .
|
||||
- run:
|
||||
name: Output version
|
||||
command: node --version
|
||||
- run:
|
||||
name: Downloading Hugo
|
||||
command: curl -L -O https://github.com/gohugoio/hugo/releases/download/v0.55.6/hugo_0.55.6_Linux-64bit.tar.gz && tar -xzf hugo_0.55.6_Linux-64bit.tar.gz && mv ./hugo packages/now-cli/test/dev/fixtures/08-hugo/
|
||||
- run:
|
||||
name: Running Integration Tests for `now dev`
|
||||
command: yarn test-integration-now-dev --clean false
|
||||
|
||||
test-integration-linux-now-dev-node-10:
|
||||
docker:
|
||||
- image: circleci/node:10
|
||||
working_directory: ~/repo
|
||||
steps:
|
||||
- checkout
|
||||
- attach_workspace:
|
||||
at: .
|
||||
- run:
|
||||
name: Output version
|
||||
command: node --version
|
||||
- run:
|
||||
name: Downloading Hugo
|
||||
command: curl -L -O https://github.com/gohugoio/hugo/releases/download/v0.55.6/hugo_0.55.6_Linux-64bit.tar.gz && tar -xzf hugo_0.55.6_Linux-64bit.tar.gz && mv ./hugo packages/now-cli/test/dev/fixtures/08-hugo/
|
||||
- run:
|
||||
name: Running Integration Tests for `now dev`
|
||||
command: yarn test-integration-now-dev --clean false
|
||||
|
||||
test-integration-linux-now-dev-node-12:
|
||||
docker:
|
||||
- image: circleci/node:12
|
||||
working_directory: ~/repo
|
||||
steps:
|
||||
- checkout
|
||||
- attach_workspace:
|
||||
at: .
|
||||
- run:
|
||||
name: Output version
|
||||
command: node --version
|
||||
- run:
|
||||
name: Downloading Hugo
|
||||
command: curl -L -O https://github.com/gohugoio/hugo/releases/download/v0.55.6/hugo_0.55.6_Linux-64bit.tar.gz && tar -xzf hugo_0.55.6_Linux-64bit.tar.gz && mv ./hugo packages/now-cli/test/dev/fixtures/08-hugo/
|
||||
- run:
|
||||
name: Running Integration Tests for `now dev`
|
||||
command: yarn test-integration-now-dev --clean false
|
||||
|
||||
test-integration-once:
|
||||
docker:
|
||||
- image: circleci/node:10
|
||||
working_directory: ~/repo
|
||||
steps:
|
||||
- checkout
|
||||
- attach_workspace:
|
||||
at: .
|
||||
- run:
|
||||
name: Output version
|
||||
command: node --version
|
||||
- run:
|
||||
name: Running Integration Tests Once
|
||||
command: yarn test-integration-once --clean false
|
||||
|
||||
test-unit:
|
||||
docker:
|
||||
- image: circleci/node:10
|
||||
working_directory: ~/repo
|
||||
steps:
|
||||
- checkout
|
||||
- attach_workspace:
|
||||
at: .
|
||||
- run:
|
||||
name: Compiling `now dev` HTML error templates
|
||||
command: node packages/now-cli/scripts/compile-templates.js
|
||||
- run:
|
||||
name: Output version
|
||||
command: node --version
|
||||
- run:
|
||||
name: Running Unit Tests
|
||||
command: yarn test-unit --clean false
|
||||
- persist_to_workspace:
|
||||
root: .
|
||||
paths:
|
||||
- packages/now-cli/.nyc_output
|
||||
|
||||
coverage:
|
||||
docker:
|
||||
- image: circleci/node:10
|
||||
working_directory: ~/repo
|
||||
steps:
|
||||
- checkout
|
||||
- attach_workspace:
|
||||
at: .
|
||||
- run:
|
||||
name: Run coverage report
|
||||
command: yarn workspace now run coverage
|
||||
|
||||
source-maps:
|
||||
docker:
|
||||
- image: circleci/node:10
|
||||
working_directory: ~/repo
|
||||
steps:
|
||||
- checkout
|
||||
- attach_workspace:
|
||||
at: .
|
||||
- run:
|
||||
name: Installing Sentry CLI
|
||||
command: npm install -g @sentry/cli
|
||||
- run:
|
||||
name: Creating a New Sentry Release
|
||||
command: sentry-cli releases new now-cli@`git describe --tags`
|
||||
- run:
|
||||
name: Upload Sourcemap Files
|
||||
command: sentry-cli releases files now-cli@`git describe --tags` upload-sourcemaps ./dist
|
||||
- run:
|
||||
name: Finalize Sentry Release
|
||||
command: sentry-cli releases finalize now-cli@`git describe --tags`
|
||||
|
||||
workflows:
|
||||
version: 2
|
||||
unscheduled:
|
||||
jobs:
|
||||
- install:
|
||||
filters:
|
||||
tags:
|
||||
only: /.*/
|
||||
- build:
|
||||
requires:
|
||||
- install
|
||||
filters:
|
||||
tags:
|
||||
only: /.*/
|
||||
- test-lint:
|
||||
requires:
|
||||
- build
|
||||
filters:
|
||||
tags:
|
||||
only: /.*/
|
||||
- test-integration-macos-node-8:
|
||||
requires:
|
||||
- build
|
||||
filters:
|
||||
tags:
|
||||
only: /.*/
|
||||
- test-integration-macos-node-10:
|
||||
requires:
|
||||
- build
|
||||
filters:
|
||||
tags:
|
||||
only: /.*/
|
||||
- test-integration-macos-node-12:
|
||||
requires:
|
||||
- build
|
||||
filters:
|
||||
tags:
|
||||
only: /.*/
|
||||
- test-integration-linux-node-8:
|
||||
requires:
|
||||
- build
|
||||
filters:
|
||||
tags:
|
||||
only: /.*/
|
||||
- test-integration-linux-node-10:
|
||||
requires:
|
||||
- build
|
||||
filters:
|
||||
tags:
|
||||
only: /.*/
|
||||
- test-integration-linux-node-12:
|
||||
requires:
|
||||
- build
|
||||
filters:
|
||||
tags:
|
||||
only: /.*/
|
||||
- test-integration-macos-now-dev-node-8:
|
||||
requires:
|
||||
- build
|
||||
filters:
|
||||
tags:
|
||||
only: /.*/
|
||||
- test-integration-macos-now-dev-node-10:
|
||||
requires:
|
||||
- build
|
||||
filters:
|
||||
tags:
|
||||
only: /.*/
|
||||
- test-integration-macos-now-dev-node-12:
|
||||
requires:
|
||||
- build
|
||||
filters:
|
||||
tags:
|
||||
only: /.*/
|
||||
- test-integration-linux-now-dev-node-8:
|
||||
requires:
|
||||
- build
|
||||
filters:
|
||||
tags:
|
||||
only: /.*/
|
||||
- test-integration-linux-now-dev-node-10:
|
||||
requires:
|
||||
- build
|
||||
filters:
|
||||
tags:
|
||||
only: /.*/
|
||||
- test-integration-linux-now-dev-node-12:
|
||||
requires:
|
||||
- build
|
||||
filters:
|
||||
tags:
|
||||
only: /.*/
|
||||
- test-integration-once:
|
||||
requires:
|
||||
- build
|
||||
- test-unit:
|
||||
requires:
|
||||
- build
|
||||
filters:
|
||||
tags:
|
||||
only: /.*/
|
||||
- coverage:
|
||||
requires:
|
||||
- test-integration-macos-node-8
|
||||
- test-integration-macos-node-10
|
||||
- test-integration-macos-node-12
|
||||
- test-integration-linux-node-8
|
||||
- test-integration-linux-node-10
|
||||
- test-integration-linux-node-12
|
||||
- test-integration-macos-now-dev-node-8
|
||||
- test-integration-macos-now-dev-node-10
|
||||
- test-integration-macos-now-dev-node-12
|
||||
- test-integration-linux-now-dev-node-8
|
||||
- test-integration-linux-now-dev-node-10
|
||||
- test-integration-linux-now-dev-node-12
|
||||
- test-integration-once
|
||||
- test-unit
|
||||
- test-lint
|
||||
filters:
|
||||
tags:
|
||||
only: /.*/
|
||||
34
.circleci/publish.sh
Executable file
34
.circleci/publish.sh
Executable file
@@ -0,0 +1,34 @@
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
if [ -z "$NPM_TOKEN" ]; then
|
||||
echo "NPM_TOKEN not found. Did you forget to assign the GitHub Action secret?"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc
|
||||
|
||||
if [ ! -e ~/.npmrc ]; then
|
||||
echo "~/.npmrc file does not exist, skipping publish"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
npm_tag=""
|
||||
tag="$(git describe --tags --exact-match 2> /dev/null || :)"
|
||||
|
||||
if [ -z "$tag" ]; then
|
||||
echo "Not a tagged commit, skipping publish"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [[ "$tag" =~ -canary ]]; then
|
||||
echo "Publishing canary release"
|
||||
npm_tag="--npm-tag canary"
|
||||
else
|
||||
echo "Publishing stable release"
|
||||
fi
|
||||
|
||||
# Sometimes this is a false alarm and blocks publish
|
||||
git checkout yarn.lock
|
||||
|
||||
yarn run lerna publish from-git $npm_tag --yes
|
||||
37
.editorconfig
Normal file
37
.editorconfig
Normal file
@@ -0,0 +1,37 @@
|
||||
root = true
|
||||
|
||||
[*]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
tab_width = 2
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
|
||||
[{*.json,*.json.example,*.gyp,*.yml,*.yaml}]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
[{*.py,*.asm}]
|
||||
indent_style = space
|
||||
|
||||
[*.py]
|
||||
indent_size = 4
|
||||
|
||||
[*.asm]
|
||||
indent_size = 8
|
||||
|
||||
[*.md]
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
# Ideal settings - some plugins might support these.
|
||||
[*.js]
|
||||
quote_type = single
|
||||
|
||||
[{*.c,*.cc,*.h,*.hh,*.cpp,*.hpp,*.m,*.mm,*.mpp,*.js,*.java,*.go,*.rs,*.php,*.ng,*.jsx,*.ts,*.d,*.cs,*.swift}]
|
||||
curly_bracket_next_line = false
|
||||
spaces_around_operators = true
|
||||
spaces_around_brackets = outside
|
||||
# close enough to 1TB
|
||||
indent_brace_style = K&R
|
||||
36
.eslintignore
Normal file
36
.eslintignore
Normal file
@@ -0,0 +1,36 @@
|
||||
node_modules
|
||||
dist
|
||||
examples
|
||||
|
||||
# gatsby-plugin-now
|
||||
packages/gatsby-plugin-now/test/fixtures
|
||||
|
||||
# now-build-utils
|
||||
packages/now-build-utils/test/fixtures
|
||||
|
||||
# now-cli
|
||||
packages/now-cli/@types
|
||||
packages/now-cli/download
|
||||
packages/now-cli/dist
|
||||
packages/now-cli/test/fixtures
|
||||
packages/now-cli/test/dev/fixtures
|
||||
packages/now-cli/bin
|
||||
packages/now-cli/link
|
||||
packages/now-cli/src/util/dev/templates/*.ts
|
||||
|
||||
# now-client
|
||||
packages/now-client/tests/fixtures
|
||||
packages/now-client/lib
|
||||
|
||||
# now-next
|
||||
packages/now-next/test/fixtures
|
||||
|
||||
# now-node
|
||||
packages/now-node/src/bridge.ts
|
||||
packages/now-node/test/fixtures
|
||||
|
||||
# now-node-bridge
|
||||
packages/now-node-bridge/bridge.*
|
||||
|
||||
# now-static-build
|
||||
packages/now-static-build/test/fixtures
|
||||
64
.eslintrc.json
Normal file
64
.eslintrc.json
Normal file
@@ -0,0 +1,64 @@
|
||||
{
|
||||
"root": true,
|
||||
"parser": "@typescript-eslint/parser",
|
||||
"parserOptions": {
|
||||
"ecmaVersion": 2018,
|
||||
"sourceType": "module",
|
||||
"modules": true
|
||||
},
|
||||
"extends": [
|
||||
"eslint:recommended",
|
||||
"plugin:@typescript-eslint/eslint-recommended",
|
||||
"plugin:@typescript-eslint/recommended",
|
||||
"prettier",
|
||||
"prettier/@typescript-eslint"
|
||||
],
|
||||
"env": {
|
||||
"node": true,
|
||||
"jest": true,
|
||||
"es6": true
|
||||
},
|
||||
"rules": {
|
||||
"require-atomic-updates": 0,
|
||||
"@typescript-eslint/ban-ts-ignore": 0,
|
||||
"@typescript-eslint/camelcase": 0,
|
||||
"@typescript-eslint/explicit-function-return-type": 0,
|
||||
"@typescript-eslint/no-empty-function": 0,
|
||||
"@typescript-eslint/no-use-before-define": 0
|
||||
},
|
||||
"overrides": [
|
||||
{
|
||||
"files": ["**/*.js"],
|
||||
"rules": {
|
||||
"@typescript-eslint/no-var-requires": "off"
|
||||
}
|
||||
},
|
||||
{
|
||||
"files": ["packages/now-cli/**/*"],
|
||||
"rules": {
|
||||
"lines-between-class-members": 0,
|
||||
"no-async-promise-executor": 0,
|
||||
"no-control-regex": 0,
|
||||
"no-empty": 0,
|
||||
"prefer-const": 0,
|
||||
"prefer-destructuring": 0,
|
||||
"@typescript-eslint/ban-types": 0,
|
||||
"@typescript-eslint/consistent-type-assertions": 0,
|
||||
"@typescript-eslint/member-delimiter-style": 0,
|
||||
"@typescript-eslint/no-empty-function": 0,
|
||||
"@typescript-eslint/no-explicit-any": 0,
|
||||
"@typescript-eslint/no-inferrable-types": 0,
|
||||
"@typescript-eslint/no-var-requires": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"files": ["packages/now-client/**/*"],
|
||||
"rules": {
|
||||
"prefer-const": 0,
|
||||
"require-atomic-updates": 0,
|
||||
"@typescript-eslint/ban-ts-ignore": 0,
|
||||
"@typescript-eslint/no-explicit-any": 0
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
3
.gitattributes
vendored
Normal file
3
.gitattributes
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
# Ignore test fixtures in GitHub Languages
|
||||
# See https://github.com/github/linguist#vendored-code
|
||||
packages/*/test/* linguist-vendored
|
||||
18
.github/CODEOWNERS
vendored
Normal file
18
.github/CODEOWNERS
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
# Documentation
|
||||
# https://help.github.com/en/articles/about-code-owners
|
||||
|
||||
* @tootallnate @leo
|
||||
/packages/now-cli/src/commands/dev/ @tootallnate @leo @styfle @AndyBitz
|
||||
/packages/now-cli/src/util/dev/ @tootallnate @leo @styfle @AndyBitz
|
||||
/packages/now-cli/src/commands/domains/ @javivelasco @mglagola @anatrajkovska
|
||||
/packages/now-cli/src/commands/certs/ @javivelasco @mglagola @anatrajkovska
|
||||
/packages/now-client @leo @rdev
|
||||
/packages/now-build-utils @styfle @AndyBitz
|
||||
/packages/now-node @styfle @tootallnate @lucleray
|
||||
/packages/now-node-bridge @styfle @tootallnate @lucleray
|
||||
/packages/now-next @Timer
|
||||
/packages/now-go @styfle @sophearak
|
||||
/packages/now-python @styfle @sophearak
|
||||
/packages/now-ruby @styfle @coetry @nathancahill
|
||||
/packages/now-static-build @styfle @AndyBitz
|
||||
/packages/now-routing-utils @dav-is
|
||||
33
.github/workflows/publish.yml
vendored
Normal file
33
.github/workflows/publish.yml
vendored
Normal file
@@ -0,0 +1,33 @@
|
||||
name: Publish
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- canary
|
||||
tags:
|
||||
- '!*'
|
||||
|
||||
jobs:
|
||||
Publish:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [10.x]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- name: Checkout
|
||||
uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
- name: Install
|
||||
run: yarn install --check-files --frozen-lockfile
|
||||
- name: Build
|
||||
run: yarn build
|
||||
- name: Publish
|
||||
run: yarn publish-from-github
|
||||
env:
|
||||
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||
29
.gitignore
vendored
29
.gitignore
vendored
@@ -1,8 +1,25 @@
|
||||
# build output
|
||||
packed
|
||||
|
||||
# dependencies
|
||||
node_modules
|
||||
|
||||
# logs
|
||||
package-lock.json
|
||||
dist
|
||||
.vscode
|
||||
npm-debug.log
|
||||
yarn-error.log
|
||||
.nyc_output
|
||||
coverage
|
||||
*.swp
|
||||
*.bak
|
||||
*.tgz
|
||||
packages/now-cli/.builders
|
||||
packages/now-cli/assets
|
||||
packages/now-cli/src/util/dev/templates/*.ts
|
||||
packages/now-cli/test/**/yarn.lock
|
||||
!packages/now-cli/test/dev/**/yarn.lock
|
||||
packages/now-cli/test/**/node_modules
|
||||
packages/now-cli/test/dev/fixtures/08-hugo/hugo
|
||||
packages/now-cli/test/dev/fixtures/**/dist
|
||||
packages/now-cli/test/dev/fixtures/**/public
|
||||
packages/now-cli/test/fixtures/integration
|
||||
test/lib/deployment/failed-page.txt
|
||||
.DS_Store
|
||||
.next
|
||||
public
|
||||
|
||||
17
.kodiak.toml
Normal file
17
.kodiak.toml
Normal file
@@ -0,0 +1,17 @@
|
||||
version = 1
|
||||
|
||||
[merge]
|
||||
automerge_label = "automerge"
|
||||
blacklist_title_regex = "^WIP.*"
|
||||
blacklist_labels = ["work in progress"]
|
||||
method = "squash"
|
||||
delete_branch_on_merge = true
|
||||
block_on_reviews_requested = false
|
||||
notify_on_conflict = true
|
||||
optimistic_updates = true
|
||||
|
||||
[merge.message]
|
||||
title = "pull_request_title"
|
||||
body = "pull_request_body"
|
||||
include_pr_number = true
|
||||
body_type = "markdown"
|
||||
16
.nowignore
Normal file
16
.nowignore
Normal file
@@ -0,0 +1,16 @@
|
||||
*
|
||||
|
||||
# general
|
||||
!.yarnrc
|
||||
!run.js
|
||||
!yarn.lock
|
||||
!package.json
|
||||
|
||||
# api
|
||||
!api/
|
||||
!api/**
|
||||
|
||||
# packages
|
||||
!packages/
|
||||
!packages/frameworks
|
||||
!packages/frameworks/**
|
||||
4
.prettierrc
Normal file
4
.prettierrc
Normal file
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"singleQuote": true,
|
||||
"trailingComma": "es5"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"language": "node_js",
|
||||
"node_js": "node"
|
||||
}
|
||||
74
CODE_OF_CONDUCT.md
Normal file
74
CODE_OF_CONDUCT.md
Normal file
@@ -0,0 +1,74 @@
|
||||
## 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 [abuse@zeit.co](mailto:abuse@zeit.co). All
|
||||
complaints will be reviewed and investigated and will result in a response that
|
||||
is deemed necessary and 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/
|
||||
96
CONTRIBUTING.md
Normal file
96
CONTRIBUTING.md
Normal file
@@ -0,0 +1,96 @@
|
||||
# Contributing
|
||||
|
||||
When contributing to this repository, please first discuss the change you wish to make via [GitHub Issue](https://github.com/zeit/now/issues/new) or [Spectrum](https://spectrum.chat/zeit) with the owners of this repository before submitting a Pull Request.
|
||||
|
||||
Please read our [code of conduct](CODE_OF_CONDUCT.md) and follow it in all your interactions with the project.
|
||||
|
||||
## Local development
|
||||
|
||||
This project is configured in a monorepo pattern where one repo contains multiple npm packages. Dependencies are installed and managed with `yarn`, not `npm` CLI.
|
||||
|
||||
To get started, execute the following:
|
||||
|
||||
```
|
||||
git clone https://github.com/zeit/now
|
||||
yarn install
|
||||
yarn bootstrap
|
||||
yarn build
|
||||
yarn lint
|
||||
yarn test
|
||||
```
|
||||
|
||||
Make sure all the tests pass before making changes.
|
||||
|
||||
## Verifying your change
|
||||
|
||||
Once you are done with your changes (we even suggest doing it along the way ), make sure all the test still run by running
|
||||
|
||||
```
|
||||
yarn build && yarn test
|
||||
```
|
||||
|
||||
from the root of the project.
|
||||
|
||||
If any test fails, make sure to fix it along with your changes. See [Interpreting test errors](#Interpreting-test-errors) for more information about how the tests are executed, especially the integration tests.
|
||||
|
||||
## Pull Request Process
|
||||
|
||||
Once you are confident that your changes work properly, open a pull request on the main repository.
|
||||
|
||||
The pull request will be reviewed by the maintainers and the tests will be checked by our continuous integration platform.
|
||||
|
||||
## Interpreting test errors
|
||||
|
||||
There are 2 kinds of tests in this repository – Unit tests and Integration tests.
|
||||
|
||||
Unit tests are run locally with `jest` and execute quickly because they are testing the smallest units of code.
|
||||
|
||||
### Integration tests
|
||||
|
||||
Integration tests create deployments to your ZEIT account using the `test` project name. After each test is deployed, the `probes` key is used to check if the response is the expected value. If the value doesn't match, you'll see a message explaining the difference. If the deployment failed to build, you'll see a more generic message like the following:
|
||||
|
||||
```
|
||||
[Error: Fetched page https://test-8ashcdlew.now.sh/root.js does not contain hello Root!. Instead it contains An error occurred with this application.
|
||||
|
||||
NO_STATUS_CODE_FRO Response headers:
|
||||
cache-control=s-maxage=0
|
||||
connection=close
|
||||
content-type=text/plain; charset=utf-8
|
||||
date=Wed, 19 Jun 2019 18:01:37 GMT
|
||||
server=now
|
||||
strict-transport-security=max-age=63072000
|
||||
transfer-encoding=chunked
|
||||
x-now-id=iad1:hgtzj-1560967297876-44ae12559f95
|
||||
x-now-trace=iad1]
|
||||
```
|
||||
|
||||
In such cases you can visit the URL of the failed deployment and append `/_logs` so see the build error. In the case above, that would be https://test-8ashcdlew.now.sh/_logs
|
||||
|
||||
The logs of this deployment will contain the actual error which may help you to understand what went wrong.
|
||||
|
||||
### @zeit/node-file-trace
|
||||
|
||||
Some of the Builders use `@zeit/node-file-trace` to tree-shake files before deployment. If you suspect an error with this tree-shaking mechanism, you can create the following script in your project:
|
||||
|
||||
```js
|
||||
const trace = require('@zeit/node-file-trace');
|
||||
trace(['path/to/entrypoint.js'], {
|
||||
ts: true,
|
||||
mixedModules: true,
|
||||
})
|
||||
.then(o => console.log(o.fileList))
|
||||
.then(e => console.error(e));
|
||||
```
|
||||
|
||||
When you run this script, you'll see all imported files. If anything file is missing, the bug is in [@zeit/node-file-trace](https://github.com/zeit/node-file-trace) and not the Builder.
|
||||
|
||||
## Deploy a Builder with existing project
|
||||
|
||||
Sometimes you want to test changes to a Builder against an existing project, maybe with `now dev` or an actual deployment. You can avoid publishing every Builder change to npm by uploading the Builder as a tarball.
|
||||
|
||||
1. Change directory to the desired Builder `cd ./packages/now-node`
|
||||
2. Run `yarn build` to compile typescript and other build steps
|
||||
3. Run `npm pack` to create a tarball file
|
||||
4. Run `now *.tgz` to upload the tarball file and get a URL
|
||||
5. Edit any existing `now.json` project and replace `use` with the URL
|
||||
6. Run `now` or `now dev` to deploy with the experimental Builder
|
||||
384
DEVELOPING_A_RUNTIME.md
Normal file
384
DEVELOPING_A_RUNTIME.md
Normal file
@@ -0,0 +1,384 @@
|
||||
# Runtime Developer Reference
|
||||
|
||||
The following page is a reference for how to create a Runtime using the available Runtime API.
|
||||
|
||||
A Runtime is an npm module that exposes a `build` function and optionally an `analyze` function and `prepareCache` function.
|
||||
Official Runtimes are published to [npmjs.com](https://npmjs.com) as a package and referenced in the `use` property of the `now.json` configuration file.
|
||||
However, the `use` property will work with any [npm install argument](https://docs.npmjs.com/cli/install) such as a git repo url which is useful for testing your Runtime.
|
||||
|
||||
See the [Runtimes Documentation](https://zeit.co/docs/runtimes) to view example usage.
|
||||
|
||||
## Runtime Exports
|
||||
|
||||
### `version`
|
||||
|
||||
A **required** exported constant that decides which version of the Runtime API to use.
|
||||
|
||||
The latest and suggested version is `3`.
|
||||
|
||||
### `analyze`
|
||||
|
||||
An **optional** exported function that returns a unique fingerprint used for the purpose of [build de-duplication](https://zeit.co/docs/v2/advanced/concepts/immutability#deduplication-algorithm). If the `analyze` function is not supplied, a random fingerprint is assigned to each build.
|
||||
|
||||
```js
|
||||
export analyze({
|
||||
files: Files,
|
||||
entrypoint: String,
|
||||
workPath: String,
|
||||
config: Object
|
||||
}) : String fingerprint
|
||||
```
|
||||
|
||||
If you are using TypeScript, you should use the following types:
|
||||
|
||||
```ts
|
||||
import { AnalyzeOptions } from '@now/build-utils'
|
||||
|
||||
export analyze(options: AnalyzeOptions) {
|
||||
return 'fingerprint goes here'
|
||||
}
|
||||
```
|
||||
|
||||
### `build`
|
||||
|
||||
A **required** exported function that returns a [Serverless Function](#serverless-function).
|
||||
|
||||
What's a Serverless Function? Read about [Serverless Function concepts](https://zeit.co/docs/v2/deployments/concepts/lambdas) to learn more.
|
||||
|
||||
```js
|
||||
build({
|
||||
files: Files,
|
||||
entrypoint: String,
|
||||
workPath: String,
|
||||
config: Object,
|
||||
meta?: {
|
||||
isDev?: Boolean,
|
||||
requestPath?: String,
|
||||
filesChanged?: Array<String>,
|
||||
filesRemoved?: Array<String>
|
||||
}
|
||||
}) : {
|
||||
watch?: Array<String>,
|
||||
output: Lambda,
|
||||
routes?: Object
|
||||
}
|
||||
```
|
||||
|
||||
If you are using TypeScript, you should use the following types:
|
||||
|
||||
```ts
|
||||
import { BuildOptions } from '@now/build-utils'
|
||||
|
||||
export build(options: BuildOptions) {
|
||||
// Build the code here
|
||||
|
||||
return {
|
||||
output: {
|
||||
'path-to-file': File,
|
||||
'path-to-lambda': Lambda
|
||||
},
|
||||
watch: [],
|
||||
routes: {}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### `prepareCache`
|
||||
|
||||
An **optional** exported function that is equivalent to [`build`](#build), but it executes the instructions necessary to prepare a cache for the next run.
|
||||
|
||||
```js
|
||||
prepareCache({
|
||||
files: Files,
|
||||
entrypoint: String,
|
||||
workPath: String,
|
||||
cachePath: String,
|
||||
config: Object
|
||||
}) : Files cacheOutput
|
||||
```
|
||||
|
||||
If you are using TypeScript, you can import the types for each of these functions by using the following:
|
||||
|
||||
```ts
|
||||
import { PrepareCacheOptions } from '@now/build-utils'
|
||||
|
||||
export prepareCache(options: PrepareCacheOptions) {
|
||||
return { 'path-to-file': File }
|
||||
}
|
||||
```
|
||||
|
||||
### `shouldServe`
|
||||
|
||||
An **optional** exported function that is only used by `now dev` in [Now CLI](https:///download) and indicates whether a [Runtime](https://zeit.co/docs/v2/advanced/runtimes) wants to be responsible for building a certain request path.
|
||||
|
||||
```js
|
||||
shouldServe({
|
||||
entrypoint: String,
|
||||
files: Files,
|
||||
config: Object,
|
||||
requestPath: String,
|
||||
workPath: String
|
||||
}) : Boolean
|
||||
```
|
||||
|
||||
If you are using TypeScript, you can import the types for each of these functions by using the following:
|
||||
|
||||
```ts
|
||||
import { ShouldServeOptions } from '@now/build-utils'
|
||||
|
||||
export shouldServe(options: ShouldServeOptions) {
|
||||
return Boolean
|
||||
}
|
||||
```
|
||||
|
||||
If this method is not defined, Now CLI will default to [this function](https://github.com/zeit/now/blob/52994bfe26c5f4f179bdb49783ee57ce19334631/packages/now-build-utils/src/should-serve.ts).
|
||||
|
||||
### Runtime Options
|
||||
|
||||
The exported functions [`analyze`](#analyze), [`build`](#build), and [`prepareCache`](#preparecache) receive one argument with the following properties.
|
||||
|
||||
**Properties:**
|
||||
|
||||
- `files`: All source files of the project as a [Files](#files) data structure.
|
||||
- `entrypoint`: Name of entrypoint file for this particular build job. Value `files[entrypoint]` is guaranteed to exist and be a valid [File](#files) reference. `entrypoint` is always a discrete file and never a glob, since globs are expanded into separate builds at deployment time.
|
||||
- `workPath`: A writable temporary directory where you are encouraged to perform your build process. This directory will be populated with the restored cache from the previous run (if any) for [`analyze`](#analyze) and [`build`](#build).
|
||||
- `cachePath`: A writable temporary directory where you can build a cache for the next run. This is only passed to `prepareCache`.
|
||||
- `config`: An arbitrary object passed from by the user in the [Build definition](#defining-the-build-step) in `now.json`.
|
||||
|
||||
## Examples
|
||||
|
||||
Check out our [Node.js Runtime](https://github.com/zeit/now/tree/master/packages/now-node), [Go Runtime](https://github.com/zeit/now/tree/master/packages/now-go), [Python Runtime](https://github.com/zeit/now/tree/master/packages/now-python) or [Ruby Runtime](https://github.com/zeit/now/tree/master/packages/now-ruby) for examples of how to build one.
|
||||
|
||||
## Technical Details
|
||||
|
||||
### Execution Context
|
||||
|
||||
A [Serverless Function](https://zeit.co/docs/v2/advanced/concepts/lambdas) is created where the Runtime logic is executed. The lambda is run using the Node.js 8 runtime. A brand new sandbox is created for each deployment, for security reasons. The sandbox is cleaned up between executions to ensure no lingering temporary files are shared from build to build.
|
||||
|
||||
All the APIs you export ([`analyze`](#analyze), [`build`](#build) and [`prepareCache`](#preparecache)) are not guaranteed to be run in the same process, but the filesystem we expose (e.g.: `workPath` and the results of calling [`getWriteableDirectory`](#getWriteableDirectory) ) is retained.
|
||||
|
||||
If you need to share state between those steps, use the filesystem.
|
||||
|
||||
### Directory and Cache Lifecycle
|
||||
|
||||
When a new build is created, we pre-populate the `workPath` supplied to `analyze` with the results of the `prepareCache` step of the previous build.
|
||||
|
||||
The `analyze` step can modify that directory, and it will not be re-created when it's supplied to `build` and `prepareCache`.
|
||||
|
||||
To learn how the cache key is computed and invalidated, refer to the [overview](https://zeit.co/docs/v2/advanced/runtimes#technical-details).
|
||||
|
||||
### Accessing Environment and Secrets
|
||||
|
||||
The env and secrets specified by the user as `build.env` are passed to the Runtime process. This means you can access user env via `process.env` in Node.js.
|
||||
|
||||
### Utilities as peerDependencies
|
||||
|
||||
When you publish your Runtime to npm, make sure to not specify `@now/build-utils` (as seen below in the API definitions) as a dependency, but rather as part of `peerDependencies`.
|
||||
|
||||
## Types
|
||||
|
||||
### `Files`
|
||||
|
||||
```ts
|
||||
import { File } from '@now/build-utils';
|
||||
type Files = { [filePath: string]: File };
|
||||
```
|
||||
|
||||
This is an abstract type that is implemented as a plain [JavaScript Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object). It's helpful to think of it as a virtual filesystem representation.
|
||||
|
||||
When used as an input, the `Files` object will only contain `FileRefs`. When `Files` is an output, it may consist of `Lambda` (Serverless Functions) types as well as `FileRefs`.
|
||||
|
||||
An example of a valid output `Files` object is:
|
||||
|
||||
```json
|
||||
{
|
||||
"index.html": FileRef,
|
||||
"api/index.js": Lambda
|
||||
}
|
||||
```
|
||||
|
||||
### `File`
|
||||
|
||||
This is an abstract type that can be imported if you are using TypeScript.
|
||||
|
||||
```ts
|
||||
import { File } from '@now/build-utils';
|
||||
```
|
||||
|
||||
Valid `File` types include:
|
||||
|
||||
- [`FileRef`](#fileref)
|
||||
- [`FileFsRef`](#filefsref)
|
||||
- [`FileBlob`](#fileblob)
|
||||
|
||||
### `FileRef`
|
||||
|
||||
```ts
|
||||
import { FileRef } from '@now/build-utils';
|
||||
```
|
||||
|
||||
This is a [JavaScript class](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes) that represents an abstract file instance stored in our platform, based on the file identifier string (its checksum). When a `Files` object is passed as an input to `analyze` or `build`, all its values will be instances of `FileRef`.
|
||||
|
||||
**Properties:**
|
||||
|
||||
- `mode : Number` file mode
|
||||
- `digest : String` a checksum that represents the file
|
||||
|
||||
**Methods:**
|
||||
|
||||
- `toStream() : Stream` creates a [Stream](https://nodejs.org/api/stream.html) of the file body
|
||||
|
||||
### `FileFsRef`
|
||||
|
||||
```ts
|
||||
import { FileFsRef } from '@now/build-utils';
|
||||
```
|
||||
|
||||
This is a [JavaScript class](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes) that represents an abstract instance of a file present in the filesystem that the build process is executing in.
|
||||
|
||||
**Properties:**
|
||||
|
||||
- `mode : Number` file mode
|
||||
- `fsPath : String` the absolute path of the file in file system
|
||||
|
||||
**Methods:**
|
||||
|
||||
- `static async fromStream({ mode : Number, stream : Stream, fsPath : String }) : FileFsRef` creates an instance of a [FileFsRef](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object) from `Stream`, placing file at `fsPath` with `mode`
|
||||
- `toStream() : Stream` creates a [Stream](https://nodejs.org/api/stream.html) of the file body
|
||||
|
||||
### `FileBlob`
|
||||
|
||||
```ts
|
||||
import { FileBlob } from '@now/build-utils';
|
||||
```
|
||||
|
||||
This is a [JavaScript class](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes) that represents an abstract instance of a file present in memory.
|
||||
|
||||
**Properties:**
|
||||
|
||||
- `mode : Number` file mode
|
||||
- `data : String | Buffer` the body of the file
|
||||
|
||||
**Methods:**
|
||||
|
||||
- `static async fromStream({ mode : Number, stream : Stream }) :FileBlob` creates an instance of a [FileBlob](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object) from [`Stream`](https://nodejs.org/api/stream.html) with `mode`
|
||||
- `toStream() : Stream` creates a [Stream](https://nodejs.org/api/stream.html) of the file body
|
||||
|
||||
### `Lambda`
|
||||
|
||||
```ts
|
||||
import { Lambda } from '@now/build-utils';
|
||||
```
|
||||
|
||||
This is a [JavaScript class](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes), called a Serverless Function, that can be created by supplying `files`, `handler`, `runtime`, and `environment` as an object to the [`createLambda`](#createlambda) helper. The instances of this class should not be created directly. Instead, invoke the [`createLambda`](#createlambda) helper function.
|
||||
|
||||
**Properties:**
|
||||
|
||||
- `files : Files` the internal filesystem of the lambda
|
||||
- `handler : String` path to handler file and (optionally) a function name it exports
|
||||
- `runtime : LambdaRuntime` the name of the lambda runtime
|
||||
- `environment : Object` key-value map of handler-related (aside of those passed by user) environment variables
|
||||
|
||||
### `LambdaRuntime`
|
||||
|
||||
This is an abstract enumeration type that is implemented by one of the following possible `String` values:
|
||||
|
||||
- `nodejs12.x`
|
||||
- `nodejs10.x`
|
||||
- `go1.x`
|
||||
- `java11`
|
||||
- `python3.8`
|
||||
- `python3.6`
|
||||
- `dotnetcore2.1`
|
||||
- `ruby2.5`
|
||||
- `provided`
|
||||
|
||||
## JavaScript API
|
||||
|
||||
The following is exposed by `@now/build-utils` to simplify the process of writing Runtimes, manipulating the file system, using the above types, etc.
|
||||
|
||||
### `createLambda`
|
||||
|
||||
Signature: `createLambda(Object spec) : Lambda`
|
||||
|
||||
```ts
|
||||
import { createLambda } from '@now/build-utils';
|
||||
```
|
||||
|
||||
Constructor for the [`Lambda`](#lambda) type.
|
||||
|
||||
```js
|
||||
const { createLambda, FileBlob } = require('@now/build-utils');
|
||||
await createLambda({
|
||||
runtime: 'nodejs8.10',
|
||||
handler: 'index.main',
|
||||
files: {
|
||||
'index.js': new FileBlob({ data: 'exports.main = () => {}' }),
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
### `download`
|
||||
|
||||
Signature: `download() : Files`
|
||||
|
||||
```ts
|
||||
import { download } from '@now/build-utils';
|
||||
```
|
||||
|
||||
This utility allows you to download the contents of a [`Files`](#files) data structure, therefore creating the filesystem represented in it.
|
||||
|
||||
Since `Files` is an abstract way of representing files, you can think of `download` as a way of making that virtual filesystem _real_.
|
||||
|
||||
If the **optional** `meta` property is passed (the argument for [build](#build)), only the files that have changed are downloaded. This is decided using `filesRemoved` and `filesChanged` inside that object.
|
||||
|
||||
```js
|
||||
await download(files, workPath, meta);
|
||||
```
|
||||
|
||||
### `glob`
|
||||
|
||||
Signature: `glob() : Files`
|
||||
|
||||
```ts
|
||||
import { glob } from '@now/build-utils';
|
||||
```
|
||||
|
||||
This utility allows you to _scan_ the filesystem and return a [`Files`](#files) representation of the matched glob search string. It can be thought of as the reverse of [`download`](#download).
|
||||
|
||||
The following trivial example downloads everything to the filesystem, only to return it back (therefore just re-creating the passed-in [`Files`](#files)):
|
||||
|
||||
```js
|
||||
const { glob, download } = require('@now/build-utils')
|
||||
|
||||
exports.build = ({ files, workPath }) => {
|
||||
await download(files, workPath)
|
||||
return glob('**', workPath)
|
||||
}
|
||||
```
|
||||
|
||||
### `getWriteableDirectory`
|
||||
|
||||
Signature: `getWriteableDirectory() : String`
|
||||
|
||||
```ts
|
||||
import { getWriteableDirectory } from '@now/build-utils';
|
||||
```
|
||||
|
||||
In some occasions, you might want to write to a temporary directory.
|
||||
|
||||
### `rename`
|
||||
|
||||
Signature: `rename(Files) : Files`
|
||||
|
||||
```ts
|
||||
import { rename } from '@now/build-utils';
|
||||
```
|
||||
|
||||
Renames the keys of the [`Files`](#files) object, which represent the paths. For example, to remove the `*.go` suffix you can use:
|
||||
|
||||
```js
|
||||
const rename = require('@now/build-utils')
|
||||
const originalFiles = { 'one.go': fileFsRef1, 'two.go': fileFsRef2 }
|
||||
const renamedFiles = rename(originalFiles, path => path.replace(/\.go$/, '')
|
||||
```
|
||||
190
LICENSE
Normal file
190
LICENSE
Normal file
@@ -0,0 +1,190 @@
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
https://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
Copyright 2017 ZEIT, Inc.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
https://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
55
README.md
55
README.md
@@ -1,52 +1,39 @@
|
||||
# now CLI
|
||||

|
||||
|
||||
[](https://travis-ci.org/zeit/now-cli)
|
||||
[](https://github.com/sindresorhus/xo)
|
||||
[](https://zeit.chat)
|
||||
|
||||
Realtime global deployments served over HTTP/2. You can find the FAQs [here](https://zeit.co/now#frequently-asked-questions).
|
||||
[](https://circleci.com/gh/zeit/workflows/now/tree/master)
|
||||
[](https://spectrum.chat/zeit)
|
||||
|
||||
## Usage
|
||||
|
||||
Firstly, make sure to install the package globally:
|
||||
To install the latest version of Now CLI, visit [zeit.co/download](https://zeit.co/download) or run this command:
|
||||
|
||||
```bash
|
||||
npm install -g now
|
||||
```
|
||||
npm i -g now
|
||||
```
|
||||
|
||||
Run this command in your terminal:
|
||||
To quickly start a new project, run the following commands:
|
||||
|
||||
```bash
|
||||
now
|
||||
```
|
||||
now init # Pick an example project to clone
|
||||
cd <PROJECT> # Change directory to the newly created project
|
||||
now dev # Run locally during development
|
||||
now # Deploy to the cloud
|
||||
```
|
||||
|
||||
For more examples, usage instructions and other commands run:
|
||||
## Documentation
|
||||
|
||||
```bash
|
||||
now help
|
||||
```
|
||||
|
||||
### Options
|
||||
|
||||
Run this command to get a list of all available commands:
|
||||
|
||||
```bash
|
||||
now help
|
||||
```
|
||||
For details on how to use Now CLI, check out our [documentation](https://zeit.co/docs).
|
||||
|
||||
## Caught a Bug?
|
||||
|
||||
1. [Fork](https://help.github.com/articles/fork-a-repo/) this repository to your own GitHub account and then [clone](https://help.github.com/articles/cloning-a-repository/) it to your local device
|
||||
2. Link the package to the global module directory: `npm link`
|
||||
3. Generate a [testing token](https://zeit.co/account#api-tokens) and put it into the `token` property within `~/.now.json`
|
||||
4. You can now start using `now` from the command line!
|
||||
2. Install dependencies with `yarn install`
|
||||
3. Compile the code: `yarn build`
|
||||
4. Link the package to the global module directory: `yarn link`
|
||||
5. You can now start using `now` anywhere inside the command line
|
||||
|
||||
As always, you can use `npm test` to run the tests and see if your changes have broken anything.
|
||||
As always, you should use `yarn test-unit` to run the tests and see if your changes have broken anything.
|
||||
|
||||
## Authors
|
||||
## How to Create a Release
|
||||
|
||||
- Guillermo Rauch ([@rauchg](https://twitter.com/rauchg)) - [▲ZEIT](https://zeit.co)
|
||||
- Leo Lamprecht ([@notquiteleo](https://twitter.com/notquiteleo)) - [▲ZEIT](https://zeit.co)
|
||||
- Tony Kovanen ([@TonyKovanen](https://twitter.com/TonyKovanen)) - [▲ZEIT](https://zeit.co)
|
||||
- Olli Vanhoja ([@OVanhoja](https://twitter.com/OVanhoja)) - [▲ZEIT](https://zeit.co)
|
||||
- Naoyuki Kanezawa ([@nkzawa](https://twitter.com/nkzawa)) - [▲ZEIT](https://zeit.co)
|
||||
If you have write access to this repository, you can read more about how to publish a release [here](https://github.com/zeit/now/wiki/Creating-a-Release).
|
||||
|
||||
21
api/_lib/examples/example-list.ts
Normal file
21
api/_lib/examples/example-list.ts
Normal file
@@ -0,0 +1,21 @@
|
||||
// Currently we read & parse the README file from zeit/now-examples
|
||||
// TODO: create a `manifest.json` for zeit/now-examples
|
||||
|
||||
import fetch from 'node-fetch';
|
||||
|
||||
/**
|
||||
* Fetch and parse the `Frameworks and Libraries` table
|
||||
* in the README file of zeit/now-examples
|
||||
*/
|
||||
export async function getExampleList() {
|
||||
const response = await fetch(
|
||||
`https://raw.githubusercontent.com/zeit/now-examples/master/manifest.json`
|
||||
);
|
||||
|
||||
if (response.status !== 200) {
|
||||
console.log('manifest.json missing in zeit/now-examples');
|
||||
return null;
|
||||
}
|
||||
|
||||
return response.json();
|
||||
}
|
||||
18
api/_lib/examples/extract.ts
Normal file
18
api/_lib/examples/extract.ts
Normal file
@@ -0,0 +1,18 @@
|
||||
/**
|
||||
* Download zip and extract to target directory
|
||||
*/
|
||||
|
||||
import got from 'got';
|
||||
import unzip from 'unzip-stream';
|
||||
|
||||
export async function extract(sourceUrl: string, targetPath: string) {
|
||||
return new Promise((resolve, reject) => {
|
||||
got
|
||||
.stream(sourceUrl)
|
||||
.pipe(unzip.Extract({ path: targetPath }))
|
||||
.on('close', resolve)
|
||||
.on('error', err => {
|
||||
reject(new Error('Failed extracting from github.'));
|
||||
});
|
||||
});
|
||||
}
|
||||
70
api/_lib/examples/github-repo-info.ts
Normal file
70
api/_lib/examples/github-repo-info.ts
Normal file
@@ -0,0 +1,70 @@
|
||||
import fetch from 'node-fetch';
|
||||
import { Repo } from '../types';
|
||||
import { getExampleList } from './example-list';
|
||||
|
||||
/**
|
||||
* Fetch the meta info of a public github repo
|
||||
* @param {object} repo parsed by the `parse-github-url` package
|
||||
*/
|
||||
export async function getGitHubRepoInfo(repo: Repo) {
|
||||
const response = await fetch(`https://api.github.com/repos/${repo.repo}`, {
|
||||
headers: {
|
||||
Accept: 'application/vnd.github.machine-man-preview+json',
|
||||
},
|
||||
});
|
||||
|
||||
if (response.status !== 200) {
|
||||
console.log(`Non-200 response code from GitHub: ${response.status}`);
|
||||
console.log(await response.text());
|
||||
return null;
|
||||
}
|
||||
|
||||
const parsed = await response.json();
|
||||
|
||||
if (parsed.full_name !== repo.repo) {
|
||||
console.log(`Invalid response from GitHub`);
|
||||
console.log(`Received:`, parsed);
|
||||
return null;
|
||||
}
|
||||
|
||||
const data: { [key: string]: any } = {
|
||||
id: parsed.full_name,
|
||||
name: parsed.name,
|
||||
url: parsed.html_url,
|
||||
owner: parsed.owner.login,
|
||||
description: parsed.description,
|
||||
homepage: parsed.homepage,
|
||||
size: parsed.size,
|
||||
createdAt: parsed.created_at,
|
||||
updatedAt: parsed.updated_at,
|
||||
stars: parsed.stargazers_count,
|
||||
branch: repo.branch,
|
||||
};
|
||||
|
||||
const subdirPath = repo.repo + '/tree/' + repo.branch + '/';
|
||||
|
||||
if (repo.path.startsWith(subdirPath)) {
|
||||
// subdir
|
||||
data.subdir = repo.path.slice(subdirPath.length).split('/');
|
||||
}
|
||||
|
||||
if (data.id === 'zeit/now-examples' && data.subdir) {
|
||||
// from our examples, add `homepage` and `description` fields
|
||||
const example = data.subdir[0];
|
||||
const exampleList = await getExampleList();
|
||||
|
||||
for (const item of exampleList) {
|
||||
if (item.path === `/${example}`) {
|
||||
data.homepage = item.demo;
|
||||
data.description = item.description;
|
||||
data.exampleName = item.example;
|
||||
data.icon = item.icon;
|
||||
data.tagline = item.tagline;
|
||||
data.framework = item.framework;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
45
api/_lib/examples/gitlab-repo-info.ts
Normal file
45
api/_lib/examples/gitlab-repo-info.ts
Normal file
@@ -0,0 +1,45 @@
|
||||
import fetch from 'node-fetch';
|
||||
|
||||
interface Repo {
|
||||
repo: string;
|
||||
owner: {
|
||||
username: string;
|
||||
};
|
||||
username: string;
|
||||
branch: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetch the meta info of a public gitlab repo
|
||||
* @param {object} repo parsed by the `parse-github-url` package
|
||||
*/
|
||||
export async function getGitLabRepoInfo(repo: Repo) {
|
||||
const response = await fetch(
|
||||
`https://gitlab.com/api/v4/projects/${encodeURIComponent(repo.repo)}`
|
||||
);
|
||||
|
||||
if (response.status !== 200) {
|
||||
console.log(`Non-200 response code from GitLab: ${response.status}`);
|
||||
return null;
|
||||
}
|
||||
|
||||
const parsed = await response.json();
|
||||
if (parsed.path_with_namespace !== repo.repo) {
|
||||
console.log(`Invalid response from GitLab`);
|
||||
return null;
|
||||
}
|
||||
|
||||
return {
|
||||
id: parsed.path_with_namespace,
|
||||
name: parsed.path,
|
||||
url: parsed.web_url,
|
||||
owner: parsed.owner ? parsed.owner.username : repo.owner,
|
||||
description: parsed.description,
|
||||
homepage: null,
|
||||
size: 0,
|
||||
createdAt: parsed.created_at,
|
||||
updatedAt: parsed.last_activity_at,
|
||||
stars: parsed.star_count,
|
||||
branch: repo.branch,
|
||||
};
|
||||
}
|
||||
27
api/_lib/examples/map-old-to-new.ts
Normal file
27
api/_lib/examples/map-old-to-new.ts
Normal file
@@ -0,0 +1,27 @@
|
||||
export const mapOldToNew: { [key: string]: string[] } = {
|
||||
'go-image-to-ascii': ['vanilla-functions'],
|
||||
markdown: ['hexo', 'docusaurus', 'docz', 'jekyll'],
|
||||
'mdx-deck': ['docz'],
|
||||
'mdx-deck-advanced': ['docz'],
|
||||
'nextjs-mysql': ['nextjs'],
|
||||
'nextjs-news': ['nextjs'],
|
||||
'nextjs-nodejs-mongodb': ['nextjs'],
|
||||
'nextjs-static': ['nextjs'],
|
||||
'node-server': ['svelte-functions'],
|
||||
nodejs: ['svelte-functions'],
|
||||
'nodejs-canvas-partyparrot': ['svelte-functions'],
|
||||
'nodejs-coffee': ['svelte-functions'],
|
||||
'nodejs-hapi': ['svelte-functions'],
|
||||
'nodejs-koa': ['svelte-functions'],
|
||||
'nodejs-koa-ts': ['gatsby-functions'],
|
||||
'nodejs-micro': ['svelte-functions'],
|
||||
'nodejs-ms-graph-security-api': ['svelte-functions'],
|
||||
'nodejs-pdfkit': ['svelte-functions'],
|
||||
'nodejs-ts': ['gatsby-functions'],
|
||||
'nuxt-static': ['nuxtjs'],
|
||||
static: ['vanilla'],
|
||||
typescript: ['gatsby-functions'],
|
||||
'vanilla-go': ['vanilla-functions'],
|
||||
'vanilla-json-api': ['svelte-functions'],
|
||||
'vue-ssr': ['vue'],
|
||||
};
|
||||
20
api/_lib/examples/summary.ts
Normal file
20
api/_lib/examples/summary.ts
Normal file
@@ -0,0 +1,20 @@
|
||||
/**
|
||||
* Get example list from extracted folder
|
||||
*/
|
||||
|
||||
import { join } from 'path';
|
||||
import { lstatSync, existsSync, readdirSync } from 'fs';
|
||||
|
||||
const exists = (path: string) => existsSync(path);
|
||||
const isDotFile = (name: string) => name.startsWith('.');
|
||||
const isDirectory = (path: string) => lstatSync(path).isDirectory();
|
||||
|
||||
export function summary(source: string) {
|
||||
if (!exists(source) || !isDirectory(source)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return readdirSync(source)
|
||||
.filter(name => !isDotFile(name))
|
||||
.filter(name => isDirectory(join(source, name)));
|
||||
}
|
||||
9
api/_lib/types.ts
Normal file
9
api/_lib/types.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
export interface Repo {
|
||||
repo: string;
|
||||
owner: {
|
||||
username: string;
|
||||
};
|
||||
username: string;
|
||||
branch: string;
|
||||
path: string;
|
||||
}
|
||||
29
api/_lib/util/with-api-handler.ts
Normal file
29
api/_lib/util/with-api-handler.ts
Normal file
@@ -0,0 +1,29 @@
|
||||
import { NowRequest, NowResponse } from '@now/node';
|
||||
|
||||
type Handler = (req: NowRequest, res: NowResponse) => Promise<any>;
|
||||
|
||||
export function withApiHandler(handler: Handler): Handler {
|
||||
return async (req: NowRequest, res: NowResponse) => {
|
||||
res.setHeader('Access-Control-Allow-Origin', '*');
|
||||
res.setHeader('Access-Control-Allow-Methods', 'GET');
|
||||
res.setHeader(
|
||||
'Access-Control-Allow-Headers',
|
||||
'Authorization, Accept, Content-Type'
|
||||
);
|
||||
|
||||
if (req.method === 'OPTIONS') {
|
||||
return res.status(200).json({});
|
||||
}
|
||||
|
||||
if (req.method !== 'GET') {
|
||||
return res.status(404).json({
|
||||
error: {
|
||||
code: 'not_found',
|
||||
message: 'Only GET requests are supported for this endpoint.',
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
return handler(req, res);
|
||||
};
|
||||
}
|
||||
70
api/examples/download/[segment].ts
Normal file
70
api/examples/download/[segment].ts
Normal file
@@ -0,0 +1,70 @@
|
||||
import fs from 'fs';
|
||||
// @ts-ignore
|
||||
import tar from 'tar-fs';
|
||||
import { extract } from '../../_lib/examples/extract';
|
||||
import { NowRequest, NowResponse } from '@now/node';
|
||||
import { withApiHandler } from '../../_lib/util/with-api-handler';
|
||||
|
||||
const TMP_DIR = '/tmp';
|
||||
|
||||
function isDirectory(path: string) {
|
||||
return fs.existsSync(path) && fs.lstatSync(path).isDirectory();
|
||||
}
|
||||
|
||||
function notFound(res: NowResponse, message: string) {
|
||||
return res.status(404).send({
|
||||
error: {
|
||||
code: 'not_found',
|
||||
message
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function streamToBuffer(stream: any) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const buffers: any[] = [];
|
||||
stream.on('error', (err: any) => {
|
||||
reject(err);
|
||||
});
|
||||
stream.on('data', (b: any) => {
|
||||
buffers.push(b);
|
||||
});
|
||||
stream.on('end', () => {
|
||||
resolve(Buffer.concat(buffers));
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
export default withApiHandler(async function(req: NowRequest, res: NowResponse) {
|
||||
const ext = '.tar.gz';
|
||||
const { segment = '' } = req.query;
|
||||
|
||||
if (Array.isArray(segment) || !segment.endsWith(ext)) {
|
||||
return notFound(res, `Missing ${ext} suffix.`);
|
||||
}
|
||||
|
||||
const example = segment.slice(0, -ext.length);
|
||||
let directory;
|
||||
|
||||
if (Number(req.query.version) === 1) {
|
||||
// The old cli is pinned to a specific commit hash
|
||||
await extract('https://github.com/zeit/now-examples/archive/7c7b27e49b8b17d0d3f0e1604dc74fd005cd69e3.zip', TMP_DIR);
|
||||
directory = `${TMP_DIR}/now-examples-7c7b27e49b8b17d0d3f0e1604dc74fd005cd69e3/${example}`;
|
||||
} else {
|
||||
await extract('https://github.com/zeit/now-examples/archive/master.zip', TMP_DIR);
|
||||
directory = `${TMP_DIR}/now-examples-master/${example}`;
|
||||
|
||||
if (!isDirectory(directory)) {
|
||||
// Use `now` instead of `now-examples` if the searched example does not exist
|
||||
await extract('https://github.com/zeit/now/archive/master.zip', TMP_DIR);
|
||||
directory = `${TMP_DIR}/now-master/examples/${example}`;
|
||||
}
|
||||
}
|
||||
|
||||
if (!isDirectory(directory)) {
|
||||
return notFound(res, `Example '${example}' was not found.`);
|
||||
}
|
||||
|
||||
const stream = tar.pack(directory);
|
||||
return res.send(await streamToBuffer(stream));
|
||||
});
|
||||
44
api/examples/info.ts
Normal file
44
api/examples/info.ts
Normal file
@@ -0,0 +1,44 @@
|
||||
// A proxy to get the basic info of an existing github/gitlab repo:
|
||||
// GET /info?repo=zeit/micro
|
||||
|
||||
// @ts-ignore
|
||||
import parseGitUrl from 'parse-github-url';
|
||||
import { NowRequest, NowResponse } from '@now/node';
|
||||
import { withApiHandler } from '../_lib/util/with-api-handler';
|
||||
import { getGitHubRepoInfo } from '../_lib/examples/github-repo-info';
|
||||
import { getGitLabRepoInfo } from '../_lib/examples/gitlab-repo-info';
|
||||
|
||||
export default withApiHandler(async function(
|
||||
req: NowRequest,
|
||||
res: NowResponse
|
||||
) {
|
||||
const repoPath = decodeURIComponent((req.query.repo as string) || '');
|
||||
|
||||
if (!repoPath) {
|
||||
return res.status(404).json({
|
||||
error: {
|
||||
code: 'not_found',
|
||||
message: 'Please provide the `repo` parameter.',
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
const repo = parseGitUrl(repoPath);
|
||||
|
||||
if (!repo.repo) {
|
||||
return res.status(400).json({
|
||||
error: {
|
||||
code: 'invalid_repo_url',
|
||||
message: 'Repository URL is invalid.',
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
if (repo.host === 'github.com') {
|
||||
// URL is 'https://github.com/user/repo' or 'user/repo'
|
||||
return res.json((await getGitHubRepoInfo(repo)) || {});
|
||||
}
|
||||
|
||||
// gitlab
|
||||
res.json((await getGitLabRepoInfo(repo)) || {});
|
||||
});
|
||||
10
api/examples/list-all.ts
Normal file
10
api/examples/list-all.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
import { NowRequest, NowResponse } from '@now/node';
|
||||
import { getExampleList } from '../_lib/examples/example-list';
|
||||
import { withApiHandler } from '../_lib/util/with-api-handler';
|
||||
|
||||
export default withApiHandler(async function(
|
||||
req: NowRequest,
|
||||
res: NowResponse
|
||||
) {
|
||||
res.status(200).json(await getExampleList());
|
||||
});
|
||||
46
api/examples/list.ts
Normal file
46
api/examples/list.ts
Normal file
@@ -0,0 +1,46 @@
|
||||
import { extract } from '../_lib/examples/extract';
|
||||
import { summary } from '../_lib/examples/summary';
|
||||
import { NowRequest, NowResponse } from '@now/node';
|
||||
import { mapOldToNew } from '../_lib/examples/map-old-to-new';
|
||||
import { withApiHandler } from '../_lib/util/with-api-handler';
|
||||
|
||||
export default withApiHandler(async function(
|
||||
req: NowRequest,
|
||||
res: NowResponse
|
||||
) {
|
||||
if (Number(req.query.version) === 1) {
|
||||
// The old cli is pinned to a specific commit hash
|
||||
await extract(
|
||||
'https://github.com/zeit/now-examples/archive/7c7b27e49b8b17d0d3f0e1604dc74fd005cd69e3.zip',
|
||||
'/tmp'
|
||||
);
|
||||
const exampleList = summary(
|
||||
'/tmp/now-examples-7c7b27e49b8b17d0d3f0e1604dc74fd005cd69e3'
|
||||
);
|
||||
return res.send(exampleList);
|
||||
}
|
||||
|
||||
await Promise.all([
|
||||
extract('https://github.com/zeit/now/archive/master.zip', '/tmp'),
|
||||
extract('https://github.com/zeit/now-examples/archive/master.zip', '/tmp'),
|
||||
]);
|
||||
|
||||
const exampleList = new Set([
|
||||
...summary('/tmp/now-master/examples'),
|
||||
...summary('/tmp/now-examples-master'),
|
||||
]);
|
||||
|
||||
const existingExamples = Array.from(exampleList).map(key => ({
|
||||
name: key,
|
||||
visible: true,
|
||||
suggestions: [],
|
||||
}));
|
||||
|
||||
const oldExamples = Object.keys(mapOldToNew).map(key => ({
|
||||
name: key,
|
||||
visible: false,
|
||||
suggestions: mapOldToNew[key],
|
||||
}));
|
||||
|
||||
res.status(200).json([...existingExamples, ...oldExamples]);
|
||||
});
|
||||
22
api/frameworks.ts
Normal file
22
api/frameworks.ts
Normal file
@@ -0,0 +1,22 @@
|
||||
import { NowRequest, NowResponse } from '@now/node';
|
||||
import { withApiHandler } from './_lib/util/with-api-handler';
|
||||
import frameworkList, { Framework } from '../packages/frameworks';
|
||||
|
||||
const frameworks: Framework[] = (frameworkList as Framework[]).map(
|
||||
framework => {
|
||||
delete framework.detectors;
|
||||
|
||||
if (framework.logo) {
|
||||
framework.logo = `https://res.cloudinary.com/zeit-inc/image/fetch/${framework.logo}`;
|
||||
}
|
||||
|
||||
return framework;
|
||||
}
|
||||
);
|
||||
|
||||
export default withApiHandler(async function(
|
||||
req: NowRequest,
|
||||
res: NowResponse
|
||||
) {
|
||||
return res.status(200).json(frameworks);
|
||||
});
|
||||
23
api/package.json
Normal file
23
api/package.json
Normal file
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"name": "api",
|
||||
"private": true,
|
||||
"version": "0.0.0",
|
||||
"description": "API for the zeit/now repo",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"build": "yarn --cwd .. && node ../run.js build all"
|
||||
},
|
||||
"dependencies": {
|
||||
"got": "10.2.1",
|
||||
"node-fetch": "2.6.0",
|
||||
"parse-github-url": "1.0.2",
|
||||
"tar-fs": "2.0.0",
|
||||
"typescript": "3.7.4",
|
||||
"unzip-stream": "0.3.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@now/node": "1.3.3",
|
||||
"@types/node": "13.1.4",
|
||||
"@types/node-fetch": "2.5.4"
|
||||
}
|
||||
}
|
||||
15
api/tsconfig.json
Normal file
15
api/tsconfig.json
Normal file
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target": "esnext",
|
||||
"skipLibCheck": true,
|
||||
"strict": false,
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"noEmit": true,
|
||||
"esModuleInterop": true,
|
||||
"module": "commonjs",
|
||||
"moduleResolution": "node",
|
||||
"resolveJsonModule": true,
|
||||
"isolatedModules": true
|
||||
},
|
||||
"include": ["examples", "frameworks.ts"]
|
||||
}
|
||||
349
api/yarn.lock
Normal file
349
api/yarn.lock
Normal file
@@ -0,0 +1,349 @@
|
||||
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
"@now/node@1.3.3":
|
||||
version "1.3.3"
|
||||
resolved "https://registry.yarnpkg.com/@now/node/-/node-1.3.3.tgz#5407cb6a730d4dd9b6b6b0bc4a316f29086c9feb"
|
||||
integrity sha512-s1qajtQttWhhSs1k6FX0/6eTFYFUplzultrQeKfOPMoYzzz6OxDq5qrQ3elpsGlZlDVmO+x+JOJ7yad+3yBgpg==
|
||||
dependencies:
|
||||
"@types/node" "*"
|
||||
|
||||
"@sindresorhus/is@^1.0.0":
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-1.2.0.tgz#63ce3638cb85231f3704164c90a18ef816da3fb7"
|
||||
integrity sha512-mwhXGkRV5dlvQc4EgPDxDxO6WuMBVymGFd1CA+2Y+z5dG9MNspoQ+AWjl/Ld1MnpCL8AKbosZlDVohqcIwuWsw==
|
||||
|
||||
"@szmarczak/http-timer@^4.0.0":
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.0.tgz#309789ccb7842ff1e41848cf43da587f78068836"
|
||||
integrity sha512-3yoXv8OtGr/r3R5gaWWNQ3VUoQ5G3Gmo8DXX95V14ZVvE2b7Pj6Ide9uIDON8ym4D/ItyfL9ejohYUPqOyvRXw==
|
||||
dependencies:
|
||||
defer-to-connect "^1.1.1"
|
||||
|
||||
"@types/cacheable-request@^6.0.1":
|
||||
version "6.0.1"
|
||||
resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.1.tgz#5d22f3dded1fd3a84c0bbeb5039a7419c2c91976"
|
||||
integrity sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ==
|
||||
dependencies:
|
||||
"@types/http-cache-semantics" "*"
|
||||
"@types/keyv" "*"
|
||||
"@types/node" "*"
|
||||
"@types/responselike" "*"
|
||||
|
||||
"@types/http-cache-semantics@*":
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz#9140779736aa2655635ee756e2467d787cfe8a2a"
|
||||
integrity sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A==
|
||||
|
||||
"@types/keyv@*":
|
||||
version "3.1.1"
|
||||
resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.1.tgz#e45a45324fca9dab716ab1230ee249c9fb52cfa7"
|
||||
integrity sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw==
|
||||
dependencies:
|
||||
"@types/node" "*"
|
||||
|
||||
"@types/node-fetch@2.5.4":
|
||||
version "2.5.4"
|
||||
resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.4.tgz#5245b6d8841fc3a6208b82291119bc11c4e0ce44"
|
||||
integrity sha512-Oz6id++2qAOFuOlE1j0ouk1dzl3mmI1+qINPNBhi9nt/gVOz0G+13Ao6qjhdF0Ys+eOkhu6JnFmt38bR3H0POQ==
|
||||
dependencies:
|
||||
"@types/node" "*"
|
||||
|
||||
"@types/node@*", "@types/node@13.1.4":
|
||||
version "13.1.4"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-13.1.4.tgz#4cfd90175a200ee9b02bd6b1cd19bc349741607e"
|
||||
integrity sha512-Lue/mlp2egZJoHXZr4LndxDAd7i/7SQYhV0EjWfb/a4/OZ6tuVwMCVPiwkU5nsEipxEf7hmkSU7Em5VQ8P5NGA==
|
||||
|
||||
"@types/responselike@*":
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29"
|
||||
integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==
|
||||
dependencies:
|
||||
"@types/node" "*"
|
||||
|
||||
binary@^0.3.0:
|
||||
version "0.3.0"
|
||||
resolved "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79"
|
||||
integrity sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=
|
||||
dependencies:
|
||||
buffers "~0.1.1"
|
||||
chainsaw "~0.1.0"
|
||||
|
||||
bl@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/bl/-/bl-3.0.0.tgz#3611ec00579fd18561754360b21e9f784500ff88"
|
||||
integrity sha512-EUAyP5UHU5hxF8BPT0LKW8gjYLhq1DQIcneOX/pL/m2Alo+OYDQAJlHq+yseMP50Os2nHXOSic6Ss3vSQeyf4A==
|
||||
dependencies:
|
||||
readable-stream "^3.0.1"
|
||||
|
||||
buffers@~0.1.1:
|
||||
version "0.1.1"
|
||||
resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb"
|
||||
integrity sha1-skV5w77U1tOWru5tmorn9Ugqt7s=
|
||||
|
||||
cacheable-lookup@^0.2.1:
|
||||
version "0.2.1"
|
||||
resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-0.2.1.tgz#f474ae2c686667d7ea08c43409ad31b2b31b26c2"
|
||||
integrity sha512-BQ8MRjxJASEq2q+w0SusPU3B054gS278K8sj58QCLMZIso5qG05+MdCdmXxuyVlfvI8h4bPsNOavVUauVCGxrg==
|
||||
dependencies:
|
||||
keyv "^3.1.0"
|
||||
|
||||
cacheable-request@^7.0.0:
|
||||
version "7.0.0"
|
||||
resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.0.tgz#12421aa084e943ec81eac8c93e56af90c624788a"
|
||||
integrity sha512-UVG4gMn3WjnAeFBBx7RFoprgOANIAkMwN5Dta6ONmfSwrCxfm0Ip7g0mIBxIRJZX9aDsoID0Ry3dU5Pr0csKKA==
|
||||
dependencies:
|
||||
clone-response "^1.0.2"
|
||||
get-stream "^5.1.0"
|
||||
http-cache-semantics "^4.0.0"
|
||||
keyv "^3.0.0"
|
||||
lowercase-keys "^2.0.0"
|
||||
normalize-url "^4.1.0"
|
||||
responselike "^2.0.0"
|
||||
|
||||
chainsaw@~0.1.0:
|
||||
version "0.1.0"
|
||||
resolved "https://registry.yarnpkg.com/chainsaw/-/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98"
|
||||
integrity sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=
|
||||
dependencies:
|
||||
traverse ">=0.3.0 <0.4"
|
||||
|
||||
chownr@^1.1.1:
|
||||
version "1.1.3"
|
||||
resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142"
|
||||
integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==
|
||||
|
||||
clone-response@^1.0.2:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
|
||||
integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=
|
||||
dependencies:
|
||||
mimic-response "^1.0.0"
|
||||
|
||||
decompress-response@^5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-5.0.0.tgz#7849396e80e3d1eba8cb2f75ef4930f76461cb0f"
|
||||
integrity sha512-TLZWWybuxWgoW7Lykv+gq9xvzOsUjQ9tF09Tj6NSTYGMTCHNXzrPnD6Hi+TgZq19PyTAGH4Ll/NIM/eTGglnMw==
|
||||
dependencies:
|
||||
mimic-response "^2.0.0"
|
||||
|
||||
defer-to-connect@^1.1.1:
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.1.tgz#88ae694b93f67b81815a2c8c769aef6574ac8f2f"
|
||||
integrity sha512-J7thop4u3mRTkYRQ+Vpfwy2G5Ehoy82I14+14W4YMDLKdWloI9gSzRbV30s/NckQGVJtPkWNcW4oMAUigTdqiQ==
|
||||
|
||||
duplexer3@^0.1.4:
|
||||
version "0.1.4"
|
||||
resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
|
||||
integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=
|
||||
|
||||
end-of-stream@^1.1.0, end-of-stream@^1.4.1:
|
||||
version "1.4.4"
|
||||
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
|
||||
integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
|
||||
dependencies:
|
||||
once "^1.4.0"
|
||||
|
||||
fs-constants@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
|
||||
integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
|
||||
|
||||
get-stream@^5.0.0, get-stream@^5.1.0:
|
||||
version "5.1.0"
|
||||
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9"
|
||||
integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==
|
||||
dependencies:
|
||||
pump "^3.0.0"
|
||||
|
||||
got@10.2.1:
|
||||
version "10.2.1"
|
||||
resolved "https://registry.yarnpkg.com/got/-/got-10.2.1.tgz#7087485482fb31aa6e6399fd493dd04639da117b"
|
||||
integrity sha512-IQX//hGm5oLjUj743GJG30U2RzjS58ZlhQQjwQXjsyR50TTD+etVMHlMEbNxYJGWVFa0ASgDVhRkAvQPe6M9iQ==
|
||||
dependencies:
|
||||
"@sindresorhus/is" "^1.0.0"
|
||||
"@szmarczak/http-timer" "^4.0.0"
|
||||
"@types/cacheable-request" "^6.0.1"
|
||||
cacheable-lookup "^0.2.1"
|
||||
cacheable-request "^7.0.0"
|
||||
decompress-response "^5.0.0"
|
||||
duplexer3 "^0.1.4"
|
||||
get-stream "^5.0.0"
|
||||
lowercase-keys "^2.0.0"
|
||||
mimic-response "^2.0.0"
|
||||
p-cancelable "^2.0.0"
|
||||
responselike "^2.0.0"
|
||||
to-readable-stream "^2.0.0"
|
||||
type-fest "^0.8.0"
|
||||
|
||||
http-cache-semantics@^4.0.0:
|
||||
version "4.0.3"
|
||||
resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz#495704773277eeef6e43f9ab2c2c7d259dda25c5"
|
||||
integrity sha512-TcIMG3qeVLgDr1TEd2XvHaTnMPwYQUQMIBLy+5pLSDKYFc7UIqj39w8EGzZkaxoLv/l2K8HaI0t5AVA+YYgUew==
|
||||
|
||||
inherits@^2.0.3:
|
||||
version "2.0.4"
|
||||
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
|
||||
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
|
||||
|
||||
json-buffer@3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
|
||||
integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=
|
||||
|
||||
keyv@^3.0.0, keyv@^3.1.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9"
|
||||
integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==
|
||||
dependencies:
|
||||
json-buffer "3.0.0"
|
||||
|
||||
lowercase-keys@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
|
||||
integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==
|
||||
|
||||
mimic-response@^1.0.0:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
|
||||
integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
|
||||
|
||||
mimic-response@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.0.0.tgz#996a51c60adf12cb8a87d7fb8ef24c2f3d5ebb46"
|
||||
integrity sha512-8ilDoEapqA4uQ3TwS0jakGONKXVJqpy+RpM+3b7pLdOjghCrEiGp9SRkFbUHAmZW9vdnrENWHjaweIoTIJExSQ==
|
||||
|
||||
minimist@0.0.8:
|
||||
version "0.0.8"
|
||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
|
||||
integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
|
||||
|
||||
mkdirp@^0.5.1:
|
||||
version "0.5.1"
|
||||
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
|
||||
integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
|
||||
dependencies:
|
||||
minimist "0.0.8"
|
||||
|
||||
node-fetch@2.6.0:
|
||||
version "2.6.0"
|
||||
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd"
|
||||
integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==
|
||||
|
||||
normalize-url@^4.1.0:
|
||||
version "4.5.0"
|
||||
resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129"
|
||||
integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==
|
||||
|
||||
once@^1.3.1, once@^1.4.0:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
|
||||
integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
|
||||
dependencies:
|
||||
wrappy "1"
|
||||
|
||||
p-cancelable@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.0.0.tgz#4a3740f5bdaf5ed5d7c3e34882c6fb5d6b266a6e"
|
||||
integrity sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg==
|
||||
|
||||
parse-github-url@1.0.2:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/parse-github-url/-/parse-github-url-1.0.2.tgz#242d3b65cbcdda14bb50439e3242acf6971db395"
|
||||
integrity sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==
|
||||
|
||||
pump@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
|
||||
integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
|
||||
dependencies:
|
||||
end-of-stream "^1.1.0"
|
||||
once "^1.3.1"
|
||||
|
||||
readable-stream@^3.0.1, readable-stream@^3.1.1:
|
||||
version "3.4.0"
|
||||
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc"
|
||||
integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==
|
||||
dependencies:
|
||||
inherits "^2.0.3"
|
||||
string_decoder "^1.1.1"
|
||||
util-deprecate "^1.0.1"
|
||||
|
||||
responselike@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.0.tgz#26391bcc3174f750f9a79eacc40a12a5c42d7723"
|
||||
integrity sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==
|
||||
dependencies:
|
||||
lowercase-keys "^2.0.0"
|
||||
|
||||
safe-buffer@~5.2.0:
|
||||
version "5.2.0"
|
||||
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519"
|
||||
integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==
|
||||
|
||||
string_decoder@^1.1.1:
|
||||
version "1.3.0"
|
||||
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
|
||||
integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
|
||||
dependencies:
|
||||
safe-buffer "~5.2.0"
|
||||
|
||||
tar-fs@2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.0.0.tgz#677700fc0c8b337a78bee3623fdc235f21d7afad"
|
||||
integrity sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA==
|
||||
dependencies:
|
||||
chownr "^1.1.1"
|
||||
mkdirp "^0.5.1"
|
||||
pump "^3.0.0"
|
||||
tar-stream "^2.0.0"
|
||||
|
||||
tar-stream@^2.0.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.0.tgz#d1aaa3661f05b38b5acc9b7020efdca5179a2cc3"
|
||||
integrity sha512-+DAn4Nb4+gz6WZigRzKEZl1QuJVOLtAwwF+WUxy1fJ6X63CaGaUAxJRD2KEn1OMfcbCjySTYpNC6WmfQoIEOdw==
|
||||
dependencies:
|
||||
bl "^3.0.0"
|
||||
end-of-stream "^1.4.1"
|
||||
fs-constants "^1.0.0"
|
||||
inherits "^2.0.3"
|
||||
readable-stream "^3.1.1"
|
||||
|
||||
to-readable-stream@^2.0.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-2.1.0.tgz#82880316121bea662cdc226adb30addb50cb06e8"
|
||||
integrity sha512-o3Qa6DGg1CEXshSdvWNX2sN4QHqg03SPq7U6jPXRahlQdl5dK8oXjkU/2/sGrnOZKeGV1zLSO8qPwyKklPPE7w==
|
||||
|
||||
"traverse@>=0.3.0 <0.4":
|
||||
version "0.3.9"
|
||||
resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9"
|
||||
integrity sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=
|
||||
|
||||
type-fest@^0.8.0:
|
||||
version "0.8.1"
|
||||
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
|
||||
integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
|
||||
|
||||
typescript@3.7.4:
|
||||
version "3.7.4"
|
||||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.4.tgz#1743a5ec5fef6a1fa9f3e4708e33c81c73876c19"
|
||||
integrity sha512-A25xv5XCtarLwXpcDNZzCGvW2D1S3/bACratYBx2sax8PefsFhlYmkQicKHvpYflFS8if4zne5zT5kpJ7pzuvw==
|
||||
|
||||
unzip-stream@0.3.0:
|
||||
version "0.3.0"
|
||||
resolved "https://registry.yarnpkg.com/unzip-stream/-/unzip-stream-0.3.0.tgz#c30c054cd6b0d64b13a23cd3ece911eb0b2b52d8"
|
||||
integrity sha512-NG1h/MdGIX3HzyqMjyj1laBCmlPYhcO4xEy7gEqqzGiSLw7XqDQCnY4nYSn5XSaH8mQ6TFkaujrO8d/PIZN85A==
|
||||
dependencies:
|
||||
binary "^0.3.0"
|
||||
mkdirp "^0.5.1"
|
||||
|
||||
util-deprecate@^1.0.1:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
|
||||
integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
|
||||
|
||||
wrappy@1:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
|
||||
integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
|
||||
289
bin/now-alias.js
289
bin/now-alias.js
@@ -1,289 +0,0 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
// Packages
|
||||
const chalk = require('chalk')
|
||||
const minimist = require('minimist')
|
||||
const table = require('text-table')
|
||||
const ms = require('ms')
|
||||
|
||||
// Ours
|
||||
const strlen = require('../lib/strlen')
|
||||
const NowAlias = require('../lib/alias')
|
||||
const login = require('../lib/login')
|
||||
const cfg = require('../lib/cfg')
|
||||
const {error} = require('../lib/error')
|
||||
const toHost = require('../lib/to-host')
|
||||
|
||||
const argv = minimist(process.argv.slice(2), {
|
||||
string: ['config', 'token'],
|
||||
boolean: ['help', 'debug'],
|
||||
alias: {
|
||||
help: 'h',
|
||||
config: 'c',
|
||||
debug: 'd',
|
||||
token: 't'
|
||||
}
|
||||
})
|
||||
|
||||
const subcommand = argv._[0]
|
||||
|
||||
// options
|
||||
const help = () => {
|
||||
console.log(`
|
||||
${chalk.bold('𝚫 now alias')} <ls | set | rm> <deployment> <alias>
|
||||
|
||||
${chalk.dim('Options:')}
|
||||
|
||||
-h, --help Output usage information
|
||||
-c ${chalk.bold.underline('FILE')}, --config=${chalk.bold.underline('FILE')} Config file
|
||||
-d, --debug Debug mode [off]
|
||||
-t ${chalk.bold.underline('TOKEN')}, --token=${chalk.bold.underline('TOKEN')} Login token
|
||||
|
||||
${chalk.dim('Examples:')}
|
||||
|
||||
${chalk.gray('–')} Lists all your aliases:
|
||||
|
||||
${chalk.cyan('$ now alias ls')}
|
||||
|
||||
${chalk.gray('–')} Adds a new alias to ${chalk.underline('my-api.now.sh')}:
|
||||
|
||||
${chalk.cyan(`$ now alias set ${chalk.underline('api-ownv3nc9f8.now.sh')} ${chalk.underline('my-api.now.sh')}`)}
|
||||
|
||||
The ${chalk.dim('`.now.sh`')} suffix can be ommited:
|
||||
|
||||
${chalk.cyan('$ now alias set api-ownv3nc9f8 my-api')}
|
||||
|
||||
The deployment id can be used as the source:
|
||||
|
||||
${chalk.cyan('$ now alias set deploymentId my-alias')}
|
||||
|
||||
Custom domains work as alias targets:
|
||||
|
||||
${chalk.cyan(`$ now alias set ${chalk.underline('api-ownv3nc9f8.now.sh')} ${chalk.underline('my-api.com')}`)}
|
||||
|
||||
${chalk.dim('–')} The subcommand ${chalk.dim('`set`')} is the default and can be skipped.
|
||||
${chalk.dim('–')} ${chalk.dim('`http(s)://`')} in the URLs is unneeded / ignored.
|
||||
|
||||
${chalk.gray('–')} Removing an alias:
|
||||
|
||||
${chalk.cyan('$ now alias rm aliasId')}
|
||||
|
||||
To get the list of alias ids, use ${chalk.dim('`now alias ls`')}.
|
||||
|
||||
${chalk.dim('Alias:')} ln
|
||||
`)
|
||||
}
|
||||
|
||||
// options
|
||||
const debug = argv.debug
|
||||
const apiUrl = argv.url || 'https://api.zeit.co'
|
||||
|
||||
if (argv.config) {
|
||||
cfg.setConfigFile(argv.config)
|
||||
}
|
||||
|
||||
const exit = code => {
|
||||
// we give stdout some time to flush out
|
||||
// because there's a node bug where
|
||||
// stdout writes are asynchronous
|
||||
// https://github.com/nodejs/node/issues/6456
|
||||
setTimeout(() => process.exit(code || 0), 100)
|
||||
}
|
||||
|
||||
if (argv.help) {
|
||||
help()
|
||||
exit(0)
|
||||
} else {
|
||||
const config = cfg.read()
|
||||
|
||||
Promise.resolve(argv.token || config.token || login(apiUrl))
|
||||
.then(async token => {
|
||||
try {
|
||||
await run(token)
|
||||
} catch (err) {
|
||||
if (err.userError) {
|
||||
error(err.message)
|
||||
} else {
|
||||
error(`Unknown error: ${err}\n${err.stack}`)
|
||||
}
|
||||
exit(1)
|
||||
}
|
||||
})
|
||||
.catch(e => {
|
||||
error(`Authentication error – ${e.message}`)
|
||||
exit(1)
|
||||
})
|
||||
}
|
||||
|
||||
async function run(token) {
|
||||
const alias = new NowAlias(apiUrl, token, {debug})
|
||||
const args = argv._.slice(1)
|
||||
|
||||
switch (subcommand) {
|
||||
case 'ls':
|
||||
case 'list': {
|
||||
if (args.length !== 0) {
|
||||
error(`Invalid number of arguments. Usage: ${chalk.cyan('`now alias ls`')}`)
|
||||
return exit(1)
|
||||
}
|
||||
|
||||
const start_ = new Date()
|
||||
const list = await alias.list()
|
||||
const urls = new Map(list.map(l => [l.uid, l.url]))
|
||||
const aliases = await alias.ls()
|
||||
aliases.sort((a, b) => new Date(b.created) - new Date(a.created))
|
||||
const current = new Date()
|
||||
|
||||
const header = [['', 'id', 'source', 'url', 'created'].map(s => chalk.dim(s))]
|
||||
const text = list.length === 0 ? null : table(header.concat(aliases.map(_alias => {
|
||||
const _url = chalk.underline(`https://${_alias.alias}`)
|
||||
const target = _alias.deploymentId
|
||||
const _sourceUrl = urls.get(target) ? chalk.underline(`https://${urls.get(target)}`) : chalk.gray('<null>')
|
||||
|
||||
const time = chalk.gray(ms(current - new Date(_alias.created)) + ' ago')
|
||||
return [
|
||||
'',
|
||||
// we default to `''` because some early aliases didn't
|
||||
// have an uid associated
|
||||
_alias.uid === null ? '' : _alias.uid,
|
||||
_sourceUrl,
|
||||
_url,
|
||||
time
|
||||
]
|
||||
})), {align: ['l', 'r', 'l', 'l'], hsep: ' '.repeat(2), stringLength: strlen})
|
||||
|
||||
const elapsed_ = ms(new Date() - start_)
|
||||
console.log(`> ${aliases.length} alias${aliases.length === 1 ? '' : 'es'} found ${chalk.gray(`[${elapsed_}]`)}`)
|
||||
|
||||
if (text) {
|
||||
console.log('\n' + text + '\n')
|
||||
}
|
||||
|
||||
break
|
||||
}
|
||||
case 'rm':
|
||||
case 'remove': {
|
||||
const _target = String(args[0])
|
||||
if (!_target) {
|
||||
const err = new Error('No alias id specified')
|
||||
err.userError = true
|
||||
throw err
|
||||
}
|
||||
|
||||
if (args.length !== 1) {
|
||||
error(`Invalid number of arguments. Usage: ${chalk.cyan('`now alias rm <id>`')}`)
|
||||
return exit(1)
|
||||
}
|
||||
|
||||
const _aliases = await alias.ls()
|
||||
const _alias = findAlias(_target, _aliases)
|
||||
|
||||
if (!_alias) {
|
||||
const err = new Error(`Alias not found by "${_target}". Run ${chalk.dim('`now alias ls`')} to see your aliases.`)
|
||||
err.userError = true
|
||||
throw err
|
||||
}
|
||||
|
||||
try {
|
||||
const confirmation = (await readConfirmation(alias, _alias, _aliases)).toLowerCase()
|
||||
if (confirmation !== 'y' && confirmation !== 'yes') {
|
||||
console.log('\n> Aborted')
|
||||
process.exit(0)
|
||||
}
|
||||
|
||||
const start = new Date()
|
||||
await alias.rm(_alias)
|
||||
const elapsed = ms(new Date() - start)
|
||||
console.log(`${chalk.cyan('> Success!')} Alias ${chalk.bold(_alias.uid)} removed [${elapsed}]`)
|
||||
} catch (err) {
|
||||
error(err)
|
||||
exit(1)
|
||||
}
|
||||
|
||||
break
|
||||
}
|
||||
case 'add':
|
||||
case 'set': {
|
||||
if (args.length !== 2) {
|
||||
error(`Invalid number of arguments. Usage: ${chalk.cyan('`now alias set <id> <domain>`')}`)
|
||||
return exit(1)
|
||||
}
|
||||
await alias.set(String(args[0]), String(args[1]))
|
||||
break
|
||||
}
|
||||
default: {
|
||||
if (argv._.length === 2) {
|
||||
await alias.set(String(argv._[0]), String(argv._[1]))
|
||||
} else if (argv._.length >= 3) {
|
||||
error('Invalid number of arguments')
|
||||
help()
|
||||
exit(1)
|
||||
} else {
|
||||
error('Please specify a valid subcommand: ls | set | rm')
|
||||
help()
|
||||
exit(1)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
alias.close()
|
||||
}
|
||||
|
||||
async function readConfirmation(alias, _alias) {
|
||||
const deploymentsList = await alias.list()
|
||||
const urls = new Map(deploymentsList.map(l => [l.uid, l.url]))
|
||||
|
||||
return new Promise(resolve => {
|
||||
const time = chalk.gray(ms(new Date() - new Date(_alias.created)) + ' ago')
|
||||
const _sourceUrl = chalk.underline(`https://${urls.get(_alias.deploymentId)}`)
|
||||
const tbl = table(
|
||||
[[_alias.uid, _sourceUrl, chalk.underline(`https://${_alias.alias}`), time]],
|
||||
{align: ['l', 'r', 'l'], hsep: ' '.repeat(6)}
|
||||
)
|
||||
|
||||
process.stdout.write('> The following alias will be removed permanently\n')
|
||||
process.stdout.write(' ' + tbl + '\n')
|
||||
process.stdout.write(` ${chalk.bold.red('> Are you sure?')} ${chalk.gray('[y/N] ')}`)
|
||||
|
||||
process.stdin.on('data', d => {
|
||||
process.stdin.pause()
|
||||
resolve(d.toString().trim())
|
||||
}).resume()
|
||||
})
|
||||
}
|
||||
|
||||
function findAlias(alias, list) {
|
||||
let key
|
||||
let val
|
||||
|
||||
if (/\./.test(alias)) {
|
||||
val = toHost(alias)
|
||||
key = 'alias'
|
||||
} else {
|
||||
val = alias
|
||||
key = 'uid'
|
||||
}
|
||||
|
||||
const _alias = list.find(d => {
|
||||
if (d[key] === val) {
|
||||
if (debug) {
|
||||
console.log(`> [debug] matched alias ${d.uid} by ${key} ${val}`)
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
// match prefix
|
||||
if (`${val}.now.sh` === d.alias) {
|
||||
if (debug) {
|
||||
console.log(`> [debug] matched alias ${d.uid} by url ${d.host}`)
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
})
|
||||
|
||||
return _alias
|
||||
}
|
||||
293
bin/now-certs.js
293
bin/now-certs.js
@@ -1,293 +0,0 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
// Native
|
||||
const path = require('path')
|
||||
|
||||
// Packages
|
||||
const chalk = require('chalk')
|
||||
const table = require('text-table')
|
||||
const minimist = require('minimist')
|
||||
const fs = require('fs-promise')
|
||||
const ms = require('ms')
|
||||
|
||||
// Ours
|
||||
const strlen = require('../lib/strlen')
|
||||
const cfg = require('../lib/cfg')
|
||||
const {handleError, error} = require('../lib/error')
|
||||
const NowCerts = require('../lib/certs')
|
||||
const login = require('../lib/login')
|
||||
|
||||
const argv = minimist(process.argv.slice(2), {
|
||||
string: ['config', 'token', 'crt', 'key', 'ca'],
|
||||
boolean: ['help', 'debug'],
|
||||
alias: {
|
||||
help: 'h',
|
||||
config: 'c',
|
||||
debug: 'd',
|
||||
token: 't'
|
||||
}
|
||||
})
|
||||
|
||||
const subcommand = argv._[0]
|
||||
|
||||
// options
|
||||
const help = () => {
|
||||
console.log(`
|
||||
${chalk.bold('𝚫 now certs')} <ls | create | renew | replace | rm> <cn>
|
||||
|
||||
${chalk.dim('Note:')}
|
||||
|
||||
This command is intended for advanced use only, normally ${chalk.bold('now')} manages your certificates automatically.
|
||||
|
||||
${chalk.dim('Options:')}
|
||||
|
||||
-h, --help Output usage information
|
||||
-c ${chalk.bold.underline('FILE')}, --config=${chalk.bold.underline('FILE')} Config file
|
||||
-d, --debug Debug mode [off]
|
||||
-t ${chalk.bold.underline('TOKEN')}, --token=${chalk.bold.underline('TOKEN')} Login token
|
||||
--crt ${chalk.bold.underline('FILE')} Certificate file
|
||||
--key ${chalk.bold.underline('FILE')} Certificate key file
|
||||
--ca ${chalk.bold.underline('FILE')} CA certificate chain file
|
||||
|
||||
${chalk.dim('Examples:')}
|
||||
|
||||
${chalk.gray('–')} Listing all your certificates:
|
||||
|
||||
${chalk.cyan('$ now certs ls')}
|
||||
|
||||
${chalk.gray('–')} Creating a new certificate:
|
||||
|
||||
${chalk.cyan('$ now certs create domain.com')}
|
||||
|
||||
${chalk.gray('–')} Renewing an existing certificate issued with ${chalk.bold('now')}:
|
||||
|
||||
${chalk.cyan('$ now certs renew domain.com')}
|
||||
|
||||
${chalk.gray('–')} Replacing an existing certificate with a user-supplied certificate:
|
||||
|
||||
${chalk.cyan('$ now certs replace --crt domain.crt --key domain.key --ca ca_chain.crt domain.com')}
|
||||
`)
|
||||
}
|
||||
|
||||
// options
|
||||
const debug = argv.debug
|
||||
const apiUrl = argv.url || 'https://api.zeit.co'
|
||||
|
||||
if (argv.config) {
|
||||
cfg.setConfigFile(argv.config)
|
||||
}
|
||||
|
||||
const exit = code => {
|
||||
// we give stdout some time to flush out
|
||||
// because there's a node bug where
|
||||
// stdout writes are asynchronous
|
||||
// https://github.com/nodejs/node/issues/6456
|
||||
setTimeout(() => process.exit(code || 0), 100)
|
||||
}
|
||||
|
||||
if (argv.help || !subcommand) {
|
||||
help()
|
||||
exit(0)
|
||||
} else {
|
||||
const config = cfg.read()
|
||||
|
||||
Promise.resolve(argv.token || config.token || login(apiUrl))
|
||||
.then(async token => {
|
||||
try {
|
||||
await run(token)
|
||||
} catch (err) {
|
||||
handleError(err)
|
||||
exit(1)
|
||||
}
|
||||
})
|
||||
.catch(e => {
|
||||
error(`Authentication error – ${e.message}`)
|
||||
exit(1)
|
||||
})
|
||||
}
|
||||
|
||||
function formatExpirationDate(date) {
|
||||
const diff = date - Date.now()
|
||||
return diff < 0 ? chalk.gray(ms(-diff) + ' ago') : chalk.gray('in ' + ms(diff))
|
||||
}
|
||||
|
||||
async function run(token) {
|
||||
const certs = new NowCerts(apiUrl, token, {debug})
|
||||
const args = argv._.slice(1)
|
||||
const start = Date.now()
|
||||
|
||||
if (subcommand === 'ls' || subcommand === 'list') {
|
||||
if (args.length !== 0) {
|
||||
error(`Invalid number of arguments. Usage: ${chalk.cyan('`now certs ls`')}`)
|
||||
return exit(1)
|
||||
}
|
||||
|
||||
const list = await certs.ls()
|
||||
const elapsed = ms(new Date() - start)
|
||||
|
||||
console.log(`> ${list.length} certificate${list.length === 1 ? '' : 's'} found ${chalk.gray(`[${elapsed}]`)}`)
|
||||
|
||||
if (list.length > 0) {
|
||||
const cur = Date.now()
|
||||
list.sort((a, b) => {
|
||||
return a.cn.localeCompare(b.cn)
|
||||
})
|
||||
const header = [['', 'id', 'cn', 'created', 'expiration', 'auto-renew'].map(s => chalk.dim(s))]
|
||||
const out = table(header.concat(list.map(cert => {
|
||||
const cn = chalk.bold(cert.cn)
|
||||
const time = chalk.gray(ms(cur - new Date(cert.created)) + ' ago')
|
||||
const expiration = formatExpirationDate(new Date(cert.expiration))
|
||||
return [
|
||||
'',
|
||||
cert.uid ? cert.uid : 'unknown',
|
||||
cn,
|
||||
time,
|
||||
expiration,
|
||||
cert.autoRenew ? 'yes' : 'no'
|
||||
]
|
||||
})), {align: ['l', 'r', 'l', 'l', 'l'], hsep: ' '.repeat(2), stringLength: strlen})
|
||||
|
||||
if (out) {
|
||||
console.log('\n' + out + '\n')
|
||||
}
|
||||
}
|
||||
} else if (subcommand === 'create') {
|
||||
if (args.length !== 1) {
|
||||
error(`Invalid number of arguments. Usage: ${chalk.cyan('`now certs create <cn>`')}`)
|
||||
return exit(1)
|
||||
}
|
||||
const cn = args[0]
|
||||
let cert
|
||||
|
||||
if (argv.crt || argv.key || argv.ca) { // Issue a custom certificate
|
||||
if (!argv.crt || !argv.key) {
|
||||
error(`Missing required arguments for a custom certificate entry. Usage: ${chalk.cyan('`now certs create --crt DOMAIN.CRT --key DOMAIN.KEY [--ca CA.CRT] <id | cn>`')}`)
|
||||
return exit(1)
|
||||
}
|
||||
|
||||
const crt = readX509File(argv.crt)
|
||||
const key = readX509File(argv.key)
|
||||
const ca = argv.ca ? readX509File(argv.ca) : ''
|
||||
|
||||
cert = await certs.put(cn, crt, key, ca)
|
||||
} else { // Issue a standard certificate
|
||||
cert = await certs.create(cn)
|
||||
}
|
||||
if (!cert) {
|
||||
// Cert is undefined and "Cert is already issued" has been printed to stdout
|
||||
return exit(1)
|
||||
}
|
||||
const elapsed = ms(new Date() - start)
|
||||
console.log(`${chalk.cyan('> Success!')} Certificate entry ${chalk.bold(cn)} ${chalk.gray(`(${cert.uid})`)} created ${chalk.gray(`[${elapsed}]`)}`)
|
||||
} else if (subcommand === 'renew') {
|
||||
if (args.length !== 1) {
|
||||
error(`Invalid number of arguments. Usage: ${chalk.cyan('`now certs renew <id | cn>`')}`)
|
||||
return exit(1)
|
||||
}
|
||||
|
||||
const cert = await getCertIdCn(certs, args[0])
|
||||
if (!cert) {
|
||||
return exit(1)
|
||||
}
|
||||
const yes = await readConfirmation(cert, 'The following certificate will be renewed\n')
|
||||
|
||||
if (!yes) {
|
||||
error('User abort')
|
||||
return exit(0)
|
||||
}
|
||||
|
||||
await certs.renew(cert.cn)
|
||||
const elapsed = ms(new Date() - start)
|
||||
console.log(`${chalk.cyan('> Success!')} Certificate ${chalk.bold(cert.cn)} ${chalk.gray(`(${cert.uid})`)} renewed ${chalk.gray(`[${elapsed}]`)}`)
|
||||
} else if (subcommand === 'replace') {
|
||||
if (!argv.crt || !argv.key) {
|
||||
error(`Invalid number of arguments. Usage: ${chalk.cyan('`now certs replace --crt DOMAIN.CRT --key DOMAIN.KEY [--ca CA.CRT] <id | cn>`')}`)
|
||||
return exit(1)
|
||||
}
|
||||
|
||||
const crt = readX509File(argv.crt)
|
||||
const key = readX509File(argv.key)
|
||||
const ca = argv.ca ? readX509File(argv.ca) : ''
|
||||
|
||||
const cert = await getCertIdCn(certs, args[0])
|
||||
if (!cert) {
|
||||
return exit(1)
|
||||
}
|
||||
const yes = await readConfirmation(cert, 'The following certificate will be replaced permanently\n')
|
||||
if (!yes) {
|
||||
error('User abort')
|
||||
return exit(0)
|
||||
}
|
||||
|
||||
await certs.put(cert.cn, crt, key, ca)
|
||||
const elapsed = ms(new Date() - start)
|
||||
console.log(`${chalk.cyan('> Success!')} Certificate ${chalk.bold(cert.cn)} ${chalk.gray(`(${cert.uid})`)} replaced ${chalk.gray(`[${elapsed}]`)}`)
|
||||
} else if (subcommand === 'rm' || subcommand === 'remove') {
|
||||
if (args.length !== 1) {
|
||||
error(`Invalid number of arguments. Usage: ${chalk.cyan('`now certs rm <id | cn>`')}`)
|
||||
return exit(1)
|
||||
}
|
||||
|
||||
const cert = await getCertIdCn(certs, args[0])
|
||||
if (!cert) {
|
||||
return exit(1)
|
||||
}
|
||||
const yes = await readConfirmation(cert, 'The following certificate will be removed permanently\n')
|
||||
if (!yes) {
|
||||
error('User abort')
|
||||
return exit(0)
|
||||
}
|
||||
|
||||
await certs.delete(cert.cn)
|
||||
const elapsed = ms(new Date() - start)
|
||||
console.log(`${chalk.cyan('> Success!')} Certificate ${chalk.bold(cert.cn)} ${chalk.gray(`(${cert.uid})`)} removed ${chalk.gray(`[${elapsed}]`)}`)
|
||||
} else {
|
||||
error('Please specify a valid subcommand: ls | create | renew | replace | rm')
|
||||
help()
|
||||
exit(1)
|
||||
}
|
||||
return certs.close()
|
||||
}
|
||||
|
||||
process.on('uncaughtException', err => {
|
||||
handleError(err)
|
||||
exit(1)
|
||||
})
|
||||
|
||||
function readConfirmation(cert, msg) {
|
||||
return new Promise(resolve => {
|
||||
const time = chalk.gray(ms(new Date() - new Date(cert.created)) + ' ago')
|
||||
const tbl = table(
|
||||
[[cert.uid, chalk.bold(cert.cn), time]],
|
||||
{align: ['l', 'r', 'l'], hsep: ' '.repeat(6)}
|
||||
)
|
||||
|
||||
process.stdout.write(`> ${msg}`)
|
||||
process.stdout.write(' ' + tbl + '\n')
|
||||
|
||||
process.stdout.write(`${chalk.bold.red('> Are you sure?')} ${chalk.gray('[y/N] ')}`)
|
||||
|
||||
process.stdin.on('data', d => {
|
||||
process.stdin.pause()
|
||||
resolve(d.toString().trim().toLowerCase() === 'y')
|
||||
}).resume()
|
||||
})
|
||||
}
|
||||
|
||||
function readX509File(file) {
|
||||
return fs.readFileSync(path.resolve(file), 'utf8')
|
||||
}
|
||||
|
||||
async function getCertIdCn(certs, idOrCn) {
|
||||
const list = await certs.ls()
|
||||
const thecert = list.filter(cert => {
|
||||
return cert.uid === idOrCn || cert.cn === idOrCn
|
||||
})[0]
|
||||
|
||||
if (!thecert) {
|
||||
error(`No certificate found by id or cn "${idOrCn}"`)
|
||||
return null
|
||||
}
|
||||
|
||||
return thecert
|
||||
}
|
||||
@@ -1,687 +0,0 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
// Native
|
||||
const {resolve, join} = require('path')
|
||||
|
||||
// Packages
|
||||
const Progress = require('progress')
|
||||
const fs = require('fs-promise')
|
||||
const bytes = require('bytes')
|
||||
const chalk = require('chalk')
|
||||
const minimist = require('minimist')
|
||||
const ms = require('ms')
|
||||
const publicSuffixList = require('psl')
|
||||
const flatten = require('arr-flatten')
|
||||
const dotenv = require('dotenv')
|
||||
|
||||
// Ours
|
||||
const copy = require('../lib/copy')
|
||||
const login = require('../lib/login')
|
||||
const cfg = require('../lib/cfg')
|
||||
const {version} = require('../package')
|
||||
const Logger = require('../lib/build-logger')
|
||||
const Now = require('../lib')
|
||||
const toHumanPath = require('../lib/utils/to-human-path')
|
||||
const promptOptions = require('../lib/utils/prompt-options')
|
||||
const {handleError, error} = require('../lib/error')
|
||||
const {fromGit, isRepoPath, gitPathParts} = require('../lib/git')
|
||||
const readMetaData = require('../lib/read-metadata')
|
||||
const checkPath = require('../lib/utils/check-path')
|
||||
const NowAlias = require('../lib/alias')
|
||||
|
||||
const argv = minimist(process.argv.slice(2), {
|
||||
string: [
|
||||
'config',
|
||||
'token',
|
||||
'name',
|
||||
'alias'
|
||||
],
|
||||
boolean: [
|
||||
'help',
|
||||
'version',
|
||||
'debug',
|
||||
'force',
|
||||
'links',
|
||||
'login',
|
||||
'no-clipboard',
|
||||
'forward-npm',
|
||||
'docker',
|
||||
'npm',
|
||||
'static'
|
||||
],
|
||||
alias: {
|
||||
env: 'e',
|
||||
dotenv: 'E',
|
||||
help: 'h',
|
||||
config: 'c',
|
||||
debug: 'd',
|
||||
version: 'v',
|
||||
force: 'f',
|
||||
token: 't',
|
||||
forceSync: 'F',
|
||||
links: 'l',
|
||||
login: 'L',
|
||||
public: 'p',
|
||||
'no-clipboard': 'C',
|
||||
'forward-npm': 'N',
|
||||
name: 'n',
|
||||
alias: 'a'
|
||||
}
|
||||
})
|
||||
|
||||
const help = () => {
|
||||
console.log(`
|
||||
${chalk.bold('𝚫 now')} [options] <command | path>
|
||||
|
||||
${chalk.dim('Commands:')}
|
||||
|
||||
deploy [path] Performs a deployment ${chalk.bold('(default)')}
|
||||
ls | list [app] List deployments
|
||||
rm | remove [id] Remove a deployment
|
||||
ln | alias [id] [url] Configures aliases for deployments
|
||||
domains [name] Manages your domain names
|
||||
certs [cmd] Manages your SSL certificates
|
||||
secrets [name] Manages your secret environment variables
|
||||
dns [name] Manages your DNS records
|
||||
help [cmd] Displays complete help for [cmd]
|
||||
|
||||
${chalk.dim('Options:')}
|
||||
|
||||
-h, --help Output usage information
|
||||
-v, --version Output the version number
|
||||
-n, --name Set the name of the deployment
|
||||
-c ${chalk.underline('FILE')}, --config=${chalk.underline('FILE')} Config file
|
||||
-d, --debug Debug mode [off]
|
||||
-f, --force Force a new deployment even if nothing has changed
|
||||
-t ${chalk.underline('TOKEN')}, --token=${chalk.underline('TOKEN')} Login token
|
||||
-L, --login Configure login
|
||||
-l, --links Copy symlinks without resolving their target
|
||||
-p, --public Deployment is public (${chalk.dim('`/_src`')} is exposed) [on for oss, off for premium]
|
||||
-e, --env Include an env var (e.g.: ${chalk.dim('`-e KEY=value`')}). Can appear many times.
|
||||
-E ${chalk.underline('FILE')}, --dotenv=${chalk.underline('FILE')} Include env vars from .env file. Defaults to '.env'
|
||||
-C, --no-clipboard Do not attempt to copy URL to clipboard
|
||||
-N, --forward-npm Forward login information to install private npm modules
|
||||
-a, --alias Re-assign existing aliases to the deployment
|
||||
|
||||
${chalk.dim('Enforcable Types (when both package.json and Dockerfile exist):')}
|
||||
|
||||
--npm Node.js application
|
||||
--docker Docker container
|
||||
--static Static file hosting
|
||||
|
||||
${chalk.dim('Examples:')}
|
||||
|
||||
${chalk.gray('–')} Deploys the current directory
|
||||
|
||||
${chalk.cyan('$ now')}
|
||||
|
||||
${chalk.gray('–')} Deploys a custom path ${chalk.dim('`/usr/src/project`')}
|
||||
|
||||
${chalk.cyan('$ now /usr/src/project')}
|
||||
|
||||
${chalk.gray('–')} Deploys a GitHub repository
|
||||
|
||||
${chalk.cyan('$ now user/repo#ref')}
|
||||
|
||||
${chalk.gray('–')} Deploys a GitHub, GitLab or Bitbucket repo using its URL
|
||||
|
||||
${chalk.cyan('$ now https://gitlab.com/user/repo')}
|
||||
|
||||
${chalk.gray('–')} Deploys with ENV vars
|
||||
|
||||
${chalk.cyan('$ now -e NODE_ENV=production -e MYSQL_PASSWORD=@mysql-password')}
|
||||
|
||||
${chalk.gray('–')} Displays comprehensive help for the subcommand ${chalk.dim('`list`')}
|
||||
|
||||
${chalk.cyan('$ now help list')}
|
||||
`)
|
||||
}
|
||||
|
||||
let path = argv._[0]
|
||||
|
||||
if (path) {
|
||||
// if path is relative: resolve
|
||||
// if path is absolute: clear up strange `/` etc
|
||||
path = resolve(process.cwd(), path)
|
||||
} else {
|
||||
path = process.cwd()
|
||||
}
|
||||
|
||||
// If the current deployment is a repo
|
||||
const gitRepo = {}
|
||||
|
||||
const exit = code => {
|
||||
// we give stdout some time to flush out
|
||||
// because there's a node bug where
|
||||
// stdout writes are asynchronous
|
||||
// https://github.com/nodejs/node/issues/6456
|
||||
setTimeout(() => process.exit(code || 0), 100)
|
||||
}
|
||||
|
||||
// options
|
||||
let forceNew = argv.force
|
||||
const debug = argv.debug
|
||||
const clipboard = !argv['no-clipboard']
|
||||
const forwardNpm = argv['forward-npm']
|
||||
const forceSync = argv.forceSync
|
||||
const shouldLogin = argv.login
|
||||
const followSymlinks = !argv.links
|
||||
const wantsPublic = argv.public
|
||||
const deploymentName = argv.name || false
|
||||
const apiUrl = argv.url || 'https://api.zeit.co'
|
||||
const isTTY = process.stdout.isTTY
|
||||
const quiet = !isTTY
|
||||
const autoAliases = typeof argv.alias === 'undefined' ? false : flatten([argv.alias])
|
||||
|
||||
if (argv.config) {
|
||||
cfg.setConfigFile(argv.config)
|
||||
}
|
||||
|
||||
// Create a new deployment if user changed
|
||||
// the name or made _src public.
|
||||
// This should just work fine because it doesn't
|
||||
// force a new sync, it just forces a new deployment.
|
||||
if (deploymentName || wantsPublic) {
|
||||
forceNew = true
|
||||
}
|
||||
|
||||
const config = cfg.read()
|
||||
const alwaysForwardNpm = config.forwardNpm
|
||||
|
||||
if (argv.h || argv.help) {
|
||||
help()
|
||||
exit(0)
|
||||
} else if (argv.v || argv.version) {
|
||||
console.log(chalk.bold('𝚫 now'), version)
|
||||
process.exit(0)
|
||||
} else if (!(argv.token || config.token) || shouldLogin) {
|
||||
login(apiUrl)
|
||||
.then(token => {
|
||||
if (shouldLogin) {
|
||||
console.log('> Logged in successfully. Token saved in ~/.now.json')
|
||||
process.exit(0)
|
||||
} else {
|
||||
sync(token).catch(err => {
|
||||
error(`Unknown error: ${err}\n${err.stack}`)
|
||||
process.exit(1)
|
||||
})
|
||||
}
|
||||
})
|
||||
.catch(e => {
|
||||
error(`Authentication error – ${e.message}`)
|
||||
process.exit(1)
|
||||
})
|
||||
} else {
|
||||
sync(argv.token || config.token).catch(err => {
|
||||
error(`Unknown error: ${err}\n${err.stack}`)
|
||||
process.exit(1)
|
||||
})
|
||||
}
|
||||
|
||||
async function sync(token) {
|
||||
const start = Date.now()
|
||||
const rawPath = argv._[0]
|
||||
|
||||
const stopDeployment = msg => {
|
||||
error(msg)
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
const isValidRepo = isRepoPath(rawPath)
|
||||
|
||||
try {
|
||||
await fs.stat(path)
|
||||
} catch (err) {
|
||||
let repo
|
||||
|
||||
if (isValidRepo && isValidRepo !== 'no-valid-url') {
|
||||
const gitParts = gitPathParts(rawPath)
|
||||
Object.assign(gitRepo, gitParts)
|
||||
|
||||
const searchMessage = setTimeout(() => {
|
||||
console.log(`> Didn't find directory. Searching on ${gitRepo.type}...`)
|
||||
}, 500)
|
||||
|
||||
try {
|
||||
repo = await fromGit(rawPath, debug)
|
||||
} catch (err) {}
|
||||
|
||||
clearTimeout(searchMessage)
|
||||
}
|
||||
|
||||
if (repo) {
|
||||
// Tell now which directory to deploy
|
||||
path = repo.path
|
||||
|
||||
// Set global variable for deleting tmp dir later
|
||||
// once the deployment has finished
|
||||
Object.assign(gitRepo, repo)
|
||||
} else if (isValidRepo === 'no-valid-url') {
|
||||
stopDeployment(`This URL is neither a valid repository from GitHub, nor from GitLab.`)
|
||||
} else if (isValidRepo) {
|
||||
const gitRef = gitRepo.ref ? `with "${chalk.bold(gitRepo.ref)}" ` : ''
|
||||
stopDeployment(`There's no repository named "${chalk.bold(gitRepo.main)}" ${gitRef}on ${gitRepo.type}`)
|
||||
} else {
|
||||
stopDeployment(`Could not read directory ${chalk.bold(path)}`)
|
||||
}
|
||||
}
|
||||
|
||||
// Make sure that directory is deployable
|
||||
await checkPath(path)
|
||||
|
||||
if (!quiet) {
|
||||
if (gitRepo.main) {
|
||||
const gitRef = gitRepo.ref ? ` at "${chalk.bold(gitRepo.ref)}" ` : ''
|
||||
console.log(`> Deploying ${gitRepo.type} repository "${chalk.bold(gitRepo.main)}"` + gitRef)
|
||||
} else {
|
||||
console.log(`> Deploying ${chalk.bold(toHumanPath(path))}`)
|
||||
}
|
||||
}
|
||||
|
||||
let deploymentType
|
||||
|
||||
let hasPackage
|
||||
let hasDockerfile
|
||||
let isStatic
|
||||
|
||||
if (argv.docker) {
|
||||
if (debug) {
|
||||
console.log(`> [debug] Forcing \`deploymentType\` = \`docker\``)
|
||||
}
|
||||
|
||||
deploymentType = 'docker'
|
||||
} else if (argv.npm) {
|
||||
deploymentType = 'npm'
|
||||
} else if (argv.static) {
|
||||
if (debug) {
|
||||
console.log(`> [debug] Forcing static deployment`)
|
||||
}
|
||||
|
||||
deploymentType = 'npm'
|
||||
isStatic = true
|
||||
} else {
|
||||
try {
|
||||
await fs.stat(resolve(path, 'package.json'))
|
||||
} catch (err) {
|
||||
hasPackage = true
|
||||
}
|
||||
|
||||
[hasPackage, hasDockerfile] = await Promise.all([
|
||||
await (async () => {
|
||||
try {
|
||||
await fs.stat(resolve(path, 'package.json'))
|
||||
} catch (err) {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
})(),
|
||||
await (async () => {
|
||||
try {
|
||||
await fs.stat(resolve(path, 'Dockerfile'))
|
||||
} catch (err) {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
})()
|
||||
])
|
||||
|
||||
if (hasPackage && hasDockerfile) {
|
||||
if (debug) {
|
||||
console.log('[debug] multiple manifests found, disambiguating')
|
||||
}
|
||||
|
||||
if (isTTY) {
|
||||
try {
|
||||
console.log(`> Two manifests found. Press [${chalk.bold('n')}] to deploy or re-run with --flag`)
|
||||
deploymentType = await promptOptions([
|
||||
['npm', `${chalk.bold('package.json')}\t${chalk.gray(' --npm')} `],
|
||||
['docker', `${chalk.bold('Dockerfile')}\t${chalk.gray('--docker')} `]
|
||||
])
|
||||
} catch (err) {
|
||||
error(err.message)
|
||||
process.exit(1)
|
||||
}
|
||||
} else {
|
||||
error('Ambiguous deployment (`package.json` and `Dockerfile` found). ' +
|
||||
'Please supply `--npm` or `--docker` to disambiguate.')
|
||||
}
|
||||
} else if (hasPackage) {
|
||||
if (debug) {
|
||||
console.log('> [debug] `package.json` found, assuming `deploymentType` = `npm`')
|
||||
}
|
||||
|
||||
deploymentType = 'npm'
|
||||
} else if (hasDockerfile) {
|
||||
if (debug) {
|
||||
console.log('> [debug] `Dockerfile` found, assuming `deploymentType` = `docker`')
|
||||
}
|
||||
|
||||
deploymentType = 'docker'
|
||||
} else {
|
||||
if (debug) {
|
||||
console.log('> [debug] No manifest files found, assuming static deployment')
|
||||
}
|
||||
|
||||
isStatic = true
|
||||
}
|
||||
}
|
||||
|
||||
const {nowConfig} = await readMetaData(path, {
|
||||
deploymentType,
|
||||
deploymentName,
|
||||
isStatic,
|
||||
quiet: true
|
||||
})
|
||||
|
||||
const now = new Now(apiUrl, token, {debug})
|
||||
|
||||
let dotenvConfig
|
||||
if (argv.dotenv) {
|
||||
const dotenvFileName = typeof argv.dotenv === 'string' ? argv.dotenv : '.env'
|
||||
|
||||
if (!fs.existsSync(dotenvFileName)) {
|
||||
error(`--dotenv flag is set but ${dotenvFileName} file is missing`)
|
||||
return process.exit(1)
|
||||
}
|
||||
|
||||
const dotenvFile = await fs.readFile(dotenvFileName)
|
||||
dotenvConfig = dotenv.parse(dotenvFile)
|
||||
}
|
||||
|
||||
// Merge `now.env` from package.json with `-e` arguments.
|
||||
const pkgEnv = nowConfig && nowConfig.env
|
||||
const envs = [
|
||||
...Object.keys(dotenvConfig || {}).map(k => `${k}=${dotenvConfig[k]}`),
|
||||
...Object.keys(pkgEnv || {}).map(k => `${k}=${pkgEnv[k]}`),
|
||||
...[].concat(argv.env || [])
|
||||
]
|
||||
|
||||
let secrets
|
||||
const findSecret = async uidOrName => {
|
||||
if (!secrets) {
|
||||
secrets = await now.listSecrets()
|
||||
}
|
||||
|
||||
return secrets.filter(secret => {
|
||||
return secret.name === uidOrName || secret.uid === uidOrName
|
||||
})
|
||||
}
|
||||
|
||||
const env_ = await Promise.all(envs.map(async kv => {
|
||||
if (typeof kv !== 'string') {
|
||||
error('Env key and value missing')
|
||||
return process.exit(1)
|
||||
}
|
||||
|
||||
const [key, ...rest] = kv.split('=')
|
||||
let val
|
||||
|
||||
if (rest.length > 0) {
|
||||
val = rest.join('=')
|
||||
}
|
||||
|
||||
if (/[^A-z0-9_]/i.test(key)) {
|
||||
error(`Invalid ${chalk.dim('-e')} key ${chalk.bold(`"${chalk.bold(key)}"`)}. Only letters, digits and underscores are allowed.`)
|
||||
return process.exit(1)
|
||||
}
|
||||
|
||||
if (!key) {
|
||||
error(`Invalid env option ${chalk.bold(`"${kv}"`)}`)
|
||||
return process.exit(1)
|
||||
}
|
||||
|
||||
if (val === undefined) {
|
||||
if ((key in process.env)) {
|
||||
console.log(`> Reading ${chalk.bold(`"${chalk.bold(key)}"`)} from your env (as no value was specified)`)
|
||||
// escape value if it begins with @
|
||||
val = process.env[key].replace(/^@/, '\\@')
|
||||
} else {
|
||||
error(`No value specified for env ${chalk.bold(`"${chalk.bold(key)}"`)} and it was not found in your env.`)
|
||||
return process.exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
if (val[0] === '@') {
|
||||
const uidOrName = val.substr(1)
|
||||
const secrets = await findSecret(uidOrName)
|
||||
if (secrets.length === 0) {
|
||||
if (uidOrName === '') {
|
||||
error(`Empty reference provided for env key ${chalk.bold(`"${chalk.bold(key)}"`)}`)
|
||||
} else {
|
||||
error(`No secret found by uid or name ${chalk.bold(`"${uidOrName}"`)}`)
|
||||
}
|
||||
return process.exit(1)
|
||||
} else if (secrets.length > 1) {
|
||||
error(`Ambiguous secret ${chalk.bold(`"${uidOrName}"`)} (matches ${chalk.bold(secrets.length)} secrets)`)
|
||||
return process.exit(1)
|
||||
}
|
||||
|
||||
val = {uid: secrets[0].uid}
|
||||
}
|
||||
|
||||
return [
|
||||
key,
|
||||
typeof val === 'string' ? val.replace(/^\\@/, '@') : val
|
||||
]
|
||||
}))
|
||||
|
||||
const env = {}
|
||||
env_
|
||||
.filter(v => Boolean(v))
|
||||
.forEach(([key, val]) => {
|
||||
if (key in env) {
|
||||
console.log(`> ${chalk.yellow('NOTE:')} Overriding duplicate env key ${chalk.bold(`"${key}"`)}`)
|
||||
}
|
||||
|
||||
env[key] = val
|
||||
})
|
||||
|
||||
try {
|
||||
await now.create(path, {
|
||||
env,
|
||||
deploymentType,
|
||||
deploymentName,
|
||||
followSymlinks,
|
||||
forceNew,
|
||||
forceSync,
|
||||
forwardNpm: alwaysForwardNpm || forwardNpm,
|
||||
quiet,
|
||||
wantsPublic,
|
||||
isStatic
|
||||
})
|
||||
} catch (err) {
|
||||
if (debug) {
|
||||
console.log(`> [debug] error: ${err}\n${err.stack}`)
|
||||
}
|
||||
|
||||
handleError(err)
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
const {url} = now
|
||||
const elapsed = ms(new Date() - start)
|
||||
|
||||
if (isTTY) {
|
||||
if (clipboard) {
|
||||
try {
|
||||
await copy(url)
|
||||
console.log(`${chalk.cyan('> Ready!')} ${chalk.bold(url)} (copied to clipboard) [${elapsed}]`)
|
||||
} catch (err) {
|
||||
console.log(`${chalk.cyan('> Ready!')} ${chalk.bold(url)} [${elapsed}]`)
|
||||
}
|
||||
} else {
|
||||
console.log(`> ${url} [${elapsed}]`)
|
||||
}
|
||||
} else {
|
||||
process.stdout.write(url)
|
||||
}
|
||||
|
||||
const startU = new Date()
|
||||
|
||||
const complete = () => {
|
||||
if (!quiet) {
|
||||
const elapsedU = ms(new Date() - startU)
|
||||
console.log(`> Sync complete (${bytes(now.syncAmount)}) [${elapsedU}] `)
|
||||
console.log('> Initializing…')
|
||||
}
|
||||
|
||||
// close http2 agent
|
||||
now.close()
|
||||
|
||||
// show build logs
|
||||
printLogs(now.host, token)
|
||||
}
|
||||
|
||||
if (now.syncAmount) {
|
||||
const bar = new Progress('> Upload [:bar] :percent :etas', {
|
||||
width: 20,
|
||||
complete: '=',
|
||||
incomplete: '',
|
||||
total: now.syncAmount
|
||||
})
|
||||
|
||||
now.upload()
|
||||
|
||||
now.on('upload', ({names, data}) => {
|
||||
const amount = data.length
|
||||
if (debug) {
|
||||
console.log(`> [debug] Uploaded: ${names.join(' ')} (${bytes(data.length)})`)
|
||||
}
|
||||
bar.tick(amount)
|
||||
})
|
||||
|
||||
now.on('complete', complete)
|
||||
|
||||
now.on('error', err => {
|
||||
error('Upload failed')
|
||||
handleError(err)
|
||||
process.exit(1)
|
||||
})
|
||||
} else {
|
||||
if (!quiet) {
|
||||
console.log(`> Initializing…`)
|
||||
}
|
||||
|
||||
// close http2 agent
|
||||
now.close()
|
||||
|
||||
// show build logs
|
||||
printLogs(now.host, token)
|
||||
}
|
||||
}
|
||||
|
||||
const assignAlias = async (autoAlias, token, deployment) => {
|
||||
const type = publicSuffixList.isValid(autoAlias) ? 'alias' : 'uid'
|
||||
|
||||
const aliases = new NowAlias(apiUrl, token, {debug})
|
||||
const list = await aliases.ls()
|
||||
|
||||
let related
|
||||
|
||||
// Check if alias even exists
|
||||
for (const alias of list) {
|
||||
if (alias[type] === autoAlias) {
|
||||
related = alias
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
// If alias doesn't exist
|
||||
if (!related) {
|
||||
// Check if the uid was actually an alias
|
||||
if (type === 'uid') {
|
||||
return assignAlias(`${autoAlias}.now.sh`, token, deployment)
|
||||
}
|
||||
|
||||
// If not, throw an error
|
||||
const withID = type === 'uid' ? 'with ID ' : ''
|
||||
error(`Alias ${withID}"${autoAlias}" doesn't exist`)
|
||||
return
|
||||
}
|
||||
|
||||
console.log(`> Assigning alias ${chalk.bold.underline(related.alias)} to deployment...`)
|
||||
|
||||
// Assign alias
|
||||
await aliases.set(String(deployment), String(related.alias))
|
||||
}
|
||||
|
||||
async function realias(token, host) {
|
||||
const path = process.cwd()
|
||||
|
||||
const configFiles = {
|
||||
pkg: join(path, 'package.json'),
|
||||
nowJSON: join(path, 'now.json')
|
||||
}
|
||||
|
||||
if (!fs.existsSync(configFiles.pkg) && !fs.existsSync(configFiles.nowJSON)) {
|
||||
error(`Couldn't find a now.json or package.json file with an alias list in it`)
|
||||
return
|
||||
}
|
||||
|
||||
const {nowConfig} = await readMetaData(path, {
|
||||
deploymentType: 'npm', // hard coding settings…
|
||||
quiet: true // `quiet`
|
||||
})
|
||||
|
||||
const targets = nowConfig && nowConfig.aliases
|
||||
|
||||
// the user never intended to support aliases from the package
|
||||
if (!targets || !Array.isArray(targets)) {
|
||||
help()
|
||||
return exit(0)
|
||||
}
|
||||
|
||||
for (const target of targets) {
|
||||
await assignAlias(target, token, host)
|
||||
}
|
||||
}
|
||||
|
||||
function printLogs(host, token) {
|
||||
// log build
|
||||
const logger = new Logger(host, {debug, quiet})
|
||||
|
||||
logger.on('error', async () => {
|
||||
if (!quiet) {
|
||||
console.log(`${chalk.cyan('> Deployment failed!')}`)
|
||||
}
|
||||
|
||||
if (gitRepo && gitRepo.cleanup) {
|
||||
// Delete temporary directory that contains repository
|
||||
gitRepo.cleanup()
|
||||
|
||||
if (debug) {
|
||||
console.log(`> [debug] Removed temporary repo directory`)
|
||||
}
|
||||
}
|
||||
process.exit(1)
|
||||
})
|
||||
|
||||
logger.on('close', async () => {
|
||||
if (Array.isArray(autoAliases)) {
|
||||
const aliasList = autoAliases.filter(item => item !== '')
|
||||
|
||||
if (aliasList.length > 0) {
|
||||
for (const alias of aliasList) {
|
||||
await assignAlias(alias, token, host)
|
||||
}
|
||||
} else {
|
||||
await realias(token, host)
|
||||
}
|
||||
}
|
||||
|
||||
if (!quiet) {
|
||||
console.log(`${chalk.cyan('> Deployment complete!')}`)
|
||||
}
|
||||
|
||||
if (gitRepo && gitRepo.cleanup) {
|
||||
// Delete temporary directory that contains repository
|
||||
gitRepo.cleanup()
|
||||
|
||||
if (debug) {
|
||||
console.log(`> [debug] Removed temporary repo directory`)
|
||||
}
|
||||
}
|
||||
|
||||
process.exit(0)
|
||||
})
|
||||
}
|
||||
205
bin/now-dns.js
205
bin/now-dns.js
@@ -1,205 +0,0 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
// Packages
|
||||
const chalk = require('chalk')
|
||||
const minimist = require('minimist')
|
||||
const ms = require('ms')
|
||||
const table = require('text-table')
|
||||
|
||||
// Ours
|
||||
const cfg = require('../lib/cfg')
|
||||
const DomainRecords = require('../lib/domain-records')
|
||||
const indent = require('../lib/indent')
|
||||
const login = require('../lib/login')
|
||||
const strlen = require('../lib/strlen')
|
||||
const {handleError, error} = require('../lib/error')
|
||||
|
||||
const argv = minimist(process.argv.slice(2), {
|
||||
string: ['config'],
|
||||
boolean: ['help', 'debug'],
|
||||
alias: {
|
||||
help: 'h',
|
||||
config: 'c',
|
||||
debug: 'd',
|
||||
token: 't'
|
||||
}
|
||||
})
|
||||
|
||||
const subcommand = argv._[0]
|
||||
|
||||
// options
|
||||
const help = () => {
|
||||
console.log(`
|
||||
${chalk.bold('𝚫 now dns ls')} [domain]
|
||||
${chalk.bold('𝚫 now dns add')} <domain> <name> <A | AAAA | ALIAS | CNAME | MX | TXT> <value> [mx_priority]
|
||||
${chalk.bold('𝚫 now dns rm')} <id>
|
||||
|
||||
${chalk.dim('Options:')}
|
||||
|
||||
-h, --help output usage information
|
||||
-c ${chalk.bold.underline('FILE')}, --config=${chalk.bold.underline('FILE')} config file
|
||||
-d, --debug debug mode [off]
|
||||
-t ${chalk.bold.underline('TOKEN')}, --token=${chalk.bold.underline('TOKEN')} login token
|
||||
|
||||
${chalk.dim('Examples:')}
|
||||
|
||||
${chalk.gray('–')} List all your DNS records
|
||||
|
||||
${chalk.cyan('$ now dns ls')}
|
||||
|
||||
${chalk.gray('–')} Add an A record for a subdomain
|
||||
|
||||
${chalk.cyan('$ now dns add <YOUR DOMAIN> <SUBDOMAIN NAME> A <RECORD VALUE>')}
|
||||
${chalk.cyan('$ now dns add zeit.rocks api A 198.51.100.100')}
|
||||
|
||||
${chalk.gray('–')} Add an MX record (@ as a name refers to the domain)
|
||||
|
||||
${chalk.cyan('$ now dns add <YOUR DOMAIN> @ MX <RECORD VALUE> <PRIORITY>')}
|
||||
${chalk.cyan('$ now dns add zeit.rocks @ MX mail.zeit.rocks 10')}
|
||||
`)
|
||||
}
|
||||
|
||||
// options
|
||||
const debug = argv.debug
|
||||
const apiUrl = argv.url || 'https://api.zeit.co'
|
||||
if (argv.config) {
|
||||
cfg.setConfigFile(argv.config)
|
||||
}
|
||||
|
||||
const exit = code => {
|
||||
// we give stdout some time to flush out
|
||||
// because there's a node bug where
|
||||
// stdout writes are asynchronous
|
||||
// https://github.com/nodejs/node/issues/6456
|
||||
setTimeout(() => process.exit(code || 0), 100)
|
||||
}
|
||||
|
||||
if (argv.help || !subcommand) {
|
||||
help()
|
||||
exit(0)
|
||||
} else {
|
||||
const config = cfg.read()
|
||||
|
||||
Promise.resolve(argv.token || config.token || login(apiUrl))
|
||||
.then(async token => {
|
||||
try {
|
||||
await run(token)
|
||||
} catch (err) {
|
||||
handleError(err)
|
||||
exit(1)
|
||||
}
|
||||
})
|
||||
.catch(e => {
|
||||
error(`Authentication error – ${e.message}`)
|
||||
exit(1)
|
||||
})
|
||||
}
|
||||
|
||||
async function run(token) {
|
||||
const domainRecords = new DomainRecords(apiUrl, token, {debug})
|
||||
const args = argv._.slice(1)
|
||||
const start = Date.now()
|
||||
|
||||
if (subcommand === 'ls' || subcommand === 'list') {
|
||||
if (args.length > 1) {
|
||||
error(`Invalid number of arguments. Usage: ${chalk.cyan('`now dns ls [domain]`')}`)
|
||||
return exit(1)
|
||||
}
|
||||
|
||||
const elapsed = ms(new Date() - start)
|
||||
const res = await domainRecords.ls(args[0])
|
||||
const text = []
|
||||
let count = 0
|
||||
res.forEach((records, domain) => {
|
||||
count += records.length
|
||||
if (records.length > 0) {
|
||||
const cur = Date.now()
|
||||
const header = [['', 'id', 'name', 'type', 'value', 'aux', 'created'].map(s => chalk.dim(s))]
|
||||
const out = table(header.concat(records.map(record => {
|
||||
const time = chalk.gray(ms(cur - new Date(Number(record.created))) + ' ago')
|
||||
return [
|
||||
'',
|
||||
record.id,
|
||||
record.name,
|
||||
record.type,
|
||||
record.value,
|
||||
record.mxPriority ? record.mxPriority : '',
|
||||
time
|
||||
]
|
||||
})), {align: ['l', 'r', 'l', 'l', 'l', 'l'], hsep: ' '.repeat(2), stringLength: strlen})
|
||||
text.push(`\n\n${chalk.bold(domain)}\n${indent(out, 2)}`)
|
||||
}
|
||||
})
|
||||
console.log(`> ${count} record${count === 1 ? '' : 's'} found ${chalk.gray(`[${elapsed}]`)}`)
|
||||
console.log(text.join(''))
|
||||
} else if (subcommand === 'add') {
|
||||
const domain = args[0]
|
||||
const name = args[1] === '@' ? '' : args[1]
|
||||
const type = args[2]
|
||||
const value = args[3]
|
||||
const mxPriority = args[4]
|
||||
|
||||
if (!(args.length >= 4 && args.length <= 5) ||
|
||||
(type === 'MX' ? !mxPriority : mxPriority)) {
|
||||
error(`Invalid number of arguments. Usage: ${chalk.cyan('`now dns add <domain> <name> <type> <value> [mx_priority]`')}`)
|
||||
return exit(1)
|
||||
}
|
||||
|
||||
const record = await domainRecords.create(domain, {name, type, value, mxPriority})
|
||||
const elapsed = ms(new Date() - start)
|
||||
console.log(`${chalk.cyan('> Success!')} A new DNS record for domain ${chalk.bold(domain)} ${chalk.gray(`(${record.uid})`)} created ${chalk.gray(`[${elapsed}]`)}`)
|
||||
} else if (subcommand === 'rm' || subcommand === 'remove') {
|
||||
if (args.length !== 1) {
|
||||
error(`Invalid number of arguments. Usage: ${chalk.cyan('`now dns rm <id>`')}`)
|
||||
return exit(1)
|
||||
}
|
||||
|
||||
const record = await domainRecords.getRecord(args[0])
|
||||
if (!record) {
|
||||
error('DNS record not found')
|
||||
return exit(1)
|
||||
}
|
||||
|
||||
const yes = await readConfirmation(record, 'The following record will be removed permanently\n')
|
||||
if (!yes) {
|
||||
error('User abort')
|
||||
return exit(0)
|
||||
}
|
||||
|
||||
await domainRecords.delete(record.domain, record.id)
|
||||
const elapsed = ms(new Date() - start)
|
||||
console.log(`${chalk.cyan('> Success!')} Record ${chalk.gray(`${record.id}`)} removed ${chalk.gray(`[${elapsed}]`)}`)
|
||||
} else {
|
||||
error('Please specify a valid subcommand: ls | add | rm')
|
||||
help()
|
||||
exit(1)
|
||||
}
|
||||
return domainRecords.close()
|
||||
}
|
||||
|
||||
process.on('uncaughtException', err => {
|
||||
handleError(err)
|
||||
exit(1)
|
||||
})
|
||||
|
||||
function readConfirmation(record, msg) {
|
||||
return new Promise(resolve => {
|
||||
const time = chalk.gray(ms(new Date() - new Date(Number(record.created))) + ' ago')
|
||||
const tbl = table(
|
||||
[[record.id,
|
||||
chalk.bold(`${record.name.length > 0 ? record.name + '.' : ''}${record.domain} ${record.type} ${record.value} ${record.mxPriority ? record.mxPriority : ''}`),
|
||||
time]],
|
||||
{align: ['l', 'r', 'l'], hsep: ' '.repeat(6)}
|
||||
)
|
||||
|
||||
process.stdout.write(`> ${msg}`)
|
||||
process.stdout.write(' ' + tbl + '\n')
|
||||
|
||||
process.stdout.write(`${chalk.bold.red('> Are you sure?')} ${chalk.gray('[y/N] ')}`)
|
||||
|
||||
process.stdin.on('data', d => {
|
||||
process.stdin.pause()
|
||||
resolve(d.toString().trim().toLowerCase() === 'y')
|
||||
}).resume()
|
||||
})
|
||||
}
|
||||
@@ -1,297 +0,0 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
// Packages
|
||||
const chalk = require('chalk')
|
||||
const minimist = require('minimist')
|
||||
const table = require('text-table')
|
||||
const ms = require('ms')
|
||||
|
||||
// Ours
|
||||
const login = require('../lib/login')
|
||||
const cfg = require('../lib/cfg')
|
||||
const {error} = require('../lib/error')
|
||||
const toHost = require('../lib/to-host')
|
||||
const strlen = require('../lib/strlen')
|
||||
const NowDomains = require('../lib/domains')
|
||||
|
||||
const argv = minimist(process.argv.slice(2), {
|
||||
string: ['config', 'token'],
|
||||
boolean: ['help', 'debug', 'external', 'force'],
|
||||
alias: {
|
||||
help: 'h',
|
||||
config: 'c',
|
||||
debug: 'd',
|
||||
external: 'e',
|
||||
force: 'f',
|
||||
token: 't'
|
||||
}
|
||||
})
|
||||
|
||||
const subcommand = argv._[0]
|
||||
|
||||
// options
|
||||
const help = () => {
|
||||
console.log(`
|
||||
${chalk.bold('𝚫 now domains')} <ls | add | rm> <domain>
|
||||
|
||||
${chalk.dim('Options:')}
|
||||
|
||||
-h, --help Output usage information
|
||||
-c ${chalk.bold.underline('FILE')}, --config=${chalk.bold.underline('FILE')} Config file
|
||||
-d, --debug Debug mode [off]
|
||||
-e, --external Use external DNS server
|
||||
-f, --force Skip DNS verification
|
||||
-t ${chalk.bold.underline('TOKEN')}, --token=${chalk.bold.underline('TOKEN')} Login token
|
||||
|
||||
${chalk.dim('Examples:')}
|
||||
|
||||
${chalk.gray('–')} Lists all your domains:
|
||||
|
||||
${chalk.cyan('$ now domains ls')}
|
||||
|
||||
${chalk.gray('–')} Adds a domain name:
|
||||
|
||||
${chalk.cyan(`$ now domains add ${chalk.underline('my-app.com')}`)}
|
||||
|
||||
Make sure the domain's DNS nameservers are at least 2 of these:
|
||||
|
||||
${chalk.gray('–')} ${chalk.underline('california.zeit.world')} ${chalk.dim('173.255.215.107')}
|
||||
${chalk.gray('–')} ${chalk.underline('london.zeit.world')} ${chalk.dim('178.62.47.76')}
|
||||
${chalk.gray('–')} ${chalk.underline('newark.zeit.world')} ${chalk.dim('173.255.231.87')}
|
||||
${chalk.gray('–')} ${chalk.underline('amsterdam.zeit.world')} ${chalk.dim('188.226.197.55')}
|
||||
${chalk.gray('–')} ${chalk.underline('dallas.zeit.world')} ${chalk.dim('173.192.101.194')}
|
||||
${chalk.gray('–')} ${chalk.underline('paris.zeit.world')} ${chalk.dim('37.123.115.172')}
|
||||
${chalk.gray('–')} ${chalk.underline('singapore.zeit.world')} ${chalk.dim('119.81.97.170')}
|
||||
${chalk.gray('–')} ${chalk.underline('sydney.zeit.world')} ${chalk.dim('52.64.171.200')}
|
||||
${chalk.gray('–')} ${chalk.underline('frankfurt.zeit.world')} ${chalk.dim('91.109.245.139')}
|
||||
${chalk.gray('–')} ${chalk.underline('iowa.zeit.world')} ${chalk.dim('23.236.59.22')}
|
||||
|
||||
${chalk.yellow('NOTE:')} running ${chalk.dim('`now alias`')} will automatically register your domain
|
||||
if it's configured with these nameservers (no need to ${chalk.dim('`domain add`')}).
|
||||
|
||||
For more details head to ${chalk.underline('https://zeit.world')}.
|
||||
|
||||
${chalk.gray('–')} Removing a domain:
|
||||
|
||||
${chalk.cyan('$ now domain rm my-app.com')}
|
||||
|
||||
or
|
||||
|
||||
${chalk.cyan('$ now domain rm domainId')}
|
||||
|
||||
To get the list of domain ids, use ${chalk.dim('`now domains ls`')}.
|
||||
|
||||
${chalk.gray('–')} Adding and verifying a domain name using zeit.world nameservers:
|
||||
|
||||
${chalk.cyan('$ now domain add my-app.com')}
|
||||
|
||||
The command will tell you if the domain was verified succesfully. In case the domain was not verified succesfully you should retry adding the domain after some time.
|
||||
|
||||
${chalk.gray('–')} Adding and verifying a domain name using an external nameserver:
|
||||
|
||||
${chalk.cyan('$ now domain add -e my-app.com')}
|
||||
|
||||
and follow the verification instructions if requested. Finally, rerun the same command after completing the verification step.
|
||||
`)
|
||||
}
|
||||
|
||||
// options
|
||||
const debug = argv.debug
|
||||
const apiUrl = argv.url || 'https://api.zeit.co'
|
||||
|
||||
if (argv.config) {
|
||||
cfg.setConfigFile(argv.config)
|
||||
}
|
||||
|
||||
const exit = code => {
|
||||
// we give stdout some time to flush out
|
||||
// because there's a node bug where
|
||||
// stdout writes are asynchronous
|
||||
// https://github.com/nodejs/node/issues/6456
|
||||
setTimeout(() => process.exit(code || 0), 100)
|
||||
}
|
||||
|
||||
if (argv.help || !subcommand) {
|
||||
help()
|
||||
exit(0)
|
||||
} else {
|
||||
const config = cfg.read()
|
||||
|
||||
Promise.resolve(argv.token || config.token || login(apiUrl))
|
||||
.then(async token => {
|
||||
try {
|
||||
await run(token)
|
||||
} catch (err) {
|
||||
if (err.userError) {
|
||||
error(err.message)
|
||||
} else {
|
||||
error(`Unknown error: ${err}\n${err.stack}`)
|
||||
}
|
||||
exit(1)
|
||||
}
|
||||
})
|
||||
.catch(e => {
|
||||
error(`Authentication error – ${e.message}`)
|
||||
exit(1)
|
||||
})
|
||||
}
|
||||
|
||||
async function run(token) {
|
||||
const domain = new NowDomains(apiUrl, token, {debug})
|
||||
const args = argv._.slice(1)
|
||||
|
||||
switch (subcommand) {
|
||||
case 'ls':
|
||||
case 'list': {
|
||||
if (args.length !== 0) {
|
||||
error('Invalid number of arguments')
|
||||
return exit(1)
|
||||
}
|
||||
|
||||
const start_ = new Date()
|
||||
const domains = await domain.ls()
|
||||
domains.sort((a, b) => new Date(b.created) - new Date(a.created))
|
||||
const current = new Date()
|
||||
const header = [['', 'id', 'dns', 'url', 'verified', 'created'].map(s => chalk.dim(s))]
|
||||
const out = domains.length === 0 ? null : table(header.concat(domains.map(domain => {
|
||||
const ns = domain.isExternal ? 'external' : 'zeit.world'
|
||||
const url = chalk.underline(`https://${domain.name}`)
|
||||
const time = chalk.gray(ms(current - new Date(domain.created)) + ' ago')
|
||||
return [
|
||||
'',
|
||||
domain.uid,
|
||||
ns,
|
||||
url,
|
||||
domain.verified,
|
||||
time
|
||||
]
|
||||
})), {align: ['l', 'r', 'l', 'l', 'l', 'l'], hsep: ' '.repeat(2), stringLength: strlen})
|
||||
|
||||
const elapsed_ = ms(new Date() - start_)
|
||||
console.log(`> ${domains.length} domain${domains.length === 1 ? '' : 's'} found ${chalk.gray(`[${elapsed_}]`)}`)
|
||||
|
||||
if (out) {
|
||||
console.log('\n' + out + '\n')
|
||||
}
|
||||
|
||||
break
|
||||
}
|
||||
case 'rm':
|
||||
case 'remove': {
|
||||
if (args.length !== 1) {
|
||||
error('Invalid number of arguments')
|
||||
return exit(1)
|
||||
}
|
||||
|
||||
const _target = String(args[0])
|
||||
if (!_target) {
|
||||
const err = new Error('No domain specified')
|
||||
err.userError = true
|
||||
throw err
|
||||
}
|
||||
|
||||
const _domains = await domain.ls()
|
||||
const _domain = findDomain(_target, _domains)
|
||||
|
||||
if (!_domain) {
|
||||
const err = new Error(`Domain not found by "${_target}". Run ${chalk.dim('`now domains ls`')} to see your domains.`)
|
||||
err.userError = true
|
||||
throw err
|
||||
}
|
||||
|
||||
try {
|
||||
const confirmation = (await readConfirmation(domain, _domain, _domains)).toLowerCase()
|
||||
if (confirmation !== 'y' && confirmation !== 'yes') {
|
||||
console.log('\n> Aborted')
|
||||
process.exit(0)
|
||||
}
|
||||
|
||||
const start = new Date()
|
||||
await domain.rm(_domain.name)
|
||||
const elapsed = ms(new Date() - start)
|
||||
console.log(`${chalk.cyan('> Success!')} Domain ${chalk.bold(_domain.uid)} removed [${elapsed}]`)
|
||||
} catch (err) {
|
||||
error(err)
|
||||
exit(1)
|
||||
}
|
||||
break
|
||||
}
|
||||
case 'add':
|
||||
case 'set': {
|
||||
if (args.length !== 1) {
|
||||
error('Invalid number of arguments')
|
||||
return exit(1)
|
||||
}
|
||||
|
||||
const start = new Date()
|
||||
const name = String(args[0])
|
||||
const {uid, code, created, verified} = await domain.add(name, argv.force, argv.external)
|
||||
const elapsed = ms(new Date() - start)
|
||||
if (created) {
|
||||
console.log(`${chalk.cyan('> Success!')} Domain ${chalk.bold(chalk.underline(name))} ${chalk.dim(`(${uid})`)} added [${elapsed}]`)
|
||||
} else if (verified) {
|
||||
console.log(`${chalk.cyan('> Success!')} Domain ${chalk.bold(chalk.underline(name))} ${chalk.dim(`(${uid})`)} verified [${elapsed}]`)
|
||||
} else if (code === 'not_modified') {
|
||||
console.log(`${chalk.cyan('> Success!')} Domain ${chalk.bold(chalk.underline(name))} ${chalk.dim(`(${uid})`)} already exists [${elapsed}]`)
|
||||
} else {
|
||||
console.log('> Verification required: Please rerun this command after some time')
|
||||
}
|
||||
break
|
||||
}
|
||||
default:
|
||||
error('Please specify a valid subcommand: ls | add | rm')
|
||||
help()
|
||||
exit(1)
|
||||
}
|
||||
|
||||
domain.close()
|
||||
}
|
||||
|
||||
async function readConfirmation(domain, _domain) {
|
||||
return new Promise(resolve => {
|
||||
const time = chalk.gray(ms(new Date() - new Date(_domain.created)) + ' ago')
|
||||
const tbl = table(
|
||||
[[_domain.uid, chalk.underline(`https://${_domain.name}`), time]],
|
||||
{align: ['l', 'r', 'l'], hsep: ' '.repeat(6)}
|
||||
)
|
||||
|
||||
process.stdout.write('> The following domain will be removed permanently\n')
|
||||
process.stdout.write(' ' + tbl + '\n')
|
||||
|
||||
if (_domain.aliases.length > 0) {
|
||||
process.stdout.write(`> ${chalk.yellow('Warning!')} This domain's ` +
|
||||
`${chalk.bold(_domain.aliases.length + ' alias' + (_domain.aliases.length === 1 ? '' : 'es'))} ` +
|
||||
`will be removed. Run ${chalk.dim('`now alias ls`')} to list.\n`)
|
||||
}
|
||||
|
||||
process.stdout.write(` ${chalk.bold.red('> Are you sure?')} ${chalk.gray('[y/N] ')}`)
|
||||
|
||||
process.stdin.on('data', d => {
|
||||
process.stdin.pause()
|
||||
resolve(d.toString().trim())
|
||||
}).resume()
|
||||
})
|
||||
}
|
||||
|
||||
function findDomain(val, list) {
|
||||
return list.find(d => {
|
||||
if (d.uid === val) {
|
||||
if (debug) {
|
||||
console.log(`> [debug] matched domain ${d.uid} by uid`)
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
// match prefix
|
||||
if (d.name === toHost(val)) {
|
||||
if (debug) {
|
||||
console.log(`> [debug] matched domain ${d.uid} by name ${d.name}`)
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
})
|
||||
}
|
||||
153
bin/now-list.js
153
bin/now-list.js
@@ -1,153 +0,0 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
// Packages
|
||||
const fs = require('fs-promise')
|
||||
const minimist = require('minimist')
|
||||
const chalk = require('chalk')
|
||||
const table = require('text-table')
|
||||
const ms = require('ms')
|
||||
|
||||
// Ours
|
||||
const strlen = require('../lib/strlen')
|
||||
const indent = require('../lib/indent')
|
||||
const Now = require('../lib')
|
||||
const login = require('../lib/login')
|
||||
const cfg = require('../lib/cfg')
|
||||
const {handleError, error} = require('../lib/error')
|
||||
|
||||
const argv = minimist(process.argv.slice(2), {
|
||||
string: ['config', 'token'],
|
||||
boolean: ['help', 'debug'],
|
||||
alias: {
|
||||
help: 'h',
|
||||
config: 'c',
|
||||
debug: 'd',
|
||||
token: 't'
|
||||
}
|
||||
})
|
||||
|
||||
const help = () => {
|
||||
console.log(`
|
||||
${chalk.bold('𝚫 now list')} [app]
|
||||
|
||||
${chalk.dim('Options:')}
|
||||
|
||||
-h, --help Output usage information
|
||||
-c ${chalk.bold.underline('FILE')}, --config=${chalk.bold.underline('FILE')} Config file
|
||||
-d, --debug Debug mode [off]
|
||||
-t ${chalk.bold.underline('TOKEN')}, --token=${chalk.bold.underline('TOKEN')} Login token
|
||||
|
||||
${chalk.dim('Examples:')}
|
||||
|
||||
${chalk.gray('–')} List all deployments
|
||||
|
||||
${chalk.cyan('$ now ls')}
|
||||
|
||||
${chalk.gray('–')} List all deployments for the app ${chalk.dim('`my-app`')}
|
||||
|
||||
${chalk.cyan('$ now ls my-app')}
|
||||
|
||||
${chalk.dim('Alias:')} ls
|
||||
`)
|
||||
}
|
||||
|
||||
if (argv.help) {
|
||||
help()
|
||||
process.exit(0)
|
||||
}
|
||||
|
||||
const app = argv._[0]
|
||||
|
||||
// options
|
||||
const debug = argv.debug
|
||||
const apiUrl = argv.url || 'https://api.zeit.co'
|
||||
|
||||
if (argv.config) {
|
||||
cfg.setConfigFile(argv.config)
|
||||
}
|
||||
|
||||
const config = cfg.read()
|
||||
|
||||
Promise.resolve(argv.token || config.token || login(apiUrl))
|
||||
.then(async token => {
|
||||
try {
|
||||
await list(token)
|
||||
} catch (err) {
|
||||
error(`Unknown error: ${err}\n${err.stack}`)
|
||||
process.exit(1)
|
||||
}
|
||||
})
|
||||
.catch(e => {
|
||||
error(`Authentication error – ${e.message}`)
|
||||
process.exit(1)
|
||||
})
|
||||
|
||||
async function list(token) {
|
||||
const now = new Now(apiUrl, token, {debug})
|
||||
const start = new Date()
|
||||
|
||||
let deployments
|
||||
try {
|
||||
deployments = await now.list(app)
|
||||
} catch (err) {
|
||||
handleError(err)
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
now.close()
|
||||
|
||||
const apps = new Map()
|
||||
|
||||
for (const dep of deployments) {
|
||||
const deps = apps.get(dep.name) || []
|
||||
apps.set(dep.name, deps.concat(dep))
|
||||
}
|
||||
|
||||
const sorted = await sort([...apps])
|
||||
const current = Date.now()
|
||||
|
||||
const text = sorted.map(([name, deps]) => {
|
||||
const t = table(deps.map(({uid, url, created}) => {
|
||||
const _url = url ? chalk.underline(`https://${url}`) : 'incomplete'
|
||||
const time = chalk.gray(ms(current - created) + ' ago')
|
||||
return [uid, _url, time]
|
||||
}), {align: ['l', 'r', 'l'], hsep: ' '.repeat(6), stringLength: strlen})
|
||||
return chalk.bold(name) + '\n\n' + indent(t, 2)
|
||||
}).join('\n\n')
|
||||
|
||||
const elapsed = ms(new Date() - start)
|
||||
console.log(`> ${deployments.length} deployment${deployments.length === 1 ? '' : 's'} found ${chalk.gray(`[${elapsed}]`)}`)
|
||||
|
||||
if (text) {
|
||||
console.log('\n' + text + '\n')
|
||||
}
|
||||
}
|
||||
|
||||
async function sort(apps) {
|
||||
let pkg
|
||||
try {
|
||||
const json = await fs.readFile('package.json')
|
||||
pkg = JSON.parse(json)
|
||||
} catch (err) {
|
||||
pkg = {}
|
||||
}
|
||||
|
||||
return apps
|
||||
.map(([name, deps]) => {
|
||||
deps = deps.slice().sort((a, b) => {
|
||||
return b.created - a.created
|
||||
})
|
||||
return [name, deps]
|
||||
})
|
||||
.sort(([nameA, depsA], [nameB, depsB]) => {
|
||||
if (pkg.name === nameA) {
|
||||
return -1
|
||||
}
|
||||
|
||||
if (pkg.name === nameB) {
|
||||
return 1
|
||||
}
|
||||
|
||||
return depsB[0].created - depsA[0].created
|
||||
})
|
||||
}
|
||||
@@ -1,177 +0,0 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
// Packages
|
||||
const minimist = require('minimist')
|
||||
const chalk = require('chalk')
|
||||
const ms = require('ms')
|
||||
const table = require('text-table')
|
||||
|
||||
// Ours
|
||||
const Now = require('../lib')
|
||||
const login = require('../lib/login')
|
||||
const cfg = require('../lib/cfg')
|
||||
const {handleError, error} = require('../lib/error')
|
||||
|
||||
const argv = minimist(process.argv.slice(2), {
|
||||
string: ['config', 'token'],
|
||||
boolean: ['help', 'debug', 'hard', 'yes'],
|
||||
alias: {
|
||||
help: 'h',
|
||||
config: 'c',
|
||||
debug: 'd',
|
||||
token: 't',
|
||||
yes: 'y'
|
||||
}
|
||||
})
|
||||
|
||||
const ids = argv._
|
||||
|
||||
// options
|
||||
const help = () => {
|
||||
console.log(`
|
||||
${chalk.bold('𝚫 now remove')} deploymentId|deploymentName [...deploymentId|deploymentName]
|
||||
|
||||
${chalk.dim('Options:')}
|
||||
|
||||
-h, --help Output usage information
|
||||
-c ${chalk.bold.underline('FILE')}, --config=${chalk.bold.underline('FILE')} Config file
|
||||
-d, --debug Debug mode [off]
|
||||
-t ${chalk.bold.underline('TOKEN')}, --token=${chalk.bold.underline('TOKEN')} Login token
|
||||
-y, --yes Skip confirmation
|
||||
|
||||
${chalk.dim('Examples:')}
|
||||
|
||||
${chalk.gray('–')} Remove a deployment identified by ${chalk.dim('`deploymentId`')}:
|
||||
|
||||
${chalk.cyan('$ now rm deploymentId')}
|
||||
|
||||
${chalk.gray('–')} Remove all deployments with name ${chalk.dim('`my-app`')}:
|
||||
|
||||
${chalk.cyan('$ now rm my-app')}
|
||||
|
||||
${chalk.gray('–')} Remove two deployments with IDs ${chalk.dim('`eyWt6zuSdeus`')} and ${chalk.dim('`uWHoA9RQ1d1o`')}:
|
||||
|
||||
${chalk.cyan('$ now rm eyWt6zuSdeus uWHoA9RQ1d1o')}
|
||||
|
||||
${chalk.dim('Alias:')} rm
|
||||
`)
|
||||
}
|
||||
|
||||
if (argv.help || ids.length === 0) {
|
||||
help()
|
||||
process.exit(0)
|
||||
}
|
||||
|
||||
// options
|
||||
const debug = argv.debug
|
||||
const apiUrl = argv.url || 'https://api.zeit.co'
|
||||
const hard = argv.hard || false
|
||||
const skipConfirmation = argv.yes || false
|
||||
|
||||
if (argv.config) {
|
||||
cfg.setConfigFile(argv.config)
|
||||
}
|
||||
|
||||
const config = cfg.read()
|
||||
|
||||
function readConfirmation(matches) {
|
||||
return new Promise(resolve => {
|
||||
process.stdout.write(`> The following deployment${matches.length === 1 ? '' : 's'} will be removed permanently:\n`)
|
||||
|
||||
const tbl = table(
|
||||
matches.map(depl => {
|
||||
const time = chalk.gray(ms(new Date() - depl.created) + ' ago')
|
||||
const url = depl.url ? chalk.underline(`https://${depl.url}`) : ''
|
||||
return [depl.uid, url, time]
|
||||
}),
|
||||
{align: ['l', 'r', 'l'], hsep: ' '.repeat(6)}
|
||||
)
|
||||
process.stdout.write(tbl + '\n')
|
||||
|
||||
for (const depl of matches) {
|
||||
for (const alias of depl.aliases) {
|
||||
process.stdout.write(
|
||||
`> ${chalk.yellow('Warning!')} Deployment ${chalk.bold(depl.uid)} ` +
|
||||
`is an alias for ${chalk.underline(`https://${alias.alias}`)} and will be removed.\n`
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
process.stdout.write(`${chalk.bold.red('> Are you sure?')} ${chalk.gray('[y/N] ')}`)
|
||||
|
||||
process.stdin.on('data', d => {
|
||||
process.stdin.pause()
|
||||
resolve(d.toString().trim())
|
||||
}).resume()
|
||||
})
|
||||
}
|
||||
|
||||
Promise.resolve(argv.token || config.token || login(apiUrl))
|
||||
.then(async token => {
|
||||
try {
|
||||
await remove(token)
|
||||
} catch (err) {
|
||||
error(`Unknown error: ${err}\n${err.stack}`)
|
||||
process.exit(1)
|
||||
}
|
||||
})
|
||||
.catch(e => {
|
||||
error(`Authentication error – ${e.message}`)
|
||||
process.exit(1)
|
||||
})
|
||||
|
||||
async function remove(token) {
|
||||
const now = new Now(apiUrl, token, {debug})
|
||||
|
||||
const deployments = await now.list()
|
||||
|
||||
const matches = deployments.filter(d => {
|
||||
return ids.find(id => {
|
||||
// `url` should match the hostname of the deployment
|
||||
let u = id.replace(/^https:\/\//i, '')
|
||||
|
||||
if (u.indexOf('.') === -1) {
|
||||
// `.now.sh` domain is implied if just the subdomain is given
|
||||
u += '.now.sh'
|
||||
}
|
||||
|
||||
return d.uid === id || d.name === id || d.url === u
|
||||
})
|
||||
})
|
||||
|
||||
if (matches.length === 0) {
|
||||
error(`Could not find any deployments matching ${ids.map(id => chalk.bold(`"${id}"`)).join(', ')}. Run ${chalk.dim(`\`now ls\``)} to list.`)
|
||||
return process.exit(1)
|
||||
}
|
||||
|
||||
const aliases = await Promise.all(matches.map(depl => now.listAliases(depl.uid)))
|
||||
for (let i = 0; i < matches.length; i++) {
|
||||
matches[i].aliases = aliases[i]
|
||||
}
|
||||
|
||||
try {
|
||||
if (!skipConfirmation) {
|
||||
const confirmation = (await readConfirmation(matches)).toLowerCase()
|
||||
|
||||
if (confirmation !== 'y' && confirmation !== 'yes') {
|
||||
console.log('\n> Aborted')
|
||||
process.exit(0)
|
||||
}
|
||||
}
|
||||
|
||||
const start = new Date()
|
||||
|
||||
await Promise.all(matches.map(depl => now.remove(depl.uid, {hard})))
|
||||
|
||||
const elapsed = ms(new Date() - start)
|
||||
console.log(`${chalk.cyan('> Success!')} [${elapsed}]`)
|
||||
console.log(table(matches.map(depl => {
|
||||
return [`Deployment ${chalk.bold(depl.uid)} removed`]
|
||||
})))
|
||||
} catch (err) {
|
||||
handleError(err)
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
now.close()
|
||||
}
|
||||
@@ -1,239 +0,0 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
// Packages
|
||||
const chalk = require('chalk')
|
||||
const table = require('text-table')
|
||||
const minimist = require('minimist')
|
||||
const ms = require('ms')
|
||||
|
||||
// Ours
|
||||
const strlen = require('../lib/strlen')
|
||||
const cfg = require('../lib/cfg')
|
||||
const {handleError, error} = require('../lib/error')
|
||||
const NowSecrets = require('../lib/secrets')
|
||||
const login = require('../lib/login')
|
||||
|
||||
const argv = minimist(process.argv.slice(2), {
|
||||
string: ['config', 'token'],
|
||||
boolean: ['help', 'debug', 'base64'],
|
||||
alias: {
|
||||
help: 'h',
|
||||
config: 'c',
|
||||
debug: 'd',
|
||||
base64: 'b',
|
||||
token: 't'
|
||||
}
|
||||
})
|
||||
|
||||
const subcommand = argv._[0]
|
||||
|
||||
// options
|
||||
const help = () => {
|
||||
console.log(`
|
||||
${chalk.bold('𝚫 now secrets')} <ls | add | rename | rm> <secret>
|
||||
|
||||
${chalk.dim('Options:')}
|
||||
|
||||
-h, --help Output usage information
|
||||
-b, --base64 Treat value as base64-encoded
|
||||
-c ${chalk.bold.underline('FILE')}, --config=${chalk.bold.underline('FILE')} Config file
|
||||
-d, --debug Debug mode [off]
|
||||
-t ${chalk.bold.underline('TOKEN')}, --token=${chalk.bold.underline('TOKEN')} Login token
|
||||
|
||||
${chalk.dim('Examples:')}
|
||||
|
||||
${chalk.gray('–')} Lists all your secrets:
|
||||
|
||||
${chalk.cyan('$ now secrets ls')}
|
||||
|
||||
${chalk.gray('–')} Adds a new secret:
|
||||
|
||||
${chalk.cyan('$ now secrets add my-secret "my value"')}
|
||||
|
||||
${chalk.gray('–')} Once added, a secret's value can't be retrieved in plaintext anymore
|
||||
${chalk.gray('–')} If the secret's value is more than one word, wrap it in quotes
|
||||
${chalk.gray('–')} Actually, when in doubt, wrap your value in quotes
|
||||
|
||||
${chalk.gray('–')} Exposes a secret as an env variable:
|
||||
|
||||
${chalk.cyan(`$ now -e MY_SECRET=${chalk.bold('@my-secret')}`)}
|
||||
|
||||
Notice the ${chalk.cyan.bold('`@`')} symbol which makes the value a secret reference.
|
||||
|
||||
${chalk.gray('–')} Renames a secret:
|
||||
|
||||
${chalk.cyan(`$ now secrets rename my-secret my-renamed-secret`)}
|
||||
|
||||
${chalk.gray('–')} Removes a secret:
|
||||
|
||||
${chalk.cyan(`$ now secrets rm my-secret`)}
|
||||
`)
|
||||
}
|
||||
|
||||
// options
|
||||
const debug = argv.debug
|
||||
const apiUrl = argv.url || 'https://api.zeit.co'
|
||||
|
||||
if (argv.config) {
|
||||
cfg.setConfigFile(argv.config)
|
||||
}
|
||||
|
||||
const exit = code => {
|
||||
// we give stdout some time to flush out
|
||||
// because there's a node bug where
|
||||
// stdout writes are asynchronous
|
||||
// https://github.com/nodejs/node/issues/6456
|
||||
setTimeout(() => process.exit(code || 0), 100)
|
||||
}
|
||||
|
||||
if (argv.help || !subcommand) {
|
||||
help()
|
||||
exit(0)
|
||||
} else {
|
||||
const config = cfg.read()
|
||||
|
||||
Promise.resolve(argv.token || config.token || login(apiUrl))
|
||||
.then(async token => {
|
||||
try {
|
||||
await run(token)
|
||||
} catch (err) {
|
||||
handleError(err)
|
||||
exit(1)
|
||||
}
|
||||
})
|
||||
.catch(e => {
|
||||
error(`Authentication error – ${e.message}`)
|
||||
exit(1)
|
||||
})
|
||||
}
|
||||
|
||||
async function run(token) {
|
||||
const secrets = new NowSecrets(apiUrl, token, {debug})
|
||||
const args = argv._.slice(1)
|
||||
const start = Date.now()
|
||||
|
||||
if (subcommand === 'ls' || subcommand === 'list') {
|
||||
if (args.length !== 0) {
|
||||
error(`Invalid number of arguments. Usage: ${chalk.cyan('`now secret ls`')}`)
|
||||
return exit(1)
|
||||
}
|
||||
|
||||
const list = await secrets.ls()
|
||||
const elapsed = ms(new Date() - start)
|
||||
|
||||
console.log(`> ${list.length} secret${list.length === 1 ? '' : 's'} found ${chalk.gray(`[${elapsed}]`)}`)
|
||||
|
||||
if (list.length > 0) {
|
||||
const cur = Date.now()
|
||||
const header = [['', 'id', 'name', 'created'].map(s => chalk.dim(s))]
|
||||
const out = table(header.concat(list.map(secret => {
|
||||
return [
|
||||
'',
|
||||
secret.uid,
|
||||
chalk.bold(secret.name),
|
||||
chalk.gray(ms(cur - new Date(secret.created)) + ' ago')
|
||||
]
|
||||
})), {align: ['l', 'r', 'l', 'l'], hsep: ' '.repeat(2), stringLength: strlen})
|
||||
|
||||
if (out) {
|
||||
console.log('\n' + out + '\n')
|
||||
}
|
||||
}
|
||||
return secrets.close()
|
||||
}
|
||||
|
||||
if (subcommand === 'rm' || subcommand === 'remove') {
|
||||
if (args.length !== 1) {
|
||||
error(`Invalid number of arguments. Usage: ${chalk.cyan('`now secret rm <id | name>`')}`)
|
||||
return exit(1)
|
||||
}
|
||||
const list = await secrets.ls()
|
||||
const theSecret = list.filter(secret => {
|
||||
return secret.uid === args[0] || secret.name === args[0]
|
||||
})[0]
|
||||
|
||||
if (theSecret) {
|
||||
const yes = await readConfirmation(theSecret)
|
||||
if (!yes) {
|
||||
error('User abort')
|
||||
return exit(0)
|
||||
}
|
||||
} else {
|
||||
error(`No secret found by id or name "${args[0]}"`)
|
||||
return exit(1)
|
||||
}
|
||||
|
||||
const secret = await secrets.rm(args[0])
|
||||
const elapsed = ms(new Date() - start)
|
||||
console.log(`${chalk.cyan('> Success!')} Secret ${chalk.bold(secret.name)} ${chalk.gray(`(${secret.uid})`)} removed ${chalk.gray(`[${elapsed}]`)}`)
|
||||
return secrets.close()
|
||||
}
|
||||
|
||||
if (subcommand === 'rename') {
|
||||
if (args.length !== 2) {
|
||||
error(`Invalid number of arguments. Usage: ${chalk.cyan('`now secret rename <old-name> <new-name>`')}`)
|
||||
return exit(1)
|
||||
}
|
||||
const secret = await secrets.rename(args[0], args[1])
|
||||
const elapsed = ms(new Date() - start)
|
||||
console.log(`${chalk.cyan('> Success!')} Secret ${chalk.bold(secret.oldName)} ${chalk.gray(`(${secret.uid})`)} renamed to ${chalk.bold(args[1])} ${chalk.gray(`[${elapsed}]`)}`)
|
||||
return secrets.close()
|
||||
}
|
||||
|
||||
if (subcommand === 'add' || subcommand === 'set') {
|
||||
if (args.length !== 2) {
|
||||
error(`Invalid number of arguments. Usage: ${chalk.cyan('`now secret add <name> <value>`')}`)
|
||||
|
||||
if (args.length > 2) {
|
||||
const example = chalk.cyan(`$ now secret add ${args[0]}`)
|
||||
console.log(`> If your secret has spaces, make sure to wrap it in quotes. Example: \n ${example} `)
|
||||
}
|
||||
|
||||
return exit(1)
|
||||
}
|
||||
|
||||
const [name, value_] = args
|
||||
let value
|
||||
|
||||
if (argv.base64) {
|
||||
value = {base64: value_}
|
||||
} else {
|
||||
value = value_
|
||||
}
|
||||
|
||||
const secret = await secrets.add(name, value)
|
||||
const elapsed = ms(new Date() - start)
|
||||
|
||||
console.log(`${chalk.cyan('> Success!')} Secret ${chalk.bold(name.toLowerCase())} ${chalk.gray(`(${secret.uid})`)} added ${chalk.gray(`[${elapsed}]`)}`)
|
||||
return secrets.close()
|
||||
}
|
||||
|
||||
error('Please specify a valid subcommand: ls | add | rename | rm')
|
||||
help()
|
||||
exit(1)
|
||||
}
|
||||
|
||||
process.on('uncaughtException', err => {
|
||||
handleError(err)
|
||||
exit(1)
|
||||
})
|
||||
|
||||
function readConfirmation(secret) {
|
||||
return new Promise(resolve => {
|
||||
const time = chalk.gray(ms(new Date() - new Date(secret.created)) + ' ago')
|
||||
const tbl = table(
|
||||
[[secret.uid, chalk.bold(secret.name), time]],
|
||||
{align: ['l', 'r', 'l'], hsep: ' '.repeat(6)}
|
||||
)
|
||||
|
||||
process.stdout.write('> The following secret will be removed permanently\n')
|
||||
process.stdout.write(' ' + tbl + '\n')
|
||||
|
||||
process.stdout.write(`${chalk.bold.red('> Are you sure?')} ${chalk.gray('[y/N] ')}`)
|
||||
|
||||
process.stdin.on('data', d => {
|
||||
process.stdin.pause()
|
||||
resolve(d.toString().trim().toLowerCase() === 'y')
|
||||
}).resume()
|
||||
})
|
||||
}
|
||||
104
bin/now.js
104
bin/now.js
@@ -1,104 +0,0 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
// Native
|
||||
const {resolve} = require('path')
|
||||
|
||||
// Packages
|
||||
const nodeVersion = require('node-version')
|
||||
const updateNotifier = require('update-notifier')
|
||||
const chalk = require('chalk')
|
||||
|
||||
// Ours
|
||||
const {error} = require('../lib/error')
|
||||
const pkg = require('../package')
|
||||
|
||||
const pathSep = process.platform === 'win32' ? '\\\\' : '/'
|
||||
// Support for keywords "async" and "await"
|
||||
require('async-to-gen/register')({
|
||||
includes: new RegExp(`.*now(-cli)?${pathSep}(lib|bin).*`),
|
||||
excludes: null,
|
||||
sourceMaps: false
|
||||
})
|
||||
|
||||
// Throw an error if node version is too low
|
||||
if (nodeVersion.major < 6) {
|
||||
error('Now requires at least version 6 of Node. Please upgrade!')
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
// Only check for updates in the npm version
|
||||
if (!process.pkg && pkg.dist) {
|
||||
const notifier = updateNotifier({pkg})
|
||||
const update = notifier.update
|
||||
|
||||
if (update) {
|
||||
let message = `Update available! ${chalk.red(update.current)} → ${chalk.green(update.latest)} \n`
|
||||
message += `Run ${chalk.magenta('npm i -g now')} to update!\n`
|
||||
message += `${chalk.magenta('Changelog:')} https://github.com/zeit/now-cli/releases/tag/${update.latest}`
|
||||
|
||||
notifier.notify({message})
|
||||
}
|
||||
}
|
||||
|
||||
// This command will be run if no other sub command is specified
|
||||
const defaultCommand = 'deploy'
|
||||
|
||||
const commands = new Set([
|
||||
defaultCommand,
|
||||
'help',
|
||||
'list',
|
||||
'ls',
|
||||
'rm',
|
||||
'remove',
|
||||
'alias',
|
||||
'aliases',
|
||||
'ln',
|
||||
'domain',
|
||||
'domains',
|
||||
'dns',
|
||||
'cert',
|
||||
'certs',
|
||||
'secret',
|
||||
'secrets'
|
||||
])
|
||||
|
||||
const aliases = new Map([
|
||||
['ls', 'list'],
|
||||
['rm', 'remove'],
|
||||
['ln', 'alias'],
|
||||
['aliases', 'alias'],
|
||||
['domain', 'domains'],
|
||||
['cert', 'certs'],
|
||||
['secret', 'secrets']
|
||||
])
|
||||
|
||||
let cmd = defaultCommand
|
||||
const args = process.argv.slice(2)
|
||||
const index = args.findIndex(a => commands.has(a))
|
||||
|
||||
if (index > -1) {
|
||||
cmd = args[index]
|
||||
args.splice(index, 1)
|
||||
|
||||
if (cmd === 'help') {
|
||||
if (index < args.length && commands.has(args[index])) {
|
||||
cmd = args[index]
|
||||
args.splice(index, 1)
|
||||
} else {
|
||||
cmd = defaultCommand
|
||||
}
|
||||
|
||||
args.unshift('--help')
|
||||
}
|
||||
|
||||
cmd = aliases.get(cmd) || cmd
|
||||
}
|
||||
|
||||
const bin = resolve(__dirname, 'now-' + cmd + '.js')
|
||||
|
||||
// Prepare process.argv for subcommand
|
||||
process.argv = process.argv.slice(0, 2).concat(args)
|
||||
|
||||
// Load sub command
|
||||
// With custom parameter to make "pkg" happy
|
||||
require(bin, 'may-exclude')
|
||||
42
changelog.js
Normal file
42
changelog.js
Normal file
@@ -0,0 +1,42 @@
|
||||
const { execSync } = require('child_process');
|
||||
|
||||
const commit = execSync('git log --pretty=format:"%s %H"')
|
||||
.toString()
|
||||
.trim()
|
||||
.split('\n')
|
||||
.find(line => line.startsWith('Publish Stable '))
|
||||
.split(' ')
|
||||
.pop();
|
||||
|
||||
if (!commit) {
|
||||
throw new Error('Unable to find last publish commit');
|
||||
}
|
||||
|
||||
const log =
|
||||
execSync(`git log --pretty=format:"- %s [%an]" ${commit}...HEAD`)
|
||||
.toString()
|
||||
.trim()
|
||||
.split('\n')
|
||||
.filter(line => !line.startsWith('- Publish Canary '))
|
||||
.join('\n') || 'NO CHANGES DETECTED';
|
||||
|
||||
console.log(`Changes since the last Stable release (${commit.slice(0, 7)}):`);
|
||||
console.log(`\n${log}\n`);
|
||||
|
||||
const pkgs =
|
||||
Array.from(
|
||||
new Set(
|
||||
execSync(`git diff --name-only ${commit}...HEAD`)
|
||||
.toString()
|
||||
.trim()
|
||||
.split('\n')
|
||||
.filter(line => line.startsWith('packages/'))
|
||||
.map(line => line.split('/')[1])
|
||||
.map(pkgName => require(`./packages/${pkgName}/package.json`).name)
|
||||
)
|
||||
).join(',') || 'now';
|
||||
|
||||
console.log('To publish a stable release, execute the following:');
|
||||
console.log(
|
||||
`\ngit pull && lerna version --message 'Publish Stable' --exact --force-publish=${pkgs}\n`
|
||||
);
|
||||
27
errors/cant-solve-challenge.md
Normal file
27
errors/cant-solve-challenge.md
Normal file
@@ -0,0 +1,27 @@
|
||||
# The DNS Challenge Could Not Be Solved
|
||||
|
||||
## Why This Error Occurred
|
||||
|
||||
When generating a certificate, we have to prove ownership over the domain
|
||||
for the Certificate Authority (CA) that issues it. This error means that
|
||||
the provider couldn’t solve the requested challenges.
|
||||
|
||||
## How to Fix It
|
||||
|
||||
If your domain is pointing to ZEIT World DNS and you’re getting this error,
|
||||
it could be that:
|
||||
|
||||
- The domain was acquired recently, and it might not be ready for use yet.
|
||||
- Required DNS records have not propagated yet.
|
||||
|
||||
When running into this, ensure that your nameservers are configured correctly. Also, if you bought the domain recently or have made changes, please be patient,
|
||||
it might take a while for these to be ready.
|
||||
|
||||
If your domain is _not_ pointing to ZEIT World DNS and you’re getting this
|
||||
error, the following methods could help:
|
||||
|
||||
- When solving challenges *manually*, ensure that the TXT
|
||||
records required to solve the challenges exist and are propagated. You can do so by querying the nameservers with `nslookup -q=TXT _acme-challenge.domain.com` depending on the Common Names you want for your certificate.
|
||||
|
||||
- If you are not solving the challenges manually you must ensure that you have an
|
||||
`ALIAS` and `CNAME` records in place. Ensure also that you have disabled automatic redirects to `https` and ensure all changes were propagated.
|
||||
37
errors/deploy-invalid-dc.md
Normal file
37
errors/deploy-invalid-dc.md
Normal file
@@ -0,0 +1,37 @@
|
||||
# Invalid Region or DC Identifier
|
||||
|
||||
#### Why This Error Occurred
|
||||
|
||||
When supplying `regions` or `scale` settings, you
|
||||
used an unknown or invalid dc identifier.
|
||||
|
||||
#### Possible Ways to Fix It
|
||||
|
||||
Check your `now.json` or `--regions` flag and
|
||||
make sure you are using a valid string. Regions
|
||||
and DCs have to be in *lowercase*.
|
||||
|
||||
**Valid region identifiers**:
|
||||
|
||||
- `all` (special, used to scale to all DCs, can only appear once)
|
||||
- `sfo`
|
||||
- `bru`
|
||||
- `gru`
|
||||
- `iad`
|
||||
|
||||
In `now-cli`, they currently are transformed to
|
||||
DC identifiers before being sent to our APIs.
|
||||
|
||||
**Valid DC identifiers**:
|
||||
|
||||
- `sfo1`
|
||||
- `bru1`
|
||||
- `gru1`
|
||||
- `iad1`
|
||||
|
||||
When passing multiple `--regions` as a CLI parameter,
|
||||
make sure they're separated by a comma (`,`). For example:
|
||||
|
||||
```console
|
||||
now --regions sfo,bru,gru
|
||||
```
|
||||
23
errors/dns-configuration-error.md
Normal file
23
errors/dns-configuration-error.md
Normal file
@@ -0,0 +1,23 @@
|
||||
# The DNS Configuration can't be verified
|
||||
|
||||
## Why This Error Occurred
|
||||
|
||||
When generating a certificate, we have to prove ownership over the domain
|
||||
for the Certificate Authority (CA) that issues it. We also run some pretests
|
||||
to make sure the DNS is properly configured before submitting the request to
|
||||
the CA. This error means that these pretests did not succeed.
|
||||
|
||||
## How to Fix It
|
||||
|
||||
If your domain is pointing to ZEIT World DNS and you’re getting this error,
|
||||
it could be that:
|
||||
|
||||
- The domain was acquired recently, and it might not be ready for use yet.
|
||||
- Required DNS records have not propagated yet.
|
||||
|
||||
When running into this, ensure that your nameservers have configuration is correct. Also, if you bought the domain recently or have made changes, please be patient,
|
||||
it might take a while for these to be ready.
|
||||
|
||||
If your domain is _not_ pointing to ZEIT World DNS and you’re getting this
|
||||
error, you must ensure that you have an `ALIAS` and `CNAME` records in place.
|
||||
Ensure also that you have disabled automatic redirects to `https` and ensure all changes were propagated.
|
||||
21
errors/domain-verification.md
Normal file
21
errors/domain-verification.md
Normal file
@@ -0,0 +1,21 @@
|
||||
# Domain Verification
|
||||
|
||||
#### Why This Error Occurred
|
||||
|
||||
The domain you supplied cannot be verified using either the intended set of nameservers or the given verification TXT record.
|
||||
|
||||
#### Possible Ways to Fix It
|
||||
|
||||
Apply the intended set of nameservers to your domain or add the given TXT verification record through your domain provider.
|
||||
|
||||
You can retrieve both the intended nameservers and TXT verification record for the domain you wish to verify by running `now domains inspect <domain>`.
|
||||
|
||||
When you have added either verification method to your domain, you can run `now domains verify <domain>` again to complete verification for your domain.
|
||||
|
||||
ZEIT will also automatically check periodically that your domain has been verified and automatically mark it as such if we detect either verification method on the domain.
|
||||
|
||||
If you would not like to verify your domain, you can remove it from your account using `now domains rm <domain>`.
|
||||
|
||||
#### Resources
|
||||
- [ZEIT Domains Documentation](https://zeit.co/docs/v2/domains-and-aliases/adding-a-domain/)
|
||||
- [Zero-Downtime Domain Migration Guide](https://zeit.co/docs/v2/domains-and-aliases/zero-downtime-domain-migration/)
|
||||
17
errors/env-no-secret.md
Normal file
17
errors/env-no-secret.md
Normal file
@@ -0,0 +1,17 @@
|
||||
# Secret Not Found
|
||||
|
||||
#### Why This Error Occurred
|
||||
|
||||
You specified the `--env` or `-e` flag with the value of a secret. However, the secret doesn't exist in the current scope you're in.
|
||||
|
||||
#### Possible Ways to Fix It
|
||||
|
||||
Make sure to specify the environment variable and secret like that:
|
||||
|
||||
```bash
|
||||
now -e VARIABLE_NAME=@secret-name
|
||||
```
|
||||
|
||||
In addition, ensure that the secret (`@secret-name` in the example above) exists in the current scope (the team or user account that you're using).
|
||||
|
||||
You can run `now switch` or `--scope` to switch to a different team or user.
|
||||
21
errors/env-value-invalid-type.md
Normal file
21
errors/env-value-invalid-type.md
Normal file
@@ -0,0 +1,21 @@
|
||||
# Bad Type in Env Value
|
||||
|
||||
#### Why This Error Occurred
|
||||
|
||||
You supplied a value in the `env` of your deployment whose type is not allowed.
|
||||
|
||||
This occurs for example if you use a `Boolean` as a type:
|
||||
|
||||
```json
|
||||
{
|
||||
"env": {
|
||||
"VALID": 1,
|
||||
"INVALID": true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### Possible Ways to Fix It
|
||||
|
||||
The only accepted types are `String` or `Number`. If you're using a
|
||||
`Boolean`, consider using `1` (`Number`) or `"true"` (`String`).
|
||||
11
errors/invalid-token-value.md
Normal file
11
errors/invalid-token-value.md
Normal file
@@ -0,0 +1,11 @@
|
||||
# Invalid Token Value
|
||||
|
||||
#### Why This Error Occurred
|
||||
|
||||
The `--token` flag was specified, but its contents are invalid.
|
||||
|
||||
#### Possible Ways to Fix It
|
||||
|
||||
The `--token` flag must only contain numbers (0-9) and letters from the alphabet (a-z and A-Z). This needs to be the token of the user account as which you'd like to act.
|
||||
|
||||
You can either get the token from the `./now/auth.json` file located in your user directory or [from the dashboard](https://zeit.co/account/tokens).
|
||||
9
errors/missing-dotenv-target.md
Normal file
9
errors/missing-dotenv-target.md
Normal file
@@ -0,0 +1,9 @@
|
||||
# Missing `--dotenv` Target
|
||||
|
||||
#### Why This Error Occurred
|
||||
|
||||
You specified a path as the value for the `--dotenv` flag, but the target of the path doesn't exist.
|
||||
|
||||
#### Possible Ways to Fix It
|
||||
|
||||
Make sure the target file you've specified exists and is readable by Now CLI. In addition, please ensure that the filename starts with a dot (example: `.env`) - then it should work.
|
||||
26
errors/missing-env-file.md
Normal file
26
errors/missing-env-file.md
Normal file
@@ -0,0 +1,26 @@
|
||||
# Missing Environment Variables While Developing
|
||||
|
||||
#### Why This Error Occurred
|
||||
You ran `now dev` inside a project that contains a `now.json` file with `env` or `build.env` properties that use [Now Secrets](https://zeit.co/docs/v2/deployments/environment-variables-and-secrets).
|
||||
|
||||
In order to use environment variables in your project locally that have values defined using the Now Secrets format (e.g. `@my-secret-value`), you will need to provide the value as an environment variable using a `.env` or `.env.build` file.
|
||||
|
||||
We require this to ensure your app works as you intend it to, in the Now Dev environment, and to provide you with a way to mirror or separate private environment variables within your applications, for example when connecting to a database.
|
||||
|
||||
Read below for how to address this error.
|
||||
|
||||
#### Possible Ways to Fix It
|
||||
|
||||
The error message will list environment variables that are required and which file they are required to be included in (either `.env` or `.env.build`).
|
||||
|
||||
If the file does not exist yet, please create the file that the error message mentions and insert the missing environment variable into it.
|
||||
|
||||
For example, if the error message shows that the environment variable `TEST` is missing from `.env`, then the `.env` file should look like this:
|
||||
|
||||
```
|
||||
TEST=value
|
||||
```
|
||||
|
||||
In the above example, `TEST` represents the name of the environment variable and `value` its value.
|
||||
|
||||
For more information on Environment Variables in development, [see the documentation](https://zeit.co/docs/v2/development/environment-variables/).
|
||||
19
errors/missing-env-key-value.md
Normal file
19
errors/missing-env-key-value.md
Normal file
@@ -0,0 +1,19 @@
|
||||
# Missing Env Key and Value
|
||||
|
||||
#### Why This Error Occurred
|
||||
|
||||
You specified the `--env` or `-e` flag and didn't add a name and value for the environment variable.
|
||||
|
||||
#### Possible Ways to Fix It
|
||||
|
||||
Make sure to set the name and value of the variable like this:
|
||||
|
||||
```bash
|
||||
now -e VARIABLE_NAME="VALUE"
|
||||
```
|
||||
|
||||
You can also specify a environment variable that contains a secret:
|
||||
|
||||
```bash
|
||||
now -e VARIABLE_NAME=@secret-name
|
||||
```
|
||||
11
errors/missing-scope-value.md
Normal file
11
errors/missing-scope-value.md
Normal file
@@ -0,0 +1,11 @@
|
||||
# Missing Scope Value
|
||||
|
||||
#### Why This Error Occurred
|
||||
|
||||
The `--scope` flag was specified, but there's no value for it available.
|
||||
|
||||
#### Possible Ways to Fix It
|
||||
|
||||
In order to make it work, you need to specify a value for the `--scope` flag. This needs to be the slug or ID of the team as which you'd like to act or the username or ID of a user you'd like to act as.
|
||||
|
||||
As an example, if your team URL is `https://zeit.co/teams/zeit`, you would set `--scope` to `zeit`.
|
||||
11
errors/missing-token-value.md
Normal file
11
errors/missing-token-value.md
Normal file
@@ -0,0 +1,11 @@
|
||||
# Missing Token Value
|
||||
|
||||
#### Why This Error Occurred
|
||||
|
||||
The `--token` flag was specified, but there's no value for it available.
|
||||
|
||||
#### Possible Ways to Fix It
|
||||
|
||||
In order to make it work, you need to specify a value for the `--token` flag. This needs to be the token of the user account as which you'd like to act.
|
||||
|
||||
You can either get the token from the `./now/auth.json` file located in your user directory or [from the dashboard](https://zeit.co/account/tokens).
|
||||
10
errors/no-credentials-found.md
Normal file
10
errors/no-credentials-found.md
Normal file
@@ -0,0 +1,10 @@
|
||||
# No Credentials Found
|
||||
|
||||
#### Why This Error Occurred
|
||||
|
||||
You're running Now CLI in a non-terminal context and there are no credentials available. This means that Now CLI is not able to authenticate against our service.
|
||||
|
||||
#### Possible Ways to Fix It
|
||||
|
||||
- Specify a value for the `--token` flag (this needs to be the token of the user account as which you'd like to act). You can either get the token from the `./now/auth.json` file located in your user directory or [from the dashboard](https://zeit.co/account/tokens).
|
||||
- Ensure that both `~/now/auth.json` and `~/now/config.json` exist
|
||||
10
errors/no-open-port-found.md
Normal file
10
errors/no-open-port-found.md
Normal file
@@ -0,0 +1,10 @@
|
||||
# No Open Port Found
|
||||
|
||||
#### Why This Error Occurred
|
||||
|
||||
Your application code exited or timed out before binding to a port number.
|
||||
|
||||
#### Possible Ways to Fix It
|
||||
|
||||
- For Node.js deployments, a call to [`Server#listen()`](https://nodejs.org/dist/latest/docs/api/http.html#http_server_listen) might be missing.
|
||||
- For Docker deployments, there might be a mismatch from what the `EXPOSE` directive specifies compared to what your application binds to.
|
||||
11
errors/no-token-allowed.md
Normal file
11
errors/no-token-allowed.md
Normal file
@@ -0,0 +1,11 @@
|
||||
# No Token Allowed
|
||||
|
||||
#### Why This Error Occurred
|
||||
|
||||
You tried to run a command that doesn't allow the `--token` flag (like `now switch`). This is not allowed because commands like these are influencing the configuration files.
|
||||
|
||||
In turn, they would have to take the value of the `--token` flag into consideration (which is not a good idea, because flags in Now CLI should never change the configuration).
|
||||
|
||||
#### Possible Ways to Fix It
|
||||
|
||||
Specify a value for the `--scope` flag. This needs to be the slug or ID of the team as which you'd like to act (as an example, if your team URL is `https://zeit.co/teams/zeit`, the value can be `zeit`) or the username or ID of a user you'd like to act as.
|
||||
9
errors/now-dev-as-dev-script.md
Normal file
9
errors/now-dev-as-dev-script.md
Normal file
@@ -0,0 +1,9 @@
|
||||
# `now dev` as `dev` script
|
||||
|
||||
#### Why This Error Occurred
|
||||
|
||||
The `package.json` file of the used project invokes `now dev` as `dev` script. This would cause `now dev` to recursively invoke itself.
|
||||
|
||||
#### Possible Ways to Fix It
|
||||
|
||||
Adjust the `dev` script inside the `package.json` file to match what your framework uses to begin development mode, e.g. `next` for Next.js or `gatsby develop` for Gatsby.
|
||||
72
errors/now-next-legacy-mode.md
Normal file
72
errors/now-next-legacy-mode.md
Normal file
@@ -0,0 +1,72 @@
|
||||
# `@now/next` Legacy Mode
|
||||
|
||||
#### Why This Warning Occurred
|
||||
|
||||
`@now/next` has two modes: `legacy` and `serverless`. You will always want to use the `serverless` mode. `legacy` is to provide backwards compatibility with previous `@now/next` versions.
|
||||
|
||||
The differences:
|
||||
|
||||
Legacy:
|
||||
|
||||
- Minimal lambda size of `2.2Mb` (approximately)
|
||||
- Forces `next@v7.0.2-canary.49` and `next-server@v7.0.2-canary.49`
|
||||
- Forces all `dependencies` to be `devDependencies`
|
||||
- Loads `next.config.js` on bootup, breaking sometimes when users didn't use `phases` to load files
|
||||
- Used `next-server` which is the full Next.js server with routing etc.
|
||||
- Runs `npm install`
|
||||
- Runs `npm run now-build`
|
||||
- Runs `npm install --production` after build
|
||||
|
||||
Serverless:
|
||||
|
||||
- Minimal lambda size of `49Kb` (approximately)
|
||||
- Uses Next.js build targets (`target: 'serverless'`) in `next.config.js`. [documentation](https://github.com/zeit/next.js#summary)
|
||||
- Does not make changes to your application dependencies
|
||||
- Does not load `next.config.js` ([as per the serverless target documentation](https://github.com/zeit/next.js#summary))
|
||||
- Runs `npm install`
|
||||
- Runs `npm run now-build`
|
||||
- Does not run `npm install --production` as the output from the build is all that's needed to bundle lambdas.
|
||||
- No runtime dependencies, meaning smaller lambda functions
|
||||
- Optimized for fast [cold start](https://zeit.co/blog/serverless-ssr#cold-start)
|
||||
|
||||
#### Possible Ways to Fix It
|
||||
|
||||
In order to create the smallest possible lambdas Next.js has to be configured to build for the `serverless` target.
|
||||
|
||||
1. Serverless Next.js requires Next.js 8 or later, to upgrade you can install the `latest` version:
|
||||
|
||||
```
|
||||
npm install next --save
|
||||
```
|
||||
|
||||
2. Add the `now-build` script to your `package.json`
|
||||
|
||||
```json
|
||||
{
|
||||
"scripts": {
|
||||
"now-build": "next build"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
3. Add `target: 'serverless'` to `next.config.js`
|
||||
|
||||
```js
|
||||
module.exports = {
|
||||
target: 'serverless',
|
||||
// Other options are still valid
|
||||
};
|
||||
```
|
||||
|
||||
4. Optionally make sure the `"src"` in `"builds"` points to your application `package.json`
|
||||
|
||||
```js
|
||||
{
|
||||
"version": 2,
|
||||
"builds": [{ "src": "package.json", "use": "@now/next" }]
|
||||
}
|
||||
```
|
||||
|
||||
### Useful Links
|
||||
|
||||
- [Serverless target implementation](https://github.com/zeit/now-builders/pull/150)
|
||||
45
errors/now-next-no-serverless-pages-built.md
Normal file
45
errors/now-next-no-serverless-pages-built.md
Normal file
@@ -0,0 +1,45 @@
|
||||
# `@now/next` No Serverless Pages Built
|
||||
|
||||
#### Why This Error Occurred
|
||||
|
||||
This error occurs when you have your application is not configured for Serverless Next.js build output.
|
||||
|
||||
#### Possible Ways to Fix It
|
||||
|
||||
In order to create the smallest possible lambdas Next.js has to be configured to build for the `serverless` target.
|
||||
|
||||
1. Serverless Next.js requires Next.js 8 or later, to upgrade you can install the `latest` version:
|
||||
|
||||
```
|
||||
npm install next --save
|
||||
```
|
||||
|
||||
2. Add the `now-build` script to your `package.json`
|
||||
|
||||
```json
|
||||
{
|
||||
"scripts": {
|
||||
"now-build": "next build"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
3. Add `target: 'serverless'` to `next.config.js`
|
||||
|
||||
```js
|
||||
module.exports = {
|
||||
target: 'serverless',
|
||||
// Other options
|
||||
};
|
||||
```
|
||||
|
||||
4. Remove `distDir` from `next.config.js` as `@now/next` can't parse this file and expects your build output at `/.next`
|
||||
|
||||
5. Optionally make sure the `"src"` in `"builds"` points to your application `package.json`
|
||||
|
||||
```js
|
||||
{
|
||||
"version": 2,
|
||||
"builds": [{ "src": "package.json", "use": "@now/next" }]
|
||||
}
|
||||
```
|
||||
40
errors/now-static-build-failed-to-detect-a-server.md
Normal file
40
errors/now-static-build-failed-to-detect-a-server.md
Normal file
@@ -0,0 +1,40 @@
|
||||
# `@now/static-build` Failed to detect a server running
|
||||
|
||||
#### Why This Warning Occurred
|
||||
|
||||
When running `now dev`, the `@now/static-build` builder proxies relevant HTTP
|
||||
requests to the server that is created by the `now-dev` script in the
|
||||
`package.json` file.
|
||||
|
||||
In order for `now dev` to know which port the server is running on, the builder
|
||||
is provided a `$PORT` environment variable that the server _must_ bind to. The
|
||||
error "Failed to detect a server running on port" is printed if the builder fails
|
||||
to detect a server listening on that specific port within five minutes.
|
||||
|
||||
#### Possible Ways to Fix It
|
||||
|
||||
Please ensure that your `now-dev` script binds the spawned development server on
|
||||
the provided `$PORT` that the builder expects the server to bind to.
|
||||
|
||||
For example, if you are using Gatsby, your `now-dev` script must use the `-p`
|
||||
(port) option to bind to the `$PORT` specified from the builder:
|
||||
|
||||
> *In Windows environments, reference the `PORT` environment variable with `%PORT%`*
|
||||
|
||||
```
|
||||
{
|
||||
...
|
||||
"scripts": {
|
||||
...
|
||||
"now-dev": "gatsby develop -p $PORT"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Consult your static builder program's `--help` or documentation to figure out what
|
||||
the command line flag to bind to a specific port is (in many cases, it is one of:
|
||||
`-p` / `-P` / `--port`).
|
||||
|
||||
### Useful Links
|
||||
|
||||
- [`@now/static-build` Local Development Documentation](https://zeit.co/docs/v2/deployments/official-builders/static-build-now-static-build#local-development)
|
||||
15
errors/path-not-deployable.md
Normal file
15
errors/path-not-deployable.md
Normal file
@@ -0,0 +1,15 @@
|
||||
# Path Not Deployable
|
||||
|
||||
#### Why This Error Occurred
|
||||
|
||||
You either tried to run Now CLI inside a directory that should never be deployed, or you specified a directory that should never be deployed like this: `now <directory>`.
|
||||
|
||||
#### Possible Ways to Fix It
|
||||
|
||||
Make sure that you're not trying to deploy one of these directories:
|
||||
|
||||
- User
|
||||
- Downloads
|
||||
- Desktop
|
||||
|
||||
These directories are not supported for security reasons.
|
||||
32
errors/regions-and-scale-at-once.md
Normal file
32
errors/regions-and-scale-at-once.md
Normal file
@@ -0,0 +1,32 @@
|
||||
# Can't Set `regions` and `scale` Options Simultaneously
|
||||
|
||||
#### Why This Error Occurred
|
||||
|
||||
Your deployment's configuration contains a `regions` and `scale`
|
||||
configuration simultaneously.
|
||||
|
||||
#### Possible Ways to Fix It
|
||||
|
||||
The `regions` setting is intended to be used to scale the
|
||||
deployment to the supplied regions or datacenters identifiers
|
||||
with default scale settings.
|
||||
|
||||
```json
|
||||
{
|
||||
"regions": ["sfo", "bru", "gru", "iad"]
|
||||
}
|
||||
```
|
||||
|
||||
The `scale` object allows you to be more granular: you can decide a
|
||||
`min` and `max` number of instances per region:
|
||||
|
||||
```json
|
||||
{
|
||||
"scale": {
|
||||
"sfo": { "min": 0, "max": 10 }
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
To solve this problem, use only one of the two ways of deciding
|
||||
where to scale your deployment to.
|
||||
36
errors/scale-invalid-dc.md
Normal file
36
errors/scale-invalid-dc.md
Normal file
@@ -0,0 +1,36 @@
|
||||
# Invalid Region or DC Identifier
|
||||
|
||||
#### Why This Error Occurred
|
||||
|
||||
When supplying a region or DC identifier in `now scale`,
|
||||
we weren't able to recognize the value as valid.
|
||||
|
||||
#### Possible Ways to Fix It
|
||||
|
||||
Check your `now scale` command make sure you are using a
|
||||
valid string after the URL. Regions
|
||||
and DCs have to be in *lowercase*.
|
||||
|
||||
**Valid region identifiers**:
|
||||
|
||||
- `all` (special, used to scale to all DCs, can only appear once)
|
||||
- `sfo`
|
||||
- `bru`
|
||||
- `gru`
|
||||
- `iad`
|
||||
|
||||
In `now-cli`, they currently are transformed to
|
||||
DC identifiers before being sent to our APIs.
|
||||
|
||||
**Valid DC identifiers**:
|
||||
|
||||
- `sfo1`
|
||||
- `bru1`
|
||||
- `gru1`
|
||||
- `iad1`
|
||||
|
||||
To pass multiple ones, use a comma:
|
||||
|
||||
```
|
||||
now scale my-url-123.now.sh sfo,bru,gru 1 5
|
||||
```
|
||||
31
errors/scale-ls.md
Normal file
31
errors/scale-ls.md
Normal file
@@ -0,0 +1,31 @@
|
||||
# `now scale ls` is deprecated
|
||||
|
||||
#### Why This Error Occurred
|
||||
|
||||
We have stopped supporting this command, in favor of
|
||||
better alternatives.
|
||||
|
||||
`now scale ls` used to list all the scaling rules
|
||||
for all your deployments. The output would be too long,
|
||||
and it would often be hard to find the information
|
||||
you needed in a long list of items.
|
||||
|
||||
#### Possible Ways to Fix It
|
||||
|
||||
Instead of using `now scale ls` to list all your deployments
|
||||
and their scaling rules, first use `now ls` to find
|
||||
your deployment:
|
||||
|
||||
```console
|
||||
now ls
|
||||
```
|
||||
|
||||
Then, select the URL of your deployment, which uniquely identifies it, and run:
|
||||
|
||||
```console
|
||||
now inspect my-deployment-12345.now.sh
|
||||
```
|
||||
|
||||
The `inspect` subcommand will give you your deployment's scale information, including what datacenters it's enabled on, the
|
||||
current number of instances and minimums/maximums.
|
||||
|
||||
12
errors/scaling-path-alias.md
Normal file
12
errors/scaling-path-alias.md
Normal file
@@ -0,0 +1,12 @@
|
||||
# Scaling path alias
|
||||
|
||||
#### Why This Error Occurred
|
||||
|
||||
You tried to use `now scale` on a path alias (`now alias -r rules.json`).
|
||||
|
||||
#### Possible Ways to Fix It
|
||||
|
||||
Path aliases are routes to instances. Instances can be scaled independent from each other.
|
||||
You can view path aliases by running `now alias ls <id>`.
|
||||
|
||||
Documentation for Path Aliases can be found [here](https://zeit.co/docs/features/path-aliases).
|
||||
10
errors/scope-not-accessible.md
Normal file
10
errors/scope-not-accessible.md
Normal file
@@ -0,0 +1,10 @@
|
||||
# Scope Not Accessible
|
||||
|
||||
#### Why This Error Occurred
|
||||
|
||||
You specified the `--scope` flag and specified the ID or slug of a team that you're not a part of or a user whose account you don't own. This problem could also occur if your user credentials aren't valid anymore.
|
||||
|
||||
#### Possible Ways to Fix It
|
||||
|
||||
- Make sure commands like `now ls` work just fine. This will ensure that your user credentials are valid. If it's not working correctly, please log in again using `now login`.
|
||||
- Ensure that the scope you specified using `--scope` shows up in the output of `now switch`. If it doesn't, you're either not part of the team (if you specified a team) or you logged into the wrong user account.
|
||||
11
errors/scope-not-existent.md
Normal file
11
errors/scope-not-existent.md
Normal file
@@ -0,0 +1,11 @@
|
||||
# Scope Not Existent
|
||||
|
||||
#### Why This Error Occurred
|
||||
|
||||
You specified the `--scope` flag and specified the ID or slug of a team that does not exist or that you're not a part of. Similarly you might have specified the ID or username of user whose account you don't own.
|
||||
|
||||
#### Possible Ways to Fix It
|
||||
|
||||
If you're sure the specified team exists, please make sure that you're a part of it (ask an owner of the team to invite you). If you specified the identifier of a user, make sure you are actually the owner of this account.
|
||||
|
||||
Otherwise, either create a team with the specified slug or ensure that the identifier is correct if you're sure that the scope exists.
|
||||
20
errors/solve-challenges-manually.md
Normal file
20
errors/solve-challenges-manually.md
Normal file
@@ -0,0 +1,20 @@
|
||||
# DNS Challenges must be solved manually
|
||||
|
||||
## Why This Error Occurred
|
||||
|
||||
When generating a certificate, we have to prove ownership over the domain
|
||||
for the Certificate Authority (CA) that issues it. In the case of Wildcard Certificates,
|
||||
the requested challenge consists of adding TXT DNS records so, when the domain does not
|
||||
point to ZEIT World DNS, we cannot create the records to solve the challenge.
|
||||
|
||||
## How to Fix It
|
||||
|
||||
To generate a certificate solving challenges manually, you must add the given `TXT` records with
|
||||
the appropriate name to your DNS. Then, after verifying that the CA can read the records,
|
||||
you can rerun the issuance command.
|
||||
|
||||
In case you want to start issuing a certificate to get the records you have to add or to
|
||||
get those records again in the console, You can run the issuance command including the
|
||||
`--challenge-only` option. This way the CLI will output the challenges information and,
|
||||
after adding those records, you can rerun the command without `--challenge-only` to finish
|
||||
issuance.
|
||||
9
errors/unauthorized-domain.md
Normal file
9
errors/unauthorized-domain.md
Normal file
@@ -0,0 +1,9 @@
|
||||
# Not authorized to access domain
|
||||
|
||||
#### Why This Error Occurred
|
||||
|
||||
You tried to add or update a domain's configuration, but you don't have permission to modify the domain.
|
||||
|
||||
#### Possible Ways to Fix It
|
||||
|
||||
If you or your team owns the domain, then you are most likely in the wrong context. Use `now switch` to select the team or user that owns the domain.
|
||||
17
errors/v2-no-min.md
Normal file
17
errors/v2-no-min.md
Normal file
@@ -0,0 +1,17 @@
|
||||
# No minimum scale settings on Cloud v2 deployments
|
||||
|
||||
#### Why This Error Occurred
|
||||
|
||||
An attempt was made at scaling a Cloud v2 deployment with a `min` scale
|
||||
setting. This isn't supported yet.
|
||||
|
||||
#### Possible Ways to Fix It
|
||||
|
||||
Ensure your scale settings (in `now.json`, the command you're running
|
||||
or from a previous deployment who's alias you're trying to overwrite) has
|
||||
the `min` scale setting set to `0`. You can do this by running
|
||||
|
||||
```
|
||||
now scale <deployment> 0 10
|
||||
```
|
||||
|
||||
29
errors/verification-timeout.md
Normal file
29
errors/verification-timeout.md
Normal file
@@ -0,0 +1,29 @@
|
||||
# Verification Timeout
|
||||
|
||||
#### Why This Error Occurred
|
||||
|
||||
After the deployment build completed and the deployment state was set to `READY`,
|
||||
instances failed to initialize properly.
|
||||
|
||||
The CLI attempted to verify that the scale settings of your instances matched,
|
||||
but it couldn't do so within the allotted time (defaults to 2 minutes).
|
||||
|
||||
#### Possible Ways to Fix It
|
||||
|
||||
Instance verification is the process of ensuring that after
|
||||
your deployment is ready, we can actually run (instantiate) your code.
|
||||
|
||||
If you configured [regions or scale](https://zeit.co/docs/features/scaling),
|
||||
we ensure the minimums and maximums are met for the regions you enabled.
|
||||
|
||||
If you think your code is taking too long to instantiate, this can be due
|
||||
to slow boot up times. You can supply `--no-verify` to skip verification
|
||||
if you are confident your code runs properly.
|
||||
|
||||
If your application is not listening on a HTTP port, we might be failing to
|
||||
instantiate your deployment as well. It might not be showing any errors,
|
||||
but the deployment instance is effectively not routable and cannot be
|
||||
verified.
|
||||
|
||||
If your instances are crashing before an HTTP port is exposed, verification
|
||||
will fail as well. Double check your logs (e.g.: by running `now logs <url>`)
|
||||
1
examples/amp/.gitignore
vendored
Normal file
1
examples/amp/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
.env
|
||||
27
examples/amp/README.md
Normal file
27
examples/amp/README.md
Normal file
@@ -0,0 +1,27 @@
|
||||
# AMP Example
|
||||
|
||||
This directory is a brief example of an [AMP](https://amp.dev/) site that can be deployed with ZEIT Now and zero configuration.
|
||||
|
||||
## Deploy Your Own
|
||||
|
||||
Deploy your own AMP project with ZEIT Now.
|
||||
|
||||
[](https://zeit.co/new/project?template=https://github.com/zeit/now-examples/tree/master/amp)
|
||||
|
||||
_Live Example: https://amp.now-examples.now.sh_
|
||||
|
||||
### How We Created This Example
|
||||
|
||||
To get started deploying AMP with ZEIT Now, you can use the [Now CLI](https://zeit.co/download) to initialize the project:
|
||||
|
||||
```shell
|
||||
$ now init amp
|
||||
```
|
||||
|
||||
### Deploying From Your Terminal
|
||||
|
||||
You can deploy your new AMP project with a single command from your terminal using Now CLI:
|
||||
|
||||
```shell
|
||||
$ now
|
||||
```
|
||||
BIN
examples/amp/favicon.png
Normal file
BIN
examples/amp/favicon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.0 KiB |
72
examples/amp/index.html
Normal file
72
examples/amp/index.html
Normal file
@@ -0,0 +1,72 @@
|
||||
<!DOCTYPE html>
|
||||
<html ⚡>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width,minimum-scale=1" />
|
||||
<link rel="shortcut icon" href="favicon.png">
|
||||
<style amp-boilerplate>body{-webkit-animation:-amp-start 8s steps(1,end) 0s 1 normal both;-moz-animation:-amp-start 8s steps(1,end) 0s 1 normal both;-ms-animation:-amp-start 8s steps(1,end) 0s 1 normal both;animation:-amp-start 8s steps(1,end) 0s 1 normal both}@-webkit-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-moz-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-ms-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-o-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}</style><noscript><style amp-boilerplate>body{-webkit-animation:none;-moz-animation:none;-ms-animation:none;animation:none}</style></noscript>
|
||||
<link rel="canonical" href="index.html" />
|
||||
<title>AMP Website</title>
|
||||
<script async src="https://cdn.ampproject.org/v0.js"></script>
|
||||
<style amp-custom>
|
||||
body > * {
|
||||
margin: 3rem 1rem;
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
|
||||
color: #525252;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: 2rem;
|
||||
}
|
||||
|
||||
h4 {
|
||||
margin-top: 2rem;
|
||||
}
|
||||
|
||||
p {
|
||||
font-size: 1.2rem;
|
||||
line-height: 2rem;
|
||||
}
|
||||
|
||||
.links {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
margin-bottom: 3rem;
|
||||
}
|
||||
|
||||
.links a {
|
||||
margin: 0 10px;
|
||||
font-size: 1rem;
|
||||
color: #005af0;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<center>
|
||||
<amp-img width=150 height=150 layout="fixed" class="logo" src="logo.png"></amp-img>
|
||||
<h3>Welcome to your AMP page</h3>
|
||||
<p>AMP is a web component framework to <br> easily create user-first websites, stories, ads and emails.</p>
|
||||
|
||||
<h4>Links</h4>
|
||||
<div class="links">
|
||||
<a href="https://amp.dev/">Homepage</a>
|
||||
<a href="https://amp.dev/documentation/guides-and-tutorials/?format=websites">Tutorials</a>
|
||||
<a href="https://amp.dev/documentation/examples/">Examples</a>
|
||||
<a href="https://blog.amp.dev">Blog</a>
|
||||
</div>
|
||||
|
||||
<h4>Ready to get started?</h4>
|
||||
<div class="links">
|
||||
<a href="https://amp.dev/documentation/guides-and-tutorials/start/create/?format=websites">Create your first AMP page</a>
|
||||
</div>
|
||||
|
||||
<h4>Get involved</h4>
|
||||
<div class="links">
|
||||
<a href="https://twitter.com/amphtml">Twitter</a>
|
||||
<a href="https://amphtml.slack.com">Slack</a>
|
||||
<a href="https://amp.dev/events/amp-conf-2019">AMP Conf</a>
|
||||
<a href="https://amp.dev/events/amp-roadshow">AMP Roadshow</a>
|
||||
</div>
|
||||
</center>
|
||||
</body>
|
||||
</html>
|
||||
BIN
examples/amp/logo.png
Normal file
BIN
examples/amp/logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 43 KiB |
13
examples/angular/.editorconfig
Normal file
13
examples/angular/.editorconfig
Normal file
@@ -0,0 +1,13 @@
|
||||
# Editor configuration, see https://editorconfig.org
|
||||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
[*.md]
|
||||
max_line_length = off
|
||||
trim_trailing_whitespace = false
|
||||
50
examples/angular/.gitignore
vendored
Normal file
50
examples/angular/.gitignore
vendored
Normal file
@@ -0,0 +1,50 @@
|
||||
# See http://help.github.com/ignore-files/ for more about ignoring files.
|
||||
|
||||
# compiled output
|
||||
/dist
|
||||
/tmp
|
||||
/out-tsc
|
||||
# Only exists if Bazel was run
|
||||
/bazel-out
|
||||
|
||||
# dependencies
|
||||
/node_modules
|
||||
|
||||
# profiling files
|
||||
chrome-profiler-events.json
|
||||
speed-measure-plugin.json
|
||||
|
||||
# IDEs and editors
|
||||
/.idea
|
||||
.project
|
||||
.classpath
|
||||
.c9/
|
||||
*.launch
|
||||
.settings/
|
||||
*.sublime-workspace
|
||||
|
||||
# IDE - VSCode
|
||||
.vscode/*
|
||||
!.vscode/settings.json
|
||||
!.vscode/tasks.json
|
||||
!.vscode/launch.json
|
||||
!.vscode/extensions.json
|
||||
.history/*
|
||||
|
||||
# misc
|
||||
/.sass-cache
|
||||
/connect.lock
|
||||
/coverage
|
||||
/libpeerconnection.log
|
||||
npm-debug.log
|
||||
yarn-error.log
|
||||
testem.log
|
||||
/typings
|
||||
|
||||
# System Files
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
|
||||
# Environment Variables
|
||||
.env
|
||||
.env.build
|
||||
2
examples/angular/.nowignore
Normal file
2
examples/angular/.nowignore
Normal file
@@ -0,0 +1,2 @@
|
||||
README.md
|
||||
yarn.lock
|
||||
29
examples/angular/README.md
Normal file
29
examples/angular/README.md
Normal file
@@ -0,0 +1,29 @@
|
||||

|
||||
|
||||
# Angular Example
|
||||
|
||||
This directory is a brief example of an [Angular](https://angular.io/) app that can be deployed with ZEIT Now and zero configuration.
|
||||
|
||||
## Deploy Your Own
|
||||
|
||||
Deploy your own Angular project with ZEIT Now.
|
||||
|
||||
[](https://zeit.co/new/project?template=https://github.com/zeit/now-examples/tree/master/angular)
|
||||
|
||||
_Live Example: https://angular.now-examples.now.sh_
|
||||
|
||||
### How We Created This Example
|
||||
|
||||
To get started with Angular, you can use the [Angular CLI](https://cli.angular.io/) to initialize the project:
|
||||
|
||||
```shell
|
||||
$ ng new
|
||||
```
|
||||
|
||||
### Deploying From Your Terminal
|
||||
|
||||
You can deploy your new Angular project with a single command from your terminal using [Now CLI](https://zeit.co/download):
|
||||
|
||||
```shell
|
||||
$ now
|
||||
```
|
||||
109
examples/angular/angular.json
Normal file
109
examples/angular/angular.json
Normal file
@@ -0,0 +1,109 @@
|
||||
{
|
||||
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
|
||||
"version": 1,
|
||||
"newProjectRoot": "projects",
|
||||
"projects": {
|
||||
"angular": {
|
||||
"projectType": "application",
|
||||
"schematics": {},
|
||||
"root": "",
|
||||
"sourceRoot": "src",
|
||||
"prefix": "app",
|
||||
"architect": {
|
||||
"build": {
|
||||
"builder": "@angular-devkit/build-angular:browser",
|
||||
"options": {
|
||||
"outputPath": "dist/angular",
|
||||
"index": "src/index.html",
|
||||
"main": "src/main.ts",
|
||||
"polyfills": "src/polyfills.ts",
|
||||
"tsConfig": "tsconfig.app.json",
|
||||
"aot": false,
|
||||
"assets": ["src/favicon.ico", "src/assets"],
|
||||
"styles": ["src/styles.css"],
|
||||
"scripts": []
|
||||
},
|
||||
"configurations": {
|
||||
"production": {
|
||||
"fileReplacements": [
|
||||
{
|
||||
"replace": "src/environments/environment.ts",
|
||||
"with": "src/environments/environment.prod.ts"
|
||||
}
|
||||
],
|
||||
"optimization": true,
|
||||
"outputHashing": "all",
|
||||
"sourceMap": false,
|
||||
"extractCss": true,
|
||||
"namedChunks": false,
|
||||
"aot": true,
|
||||
"extractLicenses": true,
|
||||
"vendorChunk": false,
|
||||
"buildOptimizer": true,
|
||||
"budgets": [
|
||||
{
|
||||
"type": "initial",
|
||||
"maximumWarning": "2mb",
|
||||
"maximumError": "5mb"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"serve": {
|
||||
"builder": "@angular-devkit/build-angular:dev-server",
|
||||
"options": {
|
||||
"browserTarget": "angular:build"
|
||||
},
|
||||
"configurations": {
|
||||
"production": {
|
||||
"browserTarget": "angular:build:production"
|
||||
}
|
||||
}
|
||||
},
|
||||
"extract-i18n": {
|
||||
"builder": "@angular-devkit/build-angular:extract-i18n",
|
||||
"options": {
|
||||
"browserTarget": "angular:build"
|
||||
}
|
||||
},
|
||||
"test": {
|
||||
"builder": "@angular-devkit/build-angular:karma",
|
||||
"options": {
|
||||
"main": "src/test.ts",
|
||||
"polyfills": "src/polyfills.ts",
|
||||
"tsConfig": "tsconfig.spec.json",
|
||||
"karmaConfig": "karma.conf.js",
|
||||
"assets": ["src/favicon.ico", "src/assets"],
|
||||
"styles": ["src/styles.css"],
|
||||
"scripts": []
|
||||
}
|
||||
},
|
||||
"lint": {
|
||||
"builder": "@angular-devkit/build-angular:tslint",
|
||||
"options": {
|
||||
"tsConfig": [
|
||||
"tsconfig.app.json",
|
||||
"tsconfig.spec.json",
|
||||
"e2e/tsconfig.json"
|
||||
],
|
||||
"exclude": ["**/node_modules/**"]
|
||||
}
|
||||
},
|
||||
"e2e": {
|
||||
"builder": "@angular-devkit/build-angular:protractor",
|
||||
"options": {
|
||||
"protractorConfig": "e2e/protractor.conf.js",
|
||||
"devServerTarget": "angular:serve"
|
||||
},
|
||||
"configurations": {
|
||||
"production": {
|
||||
"devServerTarget": "angular:serve:production"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"defaultProject": "angular"
|
||||
}
|
||||
12
examples/angular/browserslist
Normal file
12
examples/angular/browserslist
Normal file
@@ -0,0 +1,12 @@
|
||||
# This file is used by the build system to adjust CSS and JS output to support the specified browsers below.
|
||||
# For additional information regarding the format and rule options, please see:
|
||||
# https://github.com/browserslist/browserslist#queries
|
||||
|
||||
# You can see what browsers were selected by your queries by running:
|
||||
# npx browserslist
|
||||
|
||||
> 0.5%
|
||||
last 2 versions
|
||||
Firefox ESR
|
||||
not dead
|
||||
not IE 9-11 # For IE 9-11 support, remove 'not'.
|
||||
32
examples/angular/e2e/protractor.conf.js
Normal file
32
examples/angular/e2e/protractor.conf.js
Normal file
@@ -0,0 +1,32 @@
|
||||
// @ts-check
|
||||
// Protractor configuration file, see link for more information
|
||||
// https://github.com/angular/protractor/blob/master/lib/config.ts
|
||||
|
||||
const { SpecReporter } = require('jasmine-spec-reporter');
|
||||
|
||||
/**
|
||||
* @type { import("protractor").Config }
|
||||
*/
|
||||
exports.config = {
|
||||
allScriptsTimeout: 11000,
|
||||
specs: ['./src/**/*.e2e-spec.ts'],
|
||||
capabilities: {
|
||||
browserName: 'chrome',
|
||||
},
|
||||
directConnect: true,
|
||||
baseUrl: 'http://localhost:4200/',
|
||||
framework: 'jasmine',
|
||||
jasmineNodeOpts: {
|
||||
showColors: true,
|
||||
defaultTimeoutInterval: 30000,
|
||||
print: function() {},
|
||||
},
|
||||
onPrepare() {
|
||||
require('ts-node').register({
|
||||
project: require('path').join(__dirname, './tsconfig.json'),
|
||||
});
|
||||
jasmine
|
||||
.getEnv()
|
||||
.addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
|
||||
},
|
||||
};
|
||||
28
examples/angular/e2e/src/app.e2e-spec.ts
Normal file
28
examples/angular/e2e/src/app.e2e-spec.ts
Normal file
@@ -0,0 +1,28 @@
|
||||
import { AppPage } from './app.po';
|
||||
import { browser, logging } from 'protractor';
|
||||
|
||||
describe('workspace-project App', () => {
|
||||
let page: AppPage;
|
||||
|
||||
beforeEach(() => {
|
||||
page = new AppPage();
|
||||
});
|
||||
|
||||
it('should display welcome message', () => {
|
||||
page.navigateTo();
|
||||
expect(page.getTitleText()).toEqual('Welcome to angular!');
|
||||
});
|
||||
|
||||
afterEach(async () => {
|
||||
// Assert that there are no errors emitted from the browser
|
||||
const logs = await browser
|
||||
.manage()
|
||||
.logs()
|
||||
.get(logging.Type.BROWSER);
|
||||
expect(logs).not.toContain(
|
||||
jasmine.objectContaining({
|
||||
level: logging.Level.SEVERE,
|
||||
} as logging.Entry)
|
||||
);
|
||||
});
|
||||
});
|
||||
11
examples/angular/e2e/src/app.po.ts
Normal file
11
examples/angular/e2e/src/app.po.ts
Normal file
@@ -0,0 +1,11 @@
|
||||
import { browser, by, element } from 'protractor';
|
||||
|
||||
export class AppPage {
|
||||
navigateTo() {
|
||||
return browser.get(browser.baseUrl) as Promise<any>;
|
||||
}
|
||||
|
||||
getTitleText() {
|
||||
return element(by.css('app-root h1')).getText() as Promise<string>;
|
||||
}
|
||||
}
|
||||
9
examples/angular/e2e/tsconfig.json
Normal file
9
examples/angular/e2e/tsconfig.json
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"extends": "../tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"outDir": "../out-tsc/e2e",
|
||||
"module": "commonjs",
|
||||
"target": "es5",
|
||||
"types": ["jasmine", "jasminewd2", "node"]
|
||||
}
|
||||
}
|
||||
32
examples/angular/karma.conf.js
Normal file
32
examples/angular/karma.conf.js
Normal file
@@ -0,0 +1,32 @@
|
||||
// Karma configuration file, see link for more information
|
||||
// https://karma-runner.github.io/1.0/config/configuration-file.html
|
||||
|
||||
module.exports = function(config) {
|
||||
config.set({
|
||||
basePath: '',
|
||||
frameworks: ['jasmine', '@angular-devkit/build-angular'],
|
||||
plugins: [
|
||||
require('karma-jasmine'),
|
||||
require('karma-chrome-launcher'),
|
||||
require('karma-jasmine-html-reporter'),
|
||||
require('karma-coverage-istanbul-reporter'),
|
||||
require('@angular-devkit/build-angular/plugins/karma'),
|
||||
],
|
||||
client: {
|
||||
clearContext: false, // leave Jasmine Spec Runner output visible in browser
|
||||
},
|
||||
coverageIstanbulReporter: {
|
||||
dir: require('path').join(__dirname, './coverage/angular'),
|
||||
reports: ['html', 'lcovonly', 'text-summary'],
|
||||
fixWebpackSourcePaths: true,
|
||||
},
|
||||
reporters: ['progress', 'kjhtml'],
|
||||
port: 9876,
|
||||
colors: true,
|
||||
logLevel: config.LOG_INFO,
|
||||
autoWatch: true,
|
||||
browsers: ['Chrome'],
|
||||
singleRun: false,
|
||||
restartOnFileChange: true,
|
||||
});
|
||||
};
|
||||
48
examples/angular/package.json
Normal file
48
examples/angular/package.json
Normal file
@@ -0,0 +1,48 @@
|
||||
{
|
||||
"name": "angular",
|
||||
"version": "0.0.0",
|
||||
"scripts": {
|
||||
"ng": "ng",
|
||||
"start": "ng serve",
|
||||
"dev": "ng serve --port $PORT",
|
||||
"build": "ng build",
|
||||
"test": "ng test",
|
||||
"lint": "ng lint",
|
||||
"e2e": "ng e2e"
|
||||
},
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"@angular/animations": "~8.1.0",
|
||||
"@angular/common": "~8.1.0",
|
||||
"@angular/compiler": "~8.1.0",
|
||||
"@angular/core": "~8.1.0",
|
||||
"@angular/forms": "~8.1.0",
|
||||
"@angular/platform-browser": "~8.1.0",
|
||||
"@angular/platform-browser-dynamic": "~8.1.0",
|
||||
"@angular/router": "~8.1.0",
|
||||
"rxjs": "~6.4.0",
|
||||
"tslib": "^1.9.0",
|
||||
"zone.js": "~0.9.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@angular-devkit/build-angular": "~0.801.0",
|
||||
"@angular/cli": "~8.1.0",
|
||||
"@angular/compiler-cli": "~8.1.0",
|
||||
"@angular/language-service": "~8.1.0",
|
||||
"@types/node": "~8.9.4",
|
||||
"@types/jasmine": "~3.3.8",
|
||||
"@types/jasminewd2": "~2.0.3",
|
||||
"codelyzer": "^5.0.0",
|
||||
"jasmine-core": "~3.4.0",
|
||||
"jasmine-spec-reporter": "~4.2.1",
|
||||
"karma": "~4.1.0",
|
||||
"karma-chrome-launcher": "~2.2.0",
|
||||
"karma-coverage-istanbul-reporter": "~2.0.1",
|
||||
"karma-jasmine": "~2.0.1",
|
||||
"karma-jasmine-html-reporter": "^1.4.0",
|
||||
"protractor": "~5.4.0",
|
||||
"ts-node": "~7.0.0",
|
||||
"tslint": "~5.15.0",
|
||||
"typescript": "~3.4.3"
|
||||
}
|
||||
}
|
||||
20
examples/angular/src/app/app.component.html
Normal file
20
examples/angular/src/app/app.component.html
Normal file
@@ -0,0 +1,20 @@
|
||||
<!--The content below is only a placeholder and can be replaced.-->
|
||||
<div style="text-align:center">
|
||||
<h1>
|
||||
Welcome to {{ title }}!
|
||||
</h1>
|
||||
<img width="300" alt="Angular Logo" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTAgMjUwIj4KICAgIDxwYXRoIGZpbGw9IiNERDAwMzEiIGQ9Ik0xMjUgMzBMMzEuOSA2My4ybDE0LjIgMTIzLjFMMTI1IDIzMGw3OC45LTQzLjcgMTQuMi0xMjMuMXoiIC8+CiAgICA8cGF0aCBmaWxsPSIjQzMwMDJGIiBkPSJNMTI1IDMwdjIyLjItLjFWMjMwbDc4LjktNDMuNyAxNC4yLTEyMy4xTDEyNSAzMHoiIC8+CiAgICA8cGF0aCAgZmlsbD0iI0ZGRkZGRiIgZD0iTTEyNSA1Mi4xTDY2LjggMTgyLjZoMjEuN2wxMS43LTI5LjJoNDkuNGwxMS43IDI5LjJIMTgzTDEyNSA1Mi4xem0xNyA4My4zaC0zNGwxNy00MC45IDE3IDQwLjl6IiAvPgogIDwvc3ZnPg==">
|
||||
</div>
|
||||
<h2>Here are some links to help you start: </h2>
|
||||
<ul>
|
||||
<li>
|
||||
<h2><a target="_blank" rel="noopener" href="https://angular.io/tutorial">Tour of Heroes</a></h2>
|
||||
</li>
|
||||
<li>
|
||||
<h2><a target="_blank" rel="noopener" href="https://angular.io/cli">CLI Documentation</a></h2>
|
||||
</li>
|
||||
<li>
|
||||
<h2><a target="_blank" rel="noopener" href="https://blog.angular.io/">Angular blog</a></h2>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
31
examples/angular/src/app/app.component.spec.ts
Normal file
31
examples/angular/src/app/app.component.spec.ts
Normal file
@@ -0,0 +1,31 @@
|
||||
import { TestBed, async } from '@angular/core/testing';
|
||||
import { AppComponent } from './app.component';
|
||||
|
||||
describe('AppComponent', () => {
|
||||
beforeEach(async(() => {
|
||||
TestBed.configureTestingModule({
|
||||
declarations: [AppComponent],
|
||||
}).compileComponents();
|
||||
}));
|
||||
|
||||
it('should create the app', () => {
|
||||
const fixture = TestBed.createComponent(AppComponent);
|
||||
const app = fixture.debugElement.componentInstance;
|
||||
expect(app).toBeTruthy();
|
||||
});
|
||||
|
||||
it(`should have as title 'angular'`, () => {
|
||||
const fixture = TestBed.createComponent(AppComponent);
|
||||
const app = fixture.debugElement.componentInstance;
|
||||
expect(app.title).toEqual('angular');
|
||||
});
|
||||
|
||||
it('should render title in a h1 tag', () => {
|
||||
const fixture = TestBed.createComponent(AppComponent);
|
||||
fixture.detectChanges();
|
||||
const compiled = fixture.debugElement.nativeElement;
|
||||
expect(compiled.querySelector('h1').textContent).toContain(
|
||||
'Welcome to angular!'
|
||||
);
|
||||
});
|
||||
});
|
||||
10
examples/angular/src/app/app.component.ts
Normal file
10
examples/angular/src/app/app.component.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
import { Component } from '@angular/core';
|
||||
|
||||
@Component({
|
||||
selector: 'app-root',
|
||||
templateUrl: './app.component.html',
|
||||
styleUrls: ['./app.component.css'],
|
||||
})
|
||||
export class AppComponent {
|
||||
title = 'angular';
|
||||
}
|
||||
12
examples/angular/src/app/app.module.ts
Normal file
12
examples/angular/src/app/app.module.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
import { BrowserModule } from '@angular/platform-browser';
|
||||
import { NgModule } from '@angular/core';
|
||||
|
||||
import { AppComponent } from './app.component';
|
||||
|
||||
@NgModule({
|
||||
declarations: [AppComponent],
|
||||
imports: [BrowserModule],
|
||||
providers: [],
|
||||
bootstrap: [AppComponent],
|
||||
})
|
||||
export class AppModule {}
|
||||
3
examples/angular/src/environments/environment.prod.ts
Normal file
3
examples/angular/src/environments/environment.prod.ts
Normal file
@@ -0,0 +1,3 @@
|
||||
export const environment = {
|
||||
production: true,
|
||||
};
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user