dlgosla

[fix] add 404 error handling

No preview for this file type

68.2 KB

1 -## 트위터 내 계정 분석 사이트 1 +### http://khuhub.khu.ac.kr/2018110654/term-project 의 프로젝트를 깃허브로 이동하였습니다.
2 +
3 +# 트위터 내 계정 분석 사이트
2 <img src="images/main.png"> 4 <img src="images/main.png">
3 5
4 -http://www.twitter-analyze.ml 6 +
7 +http://www.twitter-analyze.ml:3000/
5 서버가 켜져있다면 위의 url으로 접속할 수도 있습니다. 8 서버가 켜져있다면 위의 url으로 접속할 수도 있습니다.
9 +
6 10
7 ## 프로젝트 소개 11 ## 프로젝트 소개
8 검색한 트위터 계정의 **타임라인을 분석하는 사이트**입니다.</br> 12 검색한 트위터 계정의 **타임라인을 분석하는 사이트**입니다.</br>
...@@ -25,14 +29,12 @@ http://www.twitter-analyze.ml ...@@ -25,14 +29,12 @@ http://www.twitter-analyze.ml
25 ## 빌드방법 29 ## 빌드방법
26 30
27 > <https://developer.twitter.com/en></br> 31 > <https://developer.twitter.com/en></br>
28 -
29 _위 링크에서 twiiter api key를 발급받고 코드에 발급받은 key를 삽입해주세요 32 _위 링크에서 twiiter api key를 발급받고 코드에 발급받은 key를 삽입해주세요
30 33
31 > npm install 34 > npm install
32 > npm install twitter 35 > npm install twitter
33 36
34 _terminal에서 위의 명령어를 작성해주세요_ 37 _terminal에서 위의 명령어를 작성해주세요_
35 -
36 38
37 39
38 > npm install twitter 40 > npm install twitter
...@@ -43,7 +45,6 @@ _terminal에서 위의 명령어를 작성해주세요_ ...@@ -43,7 +45,6 @@ _terminal에서 위의 명령어를 작성해주세요_
43 _위의 명령어가 작동하지 않는다면 이 명령어로 시도하세요_ 45 _위의 명령어가 작동하지 않는다면 이 명령어로 시도하세요_
44 46
45 ## 사용방법 47 ## 사용방법
46 -
47 1. 타임라인 검색 기능 48 1. 타임라인 검색 기능
48 - 메인페이지에 있는 검색창에 보고싶은 계정의 아이디(ex)@twitterKorea)를 검색해 타임라인을 볼 수 있습니다. 49 - 메인페이지에 있는 검색창에 보고싶은 계정의 아이디(ex)@twitterKorea)를 검색해 타임라인을 볼 수 있습니다.
49 <img src="images/timeline.png"> 50 <img src="images/timeline.png">
...@@ -53,7 +54,7 @@ _위의 명령어가 작동하지 않는다면 이 명령어로 시도하세요_ ...@@ -53,7 +54,7 @@ _위의 명령어가 작동하지 않는다면 이 명령어로 시도하세요_
53 <img src="images/search.png"> 54 <img src="images/search.png">
54 55
55 - 이 때 내가 리트윗한 게시물도 포함해 검색합니다 56 - 이 때 내가 리트윗한 게시물도 포함해 검색합니다
56 - <img src="images/retweet search.png"> 57 + <img src="images/retweet%20search.png">
57 58
58 3. 인기글 보여주기 기능 59 3. 인기글 보여주기 기능
59 - 현재 해당계정에서 인기있는 글들을 모아 보여줍니다. 60 - 현재 해당계정에서 인기있는 글들을 모아 보여줍니다.
......
1 +{
2 + "name": "express-tutorial",
3 + "version": "1.0.0",
4 + "lockfileVersion": 2,
5 + "requires": true,
6 + "packages": {
7 + "": {
8 + "name": "express-tutorial",
9 + "version": "1.0.0",
10 + "dependencies": {
11 + "ejs": "~2.4.1",
12 + "express": "~4.13.1",
13 + "twitter": "^1.7.1"
14 + }
15 + },
16 + "node_modules/accepts": {
17 + "version": "1.2.13",
18 + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.2.13.tgz",
19 + "integrity": "sha512-R190A3EzrS4huFOVZajhXCYZt5p5yrkaQOB4nsWzfth0cYaDcSN5J86l58FJ1dt7igp37fB/QhnuFkGAJmr+eg==",
20 + "dependencies": {
21 + "mime-types": "~2.1.6",
22 + "negotiator": "0.5.3"
23 + },
24 + "engines": {
25 + "node": ">= 0.6"
26 + }
27 + },
28 + "node_modules/ajv": {
29 + "version": "6.12.6",
30 + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
31 + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
32 + "dependencies": {
33 + "fast-deep-equal": "^3.1.1",
34 + "fast-json-stable-stringify": "^2.0.0",
35 + "json-schema-traverse": "^0.4.1",
36 + "uri-js": "^4.2.2"
37 + },
38 + "funding": {
39 + "type": "github",
40 + "url": "https://github.com/sponsors/epoberezkin"
41 + }
42 + },
43 + "node_modules/array-flatten": {
44 + "version": "1.1.1",
45 + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
46 + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
47 + },
48 + "node_modules/asn1": {
49 + "version": "0.2.6",
50 + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
51 + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
52 + "dependencies": {
53 + "safer-buffer": "~2.1.0"
54 + }
55 + },
56 + "node_modules/assert-plus": {
57 + "version": "1.0.0",
58 + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
59 + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
60 + "engines": {
61 + "node": ">=0.8"
62 + }
63 + },
64 + "node_modules/asynckit": {
65 + "version": "0.4.0",
66 + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
67 + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
68 + },
69 + "node_modules/aws-sign2": {
70 + "version": "0.7.0",
71 + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
72 + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
73 + "engines": {
74 + "node": "*"
75 + }
76 + },
77 + "node_modules/aws4": {
78 + "version": "1.11.0",
79 + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
80 + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA=="
81 + },
82 + "node_modules/bcrypt-pbkdf": {
83 + "version": "1.0.2",
84 + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
85 + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
86 + "dependencies": {
87 + "tweetnacl": "^0.14.3"
88 + }
89 + },
90 + "node_modules/caseless": {
91 + "version": "0.12.0",
92 + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
93 + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="
94 + },
95 + "node_modules/combined-stream": {
96 + "version": "1.0.8",
97 + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
98 + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
99 + "dependencies": {
100 + "delayed-stream": "~1.0.0"
101 + },
102 + "engines": {
103 + "node": ">= 0.8"
104 + }
105 + },
106 + "node_modules/content-disposition": {
107 + "version": "0.5.1",
108 + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.1.tgz",
109 + "integrity": "sha512-LXP3Ekizrynh01Muic+1XMkR46z/d2wAO/TBnwCgdTmpFJrtwkzrCxQCsC7QnNqlShJgrQyygcX2I8oJ0wnzkw==",
110 + "engines": {
111 + "node": ">= 0.6"
112 + }
113 + },
114 + "node_modules/content-type": {
115 + "version": "1.0.4",
116 + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
117 + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
118 + "engines": {
119 + "node": ">= 0.6"
120 + }
121 + },
122 + "node_modules/cookie": {
123 + "version": "0.1.5",
124 + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.5.tgz",
125 + "integrity": "sha512-/lhu+NGBI5pOLXILS07DrPXYX0QDD/ejVhbwoCUcLPBqMEK9b++f9rUhAlhLkcTz9mV6QSeD+w3cHJ96rMZaFQ==",
126 + "engines": {
127 + "node": ">= 0.6"
128 + }
129 + },
130 + "node_modules/cookie-signature": {
131 + "version": "1.0.6",
132 + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
133 + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
134 + },
135 + "node_modules/core-util-is": {
136 + "version": "1.0.2",
137 + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
138 + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="
139 + },
140 + "node_modules/dashdash": {
141 + "version": "1.14.1",
142 + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
143 + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
144 + "dependencies": {
145 + "assert-plus": "^1.0.0"
146 + },
147 + "engines": {
148 + "node": ">=0.10"
149 + }
150 + },
151 + "node_modules/debug": {
152 + "version": "2.2.0",
153 + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
154 + "integrity": "sha512-X0rGvJcskG1c3TgSCPqHJ0XJgwlcvOC7elJ5Y0hYuKBZoVqWpAMfLOeIh2UI/DCQ5ruodIjvsugZtjUYUw2pUw==",
155 + "dependencies": {
156 + "ms": "0.7.1"
157 + }
158 + },
159 + "node_modules/deep-extend": {
160 + "version": "0.5.1",
161 + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz",
162 + "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==",
163 + "engines": {
164 + "iojs": ">=1.0.0",
165 + "node": ">=0.10.0"
166 + }
167 + },
168 + "node_modules/delayed-stream": {
169 + "version": "1.0.0",
170 + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
171 + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
172 + "engines": {
173 + "node": ">=0.4.0"
174 + }
175 + },
176 + "node_modules/depd": {
177 + "version": "1.1.2",
178 + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
179 + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
180 + "engines": {
181 + "node": ">= 0.6"
182 + }
183 + },
184 + "node_modules/destroy": {
185 + "version": "1.0.4",
186 + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
187 + "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg=="
188 + },
189 + "node_modules/ecc-jsbn": {
190 + "version": "0.1.2",
191 + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
192 + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
193 + "dependencies": {
194 + "jsbn": "~0.1.0",
195 + "safer-buffer": "^2.1.0"
196 + }
197 + },
198 + "node_modules/ee-first": {
199 + "version": "1.1.1",
200 + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
201 + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
202 + },
203 + "node_modules/ejs": {
204 + "version": "2.4.2",
205 + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.4.2.tgz",
206 + "integrity": "sha512-mA6xJvRRuXoVRjERxqOtoxwQ4s5sqMLtIpRnFJBlTp6dzAxCowBr75YsPK+/SSHLNohSD0V5bCem19lyAn8qRQ==",
207 + "deprecated": "Critical security bugs fixed in 2.5.5",
208 + "engines": {
209 + "node": ">=0.10.0"
210 + }
211 + },
212 + "node_modules/escape-html": {
213 + "version": "1.0.3",
214 + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
215 + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
216 + },
217 + "node_modules/etag": {
218 + "version": "1.7.0",
219 + "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz",
220 + "integrity": "sha512-Mbv5pNpLNPrm1b4rzZlZlfTRpdDr31oiD43N362sIyvSWVNu5Du33EcJGzvEV4YdYLuENB1HzND907cQkFmXNw==",
221 + "engines": {
222 + "node": ">= 0.6"
223 + }
224 + },
225 + "node_modules/express": {
226 + "version": "4.13.4",
227 + "resolved": "https://registry.npmjs.org/express/-/express-4.13.4.tgz",
228 + "integrity": "sha512-pNykF2h4VgBMH8gJfwwBh4kqaIyV/DcFIX6UpC751GF7du2kA1pkxJ2/SmggVGbYCa4mBRcWh0yiTfK8Dp/Rdg==",
229 + "dependencies": {
230 + "accepts": "~1.2.12",
231 + "array-flatten": "1.1.1",
232 + "content-disposition": "0.5.1",
233 + "content-type": "~1.0.1",
234 + "cookie": "0.1.5",
235 + "cookie-signature": "1.0.6",
236 + "debug": "~2.2.0",
237 + "depd": "~1.1.0",
238 + "escape-html": "~1.0.3",
239 + "etag": "~1.7.0",
240 + "finalhandler": "0.4.1",
241 + "fresh": "0.3.0",
242 + "merge-descriptors": "1.0.1",
243 + "methods": "~1.1.2",
244 + "on-finished": "~2.3.0",
245 + "parseurl": "~1.3.1",
246 + "path-to-regexp": "0.1.7",
247 + "proxy-addr": "~1.0.10",
248 + "qs": "4.0.0",
249 + "range-parser": "~1.0.3",
250 + "send": "0.13.1",
251 + "serve-static": "~1.10.2",
252 + "type-is": "~1.6.6",
253 + "utils-merge": "1.0.0",
254 + "vary": "~1.0.1"
255 + },
256 + "engines": {
257 + "node": ">= 0.10.0"
258 + }
259 + },
260 + "node_modules/express/node_modules/qs": {
261 + "version": "4.0.0",
262 + "resolved": "https://registry.npmjs.org/qs/-/qs-4.0.0.tgz",
263 + "integrity": "sha512-8MPmJ83uBOPsQj5tQCv4g04/nTiY+d17yl9o3Bw73vC6XlEm2POIRRlOgWJ8i74bkGLII670cDJJZkgiZ2sIkg=="
264 + },
265 + "node_modules/extend": {
266 + "version": "3.0.2",
267 + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
268 + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
269 + },
270 + "node_modules/extsprintf": {
271 + "version": "1.3.0",
272 + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
273 + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
274 + "engines": [
275 + "node >=0.6.0"
276 + ]
277 + },
278 + "node_modules/fast-deep-equal": {
279 + "version": "3.1.3",
280 + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
281 + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
282 + },
283 + "node_modules/fast-json-stable-stringify": {
284 + "version": "2.1.0",
285 + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
286 + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
287 + },
288 + "node_modules/finalhandler": {
289 + "version": "0.4.1",
290 + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.1.tgz",
291 + "integrity": "sha512-+AkanbaabSCYrDcrU+TcA/8SEyMDAN7mjE6GC71GAlvYDXM4wzUsRqLLS2qPtWecIlkX5+MMZGd2RyxO3yBOfg==",
292 + "dependencies": {
293 + "debug": "~2.2.0",
294 + "escape-html": "~1.0.3",
295 + "on-finished": "~2.3.0",
296 + "unpipe": "~1.0.0"
297 + },
298 + "engines": {
299 + "node": ">= 0.8"
300 + }
301 + },
302 + "node_modules/forever-agent": {
303 + "version": "0.6.1",
304 + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
305 + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
306 + "engines": {
307 + "node": "*"
308 + }
309 + },
310 + "node_modules/form-data": {
311 + "version": "2.3.3",
312 + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
313 + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
314 + "dependencies": {
315 + "asynckit": "^0.4.0",
316 + "combined-stream": "^1.0.6",
317 + "mime-types": "^2.1.12"
318 + },
319 + "engines": {
320 + "node": ">= 0.12"
321 + }
322 + },
323 + "node_modules/forwarded": {
324 + "version": "0.1.2",
325 + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
326 + "integrity": "sha512-Ua9xNhH0b8pwE3yRbFfXJvfdWF0UHNCdeyb2sbi9Ul/M+r3PTdrz7Cv4SCfZRMjmzEM9PhraqfZFbGTIg3OMyA==",
327 + "engines": {
328 + "node": ">= 0.6"
329 + }
330 + },
331 + "node_modules/fresh": {
332 + "version": "0.3.0",
333 + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz",
334 + "integrity": "sha512-akx5WBKAwMSg36qoHTuMMVncHWctlaDGslJASDYAhoLrzDUDCjZlOngNa/iC6lPm9aA0qk8pN5KnpmbJHSIIQQ==",
335 + "engines": {
336 + "node": ">= 0.6"
337 + }
338 + },
339 + "node_modules/getpass": {
340 + "version": "0.1.7",
341 + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
342 + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
343 + "dependencies": {
344 + "assert-plus": "^1.0.0"
345 + }
346 + },
347 + "node_modules/har-schema": {
348 + "version": "2.0.0",
349 + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
350 + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==",
351 + "engines": {
352 + "node": ">=4"
353 + }
354 + },
355 + "node_modules/har-validator": {
356 + "version": "5.1.5",
357 + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
358 + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
359 + "deprecated": "this library is no longer supported",
360 + "dependencies": {
361 + "ajv": "^6.12.3",
362 + "har-schema": "^2.0.0"
363 + },
364 + "engines": {
365 + "node": ">=6"
366 + }
367 + },
368 + "node_modules/http-errors": {
369 + "version": "1.3.1",
370 + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz",
371 + "integrity": "sha512-gMygNskMurDCWfoCdyh1gOeDfSbkAHXqz94QoPj5IHIUjC/BG8/xv7FSEUr7waR5RcAya4j58bft9Wu/wHNeXA==",
372 + "dependencies": {
373 + "inherits": "~2.0.1",
374 + "statuses": "1"
375 + },
376 + "engines": {
377 + "node": ">= 0.6"
378 + }
379 + },
380 + "node_modules/http-signature": {
381 + "version": "1.2.0",
382 + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
383 + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==",
384 + "dependencies": {
385 + "assert-plus": "^1.0.0",
386 + "jsprim": "^1.2.2",
387 + "sshpk": "^1.7.0"
388 + },
389 + "engines": {
390 + "node": ">=0.8",
391 + "npm": ">=1.3.7"
392 + }
393 + },
394 + "node_modules/inherits": {
395 + "version": "2.0.4",
396 + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
397 + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
398 + },
399 + "node_modules/ipaddr.js": {
400 + "version": "1.0.5",
401 + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.0.5.tgz",
402 + "integrity": "sha512-wBj+q+3uP78gMowwWgFLAYm/q4x5goyZmDsmuvyz+nd1u0D/ghgXXtc1OkgmTzSiWT101kiqGacwFk9eGQw6xQ==",
403 + "engines": {
404 + "node": ">= 0.10"
405 + }
406 + },
407 + "node_modules/is-typedarray": {
408 + "version": "1.0.0",
409 + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
410 + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
411 + },
412 + "node_modules/isstream": {
413 + "version": "0.1.2",
414 + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
415 + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="
416 + },
417 + "node_modules/jsbn": {
418 + "version": "0.1.1",
419 + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
420 + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="
421 + },
422 + "node_modules/json-schema": {
423 + "version": "0.4.0",
424 + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
425 + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
426 + },
427 + "node_modules/json-schema-traverse": {
428 + "version": "0.4.1",
429 + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
430 + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
431 + },
432 + "node_modules/json-stringify-safe": {
433 + "version": "5.0.1",
434 + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
435 + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="
436 + },
437 + "node_modules/jsprim": {
438 + "version": "1.4.2",
439 + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
440 + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
441 + "dependencies": {
442 + "assert-plus": "1.0.0",
443 + "extsprintf": "1.3.0",
444 + "json-schema": "0.4.0",
445 + "verror": "1.10.0"
446 + },
447 + "engines": {
448 + "node": ">=0.6.0"
449 + }
450 + },
451 + "node_modules/media-typer": {
452 + "version": "0.3.0",
453 + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
454 + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
455 + "engines": {
456 + "node": ">= 0.6"
457 + }
458 + },
459 + "node_modules/merge-descriptors": {
460 + "version": "1.0.1",
461 + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
462 + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
463 + },
464 + "node_modules/methods": {
465 + "version": "1.1.2",
466 + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
467 + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
468 + "engines": {
469 + "node": ">= 0.6"
470 + }
471 + },
472 + "node_modules/mime": {
473 + "version": "1.3.4",
474 + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz",
475 + "integrity": "sha512-sAaYXszED5ALBt665F0wMQCUXpGuZsGdopoqcHPdL39ZYdi7uHoZlhrfZfhv8WzivhBzr/oXwaj+yiK5wY8MXQ==",
476 + "bin": {
477 + "mime": "cli.js"
478 + }
479 + },
480 + "node_modules/mime-db": {
481 + "version": "1.52.0",
482 + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
483 + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
484 + "engines": {
485 + "node": ">= 0.6"
486 + }
487 + },
488 + "node_modules/mime-types": {
489 + "version": "2.1.35",
490 + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
491 + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
492 + "dependencies": {
493 + "mime-db": "1.52.0"
494 + },
495 + "engines": {
496 + "node": ">= 0.6"
497 + }
498 + },
499 + "node_modules/ms": {
500 + "version": "0.7.1",
501 + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz",
502 + "integrity": "sha512-lRLiIR9fSNpnP6TC4v8+4OU7oStC01esuNowdQ34L+Gk8e5Puoc88IqJ+XAY/B3Mn2ZKis8l8HX90oU8ivzUHg=="
503 + },
504 + "node_modules/negotiator": {
505 + "version": "0.5.3",
506 + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz",
507 + "integrity": "sha512-oXmnazqehLNFohqgLxRyUdOQU9/UX0NpCpsnbjWUjM62ZM8oSOXYZpHc68XR130ftPNano0oQXGdREAplZRhaQ==",
508 + "engines": {
509 + "node": ">= 0.6"
510 + }
511 + },
512 + "node_modules/oauth-sign": {
513 + "version": "0.9.0",
514 + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
515 + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
516 + "engines": {
517 + "node": "*"
518 + }
519 + },
520 + "node_modules/on-finished": {
521 + "version": "2.3.0",
522 + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
523 + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
524 + "dependencies": {
525 + "ee-first": "1.1.1"
526 + },
527 + "engines": {
528 + "node": ">= 0.8"
529 + }
530 + },
531 + "node_modules/parseurl": {
532 + "version": "1.3.3",
533 + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
534 + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
535 + "engines": {
536 + "node": ">= 0.8"
537 + }
538 + },
539 + "node_modules/path-to-regexp": {
540 + "version": "0.1.7",
541 + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
542 + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
543 + },
544 + "node_modules/performance-now": {
545 + "version": "2.1.0",
546 + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
547 + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="
548 + },
549 + "node_modules/proxy-addr": {
550 + "version": "1.0.10",
551 + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.10.tgz",
552 + "integrity": "sha512-iq6kR9KN32aFvXjDyC8nIrm203AHeIBPjL6dpaHgSdbpTO8KoPlD0xG92xwwtkCL9+yt1LE5VwpEk43TyP38Dg==",
553 + "dependencies": {
554 + "forwarded": "~0.1.0",
555 + "ipaddr.js": "1.0.5"
556 + },
557 + "engines": {
558 + "node": ">= 0.6"
559 + }
560 + },
561 + "node_modules/psl": {
562 + "version": "1.8.0",
563 + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
564 + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
565 + },
566 + "node_modules/punycode": {
567 + "version": "2.1.1",
568 + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
569 + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
570 + "engines": {
571 + "node": ">=6"
572 + }
573 + },
574 + "node_modules/qs": {
575 + "version": "6.5.3",
576 + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
577 + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
578 + "engines": {
579 + "node": ">=0.6"
580 + }
581 + },
582 + "node_modules/range-parser": {
583 + "version": "1.0.3",
584 + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz",
585 + "integrity": "sha512-nDsRrtIxVUO5opg/A8T2S3ebULVIfuh8ECbh4w3N4mWxIiT3QILDJDUQayPqm2e8Q8NUa0RSUkGCfe33AfjR3Q==",
586 + "engines": {
587 + "node": ">= 0.6"
588 + }
589 + },
590 + "node_modules/request": {
591 + "version": "2.88.2",
592 + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
593 + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
594 + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142",
595 + "dependencies": {
596 + "aws-sign2": "~0.7.0",
597 + "aws4": "^1.8.0",
598 + "caseless": "~0.12.0",
599 + "combined-stream": "~1.0.6",
600 + "extend": "~3.0.2",
601 + "forever-agent": "~0.6.1",
602 + "form-data": "~2.3.2",
603 + "har-validator": "~5.1.3",
604 + "http-signature": "~1.2.0",
605 + "is-typedarray": "~1.0.0",
606 + "isstream": "~0.1.2",
607 + "json-stringify-safe": "~5.0.1",
608 + "mime-types": "~2.1.19",
609 + "oauth-sign": "~0.9.0",
610 + "performance-now": "^2.1.0",
611 + "qs": "~6.5.2",
612 + "safe-buffer": "^5.1.2",
613 + "tough-cookie": "~2.5.0",
614 + "tunnel-agent": "^0.6.0",
615 + "uuid": "^3.3.2"
616 + },
617 + "engines": {
618 + "node": ">= 6"
619 + }
620 + },
621 + "node_modules/safe-buffer": {
622 + "version": "5.2.1",
623 + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
624 + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
625 + "funding": [
626 + {
627 + "type": "github",
628 + "url": "https://github.com/sponsors/feross"
629 + },
630 + {
631 + "type": "patreon",
632 + "url": "https://www.patreon.com/feross"
633 + },
634 + {
635 + "type": "consulting",
636 + "url": "https://feross.org/support"
637 + }
638 + ]
639 + },
640 + "node_modules/safer-buffer": {
641 + "version": "2.1.2",
642 + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
643 + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
644 + },
645 + "node_modules/send": {
646 + "version": "0.13.1",
647 + "resolved": "https://registry.npmjs.org/send/-/send-0.13.1.tgz",
648 + "integrity": "sha512-tajY7yMvJena2iggWhCzaysOVj/CH4AzqV2lJHUHboVNWQkIFEBJdKtzryKg3fLa83lxq9n/WQV53w9JZCe72w==",
649 + "dependencies": {
650 + "debug": "~2.2.0",
651 + "depd": "~1.1.0",
652 + "destroy": "~1.0.4",
653 + "escape-html": "~1.0.3",
654 + "etag": "~1.7.0",
655 + "fresh": "0.3.0",
656 + "http-errors": "~1.3.1",
657 + "mime": "1.3.4",
658 + "ms": "0.7.1",
659 + "on-finished": "~2.3.0",
660 + "range-parser": "~1.0.3",
661 + "statuses": "~1.2.1"
662 + },
663 + "engines": {
664 + "node": ">= 0.8.0"
665 + }
666 + },
667 + "node_modules/serve-static": {
668 + "version": "1.10.3",
669 + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.10.3.tgz",
670 + "integrity": "sha512-ScsFovjz3Db+vGgpofR/U8p8UULEcGV9akqyo8TQ1mMnjcxemE7Y5Muo+dvy3tJLY/doY2v1H61eCBMYGmwfrA==",
671 + "dependencies": {
672 + "escape-html": "~1.0.3",
673 + "parseurl": "~1.3.1",
674 + "send": "0.13.2"
675 + },
676 + "engines": {
677 + "node": ">= 0.8.0"
678 + }
679 + },
680 + "node_modules/serve-static/node_modules/send": {
681 + "version": "0.13.2",
682 + "resolved": "https://registry.npmjs.org/send/-/send-0.13.2.tgz",
683 + "integrity": "sha512-cQ0rmXHrdO2Iof08igV2bG/yXWD106ANwBg6DkGQNT2Vsznbgq6T0oAIQboy1GoFsIuy51jCim26aA9tj3Z3Zg==",
684 + "dependencies": {
685 + "debug": "~2.2.0",
686 + "depd": "~1.1.0",
687 + "destroy": "~1.0.4",
688 + "escape-html": "~1.0.3",
689 + "etag": "~1.7.0",
690 + "fresh": "0.3.0",
691 + "http-errors": "~1.3.1",
692 + "mime": "1.3.4",
693 + "ms": "0.7.1",
694 + "on-finished": "~2.3.0",
695 + "range-parser": "~1.0.3",
696 + "statuses": "~1.2.1"
697 + },
698 + "engines": {
699 + "node": ">= 0.8.0"
700 + }
701 + },
702 + "node_modules/sshpk": {
703 + "version": "1.17.0",
704 + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
705 + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
706 + "dependencies": {
707 + "asn1": "~0.2.3",
708 + "assert-plus": "^1.0.0",
709 + "bcrypt-pbkdf": "^1.0.0",
710 + "dashdash": "^1.12.0",
711 + "ecc-jsbn": "~0.1.1",
712 + "getpass": "^0.1.1",
713 + "jsbn": "~0.1.0",
714 + "safer-buffer": "^2.0.2",
715 + "tweetnacl": "~0.14.0"
716 + },
717 + "bin": {
718 + "sshpk-conv": "bin/sshpk-conv",
719 + "sshpk-sign": "bin/sshpk-sign",
720 + "sshpk-verify": "bin/sshpk-verify"
721 + },
722 + "engines": {
723 + "node": ">=0.10.0"
724 + }
725 + },
726 + "node_modules/statuses": {
727 + "version": "1.2.1",
728 + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz",
729 + "integrity": "sha512-pVEuxHdSGrt8QmQ3LOZXLhSA6MP/iPqKzZeO6Squ7PNGkA/9MBsSfV0/L+bIxkoDmjF4tZcLpcVq/fkqoHvuKg=="
730 + },
731 + "node_modules/tough-cookie": {
732 + "version": "2.5.0",
733 + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
734 + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
735 + "dependencies": {
736 + "psl": "^1.1.28",
737 + "punycode": "^2.1.1"
738 + },
739 + "engines": {
740 + "node": ">=0.8"
741 + }
742 + },
743 + "node_modules/tunnel-agent": {
744 + "version": "0.6.0",
745 + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
746 + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
747 + "dependencies": {
748 + "safe-buffer": "^5.0.1"
749 + },
750 + "engines": {
751 + "node": "*"
752 + }
753 + },
754 + "node_modules/tweetnacl": {
755 + "version": "0.14.5",
756 + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
757 + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="
758 + },
759 + "node_modules/twitter": {
760 + "version": "1.7.1",
761 + "resolved": "https://registry.npmjs.org/twitter/-/twitter-1.7.1.tgz",
762 + "integrity": "sha512-Do7l/WzFnUZC14ABtZfDiOHKl6M9Ft5tE4YF0ev9XLm4yh7m8R98D82rzeDAMjbjMZk2R/tb6sgXXb3sPKoaVw==",
763 + "dependencies": {
764 + "deep-extend": "^0.5.0",
765 + "request": "^2.72.0"
766 + }
767 + },
768 + "node_modules/type-is": {
769 + "version": "1.6.18",
770 + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
771 + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
772 + "dependencies": {
773 + "media-typer": "0.3.0",
774 + "mime-types": "~2.1.24"
775 + },
776 + "engines": {
777 + "node": ">= 0.6"
778 + }
779 + },
780 + "node_modules/unpipe": {
781 + "version": "1.0.0",
782 + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
783 + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
784 + "engines": {
785 + "node": ">= 0.8"
786 + }
787 + },
788 + "node_modules/uri-js": {
789 + "version": "4.4.1",
790 + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
791 + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
792 + "dependencies": {
793 + "punycode": "^2.1.0"
794 + }
795 + },
796 + "node_modules/utils-merge": {
797 + "version": "1.0.0",
798 + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz",
799 + "integrity": "sha512-HwU9SLQEtyo+0uoKXd1nkLqigUWLB+QuNQR4OcmB73eWqksM5ovuqcycks2x043W8XVb75rG1HQ0h93TMXkzQQ==",
800 + "engines": {
801 + "node": ">= 0.4.0"
802 + }
803 + },
804 + "node_modules/uuid": {
805 + "version": "3.4.0",
806 + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
807 + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
808 + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.",
809 + "bin": {
810 + "uuid": "bin/uuid"
811 + }
812 + },
813 + "node_modules/vary": {
814 + "version": "1.0.1",
815 + "resolved": "https://registry.npmjs.org/vary/-/vary-1.0.1.tgz",
816 + "integrity": "sha512-yNsH+tC0r8quK2tg/yqkXqqaYzeKTkSqQ+8T6xCoWgOi/bU/omMYz+6k+I91JJJDeltJzI7oridTOq6OYkY0Tw==",
817 + "engines": {
818 + "node": ">= 0.8"
819 + }
820 + },
821 + "node_modules/verror": {
822 + "version": "1.10.0",
823 + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
824 + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
825 + "engines": [
826 + "node >=0.6.0"
827 + ],
828 + "dependencies": {
829 + "assert-plus": "^1.0.0",
830 + "core-util-is": "1.0.2",
831 + "extsprintf": "^1.2.0"
832 + }
833 + }
834 + },
835 + "dependencies": {
836 + "accepts": {
837 + "version": "1.2.13",
838 + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.2.13.tgz",
839 + "integrity": "sha512-R190A3EzrS4huFOVZajhXCYZt5p5yrkaQOB4nsWzfth0cYaDcSN5J86l58FJ1dt7igp37fB/QhnuFkGAJmr+eg==",
840 + "requires": {
841 + "mime-types": "~2.1.6",
842 + "negotiator": "0.5.3"
843 + }
844 + },
845 + "ajv": {
846 + "version": "6.12.6",
847 + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
848 + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
849 + "requires": {
850 + "fast-deep-equal": "^3.1.1",
851 + "fast-json-stable-stringify": "^2.0.0",
852 + "json-schema-traverse": "^0.4.1",
853 + "uri-js": "^4.2.2"
854 + }
855 + },
856 + "array-flatten": {
857 + "version": "1.1.1",
858 + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
859 + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
860 + },
861 + "asn1": {
862 + "version": "0.2.6",
863 + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
864 + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
865 + "requires": {
866 + "safer-buffer": "~2.1.0"
867 + }
868 + },
869 + "assert-plus": {
870 + "version": "1.0.0",
871 + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
872 + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw=="
873 + },
874 + "asynckit": {
875 + "version": "0.4.0",
876 + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
877 + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
878 + },
879 + "aws-sign2": {
880 + "version": "0.7.0",
881 + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
882 + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA=="
883 + },
884 + "aws4": {
885 + "version": "1.11.0",
886 + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
887 + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA=="
888 + },
889 + "bcrypt-pbkdf": {
890 + "version": "1.0.2",
891 + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
892 + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
893 + "requires": {
894 + "tweetnacl": "^0.14.3"
895 + }
896 + },
897 + "caseless": {
898 + "version": "0.12.0",
899 + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
900 + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="
901 + },
902 + "combined-stream": {
903 + "version": "1.0.8",
904 + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
905 + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
906 + "requires": {
907 + "delayed-stream": "~1.0.0"
908 + }
909 + },
910 + "content-disposition": {
911 + "version": "0.5.1",
912 + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.1.tgz",
913 + "integrity": "sha512-LXP3Ekizrynh01Muic+1XMkR46z/d2wAO/TBnwCgdTmpFJrtwkzrCxQCsC7QnNqlShJgrQyygcX2I8oJ0wnzkw=="
914 + },
915 + "content-type": {
916 + "version": "1.0.4",
917 + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
918 + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
919 + },
920 + "cookie": {
921 + "version": "0.1.5",
922 + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.5.tgz",
923 + "integrity": "sha512-/lhu+NGBI5pOLXILS07DrPXYX0QDD/ejVhbwoCUcLPBqMEK9b++f9rUhAlhLkcTz9mV6QSeD+w3cHJ96rMZaFQ=="
924 + },
925 + "cookie-signature": {
926 + "version": "1.0.6",
927 + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
928 + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
929 + },
930 + "core-util-is": {
931 + "version": "1.0.2",
932 + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
933 + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="
934 + },
935 + "dashdash": {
936 + "version": "1.14.1",
937 + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
938 + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
939 + "requires": {
940 + "assert-plus": "^1.0.0"
941 + }
942 + },
943 + "debug": {
944 + "version": "2.2.0",
945 + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
946 + "integrity": "sha512-X0rGvJcskG1c3TgSCPqHJ0XJgwlcvOC7elJ5Y0hYuKBZoVqWpAMfLOeIh2UI/DCQ5ruodIjvsugZtjUYUw2pUw==",
947 + "requires": {
948 + "ms": "0.7.1"
949 + }
950 + },
951 + "deep-extend": {
952 + "version": "0.5.1",
953 + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz",
954 + "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w=="
955 + },
956 + "delayed-stream": {
957 + "version": "1.0.0",
958 + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
959 + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
960 + },
961 + "depd": {
962 + "version": "1.1.2",
963 + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
964 + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ=="
965 + },
966 + "destroy": {
967 + "version": "1.0.4",
968 + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
969 + "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg=="
970 + },
971 + "ecc-jsbn": {
972 + "version": "0.1.2",
973 + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
974 + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
975 + "requires": {
976 + "jsbn": "~0.1.0",
977 + "safer-buffer": "^2.1.0"
978 + }
979 + },
980 + "ee-first": {
981 + "version": "1.1.1",
982 + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
983 + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
984 + },
985 + "ejs": {
986 + "version": "2.4.2",
987 + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.4.2.tgz",
988 + "integrity": "sha512-mA6xJvRRuXoVRjERxqOtoxwQ4s5sqMLtIpRnFJBlTp6dzAxCowBr75YsPK+/SSHLNohSD0V5bCem19lyAn8qRQ=="
989 + },
990 + "escape-html": {
991 + "version": "1.0.3",
992 + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
993 + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
994 + },
995 + "etag": {
996 + "version": "1.7.0",
997 + "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz",
998 + "integrity": "sha512-Mbv5pNpLNPrm1b4rzZlZlfTRpdDr31oiD43N362sIyvSWVNu5Du33EcJGzvEV4YdYLuENB1HzND907cQkFmXNw=="
999 + },
1000 + "express": {
1001 + "version": "4.13.4",
1002 + "resolved": "https://registry.npmjs.org/express/-/express-4.13.4.tgz",
1003 + "integrity": "sha512-pNykF2h4VgBMH8gJfwwBh4kqaIyV/DcFIX6UpC751GF7du2kA1pkxJ2/SmggVGbYCa4mBRcWh0yiTfK8Dp/Rdg==",
1004 + "requires": {
1005 + "accepts": "~1.2.12",
1006 + "array-flatten": "1.1.1",
1007 + "content-disposition": "0.5.1",
1008 + "content-type": "~1.0.1",
1009 + "cookie": "0.1.5",
1010 + "cookie-signature": "1.0.6",
1011 + "debug": "~2.2.0",
1012 + "depd": "~1.1.0",
1013 + "escape-html": "~1.0.3",
1014 + "etag": "~1.7.0",
1015 + "finalhandler": "0.4.1",
1016 + "fresh": "0.3.0",
1017 + "merge-descriptors": "1.0.1",
1018 + "methods": "~1.1.2",
1019 + "on-finished": "~2.3.0",
1020 + "parseurl": "~1.3.1",
1021 + "path-to-regexp": "0.1.7",
1022 + "proxy-addr": "~1.0.10",
1023 + "qs": "4.0.0",
1024 + "range-parser": "~1.0.3",
1025 + "send": "0.13.1",
1026 + "serve-static": "~1.10.2",
1027 + "type-is": "~1.6.6",
1028 + "utils-merge": "1.0.0",
1029 + "vary": "~1.0.1"
1030 + },
1031 + "dependencies": {
1032 + "qs": {
1033 + "version": "4.0.0",
1034 + "resolved": "https://registry.npmjs.org/qs/-/qs-4.0.0.tgz",
1035 + "integrity": "sha512-8MPmJ83uBOPsQj5tQCv4g04/nTiY+d17yl9o3Bw73vC6XlEm2POIRRlOgWJ8i74bkGLII670cDJJZkgiZ2sIkg=="
1036 + }
1037 + }
1038 + },
1039 + "extend": {
1040 + "version": "3.0.2",
1041 + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
1042 + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
1043 + },
1044 + "extsprintf": {
1045 + "version": "1.3.0",
1046 + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
1047 + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g=="
1048 + },
1049 + "fast-deep-equal": {
1050 + "version": "3.1.3",
1051 + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
1052 + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
1053 + },
1054 + "fast-json-stable-stringify": {
1055 + "version": "2.1.0",
1056 + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
1057 + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
1058 + },
1059 + "finalhandler": {
1060 + "version": "0.4.1",
1061 + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.1.tgz",
1062 + "integrity": "sha512-+AkanbaabSCYrDcrU+TcA/8SEyMDAN7mjE6GC71GAlvYDXM4wzUsRqLLS2qPtWecIlkX5+MMZGd2RyxO3yBOfg==",
1063 + "requires": {
1064 + "debug": "~2.2.0",
1065 + "escape-html": "~1.0.3",
1066 + "on-finished": "~2.3.0",
1067 + "unpipe": "~1.0.0"
1068 + }
1069 + },
1070 + "forever-agent": {
1071 + "version": "0.6.1",
1072 + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
1073 + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw=="
1074 + },
1075 + "form-data": {
1076 + "version": "2.3.3",
1077 + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
1078 + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
1079 + "requires": {
1080 + "asynckit": "^0.4.0",
1081 + "combined-stream": "^1.0.6",
1082 + "mime-types": "^2.1.12"
1083 + }
1084 + },
1085 + "forwarded": {
1086 + "version": "0.1.2",
1087 + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
1088 + "integrity": "sha512-Ua9xNhH0b8pwE3yRbFfXJvfdWF0UHNCdeyb2sbi9Ul/M+r3PTdrz7Cv4SCfZRMjmzEM9PhraqfZFbGTIg3OMyA=="
1089 + },
1090 + "fresh": {
1091 + "version": "0.3.0",
1092 + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz",
1093 + "integrity": "sha512-akx5WBKAwMSg36qoHTuMMVncHWctlaDGslJASDYAhoLrzDUDCjZlOngNa/iC6lPm9aA0qk8pN5KnpmbJHSIIQQ=="
1094 + },
1095 + "getpass": {
1096 + "version": "0.1.7",
1097 + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
1098 + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
1099 + "requires": {
1100 + "assert-plus": "^1.0.0"
1101 + }
1102 + },
1103 + "har-schema": {
1104 + "version": "2.0.0",
1105 + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
1106 + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q=="
1107 + },
1108 + "har-validator": {
1109 + "version": "5.1.5",
1110 + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
1111 + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
1112 + "requires": {
1113 + "ajv": "^6.12.3",
1114 + "har-schema": "^2.0.0"
1115 + }
1116 + },
1117 + "http-errors": {
1118 + "version": "1.3.1",
1119 + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz",
1120 + "integrity": "sha512-gMygNskMurDCWfoCdyh1gOeDfSbkAHXqz94QoPj5IHIUjC/BG8/xv7FSEUr7waR5RcAya4j58bft9Wu/wHNeXA==",
1121 + "requires": {
1122 + "inherits": "~2.0.1",
1123 + "statuses": "1"
1124 + }
1125 + },
1126 + "http-signature": {
1127 + "version": "1.2.0",
1128 + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
1129 + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==",
1130 + "requires": {
1131 + "assert-plus": "^1.0.0",
1132 + "jsprim": "^1.2.2",
1133 + "sshpk": "^1.7.0"
1134 + }
1135 + },
1136 + "inherits": {
1137 + "version": "2.0.4",
1138 + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1139 + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
1140 + },
1141 + "ipaddr.js": {
1142 + "version": "1.0.5",
1143 + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.0.5.tgz",
1144 + "integrity": "sha512-wBj+q+3uP78gMowwWgFLAYm/q4x5goyZmDsmuvyz+nd1u0D/ghgXXtc1OkgmTzSiWT101kiqGacwFk9eGQw6xQ=="
1145 + },
1146 + "is-typedarray": {
1147 + "version": "1.0.0",
1148 + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
1149 + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
1150 + },
1151 + "isstream": {
1152 + "version": "0.1.2",
1153 + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
1154 + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="
1155 + },
1156 + "jsbn": {
1157 + "version": "0.1.1",
1158 + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
1159 + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="
1160 + },
1161 + "json-schema": {
1162 + "version": "0.4.0",
1163 + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
1164 + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
1165 + },
1166 + "json-schema-traverse": {
1167 + "version": "0.4.1",
1168 + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
1169 + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
1170 + },
1171 + "json-stringify-safe": {
1172 + "version": "5.0.1",
1173 + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
1174 + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="
1175 + },
1176 + "jsprim": {
1177 + "version": "1.4.2",
1178 + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
1179 + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
1180 + "requires": {
1181 + "assert-plus": "1.0.0",
1182 + "extsprintf": "1.3.0",
1183 + "json-schema": "0.4.0",
1184 + "verror": "1.10.0"
1185 + }
1186 + },
1187 + "media-typer": {
1188 + "version": "0.3.0",
1189 + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
1190 + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="
1191 + },
1192 + "merge-descriptors": {
1193 + "version": "1.0.1",
1194 + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
1195 + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
1196 + },
1197 + "methods": {
1198 + "version": "1.1.2",
1199 + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
1200 + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="
1201 + },
1202 + "mime": {
1203 + "version": "1.3.4",
1204 + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz",
1205 + "integrity": "sha512-sAaYXszED5ALBt665F0wMQCUXpGuZsGdopoqcHPdL39ZYdi7uHoZlhrfZfhv8WzivhBzr/oXwaj+yiK5wY8MXQ=="
1206 + },
1207 + "mime-db": {
1208 + "version": "1.52.0",
1209 + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
1210 + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
1211 + },
1212 + "mime-types": {
1213 + "version": "2.1.35",
1214 + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
1215 + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
1216 + "requires": {
1217 + "mime-db": "1.52.0"
1218 + }
1219 + },
1220 + "ms": {
1221 + "version": "0.7.1",
1222 + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz",
1223 + "integrity": "sha512-lRLiIR9fSNpnP6TC4v8+4OU7oStC01esuNowdQ34L+Gk8e5Puoc88IqJ+XAY/B3Mn2ZKis8l8HX90oU8ivzUHg=="
1224 + },
1225 + "negotiator": {
1226 + "version": "0.5.3",
1227 + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz",
1228 + "integrity": "sha512-oXmnazqehLNFohqgLxRyUdOQU9/UX0NpCpsnbjWUjM62ZM8oSOXYZpHc68XR130ftPNano0oQXGdREAplZRhaQ=="
1229 + },
1230 + "oauth-sign": {
1231 + "version": "0.9.0",
1232 + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
1233 + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
1234 + },
1235 + "on-finished": {
1236 + "version": "2.3.0",
1237 + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
1238 + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
1239 + "requires": {
1240 + "ee-first": "1.1.1"
1241 + }
1242 + },
1243 + "parseurl": {
1244 + "version": "1.3.3",
1245 + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1246 + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
1247 + },
1248 + "path-to-regexp": {
1249 + "version": "0.1.7",
1250 + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
1251 + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
1252 + },
1253 + "performance-now": {
1254 + "version": "2.1.0",
1255 + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
1256 + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="
1257 + },
1258 + "proxy-addr": {
1259 + "version": "1.0.10",
1260 + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.10.tgz",
1261 + "integrity": "sha512-iq6kR9KN32aFvXjDyC8nIrm203AHeIBPjL6dpaHgSdbpTO8KoPlD0xG92xwwtkCL9+yt1LE5VwpEk43TyP38Dg==",
1262 + "requires": {
1263 + "forwarded": "~0.1.0",
1264 + "ipaddr.js": "1.0.5"
1265 + }
1266 + },
1267 + "psl": {
1268 + "version": "1.8.0",
1269 + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
1270 + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
1271 + },
1272 + "punycode": {
1273 + "version": "2.1.1",
1274 + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
1275 + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
1276 + },
1277 + "qs": {
1278 + "version": "6.5.3",
1279 + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
1280 + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA=="
1281 + },
1282 + "range-parser": {
1283 + "version": "1.0.3",
1284 + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz",
1285 + "integrity": "sha512-nDsRrtIxVUO5opg/A8T2S3ebULVIfuh8ECbh4w3N4mWxIiT3QILDJDUQayPqm2e8Q8NUa0RSUkGCfe33AfjR3Q=="
1286 + },
1287 + "request": {
1288 + "version": "2.88.2",
1289 + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
1290 + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
1291 + "requires": {
1292 + "aws-sign2": "~0.7.0",
1293 + "aws4": "^1.8.0",
1294 + "caseless": "~0.12.0",
1295 + "combined-stream": "~1.0.6",
1296 + "extend": "~3.0.2",
1297 + "forever-agent": "~0.6.1",
1298 + "form-data": "~2.3.2",
1299 + "har-validator": "~5.1.3",
1300 + "http-signature": "~1.2.0",
1301 + "is-typedarray": "~1.0.0",
1302 + "isstream": "~0.1.2",
1303 + "json-stringify-safe": "~5.0.1",
1304 + "mime-types": "~2.1.19",
1305 + "oauth-sign": "~0.9.0",
1306 + "performance-now": "^2.1.0",
1307 + "qs": "~6.5.2",
1308 + "safe-buffer": "^5.1.2",
1309 + "tough-cookie": "~2.5.0",
1310 + "tunnel-agent": "^0.6.0",
1311 + "uuid": "^3.3.2"
1312 + }
1313 + },
1314 + "safe-buffer": {
1315 + "version": "5.2.1",
1316 + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1317 + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
1318 + },
1319 + "safer-buffer": {
1320 + "version": "2.1.2",
1321 + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1322 + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1323 + },
1324 + "send": {
1325 + "version": "0.13.1",
1326 + "resolved": "https://registry.npmjs.org/send/-/send-0.13.1.tgz",
1327 + "integrity": "sha512-tajY7yMvJena2iggWhCzaysOVj/CH4AzqV2lJHUHboVNWQkIFEBJdKtzryKg3fLa83lxq9n/WQV53w9JZCe72w==",
1328 + "requires": {
1329 + "debug": "~2.2.0",
1330 + "depd": "~1.1.0",
1331 + "destroy": "~1.0.4",
1332 + "escape-html": "~1.0.3",
1333 + "etag": "~1.7.0",
1334 + "fresh": "0.3.0",
1335 + "http-errors": "~1.3.1",
1336 + "mime": "1.3.4",
1337 + "ms": "0.7.1",
1338 + "on-finished": "~2.3.0",
1339 + "range-parser": "~1.0.3",
1340 + "statuses": "~1.2.1"
1341 + }
1342 + },
1343 + "serve-static": {
1344 + "version": "1.10.3",
1345 + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.10.3.tgz",
1346 + "integrity": "sha512-ScsFovjz3Db+vGgpofR/U8p8UULEcGV9akqyo8TQ1mMnjcxemE7Y5Muo+dvy3tJLY/doY2v1H61eCBMYGmwfrA==",
1347 + "requires": {
1348 + "escape-html": "~1.0.3",
1349 + "parseurl": "~1.3.1",
1350 + "send": "0.13.2"
1351 + },
1352 + "dependencies": {
1353 + "send": {
1354 + "version": "0.13.2",
1355 + "resolved": "https://registry.npmjs.org/send/-/send-0.13.2.tgz",
1356 + "integrity": "sha512-cQ0rmXHrdO2Iof08igV2bG/yXWD106ANwBg6DkGQNT2Vsznbgq6T0oAIQboy1GoFsIuy51jCim26aA9tj3Z3Zg==",
1357 + "requires": {
1358 + "debug": "~2.2.0",
1359 + "depd": "~1.1.0",
1360 + "destroy": "~1.0.4",
1361 + "escape-html": "~1.0.3",
1362 + "etag": "~1.7.0",
1363 + "fresh": "0.3.0",
1364 + "http-errors": "~1.3.1",
1365 + "mime": "1.3.4",
1366 + "ms": "0.7.1",
1367 + "on-finished": "~2.3.0",
1368 + "range-parser": "~1.0.3",
1369 + "statuses": "~1.2.1"
1370 + }
1371 + }
1372 + }
1373 + },
1374 + "sshpk": {
1375 + "version": "1.17.0",
1376 + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
1377 + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
1378 + "requires": {
1379 + "asn1": "~0.2.3",
1380 + "assert-plus": "^1.0.0",
1381 + "bcrypt-pbkdf": "^1.0.0",
1382 + "dashdash": "^1.12.0",
1383 + "ecc-jsbn": "~0.1.1",
1384 + "getpass": "^0.1.1",
1385 + "jsbn": "~0.1.0",
1386 + "safer-buffer": "^2.0.2",
1387 + "tweetnacl": "~0.14.0"
1388 + }
1389 + },
1390 + "statuses": {
1391 + "version": "1.2.1",
1392 + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz",
1393 + "integrity": "sha512-pVEuxHdSGrt8QmQ3LOZXLhSA6MP/iPqKzZeO6Squ7PNGkA/9MBsSfV0/L+bIxkoDmjF4tZcLpcVq/fkqoHvuKg=="
1394 + },
1395 + "tough-cookie": {
1396 + "version": "2.5.0",
1397 + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
1398 + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
1399 + "requires": {
1400 + "psl": "^1.1.28",
1401 + "punycode": "^2.1.1"
1402 + }
1403 + },
1404 + "tunnel-agent": {
1405 + "version": "0.6.0",
1406 + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
1407 + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
1408 + "requires": {
1409 + "safe-buffer": "^5.0.1"
1410 + }
1411 + },
1412 + "tweetnacl": {
1413 + "version": "0.14.5",
1414 + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
1415 + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="
1416 + },
1417 + "twitter": {
1418 + "version": "1.7.1",
1419 + "resolved": "https://registry.npmjs.org/twitter/-/twitter-1.7.1.tgz",
1420 + "integrity": "sha512-Do7l/WzFnUZC14ABtZfDiOHKl6M9Ft5tE4YF0ev9XLm4yh7m8R98D82rzeDAMjbjMZk2R/tb6sgXXb3sPKoaVw==",
1421 + "requires": {
1422 + "deep-extend": "^0.5.0",
1423 + "request": "^2.72.0"
1424 + }
1425 + },
1426 + "type-is": {
1427 + "version": "1.6.18",
1428 + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1429 + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1430 + "requires": {
1431 + "media-typer": "0.3.0",
1432 + "mime-types": "~2.1.24"
1433 + }
1434 + },
1435 + "unpipe": {
1436 + "version": "1.0.0",
1437 + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1438 + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="
1439 + },
1440 + "uri-js": {
1441 + "version": "4.4.1",
1442 + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
1443 + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
1444 + "requires": {
1445 + "punycode": "^2.1.0"
1446 + }
1447 + },
1448 + "utils-merge": {
1449 + "version": "1.0.0",
1450 + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz",
1451 + "integrity": "sha512-HwU9SLQEtyo+0uoKXd1nkLqigUWLB+QuNQR4OcmB73eWqksM5ovuqcycks2x043W8XVb75rG1HQ0h93TMXkzQQ=="
1452 + },
1453 + "uuid": {
1454 + "version": "3.4.0",
1455 + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
1456 + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
1457 + },
1458 + "vary": {
1459 + "version": "1.0.1",
1460 + "resolved": "https://registry.npmjs.org/vary/-/vary-1.0.1.tgz",
1461 + "integrity": "sha512-yNsH+tC0r8quK2tg/yqkXqqaYzeKTkSqQ+8T6xCoWgOi/bU/omMYz+6k+I91JJJDeltJzI7oridTOq6OYkY0Tw=="
1462 + },
1463 + "verror": {
1464 + "version": "1.10.0",
1465 + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
1466 + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
1467 + "requires": {
1468 + "assert-plus": "^1.0.0",
1469 + "core-util-is": "1.0.2",
1470 + "extsprintf": "^1.2.0"
1471 + }
1472 + }
1473 + }
1474 +}
...\ No newline at end of file ...\ No newline at end of file
1 +{
2 + "name": "express-tutorial",
3 + "version": "1.0.0",
4 + "dependencies": {
5 + "ejs": "~2.4.1",
6 + "express": "~4.13.1",
7 + "twitter": "^1.7.1"
8 + }
9 +}
...\ No newline at end of file ...\ No newline at end of file
1 { 1 {
2 - "name": "express-tutorial",
3 - "version": "1.0.0",
4 - "dependencies":
5 - {
6 - "express": "~4.13.1",
7 - "ejs": "~2.4.1"
8 - }
9 - }
...\ No newline at end of file ...\ No newline at end of file
2 + "name": "express-tutorial",
3 + "version": "1.0.0",
4 + "dependencies": {
5 + "express": "~4.13.1",
6 + "ejs": "~2.4.1",
7 + "twitter": "^1.7.1"
8 + }
9 +}
...\ No newline at end of file ...\ No newline at end of file
......
No preview for this file type
...@@ -7,10 +7,10 @@ app.set('views', __dirname + '/views'); //서버가 읽을 수 있도록 HTML ...@@ -7,10 +7,10 @@ app.set('views', __dirname + '/views'); //서버가 읽을 수 있도록 HTML
7 app.set('view engine', 'ejs'); //서버가 HTML 렌더링을 할 때, EJS 엔진을 사용하도록 설정합니다. 7 app.set('view engine', 'ejs'); //서버가 HTML 렌더링을 할 때, EJS 엔진을 사용하도록 설정합니다.
8 app.engine('html', require('ejs').renderFile); 8 app.engine('html', require('ejs').renderFile);
9 9
10 -app.get('/timeline/:screen_name',tweetsController.getUserTweets); // '/timeline/:screen_name'형식의 url이 들어오면 뒤의 함수를 실행시킴 10 +app.get('/timeline/:screen_name', tweetsController.getUserTweets); // '/timeline/:screen_name'형식의 url이 들어오면 뒤의 함수를 실행시킴
11 -app.get('/timeline/:screen_name/:keyword',tweetsController.getUserTweetsForSearch); 11 +app.get('/timeline/:screen_name/:keyword', tweetsController.getUserTweetsForSearch);
12 -app.get('/popular/:screen_name',tweetsController.getUserRetweet);//'/hot/:screen_name'형식의 url이 들어오면 뒤의 함수를 실행시킴 12 +app.get('/popular/:screen_name', tweetsController.getUserRetweet);//'/hot/:screen_name'형식의 url이 들어오면 뒤의 함수를 실행시킴
13 -var server = app.listen(3000, function(){ //3000 포트 사용 13 +var server = app.listen(3000, function () { //3000 포트 사용
14 console.log("Express server has started on port 3000"); 14 console.log("Express server has started on port 3000");
15 }) 15 })
16 16
......
1 const Twitter = require('twitter'); 1 const Twitter = require('twitter');
2 2
3 const client = new Twitter({ 3 const client = new Twitter({
4 - consumer_key: 'key1', 4 + consumer_key: "consumer_key",
5 - consumer_secret: 'key2', 5 + consumer_secret: "consumer_secret",
6 - access_token_key: 'key3', 6 + access_token_key: "access_token_key",
7 - access_token_secret: 'key4' 7 + access_token_secret: "access_token_secret"
8 8
9 }); 9 });
10 10
11 11
12 -exports.getUserTweets = async function(req, res){ //전체 타임라인 12 +exports.getUserTweets = async function (req, res) { //전체 타임라인
13 - try{ 13 + try {
14 - let data = client.get('statuses/user_timeline', req.params, function(error,tweets,response){ //트위터 api에서 유저의 타임라인을 가져옴 req.params에 유저 아이디가 들어있음 14 + let data = client.get('statuses/user_timeline', req.params, function (error, tweets, response) { //트위터 api에서 유저의 타임라인을 가져옴 req.params에 유저 아이디가 들어있음
15 - if(!error){ 15 + if (!error) {
16 - 16 +
17 console.log(tweets); //가져온 타임라인 내용 콘솔창에 출력 17 console.log(tweets); //가져온 타임라인 내용 콘솔창에 출력
18 - res.render('timeline.html',{ timeline: tweets}); //timeline.html 화면에 뿌려줌 그리고 tweets값을 저 페이지로 보냄 18 + res.render('timeline.html', { timeline: tweets }); //timeline.html 화면에 뿌려줌 그리고 tweets값을 저 페이지로 보냄
19 + }
20 + else {
21 + let msg = ""
22 + if (response.statusCode === 404)
23 + msg = "User not found."
24 + else {
25 + try {
26 + msg = error[0].message
27 + }
28 + catch {
29 + }
30 + }
31 +
32 + res.render('error.html', { statusCode: response.statusCode, msg: msg });
33 +
19 } 34 }
20 }); //아이디를 토대로 타임라인 가져오기 35 }); //아이디를 토대로 타임라인 가져오기
21 -
22 36
23 - }catch(err){ //에러 발생하면 실행 37 +
38 + } catch (err) { //에러 발생하면 실행
39 + res.render('error.html', { statusCode: 500, msg: String(err) });
24 console.log(err); 40 console.log(err);
25 res.sendStatus(500); 41 res.sendStatus(500);
26 } 42 }
27 } 43 }
28 44
29 -exports.getUserTweetsForSearch = async function(req, res){ //검색 45 +exports.getUserTweetsForSearch = async function (req, res) { //검색
30 - try{ 46 + try {
31 - let data = client.get('statuses/user_timeline', req.params, function(error,tweets,response){ //트위터 api에서 유저의 타임라인을 가져옴 req.params에 유저 아이디가 들어있음 47 + let data = client.get('statuses/user_timeline', req.params, function (error, tweets, response) { //트위터 api에서 유저의 타임라인을 가져옴 req.params에 유저 아이디가 들어있음
32 - if(!error){ 48 + if (!error) {
33 - res.render('search.html',{ timeline: tweets, keyword:req.params.keyword}); //timeline.html 화면에 뿌려줌 그리고 tweets값을 저 페이지로 보냄 49 + res.render('search.html', { timeline: tweets, keyword: req.params.keyword }); //timeline.html 화면에 뿌려줌 그리고 tweets값을 저 페이지로 보냄
50 +
34 console.log(req.params); 51 console.log(req.params);
35 } 52 }
53 + else {
54 + let msg = ""
55 + if (response.statusCode === 404)
56 + msg = "User not found."
57 + else {
58 + try {
59 + msg = error[0].message
60 + }
61 + catch {
62 + }
63 + }
64 +
65 + res.render('error.html', { statusCode: response.statusCode, msg: msg });
66 + }
36 }); //아이디를 토대로 타임라인 가져오기 67 }); //아이디를 토대로 타임라인 가져오기
37 68
38 - }catch(err){ //에러 발생하면 실행 69 + } catch (err) { //에러 발생하면 실행
39 console.log(err); 70 console.log(err);
71 + res.render('error.html', { statusCode: 500, msg: String(err) });
72 +
40 res.sendStatus(500); 73 res.sendStatus(500);
41 } 74 }
42 } 75 }
43 76
44 77
45 -exports.getUserRetweet = async function(req, res){ //인기있는 글 78 +exports.getUserRetweet = async function (req, res) { //인기있는 글
46 - try{ 79 + try {
47 - let retweetdata = client.get('statuses/user_timeline', req.params, function(error, tweets, response) {//리트윗 80 + let retweetdata = client.get('statuses/user_timeline', req.params, function (error, tweets, response) {//리트윗
48 - if(!error){ 81 + if (!error) {
49 - tweets.sort(function(a,b){ 82 + tweets.sort(function (a, b) {
50 - return b.retweet_count-a.retweet_count; 83 + return b.retweet_count - a.retweet_count;
51 - });//리트윗 data 내림차순로 정렬(?) 84 + });//리트윗 data 내림차순로 정렬(?)
52 - console.log(tweets); 85 + console.log(tweets);
53 - res.render('popular.html',{timeline: tweets}); 86 + res.render('popular.html', { timeline: tweets });
54 - } 87 + }
55 - 88 + else {
56 - }); 89 + let msg = ""
57 - }catch(err){ 90 + if (response.statusCode === 404)
91 + msg = "User not found."
92 + else {
93 + try {
94 + msg = error[0].message
95 + }
96 + catch {
97 + }
98 + }
99 +
100 + res.render('error.html', { statusCode: response.statusCode, msg: msg });
101 + }
102 +
103 + });
104 + } catch (err) {
58 console.log(err); 105 console.log(err);
106 + res.render('error.html', { statusCode: 500, msg: String(err) });
59 res.sendStatus(500); 107 res.sendStatus(500);
60 } 108 }
61 } 109 }
......
1 +<html lang="en">
2 +
3 +
4 +<head>
5 + <meta charset="UTF-8" />
6 + <meta http-equiv="X-UA-Compatible" content="IE=edge" />
7 + <meta name="viewport" content="width=device-width, initial-scale=1.0" />
8 + <title>Error Page</title>
9 + <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
10 +</head>
11 +
12 +
13 +<body>
14 + <div class="d-flex align-items-center justify-content-center vh-100">
15 + <div class="text-center">
16 + <h1 class="display-1 fw-bold">
17 + <%= statusCode %>
18 + </h1>
19 + <p class="fs-3"> <span class="text-danger">Opps!</span> Page not found.</p>
20 + <p class="lead">
21 + <%= msg %>
22 + </p>
23 + <a href="/" class="btn btn-primary">Go Home</a>
24 + </div>
25 + </div>
26 +</body>
27 +
28 +
29 +</html>
...\ No newline at end of file ...\ No newline at end of file
1 <html> 1 <html>
2 - <head> 2 +
3 - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 3 +<head>
4 - <meta name="viewport" content="width=device-width, initial-scale=1" /> 4 + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
5 - <meta http-equiv="X-UA-Compatible" content="IE=edge" /> 5 + <meta name="viewport" content="width=device-width, initial-scale=1" />
6 - <meta name="author" content="colorlib.com"> 6 + <meta http-equiv="X-UA-Compatible" content="IE=edge" />
7 - <link href="https://fonts.googleapis.com/css?family=Poppins" rel="stylesheet" /> 7 + <meta name="author" content="colorlib.com">
8 - <link href="css/style.css" rel="stylesheet" /> 8 + <link href="https://fonts.googleapis.com/css?family=Poppins" rel="stylesheet" />
9 - </head> 9 + <link href="css/style.css" rel="stylesheet" />
10 - <body> 10 +</head>
11 - <div class="s130"> <!--아이디 검색창1 : 계정내 검색--> 11 +
12 - <form> 12 +<body>
13 - <div class="inner-form"> 13 + <div class="s130">
14 - <div class="input-field first-wrap"> 14 + <!--아이디 검색창1 : 계정내 검색-->
15 - <div class="svg-wrapper"> 15 + <form>
16 - <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> 16 + <div class="inner-form">
17 - <path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"></path> 17 + <div class="input-field first-wrap">
18 - </svg> 18 + <div class="svg-wrapper">
19 - </div> 19 + <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
20 - <input id="search1" type="text" placeholder="아이디를 입력하세요" /> 20 + <path
21 - </div> 21 + d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z">
22 - <div class="input-field second-wrap"> 22 + </path>
23 - <button class="btn-search" type="button" onclick="movePage1()">계정 내 검색하기</button> 23 + </svg>
24 </div> 24 </div>
25 - <script type ="text/javascript"> 25 + <input id="search1" type="text" placeholder="아이디를 입력하세요" />
26 - function movePage1(){ //계정 내 검색 페이지로 이동하기 위한 함수 26 + </div>
27 - location.href ="/timeline/"+document.getElementById('search1').value //url을 이렇게 변경함 27 + <div class="input-field second-wrap">
28 - } 28 + <button class="btn-search" type="button" onclick="movePage1()">계정 내 검색하기</button>
29 - </script>
30 </div> 29 </div>
30 + <script type="text/javascript">
31 + function movePage1() { //계정 내 검색 페이지로 이동하기 위한 함수
32 + location.href = "/timeline/" + document.getElementById('search1').value //url을 이렇게 변경함
33 + }
34 + </script>
35 + </div>
31 36
32 - <div class="inner-form"> <!--아이디 검색창2 : 인기글 검색--> 37 + <div class="inner-form">
33 - <div class="input-field first-wrap"> 38 + <!--아이디 검색창2 : 인기글 검색-->
34 - <div class="svg-wrapper"> 39 + <div class="input-field first-wrap">
35 - <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> 40 + <div class="svg-wrapper">
36 - <path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"></path> 41 + <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
37 - </svg> 42 + <path
38 - </div> 43 + d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z">
39 - <input id="search" type="text" placeholder="아이디를 입력하세요" /> 44 + </path>
45 + </svg>
40 </div> 46 </div>
41 - <div class="input-field second-wrap"> 47 + <input id="search" type="text" placeholder="아이디를 입력하세요" />
42 - <button class="btn-search" type="button" onclick="movePage()">인기 게시물 검색하기</button> 48 + </div>
43 - </div> 49 + <div class="input-field second-wrap">
44 - <script type ="text/javascript"> 50 + <button class="btn-search" type="button" onclick="movePage()">인기 게시물 검색하기</button>
45 - function movePage(){ //인기 게시물 페이지 이동을 위한 함수
46 - location.href ="/popular/"+document.getElementById('search').value //url을 이렇게 변경함
47 - }
48 - </script>
49 </div> 51 </div>
50 - <span class="info">ex)TwitterKorea </span> 52 + <script type="text/javascript">
53 + function movePage() { //인기 게시물 페이지 이동을 위한 함수
54 + location.href = "/popular/" + document.getElementById('search').value //url을 이렇게 변경함
55 + }
56 + </script>
57 + </div>
58 + <span class="info">ex)TwitterKorea </span>
59 +
60 + </form>
61 + </div>
62 + <script src="js/extention/choices.js"></script>
63 +</body><!-- This templates was made by Colorlib (https://colorlib.com) -->
51 64
52 - </form> 65 +</html>
53 - </div>
54 - <script src="js/extention/choices.js"></script>
55 - </body><!-- This templates was made by Colorlib (https://colorlib.com) -->
56 -</html>
...\ No newline at end of file ...\ No newline at end of file
......
1 -
2 <html> 1 <html>
3 - <head> 2 +
4 - <link href="//maxcdn.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" rel="stylesheet" id="bootstrap-css"> 3 +<head>
5 - <script src="//maxcdn.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js"></script> 4 + <link href="//maxcdn.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" rel="stylesheet" id="bootstrap-css">
6 - <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> 5 + <script src="//maxcdn.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js"></script>
7 - <!------ Include the above in your HEAD tag ----------> 6 + <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
8 - 7 + <!------ Include the above in your HEAD tag ---------->
9 - 8 +
10 - <style> 9 +
11 - #search input[type="text"] { 10 + <style>
12 - background: url(search-white.png) no-repeat 10px 6px #fcfcfc; 11 + #search input[type="text"] {
13 - border: 1px solid #d1d1d1; 12 + background: url(search-white.png) no-repeat 10px 6px #fcfcfc;
14 - font: bold 12px Arial,Helvetica,Sans-serif; 13 + border: 1px solid #d1d1d1;
15 - color: #bebebe; 14 + font: bold 12px Arial, Helvetica, Sans-serif;
16 - width: 150px; 15 + color: #bebebe;
17 - padding: 6px 15px 6px 35px; 16 + width: 150px;
18 - -webkit-border-radius: 20px; 17 + padding: 6px 15px 6px 35px;
19 - -moz-border-radius: 20px; 18 + -webkit-border-radius: 20px;
20 - border-radius: 20px; 19 + -moz-border-radius: 20px;
21 - text-shadow: 0 2px 3px rgba(0, 0, 0, 0.1); 20 + border-radius: 20px;
22 - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15) inset; 21 + text-shadow: 0 2px 3px rgba(0, 0, 0, 0.1);
23 - -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15) inset; 22 + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15) inset;
24 - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15) inset; 23 + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15) inset;
25 - -webkit-transition: all 0.7s ease 0s; 24 + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15) inset;
26 - -moz-transition: all 0.7s ease 0s; 25 + -webkit-transition: all 0.7s ease 0s;
27 - -o-transition: all 0.7s ease 0s; 26 + -moz-transition: all 0.7s ease 0s;
28 - transition: all 0.7s ease 0s; 27 + -o-transition: all 0.7s ease 0s;
29 - } 28 + transition: all 0.7s ease 0s;
30 - 29 + }
31 - #search input[type="text"]:focus { 30 +
32 - width: 200px; 31 + #search input[type="text"]:focus {
33 - } 32 + width: 200px;
34 - 33 + }
35 - #search input[type="text"]:focus { 34 +
36 - width: 200px; 35 + #search input[type="text"]:focus {
37 - } 36 + width: 200px;
38 - ul.timeline { 37 + }
39 - list-style-type: none; 38 +
40 - position: relative; 39 + ul.timeline {
41 - } 40 + list-style-type: none;
42 - ul.timeline:before { 41 + position: relative;
43 - content: ' '; 42 + }
44 - background: #d4d9df; 43 +
45 - display: inline-block; 44 + ul.timeline:before {
46 - position: absolute; 45 + content: ' ';
47 - left: 29px; 46 + background: #d4d9df;
48 - width: 2px; 47 + display: inline-block;
49 - height: 100%; 48 + position: absolute;
50 - z-index: 400; 49 + left: 29px;
51 - } 50 + width: 2px;
52 - ul.timeline > li { 51 + height: 100%;
53 - margin: 20px 0; 52 + z-index: 400;
54 - padding-left: 20px; 53 + }
55 - } 54 +
56 - ul.timeline > li:before { 55 + ul.timeline>li {
57 - content: ' '; 56 + margin: 20px 0;
58 - background: white; 57 + padding-left: 20px;
59 - display: inline-block; 58 + }
60 - position: absolute; 59 +
61 - border-radius: 50%; 60 + ul.timeline>li:before {
62 - border: 3px solid #22c0e8; 61 + content: ' ';
63 - left: 20px; 62 + background: white;
64 - width: 20px; 63 + display: inline-block;
65 - height: 20px; 64 + position: absolute;
66 - z-index: 400; 65 + border-radius: 50%;
67 - } 66 + border: 3px solid #22c0e8;
68 - </style> 67 + left: 20px;
69 - </head> 68 + width: 20px;
69 + height: 20px;
70 + z-index: 400;
71 + }
72 + </style>
73 +</head>
70 74
71 75
72 <body> 76 <body>
...@@ -76,27 +80,43 @@ ...@@ -76,27 +80,43 @@
76 <div class="col-md-6 offset-md-3"> 80 <div class="col-md-6 offset-md-3">
77 <h4 style="color:rgb(46, 7, 7); font-weight: bold;">HOT</h4> 81 <h4 style="color:rgb(46, 7, 7); font-weight: bold;">HOT</h4>
78 <ul class="Timeline"> 82 <ul class="Timeline">
79 - <% for (var i=0; i<20; i++){ %> 83 + <% for (var i=0; i<timeline.length; i++){ %>
80 - <li> 84 + <li>
81 - <h5 style="color: gold; font-weight: bold;"><%= i + 1 %>위!</h5> 85 + <h5 style="color: gold; font-weight: bold;">
82 - <% if(timeline[i].hasOwnProperty('retweeted_status')) { %> <!--내가 다른사람 글을 리트윗한거면 원글을 쓴 사람 닉네임 출력--> 86 + <%= i + 1 %>위!
83 - <a style ="font-weight: bold;" target="_blank" href=><%= timeline[i].retweeted_status.user.name %></a> 87 + </h5>
84 - <% } else { %> <!--아니면 내 닉네임--> 88 + <% if(timeline[i].hasOwnProperty('retweeted_status')) { %>
85 - <a style ="font-weight: bold;" target="_blank" href=><%= timeline[i].user.name %></a> 89 + <!--내가 다른사람 글을 리트윗한거면 원글을 쓴 사람 닉네임 출력-->
86 - <% } %> 90 + <a style="font-weight: bold;" target="_blank" href=>
87 - 91 + <%= timeline[i].retweeted_status.user.name %>
88 - <a href="#" class="float-right"><%= timeline[i].created_at %></a> 92 + </a>
89 - 93 + <% } else { %>
90 - <p><%=timeline[i].text%></p> 94 + <!--아니면 내 닉네임-->
91 - 95 + <a style="font-weight: bold;" target="_blank" href=>
92 - <% if(timeline[i].hasOwnProperty('extended_entities')) { %> <!--미디어가 존재하면 출력--> 96 + <%= timeline[i].user.name %>
93 - <img alt="Web Studio" class="img-fluid" width="300" height="300" src= <%= timeline[i].extended_entities.media[0].media_url_https %> /> 97 + </a>
94 - <% } %> 98 + <% } %>
95 - 99 +
96 - <p style="color: #22c0e8;">리트윗: <%= timeline[i].retweet_count %> 마음에 들어요: <%= timeline[i].favorite_count%></p> 100 + <a href="#" class="float-right">
97 - </li> 101 + <%= timeline[i].created_at %>
98 - <% } %> 102 + </a>
99 - 103 +
104 + <p>
105 + <%=timeline[i].text%>
106 + </p>
107 +
108 + <% if(timeline[i].hasOwnProperty('extended_entities')) { %>
109 + <!--미디어가 존재하면 출력-->
110 + <img alt="Web Studio" class="img-fluid" width="300" height="300"
111 + src=<%=timeline[i].extended_entities.media[0].media_url_https %> />
112 + <% } %>
113 +
114 + <p style="color: #22c0e8;">리트윗: <%= timeline[i].retweet_count %> 마음에
115 + 들어요: <%= timeline[i].favorite_count%>
116 + </p>
117 + </li>
118 + <% } %>
119 +
100 </ul> 120 </ul>
101 </div> 121 </div>
102 </div> 122 </div>
...@@ -104,4 +124,5 @@ ...@@ -104,4 +124,5 @@
104 124
105 125
106 </body> 126 </body>
127 +
107 </html> 128 </html>
...\ No newline at end of file ...\ No newline at end of file
......
1 -
2 <html> 1 <html>
3 - <head>
4 - <link href="//maxcdn.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" rel="stylesheet" id="bootstrap-css">
5 - <script src="//maxcdn.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js"></script>
6 - <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
7 - <!------ Include the above in your HEAD tag ---------->
8 -
9 - <div style="padding-left: 500px;">
10 - <input id = "search1" name="q" type="text" size="40" placeholder="Search..." />
11 - <button class="btn-search" type="button" onclick="movePage1()">검색</button>
12 - <script type ="text/javascript">
13 - function movePage1(){ //페이지 이동을 위한 함수 search버튼을 누르면 실행됨
14 - location.href =document.location.href +"/"+ document.getElementById('search1').value //url을 이렇게 변경함
15 - }
16 - </script>
17 - </div>
18 - <style>
19 - #search input[type="text"] {
20 - background: url(search-white.png) no-repeat 10px 6px #fcfcfc;
21 - border: 1px solid #d1d1d1;
22 - font: bold 12px Arial,Helvetica,Sans-serif;
23 - color: #bebebe;
24 - width: 150px;
25 - padding: 6px 15px 6px 35px;
26 - -webkit-border-radius: 20px;
27 - -moz-border-radius: 20px;
28 - border-radius: 20px;
29 - text-shadow: 0 2px 3px rgba(0, 0, 0, 0.1);
30 - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15) inset;
31 - -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15) inset;
32 - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15) inset;
33 - -webkit-transition: all 0.7s ease 0s;
34 - -moz-transition: all 0.7s ease 0s;
35 - -o-transition: all 0.7s ease 0s;
36 - transition: all 0.7s ease 0s;
37 - }
38 -
39 - #search input[type="text"]:focus {
40 - width: 200px;
41 - }
42 2
43 - #search input[type="text"]:focus { 3 +<head>
44 - width: 200px; 4 + <link href="//maxcdn.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" rel="stylesheet" id="bootstrap-css">
45 - } 5 + <script src="//maxcdn.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js"></script>
46 - ul.timeline { 6 + <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
47 - list-style-type: none; 7 + <!------ Include the above in your HEAD tag ---------->
48 - position: relative; 8 +
49 - } 9 + <div style="padding-left: 500px;">
50 - ul.timeline:before { 10 + <input id="search1" name="q" type="text" size="40" placeholder="Search..." />
51 - content: ' '; 11 + <button class="btn-search" type="button" onclick="movePage1()">검색</button>
52 - background: #d4d9df; 12 + <script type="text/javascript">
53 - display: inline-block; 13 + function movePage1() { //페이지 이동을 위한 함수 search버튼을 누르면 실행됨
54 - position: absolute; 14 + location.href = document.location.href + "/" + document.getElementById('search1').value //url을 이렇게 변경함
55 - left: 29px;
56 - width: 2px;
57 - height: 100%;
58 - z-index: 400;
59 - }
60 - ul.timeline > li {
61 - margin: 20px 0;
62 - padding-left: 20px;
63 - }
64 - ul.timeline > li:before {
65 - content: ' ';
66 - background: white;
67 - display: inline-block;
68 - position: absolute;
69 - border-radius: 50%;
70 - border: 3px solid #22c0e8;
71 - left: 20px;
72 - width: 20px;
73 - height: 20px;
74 - z-index: 400;
75 } 15 }
76 - </style> 16 + </script>
77 - </head> 17 + </div>
18 + <style>
19 + #search input[type="text"] {
20 + background: url(search-white.png) no-repeat 10px 6px #fcfcfc;
21 + border: 1px solid #d1d1d1;
22 + font: bold 12px Arial, Helvetica, Sans-serif;
23 + color: #bebebe;
24 + width: 150px;
25 + padding: 6px 15px 6px 35px;
26 + -webkit-border-radius: 20px;
27 + -moz-border-radius: 20px;
28 + border-radius: 20px;
29 + text-shadow: 0 2px 3px rgba(0, 0, 0, 0.1);
30 + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15) inset;
31 + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15) inset;
32 + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15) inset;
33 + -webkit-transition: all 0.7s ease 0s;
34 + -moz-transition: all 0.7s ease 0s;
35 + -o-transition: all 0.7s ease 0s;
36 + transition: all 0.7s ease 0s;
37 + }
38 +
39 + #search input[type="text"]:focus {
40 + width: 200px;
41 + }
42 +
43 + #search input[type="text"]:focus {
44 + width: 200px;
45 + }
46 +
47 + ul.timeline {
48 + list-style-type: none;
49 + position: relative;
50 + }
51 +
52 + ul.timeline:before {
53 + content: ' ';
54 + background: #d4d9df;
55 + display: inline-block;
56 + position: absolute;
57 + left: 29px;
58 + width: 2px;
59 + height: 100%;
60 + z-index: 400;
61 + }
62 +
63 + ul.timeline>li {
64 + margin: 20px 0;
65 + padding-left: 20px;
66 + }
67 +
68 + ul.timeline>li:before {
69 + content: ' ';
70 + background: white;
71 + display: inline-block;
72 + position: absolute;
73 + border-radius: 50%;
74 + border: 3px solid #22c0e8;
75 + left: 20px;
76 + width: 20px;
77 + height: 20px;
78 + z-index: 400;
79 + }
80 + </style>
81 +</head>
82 +
78 <body> 83 <body>
79 <!--검색된 타임라인 출력--> 84 <!--검색된 타임라인 출력-->
80 <div class="container mt-5 mb-5"> 85 <div class="container mt-5 mb-5">
...@@ -82,37 +87,55 @@ ...@@ -82,37 +87,55 @@
82 <div class="col-md-6 offset-md-3"> 87 <div class="col-md-6 offset-md-3">
83 <!--<h4>timeline</h4>--> 88 <!--<h4>timeline</h4>-->
84 <ul class="Timeline"> 89 <ul class="Timeline">
85 - <% for (var i=0; i<20; i++){ %> <!--받아온 타임라인 수 만큼 반복--> 90 + <% for (var i=0; i<timeline.length; i++){ %>
86 - <% if((timeline[i].text).indexOf(keyword) != -1) { %> <!--현재 글에 검색 키워드가 존재하면 그 글을 보여줌--> 91 + <!--받아온 타임라인 수 만큼 반복-->
87 - <li> 92 + <% if((timeline[i].text).indexOf(keyword) !=-1) { %>
88 - 93 + <!--현재 글에 검색 키워드가 존재하면 그 글을 보여줌-->
89 - <% if(timeline[i].hasOwnProperty('retweeted_status')) { %> <!--내가 다른사람 글을 리트윗한거면 원글을 쓴 사람 닉네임 출력--> 94 + <li>
90 - <a style ="font-weight: bold;" target="_blank" href=><%= timeline[i].retweeted_status.user.name %></a> 95 +
91 - <% } else { %> <!--아니면 내 닉네임--> 96 + <% if(timeline[i].hasOwnProperty('retweeted_status')) { %>
92 - <a style ="font-weight: bold;" target="_blank" href=><%= timeline[i].user.name %></a> 97 + <!--내가 다른사람 글을 리트윗한거면 원글을 쓴 사람 닉네임 출력-->
93 - <% } %> 98 + <a style="font-weight: bold;" target="_blank" href=>
94 - 99 + <%= timeline[i].retweeted_status.user.name %>
95 - <a href="#" class="float-right"><%= timeline[i].created_at %></a> 100 + </a>
101 + <% } else { %>
102 + <!--아니면 내 닉네임-->
103 + <a style="font-weight: bold;" target="_blank" href=>
104 + <%= timeline[i].user.name %>
105 + </a>
106 + <% } %>
96 107
97 - <p><%=timeline[i].text%></p> 108 + <a href="#" class="float-right">
109 + <%= timeline[i].created_at %>
110 + </a>
98 111
99 - <% if(timeline[i].hasOwnProperty('extended_entities')) { %> <!--미디어가 존재하면 출력--> 112 + <p>
100 - <img alt="Web Studio" class="img-fluid" width="300" height="300" src= <%= timeline[i].extended_entities.media[0].media_url_https %> /> 113 + <%=timeline[i].text%>
114 + </p>
115 +
116 + <% if(timeline[i].hasOwnProperty('extended_entities')) { %>
117 + <!--미디어가 존재하면 출력-->
118 + <img alt="Web Studio" class="img-fluid" width="300" height="300"
119 + src=<%=timeline[i].extended_entities.media[0].media_url_https %> />
120 + <% } %>
121 +
122 + <p style="color: #22c0e8;">리트윗: <%= timeline[i].retweet_count %> 마음에
123 + 들어요: <%= timeline[i].favorite_count%>
124 + </p>
125 +
126 + </li>
101 <% } %> 127 <% } %>
128 + <% } %>
102 129
103 - <p style="color: #22c0e8;">리트윗: <%= timeline[i].retweet_count %> 마음에 들어요: <%= timeline[i].favorite_count%></p>
104 -
105 - </li>
106 - <% } %>
107 - <% } %>
108 -
109 </ul> 130 </ul>
110 </div> 131 </div>
111 </div> 132 </div>
112 </div> 133 </div>
113 - 134 +
114 - <div class="text-muted mt-5 mb-5 text-center small">by : <a class="text-muted" target="_blank" href="http://totoprayogo.com">totoprayogo.com</a></div> 135 + <div class="text-muted mt-5 mb-5 text-center small">by : <a class="text-muted" target="_blank"
115 - 136 + href="http://totoprayogo.com">totoprayogo.com</a></div>
137 +
116 138
117 </body> 139 </body>
140 +
118 </html> 141 </html>
...\ No newline at end of file ...\ No newline at end of file
......
1 -
2 <html> 1 <html>
3 - <head>
4 - <link href="//maxcdn.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" rel="stylesheet" id="bootstrap-css">
5 - <script src="//maxcdn.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js"></script>
6 - <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
7 - <!------ Include the above in your HEAD tag ---------->
8 -
9 - <div style="padding-left: 500px;">
10 - <input id = "search1" name="q" type="text" size="40" placeholder="Search..." />
11 - <button class="btn-search" type="button" onclick="movePage1()">검색</button>
12 - <script type ="text/javascript">
13 - function movePage1(){ //페이지 이동을 위한 함수 search버튼을 누르면 실행됨
14 - location.href =document.location.href +"/"+ document.getElementById('search1').value //url을 이렇게 변경함
15 - }
16 - </script>
17 - </div>
18 - <style>
19 - #search input[type="text"] {
20 - background: url(search-white.png) no-repeat 10px 6px #fcfcfc;
21 - border: 1px solid #d1d1d1;
22 - font: bold 12px Arial,Helvetica,Sans-serif;
23 - color: #bebebe;
24 - width: 150px;
25 - padding: 6px 15px 6px 35px;
26 - -webkit-border-radius: 20px;
27 - -moz-border-radius: 20px;
28 - border-radius: 20px;
29 - text-shadow: 0 2px 3px rgba(0, 0, 0, 0.1);
30 - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15) inset;
31 - -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15) inset;
32 - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15) inset;
33 - -webkit-transition: all 0.7s ease 0s;
34 - -moz-transition: all 0.7s ease 0s;
35 - -o-transition: all 0.7s ease 0s;
36 - transition: all 0.7s ease 0s;
37 - }
38 -
39 - #search input[type="text"]:focus {
40 - width: 200px;
41 - }
42 2
43 - #search input[type="text"]:focus { 3 +<head>
44 - width: 200px; 4 + <link href="//maxcdn.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" rel="stylesheet" id="bootstrap-css">
45 - } 5 + <script src="//maxcdn.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js"></script>
46 - ul.timeline { 6 + <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
47 - list-style-type: none; 7 + <!------ Include the above in your HEAD tag ---------->
48 - position: relative; 8 +
49 - } 9 + <div style="padding-left: 500px;">
50 - ul.timeline:before { 10 + <input id="search1" name="q" type="text" size="40" placeholder="Search..." />
51 - content: ' '; 11 + <button class="btn-search" type="button" onclick="movePage1()">검색</button>
52 - background: #d4d9df; 12 + <script type="text/javascript">
53 - display: inline-block; 13 + function movePage1() { //페이지 이동을 위한 함수 search버튼을 누르면 실행됨
54 - position: absolute; 14 + location.href = document.location.href + "/" + document.getElementById('search1').value //url을 이렇게 변경함
55 - left: 29px;
56 - width: 2px;
57 - height: 100%;
58 - z-index: 400;
59 - }
60 - ul.timeline > li {
61 - margin: 20px 0;
62 - padding-left: 20px;
63 - }
64 - ul.timeline > li:before {
65 - content: ' ';
66 - background: white;
67 - display: inline-block;
68 - position: absolute;
69 - border-radius: 50%;
70 - border: 3px solid #22c0e8;
71 - left: 20px;
72 - width: 20px;
73 - height: 20px;
74 - z-index: 400;
75 } 15 }
76 - </style> 16 + </script>
77 - </head> 17 + </div>
18 + <style>
19 + #search input[type="text"] {
20 + background: url(search-white.png) no-repeat 10px 6px #fcfcfc;
21 + border: 1px solid #d1d1d1;
22 + font: bold 12px Arial, Helvetica, Sans-serif;
23 + color: #bebebe;
24 + width: 150px;
25 + padding: 6px 15px 6px 35px;
26 + -webkit-border-radius: 20px;
27 + -moz-border-radius: 20px;
28 + border-radius: 20px;
29 + text-shadow: 0 2px 3px rgba(0, 0, 0, 0.1);
30 + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15) inset;
31 + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15) inset;
32 + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15) inset;
33 + -webkit-transition: all 0.7s ease 0s;
34 + -moz-transition: all 0.7s ease 0s;
35 + -o-transition: all 0.7s ease 0s;
36 + transition: all 0.7s ease 0s;
37 + }
38 +
39 + #search input[type="text"]:focus {
40 + width: 200px;
41 + }
42 +
43 + #search input[type="text"]:focus {
44 + width: 200px;
45 + }
46 +
47 + ul.timeline {
48 + list-style-type: none;
49 + position: relative;
50 + }
51 +
52 + ul.timeline:before {
53 + content: ' ';
54 + background: #d4d9df;
55 + display: inline-block;
56 + position: absolute;
57 + left: 29px;
58 + width: 2px;
59 + height: 100%;
60 + z-index: 400;
61 + }
62 +
63 + ul.timeline>li {
64 + margin: 20px 0;
65 + padding-left: 20px;
66 + }
67 +
68 + ul.timeline>li:before {
69 + content: ' ';
70 + background: white;
71 + display: inline-block;
72 + position: absolute;
73 + border-radius: 50%;
74 + border: 3px solid #22c0e8;
75 + left: 20px;
76 + width: 20px;
77 + height: 20px;
78 + z-index: 400;
79 + }
80 + </style>
81 +</head>
78 82
79 <body> 83 <body>
80 <div class="container mt-5 mb-5"> 84 <div class="container mt-5 mb-5">
...@@ -82,34 +86,52 @@ ...@@ -82,34 +86,52 @@
82 <div class="col-md-6 offset-md-3"> 86 <div class="col-md-6 offset-md-3">
83 <!--<h4>timeline</h4>--> 87 <!--<h4>timeline</h4>-->
84 <ul class="Timeline"> 88 <ul class="Timeline">
85 - <% for (var i=0; i<20; i++){ %> <!--가져온 타임라인들에 대해서--> 89 + <% for (var i=0; i<timeline.length; i++){ %>
86 - <li> 90 + <!--가져온 타임라인들에 대해서-->
87 - <% if(timeline[i].hasOwnProperty('retweeted_status')) { %> <!--내가 다른사람 글을 리트윗한거면 원글을 쓴 사람 닉네임 출력--> 91 + <li>
88 - <a style ="font-weight: bold;" target="_blank" href=><%= timeline[i].retweeted_status.user.name %></a> 92 + <% if(timeline[i].hasOwnProperty('retweeted_status')) { %>
89 - <% } else { %> <!--아니면 내 닉네임--> 93 + <!--내가 다른사람 글을 리트윗한거면 원글을 쓴 사람 닉네임 출력-->
90 - <a style ="font-weight: bold;" target="_blank" href=><%= timeline[i].user.name %></a> 94 + <a style="font-weight: bold;" target="_blank" href=>
91 - <% } %> 95 + <%= timeline[i].retweeted_status.user.name %>
96 + </a>
97 + <% } else { %>
98 + <!--아니면 내 닉네임-->
99 + <a style="font-weight: bold;" target="_blank" href=>
100 + <%= timeline[i].user.name %>
101 + </a>
102 + <% } %>
92 103
93 - <a href="#" class="float-right"><%= timeline[i].created_at %></a> <!--글이 써진 날짜--> 104 + <a href="#" class="float-right">
105 + <%= timeline[i].created_at %>
106 + </a>
107 + <!--글이 써진 날짜-->
94 108
95 - <p><%=timeline[i].text%></p> <!--그 글 내용 출력--> 109 + <p>
110 + <%=timeline[i].text%>
111 + </p>
112 + <!--그 글 내용 출력-->
96 113
97 - <% if(timeline[i].hasOwnProperty('extended_entities')) { %> <!--미디어가 존재하면 출력--> 114 + <% if(timeline[i].hasOwnProperty('extended_entities')) { %>
98 - <img alt="Web Studio" class="img-fluid" width="300" height="300" src= <%= timeline[i].extended_entities.media[0].media_url_https %> /> 115 + <!--미디어가 존재하면 출력-->
99 - <% } %> 116 + <img alt="Web Studio" class="img-fluid" width="300" height="300"
117 + src=<%=timeline[i].extended_entities.media[0].media_url_https %> />
118 + <% } %>
100 119
101 - <p style="color: #22c0e8;">리트윗: <%= timeline[i].retweet_count %> 마음에 들어요: <%= timeline[i].favorite_count%></p> 120 + <p style="color: #22c0e8;">리트윗: <%= timeline[i].retweet_count %> 마음에
102 - 121 + 들어요: <%= timeline[i].favorite_count%>
122 + </p>
123 +
124 +
125 + </li>
126 + <% } %>
103 127
104 - </li>
105 - <% } %>
106 -
107 </ul> 128 </ul>
108 </div> 129 </div>
109 </div> 130 </div>
110 </div> 131 </div>
111 - 132 +
112 133
113 134
114 </body> 135 </body>
136 +
115 </html> 137 </html>
...\ No newline at end of file ...\ No newline at end of file
......