├── .gitignore ├── .travis.yml ├── README.md ├── index.js ├── package-lock.json ├── package.json └── test ├── fixtures ├── answer.js ├── callback.js ├── pingpong.js ├── socket.js └── throw.js └── index.js /.gitignore: -------------------------------------------------------------------------------- 1 | coverage 2 | *.log 3 | node_modules 4 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: false 2 | 3 | language: node_js 4 | 5 | branches: 6 | only: 7 | - master 8 | 9 | node_js: 10 | - 9 11 | - 8 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # IPC EE [![Build Status](https://travis-ci.org/soyuka/IPCEE.svg?branch=master)](https://travis-ci.org/soyuka/IPCEE) 2 | 3 | IPC combined with [EventEmitter2](https://github.com/asyncly/EventEmitter2) 4 | 5 | ## What for? 6 | 7 | First, [RTFM child.send(message[, sendHandle])](https://nodejs.org/api/child_process.html#child_process_child_send_message_sendhandle_options_callback). 8 | 9 | > The sendHandle option to child.send() is for sending a TCP server or socket object to another process. The child will receive the object as its second argument to the message event. 10 | 11 | This means that you won't be able to do things like: 12 | 13 | ```javascript 14 | child.send('message', {some: 'data'}, [data]) 15 | ``` 16 | 17 | This library still works with the [list of accepted instances](https://github.com/nodejs/node/blob/d59917b2a359bf72f12a57ed9a32a3841720b608/lib/internal/child_process.js#L545). Also, if you look a but further in the code, internal messages are handled first. As stated in the docs: 18 | 19 | > There is a special case when sending a {cmd: 'NODE_foo'} message. 20 | 21 | Things apart, this is a fancier api to communicate with child processes! 22 | 23 | Note that I consider this as a low-level module, if you want a higher communication api, take a look at [relieve](https://github.com/soyuka/relieve). I also made a module with the same api using TCP instead of IPC: [TCPEE](https://github.com/soyuka/tcpee). 24 | 25 | ## Usage 26 | 27 | ### Test for child start: 28 | 29 | #### Child 30 | ```javascript 31 | ipc.send('started') 32 | ``` 33 | 34 | #### Master 35 | ```javascript 36 | const child = fork('child') 37 | child.once('started', dosomething) 38 | ``` 39 | 40 | #### Play ping pong: 41 | 42 | #### Child 43 | 44 | ```javascript 45 | const ipc = IPCEE(process) 46 | 47 | ipc.send('started') 48 | 49 | ipc.on('ping', function() { 50 | ipc.send('pong') 51 | }) 52 | ``` 53 | 54 | #### Master 55 | 56 | ```javascript 57 | const server = fork('some/node/app.js') 58 | const client = IPCEE(server) 59 | 60 | client.once('started', () => { 61 | client.send('ping') 62 | }) 63 | 64 | client.once('pong', () => { 65 | console.log('\o/') 66 | }) 67 | ``` 68 | 69 | ### Or play with namespaces: 70 | 71 | #### Child 72 | 73 | ```javascript 74 | const ipc = IPCEE(process, {wildcard: true, delimiter: ':'}) 75 | 76 | ipc.send('started') 77 | 78 | ipc.on('ping:me', () => { 79 | ipc.send('me:pong') 80 | }) 81 | ``` 82 | 83 | #### Master 84 | 85 | ```javascript 86 | const server = fork('some/node/app.js') 87 | const client = IPCEE(server, {wildcard: true, delimiter: ':'}) 88 | 89 | client.once('started', () => { 90 | client.send('ping:*') 91 | }) 92 | 93 | client.once('*:pong', () => { 94 | console.log('\o/') 95 | }) 96 | ``` 97 | 98 | ## Caveat 99 | 100 | Using the first argument of [child_process.send()](https://nodejs.org/api/child_process.html#child_process_child_send_message_sendhandle), Nodejs IPC will transport strings. Javascript objects are encoded with json [internally](https://github.com/nodejs/node/blob/d59917b2a359bf72f12a57ed9a32a3841720b608/lib/internal/child_process.js#L609). That said, You won't be able to pass instances. 101 | 102 | Example: 103 | ```javascript 104 | process.on('uncaughtException', err => { 105 | ipc.send('error', err.toString(), err.stack) 106 | 107 | process.nextTick(() => { 108 | process.exit(1) 109 | }) 110 | }) 111 | ``` 112 | 113 | Here, Temptation would be to send the full Error object but `JSON.stringify(new Error('test')`) will return `'{}'`. 114 | 115 | Note, I made a js to string proof of concept [here](https://github.com/soyuka/eviluation), it could work in some cases. 116 | 117 | ## Native IPC features 118 | 119 | IPCEE does **not** override any of the internals methods. This means that you'll still be able to get messages from the standard way: 120 | 121 | ```js 122 | process.on('message', (m, handle) => { 123 | if(m === 'server') { 124 | //do something with handle 125 | } 126 | }) 127 | ``` 128 | 129 | But it will handle accepted instances in an easy way too. For example, sending a Socket: 130 | 131 | ```js 132 | //server.js 133 | ipc.send('socket', sock) 134 | //child.js 135 | ipc.on('socket', (sock) => { 136 | assert(sock instanceof Socket) 137 | }) 138 | ``` 139 | 140 | ## API 141 | 142 | ```javascript 143 | /** 144 | * Constructor 145 | * @param socket - the process/child_process to write/read to/from 146 | * @param options - eventemitter2 options 147 | */ 148 | const ipcee = new IPCEE(process, {wildcard: true}) 149 | 150 | /** 151 | * @param key - the key you'll listen on 152 | * @param ...args 153 | */ 154 | ipcee.send('key', arg1, arg2) 155 | 156 | /** 157 | * @param key 158 | * @param ...args data received 159 | */ 160 | ipcee.on('key', function(arg1, arg2) { 161 | }) 162 | ``` 163 | 164 | Apart from the `send` method, the api inherits the one of [EventEmitter2](https://github.com/asyncly/EventEmitter2). 165 | 166 | ### Licence 167 | 168 | > The MIT License (MIT) 169 | > 170 | > Copyright (c) 2015 Antoine Bluchet 171 | > 172 | > Permission is hereby granted, free of charge, to any person obtaining a copy 173 | > of this software and associated documentation files (the "Software"), to deal 174 | > in the Software without restriction, including without limitation the rights 175 | > to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 176 | > copies of the Software, and to permit persons to whom the Software is 177 | > furnished to do so, subject to the following conditions: 178 | > 179 | > The above copyright notice and this permission notice shall be included in 180 | > all copies or substantial portions of the Software. 181 | > 182 | > THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 183 | > IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 184 | > FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 185 | > AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 186 | > LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 187 | > OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 188 | > THE SOFTWARE. 189 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const assert = require('assert') 3 | const util = require('util') 4 | const EE = require('eventemitter2').EventEmitter2 5 | 6 | const ACCEPT_HANDLES = [ 7 | require('net').Socket, 8 | require('net').Server, 9 | process.binding('pipe_wrap').Pipe, 10 | process.binding('tcp_wrap').TCP, 11 | process.binding('udp_wrap').UDP, 12 | require('dgram').Socket 13 | ] 14 | 15 | function isHandle (handle) { 16 | for (let i in ACCEPT_HANDLES) { 17 | if (handle instanceof ACCEPT_HANDLES[i]) { 18 | return true 19 | } 20 | } 21 | 22 | return false 23 | } 24 | 25 | /** 26 | * @param ChildProcess child_process an instantiated child process that supports ipc 27 | * @param object options EventEmitter2 options https://github.com/asyncly/EventEmitter2 28 | * @throws AssertionError if ipc is not enabled 29 | */ 30 | function IPCEE (childProcess, options) { 31 | if (!(this instanceof IPCEE)) { return new IPCEE(childProcess, options) } 32 | 33 | assert(childProcess.hasOwnProperty('send'), 'IPC is not enabled') 34 | 35 | this.client = childProcess 36 | 37 | this._hookEvents() 38 | 39 | // eventemitter2 wants an error event to be registered 40 | this.on('error', function () {}) 41 | 42 | EE.call(this, options) 43 | } 44 | 45 | util.inherits(IPCEE, EE) 46 | 47 | /** 48 | * Replicate the child_process.send with an array of arguments 49 | * @param mixed 50 | * @return this 51 | */ 52 | IPCEE.prototype.send = function () { 53 | let args = [].slice.call(arguments) 54 | let callback = args.slice(-1)[0] 55 | 56 | if (isHandle(args[1])) { 57 | if (typeof callback === 'function') { 58 | this.client.send(args[0], args[1], callback) 59 | } else { 60 | this.client.send(args[0], args[1]) 61 | } 62 | } else { 63 | if (typeof callback === 'function') { 64 | args.pop() 65 | this.client.send(args, callback) 66 | } else { 67 | this.client.send(args) 68 | } 69 | } 70 | 71 | return this 72 | } 73 | 74 | /** 75 | * Replicate the child_process.on('message') by taking an array of arguments 76 | * @param array args 77 | * @return this 78 | */ 79 | IPCEE.prototype.onmessage = function (args) { 80 | if (Array.isArray(args)) { 81 | // emit the real event (args[0]) with arguments 82 | this.emit.apply(this, args) 83 | 84 | return this 85 | } 86 | 87 | // no array, events have a handle, emit args[0] with the handle 88 | let realArgs = [].slice.call(arguments) 89 | this.emit.apply(this, realArgs) 90 | 91 | return this 92 | } 93 | 94 | /** 95 | * Replicate the exit event and clean IPCEE events 96 | * @param integer code 97 | * @return void 98 | */ 99 | IPCEE.prototype.onexit = function (code) { 100 | this._removeEvents() 101 | this.emit('exit', code) 102 | delete this.client 103 | } 104 | 105 | /** 106 | * Add listeners (message and exit) 107 | * @return void 108 | */ 109 | IPCEE.prototype._hookEvents = function () { 110 | this.client.addListener('message', this.onmessage.bind(this)) 111 | this.client.addListener('exit', this.onexit.bind(this)) 112 | } 113 | 114 | /** 115 | * Remove listeners (message and exit) 116 | * @return void 117 | */ 118 | IPCEE.prototype._removeEvents = function () { 119 | this.client.removeListener('message', this.onmessage.bind(this)) 120 | this.client.removeListener('exit', this.onexit.bind(this)) 121 | } 122 | 123 | module.exports = IPCEE 124 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ipcee", 3 | "version": "2.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "acorn": { 8 | "version": "5.3.0", 9 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.3.0.tgz", 10 | "integrity": "sha512-Yej+zOJ1Dm/IMZzzj78OntP/r3zHEaKcyNoU2lAaxPtrseM6rF0xwqoz5Q5ysAiED9hTjI2hgtvLXitlCN1/Ug==", 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.3.0" 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": "4.11.8", 32 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", 33 | "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", 34 | "dev": true, 35 | "requires": { 36 | "co": "4.6.0", 37 | "json-stable-stringify": "1.0.1" 38 | } 39 | }, 40 | "ajv-keywords": { 41 | "version": "1.5.1", 42 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", 43 | "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", 44 | "dev": true 45 | }, 46 | "ansi-escapes": { 47 | "version": "1.4.0", 48 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", 49 | "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", 50 | "dev": true 51 | }, 52 | "ansi-regex": { 53 | "version": "2.1.1", 54 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 55 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 56 | "dev": true 57 | }, 58 | "ansi-styles": { 59 | "version": "2.2.1", 60 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 61 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 62 | "dev": true 63 | }, 64 | "argparse": { 65 | "version": "1.0.9", 66 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", 67 | "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", 68 | "dev": true, 69 | "requires": { 70 | "sprintf-js": "1.0.3" 71 | } 72 | }, 73 | "array-union": { 74 | "version": "1.0.2", 75 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", 76 | "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", 77 | "dev": true, 78 | "requires": { 79 | "array-uniq": "1.0.3" 80 | } 81 | }, 82 | "array-uniq": { 83 | "version": "1.0.3", 84 | "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", 85 | "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", 86 | "dev": true 87 | }, 88 | "array.prototype.find": { 89 | "version": "2.0.4", 90 | "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.0.4.tgz", 91 | "integrity": "sha1-VWpcU2LAhkgyPdrrnenRS8GGTJA=", 92 | "dev": true, 93 | "requires": { 94 | "define-properties": "1.1.2", 95 | "es-abstract": "1.10.0" 96 | } 97 | }, 98 | "arrify": { 99 | "version": "1.0.1", 100 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", 101 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", 102 | "dev": true 103 | }, 104 | "assertion-error": { 105 | "version": "1.1.0", 106 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", 107 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", 108 | "dev": true 109 | }, 110 | "babel-code-frame": { 111 | "version": "6.26.0", 112 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", 113 | "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", 114 | "dev": true, 115 | "requires": { 116 | "chalk": "1.1.3", 117 | "esutils": "2.0.2", 118 | "js-tokens": "3.0.2" 119 | } 120 | }, 121 | "balanced-match": { 122 | "version": "1.0.0", 123 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 124 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 125 | "dev": true 126 | }, 127 | "brace-expansion": { 128 | "version": "1.1.8", 129 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", 130 | "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", 131 | "dev": true, 132 | "requires": { 133 | "balanced-match": "1.0.0", 134 | "concat-map": "0.0.1" 135 | } 136 | }, 137 | "browser-stdout": { 138 | "version": "1.3.0", 139 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", 140 | "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", 141 | "dev": true 142 | }, 143 | "builtin-modules": { 144 | "version": "1.1.1", 145 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 146 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", 147 | "dev": true 148 | }, 149 | "caller-path": { 150 | "version": "0.1.0", 151 | "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", 152 | "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", 153 | "dev": true, 154 | "requires": { 155 | "callsites": "0.2.0" 156 | } 157 | }, 158 | "callsites": { 159 | "version": "0.2.0", 160 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", 161 | "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", 162 | "dev": true 163 | }, 164 | "chai": { 165 | "version": "4.1.2", 166 | "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", 167 | "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", 168 | "dev": true, 169 | "requires": { 170 | "assertion-error": "1.1.0", 171 | "check-error": "1.0.2", 172 | "deep-eql": "3.0.1", 173 | "get-func-name": "2.0.0", 174 | "pathval": "1.1.0", 175 | "type-detect": "4.0.5" 176 | } 177 | }, 178 | "chalk": { 179 | "version": "1.1.3", 180 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 181 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 182 | "dev": true, 183 | "requires": { 184 | "ansi-styles": "2.2.1", 185 | "escape-string-regexp": "1.0.5", 186 | "has-ansi": "2.0.0", 187 | "strip-ansi": "3.0.1", 188 | "supports-color": "2.0.0" 189 | }, 190 | "dependencies": { 191 | "supports-color": { 192 | "version": "2.0.0", 193 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 194 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 195 | "dev": true 196 | } 197 | } 198 | }, 199 | "check-error": { 200 | "version": "1.0.2", 201 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", 202 | "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", 203 | "dev": true 204 | }, 205 | "circular-json": { 206 | "version": "0.3.3", 207 | "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", 208 | "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", 209 | "dev": true 210 | }, 211 | "cli-cursor": { 212 | "version": "1.0.2", 213 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", 214 | "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", 215 | "dev": true, 216 | "requires": { 217 | "restore-cursor": "1.0.1" 218 | } 219 | }, 220 | "cli-width": { 221 | "version": "2.2.0", 222 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", 223 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", 224 | "dev": true 225 | }, 226 | "co": { 227 | "version": "4.6.0", 228 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 229 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", 230 | "dev": true 231 | }, 232 | "code-point-at": { 233 | "version": "1.1.0", 234 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 235 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", 236 | "dev": true 237 | }, 238 | "commander": { 239 | "version": "2.11.0", 240 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", 241 | "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", 242 | "dev": true 243 | }, 244 | "concat-map": { 245 | "version": "0.0.1", 246 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 247 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 248 | "dev": true 249 | }, 250 | "concat-stream": { 251 | "version": "1.6.0", 252 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", 253 | "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", 254 | "dev": true, 255 | "requires": { 256 | "inherits": "2.0.3", 257 | "readable-stream": "2.3.3", 258 | "typedarray": "0.0.6" 259 | } 260 | }, 261 | "contains-path": { 262 | "version": "0.1.0", 263 | "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", 264 | "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", 265 | "dev": true 266 | }, 267 | "core-util-is": { 268 | "version": "1.0.2", 269 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 270 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 271 | "dev": true 272 | }, 273 | "d": { 274 | "version": "1.0.0", 275 | "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", 276 | "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", 277 | "dev": true, 278 | "requires": { 279 | "es5-ext": "0.10.37" 280 | } 281 | }, 282 | "debug": { 283 | "version": "3.1.0", 284 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 285 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 286 | "dev": true, 287 | "requires": { 288 | "ms": "2.0.0" 289 | } 290 | }, 291 | "debug-log": { 292 | "version": "1.0.1", 293 | "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", 294 | "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", 295 | "dev": true 296 | }, 297 | "deep-eql": { 298 | "version": "3.0.1", 299 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", 300 | "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", 301 | "dev": true, 302 | "requires": { 303 | "type-detect": "4.0.5" 304 | } 305 | }, 306 | "deep-is": { 307 | "version": "0.1.3", 308 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 309 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 310 | "dev": true 311 | }, 312 | "define-properties": { 313 | "version": "1.1.2", 314 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", 315 | "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", 316 | "dev": true, 317 | "requires": { 318 | "foreach": "2.0.5", 319 | "object-keys": "1.0.11" 320 | } 321 | }, 322 | "deglob": { 323 | "version": "2.1.0", 324 | "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.0.tgz", 325 | "integrity": "sha1-TUSr4W7zLHebSXK9FBqAMlApoUo=", 326 | "dev": true, 327 | "requires": { 328 | "find-root": "1.1.0", 329 | "glob": "7.1.2", 330 | "ignore": "3.3.7", 331 | "pkg-config": "1.1.1", 332 | "run-parallel": "1.1.6", 333 | "uniq": "1.0.1" 334 | } 335 | }, 336 | "del": { 337 | "version": "2.2.2", 338 | "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", 339 | "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", 340 | "dev": true, 341 | "requires": { 342 | "globby": "5.0.0", 343 | "is-path-cwd": "1.0.0", 344 | "is-path-in-cwd": "1.0.0", 345 | "object-assign": "4.1.1", 346 | "pify": "2.3.0", 347 | "pinkie-promise": "2.0.1", 348 | "rimraf": "2.6.2" 349 | } 350 | }, 351 | "diff": { 352 | "version": "3.3.1", 353 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", 354 | "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", 355 | "dev": true 356 | }, 357 | "doctrine": { 358 | "version": "2.1.0", 359 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", 360 | "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", 361 | "dev": true, 362 | "requires": { 363 | "esutils": "2.0.2" 364 | } 365 | }, 366 | "error-ex": { 367 | "version": "1.3.1", 368 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", 369 | "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", 370 | "dev": true, 371 | "requires": { 372 | "is-arrayish": "0.2.1" 373 | } 374 | }, 375 | "es-abstract": { 376 | "version": "1.10.0", 377 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.10.0.tgz", 378 | "integrity": "sha512-/uh/DhdqIOSkAWifU+8nG78vlQxdLckUdI/sPgy0VhuXi2qJ7T8czBmqIYtLQVpCIFYafChnsRsB5pyb1JdmCQ==", 379 | "dev": true, 380 | "requires": { 381 | "es-to-primitive": "1.1.1", 382 | "function-bind": "1.1.1", 383 | "has": "1.0.1", 384 | "is-callable": "1.1.3", 385 | "is-regex": "1.0.4" 386 | } 387 | }, 388 | "es-to-primitive": { 389 | "version": "1.1.1", 390 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", 391 | "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", 392 | "dev": true, 393 | "requires": { 394 | "is-callable": "1.1.3", 395 | "is-date-object": "1.0.1", 396 | "is-symbol": "1.0.1" 397 | } 398 | }, 399 | "es5-ext": { 400 | "version": "0.10.37", 401 | "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.37.tgz", 402 | "integrity": "sha1-DudB0Ui4AGm6J9AgOTdWryV978M=", 403 | "dev": true, 404 | "requires": { 405 | "es6-iterator": "2.0.3", 406 | "es6-symbol": "3.1.1" 407 | } 408 | }, 409 | "es6-iterator": { 410 | "version": "2.0.3", 411 | "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", 412 | "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", 413 | "dev": true, 414 | "requires": { 415 | "d": "1.0.0", 416 | "es5-ext": "0.10.37", 417 | "es6-symbol": "3.1.1" 418 | } 419 | }, 420 | "es6-map": { 421 | "version": "0.1.5", 422 | "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", 423 | "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", 424 | "dev": true, 425 | "requires": { 426 | "d": "1.0.0", 427 | "es5-ext": "0.10.37", 428 | "es6-iterator": "2.0.3", 429 | "es6-set": "0.1.5", 430 | "es6-symbol": "3.1.1", 431 | "event-emitter": "0.3.5" 432 | } 433 | }, 434 | "es6-set": { 435 | "version": "0.1.5", 436 | "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", 437 | "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", 438 | "dev": true, 439 | "requires": { 440 | "d": "1.0.0", 441 | "es5-ext": "0.10.37", 442 | "es6-iterator": "2.0.3", 443 | "es6-symbol": "3.1.1", 444 | "event-emitter": "0.3.5" 445 | } 446 | }, 447 | "es6-symbol": { 448 | "version": "3.1.1", 449 | "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", 450 | "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", 451 | "dev": true, 452 | "requires": { 453 | "d": "1.0.0", 454 | "es5-ext": "0.10.37" 455 | } 456 | }, 457 | "es6-weak-map": { 458 | "version": "2.0.2", 459 | "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", 460 | "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", 461 | "dev": true, 462 | "requires": { 463 | "d": "1.0.0", 464 | "es5-ext": "0.10.37", 465 | "es6-iterator": "2.0.3", 466 | "es6-symbol": "3.1.1" 467 | } 468 | }, 469 | "escape-string-regexp": { 470 | "version": "1.0.5", 471 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 472 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 473 | "dev": true 474 | }, 475 | "escope": { 476 | "version": "3.6.0", 477 | "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", 478 | "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", 479 | "dev": true, 480 | "requires": { 481 | "es6-map": "0.1.5", 482 | "es6-weak-map": "2.0.2", 483 | "esrecurse": "4.2.0", 484 | "estraverse": "4.2.0" 485 | } 486 | }, 487 | "eslint": { 488 | "version": "3.19.0", 489 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", 490 | "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", 491 | "dev": true, 492 | "requires": { 493 | "babel-code-frame": "6.26.0", 494 | "chalk": "1.1.3", 495 | "concat-stream": "1.6.0", 496 | "debug": "2.6.9", 497 | "doctrine": "2.1.0", 498 | "escope": "3.6.0", 499 | "espree": "3.5.2", 500 | "esquery": "1.0.0", 501 | "estraverse": "4.2.0", 502 | "esutils": "2.0.2", 503 | "file-entry-cache": "2.0.0", 504 | "glob": "7.1.2", 505 | "globals": "9.18.0", 506 | "ignore": "3.3.7", 507 | "imurmurhash": "0.1.4", 508 | "inquirer": "0.12.0", 509 | "is-my-json-valid": "2.17.1", 510 | "is-resolvable": "1.0.1", 511 | "js-yaml": "3.10.0", 512 | "json-stable-stringify": "1.0.1", 513 | "levn": "0.3.0", 514 | "lodash": "4.17.4", 515 | "mkdirp": "0.5.1", 516 | "natural-compare": "1.4.0", 517 | "optionator": "0.8.2", 518 | "path-is-inside": "1.0.2", 519 | "pluralize": "1.2.1", 520 | "progress": "1.1.8", 521 | "require-uncached": "1.0.3", 522 | "shelljs": "0.7.8", 523 | "strip-bom": "3.0.0", 524 | "strip-json-comments": "2.0.1", 525 | "table": "3.8.3", 526 | "text-table": "0.2.0", 527 | "user-home": "2.0.0" 528 | }, 529 | "dependencies": { 530 | "debug": { 531 | "version": "2.6.9", 532 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 533 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 534 | "dev": true, 535 | "requires": { 536 | "ms": "2.0.0" 537 | } 538 | } 539 | } 540 | }, 541 | "eslint-config-standard": { 542 | "version": "10.2.1", 543 | "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-10.2.1.tgz", 544 | "integrity": "sha1-wGHk0GbzedwXzVYsZOgZtN1FRZE=", 545 | "dev": true 546 | }, 547 | "eslint-config-standard-jsx": { 548 | "version": "4.0.2", 549 | "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-4.0.2.tgz", 550 | "integrity": "sha512-F8fRh2WFnTek7dZH9ZaE0PCBwdVGkwVWZmizla/DDNOmg7Tx6B/IlK5+oYpiX29jpu73LszeJj5i1axEZv6VMw==", 551 | "dev": true 552 | }, 553 | "eslint-import-resolver-node": { 554 | "version": "0.2.3", 555 | "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz", 556 | "integrity": "sha1-Wt2BBujJKNssuiMrzZ76hG49oWw=", 557 | "dev": true, 558 | "requires": { 559 | "debug": "2.6.9", 560 | "object-assign": "4.1.1", 561 | "resolve": "1.5.0" 562 | }, 563 | "dependencies": { 564 | "debug": { 565 | "version": "2.6.9", 566 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 567 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 568 | "dev": true, 569 | "requires": { 570 | "ms": "2.0.0" 571 | } 572 | } 573 | } 574 | }, 575 | "eslint-module-utils": { 576 | "version": "2.1.1", 577 | "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz", 578 | "integrity": "sha512-jDI/X5l/6D1rRD/3T43q8Qgbls2nq5km5KSqiwlyUbGo5+04fXhMKdCPhjwbqAa6HXWaMxj8Q4hQDIh7IadJQw==", 579 | "dev": true, 580 | "requires": { 581 | "debug": "2.6.9", 582 | "pkg-dir": "1.0.0" 583 | }, 584 | "dependencies": { 585 | "debug": { 586 | "version": "2.6.9", 587 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 588 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 589 | "dev": true, 590 | "requires": { 591 | "ms": "2.0.0" 592 | } 593 | } 594 | } 595 | }, 596 | "eslint-plugin-import": { 597 | "version": "2.2.0", 598 | "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.2.0.tgz", 599 | "integrity": "sha1-crowb60wXWfEgWNIpGmaQimsi04=", 600 | "dev": true, 601 | "requires": { 602 | "builtin-modules": "1.1.1", 603 | "contains-path": "0.1.0", 604 | "debug": "2.6.9", 605 | "doctrine": "1.5.0", 606 | "eslint-import-resolver-node": "0.2.3", 607 | "eslint-module-utils": "2.1.1", 608 | "has": "1.0.1", 609 | "lodash.cond": "4.5.2", 610 | "minimatch": "3.0.4", 611 | "pkg-up": "1.0.0" 612 | }, 613 | "dependencies": { 614 | "debug": { 615 | "version": "2.6.9", 616 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 617 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 618 | "dev": true, 619 | "requires": { 620 | "ms": "2.0.0" 621 | } 622 | }, 623 | "doctrine": { 624 | "version": "1.5.0", 625 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", 626 | "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", 627 | "dev": true, 628 | "requires": { 629 | "esutils": "2.0.2", 630 | "isarray": "1.0.0" 631 | } 632 | } 633 | } 634 | }, 635 | "eslint-plugin-node": { 636 | "version": "4.2.3", 637 | "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-4.2.3.tgz", 638 | "integrity": "sha512-vIUQPuwbVYdz/CYnlTLsJrRy7iXHQjdEe5wz0XhhdTym3IInM/zZLlPf9nZ2mThsH0QcsieCOWs2vOeCy/22LQ==", 639 | "dev": true, 640 | "requires": { 641 | "ignore": "3.3.7", 642 | "minimatch": "3.0.4", 643 | "object-assign": "4.1.1", 644 | "resolve": "1.5.0", 645 | "semver": "5.3.0" 646 | } 647 | }, 648 | "eslint-plugin-promise": { 649 | "version": "3.5.0", 650 | "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.5.0.tgz", 651 | "integrity": "sha1-ePu2/+BHIBYnVp6FpsU3OvKmj8o=", 652 | "dev": true 653 | }, 654 | "eslint-plugin-react": { 655 | "version": "6.10.3", 656 | "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-6.10.3.tgz", 657 | "integrity": "sha1-xUNb6wZ3ThLH2y9qut3L+QDNP3g=", 658 | "dev": true, 659 | "requires": { 660 | "array.prototype.find": "2.0.4", 661 | "doctrine": "1.5.0", 662 | "has": "1.0.1", 663 | "jsx-ast-utils": "1.4.1", 664 | "object.assign": "4.1.0" 665 | }, 666 | "dependencies": { 667 | "doctrine": { 668 | "version": "1.5.0", 669 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", 670 | "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", 671 | "dev": true, 672 | "requires": { 673 | "esutils": "2.0.2", 674 | "isarray": "1.0.0" 675 | } 676 | } 677 | } 678 | }, 679 | "eslint-plugin-standard": { 680 | "version": "3.0.1", 681 | "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-3.0.1.tgz", 682 | "integrity": "sha1-NNDJFbRe3G8BA5PH7vOCOwhWXPI=", 683 | "dev": true 684 | }, 685 | "espree": { 686 | "version": "3.5.2", 687 | "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.2.tgz", 688 | "integrity": "sha512-sadKeYwaR/aJ3stC2CdvgXu1T16TdYN+qwCpcWbMnGJ8s0zNWemzrvb2GbD4OhmJ/fwpJjudThAlLobGbWZbCQ==", 689 | "dev": true, 690 | "requires": { 691 | "acorn": "5.3.0", 692 | "acorn-jsx": "3.0.1" 693 | } 694 | }, 695 | "esprima": { 696 | "version": "4.0.0", 697 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", 698 | "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", 699 | "dev": true 700 | }, 701 | "esquery": { 702 | "version": "1.0.0", 703 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", 704 | "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", 705 | "dev": true, 706 | "requires": { 707 | "estraverse": "4.2.0" 708 | } 709 | }, 710 | "esrecurse": { 711 | "version": "4.2.0", 712 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", 713 | "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", 714 | "dev": true, 715 | "requires": { 716 | "estraverse": "4.2.0", 717 | "object-assign": "4.1.1" 718 | } 719 | }, 720 | "estraverse": { 721 | "version": "4.2.0", 722 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", 723 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", 724 | "dev": true 725 | }, 726 | "esutils": { 727 | "version": "2.0.2", 728 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 729 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 730 | "dev": true 731 | }, 732 | "event-emitter": { 733 | "version": "0.3.5", 734 | "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", 735 | "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", 736 | "dev": true, 737 | "requires": { 738 | "d": "1.0.0", 739 | "es5-ext": "0.10.37" 740 | } 741 | }, 742 | "eventemitter2": { 743 | "version": "5.0.1", 744 | "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz", 745 | "integrity": "sha1-YZegldX7a1folC9v1+qtY6CclFI=" 746 | }, 747 | "exit-hook": { 748 | "version": "1.1.1", 749 | "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", 750 | "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", 751 | "dev": true 752 | }, 753 | "fast-levenshtein": { 754 | "version": "2.0.6", 755 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 756 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 757 | "dev": true 758 | }, 759 | "figures": { 760 | "version": "1.7.0", 761 | "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", 762 | "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", 763 | "dev": true, 764 | "requires": { 765 | "escape-string-regexp": "1.0.5", 766 | "object-assign": "4.1.1" 767 | } 768 | }, 769 | "file-entry-cache": { 770 | "version": "2.0.0", 771 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", 772 | "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", 773 | "dev": true, 774 | "requires": { 775 | "flat-cache": "1.3.0", 776 | "object-assign": "4.1.1" 777 | } 778 | }, 779 | "find-root": { 780 | "version": "1.1.0", 781 | "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", 782 | "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", 783 | "dev": true 784 | }, 785 | "find-up": { 786 | "version": "1.1.2", 787 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", 788 | "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", 789 | "dev": true, 790 | "requires": { 791 | "path-exists": "2.1.0", 792 | "pinkie-promise": "2.0.1" 793 | } 794 | }, 795 | "flat-cache": { 796 | "version": "1.3.0", 797 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", 798 | "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", 799 | "dev": true, 800 | "requires": { 801 | "circular-json": "0.3.3", 802 | "del": "2.2.2", 803 | "graceful-fs": "4.1.11", 804 | "write": "0.2.1" 805 | } 806 | }, 807 | "foreach": { 808 | "version": "2.0.5", 809 | "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", 810 | "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", 811 | "dev": true 812 | }, 813 | "fs.realpath": { 814 | "version": "1.0.0", 815 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 816 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 817 | "dev": true 818 | }, 819 | "function-bind": { 820 | "version": "1.1.1", 821 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 822 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 823 | "dev": true 824 | }, 825 | "generate-function": { 826 | "version": "2.0.0", 827 | "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", 828 | "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", 829 | "dev": true 830 | }, 831 | "generate-object-property": { 832 | "version": "1.2.0", 833 | "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", 834 | "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", 835 | "dev": true, 836 | "requires": { 837 | "is-property": "1.0.2" 838 | } 839 | }, 840 | "get-func-name": { 841 | "version": "2.0.0", 842 | "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", 843 | "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", 844 | "dev": true 845 | }, 846 | "get-stdin": { 847 | "version": "5.0.1", 848 | "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", 849 | "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", 850 | "dev": true 851 | }, 852 | "glob": { 853 | "version": "7.1.2", 854 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 855 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 856 | "dev": true, 857 | "requires": { 858 | "fs.realpath": "1.0.0", 859 | "inflight": "1.0.6", 860 | "inherits": "2.0.3", 861 | "minimatch": "3.0.4", 862 | "once": "1.4.0", 863 | "path-is-absolute": "1.0.1" 864 | } 865 | }, 866 | "globals": { 867 | "version": "9.18.0", 868 | "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", 869 | "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", 870 | "dev": true 871 | }, 872 | "globby": { 873 | "version": "5.0.0", 874 | "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", 875 | "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", 876 | "dev": true, 877 | "requires": { 878 | "array-union": "1.0.2", 879 | "arrify": "1.0.1", 880 | "glob": "7.1.2", 881 | "object-assign": "4.1.1", 882 | "pify": "2.3.0", 883 | "pinkie-promise": "2.0.1" 884 | } 885 | }, 886 | "graceful-fs": { 887 | "version": "4.1.11", 888 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 889 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", 890 | "dev": true 891 | }, 892 | "growl": { 893 | "version": "1.10.3", 894 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", 895 | "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", 896 | "dev": true 897 | }, 898 | "has": { 899 | "version": "1.0.1", 900 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", 901 | "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", 902 | "dev": true, 903 | "requires": { 904 | "function-bind": "1.1.1" 905 | } 906 | }, 907 | "has-ansi": { 908 | "version": "2.0.0", 909 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 910 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 911 | "dev": true, 912 | "requires": { 913 | "ansi-regex": "2.1.1" 914 | } 915 | }, 916 | "has-flag": { 917 | "version": "2.0.0", 918 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", 919 | "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", 920 | "dev": true 921 | }, 922 | "has-symbols": { 923 | "version": "1.0.0", 924 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", 925 | "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", 926 | "dev": true 927 | }, 928 | "he": { 929 | "version": "1.1.1", 930 | "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", 931 | "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", 932 | "dev": true 933 | }, 934 | "ignore": { 935 | "version": "3.3.7", 936 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", 937 | "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", 938 | "dev": true 939 | }, 940 | "imurmurhash": { 941 | "version": "0.1.4", 942 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 943 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 944 | "dev": true 945 | }, 946 | "inflight": { 947 | "version": "1.0.6", 948 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 949 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 950 | "dev": true, 951 | "requires": { 952 | "once": "1.4.0", 953 | "wrappy": "1.0.2" 954 | } 955 | }, 956 | "inherits": { 957 | "version": "2.0.3", 958 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 959 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 960 | "dev": true 961 | }, 962 | "inquirer": { 963 | "version": "0.12.0", 964 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", 965 | "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", 966 | "dev": true, 967 | "requires": { 968 | "ansi-escapes": "1.4.0", 969 | "ansi-regex": "2.1.1", 970 | "chalk": "1.1.3", 971 | "cli-cursor": "1.0.2", 972 | "cli-width": "2.2.0", 973 | "figures": "1.7.0", 974 | "lodash": "4.17.4", 975 | "readline2": "1.0.1", 976 | "run-async": "0.1.0", 977 | "rx-lite": "3.1.2", 978 | "string-width": "1.0.2", 979 | "strip-ansi": "3.0.1", 980 | "through": "2.3.8" 981 | } 982 | }, 983 | "interpret": { 984 | "version": "1.1.0", 985 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", 986 | "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", 987 | "dev": true 988 | }, 989 | "is-arrayish": { 990 | "version": "0.2.1", 991 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 992 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 993 | "dev": true 994 | }, 995 | "is-callable": { 996 | "version": "1.1.3", 997 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", 998 | "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", 999 | "dev": true 1000 | }, 1001 | "is-date-object": { 1002 | "version": "1.0.1", 1003 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", 1004 | "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", 1005 | "dev": true 1006 | }, 1007 | "is-fullwidth-code-point": { 1008 | "version": "1.0.0", 1009 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 1010 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 1011 | "dev": true, 1012 | "requires": { 1013 | "number-is-nan": "1.0.1" 1014 | } 1015 | }, 1016 | "is-my-json-valid": { 1017 | "version": "2.17.1", 1018 | "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.1.tgz", 1019 | "integrity": "sha512-Q2khNw+oBlWuaYvEEHtKSw/pCxD2L5Rc1C+UQme9X6JdRDh7m5D7HkozA0qa3DUkQ6VzCnEm8mVIQPyIRkI5sQ==", 1020 | "dev": true, 1021 | "requires": { 1022 | "generate-function": "2.0.0", 1023 | "generate-object-property": "1.2.0", 1024 | "jsonpointer": "4.0.1", 1025 | "xtend": "4.0.1" 1026 | } 1027 | }, 1028 | "is-path-cwd": { 1029 | "version": "1.0.0", 1030 | "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", 1031 | "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", 1032 | "dev": true 1033 | }, 1034 | "is-path-in-cwd": { 1035 | "version": "1.0.0", 1036 | "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", 1037 | "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", 1038 | "dev": true, 1039 | "requires": { 1040 | "is-path-inside": "1.0.1" 1041 | } 1042 | }, 1043 | "is-path-inside": { 1044 | "version": "1.0.1", 1045 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", 1046 | "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", 1047 | "dev": true, 1048 | "requires": { 1049 | "path-is-inside": "1.0.2" 1050 | } 1051 | }, 1052 | "is-property": { 1053 | "version": "1.0.2", 1054 | "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", 1055 | "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", 1056 | "dev": true 1057 | }, 1058 | "is-regex": { 1059 | "version": "1.0.4", 1060 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", 1061 | "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", 1062 | "dev": true, 1063 | "requires": { 1064 | "has": "1.0.1" 1065 | } 1066 | }, 1067 | "is-resolvable": { 1068 | "version": "1.0.1", 1069 | "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.1.tgz", 1070 | "integrity": "sha512-y5CXYbzvB3jTnWAZH1Nl7ykUWb6T3BcTs56HUruwBf8MhF56n1HWqhDWnVFo8GHrUPDgvUUNVhrc2U8W7iqz5g==", 1071 | "dev": true 1072 | }, 1073 | "is-symbol": { 1074 | "version": "1.0.1", 1075 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", 1076 | "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", 1077 | "dev": true 1078 | }, 1079 | "isarray": { 1080 | "version": "1.0.0", 1081 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1082 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 1083 | "dev": true 1084 | }, 1085 | "js-tokens": { 1086 | "version": "3.0.2", 1087 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", 1088 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", 1089 | "dev": true 1090 | }, 1091 | "js-yaml": { 1092 | "version": "3.10.0", 1093 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", 1094 | "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", 1095 | "dev": true, 1096 | "requires": { 1097 | "argparse": "1.0.9", 1098 | "esprima": "4.0.0" 1099 | } 1100 | }, 1101 | "json-parse-better-errors": { 1102 | "version": "1.0.1", 1103 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz", 1104 | "integrity": "sha512-xyQpxeWWMKyJps9CuGJYeng6ssI5bpqS9ltQpdVQ90t4ql6NdnxFKh95JcRt2cun/DjMVNrdjniLPuMA69xmCw==", 1105 | "dev": true 1106 | }, 1107 | "json-stable-stringify": { 1108 | "version": "1.0.1", 1109 | "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", 1110 | "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", 1111 | "dev": true, 1112 | "requires": { 1113 | "jsonify": "0.0.0" 1114 | } 1115 | }, 1116 | "jsonify": { 1117 | "version": "0.0.0", 1118 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", 1119 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", 1120 | "dev": true 1121 | }, 1122 | "jsonpointer": { 1123 | "version": "4.0.1", 1124 | "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", 1125 | "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", 1126 | "dev": true 1127 | }, 1128 | "jsx-ast-utils": { 1129 | "version": "1.4.1", 1130 | "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz", 1131 | "integrity": "sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE=", 1132 | "dev": true 1133 | }, 1134 | "levn": { 1135 | "version": "0.3.0", 1136 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 1137 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 1138 | "dev": true, 1139 | "requires": { 1140 | "prelude-ls": "1.1.2", 1141 | "type-check": "0.3.2" 1142 | } 1143 | }, 1144 | "load-json-file": { 1145 | "version": "4.0.0", 1146 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", 1147 | "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", 1148 | "dev": true, 1149 | "requires": { 1150 | "graceful-fs": "4.1.11", 1151 | "parse-json": "4.0.0", 1152 | "pify": "3.0.0", 1153 | "strip-bom": "3.0.0" 1154 | }, 1155 | "dependencies": { 1156 | "pify": { 1157 | "version": "3.0.0", 1158 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 1159 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", 1160 | "dev": true 1161 | } 1162 | } 1163 | }, 1164 | "locate-path": { 1165 | "version": "2.0.0", 1166 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", 1167 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", 1168 | "dev": true, 1169 | "requires": { 1170 | "p-locate": "2.0.0", 1171 | "path-exists": "3.0.0" 1172 | }, 1173 | "dependencies": { 1174 | "path-exists": { 1175 | "version": "3.0.0", 1176 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 1177 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 1178 | "dev": true 1179 | } 1180 | } 1181 | }, 1182 | "lodash": { 1183 | "version": "4.17.4", 1184 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", 1185 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", 1186 | "dev": true 1187 | }, 1188 | "lodash.cond": { 1189 | "version": "4.5.2", 1190 | "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", 1191 | "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", 1192 | "dev": true 1193 | }, 1194 | "minimatch": { 1195 | "version": "3.0.4", 1196 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1197 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1198 | "dev": true, 1199 | "requires": { 1200 | "brace-expansion": "1.1.8" 1201 | } 1202 | }, 1203 | "minimist": { 1204 | "version": "0.0.8", 1205 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1206 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 1207 | "dev": true 1208 | }, 1209 | "mkdirp": { 1210 | "version": "0.5.1", 1211 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1212 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 1213 | "dev": true, 1214 | "requires": { 1215 | "minimist": "0.0.8" 1216 | } 1217 | }, 1218 | "mocha": { 1219 | "version": "4.1.0", 1220 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", 1221 | "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", 1222 | "dev": true, 1223 | "requires": { 1224 | "browser-stdout": "1.3.0", 1225 | "commander": "2.11.0", 1226 | "debug": "3.1.0", 1227 | "diff": "3.3.1", 1228 | "escape-string-regexp": "1.0.5", 1229 | "glob": "7.1.2", 1230 | "growl": "1.10.3", 1231 | "he": "1.1.1", 1232 | "mkdirp": "0.5.1", 1233 | "supports-color": "4.4.0" 1234 | } 1235 | }, 1236 | "ms": { 1237 | "version": "2.0.0", 1238 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1239 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 1240 | "dev": true 1241 | }, 1242 | "mute-stream": { 1243 | "version": "0.0.5", 1244 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", 1245 | "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", 1246 | "dev": true 1247 | }, 1248 | "natural-compare": { 1249 | "version": "1.4.0", 1250 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1251 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 1252 | "dev": true 1253 | }, 1254 | "number-is-nan": { 1255 | "version": "1.0.1", 1256 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 1257 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", 1258 | "dev": true 1259 | }, 1260 | "object-assign": { 1261 | "version": "4.1.1", 1262 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1263 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 1264 | "dev": true 1265 | }, 1266 | "object-keys": { 1267 | "version": "1.0.11", 1268 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", 1269 | "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", 1270 | "dev": true 1271 | }, 1272 | "object.assign": { 1273 | "version": "4.1.0", 1274 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", 1275 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", 1276 | "dev": true, 1277 | "requires": { 1278 | "define-properties": "1.1.2", 1279 | "function-bind": "1.1.1", 1280 | "has-symbols": "1.0.0", 1281 | "object-keys": "1.0.11" 1282 | } 1283 | }, 1284 | "once": { 1285 | "version": "1.4.0", 1286 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1287 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1288 | "dev": true, 1289 | "requires": { 1290 | "wrappy": "1.0.2" 1291 | } 1292 | }, 1293 | "onetime": { 1294 | "version": "1.1.0", 1295 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", 1296 | "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", 1297 | "dev": true 1298 | }, 1299 | "optionator": { 1300 | "version": "0.8.2", 1301 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", 1302 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 1303 | "dev": true, 1304 | "requires": { 1305 | "deep-is": "0.1.3", 1306 | "fast-levenshtein": "2.0.6", 1307 | "levn": "0.3.0", 1308 | "prelude-ls": "1.1.2", 1309 | "type-check": "0.3.2", 1310 | "wordwrap": "1.0.0" 1311 | } 1312 | }, 1313 | "os-homedir": { 1314 | "version": "1.0.2", 1315 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 1316 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", 1317 | "dev": true 1318 | }, 1319 | "p-limit": { 1320 | "version": "1.2.0", 1321 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", 1322 | "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", 1323 | "dev": true, 1324 | "requires": { 1325 | "p-try": "1.0.0" 1326 | } 1327 | }, 1328 | "p-locate": { 1329 | "version": "2.0.0", 1330 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", 1331 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", 1332 | "dev": true, 1333 | "requires": { 1334 | "p-limit": "1.2.0" 1335 | } 1336 | }, 1337 | "p-try": { 1338 | "version": "1.0.0", 1339 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", 1340 | "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", 1341 | "dev": true 1342 | }, 1343 | "parse-json": { 1344 | "version": "4.0.0", 1345 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", 1346 | "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", 1347 | "dev": true, 1348 | "requires": { 1349 | "error-ex": "1.3.1", 1350 | "json-parse-better-errors": "1.0.1" 1351 | } 1352 | }, 1353 | "path-exists": { 1354 | "version": "2.1.0", 1355 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", 1356 | "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", 1357 | "dev": true, 1358 | "requires": { 1359 | "pinkie-promise": "2.0.1" 1360 | } 1361 | }, 1362 | "path-is-absolute": { 1363 | "version": "1.0.1", 1364 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1365 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1366 | "dev": true 1367 | }, 1368 | "path-is-inside": { 1369 | "version": "1.0.2", 1370 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 1371 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", 1372 | "dev": true 1373 | }, 1374 | "path-parse": { 1375 | "version": "1.0.5", 1376 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", 1377 | "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", 1378 | "dev": true 1379 | }, 1380 | "pathval": { 1381 | "version": "1.1.0", 1382 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", 1383 | "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", 1384 | "dev": true 1385 | }, 1386 | "pify": { 1387 | "version": "2.3.0", 1388 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1389 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 1390 | "dev": true 1391 | }, 1392 | "pinkie": { 1393 | "version": "2.0.4", 1394 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 1395 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", 1396 | "dev": true 1397 | }, 1398 | "pinkie-promise": { 1399 | "version": "2.0.1", 1400 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 1401 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 1402 | "dev": true, 1403 | "requires": { 1404 | "pinkie": "2.0.4" 1405 | } 1406 | }, 1407 | "pkg-conf": { 1408 | "version": "2.1.0", 1409 | "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", 1410 | "integrity": "sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg=", 1411 | "dev": true, 1412 | "requires": { 1413 | "find-up": "2.1.0", 1414 | "load-json-file": "4.0.0" 1415 | }, 1416 | "dependencies": { 1417 | "find-up": { 1418 | "version": "2.1.0", 1419 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", 1420 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", 1421 | "dev": true, 1422 | "requires": { 1423 | "locate-path": "2.0.0" 1424 | } 1425 | } 1426 | } 1427 | }, 1428 | "pkg-config": { 1429 | "version": "1.1.1", 1430 | "resolved": "https://registry.npmjs.org/pkg-config/-/pkg-config-1.1.1.tgz", 1431 | "integrity": "sha1-VX7yLXPaPIg3EHdmxS6tq94pj+Q=", 1432 | "dev": true, 1433 | "requires": { 1434 | "debug-log": "1.0.1", 1435 | "find-root": "1.1.0", 1436 | "xtend": "4.0.1" 1437 | } 1438 | }, 1439 | "pkg-dir": { 1440 | "version": "1.0.0", 1441 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", 1442 | "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", 1443 | "dev": true, 1444 | "requires": { 1445 | "find-up": "1.1.2" 1446 | } 1447 | }, 1448 | "pkg-up": { 1449 | "version": "1.0.0", 1450 | "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz", 1451 | "integrity": "sha1-Pgj7RhUlxEIWJKM7n35tCvWwWiY=", 1452 | "dev": true, 1453 | "requires": { 1454 | "find-up": "1.1.2" 1455 | } 1456 | }, 1457 | "pluralize": { 1458 | "version": "1.2.1", 1459 | "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", 1460 | "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", 1461 | "dev": true 1462 | }, 1463 | "prelude-ls": { 1464 | "version": "1.1.2", 1465 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 1466 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 1467 | "dev": true 1468 | }, 1469 | "process-nextick-args": { 1470 | "version": "1.0.7", 1471 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 1472 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", 1473 | "dev": true 1474 | }, 1475 | "progress": { 1476 | "version": "1.1.8", 1477 | "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", 1478 | "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", 1479 | "dev": true 1480 | }, 1481 | "readable-stream": { 1482 | "version": "2.3.3", 1483 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", 1484 | "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", 1485 | "dev": true, 1486 | "requires": { 1487 | "core-util-is": "1.0.2", 1488 | "inherits": "2.0.3", 1489 | "isarray": "1.0.0", 1490 | "process-nextick-args": "1.0.7", 1491 | "safe-buffer": "5.1.1", 1492 | "string_decoder": "1.0.3", 1493 | "util-deprecate": "1.0.2" 1494 | } 1495 | }, 1496 | "readline2": { 1497 | "version": "1.0.1", 1498 | "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", 1499 | "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", 1500 | "dev": true, 1501 | "requires": { 1502 | "code-point-at": "1.1.0", 1503 | "is-fullwidth-code-point": "1.0.0", 1504 | "mute-stream": "0.0.5" 1505 | } 1506 | }, 1507 | "rechoir": { 1508 | "version": "0.6.2", 1509 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", 1510 | "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", 1511 | "dev": true, 1512 | "requires": { 1513 | "resolve": "1.5.0" 1514 | } 1515 | }, 1516 | "require-uncached": { 1517 | "version": "1.0.3", 1518 | "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", 1519 | "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", 1520 | "dev": true, 1521 | "requires": { 1522 | "caller-path": "0.1.0", 1523 | "resolve-from": "1.0.1" 1524 | } 1525 | }, 1526 | "resolve": { 1527 | "version": "1.5.0", 1528 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", 1529 | "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", 1530 | "dev": true, 1531 | "requires": { 1532 | "path-parse": "1.0.5" 1533 | } 1534 | }, 1535 | "resolve-from": { 1536 | "version": "1.0.1", 1537 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", 1538 | "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", 1539 | "dev": true 1540 | }, 1541 | "restore-cursor": { 1542 | "version": "1.0.1", 1543 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", 1544 | "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", 1545 | "dev": true, 1546 | "requires": { 1547 | "exit-hook": "1.1.1", 1548 | "onetime": "1.1.0" 1549 | } 1550 | }, 1551 | "rimraf": { 1552 | "version": "2.6.2", 1553 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", 1554 | "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", 1555 | "dev": true, 1556 | "requires": { 1557 | "glob": "7.1.2" 1558 | } 1559 | }, 1560 | "run-async": { 1561 | "version": "0.1.0", 1562 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", 1563 | "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", 1564 | "dev": true, 1565 | "requires": { 1566 | "once": "1.4.0" 1567 | } 1568 | }, 1569 | "run-parallel": { 1570 | "version": "1.1.6", 1571 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.6.tgz", 1572 | "integrity": "sha1-KQA8miFj4B4tLfyQV18sbB1hoDk=", 1573 | "dev": true 1574 | }, 1575 | "rx-lite": { 1576 | "version": "3.1.2", 1577 | "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", 1578 | "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", 1579 | "dev": true 1580 | }, 1581 | "safe-buffer": { 1582 | "version": "5.1.1", 1583 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 1584 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", 1585 | "dev": true 1586 | }, 1587 | "semver": { 1588 | "version": "5.3.0", 1589 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", 1590 | "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", 1591 | "dev": true 1592 | }, 1593 | "shelljs": { 1594 | "version": "0.7.8", 1595 | "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", 1596 | "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", 1597 | "dev": true, 1598 | "requires": { 1599 | "glob": "7.1.2", 1600 | "interpret": "1.1.0", 1601 | "rechoir": "0.6.2" 1602 | } 1603 | }, 1604 | "slice-ansi": { 1605 | "version": "0.0.4", 1606 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", 1607 | "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", 1608 | "dev": true 1609 | }, 1610 | "sprintf-js": { 1611 | "version": "1.0.3", 1612 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1613 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1614 | "dev": true 1615 | }, 1616 | "standard": { 1617 | "version": "10.0.3", 1618 | "resolved": "https://registry.npmjs.org/standard/-/standard-10.0.3.tgz", 1619 | "integrity": "sha512-JURZ+85ExKLQULckDFijdX5WHzN6RC7fgiZNSV4jFQVo+3tPoQGHyBrGekye/yf0aOfb4210EM5qPNlc2cRh4w==", 1620 | "dev": true, 1621 | "requires": { 1622 | "eslint": "3.19.0", 1623 | "eslint-config-standard": "10.2.1", 1624 | "eslint-config-standard-jsx": "4.0.2", 1625 | "eslint-plugin-import": "2.2.0", 1626 | "eslint-plugin-node": "4.2.3", 1627 | "eslint-plugin-promise": "3.5.0", 1628 | "eslint-plugin-react": "6.10.3", 1629 | "eslint-plugin-standard": "3.0.1", 1630 | "standard-engine": "7.0.0" 1631 | } 1632 | }, 1633 | "standard-engine": { 1634 | "version": "7.0.0", 1635 | "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-7.0.0.tgz", 1636 | "integrity": "sha1-67d7nI/CyBZf+jU72Rug3/Qa9pA=", 1637 | "dev": true, 1638 | "requires": { 1639 | "deglob": "2.1.0", 1640 | "get-stdin": "5.0.1", 1641 | "minimist": "1.2.0", 1642 | "pkg-conf": "2.1.0" 1643 | }, 1644 | "dependencies": { 1645 | "minimist": { 1646 | "version": "1.2.0", 1647 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 1648 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 1649 | "dev": true 1650 | } 1651 | } 1652 | }, 1653 | "string-width": { 1654 | "version": "1.0.2", 1655 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 1656 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 1657 | "dev": true, 1658 | "requires": { 1659 | "code-point-at": "1.1.0", 1660 | "is-fullwidth-code-point": "1.0.0", 1661 | "strip-ansi": "3.0.1" 1662 | } 1663 | }, 1664 | "string_decoder": { 1665 | "version": "1.0.3", 1666 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", 1667 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", 1668 | "dev": true, 1669 | "requires": { 1670 | "safe-buffer": "5.1.1" 1671 | } 1672 | }, 1673 | "strip-ansi": { 1674 | "version": "3.0.1", 1675 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1676 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1677 | "dev": true, 1678 | "requires": { 1679 | "ansi-regex": "2.1.1" 1680 | } 1681 | }, 1682 | "strip-bom": { 1683 | "version": "3.0.0", 1684 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 1685 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", 1686 | "dev": true 1687 | }, 1688 | "strip-json-comments": { 1689 | "version": "2.0.1", 1690 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1691 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 1692 | "dev": true 1693 | }, 1694 | "supports-color": { 1695 | "version": "4.4.0", 1696 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", 1697 | "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", 1698 | "dev": true, 1699 | "requires": { 1700 | "has-flag": "2.0.0" 1701 | } 1702 | }, 1703 | "table": { 1704 | "version": "3.8.3", 1705 | "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", 1706 | "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", 1707 | "dev": true, 1708 | "requires": { 1709 | "ajv": "4.11.8", 1710 | "ajv-keywords": "1.5.1", 1711 | "chalk": "1.1.3", 1712 | "lodash": "4.17.4", 1713 | "slice-ansi": "0.0.4", 1714 | "string-width": "2.1.1" 1715 | }, 1716 | "dependencies": { 1717 | "ansi-regex": { 1718 | "version": "3.0.0", 1719 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 1720 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 1721 | "dev": true 1722 | }, 1723 | "is-fullwidth-code-point": { 1724 | "version": "2.0.0", 1725 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1726 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 1727 | "dev": true 1728 | }, 1729 | "string-width": { 1730 | "version": "2.1.1", 1731 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 1732 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 1733 | "dev": true, 1734 | "requires": { 1735 | "is-fullwidth-code-point": "2.0.0", 1736 | "strip-ansi": "4.0.0" 1737 | } 1738 | }, 1739 | "strip-ansi": { 1740 | "version": "4.0.0", 1741 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1742 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1743 | "dev": true, 1744 | "requires": { 1745 | "ansi-regex": "3.0.0" 1746 | } 1747 | } 1748 | } 1749 | }, 1750 | "text-table": { 1751 | "version": "0.2.0", 1752 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1753 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 1754 | "dev": true 1755 | }, 1756 | "through": { 1757 | "version": "2.3.8", 1758 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1759 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1760 | "dev": true 1761 | }, 1762 | "type-check": { 1763 | "version": "0.3.2", 1764 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 1765 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 1766 | "dev": true, 1767 | "requires": { 1768 | "prelude-ls": "1.1.2" 1769 | } 1770 | }, 1771 | "type-detect": { 1772 | "version": "4.0.5", 1773 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.5.tgz", 1774 | "integrity": "sha512-N9IvkQslUGYGC24RkJk1ba99foK6TkwC2FHAEBlQFBP0RxQZS8ZpJuAZcwiY/w9ZJHFQb1aOXBI60OdxhTrwEQ==", 1775 | "dev": true 1776 | }, 1777 | "typedarray": { 1778 | "version": "0.0.6", 1779 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 1780 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", 1781 | "dev": true 1782 | }, 1783 | "uniq": { 1784 | "version": "1.0.1", 1785 | "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", 1786 | "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", 1787 | "dev": true 1788 | }, 1789 | "user-home": { 1790 | "version": "2.0.0", 1791 | "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", 1792 | "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", 1793 | "dev": true, 1794 | "requires": { 1795 | "os-homedir": "1.0.2" 1796 | } 1797 | }, 1798 | "util-deprecate": { 1799 | "version": "1.0.2", 1800 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1801 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 1802 | "dev": true 1803 | }, 1804 | "wordwrap": { 1805 | "version": "1.0.0", 1806 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 1807 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", 1808 | "dev": true 1809 | }, 1810 | "wrappy": { 1811 | "version": "1.0.2", 1812 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1813 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1814 | "dev": true 1815 | }, 1816 | "write": { 1817 | "version": "0.2.1", 1818 | "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", 1819 | "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", 1820 | "dev": true, 1821 | "requires": { 1822 | "mkdirp": "0.5.1" 1823 | } 1824 | }, 1825 | "xtend": { 1826 | "version": "4.0.1", 1827 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 1828 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", 1829 | "dev": true 1830 | } 1831 | } 1832 | } 1833 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ipcee", 3 | "version": "2.0.0", 4 | "description": "IPC combined with EventEmitter", 5 | "engines": { 6 | "node": ">=4.1" 7 | }, 8 | "main": "index.js", 9 | "scripts": { 10 | "test": "standard && mocha" 11 | }, 12 | "repository": { 13 | "type": "git", 14 | "url": "git+ssh://git@github.com/soyuka/IPCEE.git" 15 | }, 16 | "keywords": [ 17 | "ipc", 18 | "EventEmitter" 19 | ], 20 | "author": "soyuka", 21 | "license": "MIT", 22 | "bugs": { 23 | "url": "https://github.com/soyuka/IPCEE/issues" 24 | }, 25 | "homepage": "https://github.com/soyuka/ICPEE#readme", 26 | "devDependencies": { 27 | "chai": "^4.1.2", 28 | "mocha": "^4.1.0", 29 | "standard": "^10.0.3" 30 | }, 31 | "dependencies": { 32 | "eventemitter2": "^5.0.1" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /test/fixtures/answer.js: -------------------------------------------------------------------------------- 1 | process.on('message', function (d) { 2 | process.send(d) 3 | }) 4 | -------------------------------------------------------------------------------- /test/fixtures/callback.js: -------------------------------------------------------------------------------- 1 | var IPCEE = require('../../') 2 | 3 | var ipc = IPCEE(process) 4 | 5 | ipc.send('started') 6 | 7 | ipc.on('ping', function () { 8 | return 'pong' 9 | }) 10 | -------------------------------------------------------------------------------- /test/fixtures/pingpong.js: -------------------------------------------------------------------------------- 1 | var IPCEE = require('../../') 2 | 3 | var ipc = IPCEE(process, {wildcard: true}) 4 | 5 | ipc.send('started') 6 | 7 | ipc.on('ping', function () { 8 | ipc.send('pong') 9 | }) 10 | 11 | ipc.on('ping.me', function () { 12 | ipc.send('me.pong') 13 | }) 14 | -------------------------------------------------------------------------------- /test/fixtures/socket.js: -------------------------------------------------------------------------------- 1 | var IPCEE = require('../../') 2 | var ipc = IPCEE(process) 3 | 4 | ipc.on('server', function (server) { 5 | if (!(server instanceof require('net').Server)) { throw new Error('not a server') } else { ipc.send('ok') } 6 | }) 7 | -------------------------------------------------------------------------------- /test/fixtures/throw.js: -------------------------------------------------------------------------------- 1 | var IPCEE = require('../../') 2 | var ipc = IPCEE(process) 3 | 4 | process.on('uncaughtException', function (err) { 5 | ipc.send('error', err.toString(), err.stack) 6 | 7 | process.nextTick(function () { 8 | process.exit(1) 9 | }) 10 | }) 11 | 12 | throw new Error('Test') 13 | -------------------------------------------------------------------------------- /test/index.js: -------------------------------------------------------------------------------- 1 | /* eslint-env mocha */ 2 | var fork = require('child_process').fork 3 | var expect = require('chai').expect 4 | var p = require('path') 5 | var IPCEE = require('../index.js') 6 | var client, server 7 | 8 | describe('IPCEE', function () { 9 | afterEach(function () { 10 | if (server && !server.killed) { 11 | server.kill() 12 | } 13 | }) 14 | 15 | it('should throw because ipc is not available', function (cb) { 16 | try { 17 | IPCEE({foo: 'bar'}) 18 | } catch (err) { 19 | expect(err.message).to.equal('IPC is not enabled') 20 | cb() 21 | } 22 | }) 23 | 24 | it('should fork', function () { 25 | server = fork(p.join(__dirname, './fixtures/answer.js')) 26 | client = IPCEE(server) 27 | }) 28 | 29 | it('should get message through client', function (cb) { 30 | server = fork(p.join(__dirname, './fixtures/answer.js')) 31 | client = IPCEE(server) 32 | client.once('test', function (x, y) { 33 | expect(x).to.deep.equal({foo: 'bar'}) 34 | expect(y).to.deep.equal([0, 1, 2]) 35 | cb() 36 | }) 37 | 38 | client.send('test', {foo: 'bar'}, [0, 1, 2]) 39 | }) 40 | 41 | it('should not be available because child has been killed', function (cb) { 42 | server = fork(p.join(__dirname, './fixtures/answer.js')) 43 | client = IPCEE(server) 44 | server.kill() 45 | 46 | server.once('exit', function () { 47 | expect(client.client).to.be.an('undefined') 48 | cb() 49 | }) 50 | }) 51 | 52 | it('should fork server', function (cb) { 53 | server = fork(p.join(__dirname, './fixtures/pingpong.js')) 54 | client = IPCEE(server) 55 | 56 | client.once('started', cb) 57 | }) 58 | 59 | it('should ping-pong', function (cb) { 60 | server = fork(p.join(__dirname, './fixtures/pingpong.js')) 61 | client = IPCEE(server) 62 | client.once('pong', cb) 63 | 64 | client.send('ping') 65 | }) 66 | 67 | it('should work with a callback', function (cb) { 68 | server = fork(p.join(__dirname, './fixtures/pingpong.js')) 69 | client = IPCEE(server) 70 | client.send('ping', cb) 71 | }) 72 | 73 | it('should get exit event', function (cb) { 74 | server = fork(p.join(__dirname, './fixtures/pingpong.js')) 75 | client = IPCEE(server) 76 | server.kill() 77 | client.once('exit', cb) 78 | }) 79 | 80 | it('should get error event', function (cb) { 81 | server = fork(p.join(__dirname, './fixtures/throw.js')) 82 | client = IPCEE(server) 83 | 84 | client.once('error', function (err, stack) { 85 | expect(err).to.equal('Error: Test') 86 | expect(stack).to.be.a('string') 87 | 88 | client.once('exit', function () { 89 | return cb() 90 | }) 91 | }) 92 | }) 93 | 94 | it('should work with wildcards', function (cb) { 95 | server = fork(p.join(__dirname, './fixtures/pingpong.js')) 96 | client = IPCEE(server, {wildcard: true}) 97 | 98 | client.once('*.pong', cb) 99 | client.send('ping.*') 100 | }) 101 | 102 | it('should send socket', function (cb) { 103 | var s = require('net').createServer() 104 | server = fork(p.join(__dirname, './fixtures/socket.js')) 105 | client = IPCEE(server) 106 | 107 | s.listen(function () { 108 | client.send('server', s) 109 | s.close(function () { s.unref() }) 110 | }) 111 | 112 | client.once('ok', cb) 113 | }) 114 | 115 | it('should send socket with callback', function (cb) { 116 | var s = require('net').createServer() 117 | server = fork(p.join(__dirname, './fixtures/socket.js')) 118 | client = IPCEE(server) 119 | 120 | s.listen(function () { 121 | client.send('server', s, cb) 122 | s.close(function () { s.unref() }) 123 | }) 124 | }) 125 | }) 126 | --------------------------------------------------------------------------------