mirror of
https://github.com/expressjs/express.git
synced 2026-02-27 03:07:33 +00:00
Compare commits
2720 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
72b9e48331 | ||
|
|
eba6aa1767 | ||
|
|
4283f38698 | ||
|
|
2d49c0d1f3 | ||
|
|
a7ca3817db | ||
|
|
1f044547ee | ||
|
|
612fc47044 | ||
|
|
8959ff155b | ||
|
|
dadf57cc8b | ||
|
|
764b6c61d9 | ||
|
|
582dadf787 | ||
|
|
12d97169d7 | ||
|
|
c29cfa823d | ||
|
|
e183a9694e | ||
|
|
d6cb449011 | ||
|
|
7bf4ad30fc | ||
|
|
b3936b96e5 | ||
|
|
44d0625e91 | ||
|
|
c492cde048 | ||
|
|
c2fa6cc94d | ||
|
|
464608025b | ||
|
|
d653d2308b | ||
|
|
a52b1f121c | ||
|
|
9edd8be520 | ||
|
|
aa1d47600a | ||
|
|
be7ec8b40e | ||
|
|
8e12dd9c17 | ||
|
|
fee0f0dce0 | ||
|
|
0dd80e7b50 | ||
|
|
78d5b72081 | ||
|
|
e0df865401 | ||
|
|
2abcbed67a | ||
|
|
02b9d0b2e6 | ||
|
|
927e181db7 | ||
|
|
dc411b3175 | ||
|
|
1e870f0f0d | ||
|
|
3cd01598a5 | ||
|
|
3b6d683b7f | ||
|
|
eeef763f6d | ||
|
|
76d3ec583d | ||
|
|
077d8b9247 | ||
|
|
92840b9f68 | ||
|
|
bf60d5a041 | ||
|
|
56ffab045e | ||
|
|
496ee401d7 | ||
|
|
f0d5b3b368 | ||
|
|
88072a56ea | ||
|
|
0d3a637389 | ||
|
|
dc44f3c226 | ||
|
|
1029b0b97f | ||
|
|
84f8228b8c | ||
|
|
968e8f0121 | ||
|
|
9eb1da4568 | ||
|
|
315e79e9f0 | ||
|
|
363d0d4f41 | ||
|
|
5ac631a270 | ||
|
|
75fc882001 | ||
|
|
d7cb213eeb | ||
|
|
568e0d297a | ||
|
|
8edf358739 | ||
|
|
40be3ed05d | ||
|
|
2c174d6b3b | ||
|
|
60ee465bf7 | ||
|
|
51210d6b95 | ||
|
|
a6caa267bd | ||
|
|
cdb3e9dc0d | ||
|
|
f2f09767fb | ||
|
|
eec31d7126 | ||
|
|
3c5ad753b6 | ||
|
|
dd338b5567 | ||
|
|
1b15af713c | ||
|
|
89c5affc3b | ||
|
|
2bba69f633 | ||
|
|
4403f136b7 | ||
|
|
f7c1c638bb | ||
|
|
f2d7bbe0e9 | ||
|
|
87468cffce | ||
|
|
3f7e3a714e | ||
|
|
38a9caf159 | ||
|
|
500c8ab4b3 | ||
|
|
c4ad97d555 | ||
|
|
b96401ac83 | ||
|
|
32a5c9cba5 | ||
|
|
0217e6ce96 | ||
|
|
6bebe0837f | ||
|
|
ff1c6f0cfa | ||
|
|
8ac3e80bf0 | ||
|
|
3923ec89f7 | ||
|
|
fd8ca32ab2 | ||
|
|
ba2f66d765 | ||
|
|
056c840a06 | ||
|
|
20e8f08cb2 | ||
|
|
bac0c64633 | ||
|
|
48923055eb | ||
|
|
0f20a5e06a | ||
|
|
56bfb9249f | ||
|
|
5ed1544cab | ||
|
|
e5c7be9364 | ||
|
|
73ce9d028c | ||
|
|
75debbe5bc | ||
|
|
5f33d89ea5 | ||
|
|
42fd29efe8 | ||
|
|
2d91eac811 | ||
|
|
a50f02e87d | ||
|
|
214f913b0c | ||
|
|
1021c86300 | ||
|
|
386516815a | ||
|
|
d5e5647bba | ||
|
|
a861ea7eaf | ||
|
|
cb844132e6 | ||
|
|
8050308706 | ||
|
|
e79f72bf88 | ||
|
|
07b6c9f563 | ||
|
|
8f4e61a474 | ||
|
|
54d37c60f5 | ||
|
|
a93d375acc | ||
|
|
d66f0e5eb9 | ||
|
|
e84db12783 | ||
|
|
1ad2ecefe8 | ||
|
|
08b68ec8cd | ||
|
|
48be9233d8 | ||
|
|
a512d9b47d | ||
|
|
62234cc106 | ||
|
|
ab61837885 | ||
|
|
7a5041bf9c | ||
|
|
4d219135b2 | ||
|
|
26eeb64640 | ||
|
|
5426eb0b62 | ||
|
|
b9e32ec2c4 | ||
|
|
32b8613708 | ||
|
|
90eddb3439 | ||
|
|
accd6180c1 | ||
|
|
e770b674ff | ||
|
|
4f7c4d1051 | ||
|
|
78845e7d23 | ||
|
|
93f1cecc92 | ||
|
|
8ccd89f6ad | ||
|
|
0a210cce7a | ||
|
|
f110248462 | ||
|
|
96e4014a70 | ||
|
|
2173d00829 | ||
|
|
3827f5ef8b | ||
|
|
73bed61afa | ||
|
|
ee89ff5026 | ||
|
|
8df9e745d5 | ||
|
|
c76e954504 | ||
|
|
136f054614 | ||
|
|
e9a4b4f8ff | ||
|
|
5415c98ff9 | ||
|
|
39efa452fc | ||
|
|
bddcdee3fe | ||
|
|
2e8d44b444 | ||
|
|
70d68419b0 | ||
|
|
26fab2a27d | ||
|
|
0f5560eebd | ||
|
|
170dcc2907 | ||
|
|
18d6c78ef4 | ||
|
|
1248f0338b | ||
|
|
b400814d00 | ||
|
|
a934929bb3 | ||
|
|
140efb574c | ||
|
|
3c0c96114f | ||
|
|
362c96c8c1 | ||
|
|
5db3d0f9fc | ||
|
|
80c814c393 | ||
|
|
bf66465937 | ||
|
|
72eea7e6cd | ||
|
|
8f4cd13c89 | ||
|
|
6556cefc71 | ||
|
|
7bfb58920a | ||
|
|
2e324ccf5f | ||
|
|
1a10ee76b3 | ||
|
|
619e6349f6 | ||
|
|
b1ff68548f | ||
|
|
376b6c3bad | ||
|
|
f4c8a59b17 | ||
|
|
e6129d8ba5 | ||
|
|
d2baf11b8a | ||
|
|
82b5b12ca7 | ||
|
|
c145ab9b81 | ||
|
|
c10223b803 | ||
|
|
1e09b54ad2 | ||
|
|
d073e0aeb5 | ||
|
|
ce7293de13 | ||
|
|
108e66c24b | ||
|
|
f90401b8c0 | ||
|
|
a32e705d49 | ||
|
|
640cf4ca21 | ||
|
|
442e782692 | ||
|
|
0a874ad8b3 | ||
|
|
18083f0c13 | ||
|
|
f25aaf11e9 | ||
|
|
9b09257b28 | ||
|
|
f895516a2c | ||
|
|
76aa718b75 | ||
|
|
0acee67339 | ||
|
|
4475e335ef | ||
|
|
895673141d | ||
|
|
e4cd99ae1c | ||
|
|
c39a398d83 | ||
|
|
2787bd5bf0 | ||
|
|
6aaa7dc26d | ||
|
|
ebf60d2340 | ||
|
|
02d43846f6 | ||
|
|
8930cd563c | ||
|
|
2b90cd7d51 | ||
|
|
d5fde6a4b9 | ||
|
|
99b2e0fa08 | ||
|
|
ebcb1ca90e | ||
|
|
1763b073f9 | ||
|
|
908e467548 | ||
|
|
3c6ad5350b | ||
|
|
0ff3aa4b20 | ||
|
|
fd42b5c42c | ||
|
|
1311f2ac25 | ||
|
|
82a9817061 | ||
|
|
685eec0149 | ||
|
|
910dae16ab | ||
|
|
fd53197b46 | ||
|
|
d84d0b69ef | ||
|
|
b694ba27be | ||
|
|
e3cbac2d77 | ||
|
|
bbaa295ee2 | ||
|
|
1150a88001 | ||
|
|
58cfd60000 | ||
|
|
fcf268742d | ||
|
|
30d71c8f8f | ||
|
|
c3f9398b12 | ||
|
|
f1ac6ab764 | ||
|
|
d6ca5f71bc | ||
|
|
cdca9cf88f | ||
|
|
5840b42f4a | ||
|
|
a5be68b5b2 | ||
|
|
9fda13bc25 | ||
|
|
125dd7a594 | ||
|
|
df2584cc3b | ||
|
|
4de95c0e7b | ||
|
|
9ed1f2a446 | ||
|
|
833a4873a4 | ||
|
|
6ca1807372 | ||
|
|
9da3e9ccc7 | ||
|
|
5f65c36171 | ||
|
|
d64bb2f886 | ||
|
|
fc179c8fc3 | ||
|
|
8235af47fe | ||
|
|
908f3da3da | ||
|
|
64aac199de | ||
|
|
503c45840f | ||
|
|
6f102ff40f | ||
|
|
6e26a8d366 | ||
|
|
d9aea70ccc | ||
|
|
dd33ef2eb6 | ||
|
|
f3a32f2e29 | ||
|
|
1a3e40d818 | ||
|
|
18cdb3d845 | ||
|
|
0fca62c037 | ||
|
|
e9cd82b72d | ||
|
|
4d9ad21047 | ||
|
|
1cc2dc7150 | ||
|
|
3dc88b2c0c | ||
|
|
53f1ffb4e7 | ||
|
|
579a1be7c8 | ||
|
|
c0a68fcd0d | ||
|
|
b79853e9bd | ||
|
|
f86838ceab | ||
|
|
809e0b8c92 | ||
|
|
a58e3deac2 | ||
|
|
430699c082 | ||
|
|
b04233981f | ||
|
|
de10194f33 | ||
|
|
7c2e1ad0ed | ||
|
|
67ddb429e3 | ||
|
|
a169cc7119 | ||
|
|
9719b58575 | ||
|
|
13c18fa363 | ||
|
|
c17ad6ef65 | ||
|
|
2c14d0c966 | ||
|
|
2cd1783613 | ||
|
|
06db11cd61 | ||
|
|
125421ec45 | ||
|
|
cc84f40d61 | ||
|
|
c130918135 | ||
|
|
babeb4633e | ||
|
|
30167356f2 | ||
|
|
441b309959 | ||
|
|
b7b032f8e0 | ||
|
|
50f43462ae | ||
|
|
bd2a972dba | ||
|
|
3c162ae030 | ||
|
|
3c12757d9e | ||
|
|
fa746cc027 | ||
|
|
1e85178c73 | ||
|
|
d0bc0ad2ca | ||
|
|
c33f1bac08 | ||
|
|
58d522d824 | ||
|
|
858e4dccdc | ||
|
|
c2054077f4 | ||
|
|
754dd320ff | ||
|
|
a376980a69 | ||
|
|
cf7d710bc1 | ||
|
|
8f8740028c | ||
|
|
b0e03eb8a8 | ||
|
|
929dc703ca | ||
|
|
18a6bbfd80 | ||
|
|
73092c9898 | ||
|
|
b739126707 | ||
|
|
c39cf1ef84 | ||
|
|
861f6baa66 | ||
|
|
25fe426266 | ||
|
|
85fc586ee5 | ||
|
|
2a951e961b | ||
|
|
42aeab500b | ||
|
|
808a8a314a | ||
|
|
b809041894 | ||
|
|
1ddf0c8a42 | ||
|
|
d8caf209e3 | ||
|
|
22668555ad | ||
|
|
0f585931a4 | ||
|
|
d03386571d | ||
|
|
72948068e2 | ||
|
|
97808383ed | ||
|
|
de6f30042f | ||
|
|
b5cee82604 | ||
|
|
fab3e91973 | ||
|
|
c937c797c2 | ||
|
|
0ddc40ad7f | ||
|
|
e3f6faa350 | ||
|
|
cc69d50c60 | ||
|
|
b55eb5acf5 | ||
|
|
ebabce9982 | ||
|
|
037d3490ca | ||
|
|
ba7bcbb0d6 | ||
|
|
79ce6eda6f | ||
|
|
9f7c9cfc4c | ||
|
|
5dcc4f46db | ||
|
|
2f54201774 | ||
|
|
e8eef64601 | ||
|
|
27b1b5e3b3 | ||
|
|
5fa2f89542 | ||
|
|
c998b91c09 | ||
|
|
5be2395170 | ||
|
|
b4cd6bb8f0 | ||
|
|
7e81cad0bf | ||
|
|
856f3b3be6 | ||
|
|
785ac87846 | ||
|
|
75c29bd42a | ||
|
|
221a46a396 | ||
|
|
abe5cc7184 | ||
|
|
12ada75cad | ||
|
|
5a74d94558 | ||
|
|
d1d3f310e9 | ||
|
|
089a83363f | ||
|
|
c28e6db428 | ||
|
|
05253272cb | ||
|
|
12e087820c | ||
|
|
8dc001567b | ||
|
|
9af3256f72 | ||
|
|
cdd333a2e0 | ||
|
|
aa4ec8f3e2 | ||
|
|
5ea78cf259 | ||
|
|
600eaea2d1 | ||
|
|
81b15833f7 | ||
|
|
9abc221559 | ||
|
|
7048be2830 | ||
|
|
91eb27513a | ||
|
|
04f0682439 | ||
|
|
36bab5408d | ||
|
|
c483dab4b8 | ||
|
|
f1d759f279 | ||
|
|
4c1afb2984 | ||
|
|
db9b2bfbe1 | ||
|
|
377677cf30 | ||
|
|
24a4e95ffe | ||
|
|
8fdd9e967a | ||
|
|
acfa6a692e | ||
|
|
67ca22b6e4 | ||
|
|
ba413ee98d | ||
|
|
acc0e934cb | ||
|
|
1d485840fd | ||
|
|
dcb147608a | ||
|
|
ddf24d1fd6 | ||
|
|
886d7e6903 | ||
|
|
2079ccbf42 | ||
|
|
5ec88b0f6c | ||
|
|
b0bcd27124 | ||
|
|
4dfee21e91 | ||
|
|
18fa2c9c7d | ||
|
|
04d43d60b7 | ||
|
|
419731ec41 | ||
|
|
082ba88084 | ||
|
|
09a8474521 | ||
|
|
6d323d3ff7 | ||
|
|
c4e003518a | ||
|
|
9e251d14af | ||
|
|
9abba7d69a | ||
|
|
0377540e2d | ||
|
|
e6a15f66fc | ||
|
|
1787fd1b52 | ||
|
|
54c3d5c113 | ||
|
|
6d0f9a37a2 | ||
|
|
60dac4d2ff | ||
|
|
dd468fbe9a | ||
|
|
04ecf04832 | ||
|
|
6d45616a7a | ||
|
|
06d2016ee7 | ||
|
|
984bfadcdd | ||
|
|
f79f3f8b22 | ||
|
|
ba570a9842 | ||
|
|
365a98d00f | ||
|
|
4e2677fe2c | ||
|
|
d6d16b7899 | ||
|
|
86a9e0803a | ||
|
|
fdf96922b5 | ||
|
|
d396761f76 | ||
|
|
711519361c | ||
|
|
e4827b8d89 | ||
|
|
7ec7cb94f9 | ||
|
|
298899d02c | ||
|
|
43b35a4ae0 | ||
|
|
a7a8dcd617 | ||
|
|
bdf0b26a12 | ||
|
|
73e87b6a2e | ||
|
|
ac3d002cb2 | ||
|
|
ada2d0c627 | ||
|
|
286d3a1ff8 | ||
|
|
937f01a225 | ||
|
|
c9559e03da | ||
|
|
d115798d5b | ||
|
|
b6ee5fafd0 | ||
|
|
533b31237c | ||
|
|
812a470122 | ||
|
|
eb3105ef25 | ||
|
|
ffcaa04d2c | ||
|
|
a47660ba67 | ||
|
|
e2291184dc | ||
|
|
4e332452b7 | ||
|
|
e2f43df5e9 | ||
|
|
141929cd6e | ||
|
|
ec03968bd4 | ||
|
|
a21435cb05 | ||
|
|
bdfa6d1fe7 | ||
|
|
b565e258cb | ||
|
|
892b605ab5 | ||
|
|
4d99352526 | ||
|
|
cbf0eaa429 | ||
|
|
80e16c8ca3 | ||
|
|
0ae024afa8 | ||
|
|
73caacbd42 | ||
|
|
b667bda8f2 | ||
|
|
463e38cf67 | ||
|
|
83c8d65e3d | ||
|
|
9548e7d1e2 | ||
|
|
ee290d82d1 | ||
|
|
b75bb003bd | ||
|
|
6c2194fdb4 | ||
|
|
da61d8b639 | ||
|
|
863ba199f6 | ||
|
|
161ebb354f | ||
|
|
1516ebf7f9 | ||
|
|
2820f2227d | ||
|
|
a078f5f5c1 | ||
|
|
d0a83053d3 | ||
|
|
b6bc01abde | ||
|
|
196a1eb6ad | ||
|
|
593271f536 | ||
|
|
0f24f715ba | ||
|
|
bb9bfa5618 | ||
|
|
8120a06cd6 | ||
|
|
a153082120 | ||
|
|
970031e267 | ||
|
|
a819856f3f | ||
|
|
4dbaaa2855 | ||
|
|
0593cf4379 | ||
|
|
cd0e5dbb4c | ||
|
|
7cb1c3cabb | ||
|
|
550b9101b8 | ||
|
|
9d9564568b | ||
|
|
7ea7a53e7c | ||
|
|
ac387caf21 | ||
|
|
ad3f1e84aa | ||
|
|
2432a0dda5 | ||
|
|
03e5919910 | ||
|
|
277e35f8c8 | ||
|
|
0dd5836f3f | ||
|
|
9290f0d407 | ||
|
|
9bd3ad846e | ||
|
|
a8c73649ce | ||
|
|
6368ab49b4 | ||
|
|
16b6a64ef9 | ||
|
|
e46431ee0e | ||
|
|
2e4cf0aa5c | ||
|
|
3f8a7f05e8 | ||
|
|
3360613bcd | ||
|
|
f8a9cbe074 | ||
|
|
15f2e0c899 | ||
|
|
6518e746c1 | ||
|
|
38b046d6ad | ||
|
|
28d7750eda | ||
|
|
e5fc85bddc | ||
|
|
2a40571118 | ||
|
|
f1aa57c57e | ||
|
|
0b876ece41 | ||
|
|
ca0bd1a0b5 | ||
|
|
2d31b5df34 | ||
|
|
10f7ca0ebf | ||
|
|
85d6964874 | ||
|
|
76fd462bcc | ||
|
|
c44f01879f | ||
|
|
fe27989a69 | ||
|
|
b04f3eeede | ||
|
|
6ab61d023f | ||
|
|
4d87efc771 | ||
|
|
e47d368239 | ||
|
|
5b1235addc | ||
|
|
8c2c1240e1 | ||
|
|
27e696b7b1 | ||
|
|
bfba98f532 | ||
|
|
8de3ad50b2 | ||
|
|
2ba343d2b5 | ||
|
|
ff92afa557 | ||
|
|
c3c0fb95a8 | ||
|
|
bb56a094bb | ||
|
|
2211943170 | ||
|
|
4eb8bc0857 | ||
|
|
fa51cb8d63 | ||
|
|
706dec93a4 | ||
|
|
7a32920448 | ||
|
|
57a3899c1d | ||
|
|
374d159e0e | ||
|
|
4f5a41b84f | ||
|
|
a2f380fdd6 | ||
|
|
301085e510 | ||
|
|
af5b64a434 | ||
|
|
fa088e37bc | ||
|
|
613bdc91e5 | ||
|
|
edfe50e713 | ||
|
|
26fb403ced | ||
|
|
014fb46449 | ||
|
|
144a88b109 | ||
|
|
34c0d2509a | ||
|
|
a12a9e3fd9 | ||
|
|
8df73f3d83 | ||
|
|
6dac874ff4 | ||
|
|
81d25f6861 | ||
|
|
c0c1975da6 | ||
|
|
dd7af29103 | ||
|
|
85ea5f67f4 | ||
|
|
8e3cb6174d | ||
|
|
6c01e9a43a | ||
|
|
6061670161 | ||
|
|
7c66db2c45 | ||
|
|
05e95ae55a | ||
|
|
416ad564d0 | ||
|
|
55f8f9bc42 | ||
|
|
386a9e88b4 | ||
|
|
f6ca25edbe | ||
|
|
1ea221aa4e | ||
|
|
d72a6666a1 | ||
|
|
b69199f884 | ||
|
|
65042c86a6 | ||
|
|
d7dccfd56d | ||
|
|
e60f4a5e1e | ||
|
|
fa3d4cbb23 | ||
|
|
56d303ec09 | ||
|
|
4600548b4d | ||
|
|
7d24c2ba40 | ||
|
|
b4ce57caec | ||
|
|
43c09b2eaa | ||
|
|
b32fd0bee4 | ||
|
|
3b6e96efa9 | ||
|
|
29ef828b9c | ||
|
|
39ae443433 | ||
|
|
c30c2f8d38 | ||
|
|
5757f875f2 | ||
|
|
e49c482a3f | ||
|
|
a592d6c1aa | ||
|
|
88f154fecd | ||
|
|
d7dfe3e812 | ||
|
|
489265e3ca | ||
|
|
3212a70a0c | ||
|
|
1cda0a96ca | ||
|
|
83fb9f7548 | ||
|
|
43295289bf | ||
|
|
0f72ca823b | ||
|
|
41786bc776 | ||
|
|
cca5d7ebbf | ||
|
|
43c8764465 | ||
|
|
a1e325a2d9 | ||
|
|
17a831e32f | ||
|
|
2a13db3bb8 | ||
|
|
eb5a73538a | ||
|
|
006a6c787b | ||
|
|
c3d96df0f0 | ||
|
|
15e7218bc4 | ||
|
|
28f32b9b8e | ||
|
|
1d0a56b673 | ||
|
|
ad1424681b | ||
|
|
87b991c076 | ||
|
|
5d593f26af | ||
|
|
853c270fce | ||
|
|
fcf34e0587 | ||
|
|
b6611c8a3b | ||
|
|
aab08d774b | ||
|
|
321aa52384 | ||
|
|
1334a74ef1 | ||
|
|
19e3384bb1 | ||
|
|
6ae32fd596 | ||
|
|
4c316ba4ce | ||
|
|
f2719411b7 | ||
|
|
11faf6684e | ||
|
|
547d18ce46 | ||
|
|
f183a81289 | ||
|
|
e44c874cab | ||
|
|
9c7380efe4 | ||
|
|
5e071a2e4b | ||
|
|
ff9b82c4f6 | ||
|
|
a0d0ac6cff | ||
|
|
b605a5de87 | ||
|
|
36be2b0688 | ||
|
|
376a5da705 | ||
|
|
c25258b75c | ||
|
|
c685f3a294 | ||
|
|
f63767af0e | ||
|
|
4fa9a2e54b | ||
|
|
68bc592a05 | ||
|
|
543fe2f2a4 | ||
|
|
be52f38d8f | ||
|
|
722a92f374 | ||
|
|
d771d06e19 | ||
|
|
a5227191b5 | ||
|
|
499d3d6d78 | ||
|
|
2adf020753 | ||
|
|
e8c373694c | ||
|
|
a8fd8cb645 | ||
|
|
fd06084106 | ||
|
|
285500488d | ||
|
|
29d4ffd089 | ||
|
|
fe5efa597b | ||
|
|
b93629a903 | ||
|
|
0c72940933 | ||
|
|
96f5279e3e | ||
|
|
821fa10203 | ||
|
|
9082e74971 | ||
|
|
7a7d77e7bd | ||
|
|
ce2ec94e96 | ||
|
|
d56e5d6923 | ||
|
|
5221ecc055 | ||
|
|
6ac2c6f578 | ||
|
|
772b752fa5 | ||
|
|
3c002d08c2 | ||
|
|
2876424240 | ||
|
|
74a0177ec9 | ||
|
|
da96844e9a | ||
|
|
81652c8244 | ||
|
|
f17434c95b | ||
|
|
01e854b5d2 | ||
|
|
42953c7c44 | ||
|
|
5e56446d26 | ||
|
|
61652f4ad9 | ||
|
|
fc1e84941d | ||
|
|
953eba0376 | ||
|
|
5c032269e3 | ||
|
|
1322d5a2c1 | ||
|
|
114f272906 | ||
|
|
1286bbb982 | ||
|
|
9141c649e7 | ||
|
|
ff2242da31 | ||
|
|
730a419984 | ||
|
|
25bd7d7997 | ||
|
|
77c9d9207d | ||
|
|
1e77629f1f | ||
|
|
76f65456ab | ||
|
|
26e20e7ae5 | ||
|
|
96217cf3fe | ||
|
|
e9c96d8ccd | ||
|
|
7ae2b968bb | ||
|
|
83ea42afe5 | ||
|
|
16587fcce1 | ||
|
|
ffded44f32 | ||
|
|
92c5284b80 | ||
|
|
f96102224c | ||
|
|
bf87d626eb | ||
|
|
e21a79dc61 | ||
|
|
caec590fe1 | ||
|
|
61ce6c59c2 | ||
|
|
205a1a14c7 | ||
|
|
6709ab5f27 | ||
|
|
2d77279c94 | ||
|
|
e9d7b6fbad | ||
|
|
3e6171c7ff | ||
|
|
04389fd6ff | ||
|
|
a47b599048 | ||
|
|
58eddd5ab4 | ||
|
|
7ac857acef | ||
|
|
e27b224933 | ||
|
|
4f087df286 | ||
|
|
87f6f6a3e3 | ||
|
|
94d1e94cf2 | ||
|
|
d249868e07 | ||
|
|
429e48d873 | ||
|
|
abb414c702 | ||
|
|
8f45dd4190 | ||
|
|
d9098c5fcd | ||
|
|
b9dee730a8 | ||
|
|
26c62a667f | ||
|
|
7d42ad00ff | ||
|
|
4a5776b513 | ||
|
|
f68ba2ef35 | ||
|
|
a95a0ab5f9 | ||
|
|
30911f4a75 | ||
|
|
c9f184c8d5 | ||
|
|
545f1fd07d | ||
|
|
2f762265a8 | ||
|
|
7e6d8f39b4 | ||
|
|
bea74b7711 | ||
|
|
10e8dc57eb | ||
|
|
f7b6dde086 | ||
|
|
2fa36fa721 | ||
|
|
40f8202402 | ||
|
|
4b0b55c1b7 | ||
|
|
0e395973c9 | ||
|
|
1f53cdb62d | ||
|
|
c32023d8ed | ||
|
|
d2f98940d8 | ||
|
|
536b16c7a9 | ||
|
|
9bfeae2df1 | ||
|
|
4d450ea25e | ||
|
|
84f01d1e30 | ||
|
|
1a5636b199 | ||
|
|
af46df7eae | ||
|
|
801a1791d6 | ||
|
|
333cf0b280 | ||
|
|
52e26697a9 | ||
|
|
fdf620b688 | ||
|
|
66f8ca52d6 | ||
|
|
f98c1127a6 | ||
|
|
7e352fe28d | ||
|
|
d3b48e2fd5 | ||
|
|
23159c094d | ||
|
|
2e22887f71 | ||
|
|
c9b04b8be7 | ||
|
|
2c0e13b513 | ||
|
|
2937309f00 | ||
|
|
377056a33c | ||
|
|
f42ce5be2b | ||
|
|
ddeee9b6db | ||
|
|
6bee32c174 | ||
|
|
11f55a06dd | ||
|
|
6a2d6b872b | ||
|
|
d8787867c4 | ||
|
|
43d9f6ea17 | ||
|
|
1faba1302f | ||
|
|
55ee0a0934 | ||
|
|
0653f73779 | ||
|
|
7a24021dc9 | ||
|
|
9f2fe94484 | ||
|
|
a3950b5638 | ||
|
|
8c03428279 | ||
|
|
f4d7ea386d | ||
|
|
bee0496cb1 | ||
|
|
5960b90efe | ||
|
|
0f2f3d4e29 | ||
|
|
bc673bef79 | ||
|
|
3fb7391b97 | ||
|
|
442cd7515d | ||
|
|
a013ffe547 | ||
|
|
835558229f | ||
|
|
dce23c79a1 | ||
|
|
4106bae79e | ||
|
|
b756474d9d | ||
|
|
b0c9209726 | ||
|
|
c96b778771 | ||
|
|
d0d721d80b | ||
|
|
7b50a78662 | ||
|
|
aa869c637a | ||
|
|
f467fe1cbf | ||
|
|
15fd639cd9 | ||
|
|
f96f2cf56e | ||
|
|
b0f6278cea | ||
|
|
ae7bac9a6b | ||
|
|
c8997204d4 | ||
|
|
a2c51984a8 | ||
|
|
ed93e33d59 | ||
|
|
6e15b1cd20 | ||
|
|
cc2513facf | ||
|
|
e303dcc915 | ||
|
|
8ad17abb7b | ||
|
|
5b296b5257 | ||
|
|
1a5c32f3ef | ||
|
|
a15e745d42 | ||
|
|
d17dd3e3d8 | ||
|
|
51a5c829bb | ||
|
|
8a91749e12 | ||
|
|
42fc0f9ee8 | ||
|
|
17ccd55d11 | ||
|
|
b8a589d76f | ||
|
|
becf6d9413 | ||
|
|
9efc4b23dc | ||
|
|
6b1dc31759 | ||
|
|
9205d632cc | ||
|
|
a751346b20 | ||
|
|
8111a19307 | ||
|
|
860b4f1a3b | ||
|
|
a5b1aa9ca7 | ||
|
|
62257bce18 | ||
|
|
0ed74aa68b | ||
|
|
e0bd0d6470 | ||
|
|
b433550556 | ||
|
|
04ebd8875b | ||
|
|
1a1ed0ae45 | ||
|
|
d6fabb6f8e | ||
|
|
08e8194db1 | ||
|
|
0e4e050b21 | ||
|
|
de17b285b1 | ||
|
|
f640d0973d | ||
|
|
47ff0dc0cc | ||
|
|
965e1d63dc | ||
|
|
73f1da2ff7 | ||
|
|
0f6ad43e91 | ||
|
|
8d804a6c4a | ||
|
|
02f48aabbf | ||
|
|
d4b08e9566 | ||
|
|
9f1f58fd4b | ||
|
|
4ed92d50e0 | ||
|
|
8848004cb7 | ||
|
|
371b381074 | ||
|
|
6d47011dcf | ||
|
|
705cdb6368 | ||
|
|
90fc80fd87 | ||
|
|
041974ee01 | ||
|
|
7369d861ca | ||
|
|
e1da383aed | ||
|
|
6bcf29152f | ||
|
|
8a38211bd9 | ||
|
|
cb2b9feb5f | ||
|
|
c2d5d5619b | ||
|
|
76b7d6975f | ||
|
|
7e9186d1ae | ||
|
|
d1ce4c9923 | ||
|
|
fed7fa4cd2 | ||
|
|
0d0125fc29 | ||
|
|
98e2c0522f | ||
|
|
294bc8c1d7 | ||
|
|
ae11d83684 | ||
|
|
aab9b08ec2 | ||
|
|
31ff7db019 | ||
|
|
c40c54fbee | ||
|
|
cecbaf2efe | ||
|
|
e90413243e | ||
|
|
a9396efeaf | ||
|
|
60353c6d05 | ||
|
|
7b5ed50786 | ||
|
|
02baa2b17c | ||
|
|
d0585bd910 | ||
|
|
adf7124446 | ||
|
|
7710db4591 | ||
|
|
ce03cf49d8 | ||
|
|
65c0d14a4e | ||
|
|
667ed6fcf5 | ||
|
|
d7da40642d | ||
|
|
d6b5047511 | ||
|
|
3b5a751b25 | ||
|
|
8a7491c97a | ||
|
|
b3cab31cf7 | ||
|
|
021655a10a | ||
|
|
e301d43704 | ||
|
|
54c1a208c3 | ||
|
|
ad9bbda708 | ||
|
|
341e167eab | ||
|
|
fb031d1ad5 | ||
|
|
d3937b9a61 | ||
|
|
2c734e2e4c | ||
|
|
77d8823261 | ||
|
|
6f85c14738 | ||
|
|
edb1dc067a | ||
|
|
6b161d5389 | ||
|
|
c21e3feaa6 | ||
|
|
a25ef01da3 | ||
|
|
0534266490 | ||
|
|
71aca3c199 | ||
|
|
72fab80a74 | ||
|
|
c8ab058842 | ||
|
|
b166fd7d6e | ||
|
|
9545face97 | ||
|
|
6dacd51b81 | ||
|
|
571a182712 | ||
|
|
e3aabdc2bc | ||
|
|
4d8d5b12f2 | ||
|
|
5785e7e2e5 | ||
|
|
81f311105c | ||
|
|
ad3679fcb8 | ||
|
|
29508f1cc7 | ||
|
|
426ba62348 | ||
|
|
d2df055abe | ||
|
|
d3ccdbcf72 | ||
|
|
7a476fc964 | ||
|
|
5da28be2b2 | ||
|
|
0932bdea30 | ||
|
|
75054e17cf | ||
|
|
664907f02e | ||
|
|
f977272732 | ||
|
|
d10b7b43ea | ||
|
|
e9abe1b846 | ||
|
|
cc21f38664 | ||
|
|
34606c26f0 | ||
|
|
be9d66a574 | ||
|
|
ed9fcde499 | ||
|
|
3c2139b0c3 | ||
|
|
7eeec91ab5 | ||
|
|
fdd43ee448 | ||
|
|
ca75492512 | ||
|
|
a2a7644794 | ||
|
|
91aebc758c | ||
|
|
ca0d29d811 | ||
|
|
c8c6aa2a1f | ||
|
|
19a1a22e63 | ||
|
|
c729d62f89 | ||
|
|
1793b50e6b | ||
|
|
23dbe6a5f0 | ||
|
|
509601e617 | ||
|
|
d58beed752 | ||
|
|
fd5d1076dc | ||
|
|
05b76a1f93 | ||
|
|
f84ec803a4 | ||
|
|
c35cd7fcb7 | ||
|
|
bb9d50579b | ||
|
|
54d37512f5 | ||
|
|
c516be8c4b | ||
|
|
82c78ec8f9 | ||
|
|
b1d4b71609 | ||
|
|
7440c7ddc7 | ||
|
|
624dad5a78 | ||
|
|
f4080210bd | ||
|
|
c631eb43e3 | ||
|
|
376bedf624 | ||
|
|
36e9c02f6f | ||
|
|
8f798569a8 | ||
|
|
8c0e47baf9 | ||
|
|
461473e48e | ||
|
|
8b1f109c1d | ||
|
|
e005cb31d8 | ||
|
|
579836e221 | ||
|
|
b977ee6160 | ||
|
|
ddce65b9dd | ||
|
|
e0e1105965 | ||
|
|
1f520f9f99 | ||
|
|
05a929deb6 | ||
|
|
5ac5352e33 | ||
|
|
787a555253 | ||
|
|
388b84e858 | ||
|
|
7ffd17254a | ||
|
|
00affe187c | ||
|
|
05844efbd6 | ||
|
|
3ab37028fc | ||
|
|
3a04888c5f | ||
|
|
6bd518241a | ||
|
|
a3cddb856f | ||
|
|
4b8e08d202 | ||
|
|
9413d30396 | ||
|
|
5982fa63c6 | ||
|
|
a4621a6418 | ||
|
|
7eec21a5e6 | ||
|
|
96b72fe2f7 | ||
|
|
c7c9606e87 | ||
|
|
772c135d98 | ||
|
|
365b3a76ba | ||
|
|
41568b7f2a | ||
|
|
d853f6cf0e | ||
|
|
bcfcce32d3 | ||
|
|
986916cf3e | ||
|
|
d689656775 | ||
|
|
8c56df7322 | ||
|
|
1dc87761a0 | ||
|
|
cd88b92587 | ||
|
|
eab03fdfc4 | ||
|
|
9a8b86872d | ||
|
|
04ce039ba4 | ||
|
|
9605cbda45 | ||
|
|
3ec2739925 | ||
|
|
d250bf9b56 | ||
|
|
6ebccb0518 | ||
|
|
b30efe4e2f | ||
|
|
c275d279fc | ||
|
|
7237a3c3b6 | ||
|
|
f98896f6d7 | ||
|
|
bcb2cdae4c | ||
|
|
08159211a3 | ||
|
|
232b6ab7ef | ||
|
|
3d2676d013 | ||
|
|
477d06f990 | ||
|
|
ed19885ba1 | ||
|
|
297ae6fdb4 | ||
|
|
456a985666 | ||
|
|
261203d6c1 | ||
|
|
31262d2ea9 | ||
|
|
c72abc5293 | ||
|
|
93189ad0b6 | ||
|
|
a8930b161e | ||
|
|
fa31d45285 | ||
|
|
914e4a4cf7 | ||
|
|
f36d079f28 | ||
|
|
17ddeef3ba | ||
|
|
f0c90ce668 | ||
|
|
f19b312c48 | ||
|
|
e899a54ba7 | ||
|
|
a4db994c2f | ||
|
|
f98f46c836 | ||
|
|
336aaaec9a | ||
|
|
b13ec8526e | ||
|
|
541020ff1b | ||
|
|
9c153737b4 | ||
|
|
7d53bb4064 | ||
|
|
4670751479 | ||
|
|
8e058f16e4 | ||
|
|
f519f0a5b3 | ||
|
|
bb61304a49 | ||
|
|
781d991eac | ||
|
|
d04c1f93a3 | ||
|
|
c0aab36187 | ||
|
|
5ae994ee8f | ||
|
|
60d16eab77 | ||
|
|
fc60dfc1a6 | ||
|
|
45d149c146 | ||
|
|
4dfc1a69c3 | ||
|
|
0ae18bca60 | ||
|
|
2aaf0defe7 | ||
|
|
73ea5cd7ee | ||
|
|
e7f2d229ec | ||
|
|
87bc265817 | ||
|
|
796aaff295 | ||
|
|
8f87c50320 | ||
|
|
ee4471b345 | ||
|
|
6815feb8cf | ||
|
|
dbbe7be891 | ||
|
|
09c9452e5c | ||
|
|
b0e669ba00 | ||
|
|
f46ae9f3b2 | ||
|
|
9f2b344be8 | ||
|
|
6b47271679 | ||
|
|
6f7075be74 | ||
|
|
4b9cc3d698 | ||
|
|
3faa790b53 | ||
|
|
9477c9b516 | ||
|
|
b04be51848 | ||
|
|
9e4020efd3 | ||
|
|
6db19db665 | ||
|
|
1386f80ae5 | ||
|
|
e4342a7097 | ||
|
|
fda31b75f9 | ||
|
|
8ca0a45b33 | ||
|
|
ce2bcaef68 | ||
|
|
0db7f26ad3 | ||
|
|
35370da458 | ||
|
|
fe6c5832c2 | ||
|
|
e8c32df79c | ||
|
|
652e166462 | ||
|
|
af6385f8e4 | ||
|
|
f0277d3777 | ||
|
|
6bb100d7fa | ||
|
|
f13ea34de3 | ||
|
|
48a14a443a | ||
|
|
1820ea6f59 | ||
|
|
4d9647923e | ||
|
|
943e9b3a28 | ||
|
|
6b2ec50a0b | ||
|
|
7b813b95b6 | ||
|
|
cdaa2e78d7 | ||
|
|
add53d3222 | ||
|
|
f4f79d2217 | ||
|
|
aa36bc4516 | ||
|
|
9028cacfd1 | ||
|
|
40ccb595cd | ||
|
|
5606d08ecb | ||
|
|
1888d6fca1 | ||
|
|
5d16e6b302 | ||
|
|
96f7574bc1 | ||
|
|
490584c8bc | ||
|
|
0cbb1f661c | ||
|
|
3dc53e105a | ||
|
|
e2cdd760d8 | ||
|
|
4169202a41 | ||
|
|
835982c561 | ||
|
|
b67bacea18 | ||
|
|
3205ee7d75 | ||
|
|
ff7d5ff4e5 | ||
|
|
723774af27 | ||
|
|
c3fbd3fe10 | ||
|
|
d1d3871550 | ||
|
|
5462c8c7ec | ||
|
|
9536341e30 | ||
|
|
1bb798d963 | ||
|
|
91997e9c53 | ||
|
|
1393187040 | ||
|
|
6e69c880d9 | ||
|
|
59dcd03972 | ||
|
|
11482546a2 | ||
|
|
1ce43dd347 | ||
|
|
d1bfe137d4 | ||
|
|
9d7452cdc2 | ||
|
|
d9cee90efc | ||
|
|
175aa08500 | ||
|
|
c9ff6198d3 | ||
|
|
f026218c82 | ||
|
|
5bc86b9e29 | ||
|
|
5830ac9936 | ||
|
|
d7c6c9a9f9 | ||
|
|
9c87eed60e | ||
|
|
f15eb6d5ef | ||
|
|
5b33788359 | ||
|
|
11ec3ccd48 | ||
|
|
9d498ba3f1 | ||
|
|
15d4047180 | ||
|
|
44eae73843 | ||
|
|
d5b1c70731 | ||
|
|
e78dc18cfd | ||
|
|
4d122923e9 | ||
|
|
b1a7310263 | ||
|
|
d6ef90d98d | ||
|
|
85df59ac31 | ||
|
|
b789a28581 | ||
|
|
4068e7f444 | ||
|
|
80e9ffbf5d | ||
|
|
610fc92ca3 | ||
|
|
0f5dc9bdb2 | ||
|
|
c24b2faec5 | ||
|
|
c407f58dc2 | ||
|
|
380da0e202 | ||
|
|
9e5e7a1526 | ||
|
|
9016b5aaae | ||
|
|
45f168e873 | ||
|
|
799938683d | ||
|
|
7128f2d11f | ||
|
|
0634bf0b0d | ||
|
|
f9e48c2972 | ||
|
|
909960c0b3 | ||
|
|
8a7876f4d1 | ||
|
|
286c92b13b | ||
|
|
b9872a278f | ||
|
|
1b34fd7efa | ||
|
|
f05c351762 | ||
|
|
8323f19e96 | ||
|
|
565eda9ee5 | ||
|
|
7aea7194d1 | ||
|
|
2f68957c8c | ||
|
|
4ca848e526 | ||
|
|
31a8c7c19c | ||
|
|
f1c435e050 | ||
|
|
fac75a9bff | ||
|
|
4fe03ab223 | ||
|
|
c6122da59b | ||
|
|
131f658779 | ||
|
|
127f77964e | ||
|
|
9f2bd30dc7 | ||
|
|
6e633b31b4 | ||
|
|
1c65643488 | ||
|
|
388ad9067a | ||
|
|
f470f0bdc5 | ||
|
|
72384b0523 | ||
|
|
1b199b7d98 | ||
|
|
09b384ea44 | ||
|
|
56ae55f987 | ||
|
|
1c360a89ba | ||
|
|
8636dee13e | ||
|
|
70e6baf6fc | ||
|
|
3588c1eedc | ||
|
|
8d6f167a81 | ||
|
|
6106188347 | ||
|
|
eeb77541cd | ||
|
|
99b244b47c | ||
|
|
3043672448 | ||
|
|
0477a53c9f | ||
|
|
d9aa7c3bc9 | ||
|
|
986fac583b | ||
|
|
c6d76086e2 | ||
|
|
e2771364eb | ||
|
|
0d5a63798b | ||
|
|
7d15e2bf52 | ||
|
|
31fef407b6 | ||
|
|
6bef3ef891 | ||
|
|
b806846049 | ||
|
|
bc16020976 | ||
|
|
8afb905a43 | ||
|
|
53667728a8 | ||
|
|
5f0a854e29 | ||
|
|
e9ef3dd9cd | ||
|
|
f702884704 | ||
|
|
0cb866845d | ||
|
|
26483029db | ||
|
|
d2adcbdf67 | ||
|
|
d2f963db2a | ||
|
|
fc2bc1362f | ||
|
|
6ae45d0fd3 | ||
|
|
cc185a8c0e | ||
|
|
ae1078944c | ||
|
|
385a05dd10 | ||
|
|
2572a78648 | ||
|
|
470774cfba | ||
|
|
351f6abe4c | ||
|
|
53a16e1795 | ||
|
|
ff77c8b205 | ||
|
|
b33f38b109 | ||
|
|
b9596d7ce8 | ||
|
|
251175c025 | ||
|
|
fda1bc4630 | ||
|
|
83c2c176a9 | ||
|
|
9be5992f22 | ||
|
|
d8d23c0bf8 | ||
|
|
b2689fc40e | ||
|
|
a4cfde350f | ||
|
|
7374027457 | ||
|
|
63328c2177 | ||
|
|
c4e2ce23e5 | ||
|
|
dacad53b2e | ||
|
|
4ffd5280a7 | ||
|
|
74310fb464 | ||
|
|
8b2268cf38 | ||
|
|
fb655f4981 | ||
|
|
7208c33d72 | ||
|
|
4efb25d048 | ||
|
|
a3678cd7f6 | ||
|
|
393d38f1ab | ||
|
|
805b9ac3a9 | ||
|
|
379b9812be | ||
|
|
a9992b5647 | ||
|
|
b6c0a9b1b5 | ||
|
|
1d2dd2a375 | ||
|
|
63db694aa2 | ||
|
|
b6aca36ad9 | ||
|
|
8420ae93fd | ||
|
|
6722716fa7 | ||
|
|
658e064220 | ||
|
|
66b472e567 | ||
|
|
3d242a607e | ||
|
|
bc68e5e7a3 | ||
|
|
aa6858189c | ||
|
|
06fda62c9e | ||
|
|
5688ea650d | ||
|
|
f5c4e9d612 | ||
|
|
b9eda2a59d | ||
|
|
8c168b0971 | ||
|
|
9c20a50ee2 | ||
|
|
eac666574e | ||
|
|
e4c840f6b8 | ||
|
|
3afbcd0acf | ||
|
|
8f054dbcaf | ||
|
|
ccc39e5aa2 | ||
|
|
53d4da2a9c | ||
|
|
d9e7153fc9 | ||
|
|
dc02b0d5ae | ||
|
|
e0bc5711b8 | ||
|
|
957cf45fa1 | ||
|
|
f4487343df | ||
|
|
ca1bdb31e3 | ||
|
|
236a412459 | ||
|
|
759a57bdb6 | ||
|
|
1abb674a07 | ||
|
|
961146a287 | ||
|
|
573f940985 | ||
|
|
882916bb2e | ||
|
|
47d1c62732 | ||
|
|
d39293c025 | ||
|
|
2942dafdfd | ||
|
|
4e1aefa5b5 | ||
|
|
89383ecc57 | ||
|
|
08046f7692 | ||
|
|
885fb1fa92 | ||
|
|
6a58c71528 | ||
|
|
371d66ba2a | ||
|
|
25bddf3fb5 | ||
|
|
f6e9fb13f8 | ||
|
|
f0df8434e7 | ||
|
|
e4d3f239e5 | ||
|
|
bcc22dfa6f | ||
|
|
f614709a01 | ||
|
|
11250d22c9 | ||
|
|
4b4de29725 | ||
|
|
99b49d2718 | ||
|
|
6230ec55be | ||
|
|
0733d3c585 | ||
|
|
6f8370ff0e | ||
|
|
bc244ed07e | ||
|
|
41266aa8e4 | ||
|
|
45faee3e5b | ||
|
|
74ff735e10 | ||
|
|
97879f2b16 | ||
|
|
1a338251ad | ||
|
|
354dc768c1 | ||
|
|
8a0796cd94 | ||
|
|
cbc3b26584 | ||
|
|
d628583db8 | ||
|
|
058777be1e | ||
|
|
260d03a0c4 | ||
|
|
6dcf6f41cc | ||
|
|
799f790886 | ||
|
|
cb3c4b0ea9 | ||
|
|
798d255ba6 | ||
|
|
28ba9e8ac5 | ||
|
|
7888cb0506 | ||
|
|
5e284a20cc | ||
|
|
770357e727 | ||
|
|
673ba22555 | ||
|
|
fb38d9cfb7 | ||
|
|
dda89a57ec | ||
|
|
62df63d3a0 | ||
|
|
e71696cf34 | ||
|
|
b5d8d58670 | ||
|
|
14e6a667f5 | ||
|
|
0c324783ae | ||
|
|
5d6ce251ca | ||
|
|
92c04cee1d | ||
|
|
7fdf587a7b | ||
|
|
1e46218b09 | ||
|
|
c56fcd8fb9 | ||
|
|
319fbf7f64 | ||
|
|
bf06d9077c | ||
|
|
9d2bd29ee1 | ||
|
|
d11fa1f74e | ||
|
|
c824da0dab | ||
|
|
9362c83a33 | ||
|
|
0c38098f02 | ||
|
|
be7068f569 | ||
|
|
b122bf22e3 | ||
|
|
b7232f38f3 | ||
|
|
c1b72ac1b7 | ||
|
|
b9e0d15878 | ||
|
|
cf26cf7afc | ||
|
|
a75e60ae47 | ||
|
|
187dc5dd03 | ||
|
|
9c9e2afade | ||
|
|
fae1ba98c1 | ||
|
|
c3e632620a | ||
|
|
dd7158ac46 | ||
|
|
eefe51c7a7 | ||
|
|
bf596dc023 | ||
|
|
220d88d654 | ||
|
|
a254e64bdb | ||
|
|
1555b92fb8 | ||
|
|
d5b7a40b39 | ||
|
|
bd1ab7ab96 | ||
|
|
2ff991bfcf | ||
|
|
0b1378a539 | ||
|
|
723c908bd7 | ||
|
|
4874404701 | ||
|
|
4c1374840a | ||
|
|
5da01633fd | ||
|
|
cdbd8af527 | ||
|
|
a6fdc1bfd2 | ||
|
|
20b8facb05 | ||
|
|
909914f7af | ||
|
|
3f31ebc676 | ||
|
|
f3c068a90c | ||
|
|
90d7e193d1 | ||
|
|
c9f5bb6f17 | ||
|
|
9865a4c4f2 | ||
|
|
f12baf32d4 | ||
|
|
80f4d08e8b | ||
|
|
07c9cae923 | ||
|
|
d867cc9271 | ||
|
|
3a1fe1e295 | ||
|
|
3cacf050df | ||
|
|
1536d73d1b | ||
|
|
55143a9d44 | ||
|
|
c92e193916 | ||
|
|
d12452fc49 | ||
|
|
3d8400a40c | ||
|
|
1fe0aea0b0 | ||
|
|
5df2544883 | ||
|
|
acbf224277 | ||
|
|
d0d17a0d35 | ||
|
|
f7b53d33bc | ||
|
|
92be06874b | ||
|
|
f327455d9d | ||
|
|
54415bf2af | ||
|
|
bac62dfcd9 | ||
|
|
820b43c1f3 | ||
|
|
a5b69290d5 | ||
|
|
5c7a9c86f6 | ||
|
|
7f83f916f6 | ||
|
|
c15a949cc3 | ||
|
|
ce47f96570 | ||
|
|
57b035cd94 | ||
|
|
f1f126171c | ||
|
|
71e1bcd855 | ||
|
|
b5579b6307 | ||
|
|
110b0fe14a | ||
|
|
d7488bbb62 | ||
|
|
2007407e7b | ||
|
|
d152e7e780 | ||
|
|
d4f4b6682d | ||
|
|
7f4a12f4cd | ||
|
|
07d06adf86 | ||
|
|
47dc188d57 | ||
|
|
85d22541d2 | ||
|
|
90ec1031f9 | ||
|
|
9bc9ad13a4 | ||
|
|
1782c7d778 | ||
|
|
e85752c527 | ||
|
|
dfdbbb514f | ||
|
|
976f5ca93e | ||
|
|
2086f8d34c | ||
|
|
6873a68216 | ||
|
|
9eb2c61760 | ||
|
|
543e791206 | ||
|
|
b6e8b3fa84 | ||
|
|
6f8e406b7b | ||
|
|
93bc54b65c | ||
|
|
3bf0ac4a36 | ||
|
|
bc01bfff21 | ||
|
|
0d4eaf03fc | ||
|
|
2bb0412473 | ||
|
|
07ce5d3158 | ||
|
|
131970b3e5 | ||
|
|
00e1dbfbd9 | ||
|
|
4c274c524d | ||
|
|
5581ca2751 | ||
|
|
5cd9a9540f | ||
|
|
1db2efa75a | ||
|
|
c1a82bf3ea | ||
|
|
7705042cac | ||
|
|
b9e311e893 | ||
|
|
460998497d | ||
|
|
022c5e1411 | ||
|
|
60daf0d6c7 | ||
|
|
0b6a941624 | ||
|
|
1fc520b45a | ||
|
|
cbbee38be8 | ||
|
|
2dae6d8285 | ||
|
|
65c8a956f1 | ||
|
|
2b907e9a8c | ||
|
|
25e520c243 | ||
|
|
2124c8465a | ||
|
|
a49e1f4f3d | ||
|
|
32be4a7812 | ||
|
|
92967d3457 | ||
|
|
d70fee7432 | ||
|
|
97b8e75932 | ||
|
|
8a62f8cef0 | ||
|
|
10f4f523fa | ||
|
|
1e392d2628 | ||
|
|
eb6ff62113 | ||
|
|
64da2621da | ||
|
|
61aec6e961 | ||
|
|
42f3ad436d | ||
|
|
2f7b78c03a | ||
|
|
402d37d613 | ||
|
|
96327c979c | ||
|
|
9d1b3f59d5 | ||
|
|
14bd50efe4 | ||
|
|
631c1f95e7 | ||
|
|
50006f7e43 | ||
|
|
4c9503158b | ||
|
|
6c8e461db5 | ||
|
|
aaa8415169 | ||
|
|
51e964498c | ||
|
|
0cddc70ff5 | ||
|
|
99dcf7508f | ||
|
|
7822d1f148 | ||
|
|
a572a7126c | ||
|
|
a1609faba0 | ||
|
|
9bf823d893 | ||
|
|
ca184e7725 | ||
|
|
5054507487 | ||
|
|
ab93be0178 | ||
|
|
8b0993bb10 | ||
|
|
0a034bb3ea | ||
|
|
4ce815a3ed | ||
|
|
4da860eae1 | ||
|
|
27e4bdb814 | ||
|
|
dd9406cd52 | ||
|
|
509312773d | ||
|
|
42d2758c36 | ||
|
|
ef1c858ffc | ||
|
|
7fd47c0ac6 | ||
|
|
a63b232ef1 | ||
|
|
acb502e5e3 | ||
|
|
3661922bb0 | ||
|
|
0704f149be | ||
|
|
334604de5d | ||
|
|
530328ac15 | ||
|
|
9914a1eb3f | ||
|
|
5db5710d3f | ||
|
|
9e9f55a8e3 | ||
|
|
0800141a9d | ||
|
|
dc6d469f0c | ||
|
|
89299d77e4 | ||
|
|
27d8bf6311 | ||
|
|
8c229a8560 | ||
|
|
29eed65a67 | ||
|
|
f0e0073a09 | ||
|
|
b70bde58be | ||
|
|
635fac776d | ||
|
|
7753d4e91d | ||
|
|
66a6214216 | ||
|
|
6cae1f09f1 | ||
|
|
c4432ee827 | ||
|
|
80a5bf2063 | ||
|
|
5b3d5fc431 | ||
|
|
cd38fb4177 | ||
|
|
9b1cc75b36 | ||
|
|
db8b2883e2 | ||
|
|
59a74ecce4 | ||
|
|
9099c61df9 | ||
|
|
50521281ce | ||
|
|
0cc6abf741 | ||
|
|
fe266ae4fe | ||
|
|
7c15cdeb69 | ||
|
|
848086947c | ||
|
|
5ec4ea754c | ||
|
|
41467d54df | ||
|
|
8261437764 | ||
|
|
54eac368d0 | ||
|
|
72511ea1e9 | ||
|
|
da7921f2c6 | ||
|
|
cd519e97e7 | ||
|
|
2a7a5aeefe | ||
|
|
bdbacb41da | ||
|
|
2dd736a201 | ||
|
|
ec3c797105 | ||
|
|
770f05c060 | ||
|
|
6993a27d8e | ||
|
|
68fd658536 | ||
|
|
9fc349965d | ||
|
|
0a667ff741 | ||
|
|
d37ad85f72 | ||
|
|
2b63568611 | ||
|
|
fcf9f93825 | ||
|
|
07efc0b73b | ||
|
|
6813b48c7e | ||
|
|
d58444c6d2 | ||
|
|
dd8a0bd30f | ||
|
|
b65b0636aa | ||
|
|
9ec6321261 | ||
|
|
07eb66c205 | ||
|
|
0e790e6fb5 | ||
|
|
08186924a4 | ||
|
|
e9faf5cf94 | ||
|
|
8c0efe09e5 | ||
|
|
32d2c96d22 | ||
|
|
e958988989 | ||
|
|
131f10bd80 | ||
|
|
a61615a196 | ||
|
|
4fdb6910a5 | ||
|
|
67c4c90351 | ||
|
|
16f7288b19 | ||
|
|
36a7e87ae4 | ||
|
|
16badda118 | ||
|
|
99820e7edc | ||
|
|
6a03a92f5f | ||
|
|
80c3b98a84 | ||
|
|
afd2b4b387 | ||
|
|
df49769f3d | ||
|
|
05c2946322 | ||
|
|
2ed392edbf | ||
|
|
3d597a554d | ||
|
|
42af4e40ae | ||
|
|
242efc7219 | ||
|
|
a6bacb857d | ||
|
|
eab54724a1 | ||
|
|
49885cfeff | ||
|
|
4330f49011 | ||
|
|
7687299275 | ||
|
|
79ba787b03 | ||
|
|
5a184a205f | ||
|
|
4b5a6b597a | ||
|
|
9e9c3eeb79 | ||
|
|
cd996f9dbf | ||
|
|
ab4c91158a | ||
|
|
1130a23e5b | ||
|
|
9ac6943220 | ||
|
|
0f55284b77 | ||
|
|
c75046de3f | ||
|
|
e7df82f110 | ||
|
|
ee4c7d3007 | ||
|
|
2895303421 | ||
|
|
3f16f05525 | ||
|
|
fb33671923 | ||
|
|
482fb5b6e2 | ||
|
|
b1004b61f9 | ||
|
|
27af9b2605 | ||
|
|
e28ac866f8 | ||
|
|
5e0a80f227 | ||
|
|
ec0982ca1f | ||
|
|
e7c442d21c | ||
|
|
a9db47fdd3 | ||
|
|
b856a72886 | ||
|
|
03da0d31f9 | ||
|
|
1c40e4374b | ||
|
|
d7df1426f2 | ||
|
|
5035e86f59 | ||
|
|
0af91265ab | ||
|
|
8e63d04e66 | ||
|
|
5ac0c6deb0 | ||
|
|
6b0d82fb0c | ||
|
|
2bfdfe366c | ||
|
|
898fb0f320 | ||
|
|
f53686a2f3 | ||
|
|
eae1670f54 | ||
|
|
544d68833c | ||
|
|
c24a6b2359 | ||
|
|
b720b57d1d | ||
|
|
365b7fe90a | ||
|
|
c7ab833e66 | ||
|
|
9536f288e9 | ||
|
|
e64d4039d0 | ||
|
|
5f077e56f0 | ||
|
|
a9253a24e0 | ||
|
|
749136b526 | ||
|
|
36a8b7b7f3 | ||
|
|
a29908c865 | ||
|
|
57d87c27cd | ||
|
|
1c2e9a476c | ||
|
|
5d87133df0 | ||
|
|
fd2f67b73f | ||
|
|
d3abcaf67b | ||
|
|
14dce5ac2b | ||
|
|
abd002071a | ||
|
|
77add42eeb | ||
|
|
bba049b4bf | ||
|
|
4e41c3520c | ||
|
|
4144af3351 | ||
|
|
30f749a2a2 | ||
|
|
6e9f282af7 | ||
|
|
4491be01dd | ||
|
|
8c163fd980 | ||
|
|
9f6a158fc2 | ||
|
|
19965fa3c8 | ||
|
|
6bb42ffafc | ||
|
|
4a1edc0720 | ||
|
|
a5a016bf33 | ||
|
|
4be4f597a3 | ||
|
|
dfbbd4f784 | ||
|
|
2662dae560 | ||
|
|
6f6f9f08f8 | ||
|
|
a76fba57c4 | ||
|
|
680766f29b | ||
|
|
adcfd4ca4d | ||
|
|
e276a49a91 | ||
|
|
5995f763b1 | ||
|
|
a123639b5c | ||
|
|
8a118d53c8 | ||
|
|
d572391532 | ||
|
|
58ae7a0402 | ||
|
|
f843093a8c | ||
|
|
3e06586f81 | ||
|
|
60f148326a | ||
|
|
02e1413ca5 | ||
|
|
7b4b85ee54 | ||
|
|
6c0a416f16 | ||
|
|
23cc88bf92 | ||
|
|
5528f0ddf2 | ||
|
|
8d3296fb1b | ||
|
|
136f9209a3 | ||
|
|
a290134fd2 | ||
|
|
a54e59666a | ||
|
|
42ea6af1eb | ||
|
|
f9b741766b | ||
|
|
09359329a0 | ||
|
|
647bb41ddf | ||
|
|
f25c14d48d | ||
|
|
81a3d559f5 | ||
|
|
4e0ee7a5da | ||
|
|
1c80a258d2 | ||
|
|
129ed6a07b | ||
|
|
df09a0c73b | ||
|
|
ff5c958354 | ||
|
|
4f90c89db6 | ||
|
|
524b515fdb | ||
|
|
163256b001 | ||
|
|
05bbc65dcc | ||
|
|
6624f6b7f9 | ||
|
|
f32279dec5 | ||
|
|
a90fd85907 | ||
|
|
9815b27e94 | ||
|
|
ebbe481fe7 | ||
|
|
9e337faa33 | ||
|
|
37826e0261 | ||
|
|
20e4342796 | ||
|
|
51be16950d | ||
|
|
be866a78ff | ||
|
|
f9d2432c69 | ||
|
|
6543a3d75a | ||
|
|
a77936981e | ||
|
|
6f2120bb59 | ||
|
|
98e18239fd | ||
|
|
3d159015be | ||
|
|
f5af66a1ab | ||
|
|
540192ff96 | ||
|
|
c1cfd4a8c6 | ||
|
|
322300c329 | ||
|
|
1ac18f7903 | ||
|
|
4f4987e9ea | ||
|
|
65bf562ff4 | ||
|
|
f47032e7e9 | ||
|
|
379f3ec8dd | ||
|
|
8d7e35b723 | ||
|
|
1349eea0d0 | ||
|
|
bed5157f32 | ||
|
|
12c7f51a1e | ||
|
|
7e32c8de4d | ||
|
|
3a42350c21 | ||
|
|
1a54597202 | ||
|
|
39f4eb9940 | ||
|
|
4b996651af | ||
|
|
884d40f321 | ||
|
|
3d2b41da08 | ||
|
|
1bf2dbb7df | ||
|
|
e0dfb77dd1 | ||
|
|
578fddc1b7 | ||
|
|
089355d706 | ||
|
|
6b2c3caf03 | ||
|
|
065c37cb28 | ||
|
|
3a40025fd3 | ||
|
|
8dc341d868 | ||
|
|
0ed121ddbd | ||
|
|
969f4229dc | ||
|
|
27a940184e | ||
|
|
77fa09a506 | ||
|
|
8836104ab2 | ||
|
|
396837517d | ||
|
|
38b3f1bde2 | ||
|
|
4780168ba8 | ||
|
|
d1a790d103 | ||
|
|
3ad6ab8c6a | ||
|
|
1e189da85e | ||
|
|
a094c50873 | ||
|
|
ad324410c6 | ||
|
|
9f4b7368a0 | ||
|
|
c8ddedb8d0 | ||
|
|
7deab2826b | ||
|
|
643879f779 | ||
|
|
ce2a18f483 | ||
|
|
487d067f75 | ||
|
|
c4d5e1b4f3 | ||
|
|
0e0cc30039 | ||
|
|
a766cc791b | ||
|
|
d017c3e248 | ||
|
|
cc27ee04a8 | ||
|
|
87459bf24b | ||
|
|
5091c9e10f | ||
|
|
14a22d9033 | ||
|
|
7ded5a2de5 | ||
|
|
6b436a0192 | ||
|
|
52343686f5 | ||
|
|
eec9d05b19 | ||
|
|
89703fd430 | ||
|
|
dc246946a7 | ||
|
|
944e1120cb | ||
|
|
cccda60df8 | ||
|
|
e338e748eb | ||
|
|
0526a24cf3 | ||
|
|
c4ba1b025a | ||
|
|
252f330658 | ||
|
|
45590415a6 | ||
|
|
e562adc752 | ||
|
|
1e2fd44a6b | ||
|
|
1c903320be | ||
|
|
74eaf3a268 | ||
|
|
6fcd74c713 | ||
|
|
33136c6553 | ||
|
|
cb225db203 | ||
|
|
0dbd5006ea | ||
|
|
08b3677ce8 | ||
|
|
b08549a25b | ||
|
|
221bc4cb5d | ||
|
|
b655b8e97b | ||
|
|
03e7b5dcc6 | ||
|
|
5f09e829df | ||
|
|
e6759919dc | ||
|
|
6c65a3fc74 | ||
|
|
e0ffd31123 | ||
|
|
4c1597113a | ||
|
|
4006506b64 | ||
|
|
14facdbcd2 | ||
|
|
726ace49d8 | ||
|
|
f45d383367 | ||
|
|
3a32e2b53a | ||
|
|
dc45e93cea | ||
|
|
c0f9642719 | ||
|
|
da8d036997 | ||
|
|
3c911cc785 | ||
|
|
4071f15f27 | ||
|
|
90de7923db | ||
|
|
c28f1535a3 | ||
|
|
704e9c132e | ||
|
|
713d6f5f76 | ||
|
|
1a6d245eae | ||
|
|
d909dd2a32 | ||
|
|
7bb466dd86 | ||
|
|
e09bf5cc40 | ||
|
|
129e21e7c3 | ||
|
|
87dcd2909d | ||
|
|
e47ec4f551 | ||
|
|
d6cfcbe149 | ||
|
|
7a713807e9 | ||
|
|
6e49b5bc30 | ||
|
|
adbc5b86f5 | ||
|
|
071ea955af | ||
|
|
806aefa966 | ||
|
|
5b7d23186d | ||
|
|
0cb4677e80 | ||
|
|
bd65ecf17b | ||
|
|
9da2adff4c | ||
|
|
a2a1aad109 | ||
|
|
dcc530a389 | ||
|
|
97037a87f3 | ||
|
|
4e67efc0d6 | ||
|
|
7cbb73719e | ||
|
|
d3f139c31e | ||
|
|
8940b6e5a3 | ||
|
|
1c9831a9f4 | ||
|
|
7da27435cc | ||
|
|
bd18f86517 | ||
|
|
41f66b435b | ||
|
|
48481a7230 | ||
|
|
dde6bc1f80 | ||
|
|
e39fd1de0e | ||
|
|
2fc9a81e9e | ||
|
|
f65874d751 | ||
|
|
3914895784 | ||
|
|
0bc7e24d0a | ||
|
|
2a40ceced7 | ||
|
|
d4868f2cc2 | ||
|
|
e87d63779d | ||
|
|
6672d65018 | ||
|
|
1f78c520f5 | ||
|
|
687e435a38 | ||
|
|
b3222dc107 | ||
|
|
ebba6caa3d | ||
|
|
88bbef9003 | ||
|
|
712771a139 | ||
|
|
9033b0ded7 | ||
|
|
877cfe9393 | ||
|
|
347aa56acb | ||
|
|
0fc410139c | ||
|
|
51528235db | ||
|
|
003599cbda | ||
|
|
bacfad37a9 | ||
|
|
6ef6ba7b8a | ||
|
|
93c0da0367 | ||
|
|
268d19e8a3 | ||
|
|
a383b302c2 | ||
|
|
95ebbf2608 | ||
|
|
f880574c78 | ||
|
|
350c310906 | ||
|
|
5026f7686e | ||
|
|
ab3337ddf5 | ||
|
|
c9268f2e3d | ||
|
|
fa01388f97 | ||
|
|
d8dc89ac7b | ||
|
|
a659fd1fa9 | ||
|
|
27fa3ba34c | ||
|
|
663f42948e | ||
|
|
baca8f0cdb | ||
|
|
c5c3a82b23 | ||
|
|
c0617864e1 | ||
|
|
d9ef9ab497 | ||
|
|
65d9f783e1 | ||
|
|
f70232d1b0 | ||
|
|
b083aed245 | ||
|
|
0faac20d53 | ||
|
|
cef14ca7cd | ||
|
|
090debe0df | ||
|
|
296f1270ee | ||
|
|
334a18a114 | ||
|
|
dd4ddae082 | ||
|
|
4983e967bc | ||
|
|
0b5e2f14ed | ||
|
|
70102aecb5 | ||
|
|
ae75153561 | ||
|
|
dd23d60513 | ||
|
|
db95481b76 | ||
|
|
3e0da535b9 | ||
|
|
c74602551e | ||
|
|
1722e2c7a5 | ||
|
|
8a845e2951 | ||
|
|
72765bada0 | ||
|
|
b380f180cc | ||
|
|
f1799799a1 | ||
|
|
4bc8a8673d | ||
|
|
cbdd907393 | ||
|
|
aa7ff3ef47 | ||
|
|
ebdf6434eb | ||
|
|
9b7470d204 | ||
|
|
9f3ab8683c | ||
|
|
fa464aca90 | ||
|
|
2724ce368a | ||
|
|
89f7cbe877 | ||
|
|
fab9af2206 | ||
|
|
4d01b4fa59 | ||
|
|
c3365aa37e | ||
|
|
426e80d4c3 | ||
|
|
30a282d126 | ||
|
|
0a96621e3e | ||
|
|
d9d30abe7a | ||
|
|
03b56d8140 | ||
|
|
1f79ce4e96 | ||
|
|
8d80f23a0f | ||
|
|
d89b951451 | ||
|
|
1906a38ec8 | ||
|
|
8d91a3e3b8 | ||
|
|
3324259977 | ||
|
|
ec2db2d541 | ||
|
|
5cf248c7f3 | ||
|
|
3876a566ff | ||
|
|
334e6cc618 | ||
|
|
64033fcfc2 | ||
|
|
fbe3af4719 | ||
|
|
699ed4ee85 | ||
|
|
903f67a154 | ||
|
|
9a89dab9e0 | ||
|
|
435a2565b8 | ||
|
|
8267b8da57 | ||
|
|
8b5773c246 | ||
|
|
fd4c88d202 | ||
|
|
9b26623aa5 | ||
|
|
b115ec7c14 | ||
|
|
a2e6e2a06a | ||
|
|
f0eab06a8b | ||
|
|
b6c839d693 | ||
|
|
177a724d58 | ||
|
|
949803dcf6 | ||
|
|
b763a88e60 | ||
|
|
18c7f164a8 | ||
|
|
e037ff6bba | ||
|
|
95bfda1ff0 | ||
|
|
b9992e0b45 | ||
|
|
f6ba793885 | ||
|
|
bbe65a8ea3 | ||
|
|
20af7371d0 | ||
|
|
a33fb0c439 | ||
|
|
87003c8b5b | ||
|
|
ddd48ee79f | ||
|
|
a9819df3ee | ||
|
|
15dffb22aa | ||
|
|
6ef5f1ff62 | ||
|
|
acc28c68a4 | ||
|
|
6c2da60eb0 | ||
|
|
490081077d | ||
|
|
f4a08092da | ||
|
|
0116efd4a3 | ||
|
|
9719a24f8a | ||
|
|
3a7d5a099b | ||
|
|
27dba655fc | ||
|
|
a25dd387bf | ||
|
|
a89767cc16 | ||
|
|
a13df5b68d | ||
|
|
6a689504ff | ||
|
|
6521d2bcfb | ||
|
|
26d55b15de | ||
|
|
041b7e8a29 | ||
|
|
6eeb425e7a | ||
|
|
d2d0eb829e | ||
|
|
058505b664 | ||
|
|
8adecedb40 | ||
|
|
838a51db21 | ||
|
|
4d4dfc27fc | ||
|
|
1444439cf3 | ||
|
|
e64fc8d5ab | ||
|
|
9a31f772d9 | ||
|
|
12876ee4ce | ||
|
|
a4a349da45 | ||
|
|
ecbc3cae71 | ||
|
|
57609c87fb | ||
|
|
bb2e24e028 | ||
|
|
5cafb26e93 | ||
|
|
f74ef7b293 | ||
|
|
7ef8f531e7 | ||
|
|
afb65c7b19 | ||
|
|
74a0673663 | ||
|
|
20fae6e512 | ||
|
|
509cd242f7 | ||
|
|
f01ec516eb | ||
|
|
394b1000d2 | ||
|
|
e0b9fba788 | ||
|
|
378ee29cc2 | ||
|
|
02bcef71dd | ||
|
|
248e7c8003 | ||
|
|
a2e93ebd56 | ||
|
|
21a9454de1 | ||
|
|
ec286eed08 | ||
|
|
f16978d1fe | ||
|
|
fa3adc7606 | ||
|
|
192144fc5d | ||
|
|
a4d155c5e4 | ||
|
|
6c56e9d199 | ||
|
|
bb18f87a98 | ||
|
|
dda6a31381 | ||
|
|
6e25e18e98 | ||
|
|
ffd978c24f | ||
|
|
4c4af03a5a | ||
|
|
c0739bb8b7 | ||
|
|
5add7cb0b1 | ||
|
|
99f49f1061 | ||
|
|
401eaca9ab | ||
|
|
da784fe02b | ||
|
|
d507b29559 | ||
|
|
35ca13b38d | ||
|
|
04b92a31a8 | ||
|
|
dd311d759d | ||
|
|
b504ca9f0a | ||
|
|
bd61c5c721 | ||
|
|
24694b0047 | ||
|
|
5258154285 | ||
|
|
221f993b46 | ||
|
|
ae5ea70b93 | ||
|
|
f59ffbeb63 | ||
|
|
ce55275634 | ||
|
|
20c5892f9a | ||
|
|
9231245a3f | ||
|
|
cbfed20e6f | ||
|
|
640274ed52 | ||
|
|
1507a39a2b | ||
|
|
e6405653d8 | ||
|
|
be1541a646 | ||
|
|
f37f9bf5e3 | ||
|
|
a5c39ca8c8 | ||
|
|
cb7e7b2a74 | ||
|
|
2e8e705bab | ||
|
|
ab3812432b | ||
|
|
d2acb36e3b | ||
|
|
601743ff7a | ||
|
|
7eca74ac05 | ||
|
|
02b4ec04bb | ||
|
|
8ead9014d0 | ||
|
|
4920e82dd6 | ||
|
|
3150253661 | ||
|
|
baa423b45a | ||
|
|
77e5d8ea96 | ||
|
|
9a8166d649 | ||
|
|
da8c0cd2db | ||
|
|
fc2711b543 | ||
|
|
b4327bd36c | ||
|
|
f7f75923aa | ||
|
|
0b4388bc5b | ||
|
|
f08883071f | ||
|
|
bb8a2ee3a6 | ||
|
|
6bfa7595d8 | ||
|
|
8308e501cd | ||
|
|
25909c0d9d | ||
|
|
2844b1ac38 | ||
|
|
6fd62b1cee | ||
|
|
1579f53a61 | ||
|
|
7af7851952 | ||
|
|
5dbd1a6dcc | ||
|
|
24881537a1 | ||
|
|
631c29b26b | ||
|
|
ab249d4032 | ||
|
|
5bfa3f6274 | ||
|
|
82ee25dfaa | ||
|
|
fd9a24553f | ||
|
|
ae1c20fad9 | ||
|
|
734f777ff9 | ||
|
|
498115d5d9 | ||
|
|
033ff06b68 | ||
|
|
c145a8e1a1 | ||
|
|
ae5b0dbc29 | ||
|
|
95aa957c80 | ||
|
|
7dff9ddeeb | ||
|
|
b4e755747f | ||
|
|
348fa402be | ||
|
|
344218ff3d | ||
|
|
90a1a2febf | ||
|
|
e234a24894 | ||
|
|
d9beb75bd6 | ||
|
|
dadea8c83d | ||
|
|
31d40e5509 | ||
|
|
a917e84b51 | ||
|
|
f30b497206 | ||
|
|
706e32c20b | ||
|
|
4d98552c37 | ||
|
|
5311bd3f4e | ||
|
|
8d716fb7ba | ||
|
|
01b3caaf49 | ||
|
|
cd73c0b9ca | ||
|
|
7ec5230402 | ||
|
|
9dbe026f83 | ||
|
|
3fae10da3e | ||
|
|
d775154b92 | ||
|
|
6c306b3542 | ||
|
|
58b46ffeac | ||
|
|
0bb7b7c60e | ||
|
|
58adf9a385 | ||
|
|
d6ba968ace | ||
|
|
1706721a62 | ||
|
|
7f88bd2eaf | ||
|
|
b819366265 | ||
|
|
47ff7d9dba | ||
|
|
e5f5254877 | ||
|
|
4778f728f9 | ||
|
|
e80e4573be | ||
|
|
fdf0f3f282 | ||
|
|
a81fce47d0 | ||
|
|
2cd6989b11 | ||
|
|
21abb0d205 | ||
|
|
5e1a271ca2 | ||
|
|
868e4c41e1 | ||
|
|
a6e23bb713 | ||
|
|
446406dd62 | ||
|
|
091f9f7eae | ||
|
|
10b1e06263 | ||
|
|
a8865a51fd | ||
|
|
32343297fc | ||
|
|
aaa5deb0c0 | ||
|
|
808c519a1f | ||
|
|
262b110f9f | ||
|
|
d0fe19f996 | ||
|
|
8e6675677f | ||
|
|
82dbae6185 | ||
|
|
943f1df325 | ||
|
|
018abcfe5f | ||
|
|
6b4f716508 | ||
|
|
82b6ff0c28 | ||
|
|
d0c3132a63 | ||
|
|
02f0252dea | ||
|
|
74b3921eee | ||
|
|
1695c79021 | ||
|
|
a3b0534b86 | ||
|
|
a13f94d40f | ||
|
|
73288420a8 | ||
|
|
e224387eb4 | ||
|
|
626d322639 | ||
|
|
7dce7a84c7 | ||
|
|
6234268f10 | ||
|
|
7a1525c568 | ||
|
|
fe99eb7147 | ||
|
|
d691ecbea3 | ||
|
|
f60bcca893 | ||
|
|
75661a2266 | ||
|
|
1026f361ef | ||
|
|
69fe203006 | ||
|
|
f8ccaa3a81 | ||
|
|
c10a0a0cdf | ||
|
|
aceb6ab666 | ||
|
|
c3a2aff9d3 | ||
|
|
c9e41db826 | ||
|
|
1e7a12fff5 | ||
|
|
ba88e48f6a | ||
|
|
52979662c5 | ||
|
|
50e6d80065 | ||
|
|
16a24cfeac | ||
|
|
bab095e5b5 | ||
|
|
b1a3b078e9 | ||
|
|
baae44610a | ||
|
|
8d2dffe5b4 | ||
|
|
7b3eb23af8 | ||
|
|
fb526846fe | ||
|
|
6bd1371283 | ||
|
|
3c8c7af196 | ||
|
|
929b43ed48 | ||
|
|
a947064b7d | ||
|
|
5bc9866f43 | ||
|
|
61d82e210a | ||
|
|
a876ac9386 | ||
|
|
da1502c463 | ||
|
|
76bb782f64 | ||
|
|
e6f4b043cb | ||
|
|
d651ffaf2e | ||
|
|
e554378b5e | ||
|
|
b463bd797e | ||
|
|
699e6e16c9 | ||
|
|
f8477c41e1 | ||
|
|
9a63333aec | ||
|
|
6e40914258 | ||
|
|
56a1dd931e | ||
|
|
57fd2e6a52 | ||
|
|
113db06cdd | ||
|
|
4ee5c59cfd | ||
|
|
15812678a3 | ||
|
|
ee0379b321 | ||
|
|
dcf279177d | ||
|
|
01115824f7 | ||
|
|
b68473ae11 | ||
|
|
a65c203c9b | ||
|
|
0a848240d4 | ||
|
|
d03821b88a | ||
|
|
4d32762899 | ||
|
|
2cb4b6d16d | ||
|
|
b770e566dd | ||
|
|
51ebc88f0c | ||
|
|
a04a75724d | ||
|
|
6e5af3d799 | ||
|
|
0283a73a32 | ||
|
|
5f593031f0 | ||
|
|
0eeef2d4bd | ||
|
|
bb6164e30b | ||
|
|
d3beae4871 | ||
|
|
8df0df32f8 | ||
|
|
b0228dd0fd | ||
|
|
ffca2dee1d | ||
|
|
cba985bfea | ||
|
|
6a10a67205 | ||
|
|
880fb5bd89 | ||
|
|
6a0ade074d | ||
|
|
6cf4629d0f | ||
|
|
ce23e5fa9e | ||
|
|
d16fb838ca | ||
|
|
6b9eb8aae3 | ||
|
|
78008d1fea | ||
|
|
69fb9bb39b | ||
|
|
92f1557235 | ||
|
|
8e487ba36d | ||
|
|
7eb088b5ed | ||
|
|
9ef8ea95b0 | ||
|
|
eedf54b485 | ||
|
|
a461815957 | ||
|
|
687c2f08f6 | ||
|
|
2294f23e5f | ||
|
|
bdfd81322b | ||
|
|
3ceb0de8d8 | ||
|
|
c4b5208867 | ||
|
|
9c3f6b0c10 | ||
|
|
0550755c7d | ||
|
|
47602f267a | ||
|
|
656e67ef90 | ||
|
|
c53883b635 | ||
|
|
c4278c81f1 | ||
|
|
c94dcf5940 | ||
|
|
08ca3eff12 | ||
|
|
b40a241b2e | ||
|
|
f86f1e83ad | ||
|
|
be85701abe | ||
|
|
190eb474a6 | ||
|
|
8db1138081 | ||
|
|
afbfd4d3fa | ||
|
|
9b8efbfdd5 | ||
|
|
cacada87f3 | ||
|
|
8a36c54318 | ||
|
|
879d411669 | ||
|
|
b38be2ce7b | ||
|
|
1810c9b61c | ||
|
|
98737f14f1 | ||
|
|
b311118a04 | ||
|
|
8a337f1faf | ||
|
|
dbc5bd4104 | ||
|
|
a9c3f566da | ||
|
|
6d9c9cd964 | ||
|
|
25c8883e49 | ||
|
|
793943fc2f | ||
|
|
e98f86c540 | ||
|
|
1c8ff48f92 | ||
|
|
1fb73e2211 | ||
|
|
5279ade0e7 | ||
|
|
984134fb9d | ||
|
|
eb8f1f24b7 | ||
|
|
e49dc8bcfa | ||
|
|
e742da24a7 | ||
|
|
203b65475c | ||
|
|
576c5f4c9e | ||
|
|
d2434b5591 | ||
|
|
634c008fcd | ||
|
|
83f1ccb8ad | ||
|
|
cea401c513 | ||
|
|
6b54c1b6d4 | ||
|
|
193c4a953e | ||
|
|
d389134036 | ||
|
|
d8b140e341 | ||
|
|
5931e1143b | ||
|
|
e6d0c4b79f | ||
|
|
44a4a18320 | ||
|
|
2f96506a6e | ||
|
|
f904606b32 | ||
|
|
99bb14680a | ||
|
|
83df3dda95 | ||
|
|
5e4d67209c | ||
|
|
2798af1668 | ||
|
|
f0e41ce4c7 | ||
|
|
300602dd32 | ||
|
|
136f6778e2 | ||
|
|
2fa7907054 | ||
|
|
f3803c4c22 | ||
|
|
5d37927b0a | ||
|
|
6227f5cfa2 | ||
|
|
9fbb9fa5e1 | ||
|
|
de81ee7ee6 | ||
|
|
5fcf971e28 | ||
|
|
492f70fc4b | ||
|
|
3ced7b7212 | ||
|
|
7b55867ea7 | ||
|
|
3e15ef1c86 | ||
|
|
0cdc836054 | ||
|
|
1aad62b95d | ||
|
|
ed1c88920e | ||
|
|
e6ca20c4a2 | ||
|
|
cfa3470df6 | ||
|
|
479f297cf6 | ||
|
|
7e1b222f90 | ||
|
|
69baa6ea1a | ||
|
|
0fce93be37 | ||
|
|
51611ec2bb | ||
|
|
228a78136d | ||
|
|
34d10ace7a | ||
|
|
57bd0a5628 | ||
|
|
42e4860855 | ||
|
|
ea1c9f70d7 | ||
|
|
d3085b0450 | ||
|
|
63d02f1d5f | ||
|
|
dfecbe5bfa | ||
|
|
bcf9f00de5 | ||
|
|
a8e8e35678 | ||
|
|
2ec4a8b4ce | ||
|
|
6c3d3dee81 | ||
|
|
40b3116ed7 | ||
|
|
df7582b138 | ||
|
|
b08dab9aa1 | ||
|
|
da5a4804df | ||
|
|
d12f43498e | ||
|
|
f9f2facd76 | ||
|
|
eaee3954c1 | ||
|
|
eb235e11b6 | ||
|
|
0c5fe61ed3 | ||
|
|
76052b443a | ||
|
|
5a48248e1e | ||
|
|
bedff3278f | ||
|
|
0bb48153a5 | ||
|
|
b75246e3ca | ||
|
|
2d31f0d7fe | ||
|
|
87cfca721e | ||
|
|
54d36f3337 | ||
|
|
a4a17d171a | ||
|
|
7c2673fc66 | ||
|
|
c77ecbb10f | ||
|
|
f0ba57ba23 | ||
|
|
893aa80361 | ||
|
|
59ac3d1d45 | ||
|
|
247a9478c8 | ||
|
|
1c64d858c2 | ||
|
|
91a1d7faaf | ||
|
|
214bbfa7b6 | ||
|
|
3ee4492b3c | ||
|
|
38c453b3c6 | ||
|
|
3d41c61991 | ||
|
|
1f9f47f97e | ||
|
|
41cc2923b1 | ||
|
|
4c180f3eed | ||
|
|
5f9a64dbea | ||
|
|
9d37bfdcf1 | ||
|
|
d738c3aca6 | ||
|
|
836c4313ab | ||
|
|
91c6478add | ||
|
|
fce527a55b | ||
|
|
9a1f62fc1f | ||
|
|
018d8656d3 | ||
|
|
2636e1ba45 | ||
|
|
caed07dfc1 | ||
|
|
373cf3328d | ||
|
|
0370c3fa01 | ||
|
|
f5143a7d63 | ||
|
|
346b2a27cb | ||
|
|
38281e6361 | ||
|
|
6e8413f568 | ||
|
|
cb04364381 | ||
|
|
83d2555123 | ||
|
|
0ace97c8d4 | ||
|
|
9e3a0c61b8 | ||
|
|
2fda5c7873 | ||
|
|
e29868c8ce | ||
|
|
ac560be870 | ||
|
|
5a29cbf4a7 | ||
|
|
dc77894f68 | ||
|
|
74432a6b9d | ||
|
|
2b2fa7e77c | ||
|
|
c3f71b33aa | ||
|
|
927aae72d1 | ||
|
|
2a674f4e8d | ||
|
|
0b86ce2bda | ||
|
|
548a0709f4 | ||
|
|
da84c0bb4d | ||
|
|
9e68a5b9ab | ||
|
|
6982bdaa28 | ||
|
|
c1809232fe | ||
|
|
3c06c82eb7 | ||
|
|
1bcccb3134 | ||
|
|
cdf49dc87e | ||
|
|
0a0fb8f803 | ||
|
|
60cfd56369 | ||
|
|
73050d38c5 | ||
|
|
c50e941972 | ||
|
|
7c59fd21e2 | ||
|
|
b095a4221c | ||
|
|
1ef39fa3b8 | ||
|
|
fcf4530d83 | ||
|
|
0515e14d27 | ||
|
|
ddbef0bd79 | ||
|
|
bc5d31f86a | ||
|
|
09147a2aab | ||
|
|
a75a119e2f | ||
|
|
c1b3546161 | ||
|
|
8338432c7b | ||
|
|
8beae065cf | ||
|
|
0e7d39aa13 | ||
|
|
74063ad735 | ||
|
|
55a29808c9 | ||
|
|
40f3de3939 | ||
|
|
5d94ab09e3 | ||
|
|
b34ff6853d | ||
|
|
e2570be957 | ||
|
|
95e6fff3da | ||
|
|
9de12b7385 | ||
|
|
beffe906e4 | ||
|
|
e850d1073d | ||
|
|
c02a2ba5ba | ||
|
|
f92bb6690b | ||
|
|
5842a3bba6 | ||
|
|
fcf691d97c | ||
|
|
a32c7d5f07 | ||
|
|
edfb18b75a | ||
|
|
5544c5d5d4 | ||
|
|
22100f7c3a | ||
|
|
8ece01ccda | ||
|
|
9b68039a62 | ||
|
|
a914326e75 | ||
|
|
2b7dd35e05 | ||
|
|
15e41169ad | ||
|
|
f8c5219c12 | ||
|
|
c570b67dda | ||
|
|
456fac1700 | ||
|
|
41e58c394b | ||
|
|
5aeda5f67b | ||
|
|
c96adf168c | ||
|
|
40c5bc01ff | ||
|
|
09dabef70c | ||
|
|
96edee806e | ||
|
|
e58f4683d1 | ||
|
|
9750817bf0 | ||
|
|
7099d730e6 | ||
|
|
13c290e99f | ||
|
|
cf37966e39 | ||
|
|
9449c4b9b5 | ||
|
|
046172e5d9 | ||
|
|
c74446e38c | ||
|
|
7897460993 | ||
|
|
4b59583bca | ||
|
|
41f73559f2 | ||
|
|
d3090c0965 | ||
|
|
dc5caebbf8 | ||
|
|
14280dfedb | ||
|
|
8fdf11135a | ||
|
|
c8baa8f349 | ||
|
|
a6e25b46af | ||
|
|
395d14ab58 | ||
|
|
0d4b57df7a | ||
|
|
416e7617b3 | ||
|
|
838c470017 | ||
|
|
f0a09665db | ||
|
|
1397fa64d5 | ||
|
|
ac17a6afcf | ||
|
|
35af1bab30 | ||
|
|
1fe7bb271a | ||
|
|
774e25d944 | ||
|
|
6770e8541d | ||
|
|
70e94e4dde | ||
|
|
0ffbc6e345 | ||
|
|
25e796753f | ||
|
|
70d9ef4f77 | ||
|
|
fd67c9a589 | ||
|
|
f0917ff774 | ||
|
|
843281dec0 | ||
|
|
3a21588429 | ||
|
|
21eeb09a3c | ||
|
|
900c5ed358 | ||
|
|
195c8a92d1 | ||
|
|
7c651e6093 | ||
|
|
860b899f0c | ||
|
|
87b7524de9 | ||
|
|
29641ae16a | ||
|
|
02e32a7a9d | ||
|
|
3056369c6e | ||
|
|
3da75726d3 | ||
|
|
b7346de47d | ||
|
|
7a69100b2f | ||
|
|
2732d2b9d3 | ||
|
|
87bb27cc4f | ||
|
|
bafa300b0f | ||
|
|
939cf4542f | ||
|
|
874975da54 | ||
|
|
f0bebd4c33 | ||
|
|
c444a11862 | ||
|
|
4c0704e338 | ||
|
|
77f4cd5d58 | ||
|
|
9858d3c5a8 | ||
|
|
414acbc9ec | ||
|
|
21f904db42 | ||
|
|
f6ca253849 | ||
|
|
3f989191e3 | ||
|
|
2bea014e89 | ||
|
|
84fc19a75f | ||
|
|
d803924ef0 | ||
|
|
889f8d9d30 | ||
|
|
1dcb7eaf1f | ||
|
|
5f9e4ace2f | ||
|
|
6386330973 | ||
|
|
fd89b9755e | ||
|
|
730f454278 | ||
|
|
e2fca29c91 | ||
|
|
f97a222cf5 | ||
|
|
c75105e977 | ||
|
|
7096471d65 | ||
|
|
cc1cee8a38 | ||
|
|
5f2680889f | ||
|
|
b3ae8bb606 | ||
|
|
72d9f37845 | ||
|
|
fdfccafd84 | ||
|
|
a784f946ba | ||
|
|
a04af6c4bd | ||
|
|
64b24a96c8 | ||
|
|
a62a5d0d7b | ||
|
|
3043d1e839 | ||
|
|
a3aefb6902 | ||
|
|
a42aaa270c | ||
|
|
f8b471c17b | ||
|
|
87adff44db | ||
|
|
767bba9c04 | ||
|
|
0c827521d0 | ||
|
|
80cec7d12f | ||
|
|
5f916357e9 | ||
|
|
ea82eea9bb | ||
|
|
22222d7db4 | ||
|
|
cebee369d1 | ||
|
|
faf809851c | ||
|
|
d05aafd76b | ||
|
|
8d52721873 | ||
|
|
66c6152cd2 | ||
|
|
32cd51d3a5 | ||
|
|
497a28401e | ||
|
|
e46912047c | ||
|
|
56b573ede5 | ||
|
|
0276be1789 | ||
|
|
7db4c60fc3 | ||
|
|
95cc01dd91 | ||
|
|
cce1dddf42 | ||
|
|
0938b57841 | ||
|
|
aef8550e2f | ||
|
|
71bf0bde32 | ||
|
|
750623b9b1 | ||
|
|
1f12c53b65 | ||
|
|
8717ea1b95 | ||
|
|
db2eb658ca | ||
|
|
70483484ce | ||
|
|
d21afc43a1 | ||
|
|
7ad0803f2e | ||
|
|
ec4bfd55f9 | ||
|
|
f65174a0db | ||
|
|
8b1fcd4dd7 | ||
|
|
9509237958 | ||
|
|
f20fd20a06 | ||
|
|
8e48120fb7 | ||
|
|
44cc5ac883 | ||
|
|
9a43cc8c4b | ||
|
|
8dfc0d54f4 | ||
|
|
77febd21de | ||
|
|
84a997c66b | ||
|
|
b900a59fc2 | ||
|
|
ca782dbc58 | ||
|
|
746cda27ec | ||
|
|
16d1651656 | ||
|
|
4735fb2377 | ||
|
|
ec6b518fd2 | ||
|
|
580ad1b192 | ||
|
|
23d8810486 | ||
|
|
d579d62eb6 | ||
|
|
529f785e3c | ||
|
|
0581ae87b4 | ||
|
|
cda1059336 | ||
|
|
1aed6b5c30 | ||
|
|
4e68705b24 | ||
|
|
216cb1ea12 | ||
|
|
8ef6a0b432 | ||
|
|
5dc152c46e | ||
|
|
c3a21437e4 | ||
|
|
32bc8dcbf9 | ||
|
|
677ca7b4aa | ||
|
|
dfc2331104 | ||
|
|
cd06bbfb8d | ||
|
|
1d596bcbac | ||
|
|
0cb7b9c13d | ||
|
|
a180efeca7 | ||
|
|
eef24ea29c | ||
|
|
458bb3d7f7 | ||
|
|
ffb23d92c0 | ||
|
|
0ce39a4cf6 | ||
|
|
a24c70e490 | ||
|
|
8d4ef6e883 | ||
|
|
54865ebdee | ||
|
|
cb8e704d5c | ||
|
|
57f4978442 | ||
|
|
b8833f4c9e | ||
|
|
5c40cbc675 | ||
|
|
a455dcc919 | ||
|
|
289487cc46 | ||
|
|
42b28d5bd6 | ||
|
|
46bee05d93 | ||
|
|
49bed5cd5f | ||
|
|
624cf93e2e | ||
|
|
6ab76cda51 | ||
|
|
15beb81368 | ||
|
|
6a6cce03b7 | ||
|
|
970ff87ef6 | ||
|
|
8b6c4d322f | ||
|
|
4467a00acd | ||
|
|
63efc61517 | ||
|
|
7aa18345c8 | ||
|
|
34149187a8 | ||
|
|
2d132cd0d5 | ||
|
|
8d741361e0 | ||
|
|
2bcea3a370 | ||
|
|
ead3cace02 | ||
|
|
7afa5c7b43 | ||
|
|
115765e1ee | ||
|
|
d712fae2d7 | ||
|
|
0dba9bd87f | ||
|
|
2fbc495088 | ||
|
|
37d490cbe4 | ||
|
|
451679c582 | ||
|
|
7270a13ef7 | ||
|
|
16f3f90ed7 | ||
|
|
9ff2f81a10 | ||
|
|
1bc9a1af6a | ||
|
|
760d9e3341 | ||
|
|
5b28abc5ed | ||
|
|
defb1596bb | ||
|
|
9c117d5875 | ||
|
|
1b09fce42a | ||
|
|
5e328830e7 | ||
|
|
606da1c45b | ||
|
|
6232c1a8f3 | ||
|
|
15a24e68d2 | ||
|
|
c12ace81db | ||
|
|
531990b516 | ||
|
|
b90a3dbffe | ||
|
|
0352b97798 | ||
|
|
e45abe60bf | ||
|
|
8077481707 | ||
|
|
4651dd33cd | ||
|
|
c93cfa0871 | ||
|
|
d57cb7d411 | ||
|
|
81088766ee | ||
|
|
ae59a50c28 | ||
|
|
4a05056393 | ||
|
|
71e97c815a | ||
|
|
8b7787aa60 | ||
|
|
e0f94b052b | ||
|
|
eb2c9ffd32 | ||
|
|
5af315c165 | ||
|
|
e9fdfc339b | ||
|
|
132730acea | ||
|
|
405097d323 | ||
|
|
c9d79f26c5 | ||
|
|
7ef13eaf0c | ||
|
|
2756aba21f | ||
|
|
c01a7f57df | ||
|
|
33a4dd3841 | ||
|
|
3c150db4a2 | ||
|
|
e31f5d2325 | ||
|
|
f8a61c667e | ||
|
|
e2fe60399f | ||
|
|
59c4e35691 | ||
|
|
2dc5afd018 | ||
|
|
b5df39bc46 | ||
|
|
f87b709923 | ||
|
|
671aa1036b | ||
|
|
4580340db3 | ||
|
|
31b53eae39 | ||
|
|
089423958d | ||
|
|
0d02ea43e1 | ||
|
|
93239ae3fb | ||
|
|
5d21e9364d | ||
|
|
b9306c4cca | ||
|
|
c07bd31f61 | ||
|
|
fee4830669 | ||
|
|
9016b6778e | ||
|
|
e05501a1ae | ||
|
|
23d09fcc9e | ||
|
|
5d11fccbf2 | ||
|
|
3851957dd0 | ||
|
|
135afb0883 | ||
|
|
27b27af7cd | ||
|
|
20fe31b803 | ||
|
|
ebca9aab8d | ||
|
|
49821e0416 | ||
|
|
b5d6f1ada5 | ||
|
|
b40325cd7b | ||
|
|
3b27ec66e1 | ||
|
|
52b8b36d54 | ||
|
|
7e3106dd1b | ||
|
|
399e0d94fc | ||
|
|
eef1ff9e87 | ||
|
|
9202c7504b | ||
|
|
3fd7e3b93e | ||
|
|
b6996df86a | ||
|
|
4b3efd7bfa | ||
|
|
12c2682c34 | ||
|
|
2caf67b813 | ||
|
|
fbbe13661a | ||
|
|
0fb102edae | ||
|
|
b4dd90d074 | ||
|
|
2e3f806d07 | ||
|
|
f76092e83e | ||
|
|
1e44081583 | ||
|
|
26b3a4259d | ||
|
|
8a074a7e6d | ||
|
|
e99434582f | ||
|
|
fec57df994 | ||
|
|
033cb2d20a | ||
|
|
a5fa58e3e6 | ||
|
|
fdc9d2714b | ||
|
|
824ca9b513 | ||
|
|
a74a740964 | ||
|
|
2041d52495 | ||
|
|
fb5d528eff | ||
|
|
a2cedbd9da | ||
|
|
8574eddfa0 | ||
|
|
2ccf876929 | ||
|
|
28df150784 | ||
|
|
0950083da2 | ||
|
|
88c5f910da | ||
|
|
a9d3e4798e | ||
|
|
d85d834b23 | ||
|
|
5729da5a9f | ||
|
|
b0884ad7c3 | ||
|
|
cf09f86df2 |
17
.gitignore
vendored
17
.gitignore
vendored
@@ -1,3 +1,18 @@
|
||||
coverage.html
|
||||
.DS_Store
|
||||
lib-cov
|
||||
*.seed
|
||||
*.log
|
||||
*.log
|
||||
*.csv
|
||||
*.dat
|
||||
*.out
|
||||
*.pid
|
||||
*.swp
|
||||
*.swo
|
||||
benchmarks/graphs
|
||||
testing
|
||||
node_modules/
|
||||
testing
|
||||
.coverage_data
|
||||
cover_html
|
||||
test.js
|
||||
|
||||
15
.gitmodules
vendored
15
.gitmodules
vendored
@@ -1,15 +0,0 @@
|
||||
[submodule "lib/support/ext"]
|
||||
path = lib/support/ext
|
||||
url = git://github.com/visionmedia/ext.js.git
|
||||
[submodule "lib/support/sass"]
|
||||
path = lib/support/sass
|
||||
url = git://github.com/visionmedia/sass.js.git
|
||||
[submodule "lib/support/class"]
|
||||
path = lib/support/class
|
||||
url = git://github.com/visionmedia/class.js.git
|
||||
[submodule "lib/support/haml"]
|
||||
path = lib/support/haml
|
||||
url = git://github.com/visionmedia/haml.js.git
|
||||
[submodule "lib/support/multipart"]
|
||||
path = lib/support/multipart
|
||||
url = git://github.com/isaacs/multipart-js.git
|
||||
|
||||
9
.npmignore
Normal file
9
.npmignore
Normal file
@@ -0,0 +1,9 @@
|
||||
.git*
|
||||
docs/
|
||||
examples/
|
||||
support/
|
||||
test/
|
||||
testing.js
|
||||
.DS_Store
|
||||
coverage.html
|
||||
lib-cov
|
||||
3
.travis.yml
Normal file
3
.travis.yml
Normal file
@@ -0,0 +1,3 @@
|
||||
language: node_js
|
||||
node_js:
|
||||
- 0.6
|
||||
926
History.md
926
History.md
@@ -1,8 +1,864 @@
|
||||
|
||||
3.0.2 / 2012-11-08
|
||||
==================
|
||||
|
||||
* add OPTIONS to cors example. Closes #1398
|
||||
* fix route chaining regression. Closes #1397
|
||||
|
||||
3.0.1 / 2012-11-01
|
||||
==================
|
||||
|
||||
* update connect
|
||||
|
||||
3.0.0 / 2012-10-23
|
||||
==================
|
||||
|
||||
* add `make clean`
|
||||
* add "Basic" check to req.auth
|
||||
* add `req.auth` test coverage
|
||||
* add cb && cb(payload) to `res.jsonp()`. Closes #1374
|
||||
* add backwards compat for `res.redirect()` status. Closes #1336
|
||||
* add support for `res.json()` to retain previously defined Content-Types. Closes #1349
|
||||
* update connect
|
||||
* change `res.redirect()` to utilize a pathname-relative Location again. Closes #1382
|
||||
* remove non-primitive string support for `res.send()`
|
||||
* fix view-locals example. Closes #1370
|
||||
* fix route-separation example
|
||||
|
||||
3.0.0rc5 / 2012-09-18
|
||||
==================
|
||||
|
||||
* update connect
|
||||
* add redis search example
|
||||
* add static-files example
|
||||
* add "x-powered-by" setting (`app.disable('x-powered-by')`)
|
||||
* add "application/octet-stream" redirect Accept test case. Closes #1317
|
||||
|
||||
3.0.0rc4 / 2012-08-30
|
||||
==================
|
||||
|
||||
* add `res.jsonp()`. Closes #1307
|
||||
* add "verbose errors" option to error-pages example
|
||||
* add another route example to express(1) so people are not so confused
|
||||
* add redis online user activity tracking example
|
||||
* update connect dep
|
||||
* fix etag quoting. Closes #1310
|
||||
* fix error-pages 404 status
|
||||
* fix jsonp callback char restrictions
|
||||
* remove old OPTIONS default response
|
||||
|
||||
3.0.0rc3 / 2012-08-13
|
||||
==================
|
||||
|
||||
* update connect dep
|
||||
* fix signed cookies to work with `connect.cookieParser()` ("s:" prefix was missing) [tnydwrds]
|
||||
* fix `res.render()` clobbering of "locals"
|
||||
|
||||
3.0.0rc2 / 2012-08-03
|
||||
==================
|
||||
|
||||
* add CORS example
|
||||
* update connect dep
|
||||
* deprecate `.createServer()` & remove old stale examples
|
||||
* fix: escape `res.redirect()` link
|
||||
* fix vhost example
|
||||
|
||||
3.0.0rc1 / 2012-07-24
|
||||
==================
|
||||
|
||||
* add more examples to view-locals
|
||||
* add scheme-relative redirects (`res.redirect("//foo.com")`) support
|
||||
* update cookie dep
|
||||
* update connect dep
|
||||
* update send dep
|
||||
* fix `express(1)` -h flag, use -H for hogan. Closes #1245
|
||||
* fix `res.sendfile()` socket error handling regression
|
||||
|
||||
3.0.0beta7 / 2012-07-16
|
||||
==================
|
||||
|
||||
* update connect dep for `send()` root normalization regression
|
||||
|
||||
3.0.0beta6 / 2012-07-13
|
||||
==================
|
||||
|
||||
* add `err.view` property for view errors. Closes #1226
|
||||
* add "jsonp callback name" setting
|
||||
* add support for "/foo/:bar*" non-greedy matches
|
||||
* change `res.sendfile()` to use `send()` module
|
||||
* change `res.send` to use "response-send" module
|
||||
* remove `app.locals.use` and `res.locals.use`, use regular middleware
|
||||
|
||||
3.0.0beta5 / 2012-07-03
|
||||
==================
|
||||
|
||||
* add "make check" support
|
||||
* add route-map example
|
||||
* add `res.json(obj, status)` support back for BC
|
||||
* add "methods" dep, remove internal methods module
|
||||
* update connect dep
|
||||
* update auth example to utilize cores pbkdf2
|
||||
* updated tests to use "supertest"
|
||||
|
||||
3.0.0beta4 / 2012-06-25
|
||||
==================
|
||||
|
||||
* Added `req.auth`
|
||||
* Added `req.range(size)`
|
||||
* Added `res.links(obj)`
|
||||
* Added `res.send(body, status)` support back for backwards compat
|
||||
* Added `.default()` support to `res.format()`
|
||||
* Added 2xx / 304 check to `req.fresh`
|
||||
* Revert "Added + support to the router"
|
||||
* Fixed `res.send()` freshness check, respect res.statusCode
|
||||
|
||||
3.0.0beta3 / 2012-06-15
|
||||
==================
|
||||
|
||||
* Added hogan `--hjs` to express(1) [nullfirm]
|
||||
* Added another example to content-negotiation
|
||||
* Added `fresh` dep
|
||||
* Changed: `res.send()` always checks freshness
|
||||
* Fixed: expose connects mime module. Cloases #1165
|
||||
|
||||
3.0.0beta2 / 2012-06-06
|
||||
==================
|
||||
|
||||
* Added `+` support to the router
|
||||
* Added `req.host`
|
||||
* Changed `req.param()` to check route first
|
||||
* Update connect dep
|
||||
|
||||
3.0.0beta1 / 2012-06-01
|
||||
==================
|
||||
|
||||
* Added `res.format()` callback to override default 406 behaviour
|
||||
* Fixed `res.redirect()` 406. Closes #1154
|
||||
|
||||
3.0.0alpha5 / 2012-05-30
|
||||
==================
|
||||
|
||||
* Added `req.ip`
|
||||
* Added `{ signed: true }` option to `res.cookie()`
|
||||
* Removed `res.signedCookie()`
|
||||
* Changed: dont reverse `req.ips`
|
||||
* Fixed "trust proxy" setting check for `req.ips`
|
||||
|
||||
3.0.0alpha4 / 2012-05-09
|
||||
==================
|
||||
|
||||
* Added: allow `[]` in jsonp callback. Closes #1128
|
||||
* Added `PORT` env var support in generated template. Closes #1118 [benatkin]
|
||||
* Updated: connect 2.2.2
|
||||
|
||||
3.0.0alpha3 / 2012-05-04
|
||||
==================
|
||||
|
||||
* Added public `app.routes`. Closes #887
|
||||
* Added _view-locals_ example
|
||||
* Added _mvc_ example
|
||||
* Added `res.locals.use()`. Closes #1120
|
||||
* Added conditional-GET support to `res.send()`
|
||||
* Added: coerce `res.set()` values to strings
|
||||
* Changed: moved `static()` in generated apps below router
|
||||
* Changed: `res.send()` only set ETag when not previously set
|
||||
* Changed connect 2.2.1 dep
|
||||
* Changed: `make test` now runs unit / acceptance tests
|
||||
* Fixed req/res proto inheritance
|
||||
|
||||
3.0.0alpha2 / 2012-04-26
|
||||
==================
|
||||
|
||||
* Added `make benchmark` back
|
||||
* Added `res.send()` support for `String` objects
|
||||
* Added client-side data exposing example
|
||||
* Added `res.header()` and `req.header()` aliases for BC
|
||||
* Added `express.createServer()` for BC
|
||||
* Perf: memoize parsed urls
|
||||
* Perf: connect 2.2.0 dep
|
||||
* Changed: make `expressInit()` middleware self-aware
|
||||
* Fixed: use app.get() for all core settings
|
||||
* Fixed redis session example
|
||||
* Fixed session example. Closes #1105
|
||||
* Fixed generated express dep. Closes #1078
|
||||
|
||||
3.0.0alpha1 / 2012-04-15
|
||||
==================
|
||||
|
||||
* Added `app.locals.use(callback)`
|
||||
* Added `app.locals` object
|
||||
* Added `app.locals(obj)`
|
||||
* Added `res.locals` object
|
||||
* Added `res.locals(obj)`
|
||||
* Added `res.format()` for content-negotiation
|
||||
* Added `app.engine()`
|
||||
* Added `res.cookie()` JSON cookie support
|
||||
* Added "trust proxy" setting
|
||||
* Added `req.subdomains`
|
||||
* Added `req.protocol`
|
||||
* Added `req.secure`
|
||||
* Added `req.path`
|
||||
* Added `req.ips`
|
||||
* Added `req.fresh`
|
||||
* Added `req.stale`
|
||||
* Added comma-delmited / array support for `req.accepts()`
|
||||
* Added debug instrumentation
|
||||
* Added `res.set(obj)`
|
||||
* Added `res.set(field, value)`
|
||||
* Added `res.get(field)`
|
||||
* Added `app.get(setting)`. Closes #842
|
||||
* Added `req.acceptsLanguage()`
|
||||
* Added `req.acceptsCharset()`
|
||||
* Added `req.accepted`
|
||||
* Added `req.acceptedLanguages`
|
||||
* Added `req.acceptedCharsets`
|
||||
* Added "json replacer" setting
|
||||
* Added "json spaces" setting
|
||||
* Added X-Forwarded-Proto support to `res.redirect()`. Closes #92
|
||||
* Added `--less` support to express(1)
|
||||
* Added `express.response` prototype
|
||||
* Added `express.request` prototype
|
||||
* Added `express.application` prototype
|
||||
* Added `app.path()`
|
||||
* Added `app.render()`
|
||||
* Added `res.type()` to replace `res.contentType()`
|
||||
* Changed: `res.redirect()` to add relative support
|
||||
* Changed: enable "jsonp callback" by default
|
||||
* Changed: renamed "case sensitive routes" to "case sensitive routing"
|
||||
* Rewrite of all tests with mocha
|
||||
* Removed "root" setting
|
||||
* Removed `res.redirect('home')` support
|
||||
* Removed `req.notify()`
|
||||
* Removed `app.register()`
|
||||
* Removed `app.redirect()`
|
||||
* Removed `app.is()`
|
||||
* Removed `app.helpers()`
|
||||
* Removed `app.dynamicHelpers()`
|
||||
* Fixed `res.sendfile()` with non-GET. Closes #723
|
||||
* Fixed express(1) public dir for windows. Closes #866
|
||||
|
||||
2.5.9/ 2012-04-02
|
||||
==================
|
||||
|
||||
* Added support for PURGE request method [pbuyle]
|
||||
* Fixed `express(1)` generated app `app.address()` before `listening` [mmalecki]
|
||||
|
||||
2.5.8 / 2012-02-08
|
||||
==================
|
||||
|
||||
* Update mkdirp dep. Closes #991
|
||||
|
||||
2.5.7 / 2012-02-06
|
||||
==================
|
||||
|
||||
* Fixed `app.all` duplicate DELETE requests [mscdex]
|
||||
|
||||
2.5.6 / 2012-01-13
|
||||
==================
|
||||
|
||||
* Updated hamljs dev dep. Closes #953
|
||||
|
||||
2.5.5 / 2012-01-08
|
||||
==================
|
||||
|
||||
* Fixed: set `filename` on cached templates [matthewleon]
|
||||
|
||||
2.5.4 / 2012-01-02
|
||||
==================
|
||||
|
||||
* Fixed `express(1)` eol on 0.4.x. Closes #947
|
||||
|
||||
2.5.3 / 2011-12-30
|
||||
==================
|
||||
|
||||
* Fixed `req.is()` when a charset is present
|
||||
|
||||
2.5.2 / 2011-12-10
|
||||
==================
|
||||
|
||||
* Fixed: express(1) LF -> CRLF for windows
|
||||
|
||||
2.5.1 / 2011-11-17
|
||||
==================
|
||||
|
||||
* Changed: updated connect to 1.8.x
|
||||
* Removed sass.js support from express(1)
|
||||
|
||||
2.5.0 / 2011-10-24
|
||||
==================
|
||||
|
||||
* Added ./routes dir for generated app by default
|
||||
* Added npm install reminder to express(1) app gen
|
||||
* Added 0.5.x support
|
||||
* Removed `make test-cov` since it wont work with node 0.5.x
|
||||
* Fixed express(1) public dir for windows. Closes #866
|
||||
|
||||
2.4.7 / 2011-10-05
|
||||
==================
|
||||
|
||||
* Added mkdirp to express(1). Closes #795
|
||||
* Added simple _json-config_ example
|
||||
* Added shorthand for the parsed request's pathname via `req.path`
|
||||
* Changed connect dep to 1.7.x to fix npm issue...
|
||||
* Fixed `res.redirect()` __HEAD__ support. [reported by xerox]
|
||||
* Fixed `req.flash()`, only escape args
|
||||
* Fixed absolute path checking on windows. Closes #829 [reported by andrewpmckenzie]
|
||||
|
||||
2.4.6 / 2011-08-22
|
||||
==================
|
||||
|
||||
* Fixed multiple param callback regression. Closes #824 [reported by TroyGoode]
|
||||
|
||||
2.4.5 / 2011-08-19
|
||||
==================
|
||||
|
||||
* Added support for routes to handle errors. Closes #809
|
||||
* Added `app.routes.all()`. Closes #803
|
||||
* Added "basepath" setting to work in conjunction with reverse proxies etc.
|
||||
* Refactored `Route` to use a single array of callbacks
|
||||
* Added support for multiple callbacks for `app.param()`. Closes #801
|
||||
Closes #805
|
||||
* Changed: removed .call(self) for route callbacks
|
||||
* Dependency: `qs >= 0.3.1`
|
||||
* Fixed `res.redirect()` on windows due to `join()` usage. Closes #808
|
||||
|
||||
2.4.4 / 2011-08-05
|
||||
==================
|
||||
|
||||
* Fixed `res.header()` intention of a set, even when `undefined`
|
||||
* Fixed `*`, value no longer required
|
||||
* Fixed `res.send(204)` support. Closes #771
|
||||
|
||||
2.4.3 / 2011-07-14
|
||||
==================
|
||||
|
||||
* Added docs for `status` option special-case. Closes #739
|
||||
* Fixed `options.filename`, exposing the view path to template engines
|
||||
|
||||
2.4.2. / 2011-07-06
|
||||
==================
|
||||
|
||||
* Revert "removed jsonp stripping" for XSS
|
||||
|
||||
2.4.1 / 2011-07-06
|
||||
==================
|
||||
|
||||
* Added `res.json()` JSONP support. Closes #737
|
||||
* Added _extending-templates_ example. Closes #730
|
||||
* Added "strict routing" setting for trailing slashes
|
||||
* Added support for multiple envs in `app.configure()` calls. Closes #735
|
||||
* Changed: `res.send()` using `res.json()`
|
||||
* Changed: when cookie `path === null` don't default it
|
||||
* Changed; default cookie path to "home" setting. Closes #731
|
||||
* Removed _pids/logs_ creation from express(1)
|
||||
|
||||
2.4.0 / 2011-06-28
|
||||
==================
|
||||
|
||||
* Added chainable `res.status(code)`
|
||||
* Added `res.json()`, an explicit version of `res.send(obj)`
|
||||
* Added simple web-service example
|
||||
|
||||
2.3.12 / 2011-06-22
|
||||
==================
|
||||
|
||||
* \#express is now on freenode! come join!
|
||||
* Added `req.get(field, param)`
|
||||
* Added links to Japanese documentation, thanks @hideyukisaito!
|
||||
* Added; the `express(1)` generated app outputs the env
|
||||
* Added `content-negotiation` example
|
||||
* Dependency: connect >= 1.5.1 < 2.0.0
|
||||
* Fixed view layout bug. Closes #720
|
||||
* Fixed; ignore body on 304. Closes #701
|
||||
|
||||
2.3.11 / 2011-06-04
|
||||
==================
|
||||
|
||||
* Added `npm test`
|
||||
* Removed generation of dummy test file from `express(1)`
|
||||
* Fixed; `express(1)` adds express as a dep
|
||||
* Fixed; prune on `prepublish`
|
||||
|
||||
2.3.10 / 2011-05-27
|
||||
==================
|
||||
|
||||
* Added `req.route`, exposing the current route
|
||||
* Added _package.json_ generation support to `express(1)`
|
||||
* Fixed call to `app.param()` function for optional params. Closes #682
|
||||
|
||||
2.3.9 / 2011-05-25
|
||||
==================
|
||||
|
||||
* Fixed bug-ish with `../' in `res.partial()` calls
|
||||
|
||||
2.3.8 / 2011-05-24
|
||||
==================
|
||||
|
||||
* Fixed `app.options()`
|
||||
|
||||
2.3.7 / 2011-05-23
|
||||
==================
|
||||
|
||||
* Added route `Collection`, ex: `app.get('/user/:id').remove();`
|
||||
* Added support for `app.param(fn)` to define param logic
|
||||
* Removed `app.param()` support for callback with return value
|
||||
* Removed module.parent check from express(1) generated app. Closes #670
|
||||
* Refactored router. Closes #639
|
||||
|
||||
2.3.6 / 2011-05-20
|
||||
==================
|
||||
|
||||
* Changed; using devDependencies instead of git submodules
|
||||
* Fixed redis session example
|
||||
* Fixed markdown example
|
||||
* Fixed view caching, should not be enabled in development
|
||||
|
||||
2.3.5 / 2011-05-20
|
||||
==================
|
||||
|
||||
* Added export `.view` as alias for `.View`
|
||||
|
||||
2.3.4 / 2011-05-08
|
||||
==================
|
||||
|
||||
* Added `./examples/say`
|
||||
* Fixed `res.sendfile()` bug preventing the transfer of files with spaces
|
||||
|
||||
2.3.3 / 2011-05-03
|
||||
==================
|
||||
|
||||
* Added "case sensitive routes" option.
|
||||
* Changed; split methods supported per rfc [slaskis]
|
||||
* Fixed route-specific middleware when using the same callback function several times
|
||||
|
||||
2.3.2 / 2011-04-27
|
||||
==================
|
||||
|
||||
* Fixed view hints
|
||||
|
||||
2.3.1 / 2011-04-26
|
||||
==================
|
||||
|
||||
* Added `app.match()` as `app.match.all()`
|
||||
* Added `app.lookup()` as `app.lookup.all()`
|
||||
* Added `app.remove()` for `app.remove.all()`
|
||||
* Added `app.remove.VERB()`
|
||||
* Fixed template caching collision issue. Closes #644
|
||||
* Moved router over from connect and started refactor
|
||||
|
||||
2.3.0 / 2011-04-25
|
||||
==================
|
||||
|
||||
* Added options support to `res.clearCookie()`
|
||||
* Added `res.helpers()` as alias of `res.locals()`
|
||||
* Added; json defaults to UTF-8 with `res.send()`. Closes #632. [Daniel * Dependency `connect >= 1.4.0`
|
||||
* Changed; auto set Content-Type in res.attachement [Aaron Heckmann]
|
||||
* Renamed "cache views" to "view cache". Closes #628
|
||||
* Fixed caching of views when using several apps. Closes #637
|
||||
* Fixed gotcha invoking `app.param()` callbacks once per route middleware.
|
||||
Closes #638
|
||||
* Fixed partial lookup precedence. Closes #631
|
||||
Shaw]
|
||||
|
||||
2.2.2 / 2011-04-12
|
||||
==================
|
||||
|
||||
* Added second callback support for `res.download()` connection errors
|
||||
* Fixed `filename` option passing to template engine
|
||||
|
||||
2.2.1 / 2011-04-04
|
||||
==================
|
||||
|
||||
* Added `layout(path)` helper to change the layout within a view. Closes #610
|
||||
* Fixed `partial()` collection object support.
|
||||
Previously only anything with `.length` would work.
|
||||
When `.length` is present one must still be aware of holes,
|
||||
however now `{ collection: {foo: 'bar'}}` is valid, exposes
|
||||
`keyInCollection` and `keysInCollection`.
|
||||
|
||||
* Performance improved with better view caching
|
||||
* Removed `request` and `response` locals
|
||||
* Changed; errorHandler page title is now `Express` instead of `Connect`
|
||||
|
||||
2.2.0 / 2011-03-30
|
||||
==================
|
||||
|
||||
* Added `app.lookup.VERB()`, ex `app.lookup.put('/user/:id')`. Closes #606
|
||||
* Added `app.match.VERB()`, ex `app.match.put('/user/12')`. Closes #606
|
||||
* Added `app.VERB(path)` as alias of `app.lookup.VERB()`.
|
||||
* Dependency `connect >= 1.2.0`
|
||||
|
||||
2.1.1 / 2011-03-29
|
||||
==================
|
||||
|
||||
* Added; expose `err.view` object when failing to locate a view
|
||||
* Fixed `res.partial()` call `next(err)` when no callback is given [reported by aheckmann]
|
||||
* Fixed; `res.send(undefined)` responds with 204 [aheckmann]
|
||||
|
||||
2.1.0 / 2011-03-24
|
||||
==================
|
||||
|
||||
* Added `<root>/_?<name>` partial lookup support. Closes #447
|
||||
* Added `request`, `response`, and `app` local variables
|
||||
* Added `settings` local variable, containing the app's settings
|
||||
* Added `req.flash()` exception if `req.session` is not available
|
||||
* Added `res.send(bool)` support (json response)
|
||||
* Fixed stylus example for latest version
|
||||
* Fixed; wrap try/catch around `res.render()`
|
||||
|
||||
2.0.0 / 2011-03-17
|
||||
==================
|
||||
|
||||
* Fixed up index view path alternative.
|
||||
* Changed; `res.locals()` without object returns the locals
|
||||
|
||||
2.0.0rc3 / 2011-03-17
|
||||
==================
|
||||
|
||||
* Added `res.locals(obj)` to compliment `res.local(key, val)`
|
||||
* Added `res.partial()` callback support
|
||||
* Fixed recursive error reporting issue in `res.render()`
|
||||
|
||||
2.0.0rc2 / 2011-03-17
|
||||
==================
|
||||
|
||||
* Changed; `partial()` "locals" are now optional
|
||||
* Fixed `SlowBuffer` support. Closes #584 [reported by tyrda01]
|
||||
* Fixed .filename view engine option [reported by drudge]
|
||||
* Fixed blog example
|
||||
* Fixed `{req,res}.app` reference when mounting [Ben Weaver]
|
||||
|
||||
2.0.0rc / 2011-03-14
|
||||
==================
|
||||
|
||||
* Fixed; expose `HTTPSServer` constructor
|
||||
* Fixed express(1) default test charset. Closes #579 [reported by secoif]
|
||||
* Fixed; default charset to utf-8 instead of utf8 for lame IE [reported by NickP]
|
||||
|
||||
2.0.0beta3 / 2011-03-09
|
||||
==================
|
||||
|
||||
* Added support for `res.contentType()` literal
|
||||
The original `res.contentType('.json')`,
|
||||
`res.contentType('application/json')`, and `res.contentType('json')`
|
||||
will work now.
|
||||
* Added `res.render()` status option support back
|
||||
* Added charset option for `res.render()`
|
||||
* Added `.charset` support (via connect 1.0.4)
|
||||
* Added view resolution hints when in development and a lookup fails
|
||||
* Added layout lookup support relative to the page view.
|
||||
For example while rendering `./views/user/index.jade` if you create
|
||||
`./views/user/layout.jade` it will be used in favour of the root layout.
|
||||
* Fixed `res.redirect()`. RFC states absolute url [reported by unlink]
|
||||
* Fixed; default `res.send()` string charset to utf8
|
||||
* Removed `Partial` constructor (not currently used)
|
||||
|
||||
2.0.0beta2 / 2011-03-07
|
||||
==================
|
||||
|
||||
* Added res.render() `.locals` support back to aid in migration process
|
||||
* Fixed flash example
|
||||
|
||||
2.0.0beta / 2011-03-03
|
||||
==================
|
||||
|
||||
* Added HTTPS support
|
||||
* Added `res.cookie()` maxAge support
|
||||
* Added `req.header()` _Referrer_ / _Referer_ special-case, either works
|
||||
* Added mount support for `res.redirect()`, now respects the mount-point
|
||||
* Added `union()` util, taking place of `merge(clone())` combo
|
||||
* Added stylus support to express(1) generated app
|
||||
* Added secret to session middleware used in examples and generated app
|
||||
* Added `res.local(name, val)` for progressive view locals
|
||||
* Added default param support to `req.param(name, default)`
|
||||
* Added `app.disabled()` and `app.enabled()`
|
||||
* Added `app.register()` support for omitting leading ".", either works
|
||||
* Added `res.partial()`, using the same interface as `partial()` within a view. Closes #539
|
||||
* Added `app.param()` to map route params to async/sync logic
|
||||
* Added; aliased `app.helpers()` as `app.locals()`. Closes #481
|
||||
* Added extname with no leading "." support to `res.contentType()`
|
||||
* Added `cache views` setting, defaulting to enabled in "production" env
|
||||
* Added index file partial resolution, eg: partial('user') may try _views/user/index.jade_.
|
||||
* Added `req.accepts()` support for extensions
|
||||
* Changed; `res.download()` and `res.sendfile()` now utilize Connect's
|
||||
static file server `connect.static.send()`.
|
||||
* Changed; replaced `connect.utils.mime()` with npm _mime_ module
|
||||
* Changed; allow `req.query` to be pre-defined (via middleware or other parent
|
||||
* Changed view partial resolution, now relative to parent view
|
||||
* Changed view engine signature. no longer `engine.render(str, options, callback)`, now `engine.compile(str, options) -> Function`, the returned function accepts `fn(locals)`.
|
||||
* Fixed `req.param()` bug returning Array.prototype methods. Closes #552
|
||||
* Fixed; using `Stream#pipe()` instead of `sys.pump()` in `res.sendfile()`
|
||||
* Fixed; using _qs_ module instead of _querystring_
|
||||
* Fixed; strip unsafe chars from jsonp callbacks
|
||||
* Removed "stream threshold" setting
|
||||
|
||||
1.0.8 / 2011-03-01
|
||||
==================
|
||||
|
||||
* Allow `req.query` to be pre-defined (via middleware or other parent app)
|
||||
* "connect": ">= 0.5.0 < 1.0.0". Closes #547
|
||||
* Removed the long deprecated __EXPRESS_ENV__ support
|
||||
|
||||
1.0.7 / 2011-02-07
|
||||
==================
|
||||
|
||||
* Fixed `render()` setting inheritance.
|
||||
Mounted apps would not inherit "view engine"
|
||||
|
||||
1.0.6 / 2011-02-07
|
||||
==================
|
||||
|
||||
* Fixed `view engine` setting bug when period is in dirname
|
||||
|
||||
1.0.5 / 2011-02-05
|
||||
==================
|
||||
|
||||
* Added secret to generated app `session()` call
|
||||
|
||||
1.0.4 / 2011-02-05
|
||||
==================
|
||||
|
||||
* Added `qs` dependency to _package.json_
|
||||
* Fixed namespaced `require()`s for latest connect support
|
||||
|
||||
1.0.3 / 2011-01-13
|
||||
==================
|
||||
|
||||
* Remove unsafe characters from JSONP callback names [Ryan Grove]
|
||||
|
||||
1.0.2 / 2011-01-10
|
||||
==================
|
||||
|
||||
* Removed nested require, using `connect.router`
|
||||
|
||||
1.0.1 / 2010-12-29
|
||||
==================
|
||||
|
||||
* Fixed for middleware stacked via `createServer()`
|
||||
previously the `foo` middleware passed to `createServer(foo)`
|
||||
would not have access to Express methods such as `res.send()`
|
||||
or props like `req.query` etc.
|
||||
|
||||
1.0.0 / 2010-11-16
|
||||
==================
|
||||
|
||||
* Added; deduce partial object names from the last segment.
|
||||
For example by default `partial('forum/post', postObject)` will
|
||||
give you the _post_ object, providing a meaningful default.
|
||||
* Added http status code string representation to `res.redirect()` body
|
||||
* Added; `res.redirect()` supporting _text/plain_ and _text/html_ via __Accept__.
|
||||
* Added `req.is()` to aid in content negotiation
|
||||
* Added partial local inheritance [suggested by masylum]. Closes #102
|
||||
providing access to parent template locals.
|
||||
* Added _-s, --session[s]_ flag to express(1) to add session related middleware
|
||||
* Added _--template_ flag to express(1) to specify the
|
||||
template engine to use.
|
||||
* Added _--css_ flag to express(1) to specify the
|
||||
stylesheet engine to use (or just plain css by default).
|
||||
* Added `app.all()` support [thanks aheckmann]
|
||||
* Added partial direct object support.
|
||||
You may now `partial('user', user)` providing the "user" local,
|
||||
vs previously `partial('user', { object: user })`.
|
||||
* Added _route-separation_ example since many people question ways
|
||||
to do this with CommonJS modules. Also view the _blog_ example for
|
||||
an alternative.
|
||||
* Performance; caching view path derived partial object names
|
||||
* Fixed partial local inheritance precedence. [reported by Nick Poulden] Closes #454
|
||||
* Fixed jsonp support; _text/javascript_ as per mailinglist discussion
|
||||
|
||||
1.0.0rc4 / 2010-10-14
|
||||
==================
|
||||
|
||||
* Added _NODE_ENV_ support, _EXPRESS_ENV_ is deprecated and will be removed in 1.0.0
|
||||
* Added route-middleware support (very helpful, see the [docs](http://expressjs.com/guide.html#Route-Middleware))
|
||||
* Added _jsonp callback_ setting to enable/disable jsonp autowrapping [Dav Glass]
|
||||
* Added callback query check on response.send to autowrap JSON objects for simple webservice implementations [Dav Glass]
|
||||
* Added `partial()` support for array-like collections. Closes #434
|
||||
* Added support for swappable querystring parsers
|
||||
* Added session usage docs. Closes #443
|
||||
* Added dynamic helper caching. Closes #439 [suggested by maritz]
|
||||
* Added authentication example
|
||||
* Added basic Range support to `res.sendfile()` (and `res.download()` etc)
|
||||
* Changed; `express(1)` generated app using 2 spaces instead of 4
|
||||
* Default env to "development" again [aheckmann]
|
||||
* Removed _context_ option is no more, use "scope"
|
||||
* Fixed; exposing _./support_ libs to examples so they can run without installs
|
||||
* Fixed mvc example
|
||||
|
||||
1.0.0rc3 / 2010-09-20
|
||||
==================
|
||||
|
||||
* Added confirmation for `express(1)` app generation. Closes #391
|
||||
* Added extending of flash formatters via `app.flashFormatters`
|
||||
* Added flash formatter support. Closes #411
|
||||
* Added streaming support to `res.sendfile()` using `sys.pump()` when >= "stream threshold"
|
||||
* Added _stream threshold_ setting for `res.sendfile()`
|
||||
* Added `res.send()` __HEAD__ support
|
||||
* Added `res.clearCookie()`
|
||||
* Added `res.cookie()`
|
||||
* Added `res.render()` headers option
|
||||
* Added `res.redirect()` response bodies
|
||||
* Added `res.render()` status option support. Closes #425 [thanks aheckmann]
|
||||
* Fixed `res.sendfile()` responding with 403 on malicious path
|
||||
* Fixed `res.download()` bug; when an error occurs remove _Content-Disposition_
|
||||
* Fixed; mounted apps settings now inherit from parent app [aheckmann]
|
||||
* Fixed; stripping Content-Length / Content-Type when 204
|
||||
* Fixed `res.send()` 204. Closes #419
|
||||
* Fixed multiple _Set-Cookie_ headers via `res.header()`. Closes #402
|
||||
* Fixed bug messing with error handlers when `listenFD()` is called instead of `listen()`. [thanks guillermo]
|
||||
|
||||
|
||||
1.0.0rc2 / 2010-08-17
|
||||
==================
|
||||
|
||||
* Added `app.register()` for template engine mapping. Closes #390
|
||||
* Added `res.render()` callback support as second argument (no options)
|
||||
* Added callback support to `res.download()`
|
||||
* Added callback support for `res.sendfile()`
|
||||
* Added support for middleware access via `express.middlewareName()` vs `connect.middlewareName()`
|
||||
* Added "partials" setting to docs
|
||||
* Added default expresso tests to `express(1)` generated app. Closes #384
|
||||
* Fixed `res.sendfile()` error handling, defer via `next()`
|
||||
* Fixed `res.render()` callback when a layout is used [thanks guillermo]
|
||||
* Fixed; `make install` creating ~/.node_libraries when not present
|
||||
* Fixed issue preventing error handlers from being defined anywhere. Closes #387
|
||||
|
||||
1.0.0rc / 2010-07-28
|
||||
==================
|
||||
|
||||
* Added mounted hook. Closes #369
|
||||
* Added connect dependency to _package.json_
|
||||
|
||||
* Removed "reload views" setting and support code
|
||||
development env never caches, production always caches.
|
||||
|
||||
* Removed _param_ in route callbacks, signature is now
|
||||
simply (req, res, next), previously (req, res, params, next).
|
||||
Use _req.params_ for path captures, _req.query_ for GET params.
|
||||
|
||||
* Fixed "home" setting
|
||||
* Fixed middleware/router precedence issue. Closes #366
|
||||
* Fixed; _configure()_ callbacks called immediately. Closes #368
|
||||
|
||||
1.0.0beta2 / 2010-07-23
|
||||
==================
|
||||
|
||||
* Added more examples
|
||||
* Added; exporting `Server` constructor
|
||||
* Added `Server#helpers()` for view locals
|
||||
* Added `Server#dynamicHelpers()` for dynamic view locals. Closes #349
|
||||
* Added support for absolute view paths
|
||||
* Added; _home_ setting defaults to `Server#route` for mounted apps. Closes #363
|
||||
* Added Guillermo Rauch to the contributor list
|
||||
* Added support for "as" for non-collection partials. Closes #341
|
||||
* Fixed _install.sh_, ensuring _~/.node_libraries_ exists. Closes #362 [thanks jf]
|
||||
* Fixed `res.render()` exceptions, now passed to `next()` when no callback is given [thanks guillermo]
|
||||
* Fixed instanceof `Array` checks, now `Array.isArray()`
|
||||
* Fixed express(1) expansion of public dirs. Closes #348
|
||||
* Fixed middleware precedence. Closes #345
|
||||
* Fixed view watcher, now async [thanks aheckmann]
|
||||
|
||||
1.0.0beta / 2010-07-15
|
||||
==================
|
||||
|
||||
* Re-write
|
||||
- much faster
|
||||
- much lighter
|
||||
- Check [ExpressJS.com](http://expressjs.com) for migration guide and updated docs
|
||||
|
||||
0.14.0 / 2010-06-15
|
||||
==================
|
||||
|
||||
* Utilize relative requires
|
||||
* Added Static bufferSize option [aheckmann]
|
||||
* Fixed caching of view and partial subdirectories [aheckmann]
|
||||
* Fixed mime.type() comments now that ".ext" is not supported
|
||||
* Updated haml submodule
|
||||
* Updated class submodule
|
||||
* Removed bin/express
|
||||
|
||||
0.13.0 / 2010-06-01
|
||||
==================
|
||||
|
||||
* Added node v0.1.97 compatibility
|
||||
* Added support for deleting cookies via Request#cookie('key', null)
|
||||
* Updated haml submodule
|
||||
* Fixed not-found page, now using using charset utf-8
|
||||
* Fixed show-exceptions page, now using using charset utf-8
|
||||
* Fixed view support due to fs.readFile Buffers
|
||||
* Changed; mime.type() no longer accepts ".type" due to node extname() changes
|
||||
|
||||
0.12.0 / 2010-05-22
|
||||
==================
|
||||
|
||||
* Added node v0.1.96 compatibility
|
||||
* Added view `helpers` export which act as additional local variables
|
||||
* Updated haml submodule
|
||||
* Changed ETag; removed inode, modified time only
|
||||
* Fixed LF to CRLF for setting multiple cookies
|
||||
* Fixed cookie complation; values are now urlencoded
|
||||
* Fixed cookies parsing; accepts quoted values and url escaped cookies
|
||||
|
||||
0.11.0 / 2010-05-06
|
||||
==================
|
||||
|
||||
* Added support for layouts using different engines
|
||||
- this.render('page.html.haml', { layout: 'super-cool-layout.html.ejs' })
|
||||
- this.render('page.html.haml', { layout: 'foo' }) // assumes 'foo.html.haml'
|
||||
- this.render('page.html.haml', { layout: false }) // no layout
|
||||
* Updated ext submodule
|
||||
* Updated haml submodule
|
||||
* Fixed EJS partial support by passing along the context. Issue #307
|
||||
|
||||
0.10.1 / 2010-05-03
|
||||
==================
|
||||
|
||||
* Fixed binary uploads.
|
||||
|
||||
0.10.0 / 2010-04-30
|
||||
==================
|
||||
|
||||
* Added charset support via Request#charset (automatically assigned to 'UTF-8' when respond()'s
|
||||
encoding is set to 'utf8' or 'utf-8'.
|
||||
* Added "encoding" option to Request#render(). Closes #299
|
||||
* Added "dump exceptions" setting, which is enabled by default.
|
||||
* Added simple ejs template engine support
|
||||
* Added error reponse support for text/plain, application/json. Closes #297
|
||||
* Added callback function param to Request#error()
|
||||
* Added Request#sendHead()
|
||||
* Added Request#stream()
|
||||
* Added support for Request#respond(304, null) for empty response bodies
|
||||
* Added ETag support to Request#sendfile()
|
||||
* Added options to Request#sendfile(), passed to fs.createReadStream()
|
||||
* Added filename arg to Request#download()
|
||||
* Performance enhanced due to pre-reversing plugins so that plugins.reverse() is not called on each request
|
||||
* Performance enhanced by preventing several calls to toLowerCase() in Router#match()
|
||||
* Changed; Request#sendfile() now streams
|
||||
* Changed; Renamed Request#halt() to Request#respond(). Closes #289
|
||||
* Changed; Using sys.inspect() instead of JSON.encode() for error output
|
||||
* Changed; run() returns the http.Server instance. Closes #298
|
||||
* Changed; Defaulting Server#host to null (INADDR_ANY)
|
||||
* Changed; Logger "common" format scale of 0.4f
|
||||
* Removed Logger "request" format
|
||||
* Fixed; Catching ENOENT in view caching, preventing error when "views/partials" is not found
|
||||
* Fixed several issues with http client
|
||||
* Fixed Logger Content-Length output
|
||||
* Fixed bug preventing Opera from retaining the generated session id. Closes #292
|
||||
|
||||
0.9.0 / 2010-04-14
|
||||
==================
|
||||
|
||||
* Added DSL level error() route support
|
||||
* Added DSL level notFound() route support
|
||||
* Added Request#error()
|
||||
* Added Request#notFound()
|
||||
* Added Request#render() callback function. Closes #258
|
||||
* Added "max upload size" setting
|
||||
* Added "magic" variables to collection partials (\_\_index\_\_, \_\_length\_\_, \_\_isFirst\_\_, \_\_isLast\_\_). Closes #254
|
||||
* Added [haml.js](http://github.com/visionmedia/haml.js) submodule; removed haml-js
|
||||
* Added callback function support to Request#halt() as 3rd/4th arg
|
||||
* Added preprocessing of route param wildcards using param(). Closes #251
|
||||
* Added view partial support (with collections etc)
|
||||
* Fixed bug preventing falsey params (such as ?page=0). Closes #286
|
||||
* Fixed setting of multiple cookies. Closes #199
|
||||
* Changed; view naming convention is now NAME.TYPE.ENGINE (for example page.html.haml)
|
||||
@@ -11,74 +867,14 @@
|
||||
* Changed; Event is no longer global
|
||||
* Changed; "sys" module is no longer global
|
||||
* Changed; moved Request#download to Static plugin where it belongs
|
||||
* Changed; Request instance created before body parsing. Closes #262
|
||||
* Changed; Pre-caching views in memory when "cache view contents" is enabled. Closes #253
|
||||
* Changed; Pre-caching view partials in memory when "cache view partials" is enabled
|
||||
* Updated support to node --version 0.1.90
|
||||
* Updated dependencies
|
||||
|
||||
* Added "magic" variables to collection partials (__index__, __length__, __isFirst__, __isLast__). Closes #254
|
||||
* Request instance created before body parsing. Closes #262
|
||||
* Fixed post param issue
|
||||
* Fixed mocks to work with new routing api
|
||||
* .
|
||||
* Docs
|
||||
* Merge branch 'upload-limit'
|
||||
* Added "max upload size" setting
|
||||
* Updated ext. Closes #256
|
||||
* Added Request#render() callback function. Closes #258
|
||||
* Merge branch 'integration'
|
||||
* fn -> callback
|
||||
* Typo
|
||||
* Merge branch 'master' of git://github.com/aheckmann/express into integration
|
||||
* Updated to JSpec 4.0.0
|
||||
* error() is passed the exception
|
||||
* fn -> callback
|
||||
* Added DSL level error() route support
|
||||
* Added DSL level notFound() route support
|
||||
* Added specs for Request#notFound()
|
||||
* More Request#error() specs
|
||||
* Added specs for Request#error()
|
||||
* Merge branch 'errors'
|
||||
* Added publish Request#notFound()
|
||||
* Removed Express.error(), Added public Request#error()
|
||||
* Request#halt() accepts callback function as 3rd/4th arg
|
||||
* Merge branch 'error-handling'
|
||||
* Misc error handling improvements
|
||||
* Removed unused variable
|
||||
* Merge branch 'error-handling'
|
||||
* Caching notFound / showException modules
|
||||
* Express.error() now acts as the core exception handler
|
||||
* request response event is now fired in reverse.
|
||||
* Handle when a plugin response fails
|
||||
* next -> callback
|
||||
* Styling
|
||||
* Removed set("session cookie") in favour of use(Session, { cookie: { ... }})
|
||||
* Docs for stable / edge
|
||||
* Merge branch 'route-wildcards'
|
||||
* Added preprocessing of route param wildcards using param(). Closes #251
|
||||
* Added specs for param()
|
||||
* Added more route wildcard specs
|
||||
* Merge branch 'pre-cache-views'
|
||||
* Pre-caching views in memory. Closes #253
|
||||
* Started pre caching of views
|
||||
* Merge branch 'integration'
|
||||
* Added assertion to ensure that partials dir is relative to set("views")
|
||||
* Re-using variables
|
||||
* Using set("views") when setting set("partials")
|
||||
* partialscache -> partials
|
||||
* preload partials add settings bug fix, partial now works when cache view contents is true
|
||||
* add cache view partials
|
||||
* Removed utils.mixin() use Object#mergeDeep()
|
||||
* Merge branch 'partials'
|
||||
* Chat sample app using partials as an example
|
||||
* Added partial "as" option
|
||||
* Partial collection should not introduce newlines
|
||||
* Added partial collection support
|
||||
* Started view partial support
|
||||
* Updated ext submodule
|
||||
* Removed Request#_blendInNodeRequest()
|
||||
* Merge branch 'net2_fixes' of git://github.com/ciaranj/express
|
||||
* Updated support to v0.1.33
|
||||
* Various minor fixes required to make express work post the net2 merge branch
|
||||
|
||||
* Removed utils.mixin(); use Object#mergeDeep()
|
||||
|
||||
0.8.0 / 2010-03-19
|
||||
==================
|
||||
|
||||
|
||||
22
LICENSE
Normal file
22
LICENSE
Normal file
@@ -0,0 +1,22 @@
|
||||
(The MIT License)
|
||||
|
||||
Copyright (c) 2009-2011 TJ Holowaychuk <tj@vision-media.ca>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
'Software'), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
54
Makefile
54
Makefile
@@ -1,27 +1,33 @@
|
||||
|
||||
NODE = node
|
||||
COFFEE = coffee
|
||||
MOCHA_OPTS=
|
||||
REPORTER = dot
|
||||
|
||||
all: test
|
||||
|
||||
install: bin/express
|
||||
install bin/express /usr/local/bin/express
|
||||
check: test
|
||||
|
||||
test:
|
||||
@$(NODE) spec/node.js all
|
||||
|
||||
app: app-chat
|
||||
|
||||
app-chat:
|
||||
@$(NODE) examples/chat/app.js
|
||||
|
||||
app-upload:
|
||||
@$(NODE) examples/upload/app.js
|
||||
|
||||
app-coffee-upload: compile-coffee
|
||||
@$(NODE) examples/coffee-upload/app.js
|
||||
|
||||
compile-coffee:
|
||||
@$(COFFEE) examples/coffee-upload/app.coffee
|
||||
|
||||
.PHONY: install test app
|
||||
test: test-unit test-acceptance
|
||||
|
||||
test-unit:
|
||||
@NODE_ENV=test ./node_modules/.bin/mocha \
|
||||
--reporter $(REPORTER) \
|
||||
$(MOCHA_OPTS)
|
||||
|
||||
test-acceptance:
|
||||
@NODE_ENV=test ./node_modules/.bin/mocha \
|
||||
--reporter $(REPORTER) \
|
||||
--bail \
|
||||
test/acceptance/*.js
|
||||
|
||||
test-cov: lib-cov
|
||||
@EXPRESS_COV=1 $(MAKE) test REPORTER=html-cov > coverage.html
|
||||
|
||||
lib-cov:
|
||||
@jscoverage lib lib-cov
|
||||
|
||||
benchmark:
|
||||
@./support/bench
|
||||
|
||||
clean:
|
||||
rm -f coverage.html
|
||||
rm -fr lib-cov
|
||||
|
||||
.PHONY: test test-unit test-acceptance benchmark clean
|
||||
|
||||
243
Readme.md
243
Readme.md
@@ -1,114 +1,167 @@
|
||||

|
||||
|
||||
# Express
|
||||
|
||||
Insanely fast (and small) server-side JavaScript web development framework
|
||||
built on **node.js** and the **V8 JavaScript engine**.
|
||||
Fast, unopinionated, minimalist web framework for [node](http://nodejs.org). [](http://travis-ci.org/visionmedia/express)
|
||||
|
||||
* Visit the [Wiki](http://wiki.github.com/visionmedia/express) for documentation
|
||||
* Visit the [Google Group](http://groups.google.com/group/express-js) for discussion
|
||||
```js
|
||||
var express = require('express');
|
||||
var app = express();
|
||||
|
||||
## Features (so far)
|
||||
app.get('/', function(req, res){
|
||||
res.send('Hello World');
|
||||
});
|
||||
|
||||
app.listen(3000);
|
||||
```
|
||||
|
||||
* Sexy DSL with robust sinatra-like routing
|
||||
* High performance
|
||||
* Session support
|
||||
* Cache API
|
||||
* RESTful HTTP client
|
||||
* Mime helpers
|
||||
* Redirection helpers
|
||||
* Multipart file upload support
|
||||
* Test helpers (mock requests etc)
|
||||
* Environment based configuration
|
||||
* Light-weight JavaScript class implementation via [class.js](http://github.com/visionmedia/class.js/)
|
||||
* Persistent flash messages
|
||||
* Route passing
|
||||
* View support (ejs, haml, sass, etc)
|
||||
* Full test coverage
|
||||
* Logger plugin with several formats
|
||||
* Upload size restrictions
|
||||
* Extremely readable specs
|
||||
* Cookie support
|
||||
|
||||
## Installation
|
||||
|
||||
Install the [Kiwi package manager for nodejs](http://github.com/visionmedia/kiwi)
|
||||
and run:
|
||||
$ npm install -g express
|
||||
|
||||
To install the 3.0 alpha:
|
||||
|
||||
$ npm install -g express@3.0
|
||||
|
||||
## Quick Start
|
||||
|
||||
The quickest way to get started with express is to utilize the executable `express(1)` to generate an application as shown below:
|
||||
|
||||
Create the app:
|
||||
|
||||
$ npm install -g express
|
||||
$ express /tmp/foo && cd /tmp/foo
|
||||
|
||||
Install dependencies:
|
||||
|
||||
$ npm install
|
||||
|
||||
Start the server:
|
||||
|
||||
$ node app
|
||||
|
||||
## Features
|
||||
|
||||
* Built on [Connect](http://github.com/senchalabs/connect)
|
||||
* Robust routing
|
||||
* HTTP helpers (redirection, caching, etc)
|
||||
* View system supporting 14+ template engines
|
||||
* Content negotiation
|
||||
* Focus on high performance
|
||||
* Environment based configuration
|
||||
* Executable for generating applications quickly
|
||||
* High test coverage
|
||||
|
||||
## Philosophy
|
||||
|
||||
The Express philosophy is to provide small, robust tooling for HTTP servers. Making
|
||||
it a great solution for single page applications, web sites, hybrids, or public
|
||||
HTTP APIs.
|
||||
|
||||
$ kiwi -v install express
|
||||
|
||||
or
|
||||
Built on Connect you can use _only_ what you need, and nothing more, applications
|
||||
can be as big or as small as you like, even a single file. Express does
|
||||
not force you to use any specific ORM or template engine. With support for over
|
||||
14 template engines via [Consolidate.js](http://github.com/visionmedia/consolidate.js)
|
||||
you can quickly craft your perfect framework.
|
||||
|
||||
Install via git clone:
|
||||
|
||||
$ git clone git://github.com/visionmedia/express.git && cd express && git submodule update --init
|
||||
|
||||
## Performance
|
||||
|
||||
Extensive performance enhancements have not yet been made,
|
||||
since we are focusing on the framework itself at the moment.
|
||||
|
||||
However if you are interested view the premature [benchmarks for Express framework](http://vision-media.ca/resources/nodejs/express-nodejs-web-development-framework-performance).
|
||||
|
||||
## Examples
|
||||
|
||||
Below is a tiny Express application. View the [Wiki](http://wiki.github.com/visionmedia/express/) for detailed information.
|
||||
|
||||
require.paths.unshift('express/lib')
|
||||
require('express')
|
||||
|
||||
get('/user', function(){
|
||||
this.redirect('/user/' + this.currentUser.id)
|
||||
})
|
||||
|
||||
get('/user/:id', function(id){
|
||||
this.render('user.haml.html', {
|
||||
locals: {
|
||||
user: this.currentUser,
|
||||
usersOnline: Session.store.length()
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
run()
|
||||
|
||||
## Running Tests
|
||||
|
||||
Express uses the [JSpec](http://jspec.info) BDD JavaScript testing
|
||||
framework to write and run elegant spec suites. JSpec is frozen
|
||||
to spec/lib and **does not** require separate installation.
|
||||
|
||||
$ make test
|
||||
|
||||
Run individual suites:
|
||||
|
||||
$ node spec/node.js core
|
||||
$ node spec/node.js mime
|
||||
$ node spec/node.js routing
|
||||
...
|
||||
|
||||
The latest release of Express is compatible with node --version:
|
||||
v0.1.90
|
||||
|
||||
EDGE Express we do our best to keep up to date with node's EDGE
|
||||
|
||||
## More Information
|
||||
|
||||
* [JavaScript Extensions & Utilities](http://github.com/visionmedia/ext.js)
|
||||
* [JavaScript Sass](http://github.com/visionmedia/sass.js)
|
||||
* Featured in [Advanced JavaScript e-book](http://www.dev-mag.com/2010/02/18/advanced-javascript/) for only $4
|
||||
|
||||
* Join #express on freenode
|
||||
* [Google Group](http://groups.google.com/group/express-js) for discussion
|
||||
* Follow [tjholowaychuk](http://twitter.com/tjholowaychuk) on twitter for updates
|
||||
* Visit the [Wiki](http://github.com/visionmedia/express/wiki)
|
||||
* [日本語ドキュメンテーション](http://hideyukisaito.com/doc/expressjs/) by [hideyukisaito](https://github.com/hideyukisaito)
|
||||
* [Русскоязычная документация](http://express-js.ru/)
|
||||
|
||||
## Viewing Examples
|
||||
|
||||
Clone the Express repo, then install the dev dependencies to install all the example / test suite deps:
|
||||
|
||||
$ git clone git://github.com/visionmedia/express.git --depth 1
|
||||
$ cd express
|
||||
$ npm install
|
||||
|
||||
then run whichever tests you want:
|
||||
|
||||
$ node examples/content-negotiation
|
||||
|
||||
## Running Tests
|
||||
|
||||
To run the test suite first invoke the following command within the repo, installing the development dependencies:
|
||||
|
||||
$ npm install
|
||||
|
||||
then run the tests:
|
||||
|
||||
$ make test
|
||||
|
||||
## Contributors
|
||||
|
||||
* TJ Holowaychuk (visionmedia) <tj@vision-media.ca>
|
||||
* Aaron Heckmann (aheckmann) <aaron.heckmann+github@gmail.com>
|
||||
* Ciaran Jessup (ciaranj) <ciaranj@gmail.com>
|
||||
* Gareth Jones (csausdev) <gareth.jones@sensis.com.au>
|
||||
|
||||
```
|
||||
project: express
|
||||
commits: 3559
|
||||
active : 468 days
|
||||
files : 237
|
||||
authors:
|
||||
1891 Tj Holowaychuk 53.1%
|
||||
1285 visionmedia 36.1%
|
||||
182 TJ Holowaychuk 5.1%
|
||||
54 Aaron Heckmann 1.5%
|
||||
34 csausdev 1.0%
|
||||
26 ciaranj 0.7%
|
||||
21 Robert Sköld 0.6%
|
||||
6 Guillermo Rauch 0.2%
|
||||
3 Dav Glass 0.1%
|
||||
3 Nick Poulden 0.1%
|
||||
2 Randy Merrill 0.1%
|
||||
2 Benny Wong 0.1%
|
||||
2 Hunter Loftis 0.1%
|
||||
2 Jake Gordon 0.1%
|
||||
2 Brian McKinney 0.1%
|
||||
2 Roman Shtylman 0.1%
|
||||
2 Ben Weaver 0.1%
|
||||
2 Dave Hoover 0.1%
|
||||
2 Eivind Fjeldstad 0.1%
|
||||
2 Daniel Shaw 0.1%
|
||||
1 Matt Colyer 0.0%
|
||||
1 Pau Ramon 0.0%
|
||||
1 Pero Pejovic 0.0%
|
||||
1 Peter Rekdal Sunde 0.0%
|
||||
1 Raynos 0.0%
|
||||
1 Teng Siong Ong 0.0%
|
||||
1 Viktor Kelemen 0.0%
|
||||
1 ctide 0.0%
|
||||
1 8bitDesigner 0.0%
|
||||
1 isaacs 0.0%
|
||||
1 mgutz 0.0%
|
||||
1 pikeas 0.0%
|
||||
1 shuwatto 0.0%
|
||||
1 tstrimple 0.0%
|
||||
1 ewoudj 0.0%
|
||||
1 Adam Sanderson 0.0%
|
||||
1 Andrii Kostenko 0.0%
|
||||
1 Andy Hiew 0.0%
|
||||
1 Arpad Borsos 0.0%
|
||||
1 Ashwin Purohit 0.0%
|
||||
1 Benjen 0.0%
|
||||
1 Darren Torpey 0.0%
|
||||
1 Greg Ritter 0.0%
|
||||
1 Gregory Ritter 0.0%
|
||||
1 James Herdman 0.0%
|
||||
1 Jim Snodgrass 0.0%
|
||||
1 Joe McCann 0.0%
|
||||
1 Jonathan Dumaine 0.0%
|
||||
1 Jonathan Palardy 0.0%
|
||||
1 Jonathan Zacsh 0.0%
|
||||
1 Justin Lilly 0.0%
|
||||
1 Ken Sato 0.0%
|
||||
1 Maciej Małecki 0.0%
|
||||
1 Masahiro Hayashi 0.0%
|
||||
```
|
||||
|
||||
## License
|
||||
|
||||
(The MIT License)
|
||||
|
||||
Copyright (c) 2009 TJ Holowaychuk <tj@vision-media.ca>
|
||||
Copyright (c) 2009-2012 TJ Holowaychuk <tj@vision-media.ca>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
|
||||
462
bin/express
462
bin/express
@@ -1,62 +1,422 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
var arg,
|
||||
dir = '.',
|
||||
fs = require('fs'),
|
||||
sys = require('sys'),
|
||||
args = process.argv.slice(2)
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
// Parse arguments
|
||||
var exec = require('child_process').exec
|
||||
, program = require('commander')
|
||||
, mkdirp = require('mkdirp')
|
||||
, pkg = require('../package.json')
|
||||
, version = pkg.version
|
||||
, os = require('os')
|
||||
, fs = require('fs');
|
||||
|
||||
while (arg = args.shift())
|
||||
switch (arg) {
|
||||
case '-h':
|
||||
case '--help':
|
||||
sys.print('Usage: express [options] [dir]\n')
|
||||
break
|
||||
default:
|
||||
dir = arg
|
||||
}
|
||||
|
||||
// Helpers
|
||||
// CLI
|
||||
|
||||
function confirm(msg, fn) {
|
||||
sys.print(msg)
|
||||
var stdin = process.openStdin()
|
||||
stdin.setEncoding('utf8')
|
||||
stdin.addListener('data', function(chunk){
|
||||
switch (chunk.trim().toLowerCase()) {
|
||||
case 'yes':
|
||||
case 'y':
|
||||
return stdin.destroy(), fn(true)
|
||||
case 'no':
|
||||
case 'n':
|
||||
return stdin.destroy(), fn(false)
|
||||
default:
|
||||
sys.print(msg)
|
||||
program
|
||||
.version(version)
|
||||
.option('-s, --sessions', 'add session support')
|
||||
.option('-e, --ejs', 'add ejs engine support (defaults to jade)')
|
||||
.option('-J, --jshtml', 'add jshtml engine support (defaults to jade)')
|
||||
.option('-H, --hogan', 'add hogan.js engine support')
|
||||
.option('-c, --css <engine>', 'add stylesheet <engine> support (less|stylus) (defaults to plain css)')
|
||||
.option('-f, --force', 'force on non-empty directory')
|
||||
.parse(process.argv);
|
||||
|
||||
// Path
|
||||
|
||||
var path = program.args.shift() || '.';
|
||||
|
||||
// end-of-line code
|
||||
|
||||
var eol = 'win32' == os.platform() ? '\r\n' : '\n'
|
||||
|
||||
// Template engine
|
||||
|
||||
program.template = 'jade';
|
||||
if (program.ejs) program.template = 'ejs';
|
||||
if (program.jshtml) program.template = 'jshtml';
|
||||
if (program.hogan) program.template = 'hjs';
|
||||
|
||||
/**
|
||||
* Routes index template.
|
||||
*/
|
||||
|
||||
var index = [
|
||||
''
|
||||
, '/*'
|
||||
, ' * GET home page.'
|
||||
, ' */'
|
||||
, ''
|
||||
, 'exports.index = function(req, res){'
|
||||
, ' res.render(\'index\', { title: \'Express\' });'
|
||||
, '};'
|
||||
].join(eol);
|
||||
|
||||
/**
|
||||
* Routes users template.
|
||||
*/
|
||||
|
||||
var users = [
|
||||
''
|
||||
, '/*'
|
||||
, ' * GET users listing.'
|
||||
, ' */'
|
||||
, ''
|
||||
, 'exports.list = function(req, res){'
|
||||
, ' res.send("respond with a resource");'
|
||||
, '};'
|
||||
].join(eol);
|
||||
|
||||
/**
|
||||
* Jade layout template.
|
||||
*/
|
||||
|
||||
var jadeLayout = [
|
||||
'doctype 5'
|
||||
, 'html'
|
||||
, ' head'
|
||||
, ' title= title'
|
||||
, ' link(rel=\'stylesheet\', href=\'/stylesheets/style.css\')'
|
||||
, ' body'
|
||||
, ' block content'
|
||||
].join(eol);
|
||||
|
||||
/**
|
||||
* Jade index template.
|
||||
*/
|
||||
|
||||
var jadeIndex = [
|
||||
'extends layout'
|
||||
, ''
|
||||
, 'block content'
|
||||
, ' h1= title'
|
||||
, ' p Welcome to #{title}'
|
||||
].join(eol);
|
||||
|
||||
/**
|
||||
* EJS index template.
|
||||
*/
|
||||
|
||||
var ejsIndex = [
|
||||
'<!DOCTYPE html>'
|
||||
, '<html>'
|
||||
, ' <head>'
|
||||
, ' <title><%= title %></title>'
|
||||
, ' <link rel=\'stylesheet\' href=\'/stylesheets/style.css\' />'
|
||||
, ' </head>'
|
||||
, ' <body>'
|
||||
, ' <h1><%= title %></h1>'
|
||||
, ' <p>Welcome to <%= title %></p>'
|
||||
, ' </body>'
|
||||
, '</html>'
|
||||
].join(eol);
|
||||
|
||||
/**
|
||||
* JSHTML layout template.
|
||||
*/
|
||||
|
||||
var jshtmlLayout = [
|
||||
'<!DOCTYPE html>'
|
||||
, '<html>'
|
||||
, ' <head>'
|
||||
, ' <title> @write(title) </title>'
|
||||
, ' <link rel=\'stylesheet\' href=\'/stylesheets/style.css\' />'
|
||||
, ' </head>'
|
||||
, ' <body>'
|
||||
, ' @write(body)'
|
||||
, ' </body>'
|
||||
, '</html>'
|
||||
].join(eol);
|
||||
|
||||
/**
|
||||
* JSHTML index template.
|
||||
*/
|
||||
|
||||
var jshtmlIndex = [
|
||||
'<h1>@write(title)</h1>'
|
||||
, '<p>Welcome to @write(title)</p>'
|
||||
].join(eol);
|
||||
|
||||
/**
|
||||
* Hogan.js index template.
|
||||
*/
|
||||
var hoganIndex = [
|
||||
'<!DOCTYPE html>'
|
||||
, '<html>'
|
||||
, ' <head>'
|
||||
, ' <title>{{ title }}</title>'
|
||||
, ' <link rel=\'stylesheet\' href=\'/stylesheets/style.css\' />'
|
||||
, ' </head>'
|
||||
, ' <body>'
|
||||
, ' <h1>{{ title }}</h1>'
|
||||
, ' <p>Welcome to {{ title }}</p>'
|
||||
, ' </body>'
|
||||
, '</html>'
|
||||
].join(eol);
|
||||
|
||||
/**
|
||||
* Default css template.
|
||||
*/
|
||||
|
||||
var css = [
|
||||
'body {'
|
||||
, ' padding: 50px;'
|
||||
, ' font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;'
|
||||
, '}'
|
||||
, ''
|
||||
, 'a {'
|
||||
, ' color: #00B7FF;'
|
||||
, '}'
|
||||
].join(eol);
|
||||
|
||||
/**
|
||||
* Default less template.
|
||||
*/
|
||||
|
||||
var less = [
|
||||
'body {'
|
||||
, ' padding: 50px;'
|
||||
, ' font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;'
|
||||
, '}'
|
||||
, ''
|
||||
, 'a {'
|
||||
, ' color: #00B7FF;'
|
||||
, '}'
|
||||
].join(eol);
|
||||
|
||||
/**
|
||||
* Default stylus template.
|
||||
*/
|
||||
|
||||
var stylus = [
|
||||
'body'
|
||||
, ' padding: 50px'
|
||||
, ' font: 14px "Lucida Grande", Helvetica, Arial, sans-serif'
|
||||
, 'a'
|
||||
, ' color: #00B7FF'
|
||||
].join(eol);
|
||||
|
||||
/**
|
||||
* App template.
|
||||
*/
|
||||
|
||||
var app = [
|
||||
''
|
||||
, '/**'
|
||||
, ' * Module dependencies.'
|
||||
, ' */'
|
||||
, ''
|
||||
, 'var express = require(\'express\')'
|
||||
, ' , routes = require(\'./routes\')'
|
||||
, ' , user = require(\'./routes/user\')'
|
||||
, ' , http = require(\'http\')'
|
||||
, ' , path = require(\'path\');'
|
||||
, ''
|
||||
, 'var app = express();'
|
||||
, ''
|
||||
, 'app.configure(function(){'
|
||||
, ' app.set(\'port\', process.env.PORT || 3000);'
|
||||
, ' app.set(\'views\', __dirname + \'/views\');'
|
||||
, ' app.set(\'view engine\', \':TEMPLATE\');'
|
||||
, ' app.use(express.favicon());'
|
||||
, ' app.use(express.logger(\'dev\'));'
|
||||
, ' app.use(express.bodyParser());'
|
||||
, ' app.use(express.methodOverride());{sess}'
|
||||
, ' app.use(app.router);{css}'
|
||||
, ' app.use(express.static(path.join(__dirname, \'public\')));'
|
||||
, '});'
|
||||
, ''
|
||||
, 'app.configure(\'development\', function(){'
|
||||
, ' app.use(express.errorHandler());'
|
||||
, '});'
|
||||
, ''
|
||||
, 'app.get(\'/\', routes.index);'
|
||||
, 'app.get(\'/users\', user.list);'
|
||||
, ''
|
||||
, 'http.createServer(app).listen(app.get(\'port\'), function(){'
|
||||
, ' console.log("Express server listening on port " + app.get(\'port\'));'
|
||||
, '});'
|
||||
, ''
|
||||
].join(eol);
|
||||
|
||||
// Generate application
|
||||
|
||||
(function createApplication(path) {
|
||||
emptyDirectory(path, function(empty){
|
||||
if (empty || program.force) {
|
||||
createApplicationAt(path);
|
||||
} else {
|
||||
program.confirm('destination is not empty, continue? ', function(ok){
|
||||
if (ok) {
|
||||
process.stdin.destroy();
|
||||
createApplicationAt(path);
|
||||
} else {
|
||||
abort('aborting');
|
||||
}
|
||||
});
|
||||
}
|
||||
})
|
||||
});
|
||||
})(path);
|
||||
|
||||
/**
|
||||
* Create application at the given directory `path`.
|
||||
*
|
||||
* @param {String} path
|
||||
*/
|
||||
|
||||
function createApplicationAt(path) {
|
||||
console.log();
|
||||
process.on('exit', function(){
|
||||
console.log();
|
||||
console.log(' install dependencies:');
|
||||
console.log(' $ cd %s && npm install', path);
|
||||
console.log();
|
||||
console.log(' run the app:');
|
||||
console.log(' $ node app');
|
||||
console.log();
|
||||
});
|
||||
|
||||
mkdir(path, function(){
|
||||
mkdir(path + '/public');
|
||||
mkdir(path + '/public/javascripts');
|
||||
mkdir(path + '/public/images');
|
||||
mkdir(path + '/public/stylesheets', function(){
|
||||
switch (program.css) {
|
||||
case 'less':
|
||||
write(path + '/public/stylesheets/style.less', less);
|
||||
break;
|
||||
case 'stylus':
|
||||
write(path + '/public/stylesheets/style.styl', stylus);
|
||||
break;
|
||||
default:
|
||||
write(path + '/public/stylesheets/style.css', css);
|
||||
}
|
||||
});
|
||||
|
||||
mkdir(path + '/routes', function(){
|
||||
write(path + '/routes/index.js', index);
|
||||
write(path + '/routes/user.js', users);
|
||||
});
|
||||
|
||||
mkdir(path + '/views', function(){
|
||||
switch (program.template) {
|
||||
case 'ejs':
|
||||
write(path + '/views/index.ejs', ejsIndex);
|
||||
break;
|
||||
case 'jade':
|
||||
write(path + '/views/layout.jade', jadeLayout);
|
||||
write(path + '/views/index.jade', jadeIndex);
|
||||
break;
|
||||
case 'jshtml':
|
||||
write(path + '/views/layout.jshtml', jshtmlLayout);
|
||||
write(path + '/views/index.jshtml', jshtmlIndex);
|
||||
break;
|
||||
case 'hjs':
|
||||
write(path + '/views/index.hjs', hoganIndex);
|
||||
break;
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
// CSS Engine support
|
||||
switch (program.css) {
|
||||
case 'less':
|
||||
app = app.replace('{css}', eol + ' app.use(require(\'less-middleware\')({ src: __dirname + \'/public\' }));');
|
||||
break;
|
||||
case 'stylus':
|
||||
app = app.replace('{css}', eol + ' app.use(require(\'stylus\').middleware(__dirname + \'/public\'));');
|
||||
break;
|
||||
default:
|
||||
app = app.replace('{css}', '');
|
||||
}
|
||||
|
||||
// Session support
|
||||
app = app.replace('{sess}', program.sessions
|
||||
? eol + ' app.use(express.cookieParser(\'your secret here\'));' + eol + ' app.use(express.session());'
|
||||
: '');
|
||||
|
||||
// Template support
|
||||
app = app.replace(':TEMPLATE', program.template);
|
||||
|
||||
// package.json
|
||||
var pkg = {
|
||||
name: 'application-name'
|
||||
, version: '0.0.1'
|
||||
, private: true
|
||||
, scripts: { start: 'node app' }
|
||||
, dependencies: {
|
||||
express: version
|
||||
}
|
||||
}
|
||||
|
||||
if (program.template) pkg.dependencies[program.template] = '*';
|
||||
|
||||
// CSS Engine support
|
||||
switch (program.css) {
|
||||
case 'less':
|
||||
pkg.dependencies['less-middleware'] = '*';
|
||||
break;
|
||||
default:
|
||||
if (program.css) {
|
||||
pkg.dependencies[program.css] = '*';
|
||||
}
|
||||
}
|
||||
|
||||
write(path + '/package.json', JSON.stringify(pkg, null, 2));
|
||||
write(path + '/app.js', app);
|
||||
});
|
||||
}
|
||||
|
||||
function createTemplateIn(dir, mode) {
|
||||
fs.writeFile(dir + '/app.js', '// your app here')
|
||||
fs.mkdir(dir + '/views', mode)
|
||||
fs.mkdir(dir + '/public', mode, function(err){
|
||||
if (err) throw err
|
||||
fs.mkdir(dir + '/public/javascripts', mode)
|
||||
fs.mkdir(dir + '/public/stylesheets', mode)
|
||||
fs.mkdir(dir + '/public/images', mode)
|
||||
})
|
||||
/**
|
||||
* Check if the given directory `path` is empty.
|
||||
*
|
||||
* @param {String} path
|
||||
* @param {Function} fn
|
||||
*/
|
||||
|
||||
function emptyDirectory(path, fn) {
|
||||
fs.readdir(path, function(err, files){
|
||||
if (err && 'ENOENT' != err.code) throw err;
|
||||
fn(!files || !files.length);
|
||||
});
|
||||
}
|
||||
|
||||
// Setup template
|
||||
/**
|
||||
* echo str > path.
|
||||
*
|
||||
* @param {String} path
|
||||
* @param {String} str
|
||||
*/
|
||||
|
||||
fs.readdir(dir, function(err, files){
|
||||
if (err) throw err
|
||||
if (files.length)
|
||||
confirm(dir + ' is not empty, continue? ', function(ok){
|
||||
if (ok) createTemplateIn(dir, 0666)
|
||||
})
|
||||
else
|
||||
createTemplateIn(dir, 0666)
|
||||
})
|
||||
function write(path, str) {
|
||||
fs.writeFile(path, str);
|
||||
console.log(' \x1b[36mcreate\x1b[0m : ' + path);
|
||||
}
|
||||
|
||||
/**
|
||||
* Mkdir -p.
|
||||
*
|
||||
* @param {String} path
|
||||
* @param {Function} fn
|
||||
*/
|
||||
|
||||
function mkdir(path, fn) {
|
||||
mkdirp(path, 0755, function(err){
|
||||
if (err) throw err;
|
||||
console.log(' \033[36mcreate\033[0m : ' + path);
|
||||
fn && fn();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Exit with the given `str`.
|
||||
*
|
||||
* @param {String} str
|
||||
*/
|
||||
|
||||
function abort(str) {
|
||||
console.error(str);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
25
client.js
Normal file
25
client.js
Normal file
@@ -0,0 +1,25 @@
|
||||
|
||||
var http = require('http');
|
||||
|
||||
var times = 50;
|
||||
|
||||
while (times--) {
|
||||
var req = http.request({
|
||||
port: 3000
|
||||
, method: 'POST'
|
||||
, headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
|
||||
});
|
||||
|
||||
req.on('response', function(res){
|
||||
console.log(res.statusCode);
|
||||
});
|
||||
|
||||
var n = 500000;
|
||||
while (n--) {
|
||||
req.write('foo=bar&bar=baz&');
|
||||
}
|
||||
|
||||
req.write('foo=bar&bar=baz');
|
||||
|
||||
req.end();
|
||||
}
|
||||
124
examples/auth/app.js
Normal file
124
examples/auth/app.js
Normal file
@@ -0,0 +1,124 @@
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var express = require('../..')
|
||||
, hash = require('./pass').hash;
|
||||
|
||||
var app = module.exports = express();
|
||||
|
||||
// config
|
||||
|
||||
app.set('view engine', 'ejs');
|
||||
app.set('views', __dirname + '/views');
|
||||
|
||||
// middleware
|
||||
|
||||
app.use(express.bodyParser());
|
||||
app.use(express.cookieParser('shhhh, very secret'));
|
||||
app.use(express.session());
|
||||
|
||||
// Session-persisted message middleware
|
||||
|
||||
app.use(function(req, res, next){
|
||||
var err = req.session.error
|
||||
, msg = req.session.success;
|
||||
delete req.session.error;
|
||||
delete req.session.success;
|
||||
res.locals.message = '';
|
||||
if (err) res.locals.message = '<p class="msg error">' + err + '</p>';
|
||||
if (msg) res.locals.message = '<p class="msg success">' + msg + '</p>';
|
||||
next();
|
||||
});
|
||||
|
||||
// dummy database
|
||||
|
||||
var users = {
|
||||
tj: { name: 'tj' }
|
||||
};
|
||||
|
||||
// when you create a user, generate a salt
|
||||
// and hash the password ('foobar' is the pass here)
|
||||
|
||||
hash('foobar', function(err, salt, hash){
|
||||
if (err) throw err;
|
||||
// store the salt & hash in the "db"
|
||||
users.tj.salt = salt;
|
||||
users.tj.hash = hash;
|
||||
});
|
||||
|
||||
|
||||
// Authenticate using our plain-object database of doom!
|
||||
|
||||
function authenticate(name, pass, fn) {
|
||||
if (!module.parent) console.log('authenticating %s:%s', name, pass);
|
||||
var user = users[name];
|
||||
// query the db for the given username
|
||||
if (!user) return fn(new Error('cannot find user'));
|
||||
// apply the same algorithm to the POSTed password, applying
|
||||
// the hash against the pass / salt, if there is a match we
|
||||
// found the user
|
||||
hash(pass, user.salt, function(err, hash){
|
||||
if (err) return fn(err);
|
||||
if (hash == user.hash) return fn(null, user);
|
||||
fn(new Error('invalid password'));
|
||||
})
|
||||
}
|
||||
|
||||
function restrict(req, res, next) {
|
||||
if (req.session.user) {
|
||||
next();
|
||||
} else {
|
||||
req.session.error = 'Access denied!';
|
||||
res.redirect('/login');
|
||||
}
|
||||
}
|
||||
|
||||
app.get('/', function(req, res){
|
||||
res.redirect('login');
|
||||
});
|
||||
|
||||
app.get('/restricted', restrict, function(req, res){
|
||||
res.send('Wahoo! restricted area, click to <a href="/logout">logout</a>');
|
||||
});
|
||||
|
||||
app.get('/logout', function(req, res){
|
||||
// destroy the user's session to log them out
|
||||
// will be re-created next request
|
||||
req.session.destroy(function(){
|
||||
res.redirect('/');
|
||||
});
|
||||
});
|
||||
|
||||
app.get('/login', function(req, res){
|
||||
res.render('login');
|
||||
});
|
||||
|
||||
app.post('/login', function(req, res){
|
||||
authenticate(req.body.username, req.body.password, function(err, user){
|
||||
if (user) {
|
||||
// Regenerate session when signing in
|
||||
// to prevent fixation
|
||||
req.session.regenerate(function(){
|
||||
// Store the user's primary key
|
||||
// in the session store to be retrieved,
|
||||
// or in this case the entire user object
|
||||
req.session.user = user;
|
||||
req.session.success = 'Authenticated as ' + user.name
|
||||
+ ' click to <a href="/logout">logout</a>. '
|
||||
+ ' You may now access <a href="/restricted">/restricted</a>.';
|
||||
res.redirect('back');
|
||||
});
|
||||
} else {
|
||||
req.session.error = 'Authentication failed, please check your '
|
||||
+ ' username and password.'
|
||||
+ ' (use "tj" and "foobar")';
|
||||
res.redirect('login');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
if (!module.parent) {
|
||||
app.listen(3000);
|
||||
console.log('Express started on port 3000');
|
||||
}
|
||||
46
examples/auth/pass.js
Normal file
46
examples/auth/pass.js
Normal file
@@ -0,0 +1,46 @@
|
||||
|
||||
// check out https://github.com/visionmedia/node-pwd
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var crypto = require('crypto');
|
||||
|
||||
/**
|
||||
* Bytesize.
|
||||
*/
|
||||
|
||||
var len = 128;
|
||||
|
||||
/**
|
||||
* Iterations. ~300ms
|
||||
*/
|
||||
|
||||
var iterations = 12000;
|
||||
|
||||
/**
|
||||
* Hashes a password with optional `salt`, otherwise
|
||||
* generate a salt for `pass` and invoke `fn(err, salt, hash)`.
|
||||
*
|
||||
* @param {String} password to hash
|
||||
* @param {String} optional salt
|
||||
* @param {Function} callback
|
||||
* @api public
|
||||
*/
|
||||
|
||||
exports.hash = function (pwd, salt, fn) {
|
||||
if (3 == arguments.length) {
|
||||
crypto.pbkdf2(pwd, salt, iterations, len, fn);
|
||||
} else {
|
||||
fn = salt;
|
||||
crypto.randomBytes(len, function(err, salt){
|
||||
if (err) return fn(err);
|
||||
salt = salt.toString('base64');
|
||||
crypto.pbkdf2(pwd, salt, iterations, len, function(err, hash){
|
||||
if (err) return fn(err);
|
||||
fn(null, salt, hash);
|
||||
});
|
||||
});
|
||||
}
|
||||
};
|
||||
2
examples/auth/views/foot.ejs
Normal file
2
examples/auth/views/foot.ejs
Normal file
@@ -0,0 +1,2 @@
|
||||
</body>
|
||||
</html>
|
||||
18
examples/auth/views/head.ejs
Normal file
18
examples/auth/views/head.ejs
Normal file
@@ -0,0 +1,18 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title><%= title %></title>
|
||||
<style>
|
||||
body {
|
||||
padding: 50px;
|
||||
font: 13px Helvetica, Arial, sans-serif;
|
||||
}
|
||||
.error {
|
||||
color: red
|
||||
}
|
||||
.success {
|
||||
color: green;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
22
examples/auth/views/login.ejs
Normal file
22
examples/auth/views/login.ejs
Normal file
@@ -0,0 +1,22 @@
|
||||
|
||||
<% var title = 'Authentication Example' %>
|
||||
<% include head %>
|
||||
|
||||
<h1>Login</h1>
|
||||
<%- message %>
|
||||
Try accessing <a href="/restricted">/restricted</a>, then authenticate with "tj" and "foobar".
|
||||
<form method="post" action="/login">
|
||||
<p>
|
||||
<label>Username:</label>
|
||||
<input type="text" name="username">
|
||||
</p>
|
||||
<p>
|
||||
<label>Password:</label>
|
||||
<input type="text" name="password">
|
||||
</p>
|
||||
<p>
|
||||
<input type="submit" value="Login">
|
||||
</p>
|
||||
</form>
|
||||
|
||||
<% include foot %>
|
||||
24
examples/big-view/index.js
Normal file
24
examples/big-view/index.js
Normal file
@@ -0,0 +1,24 @@
|
||||
|
||||
var express = require('../..')
|
||||
, app = express();
|
||||
|
||||
app.set('views', __dirname);
|
||||
app.set('view engine', 'jade');
|
||||
|
||||
var pets = [];
|
||||
|
||||
var n = 1000;
|
||||
while (n--) {
|
||||
pets.push({ name: 'Tobi', age: 2, species: 'ferret' });
|
||||
pets.push({ name: 'Loki', age: 1, species: 'ferret' });
|
||||
pets.push({ name: 'Jane', age: 6, species: 'ferret' });
|
||||
}
|
||||
|
||||
app.use(express.logger('dev'));
|
||||
|
||||
app.get('/', function(req, res){
|
||||
res.render('pets', { pets: pets });
|
||||
});
|
||||
|
||||
app.listen(3000);
|
||||
console.log('Express listening on port 3000');
|
||||
12
examples/big-view/pets.jade
Normal file
12
examples/big-view/pets.jade
Normal file
@@ -0,0 +1,12 @@
|
||||
style
|
||||
body {
|
||||
padding: 50px;
|
||||
font: 16px "Helvetica Neue", Helvetica;
|
||||
}
|
||||
|
||||
table
|
||||
for pet in pets
|
||||
tr
|
||||
td= pet.name
|
||||
td= pet.age
|
||||
td= pet.species
|
||||
@@ -1,80 +0,0 @@
|
||||
|
||||
require.paths.unshift('lib')
|
||||
require('express')
|
||||
require('express/plugins')
|
||||
|
||||
var messages = [],
|
||||
utils = require('express/utils'),
|
||||
http = require('express/http')
|
||||
|
||||
configure(function(){
|
||||
use(Logger)
|
||||
use(MethodOverride)
|
||||
use(ContentLength)
|
||||
use(Cookie)
|
||||
use(Cache, { lifetime: (5).minutes, reapInterval: (1).minute })
|
||||
use(Session, { lifetime: (15).minutes, reapInterval: (1).minute })
|
||||
use(Static)
|
||||
set('root', __dirname)
|
||||
})
|
||||
|
||||
get('/', function(){
|
||||
this.pass('/chat')
|
||||
})
|
||||
|
||||
get('/chat', function(){
|
||||
var self = this
|
||||
Session.store.length(function(err, len){
|
||||
self.render('chat.html.haml', {
|
||||
locals: {
|
||||
title: 'Chat',
|
||||
messages: messages,
|
||||
name: self.session.name,
|
||||
usersOnline: len
|
||||
}
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
post('/chat', function(){
|
||||
this.session.name = this.param('name')
|
||||
messages
|
||||
.push(utils.escape(this.param('name')) + ': ' + utils.escape(this.param('message'))
|
||||
.replace(/(http:\/\/[^\s]+)/g, '<a href="$1" target="express-chat">$1</a>')
|
||||
.replace(/:\)/g, '<img src="http://icons3.iconfinder.netdna-cdn.com/data/icons/ledicons/emoticon_smile.png">'))
|
||||
this.halt(200)
|
||||
})
|
||||
|
||||
get('/chat/messages', function(){
|
||||
var self = this,
|
||||
previousLength = messages.length,
|
||||
timer = setInterval(function(){
|
||||
if (messages.length > previousLength)
|
||||
self.contentType('json'),
|
||||
previousLength = messages.length,
|
||||
self.halt(200, JSON.encode(messages)),
|
||||
clearInterval(timer)
|
||||
}, 100)
|
||||
})
|
||||
|
||||
get('/*.css', function(file){
|
||||
this.render(file + '.css.sass', { layout: false })
|
||||
})
|
||||
|
||||
get('/error/view', function(){
|
||||
this.render('does.not.exist')
|
||||
})
|
||||
|
||||
get('/error', function(){
|
||||
throw new Error('oh noes!')
|
||||
})
|
||||
|
||||
get('/simple', function(){
|
||||
return 'Hello :)'
|
||||
})
|
||||
|
||||
get('/favicon.ico', function(){
|
||||
this.halt()
|
||||
})
|
||||
|
||||
run()
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 5.2 KiB |
@@ -1,28 +0,0 @@
|
||||
|
||||
$(function(){
|
||||
// Send message
|
||||
$('form').submit(function(){
|
||||
var message = $('input[name=message]'),
|
||||
name = $('input[name=name]')
|
||||
if (message.val())
|
||||
$.post('/chat', { name: name.val(), message: message.val() }, function(){
|
||||
message.val('')
|
||||
})
|
||||
else
|
||||
message.css('border', '1px solid red')
|
||||
return false
|
||||
})
|
||||
|
||||
// Longpoll
|
||||
;(function poll(){
|
||||
$.getJSON('/chat/messages', function(messages){
|
||||
$('#messages').empty()
|
||||
$.each(messages, function(i, msg){
|
||||
$('#messages')
|
||||
.append('<li>' + msg + '</li>')
|
||||
.get(0).scrollTop = $('#messages').get(0).scrollHeight
|
||||
})
|
||||
poll()
|
||||
})
|
||||
})()
|
||||
})
|
||||
19
examples/chat/public/javascripts/jquery.js
vendored
19
examples/chat/public/javascripts/jquery.js
vendored
File diff suppressed because one or more lines are too long
@@ -1,9 +0,0 @@
|
||||
%h1 Chat
|
||||
%img.bubble{ src: '/public/images/bubble.png' }
|
||||
%ul#messages
|
||||
!= this.partial('message.html.haml', { collection: messages })
|
||||
%form{ method: 'post' }
|
||||
%input{ type: 'hidden', name: '_method', value: 'put' }
|
||||
%input{ type: 'text', name: 'name', value: name || 'guest' }
|
||||
%input{ type: 'text', name: 'message' }
|
||||
%input{ type: 'submit', value: 'Send' }
|
||||
@@ -1,12 +0,0 @@
|
||||
%html
|
||||
%head
|
||||
%title= title
|
||||
%script{ src: '/public/javascripts/jquery.js' }
|
||||
%script{ src: '/public/javascripts/app.js' }
|
||||
%link{ rel: 'stylesheet', href: '/style.css' }
|
||||
%body
|
||||
#wrapper
|
||||
!= body
|
||||
#online
|
||||
Online:
|
||||
%strong= usersOnline
|
||||
@@ -1 +0,0 @@
|
||||
%li= message
|
||||
@@ -1,81 +0,0 @@
|
||||
body
|
||||
:font-family "Helvetica Neue", "Lucida Grande", "Arial"
|
||||
:font-size 13px
|
||||
:text-align center
|
||||
=text-stroke 1px rgba(255, 255, 255, 0.1)
|
||||
:color #555
|
||||
|
||||
h1, h2
|
||||
:margin 0
|
||||
:font-size 22px
|
||||
:color #343434
|
||||
h1
|
||||
:text-shadow 1px 2px 2px #ddd
|
||||
:font-size 60px
|
||||
|
||||
img.bubble
|
||||
:position absolute
|
||||
:top -25px
|
||||
:left 120px
|
||||
|
||||
#wrapper
|
||||
:position relative
|
||||
:margin 100px auto
|
||||
:width 500px
|
||||
:text-align left
|
||||
|
||||
ul
|
||||
:margin 0
|
||||
:padding 0
|
||||
:max-height 300px
|
||||
:overflow-x hidden
|
||||
li
|
||||
:margin 5px 0
|
||||
:padding 3px 8px
|
||||
:list-style none
|
||||
:border 1px solid #eee
|
||||
=border-radius 3px
|
||||
=border-radius 3px
|
||||
li:hover
|
||||
:cursor pointer
|
||||
:color #2E2E2E
|
||||
|
||||
input[type=text]
|
||||
:padding 5px
|
||||
:border 1px solid #ddd
|
||||
:outline none
|
||||
=border-radius 2px
|
||||
input[type=text]:focus
|
||||
:border-color #00C3FF
|
||||
|
||||
input[type=submit]
|
||||
=border-radius 2px
|
||||
=box-shadow 0 1px 2px #ddd
|
||||
:padding 6px 10px
|
||||
:border solid 1px #999
|
||||
:background -webkit-gradient(linear, 0% 0%, 0% 100%, from(#fff), to(#ddd))
|
||||
:color #333
|
||||
:text-decoration none
|
||||
:cursor pointer
|
||||
:display inline-block
|
||||
:text-align center
|
||||
:text-shadow 0px 1px 1px #fff
|
||||
:line-height 1
|
||||
input[type=submit]:hover
|
||||
:background -webkit-gradient(linear, 0% 0%, 0% 100%, from(#fff), to(#E6E4E4))
|
||||
input[type=submit]:active
|
||||
:background -webkit-gradient(linear, 0% 0%, 0% 100%, from(#fff), to(#c7c7c7))
|
||||
input[name=name]
|
||||
:width 80px
|
||||
|
||||
a
|
||||
:color #1ABFF1
|
||||
=transition-property padding
|
||||
=transition-duration 0.15s
|
||||
a:hover
|
||||
:padding 0 5px
|
||||
a:hover:before
|
||||
:content 'visit: '
|
||||
|
||||
#online
|
||||
:font-size 12px
|
||||
@@ -1,38 +0,0 @@
|
||||
|
||||
require.paths.unshift 'lib'
|
||||
require 'express'
|
||||
require 'express/plugins'
|
||||
|
||||
sys: require 'sys'
|
||||
|
||||
configure ->
|
||||
use MethodOverride
|
||||
use ContentLength
|
||||
use Cookie
|
||||
use Session
|
||||
use Flash
|
||||
use Logger
|
||||
use Static
|
||||
set 'root', __dirname
|
||||
set 'views', __dirname + '/../upload/views'
|
||||
|
||||
get '/', ->
|
||||
@redirect('/upload')
|
||||
|
||||
get '/upload', ->
|
||||
@render 'upload.html.haml', {
|
||||
locals: {
|
||||
flashes: @flash 'info'
|
||||
}
|
||||
}
|
||||
|
||||
post '/upload', ->
|
||||
@param('images').each (image) =>
|
||||
sys.puts image.filename + ' -> ' + image.tempfile
|
||||
@flash 'info', 'Uploaded ' + image.filename
|
||||
@redirect '/upload'
|
||||
|
||||
get '/*.css', (file) ->
|
||||
@render file + '.css.sass', { layout: no }
|
||||
|
||||
run()
|
||||
File diff suppressed because one or more lines are too long
8
examples/content-negotiation/db.js
Normal file
8
examples/content-negotiation/db.js
Normal file
@@ -0,0 +1,8 @@
|
||||
|
||||
var users = [];
|
||||
|
||||
users.push({ name: 'Tobi' });
|
||||
users.push({ name: 'Loki' });
|
||||
users.push({ name: 'Jane' });
|
||||
|
||||
module.exports = users;
|
||||
41
examples/content-negotiation/index.js
Normal file
41
examples/content-negotiation/index.js
Normal file
@@ -0,0 +1,41 @@
|
||||
|
||||
var express = require('../../')
|
||||
, app = module.exports = express()
|
||||
, users = require('./db');
|
||||
|
||||
app.get('/', function(req, res){
|
||||
res.format({
|
||||
html: function(){
|
||||
res.send('<ul>' + users.map(function(user){
|
||||
return '<li>' + user.name + '</li>';
|
||||
}).join('') + '</ul>');
|
||||
},
|
||||
|
||||
text: function(){
|
||||
res.send(users.map(function(user){
|
||||
return ' - ' + user.name + '\n';
|
||||
}).join(''));
|
||||
},
|
||||
|
||||
json: function(){
|
||||
res.json(users);
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
// or you could write a tiny middleware like
|
||||
// this to abstract make things a bit more declarative:
|
||||
|
||||
function format(mod) {
|
||||
var obj = require(mod);
|
||||
return function(req, res){
|
||||
res.format(obj);
|
||||
}
|
||||
}
|
||||
|
||||
app.get('/users', format('./users'));
|
||||
|
||||
if (!module.parent) {
|
||||
app.listen(3000);
|
||||
console.log('listening on port 3000');
|
||||
}
|
||||
18
examples/content-negotiation/users.js
Normal file
18
examples/content-negotiation/users.js
Normal file
@@ -0,0 +1,18 @@
|
||||
|
||||
var users = require('./db');
|
||||
|
||||
exports.html = function(req, res){
|
||||
res.send('<ul>' + users.map(function(user){
|
||||
return '<li>' + user.name + '</li>';
|
||||
}).join('') + '</ul>');
|
||||
};
|
||||
|
||||
exports.text = function(req, res){
|
||||
res.send(users.map(function(user){
|
||||
return ' - ' + user.name + '\n';
|
||||
}).join(''));
|
||||
};
|
||||
|
||||
exports.json = function(req, res){
|
||||
res.json(users);
|
||||
};
|
||||
32
examples/cookie-sessions/index.js
Normal file
32
examples/cookie-sessions/index.js
Normal file
@@ -0,0 +1,32 @@
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var express = require('../../');
|
||||
|
||||
var app = module.exports = express();
|
||||
|
||||
// ignore GET /favicon.ico
|
||||
app.use(express.favicon());
|
||||
|
||||
// pass a secret to cookieParser() for signed cookies
|
||||
app.use(express.cookieParser('manny is cool'));
|
||||
|
||||
// add req.session cookie support
|
||||
app.use(express.cookieSession());
|
||||
|
||||
// do something with the session
|
||||
app.use(count);
|
||||
|
||||
// custom middleware
|
||||
function count(req, res) {
|
||||
req.session.count = req.session.count || 0;
|
||||
var n = req.session.count++;
|
||||
res.send('viewed ' + n + ' times\n');
|
||||
}
|
||||
|
||||
if (!module.parent) {
|
||||
app.listen(3000);
|
||||
console.log('Express server listening on port 3000');
|
||||
}
|
||||
54
examples/cookies/app.js
Normal file
54
examples/cookies/app.js
Normal file
@@ -0,0 +1,54 @@
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var express = require('../../')
|
||||
, app = module.exports = express();
|
||||
|
||||
|
||||
// add favicon() before logger() so
|
||||
// GET /favicon.ico requests are not
|
||||
// logged, because this middleware
|
||||
// reponds to /favicon.ico and does not
|
||||
// call next()
|
||||
app.use(express.favicon());
|
||||
|
||||
// custom log format
|
||||
if ('test' != process.env.NODE_ENV)
|
||||
app.use(express.logger(':method :url'));
|
||||
|
||||
// parses request cookies, populating
|
||||
// req.cookies and req.signedCookies
|
||||
// when the secret is passed, used
|
||||
// for signing the cookies.
|
||||
app.use(express.cookieParser('my secret here'));
|
||||
|
||||
// parses json, x-www-form-urlencoded, and multipart/form-data
|
||||
app.use(express.bodyParser());
|
||||
|
||||
app.get('/', function(req, res){
|
||||
if (req.cookies.remember) {
|
||||
res.send('Remembered :). Click to <a href="/forget">forget</a>!.');
|
||||
} else {
|
||||
res.send('<form method="post"><p>Check to <label>'
|
||||
+ '<input type="checkbox" name="remember"/> remember me</label> '
|
||||
+ '<input type="submit" value="Submit"/>.</p></form>');
|
||||
}
|
||||
});
|
||||
|
||||
app.get('/forget', function(req, res){
|
||||
res.clearCookie('remember');
|
||||
res.redirect('back');
|
||||
});
|
||||
|
||||
app.post('/', function(req, res){
|
||||
var minute = 60000;
|
||||
if (req.body.remember) res.cookie('remember', 1, { maxAge: minute });
|
||||
res.redirect('back');
|
||||
});
|
||||
|
||||
if (!module.parent){
|
||||
app.listen(3000);
|
||||
console.log('Express started on port 3000');
|
||||
}
|
||||
46
examples/cors/index.js
Normal file
46
examples/cors/index.js
Normal file
@@ -0,0 +1,46 @@
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var express = require('../..')
|
||||
, app = express()
|
||||
, api = express();
|
||||
|
||||
// app middleware
|
||||
|
||||
app.use(express.static(__dirname + '/public'));
|
||||
|
||||
// api middleware
|
||||
|
||||
api.use(express.logger('dev'));
|
||||
api.use(express.bodyParser());
|
||||
|
||||
/**
|
||||
* CORS support.
|
||||
*/
|
||||
|
||||
api.all('*', function(req, res, next){
|
||||
// use "*" here to accept any origin
|
||||
res.set('Access-Control-Allow-Origin', 'http://localhost:3000');
|
||||
res.set('Access-Control-Allow-Methods', 'GET, POST');
|
||||
res.set('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type');
|
||||
// res.set('Access-Control-Allow-Max-Age', 3600);
|
||||
if ('OPTIONS' == req.method) return res.send(200);
|
||||
next();
|
||||
});
|
||||
|
||||
/**
|
||||
* POST a user.
|
||||
*/
|
||||
|
||||
api.post('/user', function(req, res){
|
||||
console.log(req.body);
|
||||
res.send(201);
|
||||
});
|
||||
|
||||
app.listen(3000);
|
||||
api.listen(3001);
|
||||
|
||||
console.log('app listening on 3000');
|
||||
console.log('api listening on 3001');
|
||||
12
examples/cors/public/index.html
Normal file
12
examples/cors/public/index.html
Normal file
@@ -0,0 +1,12 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<body>
|
||||
<script>
|
||||
var req = new XMLHttpRequest;
|
||||
req.open('POST', 'http://localhost:3001/user', false);
|
||||
req.setRequestHeader('Content-Type', 'application/json');
|
||||
req.send('{"name":"tobi","species":"ferret"}');
|
||||
console.log(req.responseText);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
44
examples/downloads/app.js
Normal file
44
examples/downloads/app.js
Normal file
@@ -0,0 +1,44 @@
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var express = require('../../')
|
||||
, app = module.exports = express();
|
||||
|
||||
app.get('/', function(req, res){
|
||||
res.send('<ul>'
|
||||
+ '<li>Download <a href="/files/amazing.txt">amazing.txt</a>.</li>'
|
||||
+ '<li>Download <a href="/files/missing.txt">missing.txt</a>.</li>'
|
||||
+ '</ul>');
|
||||
});
|
||||
|
||||
// /files/* is accessed via req.params[0]
|
||||
// but here we name it :file
|
||||
app.get('/files/:file(*)', function(req, res, next){
|
||||
var file = req.params.file
|
||||
, path = __dirname + '/files/' + file;
|
||||
|
||||
res.download(path);
|
||||
});
|
||||
|
||||
// error handling middleware. Because it's
|
||||
// below our routes, you will be able to
|
||||
// "intercept" errors, otherwise Connect
|
||||
// will respond with 500 "Internal Server Error".
|
||||
app.use(function(err, req, res, next){
|
||||
// special-case 404s,
|
||||
// remember you could
|
||||
// render a 404 template here
|
||||
if (404 == err.status) {
|
||||
res.statusCode = 404;
|
||||
res.send('Cant find that file, sorry!');
|
||||
} else {
|
||||
next(err);
|
||||
}
|
||||
});
|
||||
|
||||
if (!module.parent) {
|
||||
app.listen(3000);
|
||||
console.log('Express started on port 3000');
|
||||
}
|
||||
1
examples/downloads/files/amazing.txt
Normal file
1
examples/downloads/files/amazing.txt
Normal file
@@ -0,0 +1 @@
|
||||
what an amazing download
|
||||
50
examples/ejs/index.js
Normal file
50
examples/ejs/index.js
Normal file
@@ -0,0 +1,50 @@
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var express = require('../../');
|
||||
|
||||
var app = module.exports = express();
|
||||
|
||||
// Register ejs as .html. If we did
|
||||
// not call this, we would need to
|
||||
// name our views foo.ejs instead
|
||||
// of foo.html. The __express method
|
||||
// is simply a function that engines
|
||||
// use to hook into the Express view
|
||||
// system by default, so if we want
|
||||
// to change "foo.ejs" to "foo.html"
|
||||
// we simply pass _any_ function, in this
|
||||
// case `ejs.__express`.
|
||||
|
||||
app.engine('.html', require('ejs').__express);
|
||||
|
||||
// Optional since express defaults to CWD/views
|
||||
|
||||
app.set('views', __dirname + '/views');
|
||||
|
||||
// Without this you would need to
|
||||
// supply the extension to res.render()
|
||||
// ex: res.render('users.html').
|
||||
app.set('view engine', 'html');
|
||||
|
||||
// Dummy users
|
||||
var users = [
|
||||
{ name: 'tobi', email: 'tobi@learnboost.com' },
|
||||
{ name: 'loki', email: 'loki@learnboost.com' },
|
||||
{ name: 'jane', email: 'jane@learnboost.com' }
|
||||
];
|
||||
|
||||
app.get('/', function(req, res){
|
||||
res.render('users', {
|
||||
users: users,
|
||||
title: "EJS example",
|
||||
header: "Some users"
|
||||
});
|
||||
});
|
||||
|
||||
if (!module.parent) {
|
||||
app.listen(3000);
|
||||
console.log('Express app started on port 3000');
|
||||
}
|
||||
2
examples/ejs/views/footer.html
Normal file
2
examples/ejs/views/footer.html
Normal file
@@ -0,0 +1,2 @@
|
||||
</body>
|
||||
</html>
|
||||
13
examples/ejs/views/header.html
Normal file
13
examples/ejs/views/header.html
Normal file
@@ -0,0 +1,13 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title> <%= title %> </title>
|
||||
<style type="text/css">
|
||||
body {
|
||||
padding: 50px;
|
||||
font: 13px Helvetica, Arial, sans-serif;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
10
examples/ejs/views/users.html
Normal file
10
examples/ejs/views/users.html
Normal file
@@ -0,0 +1,10 @@
|
||||
<% include header.html %>
|
||||
|
||||
<h1>Users</h1>
|
||||
<ul id="users">
|
||||
<% users.forEach(function(user){ %>
|
||||
<li><%= user.name %> <<%= user.email %>></li>
|
||||
<% }) %>
|
||||
</ul>
|
||||
|
||||
<% include footer.html %>
|
||||
112
examples/error-pages/index.js
Normal file
112
examples/error-pages/index.js
Normal file
@@ -0,0 +1,112 @@
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var express = require('../../')
|
||||
, app = module.exports = express()
|
||||
, silent = 'test' == process.env.NODE_ENV;
|
||||
|
||||
// general config
|
||||
app.set('views', __dirname + '/views');
|
||||
app.set('view engine', 'jade');
|
||||
|
||||
// our custom "verbose errors" setting
|
||||
// which we can use in the templates
|
||||
// via settings['verbose errors']
|
||||
app.enable('verbose errors');
|
||||
|
||||
// disable them in production
|
||||
// use $ NODE_ENV=production node examples/error-pages
|
||||
if ('production' == app.settings.env) {
|
||||
app.disable('verbose errors');
|
||||
}
|
||||
|
||||
app.use(express.favicon());
|
||||
|
||||
silent || app.use(express.logger('dev'));
|
||||
|
||||
// "app.router" positions our routes
|
||||
// above the middleware defined below,
|
||||
// this means that Express will attempt
|
||||
// to match & call routes _before_ continuing
|
||||
// on, at which point we assume it's a 404 because
|
||||
// no route has handled the request.
|
||||
|
||||
app.use(app.router);
|
||||
|
||||
// Since this is the last non-error-handling
|
||||
// middleware use()d, we assume 404, as nothing else
|
||||
// responded.
|
||||
|
||||
// $ curl http://localhost:3000/notfound
|
||||
// $ curl http://localhost:3000/notfound -H "Accept: application/json"
|
||||
// $ curl http://localhost:3000/notfound -H "Accept: text/plain"
|
||||
|
||||
app.use(function(req, res, next){
|
||||
res.status(404);
|
||||
|
||||
// respond with html page
|
||||
if (req.accepts('html')) {
|
||||
res.render('404', { url: req.url });
|
||||
return;
|
||||
}
|
||||
|
||||
// respond with json
|
||||
if (req.accepts('json')) {
|
||||
res.send({ error: 'Not found' });
|
||||
return;
|
||||
}
|
||||
|
||||
// default to plain-text. send()
|
||||
res.type('txt').send('Not found');
|
||||
});
|
||||
|
||||
// error-handling middleware, take the same form
|
||||
// as regular middleware, however they require an
|
||||
// arity of 4, aka the signature (err, req, res, next).
|
||||
// when connect has an error, it will invoke ONLY error-handling
|
||||
// middleware.
|
||||
|
||||
// If we were to next() here any remaining non-error-handling
|
||||
// middleware would then be executed, or if we next(err) to
|
||||
// continue passing the error, only error-handling middleware
|
||||
// would remain being executed, however here
|
||||
// we simply respond with an error page.
|
||||
|
||||
app.use(function(err, req, res, next){
|
||||
// we may use properties of the error object
|
||||
// here and next(err) appropriately, or if
|
||||
// we possibly recovered from the error, simply next().
|
||||
res.status(err.status || 500);
|
||||
res.render('500', { error: err });
|
||||
});
|
||||
|
||||
// Routes
|
||||
|
||||
app.get('/', function(req, res){
|
||||
res.render('index.jade');
|
||||
});
|
||||
|
||||
app.get('/404', function(req, res, next){
|
||||
// trigger a 404 since no other middleware
|
||||
// will match /404 after this one, and we're not
|
||||
// responding here
|
||||
next();
|
||||
});
|
||||
|
||||
app.get('/403', function(req, res, next){
|
||||
// trigger a 403 error
|
||||
var err = new Error('not allowed!');
|
||||
err.status = 403;
|
||||
next(err);
|
||||
});
|
||||
|
||||
app.get('/500', function(req, res, next){
|
||||
// trigger a generic (500) error
|
||||
next(new Error('keyboard cat!'));
|
||||
});
|
||||
|
||||
if (!module.parent) {
|
||||
app.listen(3000);
|
||||
silent || console.log('Express started on port 3000');
|
||||
}
|
||||
5
examples/error-pages/views/404.jade
Normal file
5
examples/error-pages/views/404.jade
Normal file
@@ -0,0 +1,5 @@
|
||||
|
||||
extends error
|
||||
|
||||
block content
|
||||
h2 Cannot find #{url}
|
||||
13
examples/error-pages/views/500.jade
Normal file
13
examples/error-pages/views/500.jade
Normal file
@@ -0,0 +1,13 @@
|
||||
|
||||
// note that we extend a different
|
||||
// layout with jade for 4xx & 5xx
|
||||
// responses
|
||||
|
||||
extends error
|
||||
|
||||
block content
|
||||
h1 Error: #{error.message}
|
||||
if settings['verbose errors']
|
||||
pre= error.stack
|
||||
else
|
||||
p An error ocurred!
|
||||
6
examples/error-pages/views/error.jade
Normal file
6
examples/error-pages/views/error.jade
Normal file
@@ -0,0 +1,6 @@
|
||||
html
|
||||
head
|
||||
title Error
|
||||
body
|
||||
h1 An error occurred!
|
||||
block content
|
||||
15
examples/error-pages/views/index.jade
Normal file
15
examples/error-pages/views/index.jade
Normal file
@@ -0,0 +1,15 @@
|
||||
|
||||
extends layout
|
||||
|
||||
block content
|
||||
h2 Pages Example
|
||||
ul
|
||||
li
|
||||
| visit
|
||||
a(href="/500") 500
|
||||
li
|
||||
| visit
|
||||
a(href="/404") 404
|
||||
li
|
||||
| visit
|
||||
a(href='/403') 403
|
||||
6
examples/error-pages/views/layout.jade
Normal file
6
examples/error-pages/views/layout.jade
Normal file
@@ -0,0 +1,6 @@
|
||||
html
|
||||
head
|
||||
title Custom Pages Example
|
||||
body
|
||||
h1 My Site
|
||||
block content
|
||||
48
examples/error/index.js
Normal file
48
examples/error/index.js
Normal file
@@ -0,0 +1,48 @@
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var express = require('../../')
|
||||
, app = module.exports = express()
|
||||
, test = app.get('env') == 'test';
|
||||
|
||||
if (!test) app.use(express.logger('dev'));
|
||||
app.use(app.router);
|
||||
|
||||
// the error handler is strategically
|
||||
// placed *below* the app.router; if it
|
||||
// were above it would not receive errors
|
||||
// from app.get() etc
|
||||
app.use(error);
|
||||
|
||||
// error handling middleware have an arity of 4
|
||||
// instead of the typical (req, res, next),
|
||||
// otherwise they behave exactly like regular
|
||||
// middleware, you may have several of them,
|
||||
// in different orders etc.
|
||||
|
||||
function error(err, req, res, next) {
|
||||
// log it
|
||||
if (!test) console.error(err.stack);
|
||||
|
||||
// respond with 500 "Internal Server Error".
|
||||
res.send(500);
|
||||
}
|
||||
|
||||
app.get('/', function(req, res){
|
||||
// Caught and passed down to the errorHandler middleware
|
||||
throw new Error('something broke!');
|
||||
});
|
||||
|
||||
app.get('/next', function(req, res, next){
|
||||
// We can also pass exceptions to next()
|
||||
process.nextTick(function(){
|
||||
next(new Error('oh no!'));
|
||||
});
|
||||
});
|
||||
|
||||
if (!module.parent) {
|
||||
app.listen(3000);
|
||||
console.log('Express started on port 3000');
|
||||
}
|
||||
60
examples/expose-data-to-client/index.js
Normal file
60
examples/expose-data-to-client/index.js
Normal file
@@ -0,0 +1,60 @@
|
||||
|
||||
var express = require('../..')
|
||||
, app = express();
|
||||
|
||||
app.set('view engine', 'jade');
|
||||
app.set('views', __dirname + '/views');
|
||||
|
||||
function User(name) {
|
||||
this.private = 'heyyyy';
|
||||
this.secret = 'something';
|
||||
this.name = name;
|
||||
this.id = 123;
|
||||
}
|
||||
|
||||
// You'll probably want to do
|
||||
// something like this so you
|
||||
// dont expose "secret" data.
|
||||
|
||||
User.prototype.toJSON = function(){
|
||||
return {
|
||||
id: this.id,
|
||||
name: this.name
|
||||
}
|
||||
};
|
||||
|
||||
app.use(express.logger('dev'));
|
||||
|
||||
// earlier on expose an object
|
||||
// that we can tack properties on.
|
||||
// all res.locals props are exposed
|
||||
// to the templates, so "expose" will
|
||||
// be present.
|
||||
|
||||
app.use(function(req, res, next){
|
||||
res.locals.expose = {};
|
||||
// you could alias this as req or res.expose
|
||||
// to make it shorter and less annoying
|
||||
next();
|
||||
});
|
||||
|
||||
// pretend we loaded a user
|
||||
|
||||
app.use(function(req, res, next){
|
||||
req.user = new User('Tobi');
|
||||
next();
|
||||
});
|
||||
|
||||
app.get('/', function(req, res){
|
||||
res.redirect('/user');
|
||||
});
|
||||
|
||||
app.get('/user', function(req, res){
|
||||
// we only want to expose the user
|
||||
// to the client for this route:
|
||||
res.locals.expose.user = req.user;
|
||||
res.render('page');
|
||||
});
|
||||
|
||||
app.listen(3000);
|
||||
console.log('app listening on port 3000');
|
||||
14
examples/expose-data-to-client/views/page.jade
Normal file
14
examples/expose-data-to-client/views/page.jade
Normal file
@@ -0,0 +1,14 @@
|
||||
html
|
||||
head
|
||||
title Express
|
||||
script
|
||||
// call this whatever you like,
|
||||
// or dump them into individual
|
||||
// props like "var user ="
|
||||
var data = !{JSON.stringify(expose)}
|
||||
body
|
||||
h1 Expose client data
|
||||
p The following was exposed to the client:
|
||||
pre
|
||||
script
|
||||
document.write(JSON.stringify(data, null, 2))
|
||||
11
examples/hello-world/index.js
Normal file
11
examples/hello-world/index.js
Normal file
@@ -0,0 +1,11 @@
|
||||
|
||||
var express = require('../../');
|
||||
|
||||
var app = express();
|
||||
|
||||
app.get('/', function(req, res){
|
||||
res.send('Hello World');
|
||||
});
|
||||
|
||||
app.listen(3000);
|
||||
console.log('Express started on port 3000');
|
||||
45
examples/jade/index.js
Normal file
45
examples/jade/index.js
Normal file
@@ -0,0 +1,45 @@
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var express = require('../../lib/express');
|
||||
|
||||
// Path to our public directory
|
||||
|
||||
var pub = __dirname + '/public';
|
||||
|
||||
// setup middleware
|
||||
|
||||
var app = express();
|
||||
app.use(app.router);
|
||||
app.use(express.static(pub));
|
||||
app.use(express.errorHandler());
|
||||
|
||||
// Optional since express defaults to CWD/views
|
||||
|
||||
app.set('views', __dirname + '/views');
|
||||
|
||||
// Set our default template engine to "jade"
|
||||
// which prevents the need for extensions
|
||||
// (although you can still mix and match)
|
||||
app.set('view engine', 'jade');
|
||||
|
||||
function User(name, email) {
|
||||
this.name = name;
|
||||
this.email = email;
|
||||
}
|
||||
|
||||
// Dummy users
|
||||
var users = [
|
||||
new User('tj', 'tj@vision-media.ca')
|
||||
, new User('ciaran', 'ciaranj@gmail.com')
|
||||
, new User('aaron', 'aaron.heckmann+github@gmail.com')
|
||||
];
|
||||
|
||||
app.get('/', function(req, res){
|
||||
res.render('users', { users: users });
|
||||
});
|
||||
|
||||
app.listen(3000);
|
||||
console.log('Express app started on port 3000');
|
||||
4
examples/jade/public/stylesheets/style.css
Normal file
4
examples/jade/public/stylesheets/style.css
Normal file
@@ -0,0 +1,4 @@
|
||||
body {
|
||||
padding: 50px 80px;
|
||||
font: 14px "Helvetica Nueue", "Lucida Grande", Arial, sans-serif;
|
||||
}
|
||||
3
examples/jade/views/header.jade
Normal file
3
examples/jade/views/header.jade
Normal file
@@ -0,0 +1,3 @@
|
||||
head
|
||||
title Jade Example
|
||||
link(rel="stylesheet", href="/stylesheets/style.css")
|
||||
5
examples/jade/views/layout.jade
Normal file
5
examples/jade/views/layout.jade
Normal file
@@ -0,0 +1,5 @@
|
||||
!!! 5
|
||||
html
|
||||
include header
|
||||
body
|
||||
block content
|
||||
8
examples/jade/views/users/index.jade
Normal file
8
examples/jade/views/users/index.jade
Normal file
@@ -0,0 +1,8 @@
|
||||
|
||||
extends ../layout
|
||||
|
||||
block content
|
||||
h1 Users
|
||||
#users
|
||||
for user in users
|
||||
include user
|
||||
3
examples/jade/views/users/user.jade
Normal file
3
examples/jade/views/users/user.jade
Normal file
@@ -0,0 +1,3 @@
|
||||
.user
|
||||
h2= user.name
|
||||
.email= user.email
|
||||
45
examples/markdown/index.js
Normal file
45
examples/markdown/index.js
Normal file
@@ -0,0 +1,45 @@
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var express = require('../../')
|
||||
, fs = require('fs')
|
||||
, md = require('github-flavored-markdown').parse;
|
||||
|
||||
var app = module.exports = express();
|
||||
|
||||
// register .md as an engine in express view system
|
||||
|
||||
app.engine('md', function(path, options, fn){
|
||||
fs.readFile(path, 'utf8', function(err, str){
|
||||
if (err) return fn(err);
|
||||
try {
|
||||
var html = md(str);
|
||||
html = html.replace(/\{([^}]+)\}/g, function(_, name){
|
||||
return options[name] || '';
|
||||
})
|
||||
fn(null, html);
|
||||
} catch(err) {
|
||||
fn(err);
|
||||
}
|
||||
});
|
||||
})
|
||||
|
||||
app.set('views', __dirname + '/views');
|
||||
|
||||
// make it the default so we dont need .md
|
||||
app.set('view engine', 'md');
|
||||
|
||||
app.get('/', function(req, res){
|
||||
res.render('index', { title: 'Markdown Example' });
|
||||
})
|
||||
|
||||
app.get('/fail', function(req, res){
|
||||
res.render('missing', { title: 'Markdown Example' });
|
||||
})
|
||||
|
||||
if (!module.parent) {
|
||||
app.listen(3000);
|
||||
console.log('Express started on port 3000');
|
||||
}
|
||||
4
examples/markdown/views/index.md
Normal file
4
examples/markdown/views/index.md
Normal file
@@ -0,0 +1,4 @@
|
||||
|
||||
# {title}
|
||||
|
||||
Just an example view rendered with _markdown_.
|
||||
36
examples/multipart/index.js
Normal file
36
examples/multipart/index.js
Normal file
@@ -0,0 +1,36 @@
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var express = require('../..')
|
||||
, format = require('util').format;
|
||||
|
||||
var app = module.exports = express()
|
||||
|
||||
// bodyParser in connect 2.x uses node-formidable to parse
|
||||
// the multipart form data.
|
||||
app.use(express.bodyParser())
|
||||
|
||||
app.get('/', function(req, res){
|
||||
res.send('<form method="post" enctype="multipart/form-data">'
|
||||
+ '<p>Title: <input type="text" name="title" /></p>'
|
||||
+ '<p>Image: <input type="file" name="image" /></p>'
|
||||
+ '<p><input type="submit" value="Upload" /></p>'
|
||||
+ '</form>');
|
||||
});
|
||||
|
||||
app.post('/', function(req, res, next){
|
||||
// the uploaded file can be found as `req.files.image` and the
|
||||
// title field as `req.body.title`
|
||||
res.send(format('\nuploaded %s (%d Kb) to %s as %s'
|
||||
, req.files.image.name
|
||||
, req.files.image.size / 1024 | 0
|
||||
, req.files.image.path
|
||||
, req.body.title));
|
||||
});
|
||||
|
||||
if (!module.parent) {
|
||||
app.listen(3000);
|
||||
console.log('Express started on port 3000');
|
||||
}
|
||||
4
examples/mvc/controllers/main/index.js
Normal file
4
examples/mvc/controllers/main/index.js
Normal file
@@ -0,0 +1,4 @@
|
||||
|
||||
exports.index = function(req, res){
|
||||
res.redirect('/users');
|
||||
};
|
||||
26
examples/mvc/controllers/pet/index.js
Normal file
26
examples/mvc/controllers/pet/index.js
Normal file
@@ -0,0 +1,26 @@
|
||||
|
||||
var db = require('../../db');
|
||||
|
||||
exports.engine = 'jade';
|
||||
|
||||
exports.before = function(req, res, next){
|
||||
var pet = db.pets[req.params.pet_id];
|
||||
if (!pet) return next(new Error('Pet not found'));
|
||||
req.pet = pet;
|
||||
next();
|
||||
};
|
||||
|
||||
exports.show = function(req, res, next){
|
||||
res.render('show', { pet: req.pet });
|
||||
};
|
||||
|
||||
exports.edit = function(req, res, next){
|
||||
res.render('edit', { pet: req.pet });
|
||||
};
|
||||
|
||||
exports.update = function(req, res, next){
|
||||
var body = req.body;
|
||||
req.pet.name = body.user.name;
|
||||
res.message('Information updated!');
|
||||
res.redirect('/pet/' + req.pet.id);
|
||||
};
|
||||
7
examples/mvc/controllers/pet/views/edit.jade
Normal file
7
examples/mvc/controllers/pet/views/edit.jade
Normal file
@@ -0,0 +1,7 @@
|
||||
link(rel='stylesheet', href='/style.css')
|
||||
h1= pet.name
|
||||
form(action='/pet/#{pet.id}', method='post')
|
||||
input(type='hidden', name='_method', value='put')
|
||||
label Name:
|
||||
input(type='text', name='user[name]', value=pet.name)
|
||||
input(type='submit', value='Update')
|
||||
6
examples/mvc/controllers/pet/views/show.jade
Normal file
6
examples/mvc/controllers/pet/views/show.jade
Normal file
@@ -0,0 +1,6 @@
|
||||
link(rel='stylesheet', href='/style.css')
|
||||
|
||||
h1= pet.name
|
||||
a(href='/pet/#{pet.id}/edit') edit
|
||||
|
||||
p You are viewing #{pet.name}
|
||||
17
examples/mvc/controllers/user-pet/index.js
Normal file
17
examples/mvc/controllers/user-pet/index.js
Normal file
@@ -0,0 +1,17 @@
|
||||
|
||||
var db = require('../../db');
|
||||
|
||||
exports.name = 'pet';
|
||||
exports.prefix = '/user/:user_id';
|
||||
|
||||
exports.create = function(req, res, next){
|
||||
var id = req.params.user_id;
|
||||
var user = db.users[id];
|
||||
var body = req.body;
|
||||
if (!user) return next(new Error('User not found'));
|
||||
var pet = { name: body.pet.name };
|
||||
pet.id = db.pets.push(pet) - 1;
|
||||
user.pets.push(pet);
|
||||
res.message('Added pet ' + body.pet.name);
|
||||
res.redirect('/user/' + id);
|
||||
};
|
||||
34
examples/mvc/controllers/user/index.js
Normal file
34
examples/mvc/controllers/user/index.js
Normal file
@@ -0,0 +1,34 @@
|
||||
|
||||
var db = require('../../db');
|
||||
|
||||
exports.before = function(req, res, next){
|
||||
var id = req.params.user_id;
|
||||
if (!id) return next();
|
||||
// pretend to query a database...
|
||||
process.nextTick(function(){
|
||||
req.user = db.users[id];
|
||||
// cant find that user
|
||||
if (!req.user) return next(new Error('User not found'));
|
||||
// found it, move on to the routes
|
||||
next();
|
||||
});
|
||||
}
|
||||
|
||||
exports.list = function(req, res, next){
|
||||
res.render('list', { users: db.users });
|
||||
};
|
||||
|
||||
exports.edit = function(req, res, next){
|
||||
res.render('edit', { user: req.user });
|
||||
};
|
||||
|
||||
exports.show = function(req, res, next){
|
||||
res.render('show', { user: req.user });
|
||||
};
|
||||
|
||||
exports.update = function(req, res, next){
|
||||
var body = req.body;
|
||||
req.user.name = body.user.name;
|
||||
res.message('Information updated!');
|
||||
res.redirect('/user/' + req.user.id);
|
||||
};
|
||||
12
examples/mvc/controllers/user/views/edit.html
Normal file
12
examples/mvc/controllers/user/views/edit.html
Normal file
@@ -0,0 +1,12 @@
|
||||
<link rel="stylesheet" href="/style.css" />
|
||||
<h1><%= user.name %></h1>
|
||||
<form action='/user/<%= user.id %>' method='post'>
|
||||
<input type="hidden" name="_method" value="put" />
|
||||
<label>Name: <input type="text" name="user[name]" value="<%= user.name %>" /></label>
|
||||
<input type="submit" value="Update" />
|
||||
</form>
|
||||
|
||||
<form action='/user/<%= user.id %>/pet' method='post'>
|
||||
<label>Pet: <input type="text" name="pet[name]" placeholder="name" /></label>
|
||||
<input type="submit" value="Add" />
|
||||
</form>
|
||||
8
examples/mvc/controllers/user/views/list.html
Normal file
8
examples/mvc/controllers/user/views/list.html
Normal file
@@ -0,0 +1,8 @@
|
||||
<link rel="stylesheet" href="/style.css" />
|
||||
<h1>Users</h1>
|
||||
<p>Click a user below to view their pets.</p>
|
||||
<ul>
|
||||
<% users.forEach(function(user){ %>
|
||||
<li><a href="/user/<%= user.id %>"><%= user.name %></a></li>
|
||||
<% }) %>
|
||||
</ul>
|
||||
21
examples/mvc/controllers/user/views/show.html
Normal file
21
examples/mvc/controllers/user/views/show.html
Normal file
@@ -0,0 +1,21 @@
|
||||
<link rel="stylesheet" href="/style.css" />
|
||||
<h1><%= user.name %> <a href="/user/<%= user.id %>/edit">edit</a></h1>
|
||||
|
||||
<% if (hasMessages) { %>
|
||||
<ul id="messages">
|
||||
<% messages.forEach(function(msg){ %>
|
||||
<li><%= msg %></li>
|
||||
<% }) %>
|
||||
</ul>
|
||||
<% } %>
|
||||
|
||||
<% if (user.pets.length) { %>
|
||||
<p>View <%= user.name %>s pets:</p>
|
||||
<ul>
|
||||
<% user.pets.forEach(function(pet){ %>
|
||||
<li><a href="/pet/<%= pet.id %>"><%= pet.name %></a></li>
|
||||
<% }) %>
|
||||
</ul>
|
||||
<% } else { %>
|
||||
<p>No pets!</p>
|
||||
<% } %>
|
||||
15
examples/mvc/db.js
Normal file
15
examples/mvc/db.js
Normal file
@@ -0,0 +1,15 @@
|
||||
|
||||
// faux database
|
||||
|
||||
var pets = exports.pets = [];
|
||||
|
||||
pets.push({ name: 'Tobi', id: 0 });
|
||||
pets.push({ name: 'Loki', id: 1 });
|
||||
pets.push({ name: 'Jane', id: 2 });
|
||||
pets.push({ name: 'Raul', id: 3 });
|
||||
|
||||
var users = exports.users = [];
|
||||
|
||||
users.push({ name: 'TJ', pets: [pets[0], pets[1], pets[2]], id: 0 });
|
||||
users.push({ name: 'Guillermo', pets: [pets[3]], id: 1 });
|
||||
users.push({ name: 'Nathan', pets: [], id: 2 });
|
||||
93
examples/mvc/index.js
Normal file
93
examples/mvc/index.js
Normal file
@@ -0,0 +1,93 @@
|
||||
|
||||
var express = require('../..');
|
||||
|
||||
var app = module.exports = express();
|
||||
|
||||
// settings
|
||||
|
||||
// map .renderFile to ".html" files
|
||||
app.engine('html', require('ejs').renderFile);
|
||||
|
||||
// make ".html" the default
|
||||
app.set('view engine', 'html');
|
||||
|
||||
// set views for error and 404 pages
|
||||
app.set('views', __dirname + '/views');
|
||||
|
||||
// define a custom res.message() method
|
||||
// which stores messages in the session
|
||||
app.response.message = function(msg){
|
||||
// reference `req.session` via the `this.req` reference
|
||||
var sess = this.req.session;
|
||||
// simply add the msg to an array for later
|
||||
sess.messages = sess.messages || [];
|
||||
sess.messages.push(msg);
|
||||
return this;
|
||||
};
|
||||
|
||||
// log
|
||||
if (!module.parent) app.use(express.logger('dev'));
|
||||
|
||||
// serve static files
|
||||
app.use(express.static(__dirname + '/public'));
|
||||
|
||||
// session support
|
||||
app.use(express.cookieParser('some secret here'));
|
||||
app.use(express.session());
|
||||
|
||||
// parse request bodies (req.body)
|
||||
app.use(express.bodyParser());
|
||||
|
||||
// support _method (PUT in forms etc)
|
||||
app.use(express.methodOverride());
|
||||
|
||||
// expose the "messages" local variable when views are rendered
|
||||
app.use(function(req, res, next){
|
||||
var msgs = req.session.messages || [];
|
||||
|
||||
// expose "messages" local variable
|
||||
res.locals.messages = msgs;
|
||||
|
||||
// expose "hasMessages"
|
||||
res.locals.hasMessages = !! msgs.length;
|
||||
|
||||
/* This is equivalent:
|
||||
res.locals({
|
||||
messages: msgs,
|
||||
hasMessages: !! msgs.length
|
||||
});
|
||||
*/
|
||||
|
||||
// empty or "flush" the messages so they
|
||||
// don't build up
|
||||
req.session.messages = [];
|
||||
next();
|
||||
});
|
||||
|
||||
// load controllers
|
||||
require('./lib/boot')(app, { verbose: !module.parent });
|
||||
|
||||
// assume "not found" in the error msgs
|
||||
// is a 404. this is somewhat silly, but
|
||||
// valid, you can do whatever you like, set
|
||||
// properties, use instanceof etc.
|
||||
app.use(function(err, req, res, next){
|
||||
// treat as 404
|
||||
if (~err.message.indexOf('not found')) return next();
|
||||
|
||||
// log it
|
||||
console.error(err.stack);
|
||||
|
||||
// error page
|
||||
res.status(500).render('5xx');
|
||||
});
|
||||
|
||||
// assume 404 since no middleware responded
|
||||
app.use(function(req, res, next){
|
||||
res.status(404).render('404', { url: req.originalUrl });
|
||||
});
|
||||
|
||||
if (!module.parent) {
|
||||
app.listen(3000);
|
||||
console.log('\n listening on port 3000\n');
|
||||
}
|
||||
73
examples/mvc/lib/boot.js
Normal file
73
examples/mvc/lib/boot.js
Normal file
@@ -0,0 +1,73 @@
|
||||
|
||||
var express = require('../../..')
|
||||
, fs = require('fs');
|
||||
|
||||
module.exports = function(parent, options){
|
||||
var verbose = options.verbose;
|
||||
fs.readdirSync(__dirname + '/../controllers').forEach(function(name){
|
||||
verbose && console.log('\n %s:', name);
|
||||
var obj = require('./../controllers/' + name)
|
||||
, name = obj.name || name
|
||||
, prefix = obj.prefix || ''
|
||||
, app = express()
|
||||
, method
|
||||
, path;
|
||||
|
||||
// allow specifying the view engine
|
||||
if (obj.engine) app.set('view engine', obj.engine);
|
||||
app.set('views', __dirname + '/../controllers/' + name + '/views');
|
||||
|
||||
// before middleware support
|
||||
if (obj.before) {
|
||||
path = '/' + name + '/:' + name + '_id';
|
||||
app.all(path, obj.before);
|
||||
verbose && console.log(' ALL %s -> before', path);
|
||||
path = '/' + name + '/:' + name + '_id/*';
|
||||
app.all(path, obj.before);
|
||||
verbose && console.log(' ALL %s -> before', path);
|
||||
}
|
||||
|
||||
// generate routes based
|
||||
// on the exported methods
|
||||
for (var key in obj) {
|
||||
// "reserved" exports
|
||||
if (~['name', 'prefix', 'engine', 'before'].indexOf(key)) continue;
|
||||
// route exports
|
||||
switch (key) {
|
||||
case 'show':
|
||||
method = 'get';
|
||||
path = '/' + name + '/:' + name + '_id';
|
||||
break;
|
||||
case 'list':
|
||||
method = 'get';
|
||||
path = '/' + name + 's';
|
||||
break;
|
||||
case 'edit':
|
||||
method = 'get';
|
||||
path = '/' + name + '/:' + name + '_id/edit';
|
||||
break;
|
||||
case 'update':
|
||||
method = 'put';
|
||||
path = '/' + name + '/:' + name + '_id';
|
||||
break;
|
||||
case 'create':
|
||||
method = 'post';
|
||||
path = '/' + name;
|
||||
break;
|
||||
case 'index':
|
||||
method = 'get';
|
||||
path = '/';
|
||||
break;
|
||||
default:
|
||||
throw new Error('unrecognized route: ' + name + '.' + key);
|
||||
}
|
||||
|
||||
path = prefix + path;
|
||||
app[method](path, obj[key]);
|
||||
verbose && console.log(' %s %s -> %s', method.toUpperCase(), path, key);
|
||||
}
|
||||
|
||||
// mount the app
|
||||
parent.use(app);
|
||||
});
|
||||
};
|
||||
14
examples/mvc/public/style.css
Normal file
14
examples/mvc/public/style.css
Normal file
@@ -0,0 +1,14 @@
|
||||
body {
|
||||
padding: 50px;
|
||||
font: 16px "Helvetica Neue", Helvetica, Arial;
|
||||
}
|
||||
a {
|
||||
color: #107aff;
|
||||
text-decoration: none;
|
||||
}
|
||||
a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
h1 a {
|
||||
font-size: 16px;
|
||||
}
|
||||
3
examples/mvc/views/404.html
Normal file
3
examples/mvc/views/404.html
Normal file
@@ -0,0 +1,3 @@
|
||||
<link rel="stylesheet" href="/style.css" />
|
||||
<h1>404: Not Found</h1>
|
||||
<p>Sorry we can't find <%= url %></p>
|
||||
3
examples/mvc/views/5xx.html
Normal file
3
examples/mvc/views/5xx.html
Normal file
@@ -0,0 +1,3 @@
|
||||
<link rel="stylesheet" href="/style.css" />
|
||||
<h1>500: Internal Server Error</h1>
|
||||
<p>Looks like something blew up!</p>
|
||||
54
examples/online/index.js
Normal file
54
examples/online/index.js
Normal file
@@ -0,0 +1,54 @@
|
||||
|
||||
// first:
|
||||
// $ npm install redis online
|
||||
// $ redis-server
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var express = require('../..')
|
||||
, online = require('online')
|
||||
, redis = require('redis')
|
||||
, db = redis.createClient();
|
||||
|
||||
// online
|
||||
|
||||
online = online(db);
|
||||
|
||||
// app
|
||||
|
||||
var app = express();
|
||||
|
||||
// activity tracking, in this case using
|
||||
// the UA string, you would use req.user.id etc
|
||||
|
||||
app.use(function(req, res, next){
|
||||
// fire-and-forget
|
||||
online.add(req.headers['user-agent']);
|
||||
next();
|
||||
});
|
||||
|
||||
/**
|
||||
* List helper.
|
||||
*/
|
||||
|
||||
function list(ids) {
|
||||
return '<ul>' + ids.map(function(id){
|
||||
return '<li>' + id + '</li>';
|
||||
}).join('') + '</ul>';
|
||||
}
|
||||
|
||||
/**
|
||||
* GET users online.
|
||||
*/
|
||||
|
||||
app.get('/', function(req, res, next){
|
||||
online.last(5, function(err, ids){
|
||||
if (err) return next(err);
|
||||
res.send('<p>Users online: ' + ids.length + '</p>' + list(ids));
|
||||
});
|
||||
});
|
||||
|
||||
app.listen(3000);
|
||||
console.log('listening on port 3000');
|
||||
70
examples/params/app.js
Normal file
70
examples/params/app.js
Normal file
@@ -0,0 +1,70 @@
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var express = require('../../')
|
||||
, app = module.exports = express();
|
||||
|
||||
// Faux database
|
||||
|
||||
var users = [
|
||||
{ name: 'tj' }
|
||||
, { name: 'tobi' }
|
||||
, { name: 'loki' }
|
||||
, { name: 'jane' }
|
||||
, { name: 'bandit' }
|
||||
];
|
||||
|
||||
// Convert :to and :from to integers
|
||||
|
||||
app.param(['to', 'from'], function(req, res, next, num, name){
|
||||
req.params[name] = num = parseInt(num, 10);
|
||||
if( isNaN(num) ){
|
||||
next(new Error('failed to parseInt '+num));
|
||||
} else {
|
||||
next();
|
||||
}
|
||||
});
|
||||
|
||||
// Load user by id
|
||||
|
||||
app.param('user', function(req, res, next, id){
|
||||
if (req.user = users[id]) {
|
||||
next();
|
||||
} else {
|
||||
next(new Error('failed to find user'));
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* GET index.
|
||||
*/
|
||||
|
||||
app.get('/', function(req, res){
|
||||
res.send('Visit /user/0 or /users/0-2');
|
||||
});
|
||||
|
||||
/**
|
||||
* GET :user.
|
||||
*/
|
||||
|
||||
app.get('/user/:user', function(req, res, next){
|
||||
res.send('user ' + req.user.name);
|
||||
});
|
||||
|
||||
/**
|
||||
* GET users :from - :to.
|
||||
*/
|
||||
|
||||
app.get('/users/:from-:to', function(req, res, next){
|
||||
var from = req.params.from
|
||||
, to = req.params.to
|
||||
, names = users.map(function(user){ return user.name; });
|
||||
res.send('users ' + names.slice(from, to).join(', '));
|
||||
});
|
||||
|
||||
if (!module.parent) {
|
||||
app.listen(3000);
|
||||
console.log('Express started on port 3000');
|
||||
}
|
||||
91
examples/resource/app.js
Normal file
91
examples/resource/app.js
Normal file
@@ -0,0 +1,91 @@
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var express = require('../../');
|
||||
|
||||
var app = module.exports = express();
|
||||
|
||||
// Ad-hoc example resource method
|
||||
|
||||
app.resource = function(path, obj) {
|
||||
this.get(path, obj.index);
|
||||
this.get(path + '/:a..:b.:format?', function(req, res){
|
||||
var a = parseInt(req.params.a, 10)
|
||||
, b = parseInt(req.params.b, 10)
|
||||
, format = req.params.format;
|
||||
obj.range(req, res, a, b, format);
|
||||
});
|
||||
this.get(path + '/:id', obj.show);
|
||||
this.del(path + '/:id', obj.destroy);
|
||||
};
|
||||
|
||||
// Fake records
|
||||
|
||||
var users = [
|
||||
{ name: 'tj' }
|
||||
, { name: 'ciaran' }
|
||||
, { name: 'aaron' }
|
||||
, { name: 'guillermo' }
|
||||
, { name: 'simon' }
|
||||
, { name: 'tobi' }
|
||||
];
|
||||
|
||||
// Fake controller.
|
||||
|
||||
var User = {
|
||||
index: function(req, res){
|
||||
res.send(users);
|
||||
},
|
||||
show: function(req, res){
|
||||
res.send(users[req.params.id] || { error: 'Cannot find user' });
|
||||
},
|
||||
destroy: function(req, res){
|
||||
var id = req.params.id;
|
||||
var destroyed = id in users;
|
||||
delete users[id];
|
||||
res.send(destroyed ? 'destroyed' : 'Cannot find user');
|
||||
},
|
||||
range: function(req, res, a, b, format){
|
||||
var range = users.slice(a, b + 1);
|
||||
switch (format) {
|
||||
case 'json':
|
||||
res.send(range);
|
||||
break;
|
||||
case 'html':
|
||||
default:
|
||||
var html = '<ul>' + range.map(function(user){
|
||||
return '<li>' + user.name + '</li>';
|
||||
}).join('\n') + '</ul>';
|
||||
res.send(html);
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// curl http://localhost:3000/users -- responds with all users
|
||||
// curl http://localhost:3000/users/1 -- responds with user 1
|
||||
// curl http://localhost:3000/users/4 -- responds with error
|
||||
// curl http://localhost:3000/users/1..3 -- responds with several users
|
||||
// curl -X DELETE http://localhost:3000/users/1 -- deletes the user
|
||||
|
||||
app.resource('/users', User);
|
||||
|
||||
app.get('/', function(req, res){
|
||||
res.send([
|
||||
'<h1>Examples:</h1> <ul>'
|
||||
, '<li>GET /users</li>'
|
||||
, '<li>GET /users/1</li>'
|
||||
, '<li>GET /users/3</li>'
|
||||
, '<li>GET /users/1..3</li>'
|
||||
, '<li>GET /users/1..3.json</li>'
|
||||
, '<li>DELETE /users/4</li>'
|
||||
, '</ul>'
|
||||
].join('\n'));
|
||||
});
|
||||
|
||||
if (!module.parent) {
|
||||
app.listen(3000);
|
||||
console.log('Express started on port 3000');
|
||||
}
|
||||
63
examples/route-map/index.js
Normal file
63
examples/route-map/index.js
Normal file
@@ -0,0 +1,63 @@
|
||||
|
||||
var express = require('../../lib/express')
|
||||
, verbose = process.env.NODE_ENV != 'test'
|
||||
, app = module.exports = express();
|
||||
|
||||
app.map = function(a, route){
|
||||
route = route || '';
|
||||
for (var key in a) {
|
||||
switch (typeof a[key]) {
|
||||
// { '/path': { ... }}
|
||||
case 'object':
|
||||
app.map(a[key], route + key);
|
||||
break;
|
||||
// get: function(){ ... }
|
||||
case 'function':
|
||||
if (verbose) console.log('%s %s', key, route);
|
||||
app[key](route, a[key]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
var users = {
|
||||
list: function(req, res){
|
||||
res.send('user list');
|
||||
},
|
||||
|
||||
get: function(req, res){
|
||||
res.send('user ' + req.params.uid);
|
||||
},
|
||||
|
||||
del: function(req, res){
|
||||
res.send('delete users');
|
||||
}
|
||||
};
|
||||
|
||||
var pets = {
|
||||
list: function(req, res){
|
||||
res.send('user ' + req.params.uid + '\'s pets');
|
||||
},
|
||||
|
||||
del: function(req, res){
|
||||
res.send('delete ' + req.params.uid + '\'s pet ' + req.params.pid);
|
||||
}
|
||||
};
|
||||
|
||||
app.map({
|
||||
'/users': {
|
||||
get: users.list,
|
||||
del: users.del,
|
||||
'/:uid': {
|
||||
get: users.get,
|
||||
'/pets': {
|
||||
get: pets.list,
|
||||
'/:pid': {
|
||||
del: pets.del
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
app.listen(3000);
|
||||
85
examples/route-middleware/index.js
Normal file
85
examples/route-middleware/index.js
Normal file
@@ -0,0 +1,85 @@
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var express = require('../../lib/express');
|
||||
|
||||
var app = express();
|
||||
|
||||
// Example requests:
|
||||
// curl http://localhost:3000/user/0
|
||||
// curl http://localhost:3000/user/0/edit
|
||||
// curl http://localhost:3000/user/1
|
||||
// curl http://localhost:3000/user/1/edit (unauthorized since this is not you)
|
||||
// curl -X DELETE http://localhost:3000/user/0 (unauthorized since you are not an admin)
|
||||
|
||||
// Dummy users
|
||||
var users = [
|
||||
{ id: 0, name: 'tj', email: 'tj@vision-media.ca', role: 'member' }
|
||||
, { id: 1, name: 'ciaran', email: 'ciaranj@gmail.com', role: 'member' }
|
||||
, { id: 2, name: 'aaron', email: 'aaron.heckmann+github@gmail.com', role: 'admin' }
|
||||
];
|
||||
|
||||
function loadUser(req, res, next) {
|
||||
// You would fetch your user from the db
|
||||
var user = users[req.params.id];
|
||||
if (user) {
|
||||
req.user = user;
|
||||
next();
|
||||
} else {
|
||||
next(new Error('Failed to load user ' + req.params.id));
|
||||
}
|
||||
}
|
||||
|
||||
function andRestrictToSelf(req, res, next) {
|
||||
// If our authenticated user is the user we are viewing
|
||||
// then everything is fine :)
|
||||
if (req.authenticatedUser.id == req.user.id) {
|
||||
next();
|
||||
} else {
|
||||
// You may want to implement specific exceptions
|
||||
// such as UnauthorizedError or similar so that you
|
||||
// can handle these can be special-cased in an error handler
|
||||
// (view ./examples/pages for this)
|
||||
next(new Error('Unauthorized'));
|
||||
}
|
||||
}
|
||||
|
||||
function andRestrictTo(role) {
|
||||
return function(req, res, next) {
|
||||
if (req.authenticatedUser.role == role) {
|
||||
next();
|
||||
} else {
|
||||
next(new Error('Unauthorized'));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Middleware for faux authentication
|
||||
// you would of course implement something real,
|
||||
// but this illustrates how an authenticated user
|
||||
// may interact with middleware
|
||||
|
||||
app.use(function(req, res, next){
|
||||
req.authenticatedUser = users[0];
|
||||
next();
|
||||
});
|
||||
|
||||
app.get('/', function(req, res){
|
||||
res.redirect('/user/0');
|
||||
});
|
||||
|
||||
app.get('/user/:id', loadUser, function(req, res){
|
||||
res.send('Viewing user ' + req.user.name);
|
||||
});
|
||||
|
||||
app.get('/user/:id/edit', loadUser, andRestrictToSelf, function(req, res){
|
||||
res.send('Editing user ' + req.user.name);
|
||||
});
|
||||
|
||||
app.del('/user/:id', loadUser, andRestrictTo('admin'), function(req, res){
|
||||
res.send('Deleted user ' + req.user.name);
|
||||
});
|
||||
|
||||
app.listen(3000);
|
||||
console.log('Express app started on port 3000');
|
||||
40
examples/route-separation/index.js
Normal file
40
examples/route-separation/index.js
Normal file
@@ -0,0 +1,40 @@
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var express = require('../..')
|
||||
, app = express()
|
||||
, site = require('./site')
|
||||
, post = require('./post')
|
||||
, user = require('./user');
|
||||
|
||||
// Config
|
||||
|
||||
app.set('view engine', 'jade');
|
||||
app.set('views', __dirname + '/views');
|
||||
app.use(express.logger('dev'));
|
||||
app.use(express.cookieParser());
|
||||
app.use(express.bodyParser());
|
||||
app.use(express.methodOverride());
|
||||
app.use(express.static(__dirname + '/public'));
|
||||
|
||||
// General
|
||||
|
||||
app.get('/', site.index);
|
||||
|
||||
// User
|
||||
|
||||
app.all('/users', user.list);
|
||||
app.all('/user/:id/:op?', user.load);
|
||||
app.get('/user/:id', user.view);
|
||||
app.get('/user/:id/view', user.view);
|
||||
app.get('/user/:id/edit', user.edit);
|
||||
app.put('/user/:id/edit', user.update);
|
||||
|
||||
// Posts
|
||||
|
||||
app.get('/posts', post.list);
|
||||
|
||||
app.listen(3000);
|
||||
console.log('Express app started on port 3000');
|
||||
12
examples/route-separation/post.js
Normal file
12
examples/route-separation/post.js
Normal file
@@ -0,0 +1,12 @@
|
||||
|
||||
// Fake posts database
|
||||
|
||||
var posts = [
|
||||
{ title: 'Foo', body: 'some foo bar' },
|
||||
{ title: 'Foo bar', body: 'more foo bar' },
|
||||
{ title: 'Foo bar baz', body: 'more foo bar baz' }
|
||||
];
|
||||
|
||||
exports.list = function(req, res){
|
||||
res.render('posts', { title: 'Posts', posts: posts });
|
||||
};
|
||||
24
examples/route-separation/public/style.css
Normal file
24
examples/route-separation/public/style.css
Normal file
@@ -0,0 +1,24 @@
|
||||
body {
|
||||
padding: 50px;
|
||||
font: 14px "Helvetica Neue", Arial, sans-serif;
|
||||
}
|
||||
a {
|
||||
color: #00AEFF;
|
||||
text-decoration: none;
|
||||
}
|
||||
a.edit {
|
||||
color: #000;
|
||||
opacity: .3;
|
||||
}
|
||||
a.edit::before {
|
||||
content: ' [';
|
||||
}
|
||||
a.edit::after {
|
||||
content: ']';
|
||||
}
|
||||
dt {
|
||||
font-weight: bold;
|
||||
}
|
||||
dd {
|
||||
margin: 15px;
|
||||
}
|
||||
4
examples/route-separation/site.js
Normal file
4
examples/route-separation/site.js
Normal file
@@ -0,0 +1,4 @@
|
||||
|
||||
exports.index = function(req, res){
|
||||
res.render('index', { title: 'Route Separation Example' });
|
||||
};
|
||||
44
examples/route-separation/user.js
Normal file
44
examples/route-separation/user.js
Normal file
@@ -0,0 +1,44 @@
|
||||
|
||||
// Fake user database
|
||||
|
||||
var users = [
|
||||
{ name: 'TJ', email: 'tj@vision-media.ca' },
|
||||
{ name: 'Tobi', email: 'tobi@vision-media.ca' }
|
||||
];
|
||||
|
||||
exports.list = function(req, res){
|
||||
res.render('users', { title: 'Users', users: users });
|
||||
};
|
||||
|
||||
exports.load = function(req, res, next){
|
||||
var id = req.params.id;
|
||||
req.user = users[id];
|
||||
if (req.user) {
|
||||
next();
|
||||
} else {
|
||||
next(new Error('cannot find user ' + id));
|
||||
}
|
||||
};
|
||||
|
||||
exports.view = function(req, res){
|
||||
res.render('users/view', {
|
||||
title: 'Viewing user ' + req.user.name,
|
||||
user: req.user
|
||||
});
|
||||
};
|
||||
|
||||
exports.edit = function(req, res){
|
||||
res.render('users/edit', {
|
||||
title: 'Editing user ' + req.user.name,
|
||||
user: req.user
|
||||
});
|
||||
};
|
||||
|
||||
exports.update = function(req, res){
|
||||
// Normally you would handle all kinds of
|
||||
// validation and save back to the db
|
||||
var user = req.body.user;
|
||||
req.user.name = user.name;
|
||||
req.user.email = user.email;
|
||||
res.redirect('back');
|
||||
};
|
||||
6
examples/route-separation/views/index.jade
Normal file
6
examples/route-separation/views/index.jade
Normal file
@@ -0,0 +1,6 @@
|
||||
extends layout
|
||||
|
||||
block content
|
||||
ul
|
||||
li Visit the <a href="/users">users</a> page
|
||||
li Visit the <a href="/posts">posts</a> page
|
||||
6
examples/route-separation/views/layout.jade
Normal file
6
examples/route-separation/views/layout.jade
Normal file
@@ -0,0 +1,6 @@
|
||||
html
|
||||
head
|
||||
title= title
|
||||
link(href="/style.css", rel="stylesheet")
|
||||
body
|
||||
block content
|
||||
8
examples/route-separation/views/posts/index.jade
Normal file
8
examples/route-separation/views/posts/index.jade
Normal file
@@ -0,0 +1,8 @@
|
||||
extends ../layout
|
||||
|
||||
block content
|
||||
h1 Posts
|
||||
dl#posts
|
||||
for post in posts
|
||||
dt= post.title
|
||||
dd= post.body
|
||||
13
examples/route-separation/views/users/edit.jade
Normal file
13
examples/route-separation/views/users/edit.jade
Normal file
@@ -0,0 +1,13 @@
|
||||
extends ../layout
|
||||
|
||||
block content
|
||||
h1 Editing #{user.name}
|
||||
#user
|
||||
form(method="post")
|
||||
input(type="hidden", value="put", name="_method")
|
||||
p Name:
|
||||
input(type="text", value= user.name, name="user[name]")
|
||||
p Email:
|
||||
input(type="text", value= user.email, name="user[email]")
|
||||
p
|
||||
input(type="submit", value="Save")
|
||||
9
examples/route-separation/views/users/index.jade
Normal file
9
examples/route-separation/views/users/index.jade
Normal file
@@ -0,0 +1,9 @@
|
||||
extends ../layout
|
||||
|
||||
block content
|
||||
h1 Users
|
||||
#users
|
||||
for user, i in users
|
||||
li
|
||||
a(href="/user/#{i}")= user.name
|
||||
a.edit(href="/user/#{i}/edit") edit
|
||||
6
examples/route-separation/views/users/view.jade
Normal file
6
examples/route-separation/views/users/view.jade
Normal file
@@ -0,0 +1,6 @@
|
||||
extends ../layout
|
||||
|
||||
block content
|
||||
h1= user.name
|
||||
#user
|
||||
p Email: #{user.email}
|
||||
14
examples/search/client.js
Normal file
14
examples/search/client.js
Normal file
@@ -0,0 +1,14 @@
|
||||
|
||||
var search = document.querySelector('[type=search]');
|
||||
var code = document.querySelector('pre');
|
||||
|
||||
search.addEventListener('keyup', function(){
|
||||
var xhr = new XMLHttpRequest;
|
||||
xhr.open('GET', '/search/' + search.value, true);
|
||||
xhr.onreadystatechange = function(){
|
||||
if (4 == xhr.readyState) {
|
||||
code.textContent = xhr.responseText;
|
||||
}
|
||||
};
|
||||
xhr.send();
|
||||
}, false);
|
||||
61
examples/search/index.js
Normal file
61
examples/search/index.js
Normal file
@@ -0,0 +1,61 @@
|
||||
|
||||
// first:
|
||||
// $ npm install redis
|
||||
// $ redis-server
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var express = require('../..')
|
||||
, redis = require('redis')
|
||||
, db = redis.createClient();
|
||||
|
||||
// npm install redis
|
||||
|
||||
var app = express();
|
||||
|
||||
app.set('view engine', 'jade');
|
||||
app.set('views', __dirname);
|
||||
|
||||
// populate search
|
||||
|
||||
db.sadd('ferret', 'tobi');
|
||||
db.sadd('ferret', 'loki');
|
||||
db.sadd('ferret', 'jane');
|
||||
db.sadd('cat', 'manny');
|
||||
db.sadd('cat', 'luna');
|
||||
|
||||
/**
|
||||
* GET the search page.
|
||||
*/
|
||||
|
||||
app.get('/', function(req, res){
|
||||
res.render('search');
|
||||
});
|
||||
|
||||
/**
|
||||
* GET search for :query.
|
||||
*/
|
||||
|
||||
app.get('/search/:query?', function(req, res){
|
||||
var query = req.params.query;
|
||||
db.smembers(query, function(err, vals){
|
||||
if (err) return res.send(500);
|
||||
res.send(vals);
|
||||
});
|
||||
});
|
||||
|
||||
/**
|
||||
* GET client javascript. Here we use sendfile()
|
||||
* because serving __dirname with the static() middleware
|
||||
* would also mean serving our server "index.js" and the "search.jade"
|
||||
* template.
|
||||
*/
|
||||
|
||||
app.get('/client.js', function(req, res){
|
||||
res.sendfile(__dirname + '/client.js');
|
||||
});
|
||||
|
||||
app.listen(3000);
|
||||
console.log('app listening on port 3000');
|
||||
15
examples/search/search.jade
Normal file
15
examples/search/search.jade
Normal file
@@ -0,0 +1,15 @@
|
||||
!!! 5
|
||||
html
|
||||
head
|
||||
title Search example
|
||||
style
|
||||
body {
|
||||
font: 14px "Helvetica Neue", Helvetica;
|
||||
padding: 50px;
|
||||
}
|
||||
body
|
||||
h2 Search
|
||||
p Try searching for "ferret" or "cat".
|
||||
input(type='search')
|
||||
pre
|
||||
script(src='client.js')
|
||||
32
examples/session/index.js
Normal file
32
examples/session/index.js
Normal file
@@ -0,0 +1,32 @@
|
||||
|
||||
// first:
|
||||
// $ npm install redis
|
||||
// $ redis-server
|
||||
|
||||
var express = require('../..');
|
||||
|
||||
var app = express();
|
||||
|
||||
app.use(express.logger('dev'));
|
||||
|
||||
// Required by session() middleware
|
||||
// pass the secret for signed cookies
|
||||
// (required by session())
|
||||
app.use(express.cookieParser('keyboard cat'));
|
||||
|
||||
// Populates req.session
|
||||
app.use(express.session());
|
||||
|
||||
app.get('/', function(req, res){
|
||||
var body = '';
|
||||
if (req.session.views) {
|
||||
++req.session.views;
|
||||
} else {
|
||||
req.session.views = 1;
|
||||
body += '<p>First time visiting? view this page in several browsers :)</p>';
|
||||
}
|
||||
res.send(body + '<p>viewed <strong>' + req.session.views + '</strong> times.</p>');
|
||||
});
|
||||
|
||||
app.listen(3000);
|
||||
console.log('Express app started on port 3000');
|
||||
33
examples/session/redis.js
Normal file
33
examples/session/redis.js
Normal file
@@ -0,0 +1,33 @@
|
||||
|
||||
|
||||
var express = require('../..');
|
||||
|
||||
// pass the express to the connect redis module
|
||||
// allowing it to inherit from express.session.Store
|
||||
var RedisStore = require('connect-redis')(express);
|
||||
|
||||
var app = express();
|
||||
|
||||
app.use(express.logger('dev'));
|
||||
|
||||
// Required by session() middleware
|
||||
// pass the secret for signed cookies
|
||||
// (required by session())
|
||||
app.use(express.cookieParser('keyboard cat'));
|
||||
|
||||
// Populates req.session
|
||||
app.use(express.session({ store: new RedisStore }));
|
||||
|
||||
app.get('/', function(req, res){
|
||||
var body = '';
|
||||
if (req.session.views) {
|
||||
++req.session.views;
|
||||
} else {
|
||||
req.session.views = 1;
|
||||
body += '<p>First time visiting? view this page in several browsers :)</p>';
|
||||
}
|
||||
res.send(body + '<p>viewed <strong>' + req.session.views + '</strong> times.</p>');
|
||||
});
|
||||
|
||||
app.listen(3000);
|
||||
console.log('Express app started on port 3000');
|
||||
44
examples/static-files/index.js
Normal file
44
examples/static-files/index.js
Normal file
@@ -0,0 +1,44 @@
|
||||
|
||||
var express = require('../..');
|
||||
var app = express();
|
||||
|
||||
// log requests
|
||||
app.use(express.logger('dev'));
|
||||
|
||||
// express on its own has no notion
|
||||
// of a "file". The express.static()
|
||||
// middleware checks for a file matching
|
||||
// the `req.path` within the directory
|
||||
// that you pass it. In this case "GET /js/app.js"
|
||||
// will look for "./public/js/app.js".
|
||||
|
||||
app.use(express.static(__dirname + '/public'));
|
||||
|
||||
// if you wanted to "prefix" you may use
|
||||
// the mounting feature of Connect, for example
|
||||
// "GET /static/js/app.js" instead of "GET /js/app.js".
|
||||
// The mount-path "/static" is simply removed before
|
||||
// passing control to the express.static() middleware,
|
||||
// thus it serves the file correctly by ignoring "/static"
|
||||
app.use('/static', express.static(__dirname + '/public'));
|
||||
|
||||
// if for some reason you want to serve files from
|
||||
// several directories, you can use express.static()
|
||||
// multiple times! Here we're passing "./public/css",
|
||||
// this will allow "GET /style.css" instead of "GET /css/style.css":
|
||||
app.use(express.static(__dirname + '/public/css'));
|
||||
|
||||
// this examples does not have any routes, however
|
||||
// you may `app.use(app.router)` before or after these
|
||||
// static() middleware. If placed before them your routes
|
||||
// will be matched BEFORE file serving takes place. If placed
|
||||
// after as shown here then file serving is performed BEFORE
|
||||
// any routes are hit:
|
||||
app.use(app.router);
|
||||
|
||||
app.listen(3000);
|
||||
console.log('listening on port 3000');
|
||||
console.log('try:');
|
||||
console.log(' GET /hello.txt');
|
||||
console.log(' GET /js/app.js');
|
||||
console.log(' GET /css/style.css');
|
||||
3
examples/static-files/public/css/style.css
Normal file
3
examples/static-files/public/css/style.css
Normal file
@@ -0,0 +1,3 @@
|
||||
body {
|
||||
|
||||
}
|
||||
1
examples/static-files/public/hello.txt
Normal file
1
examples/static-files/public/hello.txt
Normal file
@@ -0,0 +1 @@
|
||||
hey
|
||||
1
examples/static-files/public/js/app.js
Normal file
1
examples/static-files/public/js/app.js
Normal file
@@ -0,0 +1 @@
|
||||
foo
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user