├── .gitattributes ├── .github └── workflows │ └── ci-test.yml ├── .gitignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── bin └── ps-tree.js ├── index.js ├── package-lock.json ├── package.json └── test ├── exec ├── child.js └── parent.js └── test.js /.gitattributes: -------------------------------------------------------------------------------- 1 | package-lock.json binary 2 | -------------------------------------------------------------------------------- /.github/workflows/ci-test.yml: -------------------------------------------------------------------------------- 1 | name: ci-test 2 | on: [push, pull_request] 3 | 4 | jobs: 5 | 6 | ps-tree-ci: 7 | strategy: 8 | fail-fast: false 9 | matrix: 10 | node: [18, 20, 22, 23] 11 | os: [ubuntu-24.04, windows-2022, macos-14] 12 | runs-on: ${{ matrix.os }} 13 | steps: 14 | - name: Setup Node 15 | uses: actions/setup-node@v4 16 | with: 17 | node-version: ${{ matrix.node }} 18 | - run: node -v 19 | - run: npm -v 20 | - name: Checkout 21 | uses: actions/checkout@v4 22 | - run: npm ci 23 | - run: npm test 24 | - run: npm run coverage 25 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | 5 | # Runtime data 6 | pids 7 | *.pid 8 | *.seed 9 | 10 | # Directory for instrumented libs generated by jscoverage/JSCover 11 | lib-cov 12 | 13 | # Coverage directory used by tools like istanbul 14 | coverage 15 | 16 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 17 | .grunt 18 | 19 | # Compiled binary addons (http://nodejs.org/api/addons.html) 20 | build/Release 21 | 22 | # Dependency directory 23 | # Commenting this out is preferred by some people, see 24 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git- 25 | node_modules 26 | 27 | # Users Environment Variables 28 | .lock-wscript 29 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # CHANGELOG 2 | 3 | ## 1.2.0 4 | 5 | - [#24] Improve performance 6 | - [#27] Make tests deterministic 7 | - [#29] Improve CI configurations 8 | 9 | ## 1.1.1 10 | 11 | - [#34] Locks `event-stream` to `3.3.4`. 12 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Domenic Tarr, Charlie Robbins & the Contributors 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ps-tree 2 | 3 | [![Build Status](https://github.com/indexzero/ps-tree/actions/workflows/ci-test.yml/badge.svg)](https://github.com/indexzero/ps-tree/actions/workflows/ci-test.yml) 4 | [![Code Climate](https://codeclimate.com/github/indexzero/ps-tree/badges/gpa.svg)](https://codeclimate.com/github/indexzero/ps-tree) 5 | [![Test Coverage](https://codeclimate.com/github/indexzero/ps-tree/badges/coverage.svg)](https://codeclimate.com/github/indexzero/ps-tree) 6 | [![npm Version](https://img.shields.io/npm/v/ps-tree.svg)](https://www.npmjs.com/package/ps-tree) 7 | [![Node.js Version](https://img.shields.io/node/v/ps-tree.svg?style=flat)](http://nodejs.org/download/) 8 | [![Dependency Status](https://david-dm.org/indexzero/ps-tree.svg)](https://david-dm.org/indexzero/ps-tree) 9 | 10 | Sometimes you cannot kill child processes like you would expect, this a feature of UNIX. 11 | 12 | >in UNIX, a process may terminate by using the exit call, and it's parent process may wait for that event by using the wait system call. the wait system call returns the process identifier of a terminated child, so that the parent tell which of the possibly many children has terminated. If the parent terminates, however, all it's children have assigned as their new parent the init process. Thus, the children still have a parent to collect their status and execution statistics. 13 | > (from "operating system concepts") 14 | 15 | Solution: use `ps-tree` to get all processes that a `child_process` may have started, so that they may all be terminated. 16 | 17 | ``` js 18 | var cp = require('child_process'), 19 | psTree = require('ps-tree'); 20 | 21 | var child = cp.exec("node -e 'while (true);'", function () {...}); 22 | 23 | // This will not actually kill the child it will kill the `sh` process. 24 | child.kill(); 25 | ``` 26 | 27 | wtf? it's because exec actually works like this: 28 | 29 | ``` js 30 | function exec (cmd, cb) { 31 | spawn('sh', ['-c', cmd]); 32 | ... 33 | } 34 | ``` 35 | 36 | `sh` starts parses the command string and starts processes, and waits for them to terminate, but `exec` returns a process object with the pid of the `sh` process. 37 | However, since it is in `wait` mode killing it does not kill the children. 38 | 39 | Use `ps-tree` like this: 40 | 41 | ``` js 42 | var cp = require('child_process'), 43 | psTree = require('ps-tree'); 44 | 45 | var child = cp.exec("node -e 'while (true);'", function () { /*...*/ }); 46 | 47 | psTree(child.pid, function (err, children) { 48 | cp.spawn('kill', ['-9'].concat(children.map(function (p) { return p.PID }))); 49 | }); 50 | ``` 51 | 52 | If you prefer to run **psTree** from the command line, use: `node ./bin/ps-tree.js` 53 | 54 | ## Cross Platform support 55 | 56 | 57 | The `ps-tree` module behaves differently on *nix vs. Windows by spawning different programs and parsing their output. This is based on `process.platform` and not on checking to see if a `ps` compatible program exists on the system. 58 | 59 | #### *nix 60 | 61 | 1. " " need to be striped 62 | ```bash 63 | $ ps -A -o comm,ppid,pid,stat 64 | COMMAND PPID PID STAT 65 | bbsd 2899 16958 Ss 66 | watch 1914 16964 Z 67 | ps 20688 16965 R+ 68 | ``` 69 | 70 | ### Windows 71 | 1. `wmic PROCESS WHERE ParentProcessId=4604 GET Name,ParentProcessId,ProcessId,Status)` 72 | 2. The order of head columns is fixed 73 | ```shell 74 | > wmic PROCESS GET Name,ProcessId,ParentProcessId,Status 75 | Name ParentProcessId ProcessId Status 76 | System Idle Process 0 0 77 | System 0 4 78 | smss.exe 4 228 79 | ``` 80 | 81 | ### Mac/Darwin 82 | 83 | 1. " " need to be striped 84 | 85 | ```shell 86 | $ ps -A -o comm,ppid,pid,stat 87 | COMM PPID PID STAT 88 | /sbin/launchd 0 1 Ss 89 | /usr/libexec/Use 1 43 Ss 90 | ``` 91 | 92 | ### LICENSE: MIT 93 | -------------------------------------------------------------------------------- /bin/ps-tree.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | 'use strict'; 4 | 5 | // 6 | // Change the default parent PID if running 7 | // under Windows. 8 | // 9 | var ppid = 1; 10 | if (process.platform === 'win32') { 11 | ppid = 0; 12 | } 13 | 14 | require('../')(process.argv[2] || ppid, function (err, data) { 15 | console.log(data); 16 | }); 17 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var spawn = require('child_process').spawn, 4 | es = require('event-stream'); 5 | 6 | module.exports = function childrenOfPid(pid, callback) { 7 | var headers = null; 8 | 9 | if (typeof callback !== 'function') { 10 | throw new Error('childrenOfPid(pid, callback) expects callback'); 11 | } 12 | 13 | if (typeof pid === 'number') { 14 | pid = pid.toString(); 15 | } 16 | 17 | // 18 | // The `ps-tree` module behaves differently on *nix vs. Windows 19 | // by spawning different programs and parsing their output. 20 | // 21 | // Linux: 22 | // 1. " " need to be striped 23 | // ```bash 24 | // $ ps -A -o comm,ppid,pid,stat 25 | // COMMAND PPID PID STAT 26 | // bbsd 2899 16958 Ss 27 | // watch 1914 16964 Z 28 | // ps 20688 16965 R+ 29 | // ``` 30 | // 31 | // Darwin: 32 | // $ ps -A -o comm,ppid,pid,stat 33 | // COMM PPID PID STAT 34 | // /sbin/launchd 0 1 Ss 35 | // /usr/libexec/Use 1 43 Ss 36 | // 37 | // Win32: 38 | // 1. wmic PROCESS WHERE ParentProcessId=4604 GET Name,ParentProcessId,ProcessId,Status) 39 | // 2. The order of head columns is fixed 40 | // ```shell 41 | // > wmic PROCESS GET Name,ProcessId,ParentProcessId,Status 42 | // Name ParentProcessId ProcessId Status 43 | // System Idle Process 0 0 44 | // System 0 4 45 | // smss.exe 4 228 46 | // ``` 47 | 48 | var processLister; 49 | if (process.platform === 'win32') { 50 | // See also: https://github.com/nodejs/node-v0.x-archive/issues/2318 51 | processLister = spawn('wmic.exe', ['PROCESS', 'GET', 'Name,ProcessId,ParentProcessId,Status']); 52 | } else { 53 | processLister = spawn('ps', ['-A', '-o', 'ppid,pid,stat,comm']); 54 | } 55 | 56 | es.connect( 57 | // spawn('ps', ['-A', '-o', 'ppid,pid,stat,comm']).stdout, 58 | processLister.stdout, 59 | es.split(), 60 | es.map(function (line, cb) { //this could parse alot of unix command output 61 | var columns = line.trim().split(/\s+/); 62 | if (!headers) { 63 | headers = columns; 64 | 65 | // 66 | // Rename Win32 header name, to as same as the linux, for compatible. 67 | // 68 | headers = headers.map(normalizeHeader); 69 | return cb(); 70 | } 71 | 72 | var row = {}; 73 | // For each header 74 | var h = headers.slice(); 75 | while (h.length) { 76 | row[h.shift()] = h.length ? columns.shift() : columns.join(' '); 77 | } 78 | 79 | return cb(null, row); 80 | }), 81 | es.writeArray(function (err, ps) { 82 | var parents = {}, 83 | children = []; 84 | 85 | parents[pid] = true; 86 | ps.forEach(function (proc) { 87 | if (parents[proc.PPID]) { 88 | parents[proc.PID] = true; 89 | children.push(proc) 90 | } 91 | }); 92 | 93 | callback(null, children); 94 | }) 95 | ).on('error', callback) 96 | } 97 | 98 | /** 99 | * Normalizes the given header `str` from the Windows 100 | * title to the *nix title. 101 | * 102 | * @param {string} str Header string to normalize 103 | */ 104 | function normalizeHeader(str) { 105 | switch (str) { 106 | case 'Name': // for win32 107 | case 'COMM': // for darwin 108 | return 'COMMAND'; 109 | break; 110 | case 'ParentProcessId': 111 | return 'PPID'; 112 | break; 113 | case 'ProcessId': 114 | return 'PID'; 115 | break; 116 | case 'Status': 117 | return 'STAT'; 118 | break; 119 | default: 120 | return str 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ps-tree", 3 | "version": "1.2.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "abbrev": { 8 | "version": "1.0.9", 9 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", 10 | "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", 11 | "dev": true 12 | }, 13 | "ajv": { 14 | "version": "6.5.5", 15 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.5.tgz", 16 | "integrity": "sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg==", 17 | "dev": true, 18 | "requires": { 19 | "fast-deep-equal": "^2.0.1", 20 | "fast-json-stable-stringify": "^2.0.0", 21 | "json-schema-traverse": "^0.4.1", 22 | "uri-js": "^4.2.2" 23 | } 24 | }, 25 | "amdefine": { 26 | "version": "1.0.1", 27 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", 28 | "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", 29 | "dev": true, 30 | "optional": true 31 | }, 32 | "argparse": { 33 | "version": "1.0.10", 34 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 35 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 36 | "dev": true, 37 | "requires": { 38 | "sprintf-js": "~1.0.2" 39 | } 40 | }, 41 | "asn1": { 42 | "version": "0.2.4", 43 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 44 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 45 | "dev": true, 46 | "requires": { 47 | "safer-buffer": "~2.1.0" 48 | } 49 | }, 50 | "assert-plus": { 51 | "version": "1.0.0", 52 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 53 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", 54 | "dev": true 55 | }, 56 | "async": { 57 | "version": "1.5.2", 58 | "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz", 59 | "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", 60 | "dev": true 61 | }, 62 | "asynckit": { 63 | "version": "0.4.0", 64 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 65 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", 66 | "dev": true 67 | }, 68 | "aws-sign2": { 69 | "version": "0.7.0", 70 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 71 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", 72 | "dev": true 73 | }, 74 | "aws4": { 75 | "version": "1.8.0", 76 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", 77 | "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", 78 | "dev": true 79 | }, 80 | "balanced-match": { 81 | "version": "1.0.0", 82 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 83 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 84 | "dev": true 85 | }, 86 | "bcrypt-pbkdf": { 87 | "version": "1.0.2", 88 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 89 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 90 | "dev": true, 91 | "requires": { 92 | "tweetnacl": "^0.14.3" 93 | } 94 | }, 95 | "brace-expansion": { 96 | "version": "1.1.11", 97 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 98 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 99 | "dev": true, 100 | "requires": { 101 | "balanced-match": "^1.0.0", 102 | "concat-map": "0.0.1" 103 | } 104 | }, 105 | "caseless": { 106 | "version": "0.12.0", 107 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 108 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", 109 | "dev": true 110 | }, 111 | "codeclimate-test-reporter": { 112 | "version": "0.5.1", 113 | "resolved": "https://registry.npmjs.org/codeclimate-test-reporter/-/codeclimate-test-reporter-0.5.1.tgz", 114 | "integrity": "sha512-XCzmc8dH+R4orK11BCg5pBbXc35abxq9sept4YvUFRkFl9zb9MIVRrCKENe6U1TKAMTgvGJmrYyHn0y2lerpmg==", 115 | "dev": true, 116 | "requires": { 117 | "async": "~1.5.2", 118 | "commander": "2.9.0", 119 | "lcov-parse": "0.0.10", 120 | "request": "~2.88.0" 121 | } 122 | }, 123 | "combined-stream": { 124 | "version": "1.0.7", 125 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", 126 | "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", 127 | "dev": true, 128 | "requires": { 129 | "delayed-stream": "~1.0.0" 130 | } 131 | }, 132 | "commander": { 133 | "version": "2.9.0", 134 | "resolved": "http://registry.npmjs.org/commander/-/commander-2.9.0.tgz", 135 | "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", 136 | "dev": true, 137 | "requires": { 138 | "graceful-readlink": ">= 1.0.0" 139 | } 140 | }, 141 | "concat-map": { 142 | "version": "0.0.1", 143 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 144 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 145 | "dev": true 146 | }, 147 | "core-util-is": { 148 | "version": "1.0.2", 149 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 150 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 151 | "dev": true 152 | }, 153 | "cross-env": { 154 | "version": "2.0.1", 155 | "resolved": "http://registry.npmjs.org/cross-env/-/cross-env-2.0.1.tgz", 156 | "integrity": "sha1-8oO0A56nWa2pq36YetO92yQbeaY=", 157 | "dev": true, 158 | "requires": { 159 | "cross-spawn": "^3.0.1", 160 | "lodash.assign": "^3.2.0" 161 | } 162 | }, 163 | "cross-spawn": { 164 | "version": "3.0.1", 165 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", 166 | "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", 167 | "dev": true, 168 | "requires": { 169 | "lru-cache": "^4.0.1", 170 | "which": "^1.2.9" 171 | } 172 | }, 173 | "dashdash": { 174 | "version": "1.14.1", 175 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 176 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 177 | "dev": true, 178 | "requires": { 179 | "assert-plus": "^1.0.0" 180 | } 181 | }, 182 | "deep-equal": { 183 | "version": "1.0.1", 184 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 185 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", 186 | "dev": true 187 | }, 188 | "deep-is": { 189 | "version": "0.1.3", 190 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 191 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 192 | "dev": true 193 | }, 194 | "define-properties": { 195 | "version": "1.1.3", 196 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 197 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 198 | "dev": true, 199 | "requires": { 200 | "object-keys": "^1.0.12" 201 | } 202 | }, 203 | "defined": { 204 | "version": "1.0.0", 205 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 206 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", 207 | "dev": true 208 | }, 209 | "delayed-stream": { 210 | "version": "1.0.0", 211 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 212 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 213 | "dev": true 214 | }, 215 | "duplexer": { 216 | "version": "0.1.1", 217 | "resolved": "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", 218 | "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" 219 | }, 220 | "ecc-jsbn": { 221 | "version": "0.1.2", 222 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 223 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 224 | "dev": true, 225 | "requires": { 226 | "jsbn": "~0.1.0", 227 | "safer-buffer": "^2.1.0" 228 | } 229 | }, 230 | "es-abstract": { 231 | "version": "1.12.0", 232 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", 233 | "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", 234 | "dev": true, 235 | "requires": { 236 | "es-to-primitive": "^1.1.1", 237 | "function-bind": "^1.1.1", 238 | "has": "^1.0.1", 239 | "is-callable": "^1.1.3", 240 | "is-regex": "^1.0.4" 241 | } 242 | }, 243 | "es-to-primitive": { 244 | "version": "1.2.0", 245 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", 246 | "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", 247 | "dev": true, 248 | "requires": { 249 | "is-callable": "^1.1.4", 250 | "is-date-object": "^1.0.1", 251 | "is-symbol": "^1.0.2" 252 | } 253 | }, 254 | "escodegen": { 255 | "version": "1.8.1", 256 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", 257 | "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", 258 | "dev": true, 259 | "requires": { 260 | "esprima": "^2.7.1", 261 | "estraverse": "^1.9.1", 262 | "esutils": "^2.0.2", 263 | "optionator": "^0.8.1", 264 | "source-map": "~0.2.0" 265 | } 266 | }, 267 | "esprima": { 268 | "version": "2.7.3", 269 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", 270 | "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", 271 | "dev": true 272 | }, 273 | "estraverse": { 274 | "version": "1.9.3", 275 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", 276 | "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", 277 | "dev": true 278 | }, 279 | "esutils": { 280 | "version": "2.0.2", 281 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 282 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 283 | "dev": true 284 | }, 285 | "event-stream": { 286 | "version": "3.3.4", 287 | "resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", 288 | "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", 289 | "requires": { 290 | "duplexer": "~0.1.1", 291 | "from": "~0", 292 | "map-stream": "~0.1.0", 293 | "pause-stream": "0.0.11", 294 | "split": "0.3", 295 | "stream-combiner": "~0.0.4", 296 | "through": "~2.3.1" 297 | } 298 | }, 299 | "extend": { 300 | "version": "3.0.2", 301 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 302 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", 303 | "dev": true 304 | }, 305 | "extsprintf": { 306 | "version": "1.3.0", 307 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 308 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", 309 | "dev": true 310 | }, 311 | "fast-deep-equal": { 312 | "version": "2.0.1", 313 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", 314 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", 315 | "dev": true 316 | }, 317 | "fast-json-stable-stringify": { 318 | "version": "2.0.0", 319 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 320 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", 321 | "dev": true 322 | }, 323 | "fast-levenshtein": { 324 | "version": "2.0.6", 325 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 326 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 327 | "dev": true 328 | }, 329 | "for-each": { 330 | "version": "0.3.3", 331 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", 332 | "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", 333 | "dev": true, 334 | "requires": { 335 | "is-callable": "^1.1.3" 336 | } 337 | }, 338 | "forever-agent": { 339 | "version": "0.6.1", 340 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 341 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", 342 | "dev": true 343 | }, 344 | "form-data": { 345 | "version": "2.3.3", 346 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 347 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 348 | "dev": true, 349 | "requires": { 350 | "asynckit": "^0.4.0", 351 | "combined-stream": "^1.0.6", 352 | "mime-types": "^2.1.12" 353 | } 354 | }, 355 | "from": { 356 | "version": "0.1.7", 357 | "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", 358 | "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=" 359 | }, 360 | "fs.realpath": { 361 | "version": "1.0.0", 362 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 363 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 364 | "dev": true 365 | }, 366 | "function-bind": { 367 | "version": "1.1.1", 368 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 369 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 370 | "dev": true 371 | }, 372 | "getpass": { 373 | "version": "0.1.7", 374 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 375 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 376 | "dev": true, 377 | "requires": { 378 | "assert-plus": "^1.0.0" 379 | } 380 | }, 381 | "glob": { 382 | "version": "5.0.15", 383 | "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", 384 | "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", 385 | "dev": true, 386 | "requires": { 387 | "inflight": "^1.0.4", 388 | "inherits": "2", 389 | "minimatch": "2 || 3", 390 | "once": "^1.3.0", 391 | "path-is-absolute": "^1.0.0" 392 | } 393 | }, 394 | "graceful-readlink": { 395 | "version": "1.0.1", 396 | "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", 397 | "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", 398 | "dev": true 399 | }, 400 | "handlebars": { 401 | "version": "4.0.12", 402 | "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz", 403 | "integrity": "sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==", 404 | "dev": true, 405 | "requires": { 406 | "async": "^2.5.0", 407 | "optimist": "^0.6.1", 408 | "source-map": "^0.6.1", 409 | "uglify-js": "^3.1.4" 410 | }, 411 | "dependencies": { 412 | "async": { 413 | "version": "2.6.1", 414 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", 415 | "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", 416 | "dev": true, 417 | "requires": { 418 | "lodash": "^4.17.10" 419 | } 420 | }, 421 | "source-map": { 422 | "version": "0.6.1", 423 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 424 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 425 | "dev": true 426 | } 427 | } 428 | }, 429 | "har-schema": { 430 | "version": "2.0.0", 431 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 432 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", 433 | "dev": true 434 | }, 435 | "har-validator": { 436 | "version": "5.1.3", 437 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", 438 | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", 439 | "dev": true, 440 | "requires": { 441 | "ajv": "^6.5.5", 442 | "har-schema": "^2.0.0" 443 | } 444 | }, 445 | "has": { 446 | "version": "1.0.3", 447 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 448 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 449 | "dev": true, 450 | "requires": { 451 | "function-bind": "^1.1.1" 452 | } 453 | }, 454 | "has-flag": { 455 | "version": "1.0.0", 456 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", 457 | "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", 458 | "dev": true 459 | }, 460 | "has-symbols": { 461 | "version": "1.0.0", 462 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", 463 | "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", 464 | "dev": true 465 | }, 466 | "http-signature": { 467 | "version": "1.2.0", 468 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 469 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 470 | "dev": true, 471 | "requires": { 472 | "assert-plus": "^1.0.0", 473 | "jsprim": "^1.2.2", 474 | "sshpk": "^1.7.0" 475 | } 476 | }, 477 | "inflight": { 478 | "version": "1.0.6", 479 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 480 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 481 | "dev": true, 482 | "requires": { 483 | "once": "^1.3.0", 484 | "wrappy": "1" 485 | } 486 | }, 487 | "inherits": { 488 | "version": "2.0.3", 489 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 490 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 491 | "dev": true 492 | }, 493 | "is-callable": { 494 | "version": "1.1.4", 495 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", 496 | "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", 497 | "dev": true 498 | }, 499 | "is-date-object": { 500 | "version": "1.0.1", 501 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", 502 | "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", 503 | "dev": true 504 | }, 505 | "is-regex": { 506 | "version": "1.0.4", 507 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", 508 | "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", 509 | "dev": true, 510 | "requires": { 511 | "has": "^1.0.1" 512 | } 513 | }, 514 | "is-symbol": { 515 | "version": "1.0.2", 516 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", 517 | "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", 518 | "dev": true, 519 | "requires": { 520 | "has-symbols": "^1.0.0" 521 | } 522 | }, 523 | "is-typedarray": { 524 | "version": "1.0.0", 525 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 526 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", 527 | "dev": true 528 | }, 529 | "isexe": { 530 | "version": "2.0.0", 531 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 532 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 533 | "dev": true 534 | }, 535 | "isstream": { 536 | "version": "0.1.2", 537 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 538 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", 539 | "dev": true 540 | }, 541 | "istanbul": { 542 | "version": "0.4.5", 543 | "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", 544 | "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", 545 | "dev": true, 546 | "requires": { 547 | "abbrev": "1.0.x", 548 | "async": "1.x", 549 | "escodegen": "1.8.x", 550 | "esprima": "2.7.x", 551 | "glob": "^5.0.15", 552 | "handlebars": "^4.0.1", 553 | "js-yaml": "3.x", 554 | "mkdirp": "0.5.x", 555 | "nopt": "3.x", 556 | "once": "1.x", 557 | "resolve": "1.1.x", 558 | "supports-color": "^3.1.0", 559 | "which": "^1.1.1", 560 | "wordwrap": "^1.0.0" 561 | } 562 | }, 563 | "js-yaml": { 564 | "version": "3.12.0", 565 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", 566 | "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", 567 | "dev": true, 568 | "requires": { 569 | "argparse": "^1.0.7", 570 | "esprima": "^4.0.0" 571 | }, 572 | "dependencies": { 573 | "esprima": { 574 | "version": "4.0.1", 575 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 576 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 577 | "dev": true 578 | } 579 | } 580 | }, 581 | "jsbn": { 582 | "version": "0.1.1", 583 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 584 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 585 | "dev": true 586 | }, 587 | "json-schema": { 588 | "version": "0.2.3", 589 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 590 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", 591 | "dev": true 592 | }, 593 | "json-schema-traverse": { 594 | "version": "0.4.1", 595 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 596 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 597 | "dev": true 598 | }, 599 | "json-stringify-safe": { 600 | "version": "5.0.1", 601 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 602 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", 603 | "dev": true 604 | }, 605 | "jsprim": { 606 | "version": "1.4.1", 607 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 608 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 609 | "dev": true, 610 | "requires": { 611 | "assert-plus": "1.0.0", 612 | "extsprintf": "1.3.0", 613 | "json-schema": "0.2.3", 614 | "verror": "1.10.0" 615 | } 616 | }, 617 | "lcov-parse": { 618 | "version": "0.0.10", 619 | "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", 620 | "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", 621 | "dev": true 622 | }, 623 | "levn": { 624 | "version": "0.3.0", 625 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 626 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 627 | "dev": true, 628 | "requires": { 629 | "prelude-ls": "~1.1.2", 630 | "type-check": "~0.3.2" 631 | } 632 | }, 633 | "lodash": { 634 | "version": "4.17.11", 635 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", 636 | "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", 637 | "dev": true 638 | }, 639 | "lodash._baseassign": { 640 | "version": "3.2.0", 641 | "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", 642 | "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", 643 | "dev": true, 644 | "requires": { 645 | "lodash._basecopy": "^3.0.0", 646 | "lodash.keys": "^3.0.0" 647 | } 648 | }, 649 | "lodash._basecopy": { 650 | "version": "3.0.1", 651 | "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", 652 | "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", 653 | "dev": true 654 | }, 655 | "lodash._bindcallback": { 656 | "version": "3.0.1", 657 | "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", 658 | "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", 659 | "dev": true 660 | }, 661 | "lodash._createassigner": { 662 | "version": "3.1.1", 663 | "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", 664 | "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=", 665 | "dev": true, 666 | "requires": { 667 | "lodash._bindcallback": "^3.0.0", 668 | "lodash._isiterateecall": "^3.0.0", 669 | "lodash.restparam": "^3.0.0" 670 | } 671 | }, 672 | "lodash._getnative": { 673 | "version": "3.9.1", 674 | "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", 675 | "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", 676 | "dev": true 677 | }, 678 | "lodash._isiterateecall": { 679 | "version": "3.0.9", 680 | "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", 681 | "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", 682 | "dev": true 683 | }, 684 | "lodash.assign": { 685 | "version": "3.2.0", 686 | "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", 687 | "integrity": "sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=", 688 | "dev": true, 689 | "requires": { 690 | "lodash._baseassign": "^3.0.0", 691 | "lodash._createassigner": "^3.0.0", 692 | "lodash.keys": "^3.0.0" 693 | } 694 | }, 695 | "lodash.isarguments": { 696 | "version": "3.1.0", 697 | "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", 698 | "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", 699 | "dev": true 700 | }, 701 | "lodash.isarray": { 702 | "version": "3.0.4", 703 | "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", 704 | "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", 705 | "dev": true 706 | }, 707 | "lodash.keys": { 708 | "version": "3.1.2", 709 | "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", 710 | "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", 711 | "dev": true, 712 | "requires": { 713 | "lodash._getnative": "^3.0.0", 714 | "lodash.isarguments": "^3.0.0", 715 | "lodash.isarray": "^3.0.0" 716 | } 717 | }, 718 | "lodash.restparam": { 719 | "version": "3.6.1", 720 | "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", 721 | "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", 722 | "dev": true 723 | }, 724 | "lru-cache": { 725 | "version": "4.1.4", 726 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.4.tgz", 727 | "integrity": "sha512-EPstzZ23znHUVLKj+lcXO1KvZkrlw+ZirdwvOmnAnA/1PB4ggyXJ77LRkCqkff+ShQ+cqoxCxLQOh4cKITO5iA==", 728 | "dev": true, 729 | "requires": { 730 | "pseudomap": "^1.0.2", 731 | "yallist": "^3.0.2" 732 | } 733 | }, 734 | "map-stream": { 735 | "version": "0.1.0", 736 | "resolved": "http://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", 737 | "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=" 738 | }, 739 | "mime-db": { 740 | "version": "1.37.0", 741 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", 742 | "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", 743 | "dev": true 744 | }, 745 | "mime-types": { 746 | "version": "2.1.21", 747 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", 748 | "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", 749 | "dev": true, 750 | "requires": { 751 | "mime-db": "~1.37.0" 752 | } 753 | }, 754 | "minimatch": { 755 | "version": "3.0.4", 756 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 757 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 758 | "dev": true, 759 | "requires": { 760 | "brace-expansion": "^1.1.7" 761 | } 762 | }, 763 | "minimist": { 764 | "version": "0.0.10", 765 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", 766 | "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", 767 | "dev": true 768 | }, 769 | "mkdirp": { 770 | "version": "0.5.1", 771 | "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 772 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 773 | "dev": true, 774 | "requires": { 775 | "minimist": "0.0.8" 776 | }, 777 | "dependencies": { 778 | "minimist": { 779 | "version": "0.0.8", 780 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 781 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 782 | "dev": true 783 | } 784 | } 785 | }, 786 | "nopt": { 787 | "version": "3.0.6", 788 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", 789 | "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", 790 | "dev": true, 791 | "requires": { 792 | "abbrev": "1" 793 | } 794 | }, 795 | "oauth-sign": { 796 | "version": "0.9.0", 797 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 798 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", 799 | "dev": true 800 | }, 801 | "object-inspect": { 802 | "version": "1.6.0", 803 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", 804 | "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", 805 | "dev": true 806 | }, 807 | "object-keys": { 808 | "version": "1.0.12", 809 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", 810 | "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", 811 | "dev": true 812 | }, 813 | "once": { 814 | "version": "1.4.0", 815 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 816 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 817 | "dev": true, 818 | "requires": { 819 | "wrappy": "1" 820 | } 821 | }, 822 | "optimist": { 823 | "version": "0.6.1", 824 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", 825 | "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", 826 | "dev": true, 827 | "requires": { 828 | "minimist": "~0.0.1", 829 | "wordwrap": "~0.0.2" 830 | }, 831 | "dependencies": { 832 | "wordwrap": { 833 | "version": "0.0.3", 834 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", 835 | "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", 836 | "dev": true 837 | } 838 | } 839 | }, 840 | "optionator": { 841 | "version": "0.8.2", 842 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", 843 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 844 | "dev": true, 845 | "requires": { 846 | "deep-is": "~0.1.3", 847 | "fast-levenshtein": "~2.0.4", 848 | "levn": "~0.3.0", 849 | "prelude-ls": "~1.1.2", 850 | "type-check": "~0.3.2", 851 | "wordwrap": "~1.0.0" 852 | } 853 | }, 854 | "path-is-absolute": { 855 | "version": "1.0.1", 856 | "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 857 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 858 | "dev": true 859 | }, 860 | "path-parse": { 861 | "version": "1.0.6", 862 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 863 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 864 | "dev": true 865 | }, 866 | "pause-stream": { 867 | "version": "0.0.11", 868 | "resolved": "http://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", 869 | "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", 870 | "requires": { 871 | "through": "~2.3" 872 | } 873 | }, 874 | "performance-now": { 875 | "version": "2.1.0", 876 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 877 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", 878 | "dev": true 879 | }, 880 | "prelude-ls": { 881 | "version": "1.1.2", 882 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 883 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 884 | "dev": true 885 | }, 886 | "pseudomap": { 887 | "version": "1.0.2", 888 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 889 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", 890 | "dev": true 891 | }, 892 | "psl": { 893 | "version": "1.1.29", 894 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", 895 | "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", 896 | "dev": true 897 | }, 898 | "punycode": { 899 | "version": "2.1.1", 900 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 901 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 902 | "dev": true 903 | }, 904 | "qs": { 905 | "version": "6.5.2", 906 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 907 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", 908 | "dev": true 909 | }, 910 | "request": { 911 | "version": "2.88.0", 912 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", 913 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", 914 | "dev": true, 915 | "requires": { 916 | "aws-sign2": "~0.7.0", 917 | "aws4": "^1.8.0", 918 | "caseless": "~0.12.0", 919 | "combined-stream": "~1.0.6", 920 | "extend": "~3.0.2", 921 | "forever-agent": "~0.6.1", 922 | "form-data": "~2.3.2", 923 | "har-validator": "~5.1.0", 924 | "http-signature": "~1.2.0", 925 | "is-typedarray": "~1.0.0", 926 | "isstream": "~0.1.2", 927 | "json-stringify-safe": "~5.0.1", 928 | "mime-types": "~2.1.19", 929 | "oauth-sign": "~0.9.0", 930 | "performance-now": "^2.1.0", 931 | "qs": "~6.5.2", 932 | "safe-buffer": "^5.1.2", 933 | "tough-cookie": "~2.4.3", 934 | "tunnel-agent": "^0.6.0", 935 | "uuid": "^3.3.2" 936 | } 937 | }, 938 | "resolve": { 939 | "version": "1.1.7", 940 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", 941 | "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", 942 | "dev": true 943 | }, 944 | "resumer": { 945 | "version": "0.0.0", 946 | "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", 947 | "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", 948 | "dev": true, 949 | "requires": { 950 | "through": "~2.3.4" 951 | } 952 | }, 953 | "safe-buffer": { 954 | "version": "5.1.2", 955 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 956 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 957 | "dev": true 958 | }, 959 | "safer-buffer": { 960 | "version": "2.1.2", 961 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 962 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 963 | "dev": true 964 | }, 965 | "source-map": { 966 | "version": "0.2.0", 967 | "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", 968 | "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", 969 | "dev": true, 970 | "optional": true, 971 | "requires": { 972 | "amdefine": ">=0.0.4" 973 | } 974 | }, 975 | "split": { 976 | "version": "0.3.3", 977 | "resolved": "http://registry.npmjs.org/split/-/split-0.3.3.tgz", 978 | "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", 979 | "requires": { 980 | "through": "2" 981 | } 982 | }, 983 | "sprintf-js": { 984 | "version": "1.0.3", 985 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 986 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 987 | "dev": true 988 | }, 989 | "sshpk": { 990 | "version": "1.15.2", 991 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.2.tgz", 992 | "integrity": "sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==", 993 | "dev": true, 994 | "requires": { 995 | "asn1": "~0.2.3", 996 | "assert-plus": "^1.0.0", 997 | "bcrypt-pbkdf": "^1.0.0", 998 | "dashdash": "^1.12.0", 999 | "ecc-jsbn": "~0.1.1", 1000 | "getpass": "^0.1.1", 1001 | "jsbn": "~0.1.0", 1002 | "safer-buffer": "^2.0.2", 1003 | "tweetnacl": "~0.14.0" 1004 | } 1005 | }, 1006 | "stream-combiner": { 1007 | "version": "0.0.4", 1008 | "resolved": "http://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", 1009 | "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", 1010 | "requires": { 1011 | "duplexer": "~0.1.1" 1012 | } 1013 | }, 1014 | "string.prototype.trim": { 1015 | "version": "1.1.2", 1016 | "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz", 1017 | "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=", 1018 | "dev": true, 1019 | "requires": { 1020 | "define-properties": "^1.1.2", 1021 | "es-abstract": "^1.5.0", 1022 | "function-bind": "^1.0.2" 1023 | } 1024 | }, 1025 | "supports-color": { 1026 | "version": "3.2.3", 1027 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", 1028 | "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", 1029 | "dev": true, 1030 | "requires": { 1031 | "has-flag": "^1.0.0" 1032 | } 1033 | }, 1034 | "tape": { 1035 | "version": "4.9.1", 1036 | "resolved": "https://registry.npmjs.org/tape/-/tape-4.9.1.tgz", 1037 | "integrity": "sha512-6fKIXknLpoe/Jp4rzHKFPpJUHDHDqn8jus99IfPnHIjyz78HYlefTGD3b5EkbQzuLfaEvmfPK3IolLgq2xT3kw==", 1038 | "dev": true, 1039 | "requires": { 1040 | "deep-equal": "~1.0.1", 1041 | "defined": "~1.0.0", 1042 | "for-each": "~0.3.3", 1043 | "function-bind": "~1.1.1", 1044 | "glob": "~7.1.2", 1045 | "has": "~1.0.3", 1046 | "inherits": "~2.0.3", 1047 | "minimist": "~1.2.0", 1048 | "object-inspect": "~1.6.0", 1049 | "resolve": "~1.7.1", 1050 | "resumer": "~0.0.0", 1051 | "string.prototype.trim": "~1.1.2", 1052 | "through": "~2.3.8" 1053 | }, 1054 | "dependencies": { 1055 | "glob": { 1056 | "version": "7.1.3", 1057 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 1058 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 1059 | "dev": true, 1060 | "requires": { 1061 | "fs.realpath": "^1.0.0", 1062 | "inflight": "^1.0.4", 1063 | "inherits": "2", 1064 | "minimatch": "^3.0.4", 1065 | "once": "^1.3.0", 1066 | "path-is-absolute": "^1.0.0" 1067 | } 1068 | }, 1069 | "minimist": { 1070 | "version": "1.2.0", 1071 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 1072 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 1073 | "dev": true 1074 | }, 1075 | "resolve": { 1076 | "version": "1.7.1", 1077 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", 1078 | "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", 1079 | "dev": true, 1080 | "requires": { 1081 | "path-parse": "^1.0.5" 1082 | } 1083 | } 1084 | } 1085 | }, 1086 | "through": { 1087 | "version": "2.3.8", 1088 | "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", 1089 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" 1090 | }, 1091 | "tough-cookie": { 1092 | "version": "2.4.3", 1093 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", 1094 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", 1095 | "dev": true, 1096 | "requires": { 1097 | "psl": "^1.1.24", 1098 | "punycode": "^1.4.1" 1099 | }, 1100 | "dependencies": { 1101 | "punycode": { 1102 | "version": "1.4.1", 1103 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 1104 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", 1105 | "dev": true 1106 | } 1107 | } 1108 | }, 1109 | "tree-kill": { 1110 | "version": "1.2.1", 1111 | "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.1.tgz", 1112 | "integrity": "sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==", 1113 | "dev": true 1114 | }, 1115 | "tunnel-agent": { 1116 | "version": "0.6.0", 1117 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1118 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 1119 | "dev": true, 1120 | "requires": { 1121 | "safe-buffer": "^5.0.1" 1122 | } 1123 | }, 1124 | "tweetnacl": { 1125 | "version": "0.14.5", 1126 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 1127 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 1128 | "dev": true 1129 | }, 1130 | "type-check": { 1131 | "version": "0.3.2", 1132 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 1133 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 1134 | "dev": true, 1135 | "requires": { 1136 | "prelude-ls": "~1.1.2" 1137 | } 1138 | }, 1139 | "uglify-js": { 1140 | "version": "3.4.9", 1141 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", 1142 | "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", 1143 | "dev": true, 1144 | "optional": true, 1145 | "requires": { 1146 | "commander": "~2.17.1", 1147 | "source-map": "~0.6.1" 1148 | }, 1149 | "dependencies": { 1150 | "commander": { 1151 | "version": "2.17.1", 1152 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", 1153 | "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", 1154 | "dev": true, 1155 | "optional": true 1156 | }, 1157 | "source-map": { 1158 | "version": "0.6.1", 1159 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1160 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1161 | "dev": true, 1162 | "optional": true 1163 | } 1164 | } 1165 | }, 1166 | "uri-js": { 1167 | "version": "4.2.2", 1168 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 1169 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 1170 | "dev": true, 1171 | "requires": { 1172 | "punycode": "^2.1.0" 1173 | } 1174 | }, 1175 | "uuid": { 1176 | "version": "3.3.2", 1177 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 1178 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", 1179 | "dev": true 1180 | }, 1181 | "verror": { 1182 | "version": "1.10.0", 1183 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 1184 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 1185 | "dev": true, 1186 | "requires": { 1187 | "assert-plus": "^1.0.0", 1188 | "core-util-is": "1.0.2", 1189 | "extsprintf": "^1.2.0" 1190 | } 1191 | }, 1192 | "which": { 1193 | "version": "1.3.1", 1194 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1195 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1196 | "dev": true, 1197 | "requires": { 1198 | "isexe": "^2.0.0" 1199 | } 1200 | }, 1201 | "wordwrap": { 1202 | "version": "1.0.0", 1203 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 1204 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", 1205 | "dev": true 1206 | }, 1207 | "wrappy": { 1208 | "version": "1.0.2", 1209 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1210 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1211 | "dev": true 1212 | }, 1213 | "yallist": { 1214 | "version": "3.0.3", 1215 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", 1216 | "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", 1217 | "dev": true 1218 | } 1219 | } 1220 | } 1221 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ps-tree", 3 | "version": "1.2.0", 4 | "description": "Get all children of a pid", 5 | "license": "MIT", 6 | "homepage": "http://github.com/indexzero/ps-tree#readme", 7 | "repository": "github:indexzero/ps-tree", 8 | "bugs": { 9 | "url": "https://github.com/indexzero/ps-tree/issues", 10 | "email": "charlie.robbins@gmail.com" 11 | }, 12 | "author": "Charlie Robbins ", 13 | "contributors": [ 14 | "Zhuohuan LI (https://github.com/zixia)", 15 | "Simone Primarosa (https://github.com/simonepri)" 16 | ], 17 | "keyboards": [ 18 | "ps-tree", 19 | "ps", 20 | "tree", 21 | "ppid", 22 | "pid" 23 | ], 24 | "main": "index.js", 25 | "bin": { 26 | "ps-tree": "./bin/ps-tree.js" 27 | }, 28 | "files": [ 29 | "bin", 30 | "index.js" 31 | ], 32 | "engines": { 33 | "node": ">= 0.10" 34 | }, 35 | "scripts": { 36 | "test": "istanbul cover node_modules/tape/bin/tape test/test.js", 37 | "coverage": "cross-env CODECLIMATE_REPO_TOKEN=84436b4f13c70ace9c62e7f04928bf23c234eb212c0232d39d7fb1535beb2da5 node_modules/.bin/codeclimate-test-reporter < coverage/lcov.info" 38 | }, 39 | "dependencies": { 40 | "event-stream": "=3.3.4" 41 | }, 42 | "devDependencies": { 43 | "codeclimate-test-reporter": "^0.5.0", 44 | "cross-env": "^2.0.1", 45 | "istanbul": "^0.4.5", 46 | "tape": "^4.9.0", 47 | "tree-kill": "^1.1.0" 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /test/exec/child.js: -------------------------------------------------------------------------------- 1 | var started = false; 2 | setInterval(function() { 3 | if (started) return; 4 | console.log(process.pid); 5 | started = true; 6 | }, 100); // Does nothing, but prevents exit 7 | -------------------------------------------------------------------------------- /test/exec/parent.js: -------------------------------------------------------------------------------- 1 | var path = require('path'); 2 | var cp = require('child_process'); 3 | 4 | var started = false; 5 | var spawned = {}; 6 | 7 | for (var i = 0; i < 10; i++) { 8 | var child = cp.spawn('node', [path.join('test', 'exec', 'child.js')]); 9 | child.stdout.on('data', function (child) { 10 | spawned[child.pid] = true; 11 | }.bind(this, child)); 12 | } 13 | 14 | setInterval(function() { 15 | if (started) return; 16 | if (Object.keys(spawned).length !== 10) return; 17 | console.log(process.pid); 18 | started = true; 19 | }, 100); // Does nothing, but prevents exit 20 | -------------------------------------------------------------------------------- /test/test.js: -------------------------------------------------------------------------------- 1 | var path = require('path'); 2 | var cp = require('child_process'); 3 | 4 | var test = require('tape'); 5 | var treeKill = require('tree-kill'); 6 | 7 | var psTree = require('../'); 8 | 9 | var scripts = { 10 | parent: path.join(__dirname, 'exec', 'parent.js'), 11 | child: path.join(__dirname, 'exec', 'child.js') 12 | }; 13 | 14 | test('Spawn a Parent process which has ten Child processes', function (t) { 15 | t.timeoutAfter(10000); 16 | var parent = cp.spawn('node', [scripts.parent]); 17 | 18 | parent.stdout.on('data', function (data) { 19 | psTree(parent.pid, function (error, children) { 20 | if (error) { 21 | t.error(error); 22 | t.end(); 23 | return; 24 | } 25 | 26 | t.equal(children.length, 10, 'There should be 10 active child processes'); 27 | if (children.length !== 10) { 28 | t.comment(parent.pid.toString()); 29 | t.comment(JSON.stringify(children, null, 2)); 30 | } 31 | 32 | treeKill(parent.pid, function(error) { 33 | if (error) { 34 | t.error(error); 35 | t.end(); 36 | return; 37 | } 38 | t.end(); 39 | }); 40 | }); 41 | }); 42 | }); 43 | 44 | test('Spawn a Child Process which has zero Child processes', function (t) { 45 | t.timeoutAfter(10000); 46 | var child = cp.spawn('node', [scripts.child]); 47 | 48 | child.stdout.on('data', function (data) { 49 | psTree(child.pid, function (error, children) { 50 | if (error) { 51 | t.error(error); 52 | t.end(); 53 | return; 54 | } 55 | 56 | t.equal(children.length, 0, 'There should be no active child processes'); 57 | if (children.length !== 0) { 58 | t.comment(child.pid.toString()); 59 | t.comment(JSON.stringify(children, null, 2)); 60 | } 61 | 62 | treeKill(child.pid, function(error) { 63 | if (error) { 64 | t.error(error); 65 | t.end(); 66 | return; 67 | } 68 | t.end(); 69 | }); 70 | }); 71 | }); 72 | }); 73 | 74 | test('Call psTree without supplying a Callback', function (t) { 75 | var errmsg = 'Error: childrenOfPid(pid, callback) expects callback'; 76 | 77 | // Attempt to call psTree without a callback 78 | try { 79 | psTree(1234); 80 | } catch (e) { 81 | t.equal(e.toString(), errmsg); 82 | } 83 | 84 | t.end(); 85 | }); 86 | 87 | test('Directly Execute bin/ps-tree.js', function (t) { 88 | var child = cp.exec('node ./bin/ps-tree.js', function (error, data) { 89 | if (error !== null) { 90 | t.error(err); 91 | t.end(); 92 | return; 93 | } 94 | t.end(); 95 | }); 96 | }); 97 | --------------------------------------------------------------------------------