├── .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 | 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('
'); 45 | res.write('
'); 46 | res.write(''); 47 | 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 | --------------------------------------------------------------------------------