├── .idea
├── watcherTasks.xml
├── encodings.xml
├── misc.xml
├── vcs.xml
├── modules.xml
└── file-upload.iml
├── package.json
├── README.md
├── main.js
├── .gitignore
└── yarn.lock
/.idea/watcherTasks.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/.idea/encodings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "file-upload",
3 | "author": "Petr Vecera - pagep.net",
4 | "version": "1.0.0",
5 | "main": "index.js",
6 | "license": "MIT",
7 | "scripts": {
8 | "start": "node ./main.js"
9 | },
10 | "dependencies": {
11 | "connect-busboy": "^0.0.2",
12 | "express": "^4.16.3",
13 | "fs-extra": "^5.0.0"
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/.idea/file-upload.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Example code how to handle large file upload in NodeJS
2 |
3 | Aka how to stream the data directly to disk while they are beeing uploaded.
4 |
5 | **You can read more info https://pagep.net/2018/03/31/how-to-handle-large-file-upload-with-nodejs-express-server/**
6 |
7 | But the code should be pretty self-explanatory...
8 |
9 | **All the magic happens in the [main.js](https://github.com/petrvecera/node-file-upload/blob/master/main.js)**
10 |
11 | ## Run the code
12 |
13 | 1. `git clone https://github.com/petrvecera/node-file-upload.git`
14 | 2. `cd node-file-upload`
15 | 3. `yarn install`
16 | 4. `yarn start`
17 |
18 | You can also use `npm` instead of `yarn`.
19 |
--------------------------------------------------------------------------------
/main.js:
--------------------------------------------------------------------------------
1 | const express = require('express'); // Express Web Server
2 | const busboy = require('connect-busboy'); // Middleware to handle the file upload https://github.com/mscdex/connect-busboy
3 | const path = require('path'); // Used for manipulation with path
4 | const fs = require('fs-extra'); // Classic fs
5 |
6 | const app = express(); // Initialize the express web server
7 | app.use(busboy({
8 | highWaterMark: 2 * 1024 * 1024, // Set 2MiB buffer
9 | })); // Insert the busboy middle-ware
10 |
11 | const uploadPath = path.join(__dirname, 'fu/'); // Register the upload path
12 | fs.ensureDir(uploadPath); // Make sure that he upload path exits
13 |
14 |
15 | /**
16 | * Create route /upload which handles the post request
17 | */
18 | app.route('/upload').post((req, res, next) => {
19 |
20 | req.pipe(req.busboy); // Pipe it trough busboy
21 |
22 | req.busboy.on('file', (fieldname, file, filename) => {
23 | console.log(`Upload of '${filename}' started`);
24 |
25 | // Create a write stream of the new file
26 | const fstream = fs.createWriteStream(path.join(uploadPath, filename));
27 | // Pipe it trough
28 | file.pipe(fstream);
29 |
30 | // On finish of the upload
31 | fstream.on('close', () => {
32 | console.log(`Upload of '${filename}' finished`);
33 | res.redirect('back');
34 | });
35 | });
36 | });
37 |
38 |
39 | /**
40 | * Serve the basic index.html with upload form
41 | */
42 | app.route('/').get((req, res) => {
43 | res.writeHead(200, {'Content-Type': 'text/html'});
44 | res.write('
');
48 | return res.end();
49 | });
50 |
51 | const server = app.listen(3200, function () {
52 | console.log(`Listening on port ${server.address().port}`);
53 | });
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | ### Node ###
2 | # Logs
3 | logs
4 | *.log
5 | npm-debug.log*
6 | yarn-debug.log*
7 | yarn-error.log*
8 |
9 | # Runtime data
10 | pids
11 | *.pid
12 | *.seed
13 | *.pid.lock
14 |
15 | # Directory for instrumented libs generated by jscoverage/JSCover
16 | lib-cov
17 |
18 | # Coverage directory used by tools like istanbul
19 | coverage
20 |
21 | # nyc test coverage
22 | .nyc_output
23 |
24 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
25 | .grunt
26 |
27 | # Bower dependency directory (https://bower.io/)
28 | bower_components
29 |
30 | # node-waf configuration
31 | .lock-wscript
32 |
33 | # Compiled binary addons (http://nodejs.org/api/addons.html)
34 | build/Release
35 |
36 | # Dependency directories
37 | node_modules/
38 | jspm_packages/
39 |
40 | # Typescript v1 declaration files
41 | typings/
42 |
43 | # Optional npm cache directory
44 | .npm
45 |
46 | # Optional eslint cache
47 | .eslintcache
48 |
49 | # Optional REPL history
50 | .node_repl_history
51 |
52 | # Output of 'npm pack'
53 | *.tgz
54 |
55 | # Yarn Integrity file
56 | .yarn-integrity
57 |
58 | # dotenv environment variables file
59 | .env
60 |
61 |
62 | ### WebStorm ###
63 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
64 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
65 |
66 | # User-specific stuff:
67 | .idea/**/workspace.xml
68 | .idea/**/tasks.xml
69 | .idea/dictionaries
70 |
71 | # Sensitive or high-churn files:
72 | .idea/**/dataSources/
73 | .idea/**/dataSources.ids
74 | .idea/**/dataSources.xml
75 | .idea/**/dataSources.local.xml
76 | .idea/**/sqlDataSources.xml
77 | .idea/**/dynamic.xml
78 | .idea/**/uiDesigner.xml
79 |
80 | # Gradle:
81 | .idea/**/gradle.xml
82 | .idea/**/libraries
83 |
84 | # CMake
85 | cmake-build-debug/
86 |
87 | # Mongo Explorer plugin:
88 | .idea/**/mongoSettings.xml
89 |
90 | ## File-based project format:
91 | *.iws
92 |
93 | ## Plugin-specific files:
94 |
95 | # IntelliJ
96 | /out/
97 |
98 | # mpeltonen/sbt-idea plugin
99 | .idea_modules/
100 |
101 | # JIRA plugin
102 | atlassian-ide-plugin.xml
103 |
104 | # Cursive Clojure plugin
105 | .idea/replstate.xml
106 |
107 | # Ruby plugin and RubyMine
108 | /.rakeTasks
109 |
110 | # Crashlytics plugin (for Android Studio and IntelliJ)
111 | com_crashlytics_export_strings.xml
112 | crashlytics.properties
113 | crashlytics-build.properties
114 | fabric.properties
115 |
116 | ### WebStorm Patch ###
117 | # Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
118 |
119 | # *.iml
120 | # modules.xml
121 | # .idea/misc.xml
122 | # *.ipr
123 |
124 | # Sonarlint plugin
125 | .idea/sonarlint
126 |
127 |
128 | # End of https://www.gitignore.io/api/node,webstorm
--------------------------------------------------------------------------------
/yarn.lock:
--------------------------------------------------------------------------------
1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2 | # yarn lockfile v1
3 |
4 |
5 | accepts@~1.3.5:
6 | version "1.3.5"
7 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2"
8 | dependencies:
9 | mime-types "~2.1.18"
10 | negotiator "0.6.1"
11 |
12 | array-flatten@1.1.1:
13 | version "1.1.1"
14 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
15 |
16 | body-parser@1.18.2:
17 | version "1.18.2"
18 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454"
19 | dependencies:
20 | bytes "3.0.0"
21 | content-type "~1.0.4"
22 | debug "2.6.9"
23 | depd "~1.1.1"
24 | http-errors "~1.6.2"
25 | iconv-lite "0.4.19"
26 | on-finished "~2.3.0"
27 | qs "6.5.1"
28 | raw-body "2.3.2"
29 | type-is "~1.6.15"
30 |
31 | busboy@*:
32 | version "0.2.14"
33 | resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.2.14.tgz#6c2a622efcf47c57bbbe1e2a9c37ad36c7925453"
34 | dependencies:
35 | dicer "0.2.5"
36 | readable-stream "1.1.x"
37 |
38 | bytes@3.0.0:
39 | version "3.0.0"
40 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
41 |
42 | connect-busboy@^0.0.2:
43 | version "0.0.2"
44 | resolved "https://registry.yarnpkg.com/connect-busboy/-/connect-busboy-0.0.2.tgz#ac5c9c96672171885e576c66b2bfd95d3bb11097"
45 | dependencies:
46 | busboy "*"
47 |
48 | content-disposition@0.5.2:
49 | version "0.5.2"
50 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4"
51 |
52 | content-type@~1.0.4:
53 | version "1.0.4"
54 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
55 |
56 | cookie-signature@1.0.6:
57 | version "1.0.6"
58 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
59 |
60 | cookie@0.3.1:
61 | version "0.3.1"
62 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
63 |
64 | core-util-is@~1.0.0:
65 | version "1.0.2"
66 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
67 |
68 | debug@2.6.9:
69 | version "2.6.9"
70 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
71 | dependencies:
72 | ms "2.0.0"
73 |
74 | depd@1.1.1:
75 | version "1.1.1"
76 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359"
77 |
78 | depd@~1.1.1, depd@~1.1.2:
79 | version "1.1.2"
80 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
81 |
82 | destroy@~1.0.4:
83 | version "1.0.4"
84 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
85 |
86 | dicer@0.2.5:
87 | version "0.2.5"
88 | resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.2.5.tgz#5996c086bb33218c812c090bddc09cd12facb70f"
89 | dependencies:
90 | readable-stream "1.1.x"
91 | streamsearch "0.1.2"
92 |
93 | ee-first@1.1.1:
94 | version "1.1.1"
95 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
96 |
97 | encodeurl@~1.0.2:
98 | version "1.0.2"
99 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
100 |
101 | escape-html@~1.0.3:
102 | version "1.0.3"
103 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
104 |
105 | etag@~1.8.1:
106 | version "1.8.1"
107 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
108 |
109 | express@^4.16.3:
110 | version "4.16.3"
111 | resolved "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53"
112 | dependencies:
113 | accepts "~1.3.5"
114 | array-flatten "1.1.1"
115 | body-parser "1.18.2"
116 | content-disposition "0.5.2"
117 | content-type "~1.0.4"
118 | cookie "0.3.1"
119 | cookie-signature "1.0.6"
120 | debug "2.6.9"
121 | depd "~1.1.2"
122 | encodeurl "~1.0.2"
123 | escape-html "~1.0.3"
124 | etag "~1.8.1"
125 | finalhandler "1.1.1"
126 | fresh "0.5.2"
127 | merge-descriptors "1.0.1"
128 | methods "~1.1.2"
129 | on-finished "~2.3.0"
130 | parseurl "~1.3.2"
131 | path-to-regexp "0.1.7"
132 | proxy-addr "~2.0.3"
133 | qs "6.5.1"
134 | range-parser "~1.2.0"
135 | safe-buffer "5.1.1"
136 | send "0.16.2"
137 | serve-static "1.13.2"
138 | setprototypeof "1.1.0"
139 | statuses "~1.4.0"
140 | type-is "~1.6.16"
141 | utils-merge "1.0.1"
142 | vary "~1.1.2"
143 |
144 | finalhandler@1.1.1:
145 | version "1.1.1"
146 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105"
147 | dependencies:
148 | debug "2.6.9"
149 | encodeurl "~1.0.2"
150 | escape-html "~1.0.3"
151 | on-finished "~2.3.0"
152 | parseurl "~1.3.2"
153 | statuses "~1.4.0"
154 | unpipe "~1.0.0"
155 |
156 | forwarded@~0.1.2:
157 | version "0.1.2"
158 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
159 |
160 | fresh@0.5.2:
161 | version "0.5.2"
162 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
163 |
164 | fs-extra@^5.0.0:
165 | version "5.0.0"
166 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd"
167 | dependencies:
168 | graceful-fs "^4.1.2"
169 | jsonfile "^4.0.0"
170 | universalify "^0.1.0"
171 |
172 | graceful-fs@^4.1.2, graceful-fs@^4.1.6:
173 | version "4.1.11"
174 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
175 |
176 | http-errors@1.6.2:
177 | version "1.6.2"
178 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736"
179 | dependencies:
180 | depd "1.1.1"
181 | inherits "2.0.3"
182 | setprototypeof "1.0.3"
183 | statuses ">= 1.3.1 < 2"
184 |
185 | http-errors@~1.6.2:
186 | version "1.6.3"
187 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d"
188 | dependencies:
189 | depd "~1.1.2"
190 | inherits "2.0.3"
191 | setprototypeof "1.1.0"
192 | statuses ">= 1.4.0 < 2"
193 |
194 | iconv-lite@0.4.19:
195 | version "0.4.19"
196 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
197 |
198 | inherits@2.0.3, inherits@~2.0.1:
199 | version "2.0.3"
200 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
201 |
202 | ipaddr.js@1.6.0:
203 | version "1.6.0"
204 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.6.0.tgz#e3fa357b773da619f26e95f049d055c72796f86b"
205 |
206 | isarray@0.0.1:
207 | version "0.0.1"
208 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
209 |
210 | jsonfile@^4.0.0:
211 | version "4.0.0"
212 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
213 | optionalDependencies:
214 | graceful-fs "^4.1.6"
215 |
216 | media-typer@0.3.0:
217 | version "0.3.0"
218 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
219 |
220 | merge-descriptors@1.0.1:
221 | version "1.0.1"
222 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
223 |
224 | methods@~1.1.2:
225 | version "1.1.2"
226 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
227 |
228 | mime-db@~1.33.0:
229 | version "1.33.0"
230 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db"
231 |
232 | mime-types@~2.1.18:
233 | version "2.1.18"
234 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8"
235 | dependencies:
236 | mime-db "~1.33.0"
237 |
238 | mime@1.4.1:
239 | version "1.4.1"
240 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"
241 |
242 | ms@2.0.0:
243 | version "2.0.0"
244 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
245 |
246 | negotiator@0.6.1:
247 | version "0.6.1"
248 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
249 |
250 | on-finished@~2.3.0:
251 | version "2.3.0"
252 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
253 | dependencies:
254 | ee-first "1.1.1"
255 |
256 | parseurl@~1.3.2:
257 | version "1.3.2"
258 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3"
259 |
260 | path-to-regexp@0.1.7:
261 | version "0.1.7"
262 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
263 |
264 | proxy-addr@~2.0.3:
265 | version "2.0.3"
266 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.3.tgz#355f262505a621646b3130a728eb647e22055341"
267 | dependencies:
268 | forwarded "~0.1.2"
269 | ipaddr.js "1.6.0"
270 |
271 | qs@6.5.1:
272 | version "6.5.1"
273 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8"
274 |
275 | range-parser@~1.2.0:
276 | version "1.2.0"
277 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e"
278 |
279 | raw-body@2.3.2:
280 | version "2.3.2"
281 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89"
282 | dependencies:
283 | bytes "3.0.0"
284 | http-errors "1.6.2"
285 | iconv-lite "0.4.19"
286 | unpipe "1.0.0"
287 |
288 | readable-stream@1.1.x:
289 | version "1.1.14"
290 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
291 | dependencies:
292 | core-util-is "~1.0.0"
293 | inherits "~2.0.1"
294 | isarray "0.0.1"
295 | string_decoder "~0.10.x"
296 |
297 | safe-buffer@5.1.1:
298 | version "5.1.1"
299 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
300 |
301 | send@0.16.2:
302 | version "0.16.2"
303 | resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1"
304 | dependencies:
305 | debug "2.6.9"
306 | depd "~1.1.2"
307 | destroy "~1.0.4"
308 | encodeurl "~1.0.2"
309 | escape-html "~1.0.3"
310 | etag "~1.8.1"
311 | fresh "0.5.2"
312 | http-errors "~1.6.2"
313 | mime "1.4.1"
314 | ms "2.0.0"
315 | on-finished "~2.3.0"
316 | range-parser "~1.2.0"
317 | statuses "~1.4.0"
318 |
319 | serve-static@1.13.2:
320 | version "1.13.2"
321 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1"
322 | dependencies:
323 | encodeurl "~1.0.2"
324 | escape-html "~1.0.3"
325 | parseurl "~1.3.2"
326 | send "0.16.2"
327 |
328 | setprototypeof@1.0.3:
329 | version "1.0.3"
330 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04"
331 |
332 | setprototypeof@1.1.0:
333 | version "1.1.0"
334 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
335 |
336 | "statuses@>= 1.3.1 < 2", "statuses@>= 1.4.0 < 2":
337 | version "1.5.0"
338 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
339 |
340 | statuses@~1.4.0:
341 | version "1.4.0"
342 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
343 |
344 | streamsearch@0.1.2:
345 | version "0.1.2"
346 | resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a"
347 |
348 | string_decoder@~0.10.x:
349 | version "0.10.31"
350 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
351 |
352 | type-is@~1.6.15, type-is@~1.6.16:
353 | version "1.6.16"
354 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194"
355 | dependencies:
356 | media-typer "0.3.0"
357 | mime-types "~2.1.18"
358 |
359 | universalify@^0.1.0:
360 | version "0.1.1"
361 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7"
362 |
363 | unpipe@1.0.0, unpipe@~1.0.0:
364 | version "1.0.0"
365 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
366 |
367 | utils-merge@1.0.1:
368 | version "1.0.1"
369 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
370 |
371 | vary@~1.1.2:
372 | version "1.1.2"
373 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
374 |
--------------------------------------------------------------------------------