├── .editorconfig ├── .eslintrc ├── .gitignore ├── LICENSE.md ├── README.md ├── index.js ├── package-lock.json └── package.json /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 4 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "airbnb-base", 3 | "env": { 4 | "node": true 5 | }, 6 | "globals": { 7 | }, 8 | "rules": { 9 | "indent": ["error", 4, { "MemberExpression": 0 }], 10 | "func-names": ["error", "never"], 11 | "comma-dangle": ["error", "never"], 12 | "max-len": ["off", 120], 13 | "no-plusplus": "off", 14 | "no-prototype-builtins": "off", 15 | "no-underscore-dangle": "off", 16 | "no-param-reassign": ["error", { "props": false }], 17 | "brace-style": ["error", "stroustrup"], 18 | "import/no-extraneous-dependencies": ["error", {"devDependencies": true, "optionalDependencies": false, "peerDependencies": false}] 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | 4 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | BSD 3-Clause License 2 | 3 | Copyright (c) 2018, Quentin Busuttil 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | * Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | * Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | * Neither the name of the copyright holder nor the names of its 17 | contributors may be used to endorse or promote products derived from 18 | this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # huge uploader nodejs 2 | 3 | `huge-uploader-nodejs` is a Node.js promise-based module made to receive chunked & resumable file uploads. It's made to work with its frontend counterpart [`huge-uploader`](https://github.com/Buzut/huge-uploader). 4 | 5 | From `huge-uploader`: 6 | > HTTP and especially HTTP servers have limits and were not designed to transfer large files. In addition, network connexion can be unreliable. No one wants an upload to fail after hours… Sometimes we even need to pause the upload, and HTTP doesn't allow that. 7 | > 8 | > The best way to circumvent these issues is to chunk the file and send it in small pieces. If a chunk fails, no worries, it's small and fast to re-send it. Wanna pause? Ok, just start where you left off when ready. 9 | 10 | The frontend module chunks and sends, this backend module receives and assembles all the pieces back together at the end of the process. 11 | 12 | ## Installation & usage 13 | 14 | ```javascript 15 | npm install huge-uploader-nodejs --save 16 | ``` 17 | 18 | As an exemple, I'll give something in pure Node.js, without any framework. But it is obviously compatible with any framework out there. 19 | 20 | ```javascript 21 | const http = require('http'); 22 | const uploader = require('huge-uploader-nodejs'); 23 | 24 | // you must specify a temp upload dir and a max filesize for the chunks 25 | const tmpDir = './tmp'; 26 | const maxFileSize = 10; 27 | 28 | http.createServer((req, res) => { 29 | if (req.url === '/upload' && req.method === 'POST') { 30 | // we feed the function with node's request object (here req), 31 | // the temp directory path and the max size for the chunks 32 | uploader(req, tmpDir, maxFileSize, maxChunkSize) 33 | .then((assembleChunks) => { 34 | // chunk written to disk 35 | res.writeHead(204, 'No Content'); 36 | res.end(); 37 | 38 | // on last chunk, assembleChunks function is returned 39 | // the response is already sent to the browser because it can take some time if the file is huge 40 | if (assembleChunks) { 41 | // so you call the promise, it assembles all the pieces together and cleans the temporary files 42 | assembleChunks() 43 | // when it's done, it returns an object with the path to the file and additional post parameters if any 44 | .then(data => console.log(data)) // { filePath: 'tmp/1528932277257', postParams: { email: 'upload@corp.com', name: 'Mr Smith' } } 45 | // errors if any are triggered by the file system (disk is full…) 46 | .catch(err => console.log(err)); 47 | } 48 | }) 49 | .catch((err) => { 50 | if (err.message === 'Missing header(s)') { 51 | res.writeHead(400, 'Bad Request', { 'Content-Type': 'text/plain' }); 52 | res.end('Missing uploader-* header'); 53 | return; 54 | } 55 | 56 | if (err.message === 'Missing Content-Type') { 57 | res.writeHead(400, 'Bad Request', { 'Content-Type': 'text/plain' }); 58 | res.end('Missing Content-Type'); 59 | return; 60 | } 61 | 62 | if (err.message.includes('Unsupported content type')) { 63 | res.writeHead(400, 'Bad Request', { 'Content-Type': 'text/plain' }); 64 | res.end('Unsupported content type'); 65 | return; 66 | } 67 | 68 | if (err.message === 'Chunk is out of range') { 69 | res.writeHead(400, 'Bad Request', { 'Content-Type': 'text/plain' }); 70 | res.end('Chunk number must be between 0 and total chunks - 1 (0 indexed)'); 71 | return; 72 | } 73 | 74 | if (err.message === 'File is above size limit') { 75 | res.writeHead(413, 'Payload Too Large', { 'Content-Type': 'text/plain' }); 76 | res.end(`File is too large. Max fileSize is: ${maxFileSize}MB`); 77 | return; 78 | } 79 | 80 | if (err.message === 'Chunk is above size limit') { 81 | res.writeHead(413, 'Payload Too Large', { 'Content-Type': 'text/plain' }); 82 | res.end(`Chunk is too large. Max chunkSize is: ${maxChunkSize}MB`); 83 | return; 84 | } 85 | 86 | // this error is triggered if a chunk with uploader-chunk-number header != 0 87 | // is sent and there is no corresponding temp dir. 88 | // It means that the upload dir has been deleted in the meantime. 89 | // Although uploads should be resumable, you can't keep partial uploads for days on your server 90 | if (err && err.message === 'Upload has expired') { 91 | res.writeHead(410, 'Gone', { 'Content-Type': 'text/plain' }); 92 | res.end(err.message); 93 | return; 94 | } 95 | 96 | // other FS errors 97 | res.writeHead(500, 'Internal Server Error'); // potentially saturated disk 98 | res.end(); 99 | }); 100 | } 101 | 102 | // unknown route 103 | else { 104 | res.writeHead(404, 'Resource Not Found', { 'Content-Type': 'text/plain' }); 105 | res.end('Resource Not Found'); 106 | } 107 | }) 108 | .listen(8888, () => { 109 | console.log('Listening for requests'); 110 | }); 111 | ``` 112 | 113 | Also, if the uploader is not on the same domain, don't forget to set a CORS policy. Either directly on node or on the reverse proxy. Here's an exemple for Node: 114 | 115 | ```javascript 116 | res.setHeader('Access-Control-Allow-Origin', 'https://my-super-domain.com'); 117 | 118 | if (req.url === '/upload' && req.method === 'OPTIONS') { 119 | res.setHeader('Access-Control-Allow-Methods', 'POST,OPTIONS'); 120 | res.setHeader('Access-Control-Allow-Headers', 'uploader-chunk-number,uploader-chunks-total,uploader-file-id'); 121 | res.setHeader('Access-Control-Max-Age', '86400'); // 24hrs 122 | res.writeHead(204, 'No Content'); 123 | res.end(); 124 | return; 125 | } 126 | 127 | ``` 128 | 129 | ### Options 130 | 131 | They aren't many options (all are required). As shown in the example, you pass the function: 132 | * the request object, 133 | * a directory to write to `{ String }`, 134 | * the maximum total file size for the upload `{ Number }`, 135 | * the maximum chunk size `{ Number }`. 136 | 137 | Be warned that total file size is computed by multiplying `maxChunkSize` by `uploader-chunks-total` header. So if the client is splitting files in chunks smaller than `maxChunkSize`, leading to a situation where `uploader-chunks-total` > `maxFileSize / maxChunkSize`, the upload will be refused although it might be smaller than `maxFileSize`. 138 | 139 | ### Garbage collection 140 | 141 | As said in the exemple, the module takes care of cleaning the successful uploads. But if an upload is paused and never resumed, its files are going to stay forever. So you should create a script called via a crontab that will erased directory older than the time you're willing to keep them. 142 | 143 | Example bash script: 144 | ```shell 145 | #!/bin/bash 146 | 147 | find /var/www/tmp -type d -mtime +1 -delete 148 | ``` 149 | 150 | ## How to setup with the frontend 151 | This module is made to work with [`huge-uploader`](https://github.com/Buzut/huge-uploader) frontend module. In case you would like to develop your own frontend, this module needs three specific headers to work: 152 | 153 | * `uploader-file-id` a unique file id that's used to create temp upload directory for this upload, 154 | * `uploader-chunks-total` the total numbers of chunk that will be sent, 155 | * `uploader-chunk-number` the current chunk number (0 based index, so last chunk is `uploader-chunks-total - 1`). 156 | 157 | Any other header will be ignored. Also, you can send `POST` parameters. Parameters send with the last chunk only will be processed. 158 | 159 | ## Contributing 160 | There's sure room for improvement, so feel free to hack around and submit PRs! 161 | Please just follow the style of the existing code, which is [Airbnb's style](http://airbnb.io/javascript/) with [minor modifications](.eslintrc). 162 | 163 | To maintain things clear and visual, please follow the [git commit template](https://github.com/Buzut/git-emojis-hook). 164 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const { promisify } = require('util'); 2 | const path = require('path'); 3 | const fs = require('fs'); 4 | const Busboy = require('busboy'); 5 | 6 | /** 7 | * Make sure required headers are present & are numbers 8 | * @param { Object } headers – req.headers object 9 | * @return { Boolean } 10 | */ 11 | function checkHeaders(headers) { 12 | if ( 13 | !headers['uploader-chunk-number'] || 14 | !headers['uploader-chunks-total'] || 15 | !headers['uploader-file-id'] || 16 | !headers['uploader-chunks-total'].match(/^[0-9]+$/) || 17 | !headers['uploader-chunk-number'].match(/^[0-9]+$/) || 18 | !headers['uploader-file-id'].match(/^[0-9]+$/) 19 | ) return false; 20 | 21 | return true; 22 | } 23 | 24 | /** 25 | * Make sure total file size isn't bigger than limit 26 | * @param { Number } maxFileSize 27 | * @param { Number } maxChunkSize 28 | * @param { Object } headers – req.headers object 29 | * @return { Boolean } 30 | */ 31 | function checkTotalSize(maxFileSize, maxChunkSize, totalChunks) { 32 | if (maxChunkSize * totalChunks > maxFileSize) return false; 33 | return true; 34 | } 35 | 36 | /** 37 | * Delete tmp directory containing chunks 38 | * @param { String } dirPath 39 | */ 40 | function cleanChunks(dirPath) { 41 | fs.readdir(dirPath, (err, files) => { 42 | let filesLength = files.length; 43 | 44 | files.forEach((file) => { 45 | fs.unlink(path.join(dirPath, file), () => { 46 | if (--filesLength === 0) fs.rmdir(dirPath, () => {}); // cb does nothing but required 47 | }); 48 | }); 49 | }); 50 | } 51 | 52 | /** 53 | * Take all chunks of a file and reassemble them in a unique file 54 | * @param { String } tmpDir 55 | * @param { String } dirPath 56 | * @param { String } fileId 57 | * @param { Number } totalChunks 58 | * @param { Object } postParams – form post fields 59 | * @return { Function } promised function to start assembling 60 | */ 61 | function assembleChunks(tmpDir, dirPath, fileId, totalChunks, postParams) { 62 | const asyncReadFile = promisify(fs.readFile); 63 | const asyncAppendFile = promisify(fs.appendFile); 64 | const assembledFile = path.join(tmpDir, fileId); 65 | let chunkCount = 0; 66 | 67 | return () => { // eslint-disable-line 68 | return new Promise((resolve, reject) => { 69 | const pipeChunk = () => { 70 | asyncReadFile(path.join(dirPath, chunkCount.toString())) 71 | .then(chunk => asyncAppendFile(assembledFile, chunk)) 72 | .then(() => { 73 | // 0 indexed files = length - 1, so increment before comparison 74 | if (totalChunks > ++chunkCount) pipeChunk(chunkCount); 75 | 76 | else { 77 | cleanChunks(dirPath); 78 | resolve({ filePath: assembledFile, postParams }); 79 | } 80 | }) 81 | .catch(reject); 82 | }; 83 | 84 | pipeChunk(); 85 | }); 86 | }; 87 | } 88 | 89 | /** 90 | * Create directory if it doesn't exist 91 | * @param { String } dirPath 92 | * @param { Function } callback 93 | */ 94 | function mkdirIfDoesntExist(dirPath, callback) { 95 | fs.stat(dirPath, (err) => { 96 | if (err) fs.mkdir(dirPath, callback); 97 | else callback(); 98 | }); 99 | } 100 | 101 | /** 102 | * write chunk to upload dir, create tmp dir if first chunk 103 | * return getFileStatus ƒ to query completion status cb(err, [null | assembleChunks ƒ]) 104 | * assembleChunks ƒ is returned only for last chunk 105 | * @param { String } tmpDir 106 | * @param { Object } headers 107 | * @param { Object } fileStream 108 | * @param { Object } postParams 109 | * @return { Function } getFileStatus – cb based function to know when file is written. callback(err, assembleChunks ƒ) 110 | */ 111 | function handleFile(tmpDir, headers, fileStream, postParams) { 112 | const dirPath = path.join(tmpDir, `${headers['uploader-file-id']}_tmp`); 113 | const chunkPath = path.join(dirPath, headers['uploader-chunk-number']); 114 | const chunkCount = +headers['uploader-chunk-number']; 115 | const totalChunks = +headers['uploader-chunks-total']; 116 | 117 | let error; 118 | let assembleChunksPromise; 119 | let finished = false; 120 | let writeStream; 121 | 122 | const writeFile = () => { 123 | writeStream = fs.createWriteStream(chunkPath); 124 | 125 | writeStream.on('error', (err) => { 126 | error = err; 127 | fileStream.resume(); 128 | }); 129 | 130 | writeStream.on('close', () => { 131 | finished = true; 132 | 133 | // if all is uploaded 134 | if (chunkCount === totalChunks - 1) { 135 | assembleChunksPromise = assembleChunks(tmpDir, dirPath, headers['uploader-file-id'], totalChunks, postParams); 136 | } 137 | }); 138 | 139 | fileStream.pipe(writeStream); 140 | }; 141 | 142 | // make sure chunk is in range 143 | if (chunkCount < 0 || chunkCount >= totalChunks) { 144 | error = new Error('Chunk is out of range'); 145 | fileStream.resume(); 146 | } 147 | 148 | // create file upload dir if it's first chunk 149 | else if (chunkCount === 0) { 150 | mkdirIfDoesntExist(dirPath, (err) => { 151 | if (err) { 152 | error = err; 153 | fileStream.resume(); 154 | } 155 | 156 | else writeFile(); 157 | }); 158 | } 159 | 160 | // make sure dir exists if it's not first chunk 161 | else { 162 | fs.stat(dirPath, (err) => { 163 | if (err) { 164 | error = new Error('Upload has expired'); 165 | fileStream.resume(); 166 | } 167 | 168 | else writeFile(); 169 | }); 170 | } 171 | 172 | return (callback) => { 173 | if (finished && !error) callback(null, assembleChunksPromise); 174 | else if (error) callback(error); 175 | 176 | else { 177 | writeStream.on('error', callback); 178 | writeStream.on('close', () => callback(null, assembleChunksPromise)); 179 | } 180 | }; 181 | } 182 | 183 | /** 184 | * Master function. Parse form and call child ƒs for writing and assembling 185 | * @param { Object } req – nodejs req object 186 | * @param { String } tmpDir – upload temp dir 187 | * @param { Number } maxChunkSize 188 | */ 189 | function uploadFile(req, tmpDir, maxFileSize, maxChunkSize) { 190 | return new Promise((resolve, reject) => { 191 | if (!checkHeaders(req.headers)) { 192 | reject(new Error('Missing header(s)')); 193 | return; 194 | } 195 | 196 | if (!checkTotalSize(maxFileSize, maxChunkSize, req.headers['uploader-chunks-total'])) { 197 | reject(new Error('File is above size limit')); 198 | return; 199 | } 200 | 201 | try { 202 | const postParams = {}; 203 | let limitReached = false; 204 | let getFileStatus; 205 | 206 | const busboy = new Busboy({ headers: req.headers, limits: { files: 1, fileSize: maxChunkSize * 1000 * 1000 } }); 207 | 208 | busboy.on('file', (fieldname, fileStream) => { 209 | fileStream.on('limit', () => { 210 | limitReached = true; 211 | fileStream.resume(); 212 | }); 213 | 214 | getFileStatus = handleFile(tmpDir, req.headers, fileStream, postParams); 215 | }); 216 | 217 | busboy.on('field', (key, val) => { 218 | postParams[key] = val; 219 | }); 220 | 221 | busboy.on('finish', () => { 222 | if (limitReached) { 223 | reject(new Error('Chunk is above size limit')); 224 | return; 225 | } 226 | 227 | getFileStatus((fileErr, assembleChunksF) => { 228 | if (fileErr) reject(fileErr); 229 | else resolve(assembleChunksF); 230 | }); 231 | }); 232 | 233 | req.pipe(busboy); 234 | } 235 | 236 | catch (err) { 237 | reject(err); 238 | } 239 | }); 240 | } 241 | 242 | module.exports = uploadFile; 243 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "huge-uploader-nodejs", 3 | "version": "1.2.1", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "acorn": { 8 | "version": "5.6.2", 9 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.6.2.tgz", 10 | "integrity": "sha512-zUzo1E5dI2Ey8+82egfnttyMlMZ2y0D8xOCO3PNPPlYXpl8NZvF6Qk9L9BEtJs+43FqEmfBViDqc5d1ckRDguw==", 11 | "dev": true 12 | }, 13 | "acorn-jsx": { 14 | "version": "3.0.1", 15 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", 16 | "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", 17 | "dev": true, 18 | "requires": { 19 | "acorn": "^3.0.4" 20 | }, 21 | "dependencies": { 22 | "acorn": { 23 | "version": "3.3.0", 24 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", 25 | "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", 26 | "dev": true 27 | } 28 | } 29 | }, 30 | "ajv": { 31 | "version": "5.5.2", 32 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", 33 | "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", 34 | "dev": true, 35 | "requires": { 36 | "co": "^4.6.0", 37 | "fast-deep-equal": "^1.0.0", 38 | "fast-json-stable-stringify": "^2.0.0", 39 | "json-schema-traverse": "^0.3.0" 40 | } 41 | }, 42 | "ajv-keywords": { 43 | "version": "2.1.1", 44 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", 45 | "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", 46 | "dev": true 47 | }, 48 | "ansi-escapes": { 49 | "version": "3.1.0", 50 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", 51 | "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", 52 | "dev": true 53 | }, 54 | "ansi-regex": { 55 | "version": "2.1.1", 56 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 57 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 58 | "dev": true 59 | }, 60 | "ansi-styles": { 61 | "version": "2.2.1", 62 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 63 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 64 | "dev": true 65 | }, 66 | "argparse": { 67 | "version": "1.0.10", 68 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 69 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 70 | "dev": true, 71 | "requires": { 72 | "sprintf-js": "~1.0.2" 73 | } 74 | }, 75 | "array-union": { 76 | "version": "1.0.2", 77 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", 78 | "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", 79 | "dev": true, 80 | "requires": { 81 | "array-uniq": "^1.0.1" 82 | } 83 | }, 84 | "array-uniq": { 85 | "version": "1.0.3", 86 | "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", 87 | "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", 88 | "dev": true 89 | }, 90 | "arrify": { 91 | "version": "1.0.1", 92 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", 93 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", 94 | "dev": true 95 | }, 96 | "babel-code-frame": { 97 | "version": "6.26.0", 98 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", 99 | "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", 100 | "dev": true, 101 | "requires": { 102 | "chalk": "^1.1.3", 103 | "esutils": "^2.0.2", 104 | "js-tokens": "^3.0.2" 105 | }, 106 | "dependencies": { 107 | "chalk": { 108 | "version": "1.1.3", 109 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 110 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 111 | "dev": true, 112 | "requires": { 113 | "ansi-styles": "^2.2.1", 114 | "escape-string-regexp": "^1.0.2", 115 | "has-ansi": "^2.0.0", 116 | "strip-ansi": "^3.0.0", 117 | "supports-color": "^2.0.0" 118 | } 119 | }, 120 | "strip-ansi": { 121 | "version": "3.0.1", 122 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 123 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 124 | "dev": true, 125 | "requires": { 126 | "ansi-regex": "^2.0.0" 127 | } 128 | } 129 | } 130 | }, 131 | "balanced-match": { 132 | "version": "1.0.0", 133 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 134 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 135 | "dev": true 136 | }, 137 | "brace-expansion": { 138 | "version": "1.1.11", 139 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 140 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 141 | "dev": true, 142 | "requires": { 143 | "balanced-match": "^1.0.0", 144 | "concat-map": "0.0.1" 145 | } 146 | }, 147 | "buffer-from": { 148 | "version": "1.1.0", 149 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", 150 | "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", 151 | "dev": true 152 | }, 153 | "builtin-modules": { 154 | "version": "1.1.1", 155 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 156 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", 157 | "dev": true 158 | }, 159 | "busboy": { 160 | "version": "0.2.14", 161 | "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", 162 | "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", 163 | "requires": { 164 | "dicer": "0.2.5", 165 | "readable-stream": "1.1.x" 166 | } 167 | }, 168 | "caller-path": { 169 | "version": "0.1.0", 170 | "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", 171 | "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", 172 | "dev": true, 173 | "requires": { 174 | "callsites": "^0.2.0" 175 | } 176 | }, 177 | "callsites": { 178 | "version": "0.2.0", 179 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", 180 | "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", 181 | "dev": true 182 | }, 183 | "chalk": { 184 | "version": "2.4.1", 185 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", 186 | "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", 187 | "dev": true, 188 | "requires": { 189 | "ansi-styles": "^3.2.1", 190 | "escape-string-regexp": "^1.0.5", 191 | "supports-color": "^5.3.0" 192 | }, 193 | "dependencies": { 194 | "ansi-styles": { 195 | "version": "3.2.1", 196 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 197 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 198 | "dev": true, 199 | "requires": { 200 | "color-convert": "^1.9.0" 201 | } 202 | }, 203 | "supports-color": { 204 | "version": "5.4.0", 205 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", 206 | "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", 207 | "dev": true, 208 | "requires": { 209 | "has-flag": "^3.0.0" 210 | } 211 | } 212 | } 213 | }, 214 | "chardet": { 215 | "version": "0.4.2", 216 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", 217 | "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", 218 | "dev": true 219 | }, 220 | "circular-json": { 221 | "version": "0.3.3", 222 | "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", 223 | "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", 224 | "dev": true 225 | }, 226 | "cli-cursor": { 227 | "version": "2.1.0", 228 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 229 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 230 | "dev": true, 231 | "requires": { 232 | "restore-cursor": "^2.0.0" 233 | } 234 | }, 235 | "cli-width": { 236 | "version": "2.2.0", 237 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", 238 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", 239 | "dev": true 240 | }, 241 | "co": { 242 | "version": "4.6.0", 243 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 244 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", 245 | "dev": true 246 | }, 247 | "color-convert": { 248 | "version": "1.9.1", 249 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", 250 | "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", 251 | "dev": true, 252 | "requires": { 253 | "color-name": "^1.1.1" 254 | } 255 | }, 256 | "color-name": { 257 | "version": "1.1.3", 258 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 259 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 260 | "dev": true 261 | }, 262 | "concat-map": { 263 | "version": "0.0.1", 264 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 265 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 266 | "dev": true 267 | }, 268 | "concat-stream": { 269 | "version": "1.6.2", 270 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 271 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 272 | "dev": true, 273 | "requires": { 274 | "buffer-from": "^1.0.0", 275 | "inherits": "^2.0.3", 276 | "readable-stream": "^2.2.2", 277 | "typedarray": "^0.0.6" 278 | }, 279 | "dependencies": { 280 | "isarray": { 281 | "version": "1.0.0", 282 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 283 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 284 | "dev": true 285 | }, 286 | "readable-stream": { 287 | "version": "2.3.6", 288 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 289 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 290 | "dev": true, 291 | "requires": { 292 | "core-util-is": "~1.0.0", 293 | "inherits": "~2.0.3", 294 | "isarray": "~1.0.0", 295 | "process-nextick-args": "~2.0.0", 296 | "safe-buffer": "~5.1.1", 297 | "string_decoder": "~1.1.1", 298 | "util-deprecate": "~1.0.1" 299 | } 300 | }, 301 | "string_decoder": { 302 | "version": "1.1.1", 303 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 304 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 305 | "dev": true, 306 | "requires": { 307 | "safe-buffer": "~5.1.0" 308 | } 309 | } 310 | } 311 | }, 312 | "contains-path": { 313 | "version": "0.1.0", 314 | "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", 315 | "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", 316 | "dev": true 317 | }, 318 | "core-util-is": { 319 | "version": "1.0.2", 320 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 321 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 322 | }, 323 | "cross-spawn": { 324 | "version": "5.1.0", 325 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", 326 | "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", 327 | "dev": true, 328 | "requires": { 329 | "lru-cache": "^4.0.1", 330 | "shebang-command": "^1.2.0", 331 | "which": "^1.2.9" 332 | } 333 | }, 334 | "debug": { 335 | "version": "3.1.0", 336 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 337 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 338 | "dev": true, 339 | "requires": { 340 | "ms": "2.0.0" 341 | } 342 | }, 343 | "deep-is": { 344 | "version": "0.1.3", 345 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 346 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 347 | "dev": true 348 | }, 349 | "del": { 350 | "version": "2.2.2", 351 | "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", 352 | "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", 353 | "dev": true, 354 | "requires": { 355 | "globby": "^5.0.0", 356 | "is-path-cwd": "^1.0.0", 357 | "is-path-in-cwd": "^1.0.0", 358 | "object-assign": "^4.0.1", 359 | "pify": "^2.0.0", 360 | "pinkie-promise": "^2.0.0", 361 | "rimraf": "^2.2.8" 362 | } 363 | }, 364 | "dicer": { 365 | "version": "0.2.5", 366 | "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", 367 | "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", 368 | "requires": { 369 | "readable-stream": "1.1.x", 370 | "streamsearch": "0.1.2" 371 | } 372 | }, 373 | "doctrine": { 374 | "version": "2.1.0", 375 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", 376 | "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", 377 | "dev": true, 378 | "requires": { 379 | "esutils": "^2.0.2" 380 | } 381 | }, 382 | "error-ex": { 383 | "version": "1.3.1", 384 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", 385 | "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", 386 | "dev": true, 387 | "requires": { 388 | "is-arrayish": "^0.2.1" 389 | } 390 | }, 391 | "escape-string-regexp": { 392 | "version": "1.0.5", 393 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 394 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 395 | "dev": true 396 | }, 397 | "eslint": { 398 | "version": "4.19.1", 399 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", 400 | "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", 401 | "dev": true, 402 | "requires": { 403 | "ajv": "^5.3.0", 404 | "babel-code-frame": "^6.22.0", 405 | "chalk": "^2.1.0", 406 | "concat-stream": "^1.6.0", 407 | "cross-spawn": "^5.1.0", 408 | "debug": "^3.1.0", 409 | "doctrine": "^2.1.0", 410 | "eslint-scope": "^3.7.1", 411 | "eslint-visitor-keys": "^1.0.0", 412 | "espree": "^3.5.4", 413 | "esquery": "^1.0.0", 414 | "esutils": "^2.0.2", 415 | "file-entry-cache": "^2.0.0", 416 | "functional-red-black-tree": "^1.0.1", 417 | "glob": "^7.1.2", 418 | "globals": "^11.0.1", 419 | "ignore": "^3.3.3", 420 | "imurmurhash": "^0.1.4", 421 | "inquirer": "^3.0.6", 422 | "is-resolvable": "^1.0.0", 423 | "js-yaml": "^3.9.1", 424 | "json-stable-stringify-without-jsonify": "^1.0.1", 425 | "levn": "^0.3.0", 426 | "lodash": "^4.17.4", 427 | "minimatch": "^3.0.2", 428 | "mkdirp": "^0.5.1", 429 | "natural-compare": "^1.4.0", 430 | "optionator": "^0.8.2", 431 | "path-is-inside": "^1.0.2", 432 | "pluralize": "^7.0.0", 433 | "progress": "^2.0.0", 434 | "regexpp": "^1.0.1", 435 | "require-uncached": "^1.0.3", 436 | "semver": "^5.3.0", 437 | "strip-ansi": "^4.0.0", 438 | "strip-json-comments": "~2.0.1", 439 | "table": "4.0.2", 440 | "text-table": "~0.2.0" 441 | } 442 | }, 443 | "eslint-config-airbnb-base": { 444 | "version": "12.1.0", 445 | "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-12.1.0.tgz", 446 | "integrity": "sha512-/vjm0Px5ZCpmJqnjIzcFb9TKZrKWz0gnuG/7Gfkt0Db1ELJR51xkZth+t14rYdqWgX836XbuxtArbIHlVhbLBA==", 447 | "dev": true, 448 | "requires": { 449 | "eslint-restricted-globals": "^0.1.1" 450 | } 451 | }, 452 | "eslint-import-resolver-node": { 453 | "version": "0.3.2", 454 | "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", 455 | "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", 456 | "dev": true, 457 | "requires": { 458 | "debug": "^2.6.9", 459 | "resolve": "^1.5.0" 460 | }, 461 | "dependencies": { 462 | "debug": { 463 | "version": "2.6.9", 464 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 465 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 466 | "dev": true, 467 | "requires": { 468 | "ms": "2.0.0" 469 | } 470 | } 471 | } 472 | }, 473 | "eslint-module-utils": { 474 | "version": "2.2.0", 475 | "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz", 476 | "integrity": "sha1-snA2LNiLGkitMIl2zn+lTphBF0Y=", 477 | "dev": true, 478 | "requires": { 479 | "debug": "^2.6.8", 480 | "pkg-dir": "^1.0.0" 481 | }, 482 | "dependencies": { 483 | "debug": { 484 | "version": "2.6.9", 485 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 486 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 487 | "dev": true, 488 | "requires": { 489 | "ms": "2.0.0" 490 | } 491 | } 492 | } 493 | }, 494 | "eslint-plugin-import": { 495 | "version": "2.12.0", 496 | "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.12.0.tgz", 497 | "integrity": "sha1-2tMXgSktZmSyUxf9BJ0uKy8CIF0=", 498 | "dev": true, 499 | "requires": { 500 | "contains-path": "^0.1.0", 501 | "debug": "^2.6.8", 502 | "doctrine": "1.5.0", 503 | "eslint-import-resolver-node": "^0.3.1", 504 | "eslint-module-utils": "^2.2.0", 505 | "has": "^1.0.1", 506 | "lodash": "^4.17.4", 507 | "minimatch": "^3.0.3", 508 | "read-pkg-up": "^2.0.0", 509 | "resolve": "^1.6.0" 510 | }, 511 | "dependencies": { 512 | "debug": { 513 | "version": "2.6.9", 514 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 515 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 516 | "dev": true, 517 | "requires": { 518 | "ms": "2.0.0" 519 | } 520 | }, 521 | "doctrine": { 522 | "version": "1.5.0", 523 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", 524 | "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", 525 | "dev": true, 526 | "requires": { 527 | "esutils": "^2.0.2", 528 | "isarray": "^1.0.0" 529 | } 530 | }, 531 | "isarray": { 532 | "version": "1.0.0", 533 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 534 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 535 | "dev": true 536 | } 537 | } 538 | }, 539 | "eslint-restricted-globals": { 540 | "version": "0.1.1", 541 | "resolved": "https://registry.npmjs.org/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz", 542 | "integrity": "sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc=", 543 | "dev": true 544 | }, 545 | "eslint-scope": { 546 | "version": "3.7.1", 547 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", 548 | "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", 549 | "dev": true, 550 | "requires": { 551 | "esrecurse": "^4.1.0", 552 | "estraverse": "^4.1.1" 553 | } 554 | }, 555 | "eslint-visitor-keys": { 556 | "version": "1.0.0", 557 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", 558 | "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", 559 | "dev": true 560 | }, 561 | "espree": { 562 | "version": "3.5.4", 563 | "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", 564 | "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", 565 | "dev": true, 566 | "requires": { 567 | "acorn": "^5.5.0", 568 | "acorn-jsx": "^3.0.0" 569 | } 570 | }, 571 | "esprima": { 572 | "version": "4.0.0", 573 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", 574 | "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", 575 | "dev": true 576 | }, 577 | "esquery": { 578 | "version": "1.0.1", 579 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", 580 | "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", 581 | "dev": true, 582 | "requires": { 583 | "estraverse": "^4.0.0" 584 | } 585 | }, 586 | "esrecurse": { 587 | "version": "4.2.1", 588 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", 589 | "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", 590 | "dev": true, 591 | "requires": { 592 | "estraverse": "^4.1.0" 593 | } 594 | }, 595 | "estraverse": { 596 | "version": "4.2.0", 597 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", 598 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", 599 | "dev": true 600 | }, 601 | "esutils": { 602 | "version": "2.0.2", 603 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 604 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 605 | "dev": true 606 | }, 607 | "external-editor": { 608 | "version": "2.2.0", 609 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", 610 | "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", 611 | "dev": true, 612 | "requires": { 613 | "chardet": "^0.4.0", 614 | "iconv-lite": "^0.4.17", 615 | "tmp": "^0.0.33" 616 | } 617 | }, 618 | "fast-deep-equal": { 619 | "version": "1.1.0", 620 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", 621 | "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", 622 | "dev": true 623 | }, 624 | "fast-json-stable-stringify": { 625 | "version": "2.0.0", 626 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 627 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", 628 | "dev": true 629 | }, 630 | "fast-levenshtein": { 631 | "version": "2.0.6", 632 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 633 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 634 | "dev": true 635 | }, 636 | "figures": { 637 | "version": "2.0.0", 638 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", 639 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", 640 | "dev": true, 641 | "requires": { 642 | "escape-string-regexp": "^1.0.5" 643 | } 644 | }, 645 | "file-entry-cache": { 646 | "version": "2.0.0", 647 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", 648 | "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", 649 | "dev": true, 650 | "requires": { 651 | "flat-cache": "^1.2.1", 652 | "object-assign": "^4.0.1" 653 | } 654 | }, 655 | "find-up": { 656 | "version": "1.1.2", 657 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", 658 | "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", 659 | "dev": true, 660 | "requires": { 661 | "path-exists": "^2.0.0", 662 | "pinkie-promise": "^2.0.0" 663 | } 664 | }, 665 | "flat-cache": { 666 | "version": "1.3.0", 667 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", 668 | "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", 669 | "dev": true, 670 | "requires": { 671 | "circular-json": "^0.3.1", 672 | "del": "^2.0.2", 673 | "graceful-fs": "^4.1.2", 674 | "write": "^0.2.1" 675 | } 676 | }, 677 | "fs.realpath": { 678 | "version": "1.0.0", 679 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 680 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 681 | "dev": true 682 | }, 683 | "function-bind": { 684 | "version": "1.1.1", 685 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 686 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 687 | "dev": true 688 | }, 689 | "functional-red-black-tree": { 690 | "version": "1.0.1", 691 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 692 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 693 | "dev": true 694 | }, 695 | "glob": { 696 | "version": "7.1.2", 697 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 698 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 699 | "dev": true, 700 | "requires": { 701 | "fs.realpath": "^1.0.0", 702 | "inflight": "^1.0.4", 703 | "inherits": "2", 704 | "minimatch": "^3.0.4", 705 | "once": "^1.3.0", 706 | "path-is-absolute": "^1.0.0" 707 | } 708 | }, 709 | "globals": { 710 | "version": "11.5.0", 711 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.5.0.tgz", 712 | "integrity": "sha512-hYyf+kI8dm3nORsiiXUQigOU62hDLfJ9G01uyGMxhc6BKsircrUhC4uJPQPUSuq2GrTmiiEt7ewxlMdBewfmKQ==", 713 | "dev": true 714 | }, 715 | "globby": { 716 | "version": "5.0.0", 717 | "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", 718 | "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", 719 | "dev": true, 720 | "requires": { 721 | "array-union": "^1.0.1", 722 | "arrify": "^1.0.0", 723 | "glob": "^7.0.3", 724 | "object-assign": "^4.0.1", 725 | "pify": "^2.0.0", 726 | "pinkie-promise": "^2.0.0" 727 | } 728 | }, 729 | "graceful-fs": { 730 | "version": "4.1.11", 731 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 732 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", 733 | "dev": true 734 | }, 735 | "has": { 736 | "version": "1.0.3", 737 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 738 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 739 | "dev": true, 740 | "requires": { 741 | "function-bind": "^1.1.1" 742 | } 743 | }, 744 | "has-ansi": { 745 | "version": "2.0.0", 746 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 747 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 748 | "dev": true, 749 | "requires": { 750 | "ansi-regex": "^2.0.0" 751 | } 752 | }, 753 | "has-flag": { 754 | "version": "3.0.0", 755 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 756 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 757 | "dev": true 758 | }, 759 | "hosted-git-info": { 760 | "version": "2.8.9", 761 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", 762 | "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", 763 | "dev": true 764 | }, 765 | "iconv-lite": { 766 | "version": "0.4.23", 767 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", 768 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", 769 | "dev": true, 770 | "requires": { 771 | "safer-buffer": ">= 2.1.2 < 3" 772 | } 773 | }, 774 | "ignore": { 775 | "version": "3.3.8", 776 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz", 777 | "integrity": "sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg==", 778 | "dev": true 779 | }, 780 | "imurmurhash": { 781 | "version": "0.1.4", 782 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 783 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 784 | "dev": true 785 | }, 786 | "inflight": { 787 | "version": "1.0.6", 788 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 789 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 790 | "dev": true, 791 | "requires": { 792 | "once": "^1.3.0", 793 | "wrappy": "1" 794 | } 795 | }, 796 | "inherits": { 797 | "version": "2.0.3", 798 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 799 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 800 | }, 801 | "inquirer": { 802 | "version": "3.3.0", 803 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", 804 | "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", 805 | "dev": true, 806 | "requires": { 807 | "ansi-escapes": "^3.0.0", 808 | "chalk": "^2.0.0", 809 | "cli-cursor": "^2.1.0", 810 | "cli-width": "^2.0.0", 811 | "external-editor": "^2.0.4", 812 | "figures": "^2.0.0", 813 | "lodash": "^4.3.0", 814 | "mute-stream": "0.0.7", 815 | "run-async": "^2.2.0", 816 | "rx-lite": "^4.0.8", 817 | "rx-lite-aggregates": "^4.0.8", 818 | "string-width": "^2.1.0", 819 | "strip-ansi": "^4.0.0", 820 | "through": "^2.3.6" 821 | } 822 | }, 823 | "is-arrayish": { 824 | "version": "0.2.1", 825 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 826 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 827 | "dev": true 828 | }, 829 | "is-builtin-module": { 830 | "version": "1.0.0", 831 | "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", 832 | "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", 833 | "dev": true, 834 | "requires": { 835 | "builtin-modules": "^1.0.0" 836 | } 837 | }, 838 | "is-fullwidth-code-point": { 839 | "version": "2.0.0", 840 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 841 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 842 | "dev": true 843 | }, 844 | "is-path-cwd": { 845 | "version": "1.0.0", 846 | "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", 847 | "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", 848 | "dev": true 849 | }, 850 | "is-path-in-cwd": { 851 | "version": "1.0.1", 852 | "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", 853 | "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", 854 | "dev": true, 855 | "requires": { 856 | "is-path-inside": "^1.0.0" 857 | } 858 | }, 859 | "is-path-inside": { 860 | "version": "1.0.1", 861 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", 862 | "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", 863 | "dev": true, 864 | "requires": { 865 | "path-is-inside": "^1.0.1" 866 | } 867 | }, 868 | "is-promise": { 869 | "version": "2.1.0", 870 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 871 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", 872 | "dev": true 873 | }, 874 | "is-resolvable": { 875 | "version": "1.1.0", 876 | "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", 877 | "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", 878 | "dev": true 879 | }, 880 | "isarray": { 881 | "version": "0.0.1", 882 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 883 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" 884 | }, 885 | "isexe": { 886 | "version": "2.0.0", 887 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 888 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 889 | "dev": true 890 | }, 891 | "js-tokens": { 892 | "version": "3.0.2", 893 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", 894 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", 895 | "dev": true 896 | }, 897 | "js-yaml": { 898 | "version": "3.13.1", 899 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 900 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 901 | "dev": true, 902 | "requires": { 903 | "argparse": "^1.0.7", 904 | "esprima": "^4.0.0" 905 | } 906 | }, 907 | "json-schema-traverse": { 908 | "version": "0.3.1", 909 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", 910 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", 911 | "dev": true 912 | }, 913 | "json-stable-stringify-without-jsonify": { 914 | "version": "1.0.1", 915 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 916 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 917 | "dev": true 918 | }, 919 | "levn": { 920 | "version": "0.3.0", 921 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 922 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 923 | "dev": true, 924 | "requires": { 925 | "prelude-ls": "~1.1.2", 926 | "type-check": "~0.3.2" 927 | } 928 | }, 929 | "load-json-file": { 930 | "version": "2.0.0", 931 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", 932 | "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", 933 | "dev": true, 934 | "requires": { 935 | "graceful-fs": "^4.1.2", 936 | "parse-json": "^2.2.0", 937 | "pify": "^2.0.0", 938 | "strip-bom": "^3.0.0" 939 | } 940 | }, 941 | "locate-path": { 942 | "version": "2.0.0", 943 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", 944 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", 945 | "dev": true, 946 | "requires": { 947 | "p-locate": "^2.0.0", 948 | "path-exists": "^3.0.0" 949 | }, 950 | "dependencies": { 951 | "path-exists": { 952 | "version": "3.0.0", 953 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 954 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 955 | "dev": true 956 | } 957 | } 958 | }, 959 | "lodash": { 960 | "version": "4.17.21", 961 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 962 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 963 | "dev": true 964 | }, 965 | "lru-cache": { 966 | "version": "4.1.3", 967 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", 968 | "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", 969 | "dev": true, 970 | "requires": { 971 | "pseudomap": "^1.0.2", 972 | "yallist": "^2.1.2" 973 | } 974 | }, 975 | "mimic-fn": { 976 | "version": "1.2.0", 977 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", 978 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", 979 | "dev": true 980 | }, 981 | "minimatch": { 982 | "version": "3.0.4", 983 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 984 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 985 | "dev": true, 986 | "requires": { 987 | "brace-expansion": "^1.1.7" 988 | } 989 | }, 990 | "mkdirp": { 991 | "version": "0.5.6", 992 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", 993 | "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", 994 | "dev": true, 995 | "requires": { 996 | "minimist": "^1.2.6" 997 | }, 998 | "dependencies": { 999 | "minimist": { 1000 | "version": "1.2.8", 1001 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 1002 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 1003 | "dev": true 1004 | } 1005 | } 1006 | }, 1007 | "ms": { 1008 | "version": "2.0.0", 1009 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1010 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 1011 | "dev": true 1012 | }, 1013 | "mute-stream": { 1014 | "version": "0.0.7", 1015 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", 1016 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", 1017 | "dev": true 1018 | }, 1019 | "natural-compare": { 1020 | "version": "1.4.0", 1021 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1022 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 1023 | "dev": true 1024 | }, 1025 | "normalize-package-data": { 1026 | "version": "2.4.0", 1027 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", 1028 | "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", 1029 | "dev": true, 1030 | "requires": { 1031 | "hosted-git-info": "^2.1.4", 1032 | "is-builtin-module": "^1.0.0", 1033 | "semver": "2 || 3 || 4 || 5", 1034 | "validate-npm-package-license": "^3.0.1" 1035 | } 1036 | }, 1037 | "object-assign": { 1038 | "version": "4.1.1", 1039 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1040 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 1041 | "dev": true 1042 | }, 1043 | "once": { 1044 | "version": "1.4.0", 1045 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1046 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1047 | "dev": true, 1048 | "requires": { 1049 | "wrappy": "1" 1050 | } 1051 | }, 1052 | "onetime": { 1053 | "version": "2.0.1", 1054 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 1055 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 1056 | "dev": true, 1057 | "requires": { 1058 | "mimic-fn": "^1.0.0" 1059 | } 1060 | }, 1061 | "optionator": { 1062 | "version": "0.8.2", 1063 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", 1064 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 1065 | "dev": true, 1066 | "requires": { 1067 | "deep-is": "~0.1.3", 1068 | "fast-levenshtein": "~2.0.4", 1069 | "levn": "~0.3.0", 1070 | "prelude-ls": "~1.1.2", 1071 | "type-check": "~0.3.2", 1072 | "wordwrap": "~1.0.0" 1073 | } 1074 | }, 1075 | "os-tmpdir": { 1076 | "version": "1.0.2", 1077 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1078 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 1079 | "dev": true 1080 | }, 1081 | "p-limit": { 1082 | "version": "1.3.0", 1083 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", 1084 | "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", 1085 | "dev": true, 1086 | "requires": { 1087 | "p-try": "^1.0.0" 1088 | } 1089 | }, 1090 | "p-locate": { 1091 | "version": "2.0.0", 1092 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", 1093 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", 1094 | "dev": true, 1095 | "requires": { 1096 | "p-limit": "^1.1.0" 1097 | } 1098 | }, 1099 | "p-try": { 1100 | "version": "1.0.0", 1101 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", 1102 | "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", 1103 | "dev": true 1104 | }, 1105 | "parse-json": { 1106 | "version": "2.2.0", 1107 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", 1108 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", 1109 | "dev": true, 1110 | "requires": { 1111 | "error-ex": "^1.2.0" 1112 | } 1113 | }, 1114 | "path-exists": { 1115 | "version": "2.1.0", 1116 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", 1117 | "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", 1118 | "dev": true, 1119 | "requires": { 1120 | "pinkie-promise": "^2.0.0" 1121 | } 1122 | }, 1123 | "path-is-absolute": { 1124 | "version": "1.0.1", 1125 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1126 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1127 | "dev": true 1128 | }, 1129 | "path-is-inside": { 1130 | "version": "1.0.2", 1131 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 1132 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", 1133 | "dev": true 1134 | }, 1135 | "path-parse": { 1136 | "version": "1.0.7", 1137 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1138 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1139 | "dev": true 1140 | }, 1141 | "path-type": { 1142 | "version": "2.0.0", 1143 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", 1144 | "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", 1145 | "dev": true, 1146 | "requires": { 1147 | "pify": "^2.0.0" 1148 | } 1149 | }, 1150 | "pify": { 1151 | "version": "2.3.0", 1152 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1153 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 1154 | "dev": true 1155 | }, 1156 | "pinkie": { 1157 | "version": "2.0.4", 1158 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 1159 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", 1160 | "dev": true 1161 | }, 1162 | "pinkie-promise": { 1163 | "version": "2.0.1", 1164 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 1165 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 1166 | "dev": true, 1167 | "requires": { 1168 | "pinkie": "^2.0.0" 1169 | } 1170 | }, 1171 | "pkg-dir": { 1172 | "version": "1.0.0", 1173 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", 1174 | "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", 1175 | "dev": true, 1176 | "requires": { 1177 | "find-up": "^1.0.0" 1178 | } 1179 | }, 1180 | "pluralize": { 1181 | "version": "7.0.0", 1182 | "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", 1183 | "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", 1184 | "dev": true 1185 | }, 1186 | "prelude-ls": { 1187 | "version": "1.1.2", 1188 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 1189 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 1190 | "dev": true 1191 | }, 1192 | "process-nextick-args": { 1193 | "version": "2.0.0", 1194 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 1195 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", 1196 | "dev": true 1197 | }, 1198 | "progress": { 1199 | "version": "2.0.0", 1200 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", 1201 | "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", 1202 | "dev": true 1203 | }, 1204 | "pseudomap": { 1205 | "version": "1.0.2", 1206 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 1207 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", 1208 | "dev": true 1209 | }, 1210 | "read-pkg": { 1211 | "version": "2.0.0", 1212 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", 1213 | "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", 1214 | "dev": true, 1215 | "requires": { 1216 | "load-json-file": "^2.0.0", 1217 | "normalize-package-data": "^2.3.2", 1218 | "path-type": "^2.0.0" 1219 | } 1220 | }, 1221 | "read-pkg-up": { 1222 | "version": "2.0.0", 1223 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", 1224 | "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", 1225 | "dev": true, 1226 | "requires": { 1227 | "find-up": "^2.0.0", 1228 | "read-pkg": "^2.0.0" 1229 | }, 1230 | "dependencies": { 1231 | "find-up": { 1232 | "version": "2.1.0", 1233 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", 1234 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", 1235 | "dev": true, 1236 | "requires": { 1237 | "locate-path": "^2.0.0" 1238 | } 1239 | } 1240 | } 1241 | }, 1242 | "readable-stream": { 1243 | "version": "1.1.14", 1244 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", 1245 | "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", 1246 | "requires": { 1247 | "core-util-is": "~1.0.0", 1248 | "inherits": "~2.0.1", 1249 | "isarray": "0.0.1", 1250 | "string_decoder": "~0.10.x" 1251 | } 1252 | }, 1253 | "regexpp": { 1254 | "version": "1.1.0", 1255 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", 1256 | "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", 1257 | "dev": true 1258 | }, 1259 | "require-uncached": { 1260 | "version": "1.0.3", 1261 | "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", 1262 | "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", 1263 | "dev": true, 1264 | "requires": { 1265 | "caller-path": "^0.1.0", 1266 | "resolve-from": "^1.0.0" 1267 | } 1268 | }, 1269 | "resolve": { 1270 | "version": "1.7.1", 1271 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", 1272 | "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", 1273 | "dev": true, 1274 | "requires": { 1275 | "path-parse": "^1.0.5" 1276 | } 1277 | }, 1278 | "resolve-from": { 1279 | "version": "1.0.1", 1280 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", 1281 | "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", 1282 | "dev": true 1283 | }, 1284 | "restore-cursor": { 1285 | "version": "2.0.0", 1286 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 1287 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 1288 | "dev": true, 1289 | "requires": { 1290 | "onetime": "^2.0.0", 1291 | "signal-exit": "^3.0.2" 1292 | } 1293 | }, 1294 | "rimraf": { 1295 | "version": "2.6.2", 1296 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", 1297 | "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", 1298 | "dev": true, 1299 | "requires": { 1300 | "glob": "^7.0.5" 1301 | } 1302 | }, 1303 | "run-async": { 1304 | "version": "2.3.0", 1305 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", 1306 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", 1307 | "dev": true, 1308 | "requires": { 1309 | "is-promise": "^2.1.0" 1310 | } 1311 | }, 1312 | "rx-lite": { 1313 | "version": "4.0.8", 1314 | "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", 1315 | "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", 1316 | "dev": true 1317 | }, 1318 | "rx-lite-aggregates": { 1319 | "version": "4.0.8", 1320 | "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", 1321 | "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", 1322 | "dev": true, 1323 | "requires": { 1324 | "rx-lite": "*" 1325 | } 1326 | }, 1327 | "safe-buffer": { 1328 | "version": "5.1.2", 1329 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1330 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 1331 | "dev": true 1332 | }, 1333 | "safer-buffer": { 1334 | "version": "2.1.2", 1335 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1336 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1337 | "dev": true 1338 | }, 1339 | "semver": { 1340 | "version": "5.5.0", 1341 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", 1342 | "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", 1343 | "dev": true 1344 | }, 1345 | "shebang-command": { 1346 | "version": "1.2.0", 1347 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 1348 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 1349 | "dev": true, 1350 | "requires": { 1351 | "shebang-regex": "^1.0.0" 1352 | } 1353 | }, 1354 | "shebang-regex": { 1355 | "version": "1.0.0", 1356 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 1357 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 1358 | "dev": true 1359 | }, 1360 | "signal-exit": { 1361 | "version": "3.0.2", 1362 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 1363 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 1364 | "dev": true 1365 | }, 1366 | "slice-ansi": { 1367 | "version": "1.0.0", 1368 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", 1369 | "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", 1370 | "dev": true, 1371 | "requires": { 1372 | "is-fullwidth-code-point": "^2.0.0" 1373 | } 1374 | }, 1375 | "spdx-correct": { 1376 | "version": "3.0.0", 1377 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", 1378 | "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", 1379 | "dev": true, 1380 | "requires": { 1381 | "spdx-expression-parse": "^3.0.0", 1382 | "spdx-license-ids": "^3.0.0" 1383 | } 1384 | }, 1385 | "spdx-exceptions": { 1386 | "version": "2.1.0", 1387 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", 1388 | "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", 1389 | "dev": true 1390 | }, 1391 | "spdx-expression-parse": { 1392 | "version": "3.0.0", 1393 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", 1394 | "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", 1395 | "dev": true, 1396 | "requires": { 1397 | "spdx-exceptions": "^2.1.0", 1398 | "spdx-license-ids": "^3.0.0" 1399 | } 1400 | }, 1401 | "spdx-license-ids": { 1402 | "version": "3.0.0", 1403 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", 1404 | "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", 1405 | "dev": true 1406 | }, 1407 | "sprintf-js": { 1408 | "version": "1.0.3", 1409 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1410 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1411 | "dev": true 1412 | }, 1413 | "streamsearch": { 1414 | "version": "0.1.2", 1415 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", 1416 | "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" 1417 | }, 1418 | "string-width": { 1419 | "version": "2.1.1", 1420 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 1421 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 1422 | "dev": true, 1423 | "requires": { 1424 | "is-fullwidth-code-point": "^2.0.0", 1425 | "strip-ansi": "^4.0.0" 1426 | } 1427 | }, 1428 | "string_decoder": { 1429 | "version": "0.10.31", 1430 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 1431 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" 1432 | }, 1433 | "strip-ansi": { 1434 | "version": "4.0.0", 1435 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1436 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1437 | "dev": true, 1438 | "requires": { 1439 | "ansi-regex": "^3.0.0" 1440 | }, 1441 | "dependencies": { 1442 | "ansi-regex": { 1443 | "version": "3.0.0", 1444 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 1445 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 1446 | "dev": true 1447 | } 1448 | } 1449 | }, 1450 | "strip-bom": { 1451 | "version": "3.0.0", 1452 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 1453 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", 1454 | "dev": true 1455 | }, 1456 | "strip-json-comments": { 1457 | "version": "2.0.1", 1458 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1459 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 1460 | "dev": true 1461 | }, 1462 | "supports-color": { 1463 | "version": "2.0.0", 1464 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 1465 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 1466 | "dev": true 1467 | }, 1468 | "table": { 1469 | "version": "4.0.2", 1470 | "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", 1471 | "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", 1472 | "dev": true, 1473 | "requires": { 1474 | "ajv": "^5.2.3", 1475 | "ajv-keywords": "^2.1.0", 1476 | "chalk": "^2.1.0", 1477 | "lodash": "^4.17.4", 1478 | "slice-ansi": "1.0.0", 1479 | "string-width": "^2.1.1" 1480 | } 1481 | }, 1482 | "text-table": { 1483 | "version": "0.2.0", 1484 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1485 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 1486 | "dev": true 1487 | }, 1488 | "through": { 1489 | "version": "2.3.8", 1490 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1491 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1492 | "dev": true 1493 | }, 1494 | "tmp": { 1495 | "version": "0.0.33", 1496 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 1497 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 1498 | "dev": true, 1499 | "requires": { 1500 | "os-tmpdir": "~1.0.2" 1501 | } 1502 | }, 1503 | "type-check": { 1504 | "version": "0.3.2", 1505 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 1506 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 1507 | "dev": true, 1508 | "requires": { 1509 | "prelude-ls": "~1.1.2" 1510 | } 1511 | }, 1512 | "typedarray": { 1513 | "version": "0.0.6", 1514 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 1515 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", 1516 | "dev": true 1517 | }, 1518 | "util-deprecate": { 1519 | "version": "1.0.2", 1520 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1521 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 1522 | "dev": true 1523 | }, 1524 | "validate-npm-package-license": { 1525 | "version": "3.0.3", 1526 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", 1527 | "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", 1528 | "dev": true, 1529 | "requires": { 1530 | "spdx-correct": "^3.0.0", 1531 | "spdx-expression-parse": "^3.0.0" 1532 | } 1533 | }, 1534 | "which": { 1535 | "version": "1.3.1", 1536 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1537 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1538 | "dev": true, 1539 | "requires": { 1540 | "isexe": "^2.0.0" 1541 | } 1542 | }, 1543 | "wordwrap": { 1544 | "version": "1.0.0", 1545 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 1546 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", 1547 | "dev": true 1548 | }, 1549 | "wrappy": { 1550 | "version": "1.0.2", 1551 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1552 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1553 | "dev": true 1554 | }, 1555 | "write": { 1556 | "version": "0.2.1", 1557 | "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", 1558 | "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", 1559 | "dev": true, 1560 | "requires": { 1561 | "mkdirp": "^0.5.1" 1562 | } 1563 | }, 1564 | "yallist": { 1565 | "version": "2.1.2", 1566 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 1567 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", 1568 | "dev": true 1569 | } 1570 | } 1571 | } 1572 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "huge-uploader-nodejs", 3 | "version": "1.2.1", 4 | "description": "Node module to handle chunked file upload and reassemble them when into a single file", 5 | "main": "index.js", 6 | "repository": { 7 | "type": "git", 8 | "url": "https://github.com/Buzut/huge-uploader-nodejs.git" 9 | }, 10 | "keywords": [ 11 | "upload", 12 | "file upload", 13 | "huge file upload", 14 | "big file upload", 15 | "resumable upload", 16 | "pausable upload", 17 | "chunked upload", 18 | "nodejs", 19 | "busboy" 20 | ], 21 | "author": "Buzut (buzut.net)", 22 | "license": "BSD-3-Clause", 23 | "bugs": { 24 | "url": "https://github.com/Buzut/huge-uploader-nodejs/issues" 25 | }, 26 | "scripts": { 27 | "prepare": "test -d .git && cd .git/hooks/ && curl -O https://raw.githubusercontent.com/Buzut/git-emojis-hook/master/commit-msg && curl -O https://raw.githubusercontent.com/Buzut/git-emojis-hook/master/prepare-commit-msg && chmod +x * || exit 0" 28 | }, 29 | "dependencies": { 30 | "busboy": "^0.2.14" 31 | }, 32 | "devDependencies": { 33 | "eslint": "^4.19.1", 34 | "eslint-config-airbnb-base": "^12.1.0", 35 | "eslint-plugin-import": "^2.12.0" 36 | } 37 | } 38 | --------------------------------------------------------------------------------