├── .gitignore ├── .npmignore ├── appveyor.yml ├── marker.js ├── .travis.yml ├── package.json ├── test └── marker.js ├── index.js ├── README.md └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | node_modules/ 3 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | src 2 | node_modules 3 | .gitignore 4 | .travis.yml 5 | yarn.lock 6 | -------------------------------------------------------------------------------- /appveyor.yml: -------------------------------------------------------------------------------- 1 | environment: 2 | matrix: 3 | - node_version: "8" 4 | - node_version: "7" 5 | - node_version: "6" 6 | - node_version: "5" 7 | cache: 8 | - node_modules 9 | build: off 10 | install: 11 | - ps: Install-Product node $env:node_version 12 | - choco install -i yarn 13 | - refreshenv 14 | - yarn 15 | test_script: 16 | - yarn test -------------------------------------------------------------------------------- /marker.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = message => { 4 | let out = '[daemon-command-webpack-plugin][resolve-marker]'; 5 | 6 | if(message) { 7 | out = `${out}: ${message}`; 8 | } 9 | 10 | if(process && process.stdout && typeof process.stdout.write === 'function') { 11 | process.stdout.write(`${out}\r\n`); 12 | } else if(console && console.log) { 13 | console.log(out); 14 | } else { 15 | throw new Error('process.stdout.write and console.log undefined'); 16 | } 17 | }; -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | sudo: required 3 | node_js: 4 | - 5 5 | - 6 6 | - 7 7 | 8 | cache: 9 | directories: 10 | - node_modules 11 | - $HOME/.yarn-cache 12 | 13 | before_install: 14 | - sudo apt-key adv --keyserver pgp.mit.edu --recv D101F7899D41F3C3 15 | - echo "deb http://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list 16 | - sudo apt-get update -qq 17 | - sudo apt-get install -y -qq yarn 18 | - yarn -V 19 | 20 | install: 21 | - yarn 22 | 23 | script: 24 | - yarn test 25 | 26 | deploy: 27 | provider: npm 28 | email: lamo2k123@gmail.com 29 | api_key: $NPM_API_KEY 30 | on: 31 | tags: true 32 | node: 6 33 | repo: lamo2k123/daemon-command-webpack-plugin 34 | 35 | os: 36 | - linux 37 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "daemon-command-webpack-plugin", 3 | "version": "1.5.0", 4 | "description": "Run or restart npm commands after webpack build has finished", 5 | "keywords": [ 6 | "webpack", 7 | "plugin", 8 | "npm", 9 | "command", 10 | "commands", 11 | "hmr", 12 | "daemon", 13 | "watch" 14 | ], 15 | "homepage": "https://github.com/lamo2k123/daemon-command-webpack-plugin", 16 | "bugs": { 17 | "url": "https://github.com/lamo2k123/daemon-command-webpack-plugin/issues" 18 | }, 19 | "license": "MIT", 20 | "author": { 21 | "name": "Aleksey Novikov", 22 | "email": "lamo2k123@gmail.com" 23 | }, 24 | "contributors": [], 25 | "main": "index.js", 26 | "repository": "lamo2k123/daemon-command-webpack-plugin", 27 | "scripts": { 28 | "test": "mocha" 29 | }, 30 | "devDependencies": { 31 | "mocha": "3.1.2" 32 | }, 33 | "dependencies": { 34 | "debug": "^3.1.0", 35 | "tree-kill": "^1.2.0" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /test/marker.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const marker = require('./../marker'); 4 | 5 | const write = process.stdout.write; 6 | const log = console.log; 7 | 8 | describe('[Marker]', () => { 9 | 10 | it('Is the function', done => { 11 | if(typeof marker === 'function') { 12 | done(); 13 | } else { 14 | done(new Error('It is not a function')); 15 | } 16 | }); 17 | 18 | it('Using process.stdout.write', done => { 19 | let out = ''; 20 | 21 | process.stdout.write = string => out = string; 22 | marker(); 23 | process.stdout.write = write; 24 | 25 | if(/^\[daemon-command-webpack-plugin]\[resolve-marker]$/gm.test(out)) { 26 | done(); 27 | } else { 28 | done(new Error('The marker is not in the process.stdout')) 29 | } 30 | }); 31 | 32 | it('Using console.log', done => { 33 | let out = ''; 34 | 35 | console.log = string => out = string; 36 | process.stdout.write = null; 37 | marker(); 38 | console.log = log; 39 | process.stdout.write = write; 40 | 41 | if(/^\[daemon-command-webpack-plugin]\[resolve-marker]$/gm.test(out)) { 42 | done(); 43 | } else { 44 | done(new Error('The marker is not in the console.log')) 45 | } 46 | }); 47 | 48 | it('Undefined process.stdout.write & console.log throw error', done => { 49 | console.log = null; 50 | process.stdout.write = null; 51 | try { 52 | marker(); 53 | console.log = log; 54 | process.stdout.write = write; 55 | done(new Error('No exception')) 56 | } catch(e) { 57 | console.log = log; 58 | process.stdout.write = write; 59 | done(); 60 | } 61 | }); 62 | 63 | it('String message process.stdout.write', done => { 64 | let out = ''; 65 | 66 | process.stdout.write = null; 67 | process.stdout.write = string => out = string; 68 | marker('string message'); 69 | process.stdout.write = write; 70 | 71 | if(/^\[daemon-command-webpack-plugin]\[resolve-marker]: string message$/gm.test(out)) { 72 | done(); 73 | } else { 74 | done(new Error('The marker argument message is not in the process.stdout')) 75 | } 76 | }); 77 | 78 | it('String message console.log', done => { 79 | let out = ''; 80 | 81 | process.stdout.write = null; 82 | console.log = string => out = string; 83 | marker('string message'); 84 | console.log = log; 85 | process.stdout.write = write; 86 | 87 | if(/^\[daemon-command-webpack-plugin]\[resolve-marker]: string message$/gm.test(out)) { 88 | done(); 89 | } else { 90 | done(new Error('The marker argument message is not in the console.log')) 91 | } 92 | }); 93 | 94 | it('Array message process.stdout.write', done => { 95 | let out = ''; 96 | 97 | process.stdout.write = null; 98 | process.stdout.write = string => out = string; 99 | marker([ 100 | 'message 1', 101 | 'message 2', 102 | 'message 3' 103 | ]); 104 | process.stdout.write = write; 105 | 106 | if(/^\[daemon-command-webpack-plugin]\[resolve-marker]: message 1,message 2,message 3$/gm.test(out)) { 107 | done(); 108 | } else { 109 | done(new Error('The marker argument array message is not in the process.stdout')) 110 | } 111 | }); 112 | 113 | it('String message console.log', done => { 114 | let out = ''; 115 | 116 | process.stdout.write = null; 117 | console.log = string => out = string; 118 | marker([ 119 | 'message 1', 120 | 'message 2', 121 | 'message 3' 122 | ]); 123 | console.log = log; 124 | process.stdout.write = write; 125 | 126 | if(/^\[daemon-command-webpack-plugin]\[resolve-marker]: message 1,message 2,message 3$/gm.test(out)) { 127 | done(); 128 | } else { 129 | done(new Error('The marker argument array message is not in the console.log')) 130 | } 131 | }); 132 | 133 | }); -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const debug = require('debug')('daemon-command'); 4 | const path = require('path'); 5 | const { spawn } = require('child_process'); 6 | const treeKill = require('tree-kill'); 7 | 8 | const marker = /^\[daemon-command-webpack-plugin]\[resolve-marker]/gm; 9 | 10 | class DaemonCommand { 11 | 12 | constructor(command, options) { 13 | this.options = options; 14 | 15 | this.command = command; 16 | 17 | this.apply = this.apply.bind(this); 18 | this.watch = this.watch.bind(this); 19 | this.handler = this.handler.bind(this); 20 | this.spawning = this.spawning.bind(this); 21 | this.kill = this.kill.bind(this); 22 | this.spawnArgs = []; 23 | 24 | const npmExec = process.env.npm_execpath; 25 | const nodeExec = process.env.npm_node_execpath; 26 | const npmPathIsJs = typeof npmExec === 'string' && /\.js/.test(path.extname(npmExec)); 27 | 28 | if (!npmPathIsJs) { 29 | this.execPath = npmExec; 30 | } 31 | else { 32 | this.execPath = nodeExec || 'npm'; 33 | this.spawnArgs.push(npmExec); 34 | } 35 | } 36 | 37 | get default() { 38 | return { 39 | event : 'after-emit', 40 | marker : false, 41 | spawn : {} 42 | } 43 | } 44 | 45 | get options() { 46 | return this._options; 47 | } 48 | 49 | set options(params) { 50 | const options = this.default; 51 | 52 | this._options = Object.assign(options, params); 53 | } 54 | 55 | get process() { 56 | return this._process; 57 | } 58 | 59 | set process(params) { 60 | this._process = params; 61 | } 62 | 63 | apply(compiler) { 64 | compiler.plugin('watch-run', this.watch); 65 | compiler.plugin(this.options.event, this.handler); 66 | }; 67 | 68 | watch(context, next) { 69 | if(!this._watch) { 70 | this._watch = true 71 | } 72 | 73 | next(null); 74 | }; 75 | 76 | handler(compilation, next) { 77 | if(this._watch) { 78 | this 79 | .kill() 80 | .then(this.spawning) 81 | .then(next) 82 | .catch(console.error); 83 | } else { 84 | next(null); 85 | } 86 | }; 87 | 88 | spawning(code) { 89 | return new Promise((resolve, reject) => { 90 | if(code !== 1) { 91 | if(this.command) { 92 | let finalArgs = [...this.spawnArgs, this.command]; 93 | debug('Spawning: "%s %o"', this.execPath, finalArgs); 94 | 95 | this.process = spawn(this.execPath, finalArgs, this.options.spawn); 96 | this.process.stdout.pipe(process.stdout); 97 | this.process.stderr.pipe(process.stderr); 98 | 99 | if(this.options.marker) { 100 | this.process.stdout.on('data', chunk => { 101 | const data = chunk.toString(); 102 | 103 | if (marker.test(data)) { 104 | debug('Marker caught!'); 105 | resolve(null); 106 | } 107 | }) 108 | } else { 109 | resolve(null); 110 | } 111 | 112 | this.process.on('error', err => reject(err)); 113 | this.process.on('exit', code => code === 1 && resolve(null)); 114 | } 115 | } else { 116 | resolve(null) 117 | } 118 | }) 119 | }; 120 | 121 | kill() { 122 | return new Promise((resolve, reject) => { 123 | if(this.process && this.process.pid) { 124 | debug('Killing: %o [%s]', this.process.spawnargs, this.process.pid) 125 | treeKill(this.process.pid, 'SIGKILL', (err) => { 126 | if (err) { 127 | reject(err); 128 | } 129 | else { 130 | this.process = null; 131 | resolve(null); 132 | } 133 | }); 134 | } else { 135 | resolve(null); 136 | } 137 | }) 138 | } 139 | 140 | } 141 | 142 | module.exports = DaemonCommand; 143 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## daemon-command-webpack-plugin 2 | [![license](https://img.shields.io/github/license/mashape/apistatus.svg?maxAge=2592000&style=flat-square)][License] 3 | [![travis](https://img.shields.io/travis/lamo2k123/daemon-command-webpack-plugin/master.svg?maxAge=2592000&style=flat-square)][Travis] 4 | [![AppVeyor](https://img.shields.io/appveyor/ci/lamo2k123/daemon-command-webpack-plugin.svg?maxAge=2592000&style=flat-square)][appVeyor] 5 | [![npm](https://img.shields.io/npm/dt/daemon-command-webpack-plugin.svg?maxAge=2592000&style=flat-square)][NPM] 6 | [![npm](https://img.shields.io/npm/v/daemon-command-webpack-plugin.svg?maxAge=2592000&style=flat-square)][NPM] 7 | 8 | This is simple webpack plugin that monitors webpack events and start or restart npm/yarn command. 9 | The main purpose of this plugin is to restart node process when webpack has finised rebuilding the source tree. 10 | It is also possible to wait for the marker to make sure the process is finished doing the job (like starting the web server) 11 | 12 | ## Installing as a package 13 | Use NPM: 14 | `npm i daemon-command-webpack-plugin -D` or `npm install daemon-command-webpack-plugin --save-dev` 15 | 16 | Use YARN: 17 | `yarn add daemon-command-webpack-plugin --dev` 18 | ## Usage 19 | ```javascript 20 | // package.json 21 | 22 | { 23 | "name": "me-app", 24 | "version": "1.0.0", 25 | "scripts": { 26 | "start:dev:env": "node server/build/index.js", 27 | "start:dev": "NODE_ENV=development PORT=3000 node server/build/index.js", 28 | }, 29 | } 30 | ``` 31 | 32 | ```javascript 33 | // webpack.config.js 34 | 35 | import DaemonCommandPlugin from 'daemon-command-webpack-plugin'; 36 | 37 | module.exports = { 38 | // ... rest of config 39 | plugins: [ 40 | // Command #1 41 | new DaemonCommandPlugin('start:dev:env', { 42 | spawn : { 43 | env : { 44 | NODE_ENV : 'development', 45 | PORT : 3000 46 | } 47 | } 48 | }), 49 | // Command #2 50 | new DaemonCommandPlugin('start:dev');, 51 | // Command #3 use yarn 52 | new DaemonCommandPlugin('start:dev', { 53 | manager : 'yarn' 54 | }); 55 | ] 56 | } 57 | ``` 58 | ## Usage with marker 59 | ```javascript 60 | // webpack.config.js 61 | 62 | import DaemonCommandPlugin from 'daemon-command-webpack-plugin'; 63 | 64 | module.exports = { 65 | // ... rest of config 66 | plugins: [ 67 | // Command #1 68 | new DaemonCommandPlugin('start:dev', { 69 | marker : true 70 | }); 71 | ] 72 | } 73 | ``` 74 | 75 | ```javascript 76 | // your-app.js 77 | 78 | import express from 'express'; 79 | import marker from 'daemon-command-webpack-plugin/marker'; 80 | 81 | let app = express(); 82 | 83 | app.listen(8080, () => { 84 | console.log('Listen port: 8080'); 85 | marker(); 86 | // or 87 | marker('Listen port: 8080'); // Custom message 88 | }) 89 | ``` 90 | 91 | 92 | 93 | ## Arguments 94 | * `command` [\][String] The package.json scripts command to run 95 | * `options` [\][Object] 96 | * `event` [\][String] Webpack life cycle event. Default: `after-emit` 97 | * `marker` [\][Boolean] Resolve promise when a marker is found to stdout. Default: `false` 98 | * `spawn` [\][Object] Spawn options 99 | * `cwd` [\][String] Current working directory of the child process 100 | * `env` [\][Object] Environment key-value pairs 101 | * `argv0` [\][String] Explicitly set the value of argv[0] sent to the child process. This will be set to command if not specified. 102 | * `stdio` [\][Array] | [\][String] Child's stdio configuration. (See options.stdio) 103 | * `detached` [\][Boolean] Prepare child to run independently of its parent process. Specific behavior depends on the platform, see options.detached) 104 | * `uid` [\][Number] Sets the user identity of the process 105 | * `gid` [\][Number] Sets the group identity of the process 106 | * `shell` [\][Boolean] | [\][String] If true, runs command inside of a shell. Uses `/bin/sh` on UNIX, and `cmd.exe` on Windows. A different shell can be specified as a string. The shell should understand the -c switch on UNIX, or /d /s /c on Windows. Defaults to false (no shell). 107 | 108 | Use `cwd` to specify the working directory from which the process is spawned. If not given, the default is to inherit the current working directory. 109 | Use `env` to specify environment variables that will be visible to the new process, the default is process.env. 110 | 111 | ## Marker arguments 112 | * `out` [\][String] | [\][Array] Your custom message 113 | 114 | ## License 115 | [MIT][License] 116 | 117 | [License]: http://www.opensource.org/licenses/mit-license.php 118 | [NPM]: https://www.npmjs.com/package/daemon-command-webpack-plugin 119 | [Travis]: https://travis-ci.org/lamo2k123/daemon-command-webpack-plugin 120 | [appVeyor]: https://ci.appveyor.com/project/lamo2k123/daemon-command-webpack-plugin 121 | 122 | [String]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type 123 | [Object]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object 124 | [Number]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type 125 | [Boolean]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type 126 | [Array]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array 127 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | balanced-match@^1.0.0: 6 | version "1.0.0" 7 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 8 | 9 | brace-expansion@^1.1.7: 10 | version "1.1.8" 11 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" 12 | dependencies: 13 | balanced-match "^1.0.0" 14 | concat-map "0.0.1" 15 | 16 | browser-stdout@1.3.0: 17 | version "1.3.0" 18 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" 19 | 20 | commander@2.9.0: 21 | version "2.9.0" 22 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" 23 | dependencies: 24 | graceful-readlink ">= 1.0.0" 25 | 26 | concat-map@0.0.1: 27 | version "0.0.1" 28 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 29 | 30 | debug@2.2.0: 31 | version "2.2.0" 32 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" 33 | dependencies: 34 | ms "0.7.1" 35 | 36 | debug@^3.1.0: 37 | version "3.1.0" 38 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 39 | dependencies: 40 | ms "2.0.0" 41 | 42 | diff@1.4.0: 43 | version "1.4.0" 44 | resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" 45 | 46 | escape-string-regexp@1.0.5: 47 | version "1.0.5" 48 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 49 | 50 | fs.realpath@^1.0.0: 51 | version "1.0.0" 52 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 53 | 54 | glob@7.0.5: 55 | version "7.0.5" 56 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.5.tgz#b4202a69099bbb4d292a7c1b95b6682b67ebdc95" 57 | dependencies: 58 | fs.realpath "^1.0.0" 59 | inflight "^1.0.4" 60 | inherits "2" 61 | minimatch "^3.0.2" 62 | once "^1.3.0" 63 | path-is-absolute "^1.0.0" 64 | 65 | "graceful-readlink@>= 1.0.0": 66 | version "1.0.1" 67 | resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" 68 | 69 | growl@1.9.2: 70 | version "1.9.2" 71 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" 72 | 73 | has-flag@^1.0.0: 74 | version "1.0.0" 75 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" 76 | 77 | inflight@^1.0.4: 78 | version "1.0.6" 79 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 80 | dependencies: 81 | once "^1.3.0" 82 | wrappy "1" 83 | 84 | inherits@2: 85 | version "2.0.3" 86 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 87 | 88 | json3@3.3.2: 89 | version "3.3.2" 90 | resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" 91 | 92 | lodash._baseassign@^3.0.0: 93 | version "3.2.0" 94 | resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" 95 | dependencies: 96 | lodash._basecopy "^3.0.0" 97 | lodash.keys "^3.0.0" 98 | 99 | lodash._basecopy@^3.0.0: 100 | version "3.0.1" 101 | resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" 102 | 103 | lodash._basecreate@^3.0.0: 104 | version "3.0.3" 105 | resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" 106 | 107 | lodash._getnative@^3.0.0: 108 | version "3.9.1" 109 | resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" 110 | 111 | lodash._isiterateecall@^3.0.0: 112 | version "3.0.9" 113 | resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" 114 | 115 | lodash.create@3.1.1: 116 | version "3.1.1" 117 | resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" 118 | dependencies: 119 | lodash._baseassign "^3.0.0" 120 | lodash._basecreate "^3.0.0" 121 | lodash._isiterateecall "^3.0.0" 122 | 123 | lodash.isarguments@^3.0.0: 124 | version "3.1.0" 125 | resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" 126 | 127 | lodash.isarray@^3.0.0: 128 | version "3.0.4" 129 | resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" 130 | 131 | lodash.keys@^3.0.0: 132 | version "3.1.2" 133 | resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" 134 | dependencies: 135 | lodash._getnative "^3.0.0" 136 | lodash.isarguments "^3.0.0" 137 | lodash.isarray "^3.0.0" 138 | 139 | minimatch@^3.0.2: 140 | version "3.0.4" 141 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 142 | dependencies: 143 | brace-expansion "^1.1.7" 144 | 145 | minimist@0.0.8: 146 | version "0.0.8" 147 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 148 | 149 | mkdirp@0.5.1: 150 | version "0.5.1" 151 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 152 | dependencies: 153 | minimist "0.0.8" 154 | 155 | mocha@3.1.2: 156 | version "3.1.2" 157 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.1.2.tgz#51f93b432bf7e1b175ffc22883ccd0be32dba6b5" 158 | dependencies: 159 | browser-stdout "1.3.0" 160 | commander "2.9.0" 161 | debug "2.2.0" 162 | diff "1.4.0" 163 | escape-string-regexp "1.0.5" 164 | glob "7.0.5" 165 | growl "1.9.2" 166 | json3 "3.3.2" 167 | lodash.create "3.1.1" 168 | mkdirp "0.5.1" 169 | supports-color "3.1.2" 170 | 171 | ms@0.7.1: 172 | version "0.7.1" 173 | resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" 174 | 175 | ms@2.0.0: 176 | version "2.0.0" 177 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 178 | 179 | once@^1.3.0: 180 | version "1.4.0" 181 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 182 | dependencies: 183 | wrappy "1" 184 | 185 | path-is-absolute@^1.0.0: 186 | version "1.0.1" 187 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 188 | 189 | supports-color@3.1.2: 190 | version "3.1.2" 191 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" 192 | dependencies: 193 | has-flag "^1.0.0" 194 | 195 | tree-kill@^1.2.0: 196 | version "1.2.0" 197 | resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.0.tgz#5846786237b4239014f05db156b643212d4c6f36" 198 | 199 | wrappy@1: 200 | version "1.0.2" 201 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 202 | --------------------------------------------------------------------------------