├── .editorconfig ├── .gitignore ├── .nvmrc ├── .vscode └── launch.json ├── README.md ├── app.js ├── package-lock.json ├── package.json ├── src ├── middleware │ ├── tiny-koa-body.js │ ├── tiny-koa-cookie.js │ ├── tiny-koa-cors.js │ ├── tiny-koa-router.js │ ├── tiny-koa-static.js │ └── tiny-koa-views.js └── tiny-koa.js ├── static ├── index.html ├── script.js └── style.css ├── test └── browser-xhr.js └── views └── tiny.dot /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig is awesome: http://EditorConfig.org 2 | 3 | # top-most EditorConfig file 4 | root = true 5 | 6 | # Unix-style newlines with a newline ending every file 7 | [*] 8 | end_of_line = lf 9 | insert_final_newline = true 10 | 11 | # Matches multiple files with brace expansion notation 12 | # Set default charset 13 | [*.js] 14 | charset = utf-8 15 | indent_style = space 16 | indent_size = 2 17 | 18 | [{package.json,.travis.yml}] 19 | indent_style = space 20 | indent_size = 2 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | source-koa 3 | node.sh 4 | node_modules 5 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | 8.9.1 2 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // 使用 IntelliSense 了解相关属性。 3 | // 悬停以查看现有属性的描述。 4 | // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "type": "node", 9 | "request": "launch", 10 | "name": "Launch Program", 11 | "program": "${workspaceFolder}/app.js", 12 | "runtimeExecutable": "${env:HOME}/.nvm/versions/node/v8.9.1/bin/node" 13 | } 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Tiny Koa 2 | 3 | Koa is already very mini framework for HTTP, but somes read the source code still hard, I wrote a lite version for Koa. 4 | With some middlewares. 5 | 6 | Help you learn Koa. 7 | 💪 8 | 9 | ## Run 10 | 11 | Use Node.js 8.9.1+ 12 | 13 | ``` 14 | $ npm install 15 | $ npm run dev 16 | ``` 17 | 18 | open `http://localhost:8600/index.html` 19 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | const TinyKoa = require('./src/tiny-koa.js'); 2 | const app = new TinyKoa(); 3 | const port = 8600; 4 | 5 | const Router = require('./src/middleware/tiny-koa-router.js'); 6 | const router = new Router(); 7 | 8 | const cors = require('./src/middleware/tiny-koa-cors.js'); 9 | const bodyparser = require('./src/middleware/tiny-koa-body.js'); 10 | const server = require('./src/middleware/tiny-koa-static.js'); 11 | const koaCookies = require('./src/middleware/tiny-koa-cookie.js'); 12 | const views = require('./src/middleware/tiny-koa-views.js'); 13 | let render = views({ 14 | root: __dirname + '/views' 15 | }); 16 | 17 | app.use(cors()); 18 | app.use(koaCookies()); 19 | app.use(bodyparser()); 20 | 21 | app.use(async function ck (ctx, next) { 22 | console.log('set cookie', ctx.path); 23 | ctx.cookies.set('path', decodeURIComponent(ctx.path)); 24 | await next (); 25 | }); 26 | 27 | // curl http://localhost:8600/api/foo/123 28 | router.all('/api/foo/:id', (ctx, next) => { 29 | // console.log('/api/foo/:id'); 30 | ctx.body = { 31 | param: { 32 | id: ctx.params.id 33 | }, 34 | route: '/api/foo/:id' 35 | }; 36 | // return next(); // if match not to next 37 | }); 38 | 39 | // curl http://localhost:8600/api/ccc 40 | router.all('/api/bar', (ctx, next) => { 41 | // console.log('/api/bar'); 42 | ctx.body = { 43 | route: '/api/bar' 44 | }; 45 | // return next(); // if match not to next 46 | }); 47 | 48 | // doT测试 49 | router.all('/page/tpl', async (ctx, next) => { 50 | ctx.body = await render('tiny', {title: 'tiny dot template', body: 'powered by doT'}); 51 | }); 52 | 53 | let routeMiddleware = router.routes(); 54 | app.use(routeMiddleware); 55 | 56 | app.use(async (ctx, next) => { 57 | console.log('body test', ctx.req.body); 58 | if (ctx.path === '/api/fetch') { 59 | ctx.body = ctx.req.body; 60 | } else { 61 | return next(); 62 | } 63 | }); 64 | 65 | app.use(server(__dirname + '/static')); 66 | 67 | app.listen(port, () => { 68 | console.log(`listening ${port}`); 69 | }); 70 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tiny-koa", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "abbrev": { 8 | "version": "1.1.1", 9 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 10 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 11 | "dev": true 12 | }, 13 | "ansi-align": { 14 | "version": "2.0.0", 15 | "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", 16 | "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", 17 | "dev": true, 18 | "requires": { 19 | "string-width": "2.1.1" 20 | } 21 | }, 22 | "ansi-regex": { 23 | "version": "3.0.0", 24 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 25 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 26 | "dev": true 27 | }, 28 | "ansi-styles": { 29 | "version": "3.2.0", 30 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", 31 | "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", 32 | "dev": true, 33 | "requires": { 34 | "color-convert": "1.9.1" 35 | } 36 | }, 37 | "anymatch": { 38 | "version": "1.3.2", 39 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", 40 | "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", 41 | "dev": true, 42 | "requires": { 43 | "micromatch": "2.3.11", 44 | "normalize-path": "2.1.1" 45 | } 46 | }, 47 | "arr-diff": { 48 | "version": "2.0.0", 49 | "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", 50 | "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", 51 | "dev": true, 52 | "requires": { 53 | "arr-flatten": "1.1.0" 54 | } 55 | }, 56 | "arr-flatten": { 57 | "version": "1.1.0", 58 | "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", 59 | "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", 60 | "dev": true 61 | }, 62 | "array-unique": { 63 | "version": "0.2.1", 64 | "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", 65 | "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", 66 | "dev": true 67 | }, 68 | "async-each": { 69 | "version": "1.0.1", 70 | "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", 71 | "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", 72 | "dev": true 73 | }, 74 | "balanced-match": { 75 | "version": "1.0.0", 76 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 77 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 78 | "dev": true 79 | }, 80 | "binary-extensions": { 81 | "version": "1.11.0", 82 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", 83 | "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", 84 | "dev": true 85 | }, 86 | "boxen": { 87 | "version": "1.2.2", 88 | "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.2.2.tgz", 89 | "integrity": "sha1-Px1AMsMP/qnUsCwyLq8up0HcvOU=", 90 | "dev": true, 91 | "requires": { 92 | "ansi-align": "2.0.0", 93 | "camelcase": "4.1.0", 94 | "chalk": "2.3.0", 95 | "cli-boxes": "1.0.0", 96 | "string-width": "2.1.1", 97 | "term-size": "1.2.0", 98 | "widest-line": "1.0.0" 99 | } 100 | }, 101 | "brace-expansion": { 102 | "version": "1.1.8", 103 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", 104 | "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", 105 | "dev": true, 106 | "requires": { 107 | "balanced-match": "1.0.0", 108 | "concat-map": "0.0.1" 109 | } 110 | }, 111 | "braces": { 112 | "version": "1.8.5", 113 | "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", 114 | "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", 115 | "dev": true, 116 | "requires": { 117 | "expand-range": "1.8.2", 118 | "preserve": "0.2.0", 119 | "repeat-element": "1.1.2" 120 | } 121 | }, 122 | "camelcase": { 123 | "version": "4.1.0", 124 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", 125 | "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", 126 | "dev": true 127 | }, 128 | "capture-stack-trace": { 129 | "version": "1.0.0", 130 | "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", 131 | "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", 132 | "dev": true 133 | }, 134 | "chalk": { 135 | "version": "2.3.0", 136 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", 137 | "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", 138 | "dev": true, 139 | "requires": { 140 | "ansi-styles": "3.2.0", 141 | "escape-string-regexp": "1.0.5", 142 | "supports-color": "4.5.0" 143 | } 144 | }, 145 | "chokidar": { 146 | "version": "1.7.0", 147 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", 148 | "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", 149 | "dev": true, 150 | "requires": { 151 | "anymatch": "1.3.2", 152 | "async-each": "1.0.1", 153 | "fsevents": "1.1.3", 154 | "glob-parent": "2.0.0", 155 | "inherits": "2.0.3", 156 | "is-binary-path": "1.0.1", 157 | "is-glob": "2.0.1", 158 | "path-is-absolute": "1.0.1", 159 | "readdirp": "2.1.0" 160 | } 161 | }, 162 | "cli-boxes": { 163 | "version": "1.0.0", 164 | "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", 165 | "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", 166 | "dev": true 167 | }, 168 | "code-point-at": { 169 | "version": "1.1.0", 170 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 171 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", 172 | "dev": true 173 | }, 174 | "color-convert": { 175 | "version": "1.9.1", 176 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", 177 | "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", 178 | "dev": true, 179 | "requires": { 180 | "color-name": "1.1.3" 181 | } 182 | }, 183 | "color-name": { 184 | "version": "1.1.3", 185 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 186 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 187 | "dev": true 188 | }, 189 | "concat-map": { 190 | "version": "0.0.1", 191 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 192 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 193 | "dev": true 194 | }, 195 | "configstore": { 196 | "version": "3.1.1", 197 | "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz", 198 | "integrity": "sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==", 199 | "dev": true, 200 | "requires": { 201 | "dot-prop": "4.2.0", 202 | "graceful-fs": "4.1.11", 203 | "make-dir": "1.1.0", 204 | "unique-string": "1.0.0", 205 | "write-file-atomic": "2.3.0", 206 | "xdg-basedir": "3.0.0" 207 | } 208 | }, 209 | "core-util-is": { 210 | "version": "1.0.2", 211 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 212 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 213 | "dev": true 214 | }, 215 | "create-error-class": { 216 | "version": "3.0.2", 217 | "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", 218 | "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", 219 | "dev": true, 220 | "requires": { 221 | "capture-stack-trace": "1.0.0" 222 | } 223 | }, 224 | "cross-spawn": { 225 | "version": "5.1.0", 226 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", 227 | "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", 228 | "dev": true, 229 | "requires": { 230 | "lru-cache": "4.1.1", 231 | "shebang-command": "1.2.0", 232 | "which": "1.3.0" 233 | } 234 | }, 235 | "crypto-random-string": { 236 | "version": "1.0.0", 237 | "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", 238 | "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", 239 | "dev": true 240 | }, 241 | "debug": { 242 | "version": "2.6.9", 243 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 244 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 245 | "dev": true, 246 | "requires": { 247 | "ms": "2.0.0" 248 | } 249 | }, 250 | "deep-extend": { 251 | "version": "0.4.2", 252 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", 253 | "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", 254 | "dev": true 255 | }, 256 | "dot-prop": { 257 | "version": "4.2.0", 258 | "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", 259 | "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", 260 | "dev": true, 261 | "requires": { 262 | "is-obj": "1.0.1" 263 | } 264 | }, 265 | "duplexer": { 266 | "version": "0.1.1", 267 | "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", 268 | "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", 269 | "dev": true 270 | }, 271 | "duplexer3": { 272 | "version": "0.1.4", 273 | "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", 274 | "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", 275 | "dev": true 276 | }, 277 | "es6-promise": { 278 | "version": "3.3.1", 279 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", 280 | "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=", 281 | "dev": true 282 | }, 283 | "escape-string-regexp": { 284 | "version": "1.0.5", 285 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 286 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 287 | "dev": true 288 | }, 289 | "event-stream": { 290 | "version": "3.3.4", 291 | "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", 292 | "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", 293 | "dev": true, 294 | "requires": { 295 | "duplexer": "0.1.1", 296 | "from": "0.1.7", 297 | "map-stream": "0.1.0", 298 | "pause-stream": "0.0.11", 299 | "split": "0.3.3", 300 | "stream-combiner": "0.0.4", 301 | "through": "2.3.8" 302 | } 303 | }, 304 | "execa": { 305 | "version": "0.7.0", 306 | "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", 307 | "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", 308 | "dev": true, 309 | "requires": { 310 | "cross-spawn": "5.1.0", 311 | "get-stream": "3.0.0", 312 | "is-stream": "1.1.0", 313 | "npm-run-path": "2.0.2", 314 | "p-finally": "1.0.0", 315 | "signal-exit": "3.0.2", 316 | "strip-eof": "1.0.0" 317 | } 318 | }, 319 | "expand-brackets": { 320 | "version": "0.1.5", 321 | "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", 322 | "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", 323 | "dev": true, 324 | "requires": { 325 | "is-posix-bracket": "0.1.1" 326 | } 327 | }, 328 | "expand-range": { 329 | "version": "1.8.2", 330 | "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", 331 | "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", 332 | "dev": true, 333 | "requires": { 334 | "fill-range": "2.2.3" 335 | } 336 | }, 337 | "extglob": { 338 | "version": "0.3.2", 339 | "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", 340 | "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", 341 | "dev": true, 342 | "requires": { 343 | "is-extglob": "1.0.0" 344 | } 345 | }, 346 | "filename-regex": { 347 | "version": "2.0.1", 348 | "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", 349 | "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", 350 | "dev": true 351 | }, 352 | "fill-range": { 353 | "version": "2.2.3", 354 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", 355 | "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", 356 | "dev": true, 357 | "requires": { 358 | "is-number": "2.1.0", 359 | "isobject": "2.1.0", 360 | "randomatic": "1.1.7", 361 | "repeat-element": "1.1.2", 362 | "repeat-string": "1.6.1" 363 | } 364 | }, 365 | "for-in": { 366 | "version": "1.0.2", 367 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", 368 | "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", 369 | "dev": true 370 | }, 371 | "for-own": { 372 | "version": "0.1.5", 373 | "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", 374 | "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", 375 | "dev": true, 376 | "requires": { 377 | "for-in": "1.0.2" 378 | } 379 | }, 380 | "from": { 381 | "version": "0.1.7", 382 | "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", 383 | "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", 384 | "dev": true 385 | }, 386 | "fsevents": { 387 | "version": "1.1.3", 388 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", 389 | "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", 390 | "dev": true, 391 | "optional": true, 392 | "requires": { 393 | "nan": "2.8.0", 394 | "node-pre-gyp": "0.6.39" 395 | }, 396 | "dependencies": { 397 | "abbrev": { 398 | "version": "1.1.0", 399 | "bundled": true, 400 | "dev": true, 401 | "optional": true 402 | }, 403 | "ajv": { 404 | "version": "4.11.8", 405 | "bundled": true, 406 | "dev": true, 407 | "optional": true, 408 | "requires": { 409 | "co": "4.6.0", 410 | "json-stable-stringify": "1.0.1" 411 | } 412 | }, 413 | "ansi-regex": { 414 | "version": "2.1.1", 415 | "bundled": true, 416 | "dev": true 417 | }, 418 | "aproba": { 419 | "version": "1.1.1", 420 | "bundled": true, 421 | "dev": true, 422 | "optional": true 423 | }, 424 | "are-we-there-yet": { 425 | "version": "1.1.4", 426 | "bundled": true, 427 | "dev": true, 428 | "optional": true, 429 | "requires": { 430 | "delegates": "1.0.0", 431 | "readable-stream": "2.2.9" 432 | } 433 | }, 434 | "asn1": { 435 | "version": "0.2.3", 436 | "bundled": true, 437 | "dev": true, 438 | "optional": true 439 | }, 440 | "assert-plus": { 441 | "version": "0.2.0", 442 | "bundled": true, 443 | "dev": true, 444 | "optional": true 445 | }, 446 | "asynckit": { 447 | "version": "0.4.0", 448 | "bundled": true, 449 | "dev": true, 450 | "optional": true 451 | }, 452 | "aws-sign2": { 453 | "version": "0.6.0", 454 | "bundled": true, 455 | "dev": true, 456 | "optional": true 457 | }, 458 | "aws4": { 459 | "version": "1.6.0", 460 | "bundled": true, 461 | "dev": true, 462 | "optional": true 463 | }, 464 | "balanced-match": { 465 | "version": "0.4.2", 466 | "bundled": true, 467 | "dev": true 468 | }, 469 | "bcrypt-pbkdf": { 470 | "version": "1.0.1", 471 | "bundled": true, 472 | "dev": true, 473 | "optional": true, 474 | "requires": { 475 | "tweetnacl": "0.14.5" 476 | } 477 | }, 478 | "block-stream": { 479 | "version": "0.0.9", 480 | "bundled": true, 481 | "dev": true, 482 | "requires": { 483 | "inherits": "2.0.3" 484 | } 485 | }, 486 | "boom": { 487 | "version": "2.10.1", 488 | "bundled": true, 489 | "dev": true, 490 | "requires": { 491 | "hoek": "2.16.3" 492 | } 493 | }, 494 | "brace-expansion": { 495 | "version": "1.1.7", 496 | "bundled": true, 497 | "dev": true, 498 | "requires": { 499 | "balanced-match": "0.4.2", 500 | "concat-map": "0.0.1" 501 | } 502 | }, 503 | "buffer-shims": { 504 | "version": "1.0.0", 505 | "bundled": true, 506 | "dev": true 507 | }, 508 | "caseless": { 509 | "version": "0.12.0", 510 | "bundled": true, 511 | "dev": true, 512 | "optional": true 513 | }, 514 | "co": { 515 | "version": "4.6.0", 516 | "bundled": true, 517 | "dev": true, 518 | "optional": true 519 | }, 520 | "code-point-at": { 521 | "version": "1.1.0", 522 | "bundled": true, 523 | "dev": true 524 | }, 525 | "combined-stream": { 526 | "version": "1.0.5", 527 | "bundled": true, 528 | "dev": true, 529 | "requires": { 530 | "delayed-stream": "1.0.0" 531 | } 532 | }, 533 | "concat-map": { 534 | "version": "0.0.1", 535 | "bundled": true, 536 | "dev": true 537 | }, 538 | "console-control-strings": { 539 | "version": "1.1.0", 540 | "bundled": true, 541 | "dev": true 542 | }, 543 | "core-util-is": { 544 | "version": "1.0.2", 545 | "bundled": true, 546 | "dev": true 547 | }, 548 | "cryptiles": { 549 | "version": "2.0.5", 550 | "bundled": true, 551 | "dev": true, 552 | "requires": { 553 | "boom": "2.10.1" 554 | } 555 | }, 556 | "dashdash": { 557 | "version": "1.14.1", 558 | "bundled": true, 559 | "dev": true, 560 | "optional": true, 561 | "requires": { 562 | "assert-plus": "1.0.0" 563 | }, 564 | "dependencies": { 565 | "assert-plus": { 566 | "version": "1.0.0", 567 | "bundled": true, 568 | "dev": true, 569 | "optional": true 570 | } 571 | } 572 | }, 573 | "debug": { 574 | "version": "2.6.8", 575 | "bundled": true, 576 | "dev": true, 577 | "optional": true, 578 | "requires": { 579 | "ms": "2.0.0" 580 | } 581 | }, 582 | "deep-extend": { 583 | "version": "0.4.2", 584 | "bundled": true, 585 | "dev": true, 586 | "optional": true 587 | }, 588 | "delayed-stream": { 589 | "version": "1.0.0", 590 | "bundled": true, 591 | "dev": true 592 | }, 593 | "delegates": { 594 | "version": "1.0.0", 595 | "bundled": true, 596 | "dev": true, 597 | "optional": true 598 | }, 599 | "detect-libc": { 600 | "version": "1.0.2", 601 | "bundled": true, 602 | "dev": true, 603 | "optional": true 604 | }, 605 | "ecc-jsbn": { 606 | "version": "0.1.1", 607 | "bundled": true, 608 | "dev": true, 609 | "optional": true, 610 | "requires": { 611 | "jsbn": "0.1.1" 612 | } 613 | }, 614 | "extend": { 615 | "version": "3.0.1", 616 | "bundled": true, 617 | "dev": true, 618 | "optional": true 619 | }, 620 | "extsprintf": { 621 | "version": "1.0.2", 622 | "bundled": true, 623 | "dev": true 624 | }, 625 | "forever-agent": { 626 | "version": "0.6.1", 627 | "bundled": true, 628 | "dev": true, 629 | "optional": true 630 | }, 631 | "form-data": { 632 | "version": "2.1.4", 633 | "bundled": true, 634 | "dev": true, 635 | "optional": true, 636 | "requires": { 637 | "asynckit": "0.4.0", 638 | "combined-stream": "1.0.5", 639 | "mime-types": "2.1.15" 640 | } 641 | }, 642 | "fs.realpath": { 643 | "version": "1.0.0", 644 | "bundled": true, 645 | "dev": true 646 | }, 647 | "fstream": { 648 | "version": "1.0.11", 649 | "bundled": true, 650 | "dev": true, 651 | "requires": { 652 | "graceful-fs": "4.1.11", 653 | "inherits": "2.0.3", 654 | "mkdirp": "0.5.1", 655 | "rimraf": "2.6.1" 656 | } 657 | }, 658 | "fstream-ignore": { 659 | "version": "1.0.5", 660 | "bundled": true, 661 | "dev": true, 662 | "optional": true, 663 | "requires": { 664 | "fstream": "1.0.11", 665 | "inherits": "2.0.3", 666 | "minimatch": "3.0.4" 667 | } 668 | }, 669 | "gauge": { 670 | "version": "2.7.4", 671 | "bundled": true, 672 | "dev": true, 673 | "optional": true, 674 | "requires": { 675 | "aproba": "1.1.1", 676 | "console-control-strings": "1.1.0", 677 | "has-unicode": "2.0.1", 678 | "object-assign": "4.1.1", 679 | "signal-exit": "3.0.2", 680 | "string-width": "1.0.2", 681 | "strip-ansi": "3.0.1", 682 | "wide-align": "1.1.2" 683 | } 684 | }, 685 | "getpass": { 686 | "version": "0.1.7", 687 | "bundled": true, 688 | "dev": true, 689 | "optional": true, 690 | "requires": { 691 | "assert-plus": "1.0.0" 692 | }, 693 | "dependencies": { 694 | "assert-plus": { 695 | "version": "1.0.0", 696 | "bundled": true, 697 | "dev": true, 698 | "optional": true 699 | } 700 | } 701 | }, 702 | "glob": { 703 | "version": "7.1.2", 704 | "bundled": true, 705 | "dev": true, 706 | "requires": { 707 | "fs.realpath": "1.0.0", 708 | "inflight": "1.0.6", 709 | "inherits": "2.0.3", 710 | "minimatch": "3.0.4", 711 | "once": "1.4.0", 712 | "path-is-absolute": "1.0.1" 713 | } 714 | }, 715 | "graceful-fs": { 716 | "version": "4.1.11", 717 | "bundled": true, 718 | "dev": true 719 | }, 720 | "har-schema": { 721 | "version": "1.0.5", 722 | "bundled": true, 723 | "dev": true, 724 | "optional": true 725 | }, 726 | "har-validator": { 727 | "version": "4.2.1", 728 | "bundled": true, 729 | "dev": true, 730 | "optional": true, 731 | "requires": { 732 | "ajv": "4.11.8", 733 | "har-schema": "1.0.5" 734 | } 735 | }, 736 | "has-unicode": { 737 | "version": "2.0.1", 738 | "bundled": true, 739 | "dev": true, 740 | "optional": true 741 | }, 742 | "hawk": { 743 | "version": "3.1.3", 744 | "bundled": true, 745 | "dev": true, 746 | "requires": { 747 | "boom": "2.10.1", 748 | "cryptiles": "2.0.5", 749 | "hoek": "2.16.3", 750 | "sntp": "1.0.9" 751 | } 752 | }, 753 | "hoek": { 754 | "version": "2.16.3", 755 | "bundled": true, 756 | "dev": true 757 | }, 758 | "http-signature": { 759 | "version": "1.1.1", 760 | "bundled": true, 761 | "dev": true, 762 | "optional": true, 763 | "requires": { 764 | "assert-plus": "0.2.0", 765 | "jsprim": "1.4.0", 766 | "sshpk": "1.13.0" 767 | } 768 | }, 769 | "inflight": { 770 | "version": "1.0.6", 771 | "bundled": true, 772 | "dev": true, 773 | "requires": { 774 | "once": "1.4.0", 775 | "wrappy": "1.0.2" 776 | } 777 | }, 778 | "inherits": { 779 | "version": "2.0.3", 780 | "bundled": true, 781 | "dev": true 782 | }, 783 | "ini": { 784 | "version": "1.3.4", 785 | "bundled": true, 786 | "dev": true, 787 | "optional": true 788 | }, 789 | "is-fullwidth-code-point": { 790 | "version": "1.0.0", 791 | "bundled": true, 792 | "dev": true, 793 | "requires": { 794 | "number-is-nan": "1.0.1" 795 | } 796 | }, 797 | "is-typedarray": { 798 | "version": "1.0.0", 799 | "bundled": true, 800 | "dev": true, 801 | "optional": true 802 | }, 803 | "isarray": { 804 | "version": "1.0.0", 805 | "bundled": true, 806 | "dev": true 807 | }, 808 | "isstream": { 809 | "version": "0.1.2", 810 | "bundled": true, 811 | "dev": true, 812 | "optional": true 813 | }, 814 | "jodid25519": { 815 | "version": "1.0.2", 816 | "bundled": true, 817 | "dev": true, 818 | "optional": true, 819 | "requires": { 820 | "jsbn": "0.1.1" 821 | } 822 | }, 823 | "jsbn": { 824 | "version": "0.1.1", 825 | "bundled": true, 826 | "dev": true, 827 | "optional": true 828 | }, 829 | "json-schema": { 830 | "version": "0.2.3", 831 | "bundled": true, 832 | "dev": true, 833 | "optional": true 834 | }, 835 | "json-stable-stringify": { 836 | "version": "1.0.1", 837 | "bundled": true, 838 | "dev": true, 839 | "optional": true, 840 | "requires": { 841 | "jsonify": "0.0.0" 842 | } 843 | }, 844 | "json-stringify-safe": { 845 | "version": "5.0.1", 846 | "bundled": true, 847 | "dev": true, 848 | "optional": true 849 | }, 850 | "jsonify": { 851 | "version": "0.0.0", 852 | "bundled": true, 853 | "dev": true, 854 | "optional": true 855 | }, 856 | "jsprim": { 857 | "version": "1.4.0", 858 | "bundled": true, 859 | "dev": true, 860 | "optional": true, 861 | "requires": { 862 | "assert-plus": "1.0.0", 863 | "extsprintf": "1.0.2", 864 | "json-schema": "0.2.3", 865 | "verror": "1.3.6" 866 | }, 867 | "dependencies": { 868 | "assert-plus": { 869 | "version": "1.0.0", 870 | "bundled": true, 871 | "dev": true, 872 | "optional": true 873 | } 874 | } 875 | }, 876 | "mime-db": { 877 | "version": "1.27.0", 878 | "bundled": true, 879 | "dev": true 880 | }, 881 | "mime-types": { 882 | "version": "2.1.15", 883 | "bundled": true, 884 | "dev": true, 885 | "requires": { 886 | "mime-db": "1.27.0" 887 | } 888 | }, 889 | "minimatch": { 890 | "version": "3.0.4", 891 | "bundled": true, 892 | "dev": true, 893 | "requires": { 894 | "brace-expansion": "1.1.7" 895 | } 896 | }, 897 | "minimist": { 898 | "version": "0.0.8", 899 | "bundled": true, 900 | "dev": true 901 | }, 902 | "mkdirp": { 903 | "version": "0.5.1", 904 | "bundled": true, 905 | "dev": true, 906 | "requires": { 907 | "minimist": "0.0.8" 908 | } 909 | }, 910 | "ms": { 911 | "version": "2.0.0", 912 | "bundled": true, 913 | "dev": true, 914 | "optional": true 915 | }, 916 | "node-pre-gyp": { 917 | "version": "0.6.39", 918 | "bundled": true, 919 | "dev": true, 920 | "optional": true, 921 | "requires": { 922 | "detect-libc": "1.0.2", 923 | "hawk": "3.1.3", 924 | "mkdirp": "0.5.1", 925 | "nopt": "4.0.1", 926 | "npmlog": "4.1.0", 927 | "rc": "1.2.1", 928 | "request": "2.81.0", 929 | "rimraf": "2.6.1", 930 | "semver": "5.3.0", 931 | "tar": "2.2.1", 932 | "tar-pack": "3.4.0" 933 | } 934 | }, 935 | "nopt": { 936 | "version": "4.0.1", 937 | "bundled": true, 938 | "dev": true, 939 | "optional": true, 940 | "requires": { 941 | "abbrev": "1.1.0", 942 | "osenv": "0.1.4" 943 | } 944 | }, 945 | "npmlog": { 946 | "version": "4.1.0", 947 | "bundled": true, 948 | "dev": true, 949 | "optional": true, 950 | "requires": { 951 | "are-we-there-yet": "1.1.4", 952 | "console-control-strings": "1.1.0", 953 | "gauge": "2.7.4", 954 | "set-blocking": "2.0.0" 955 | } 956 | }, 957 | "number-is-nan": { 958 | "version": "1.0.1", 959 | "bundled": true, 960 | "dev": true 961 | }, 962 | "oauth-sign": { 963 | "version": "0.8.2", 964 | "bundled": true, 965 | "dev": true, 966 | "optional": true 967 | }, 968 | "object-assign": { 969 | "version": "4.1.1", 970 | "bundled": true, 971 | "dev": true, 972 | "optional": true 973 | }, 974 | "once": { 975 | "version": "1.4.0", 976 | "bundled": true, 977 | "dev": true, 978 | "requires": { 979 | "wrappy": "1.0.2" 980 | } 981 | }, 982 | "os-homedir": { 983 | "version": "1.0.2", 984 | "bundled": true, 985 | "dev": true, 986 | "optional": true 987 | }, 988 | "os-tmpdir": { 989 | "version": "1.0.2", 990 | "bundled": true, 991 | "dev": true, 992 | "optional": true 993 | }, 994 | "osenv": { 995 | "version": "0.1.4", 996 | "bundled": true, 997 | "dev": true, 998 | "optional": true, 999 | "requires": { 1000 | "os-homedir": "1.0.2", 1001 | "os-tmpdir": "1.0.2" 1002 | } 1003 | }, 1004 | "path-is-absolute": { 1005 | "version": "1.0.1", 1006 | "bundled": true, 1007 | "dev": true 1008 | }, 1009 | "performance-now": { 1010 | "version": "0.2.0", 1011 | "bundled": true, 1012 | "dev": true, 1013 | "optional": true 1014 | }, 1015 | "process-nextick-args": { 1016 | "version": "1.0.7", 1017 | "bundled": true, 1018 | "dev": true 1019 | }, 1020 | "punycode": { 1021 | "version": "1.4.1", 1022 | "bundled": true, 1023 | "dev": true, 1024 | "optional": true 1025 | }, 1026 | "qs": { 1027 | "version": "6.4.0", 1028 | "bundled": true, 1029 | "dev": true, 1030 | "optional": true 1031 | }, 1032 | "rc": { 1033 | "version": "1.2.1", 1034 | "bundled": true, 1035 | "dev": true, 1036 | "optional": true, 1037 | "requires": { 1038 | "deep-extend": "0.4.2", 1039 | "ini": "1.3.4", 1040 | "minimist": "1.2.0", 1041 | "strip-json-comments": "2.0.1" 1042 | }, 1043 | "dependencies": { 1044 | "minimist": { 1045 | "version": "1.2.0", 1046 | "bundled": true, 1047 | "dev": true, 1048 | "optional": true 1049 | } 1050 | } 1051 | }, 1052 | "readable-stream": { 1053 | "version": "2.2.9", 1054 | "bundled": true, 1055 | "dev": true, 1056 | "requires": { 1057 | "buffer-shims": "1.0.0", 1058 | "core-util-is": "1.0.2", 1059 | "inherits": "2.0.3", 1060 | "isarray": "1.0.0", 1061 | "process-nextick-args": "1.0.7", 1062 | "string_decoder": "1.0.1", 1063 | "util-deprecate": "1.0.2" 1064 | } 1065 | }, 1066 | "request": { 1067 | "version": "2.81.0", 1068 | "bundled": true, 1069 | "dev": true, 1070 | "optional": true, 1071 | "requires": { 1072 | "aws-sign2": "0.6.0", 1073 | "aws4": "1.6.0", 1074 | "caseless": "0.12.0", 1075 | "combined-stream": "1.0.5", 1076 | "extend": "3.0.1", 1077 | "forever-agent": "0.6.1", 1078 | "form-data": "2.1.4", 1079 | "har-validator": "4.2.1", 1080 | "hawk": "3.1.3", 1081 | "http-signature": "1.1.1", 1082 | "is-typedarray": "1.0.0", 1083 | "isstream": "0.1.2", 1084 | "json-stringify-safe": "5.0.1", 1085 | "mime-types": "2.1.15", 1086 | "oauth-sign": "0.8.2", 1087 | "performance-now": "0.2.0", 1088 | "qs": "6.4.0", 1089 | "safe-buffer": "5.0.1", 1090 | "stringstream": "0.0.5", 1091 | "tough-cookie": "2.3.2", 1092 | "tunnel-agent": "0.6.0", 1093 | "uuid": "3.0.1" 1094 | } 1095 | }, 1096 | "rimraf": { 1097 | "version": "2.6.1", 1098 | "bundled": true, 1099 | "dev": true, 1100 | "requires": { 1101 | "glob": "7.1.2" 1102 | } 1103 | }, 1104 | "safe-buffer": { 1105 | "version": "5.0.1", 1106 | "bundled": true, 1107 | "dev": true 1108 | }, 1109 | "semver": { 1110 | "version": "5.3.0", 1111 | "bundled": true, 1112 | "dev": true, 1113 | "optional": true 1114 | }, 1115 | "set-blocking": { 1116 | "version": "2.0.0", 1117 | "bundled": true, 1118 | "dev": true, 1119 | "optional": true 1120 | }, 1121 | "signal-exit": { 1122 | "version": "3.0.2", 1123 | "bundled": true, 1124 | "dev": true, 1125 | "optional": true 1126 | }, 1127 | "sntp": { 1128 | "version": "1.0.9", 1129 | "bundled": true, 1130 | "dev": true, 1131 | "requires": { 1132 | "hoek": "2.16.3" 1133 | } 1134 | }, 1135 | "sshpk": { 1136 | "version": "1.13.0", 1137 | "bundled": true, 1138 | "dev": true, 1139 | "optional": true, 1140 | "requires": { 1141 | "asn1": "0.2.3", 1142 | "assert-plus": "1.0.0", 1143 | "bcrypt-pbkdf": "1.0.1", 1144 | "dashdash": "1.14.1", 1145 | "ecc-jsbn": "0.1.1", 1146 | "getpass": "0.1.7", 1147 | "jodid25519": "1.0.2", 1148 | "jsbn": "0.1.1", 1149 | "tweetnacl": "0.14.5" 1150 | }, 1151 | "dependencies": { 1152 | "assert-plus": { 1153 | "version": "1.0.0", 1154 | "bundled": true, 1155 | "dev": true, 1156 | "optional": true 1157 | } 1158 | } 1159 | }, 1160 | "string-width": { 1161 | "version": "1.0.2", 1162 | "bundled": true, 1163 | "dev": true, 1164 | "requires": { 1165 | "code-point-at": "1.1.0", 1166 | "is-fullwidth-code-point": "1.0.0", 1167 | "strip-ansi": "3.0.1" 1168 | } 1169 | }, 1170 | "string_decoder": { 1171 | "version": "1.0.1", 1172 | "bundled": true, 1173 | "dev": true, 1174 | "requires": { 1175 | "safe-buffer": "5.0.1" 1176 | } 1177 | }, 1178 | "stringstream": { 1179 | "version": "0.0.5", 1180 | "bundled": true, 1181 | "dev": true, 1182 | "optional": true 1183 | }, 1184 | "strip-ansi": { 1185 | "version": "3.0.1", 1186 | "bundled": true, 1187 | "dev": true, 1188 | "requires": { 1189 | "ansi-regex": "2.1.1" 1190 | } 1191 | }, 1192 | "strip-json-comments": { 1193 | "version": "2.0.1", 1194 | "bundled": true, 1195 | "dev": true, 1196 | "optional": true 1197 | }, 1198 | "tar": { 1199 | "version": "2.2.1", 1200 | "bundled": true, 1201 | "dev": true, 1202 | "requires": { 1203 | "block-stream": "0.0.9", 1204 | "fstream": "1.0.11", 1205 | "inherits": "2.0.3" 1206 | } 1207 | }, 1208 | "tar-pack": { 1209 | "version": "3.4.0", 1210 | "bundled": true, 1211 | "dev": true, 1212 | "optional": true, 1213 | "requires": { 1214 | "debug": "2.6.8", 1215 | "fstream": "1.0.11", 1216 | "fstream-ignore": "1.0.5", 1217 | "once": "1.4.0", 1218 | "readable-stream": "2.2.9", 1219 | "rimraf": "2.6.1", 1220 | "tar": "2.2.1", 1221 | "uid-number": "0.0.6" 1222 | } 1223 | }, 1224 | "tough-cookie": { 1225 | "version": "2.3.2", 1226 | "bundled": true, 1227 | "dev": true, 1228 | "optional": true, 1229 | "requires": { 1230 | "punycode": "1.4.1" 1231 | } 1232 | }, 1233 | "tunnel-agent": { 1234 | "version": "0.6.0", 1235 | "bundled": true, 1236 | "dev": true, 1237 | "optional": true, 1238 | "requires": { 1239 | "safe-buffer": "5.0.1" 1240 | } 1241 | }, 1242 | "tweetnacl": { 1243 | "version": "0.14.5", 1244 | "bundled": true, 1245 | "dev": true, 1246 | "optional": true 1247 | }, 1248 | "uid-number": { 1249 | "version": "0.0.6", 1250 | "bundled": true, 1251 | "dev": true, 1252 | "optional": true 1253 | }, 1254 | "util-deprecate": { 1255 | "version": "1.0.2", 1256 | "bundled": true, 1257 | "dev": true 1258 | }, 1259 | "uuid": { 1260 | "version": "3.0.1", 1261 | "bundled": true, 1262 | "dev": true, 1263 | "optional": true 1264 | }, 1265 | "verror": { 1266 | "version": "1.3.6", 1267 | "bundled": true, 1268 | "dev": true, 1269 | "optional": true, 1270 | "requires": { 1271 | "extsprintf": "1.0.2" 1272 | } 1273 | }, 1274 | "wide-align": { 1275 | "version": "1.1.2", 1276 | "bundled": true, 1277 | "dev": true, 1278 | "optional": true, 1279 | "requires": { 1280 | "string-width": "1.0.2" 1281 | } 1282 | }, 1283 | "wrappy": { 1284 | "version": "1.0.2", 1285 | "bundled": true, 1286 | "dev": true 1287 | } 1288 | } 1289 | }, 1290 | "get-stream": { 1291 | "version": "3.0.0", 1292 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", 1293 | "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", 1294 | "dev": true 1295 | }, 1296 | "glob-base": { 1297 | "version": "0.3.0", 1298 | "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", 1299 | "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", 1300 | "dev": true, 1301 | "requires": { 1302 | "glob-parent": "2.0.0", 1303 | "is-glob": "2.0.1" 1304 | } 1305 | }, 1306 | "glob-parent": { 1307 | "version": "2.0.0", 1308 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", 1309 | "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", 1310 | "dev": true, 1311 | "requires": { 1312 | "is-glob": "2.0.1" 1313 | } 1314 | }, 1315 | "global-dirs": { 1316 | "version": "0.1.1", 1317 | "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", 1318 | "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", 1319 | "dev": true, 1320 | "requires": { 1321 | "ini": "1.3.5" 1322 | } 1323 | }, 1324 | "got": { 1325 | "version": "6.7.1", 1326 | "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", 1327 | "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", 1328 | "dev": true, 1329 | "requires": { 1330 | "create-error-class": "3.0.2", 1331 | "duplexer3": "0.1.4", 1332 | "get-stream": "3.0.0", 1333 | "is-redirect": "1.0.0", 1334 | "is-retry-allowed": "1.1.0", 1335 | "is-stream": "1.1.0", 1336 | "lowercase-keys": "1.0.0", 1337 | "safe-buffer": "5.1.1", 1338 | "timed-out": "4.0.1", 1339 | "unzip-response": "2.0.1", 1340 | "url-parse-lax": "1.0.0" 1341 | } 1342 | }, 1343 | "graceful-fs": { 1344 | "version": "4.1.11", 1345 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 1346 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", 1347 | "dev": true 1348 | }, 1349 | "has-flag": { 1350 | "version": "2.0.0", 1351 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", 1352 | "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", 1353 | "dev": true 1354 | }, 1355 | "ignore-by-default": { 1356 | "version": "1.0.1", 1357 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", 1358 | "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", 1359 | "dev": true 1360 | }, 1361 | "import-lazy": { 1362 | "version": "2.1.0", 1363 | "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", 1364 | "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", 1365 | "dev": true 1366 | }, 1367 | "imurmurhash": { 1368 | "version": "0.1.4", 1369 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1370 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 1371 | "dev": true 1372 | }, 1373 | "inherits": { 1374 | "version": "2.0.3", 1375 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1376 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 1377 | "dev": true 1378 | }, 1379 | "ini": { 1380 | "version": "1.3.5", 1381 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 1382 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", 1383 | "dev": true 1384 | }, 1385 | "is-binary-path": { 1386 | "version": "1.0.1", 1387 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", 1388 | "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", 1389 | "dev": true, 1390 | "requires": { 1391 | "binary-extensions": "1.11.0" 1392 | } 1393 | }, 1394 | "is-buffer": { 1395 | "version": "1.1.6", 1396 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 1397 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", 1398 | "dev": true 1399 | }, 1400 | "is-dotfile": { 1401 | "version": "1.0.3", 1402 | "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", 1403 | "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", 1404 | "dev": true 1405 | }, 1406 | "is-equal-shallow": { 1407 | "version": "0.1.3", 1408 | "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", 1409 | "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", 1410 | "dev": true, 1411 | "requires": { 1412 | "is-primitive": "2.0.0" 1413 | } 1414 | }, 1415 | "is-extendable": { 1416 | "version": "0.1.1", 1417 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", 1418 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", 1419 | "dev": true 1420 | }, 1421 | "is-extglob": { 1422 | "version": "1.0.0", 1423 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", 1424 | "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", 1425 | "dev": true 1426 | }, 1427 | "is-fullwidth-code-point": { 1428 | "version": "2.0.0", 1429 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1430 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 1431 | "dev": true 1432 | }, 1433 | "is-glob": { 1434 | "version": "2.0.1", 1435 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", 1436 | "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", 1437 | "dev": true, 1438 | "requires": { 1439 | "is-extglob": "1.0.0" 1440 | } 1441 | }, 1442 | "is-installed-globally": { 1443 | "version": "0.1.0", 1444 | "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", 1445 | "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", 1446 | "dev": true, 1447 | "requires": { 1448 | "global-dirs": "0.1.1", 1449 | "is-path-inside": "1.0.1" 1450 | } 1451 | }, 1452 | "is-npm": { 1453 | "version": "1.0.0", 1454 | "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", 1455 | "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", 1456 | "dev": true 1457 | }, 1458 | "is-number": { 1459 | "version": "2.1.0", 1460 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", 1461 | "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", 1462 | "dev": true, 1463 | "requires": { 1464 | "kind-of": "3.2.2" 1465 | } 1466 | }, 1467 | "is-obj": { 1468 | "version": "1.0.1", 1469 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", 1470 | "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", 1471 | "dev": true 1472 | }, 1473 | "is-path-inside": { 1474 | "version": "1.0.1", 1475 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", 1476 | "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", 1477 | "dev": true, 1478 | "requires": { 1479 | "path-is-inside": "1.0.2" 1480 | } 1481 | }, 1482 | "is-posix-bracket": { 1483 | "version": "0.1.1", 1484 | "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", 1485 | "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", 1486 | "dev": true 1487 | }, 1488 | "is-primitive": { 1489 | "version": "2.0.0", 1490 | "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", 1491 | "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", 1492 | "dev": true 1493 | }, 1494 | "is-redirect": { 1495 | "version": "1.0.0", 1496 | "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", 1497 | "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", 1498 | "dev": true 1499 | }, 1500 | "is-retry-allowed": { 1501 | "version": "1.1.0", 1502 | "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", 1503 | "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", 1504 | "dev": true 1505 | }, 1506 | "is-stream": { 1507 | "version": "1.1.0", 1508 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 1509 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", 1510 | "dev": true 1511 | }, 1512 | "isarray": { 1513 | "version": "1.0.0", 1514 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1515 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 1516 | "dev": true 1517 | }, 1518 | "isexe": { 1519 | "version": "2.0.0", 1520 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1521 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1522 | "dev": true 1523 | }, 1524 | "isobject": { 1525 | "version": "2.1.0", 1526 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", 1527 | "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", 1528 | "dev": true, 1529 | "requires": { 1530 | "isarray": "1.0.0" 1531 | } 1532 | }, 1533 | "kind-of": { 1534 | "version": "3.2.2", 1535 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1536 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1537 | "dev": true, 1538 | "requires": { 1539 | "is-buffer": "1.1.6" 1540 | } 1541 | }, 1542 | "latest-version": { 1543 | "version": "3.1.0", 1544 | "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", 1545 | "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", 1546 | "dev": true, 1547 | "requires": { 1548 | "package-json": "4.0.1" 1549 | } 1550 | }, 1551 | "lodash._baseassign": { 1552 | "version": "3.2.0", 1553 | "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", 1554 | "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", 1555 | "dev": true, 1556 | "requires": { 1557 | "lodash._basecopy": "3.0.1", 1558 | "lodash.keys": "3.1.2" 1559 | } 1560 | }, 1561 | "lodash._basecopy": { 1562 | "version": "3.0.1", 1563 | "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", 1564 | "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", 1565 | "dev": true 1566 | }, 1567 | "lodash._bindcallback": { 1568 | "version": "3.0.1", 1569 | "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", 1570 | "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", 1571 | "dev": true 1572 | }, 1573 | "lodash._createassigner": { 1574 | "version": "3.1.1", 1575 | "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", 1576 | "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=", 1577 | "dev": true, 1578 | "requires": { 1579 | "lodash._bindcallback": "3.0.1", 1580 | "lodash._isiterateecall": "3.0.9", 1581 | "lodash.restparam": "3.6.1" 1582 | } 1583 | }, 1584 | "lodash._getnative": { 1585 | "version": "3.9.1", 1586 | "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", 1587 | "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", 1588 | "dev": true 1589 | }, 1590 | "lodash._isiterateecall": { 1591 | "version": "3.0.9", 1592 | "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", 1593 | "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", 1594 | "dev": true 1595 | }, 1596 | "lodash.assign": { 1597 | "version": "3.2.0", 1598 | "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", 1599 | "integrity": "sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=", 1600 | "dev": true, 1601 | "requires": { 1602 | "lodash._baseassign": "3.2.0", 1603 | "lodash._createassigner": "3.1.1", 1604 | "lodash.keys": "3.1.2" 1605 | } 1606 | }, 1607 | "lodash.defaults": { 1608 | "version": "3.1.2", 1609 | "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-3.1.2.tgz", 1610 | "integrity": "sha1-xzCLGNv4vJNy1wGnNJPGEZK9Liw=", 1611 | "dev": true, 1612 | "requires": { 1613 | "lodash.assign": "3.2.0", 1614 | "lodash.restparam": "3.6.1" 1615 | } 1616 | }, 1617 | "lodash.isarguments": { 1618 | "version": "3.1.0", 1619 | "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", 1620 | "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", 1621 | "dev": true 1622 | }, 1623 | "lodash.isarray": { 1624 | "version": "3.0.4", 1625 | "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", 1626 | "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", 1627 | "dev": true 1628 | }, 1629 | "lodash.keys": { 1630 | "version": "3.1.2", 1631 | "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", 1632 | "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", 1633 | "dev": true, 1634 | "requires": { 1635 | "lodash._getnative": "3.9.1", 1636 | "lodash.isarguments": "3.1.0", 1637 | "lodash.isarray": "3.0.4" 1638 | } 1639 | }, 1640 | "lodash.restparam": { 1641 | "version": "3.6.1", 1642 | "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", 1643 | "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", 1644 | "dev": true 1645 | }, 1646 | "lowercase-keys": { 1647 | "version": "1.0.0", 1648 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", 1649 | "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", 1650 | "dev": true 1651 | }, 1652 | "lru-cache": { 1653 | "version": "4.1.1", 1654 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", 1655 | "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", 1656 | "dev": true, 1657 | "requires": { 1658 | "pseudomap": "1.0.2", 1659 | "yallist": "2.1.2" 1660 | } 1661 | }, 1662 | "make-dir": { 1663 | "version": "1.1.0", 1664 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.1.0.tgz", 1665 | "integrity": "sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA==", 1666 | "dev": true, 1667 | "requires": { 1668 | "pify": "3.0.0" 1669 | } 1670 | }, 1671 | "map-stream": { 1672 | "version": "0.1.0", 1673 | "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", 1674 | "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", 1675 | "dev": true 1676 | }, 1677 | "micromatch": { 1678 | "version": "2.3.11", 1679 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", 1680 | "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", 1681 | "dev": true, 1682 | "requires": { 1683 | "arr-diff": "2.0.0", 1684 | "array-unique": "0.2.1", 1685 | "braces": "1.8.5", 1686 | "expand-brackets": "0.1.5", 1687 | "extglob": "0.3.2", 1688 | "filename-regex": "2.0.1", 1689 | "is-extglob": "1.0.0", 1690 | "is-glob": "2.0.1", 1691 | "kind-of": "3.2.2", 1692 | "normalize-path": "2.1.1", 1693 | "object.omit": "2.0.1", 1694 | "parse-glob": "3.0.4", 1695 | "regex-cache": "0.4.4" 1696 | } 1697 | }, 1698 | "minimatch": { 1699 | "version": "3.0.4", 1700 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1701 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1702 | "dev": true, 1703 | "requires": { 1704 | "brace-expansion": "1.1.8" 1705 | } 1706 | }, 1707 | "minimist": { 1708 | "version": "1.2.0", 1709 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 1710 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 1711 | "dev": true 1712 | }, 1713 | "ms": { 1714 | "version": "2.0.0", 1715 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1716 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 1717 | "dev": true 1718 | }, 1719 | "nan": { 1720 | "version": "2.8.0", 1721 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", 1722 | "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=", 1723 | "dev": true, 1724 | "optional": true 1725 | }, 1726 | "nodemon": { 1727 | "version": "1.12.1", 1728 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.12.1.tgz", 1729 | "integrity": "sha1-mWpW3EnZ8Wu/G3ik3gjxNjSzh40=", 1730 | "dev": true, 1731 | "requires": { 1732 | "chokidar": "1.7.0", 1733 | "debug": "2.6.9", 1734 | "es6-promise": "3.3.1", 1735 | "ignore-by-default": "1.0.1", 1736 | "lodash.defaults": "3.1.2", 1737 | "minimatch": "3.0.4", 1738 | "ps-tree": "1.1.0", 1739 | "touch": "3.1.0", 1740 | "undefsafe": "0.0.3", 1741 | "update-notifier": "2.3.0" 1742 | } 1743 | }, 1744 | "nopt": { 1745 | "version": "1.0.10", 1746 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", 1747 | "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", 1748 | "dev": true, 1749 | "requires": { 1750 | "abbrev": "1.1.1" 1751 | } 1752 | }, 1753 | "normalize-path": { 1754 | "version": "2.1.1", 1755 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", 1756 | "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", 1757 | "dev": true, 1758 | "requires": { 1759 | "remove-trailing-separator": "1.1.0" 1760 | } 1761 | }, 1762 | "npm-run-path": { 1763 | "version": "2.0.2", 1764 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", 1765 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", 1766 | "dev": true, 1767 | "requires": { 1768 | "path-key": "2.0.1" 1769 | } 1770 | }, 1771 | "number-is-nan": { 1772 | "version": "1.0.1", 1773 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 1774 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", 1775 | "dev": true 1776 | }, 1777 | "object.omit": { 1778 | "version": "2.0.1", 1779 | "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", 1780 | "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", 1781 | "dev": true, 1782 | "requires": { 1783 | "for-own": "0.1.5", 1784 | "is-extendable": "0.1.1" 1785 | } 1786 | }, 1787 | "p-finally": { 1788 | "version": "1.0.0", 1789 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 1790 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", 1791 | "dev": true 1792 | }, 1793 | "package-json": { 1794 | "version": "4.0.1", 1795 | "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", 1796 | "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", 1797 | "dev": true, 1798 | "requires": { 1799 | "got": "6.7.1", 1800 | "registry-auth-token": "3.3.1", 1801 | "registry-url": "3.1.0", 1802 | "semver": "5.4.1" 1803 | } 1804 | }, 1805 | "parse-glob": { 1806 | "version": "3.0.4", 1807 | "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", 1808 | "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", 1809 | "dev": true, 1810 | "requires": { 1811 | "glob-base": "0.3.0", 1812 | "is-dotfile": "1.0.3", 1813 | "is-extglob": "1.0.0", 1814 | "is-glob": "2.0.1" 1815 | } 1816 | }, 1817 | "path-is-absolute": { 1818 | "version": "1.0.1", 1819 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1820 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1821 | "dev": true 1822 | }, 1823 | "path-is-inside": { 1824 | "version": "1.0.2", 1825 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 1826 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", 1827 | "dev": true 1828 | }, 1829 | "path-key": { 1830 | "version": "2.0.1", 1831 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 1832 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 1833 | "dev": true 1834 | }, 1835 | "pause-stream": { 1836 | "version": "0.0.11", 1837 | "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", 1838 | "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", 1839 | "dev": true, 1840 | "requires": { 1841 | "through": "2.3.8" 1842 | } 1843 | }, 1844 | "pify": { 1845 | "version": "3.0.0", 1846 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 1847 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", 1848 | "dev": true 1849 | }, 1850 | "prepend-http": { 1851 | "version": "1.0.4", 1852 | "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", 1853 | "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", 1854 | "dev": true 1855 | }, 1856 | "preserve": { 1857 | "version": "0.2.0", 1858 | "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", 1859 | "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", 1860 | "dev": true 1861 | }, 1862 | "process-nextick-args": { 1863 | "version": "1.0.7", 1864 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 1865 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", 1866 | "dev": true 1867 | }, 1868 | "ps-tree": { 1869 | "version": "1.1.0", 1870 | "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.1.0.tgz", 1871 | "integrity": "sha1-tCGyQUDWID8e08dplrRCewjowBQ=", 1872 | "dev": true, 1873 | "requires": { 1874 | "event-stream": "3.3.4" 1875 | } 1876 | }, 1877 | "pseudomap": { 1878 | "version": "1.0.2", 1879 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 1880 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", 1881 | "dev": true 1882 | }, 1883 | "randomatic": { 1884 | "version": "1.1.7", 1885 | "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", 1886 | "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", 1887 | "dev": true, 1888 | "requires": { 1889 | "is-number": "3.0.0", 1890 | "kind-of": "4.0.0" 1891 | }, 1892 | "dependencies": { 1893 | "is-number": { 1894 | "version": "3.0.0", 1895 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", 1896 | "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", 1897 | "dev": true, 1898 | "requires": { 1899 | "kind-of": "3.2.2" 1900 | }, 1901 | "dependencies": { 1902 | "kind-of": { 1903 | "version": "3.2.2", 1904 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1905 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1906 | "dev": true, 1907 | "requires": { 1908 | "is-buffer": "1.1.6" 1909 | } 1910 | } 1911 | } 1912 | }, 1913 | "kind-of": { 1914 | "version": "4.0.0", 1915 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", 1916 | "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", 1917 | "dev": true, 1918 | "requires": { 1919 | "is-buffer": "1.1.6" 1920 | } 1921 | } 1922 | } 1923 | }, 1924 | "rc": { 1925 | "version": "1.2.2", 1926 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.2.tgz", 1927 | "integrity": "sha1-2M6ctX6NZNnHut2YdsfDTL48cHc=", 1928 | "dev": true, 1929 | "requires": { 1930 | "deep-extend": "0.4.2", 1931 | "ini": "1.3.5", 1932 | "minimist": "1.2.0", 1933 | "strip-json-comments": "2.0.1" 1934 | } 1935 | }, 1936 | "readable-stream": { 1937 | "version": "2.3.3", 1938 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", 1939 | "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", 1940 | "dev": true, 1941 | "requires": { 1942 | "core-util-is": "1.0.2", 1943 | "inherits": "2.0.3", 1944 | "isarray": "1.0.0", 1945 | "process-nextick-args": "1.0.7", 1946 | "safe-buffer": "5.1.1", 1947 | "string_decoder": "1.0.3", 1948 | "util-deprecate": "1.0.2" 1949 | } 1950 | }, 1951 | "readdirp": { 1952 | "version": "2.1.0", 1953 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", 1954 | "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", 1955 | "dev": true, 1956 | "requires": { 1957 | "graceful-fs": "4.1.11", 1958 | "minimatch": "3.0.4", 1959 | "readable-stream": "2.3.3", 1960 | "set-immediate-shim": "1.0.1" 1961 | } 1962 | }, 1963 | "regex-cache": { 1964 | "version": "0.4.4", 1965 | "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", 1966 | "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", 1967 | "dev": true, 1968 | "requires": { 1969 | "is-equal-shallow": "0.1.3" 1970 | } 1971 | }, 1972 | "registry-auth-token": { 1973 | "version": "3.3.1", 1974 | "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.1.tgz", 1975 | "integrity": "sha1-+w0yie4Nmtosu1KvXf5mywcNMAY=", 1976 | "dev": true, 1977 | "requires": { 1978 | "rc": "1.2.2", 1979 | "safe-buffer": "5.1.1" 1980 | } 1981 | }, 1982 | "registry-url": { 1983 | "version": "3.1.0", 1984 | "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", 1985 | "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", 1986 | "dev": true, 1987 | "requires": { 1988 | "rc": "1.2.2" 1989 | } 1990 | }, 1991 | "remove-trailing-separator": { 1992 | "version": "1.1.0", 1993 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", 1994 | "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", 1995 | "dev": true 1996 | }, 1997 | "repeat-element": { 1998 | "version": "1.1.2", 1999 | "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", 2000 | "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", 2001 | "dev": true 2002 | }, 2003 | "repeat-string": { 2004 | "version": "1.6.1", 2005 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 2006 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", 2007 | "dev": true 2008 | }, 2009 | "safe-buffer": { 2010 | "version": "5.1.1", 2011 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 2012 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", 2013 | "dev": true 2014 | }, 2015 | "semver": { 2016 | "version": "5.4.1", 2017 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", 2018 | "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", 2019 | "dev": true 2020 | }, 2021 | "semver-diff": { 2022 | "version": "2.1.0", 2023 | "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", 2024 | "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", 2025 | "dev": true, 2026 | "requires": { 2027 | "semver": "5.4.1" 2028 | } 2029 | }, 2030 | "set-immediate-shim": { 2031 | "version": "1.0.1", 2032 | "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", 2033 | "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", 2034 | "dev": true 2035 | }, 2036 | "shebang-command": { 2037 | "version": "1.2.0", 2038 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 2039 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 2040 | "dev": true, 2041 | "requires": { 2042 | "shebang-regex": "1.0.0" 2043 | } 2044 | }, 2045 | "shebang-regex": { 2046 | "version": "1.0.0", 2047 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 2048 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 2049 | "dev": true 2050 | }, 2051 | "signal-exit": { 2052 | "version": "3.0.2", 2053 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 2054 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 2055 | "dev": true 2056 | }, 2057 | "split": { 2058 | "version": "0.3.3", 2059 | "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", 2060 | "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", 2061 | "dev": true, 2062 | "requires": { 2063 | "through": "2.3.8" 2064 | } 2065 | }, 2066 | "stream-combiner": { 2067 | "version": "0.0.4", 2068 | "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", 2069 | "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", 2070 | "dev": true, 2071 | "requires": { 2072 | "duplexer": "0.1.1" 2073 | } 2074 | }, 2075 | "string-width": { 2076 | "version": "2.1.1", 2077 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 2078 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 2079 | "dev": true, 2080 | "requires": { 2081 | "is-fullwidth-code-point": "2.0.0", 2082 | "strip-ansi": "4.0.0" 2083 | } 2084 | }, 2085 | "string_decoder": { 2086 | "version": "1.0.3", 2087 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", 2088 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", 2089 | "dev": true, 2090 | "requires": { 2091 | "safe-buffer": "5.1.1" 2092 | } 2093 | }, 2094 | "strip-ansi": { 2095 | "version": "4.0.0", 2096 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 2097 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 2098 | "dev": true, 2099 | "requires": { 2100 | "ansi-regex": "3.0.0" 2101 | } 2102 | }, 2103 | "strip-eof": { 2104 | "version": "1.0.0", 2105 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", 2106 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", 2107 | "dev": true 2108 | }, 2109 | "strip-json-comments": { 2110 | "version": "2.0.1", 2111 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 2112 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 2113 | "dev": true 2114 | }, 2115 | "supports-color": { 2116 | "version": "4.5.0", 2117 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", 2118 | "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", 2119 | "dev": true, 2120 | "requires": { 2121 | "has-flag": "2.0.0" 2122 | } 2123 | }, 2124 | "term-size": { 2125 | "version": "1.2.0", 2126 | "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", 2127 | "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", 2128 | "dev": true, 2129 | "requires": { 2130 | "execa": "0.7.0" 2131 | } 2132 | }, 2133 | "through": { 2134 | "version": "2.3.8", 2135 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 2136 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 2137 | "dev": true 2138 | }, 2139 | "timed-out": { 2140 | "version": "4.0.1", 2141 | "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", 2142 | "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", 2143 | "dev": true 2144 | }, 2145 | "touch": { 2146 | "version": "3.1.0", 2147 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", 2148 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", 2149 | "dev": true, 2150 | "requires": { 2151 | "nopt": "1.0.10" 2152 | } 2153 | }, 2154 | "undefsafe": { 2155 | "version": "0.0.3", 2156 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-0.0.3.tgz", 2157 | "integrity": "sha1-7Mo6A+VrmvFzhbqsgSrIO5lKli8=", 2158 | "dev": true 2159 | }, 2160 | "unique-string": { 2161 | "version": "1.0.0", 2162 | "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", 2163 | "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", 2164 | "dev": true, 2165 | "requires": { 2166 | "crypto-random-string": "1.0.0" 2167 | } 2168 | }, 2169 | "unzip-response": { 2170 | "version": "2.0.1", 2171 | "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", 2172 | "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", 2173 | "dev": true 2174 | }, 2175 | "update-notifier": { 2176 | "version": "2.3.0", 2177 | "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.3.0.tgz", 2178 | "integrity": "sha1-TognpruRUUCrCTVZ1wFOPruDdFE=", 2179 | "dev": true, 2180 | "requires": { 2181 | "boxen": "1.2.2", 2182 | "chalk": "2.3.0", 2183 | "configstore": "3.1.1", 2184 | "import-lazy": "2.1.0", 2185 | "is-installed-globally": "0.1.0", 2186 | "is-npm": "1.0.0", 2187 | "latest-version": "3.1.0", 2188 | "semver-diff": "2.1.0", 2189 | "xdg-basedir": "3.0.0" 2190 | } 2191 | }, 2192 | "url-parse-lax": { 2193 | "version": "1.0.0", 2194 | "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", 2195 | "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", 2196 | "dev": true, 2197 | "requires": { 2198 | "prepend-http": "1.0.4" 2199 | } 2200 | }, 2201 | "util-deprecate": { 2202 | "version": "1.0.2", 2203 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2204 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 2205 | "dev": true 2206 | }, 2207 | "which": { 2208 | "version": "1.3.0", 2209 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", 2210 | "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", 2211 | "dev": true, 2212 | "requires": { 2213 | "isexe": "2.0.0" 2214 | } 2215 | }, 2216 | "widest-line": { 2217 | "version": "1.0.0", 2218 | "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz", 2219 | "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=", 2220 | "dev": true, 2221 | "requires": { 2222 | "string-width": "1.0.2" 2223 | }, 2224 | "dependencies": { 2225 | "ansi-regex": { 2226 | "version": "2.1.1", 2227 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 2228 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 2229 | "dev": true 2230 | }, 2231 | "is-fullwidth-code-point": { 2232 | "version": "1.0.0", 2233 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 2234 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 2235 | "dev": true, 2236 | "requires": { 2237 | "number-is-nan": "1.0.1" 2238 | } 2239 | }, 2240 | "string-width": { 2241 | "version": "1.0.2", 2242 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 2243 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 2244 | "dev": true, 2245 | "requires": { 2246 | "code-point-at": "1.1.0", 2247 | "is-fullwidth-code-point": "1.0.0", 2248 | "strip-ansi": "3.0.1" 2249 | } 2250 | }, 2251 | "strip-ansi": { 2252 | "version": "3.0.1", 2253 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 2254 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 2255 | "dev": true, 2256 | "requires": { 2257 | "ansi-regex": "2.1.1" 2258 | } 2259 | } 2260 | } 2261 | }, 2262 | "write-file-atomic": { 2263 | "version": "2.3.0", 2264 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", 2265 | "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", 2266 | "dev": true, 2267 | "requires": { 2268 | "graceful-fs": "4.1.11", 2269 | "imurmurhash": "0.1.4", 2270 | "signal-exit": "3.0.2" 2271 | } 2272 | }, 2273 | "xdg-basedir": { 2274 | "version": "3.0.0", 2275 | "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", 2276 | "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", 2277 | "dev": true 2278 | }, 2279 | "yallist": { 2280 | "version": "2.1.2", 2281 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 2282 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", 2283 | "dev": true 2284 | } 2285 | } 2286 | } 2287 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tiny-koa", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "app.js", 6 | "scripts": { 7 | "dev": "nodemon app.js" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "devDependencies": { 13 | "nodemon": "^1.12.1" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/middleware/tiny-koa-body.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = (config) => { 4 | const jsonTypes = 'application/json'; 5 | const formTypes = 'application/x-www-form-urlencoded'; 6 | const textTypes = 'text/plain'; 7 | 8 | return async (ctx, next) => { 9 | let reqStr = await new Promise((resolve, reject) => { 10 | let data = ''; 11 | ctx.req.on('data', chunk => { 12 | data += chunk; 13 | }); 14 | ctx.req.on('end', () => { 15 | resolve(data); 16 | }) 17 | }); 18 | 19 | if (ctx.method.toUpperCase() === 'options') { 20 | return next(); 21 | } 22 | 23 | let curTypes = ctx.req.headers['content-type'] || textTypes; 24 | if (curTypes.includes(jsonTypes)) { 25 | ctx.req.body = JSON.parse(reqStr || "null"); // TODO try 26 | } else if (curTypes.includes(formTypes)) { 27 | let formArr = reqStr.split('&'); 28 | let formObj = {}; 29 | formArr.forEach((item) => { 30 | let formItem = item.split('='); 31 | formItem = formItem.map(_=>decodeURIComponent(_)); 32 | formObj[formItem[0]] = formItem[1]; 33 | }); 34 | ctx.req.body = formObj; 35 | } else { 36 | ctx.req.body = reqStr; 37 | } 38 | 39 | return next(); 40 | } 41 | }; 42 | -------------------------------------------------------------------------------- /src/middleware/tiny-koa-cookie.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = (config) => { 4 | return (ctx, next) => { 5 | let {cookie=''} = ctx.req.headers; 6 | let cookieObj = {}; 7 | let cookieArr = cookie.split(';'); 8 | 9 | cookieArr.forEach(item => { 10 | let itemSplit = item.split('='); 11 | cookieObj[itemSplit[0]] = unescape(itemSplit[1]); 12 | }); 13 | 14 | ctx.cookies = { 15 | get: (key) => { 16 | if (key === undefined) { 17 | return cookieObj; 18 | } 19 | return cookieObj[key]; 20 | }, 21 | set: (key, value) => { 22 | // TODO cookie其他字段 23 | ctx.res.setHeader('Set-Cookie', `${key}=${value}`); 24 | } 25 | }; 26 | return next(); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/middleware/tiny-koa-cors.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = (config) => { 4 | return (ctx, next) => { 5 | let setHeaders = () => { 6 | if (ctx.req.headers.origin) { 7 | ctx.res.setHeader('Access-Control-Allow-Origin', ctx.req.headers.origin); 8 | ctx.res.setHeader('Access-Control-Allow-Credentials', 'true'); 9 | ctx.res.setHeader('Access-Control-Allow-Headers', ctx.req.headers['access-control-request-headers'] || 'content-type' ); 10 | ctx.res.setHeader('Access-Control-Allow-Methods', 'GET, POST, DELETE, PUT, OPTIONS'); 11 | } 12 | }; 13 | 14 | setHeaders(); 15 | if (ctx.req.method.toUpperCase() === 'OPTIONS') { 16 | ctx.res.writeHead(200); 17 | } else { 18 | return next(); 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/middleware/tiny-koa-router.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const Route = class { 4 | constructor(path, method, route) { 5 | this.path = path; 6 | this.method = method.toUpperCase(); 7 | this.route = (ctx, next) => { 8 | ctx.params = this.params; 9 | route(ctx, next); 10 | }; 11 | this.params = {}; 12 | } 13 | 14 | match(reqPath) { 15 | let paramsObj = {}; 16 | 17 | let routePathArr = this.path.split('/').filter(_=>_!==''); 18 | let reqPathArr = reqPath.split('/').filter(_=>_!==''); 19 | 20 | if (routePathArr.length !== reqPathArr.length) { 21 | return false; 22 | } 23 | 24 | for (let i = 0, len = routePathArr.length; i < len; i++) { 25 | let route = routePathArr[i]; 26 | let isParam = route.startsWith(':'); 27 | 28 | if (isParam) { 29 | let paramKey = route.slice(1); 30 | paramsObj[paramKey] = reqPathArr[i]; 31 | } else if(route !== reqPathArr[i]) { 32 | return false; 33 | } 34 | } 35 | this.params = paramsObj; 36 | 37 | return true; 38 | } 39 | }; 40 | 41 | const TinyKoaRouter = class { 42 | constructor() { 43 | this.routeStack = []; 44 | this.methods = ['get', 'post']; 45 | this.methods.forEach((method) => { 46 | TinyKoaRouter.prototype[method] = (path, route) => { 47 | this.routeStack.push(new Route(path, method, route)); 48 | } 49 | }); 50 | } 51 | 52 | all(path, route) { 53 | this.routeStack.push(new Route(path, 'all', route)); 54 | } 55 | 56 | getMatchRoutes(reqPath) { 57 | return this.routeStack.filter((item) => { 58 | return item.match(reqPath); 59 | }); 60 | } 61 | 62 | routes() { 63 | return async (ctx, next) => { 64 | let routePath = ctx.path; 65 | 66 | let matchRouts = this.getMatchRoutes(routePath); 67 | if (matchRouts.length === 0) { 68 | return next(); 69 | } 70 | 71 | let dispatch = (i) => { 72 | if (i === matchRouts.length) { 73 | return next(); // to next middleware 74 | } 75 | let route = matchRouts[i].route; 76 | 77 | let routeWrap = () => { 78 | return route(ctx, () => { 79 | return dispatch(i+1); 80 | }); 81 | }; 82 | 83 | return Promise.resolve(routeWrap()); 84 | }; 85 | 86 | return dispatch(0); 87 | } 88 | } 89 | }; 90 | 91 | module.exports = TinyKoaRouter; 92 | -------------------------------------------------------------------------------- /src/middleware/tiny-koa-static.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const fs = require('fs'); 3 | const Stream = require('stream'); 4 | 5 | module.exports = (config) => { 6 | let staticDir = null; 7 | if (typeof config === 'string') { 8 | staticDir = config; 9 | } 10 | 11 | return async (ctx, next) => { 12 | let statInfo = false; 13 | let filePath = staticDir + ctx.path; 14 | try { 15 | statInfo = fs.statSync(filePath); 16 | } catch (err) {} 17 | 18 | if (statInfo && statInfo.isFile()) { 19 | // TODO 应该用Accept更准确点 20 | let index = filePath.lastIndexOf("."); 21 | let ext = filePath.substr(index+1); 22 | switch(ext) { 23 | case 'html': 24 | ctx.res.setHeader('Content-Type', 'text/html; charset=utf-8'); 25 | break; 26 | case 'js': 27 | ctx.res.setHeader('Content-Type', 'text/javascript; charset=utf-8'); 28 | break; 29 | case 'css': 30 | ctx.res.setHeader('Content-Type', 'text/css; charset=utf-8'); 31 | break; 32 | } 33 | 34 | let rs = fs.createReadStream(filePath); 35 | ctx.body = rs; 36 | } else { 37 | return next(); 38 | } 39 | } 40 | }; 41 | -------------------------------------------------------------------------------- /src/middleware/tiny-koa-views.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const path = require('path'); 4 | const fs = require('fs'); 5 | 6 | let D = null; 7 | // doT.js 8 | // 2011-2014, Laura Doktorova, https://github.com/olado/doT 9 | // Licensed under the MIT license. 10 | 11 | (function () { 12 | "use strict"; 13 | 14 | var doT = { 15 | name: "doT", 16 | version: "1.1.1", 17 | templateSettings: { 18 | evaluate: /\{\{([\s\S]+?(\}?)+)\}\}/g, 19 | interpolate: /\{\{=([\s\S]+?)\}\}/g, 20 | encode: /\{\{!([\s\S]+?)\}\}/g, 21 | use: /\{\{#([\s\S]+?)\}\}/g, 22 | useParams: /(^|[^\w$])def(?:\.|\[[\'\"])([\w$\.]+)(?:[\'\"]\])?\s*\:\s*([\w$\.]+|\"[^\"]+\"|\'[^\']+\'|\{[^\}]+\})/g, 23 | define: /\{\{##\s*([\w\.$]+)\s*(\:|=)([\s\S]+?)#\}\}/g, 24 | defineParams:/^\s*([\w$]+):([\s\S]+)/, 25 | conditional: /\{\{\?(\?)?\s*([\s\S]*?)\s*\}\}/g, 26 | iterate: /\{\{~\s*(?:\}\}|([\s\S]+?)\s*\:\s*([\w$]+)\s*(?:\:\s*([\w$]+))?\s*\}\})/g, 27 | varname: "it", 28 | strip: true, 29 | append: true, 30 | selfcontained: false, 31 | doNotSkipEncoded: false 32 | }, 33 | template: undefined, //fn, compile template 34 | compile: undefined, //fn, for express 35 | log: true 36 | }, _globals; 37 | 38 | doT.encodeHTMLSource = function(doNotSkipEncoded) { 39 | var encodeHTMLRules = { "&": "&", "<": "<", ">": ">", '"': """, "'": "'", "/": "/" }, 40 | matchHTML = doNotSkipEncoded ? /[&<>"'\/]/g : /&(?!#?\w+;)|<|>|"|'|\//g; 41 | return function(code) { 42 | return code ? code.toString().replace(matchHTML, function(m) {return encodeHTMLRules[m] || m;}) : ""; 43 | }; 44 | }; 45 | 46 | _globals = (function(){ return this || (0,eval)("this"); }()); 47 | 48 | /* istanbul ignore else */ 49 | if (typeof module !== "undefined" && module.exports) { 50 | module.exports = doT; 51 | } else if (typeof define === "function" && define.amd) { 52 | define(function(){return doT;}); 53 | } else { 54 | _globals.doT = doT; 55 | } 56 | 57 | var startend = { 58 | append: { start: "'+(", end: ")+'", startencode: "'+encodeHTML(" }, 59 | split: { start: "';out+=(", end: ");out+='", startencode: "';out+=encodeHTML(" } 60 | }, skip = /$^/; 61 | 62 | function resolveDefs(c, block, def) { 63 | return ((typeof block === "string") ? block : block.toString()) 64 | .replace(c.define || skip, function(m, code, assign, value) { 65 | if (code.indexOf("def.") === 0) { 66 | code = code.substring(4); 67 | } 68 | if (!(code in def)) { 69 | if (assign === ":") { 70 | if (c.defineParams) value.replace(c.defineParams, function(m, param, v) { 71 | def[code] = {arg: param, text: v}; 72 | }); 73 | if (!(code in def)) def[code]= value; 74 | } else { 75 | new Function("def", "def['"+code+"']=" + value)(def); 76 | } 77 | } 78 | return ""; 79 | }) 80 | .replace(c.use || skip, function(m, code) { 81 | if (c.useParams) code = code.replace(c.useParams, function(m, s, d, param) { 82 | if (def[d] && def[d].arg && param) { 83 | var rw = (d+":"+param).replace(/'|\\/g, "_"); 84 | def.__exp = def.__exp || {}; 85 | def.__exp[rw] = def[d].text.replace(new RegExp("(^|[^\\w$])" + def[d].arg + "([^\\w$])", "g"), "$1" + param + "$2"); 86 | return s + "def.__exp['"+rw+"']"; 87 | } 88 | }); 89 | var v = new Function("def", "return " + code)(def); 90 | return v ? resolveDefs(c, v, def) : v; 91 | }); 92 | } 93 | 94 | function unescape(code) { 95 | return code.replace(/\\('|\\)/g, "$1").replace(/[\r\t\n]/g, " "); 96 | } 97 | 98 | doT.template = function(tmpl, c, def) { 99 | c = c || doT.templateSettings; 100 | var cse = c.append ? startend.append : startend.split, needhtmlencode, sid = 0, indv, 101 | str = (c.use || c.define) ? resolveDefs(c, tmpl, def || {}) : tmpl; 102 | 103 | str = ("var out='" + (c.strip ? str.replace(/(^|\r|\n)\t* +| +\t*(\r|\n|$)/g," ") 104 | .replace(/\r|\n|\t|\/\*[\s\S]*?\*\//g,""): str) 105 | .replace(/'|\\/g, "\\$&") 106 | .replace(c.interpolate || skip, function(m, code) { 107 | return cse.start + unescape(code) + cse.end; 108 | }) 109 | .replace(c.encode || skip, function(m, code) { 110 | needhtmlencode = true; 111 | return cse.startencode + unescape(code) + cse.end; 112 | }) 113 | .replace(c.conditional || skip, function(m, elsecase, code) { 114 | return elsecase ? 115 | (code ? "';}else if(" + unescape(code) + "){out+='" : "';}else{out+='") : 116 | (code ? "';if(" + unescape(code) + "){out+='" : "';}out+='"); 117 | }) 118 | .replace(c.iterate || skip, function(m, iterate, vname, iname) { 119 | if (!iterate) return "';} } out+='"; 120 | sid+=1; indv=iname || "i"+sid; iterate=unescape(iterate); 121 | return "';var arr"+sid+"="+iterate+";if(arr"+sid+"){var "+vname+","+indv+"=-1,l"+sid+"=arr"+sid+".length-1;while("+indv+" { 19 | if (i === this.middleware.length) { 20 | return Promise.resolve(); 21 | } 22 | 23 | let midFn = this.middleware[i]; 24 | 25 | let midFnWrap = () => { 26 | return midFn(ctx, () => { 27 | return dispatch(i+1); 28 | }); 29 | }; 30 | 31 | return Promise.resolve(midFnWrap()); 32 | }; 33 | 34 | return dispatch(0); 35 | } 36 | 37 | listen(port, cb) { 38 | const server = http.createServer((req, res) => { 39 | res.statusCode = 404; 40 | 41 | // TODO ctx 42 | let ctx = {}; 43 | ctx.req = req; 44 | ctx.res = res; 45 | ctx.path = url.parse(req.url).pathname; 46 | ctx.method = req.method; 47 | 48 | let middlewareCompose = this.compose(ctx); 49 | middlewareCompose.then(() => { 50 | // TODO 其他数据类型 51 | let body = ctx.body; 52 | 53 | if (ctx.res.headersSent) { 54 | res.end(); 55 | } else { 56 | res.statusCode = 200; 57 | } 58 | if (body === undefined) { 59 | res.statusCode = 404; 60 | } 61 | 62 | if (body instanceof Stream) { 63 | return body.pipe(res); 64 | } 65 | 66 | if (typeof body !== 'string') { 67 | body = JSON.stringify(body); 68 | } 69 | 70 | res.end(body || 'not found'); 71 | }).catch(err => { 72 | console.log(err); 73 | }) 74 | }); 75 | server.listen(port, cb); 76 | } 77 | }; 78 | -------------------------------------------------------------------------------- /static/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Tiny Koa 8 | 9 | 14 | 15 | 16 |

Tiny Koa

17 | 18 |
19 | http://localhost:8600/api/foo/123 20 |
21 | http://localhost:8600/api/bar 22 |
23 | http://localhost:8600/page/tpl 24 | 25 | 26 | 41 | 42 | -------------------------------------------------------------------------------- /static/script.js: -------------------------------------------------------------------------------- 1 | console.log('Tiny Koa'); 2 | -------------------------------------------------------------------------------- /static/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | background: #fefefe; 3 | } 4 | h1 { 5 | color: lightsalmon; 6 | text-align: center; 7 | } 8 | -------------------------------------------------------------------------------- /test/browser-xhr.js: -------------------------------------------------------------------------------- 1 | var xhr = new XMLHttpRequest(); 2 | xhr.open('post', 'http://localhost:5678/api', true); 3 | xhr.withCredentials = true; 4 | xhr.setRequestHeader('content-type', 'application/json'); 5 | xhr.send(null); 6 | 7 | fetch('http://localhost:5678/api', { 8 | method: 'post', 9 | mode: 'cors', 10 | headers: { 11 | 'Content-Type': 'application/json' 12 | }, 13 | body: JSON.stringify({ 14 | name: 'Hubot', 15 | login: 'hubot', 16 | }) 17 | }); 18 | 19 | fetch('http://localhost:5678/api', { 20 | method: 'post', 21 | mode: 'cors', 22 | headers: { 23 | 'Content-Type': 'application/x-www-form-urlencoded' 24 | }, 25 | body: 'name=user&login=pwd' 26 | }); 27 | -------------------------------------------------------------------------------- /views/tiny.dot: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | {{=it.title}} 8 | 9 | 10 | {{=it.body}} 11 | 12 | 13 | --------------------------------------------------------------------------------