├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── index.js ├── lib └── psaux.js ├── package.json ├── relaser.json ├── test └── index.js └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | 6 | # Runtime data 7 | pids 8 | *.pid 9 | *.seed 10 | 11 | # Directory for instrumented libs generated by jscoverage/JSCover 12 | lib-cov 13 | 14 | # Coverage directory used by tools like istanbul 15 | coverage 16 | 17 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 18 | .grunt 19 | 20 | # node-waf configuration 21 | .lock-wscript 22 | 23 | # Compiled binary addons (http://nodejs.org/api/addons.html) 24 | build/Release 25 | 26 | # Dependency directory 27 | node_modules 28 | 29 | # Optional npm cache directory 30 | .npm 31 | 32 | # Optional REPL history 33 | .node_repl_history 34 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "4.0" 4 | install: 5 | - "npm i" 6 | script: 7 | - npm test -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Hector Leon Zarco Garcia 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 all 13 | 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 THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # psaux [![Build Status](https://travis-ci.org/zzarcon/psaux.svg?branch=master)](https://travis-ci.org/zzarcon/psaux) [![npm version](https://badge.fury.io/js/psaux.svg)](https://badge.fury.io/js/psaux) [![Dependency Status](https://david-dm.org/zzarcon/psaux.svg)](https://david-dm.org/zzarcon/psaux) [![npm license](https://img.shields.io/npm/l/awesome-badges.svg)](https://www.npmjs.org/package/awesome-badges) 2 | > Process status in Node.js as you've always wanted 3 | 4 | Promise oriented and lightweight Javascript utility for getting info about the processes runing in your machine. 5 | It is designed to give you a friendly api for filter within all of them. 6 | 7 | # Install 8 | 9 | `$ npm install psaux --save` 10 | 11 | # Usage 12 | 13 | Display the `user`, `pid`, `cpu` and `mem` of all the running processes: 14 | 15 | ```javascript 16 | const psaux = require('psaux'); 17 | 18 | psaux().then(list => { 19 | list.forEach(ps => { 20 | console.log(ps.user, ps.pid, ps.cpu, ps.mem); 21 | }); 22 | }); 23 | ``` 24 | 25 | Find a concrete process using his **pid** 26 | 27 | ```javascript 28 | psaux().then(list => { 29 | let chrome = list.query({pid: 12345}); 30 | 31 | console.log('Google chrome is using ' + chrome.cpu + '% of CPU and ' + chrome.mem + '% of memory'); 32 | }); 33 | 34 | ``` 35 | Display inefficient processes started from the `root` user. 36 | 37 | ```javascript 38 | psaux().then(list => { 39 | let inefficient = list.query({ 40 | user: 'root', 41 | mem: '>5' 42 | }); 43 | 44 | console.log('Processes started by root and using more that 5% of memory'); 45 | }); 46 | ``` 47 | 48 | Search for a process containing the passed string (very useful if you don't know the pid) 49 | 50 | ```javascript 51 | psaux().then(list => { 52 | let chrome = list.query({command: '~chrome'}); 53 | 54 | if (chrome) { 55 | console.log('Chrome process found!', chrome); 56 | } 57 | }); 58 | ``` 59 | 60 | # Filters 61 | 62 | You can filter by every property of the returned objects using the **query** method. Also you can create complex filters if needed: 63 | 64 | ```javascript 65 | list.query({ 66 | user: 'john', 67 | mem: '>2 <10', 68 | vsz: '>4000000', 69 | command: '~Sublime Text' 70 | }); 71 | ``` 72 | 73 | * `>` Greater than: `>5` 74 | * `<` Lower than: `<5` 75 | * `~` Contains: `~Chrome` 76 | 77 | # Properties 78 | 79 | The properties you can access are basically the same listed in the `ps` command: 80 | 81 | * **user**: user owning the process 82 | * **pid**: process ID 83 | * **cpu**: It is the CPU time used divided by the time the process has been running. 84 | * **mem**: ratio of the process’s resident set size to the physical memory on the machine 85 | * **vsz**: virtual memory usage of entire process (in KiB) 86 | * **rss**: resident set size, the non-swapped physical memory that a task has used (in KiB) 87 | * **tt**: controlling tty (terminal) 88 | * **stat**: multi-character process state 89 | * **started**: starting time or date of the process 90 | * **time**: cumulative CPU time 91 | * **command**: command with all its arguments 92 | 93 | # Supported platforms 94 | 95 | The module currently supports Mac OS, Linux and Windows. 96 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const psaux = require('./lib/psaux'); 2 | 3 | module.exports = psaux; -------------------------------------------------------------------------------- /lib/psaux.js: -------------------------------------------------------------------------------- 1 | const execa = require('execa'); 2 | const os = require('os'); 3 | 4 | const platform = os.platform() 5 | if (platform === 'freebsd') { 6 | module.exports = getFreeBSDProcess; 7 | } else if (platform != "win32") { 8 | module.exports = getProcess; 9 | } else { 10 | module.exports = getWinProcess; 11 | } 12 | 13 | function getWinProcess(options) { 14 | return new Promise((resolve, reject) => { 15 | execa('powershell', ['-noprofile', 16 | '$perf = get-wmiobject -class Win32_PerfFormattedData_PerfProc_Process;$proc = get-wmiobject -class win32_process -Property *;$TotalMem = get-wmiobject -class win32_computersystem | select -ExpandProperty TotalPhysicalMemory; $proc | foreach { $procID = $_; $procPerf = $perf | where {$_.creatingProcessID -eq $procID.ProcessID}; $procID | select name, @{n="user"; e= {$user = $_.getOwner(); if($user.user){"{0}\{1}" -f $user.domain, $user.user}else {"System"}}}, @{n="command"; e={$_.CommandLine}}, @{n="pid";e={$_.ProcessID}}, @{n="memory (MB)";e={"{0:N3}" -f ($_.ws / 1mb)}}, @{n="memory (%)";e={"{0:N3}" -f ($_.ws / $TotalMem)}}, @{n="started";e={$_.converttoDateTime($_.CreationDate)}}, @{n="cpu"; e={$item = $_;$COUNT = 0;if($procPerf.percentProcessorTime){$procPerf.PercentProcessorTime | foreach {$count += $_};$percent = $count / $procPerf.PercentProcessorTime.length;"{0:N3}" -f [double]$percent;} else {"{0:N3}" -f 0}}}, @{n="vsz"; e={$_.VirtualSize}},@{n="rss"; e={$_.WorkingSetSize}},@{n="tt"; e={$_.SessionID}},@{n="time"; e={$_.KernelModeTime+ ($_.UserModeTime *10000)}}}|convertto-json' 17 | ]).then(result => { 18 | var processes; 19 | try { 20 | processes = JSON.parse(result.stdout); 21 | } catch (err) { 22 | processes = []; 23 | reject(err); 24 | } 25 | 26 | processes = processes.reduce(parseWinProcesses, []); 27 | processes.query = query; 28 | resolve(processes); 29 | }); 30 | }); 31 | } 32 | 33 | function parseWinProcesses(list, ps) { 34 | list.push({ 35 | user: ps["user"], 36 | pid: ps["pid"], 37 | cpu: parseFloat(ps["cpu"]), 38 | mem: parseFloat(ps["memory (%)"]), 39 | name: ps["name"], 40 | vsz: ps["vsz"], 41 | rss: ps["rss"], 42 | tt: ps["tt"], 43 | started: new Date(ps["started"].DateTime), 44 | time: ps["time"], 45 | command: ps["command"] 46 | }); 47 | 48 | return list; 49 | } 50 | 51 | function getFreeBSDProcess(options) { 52 | return new Promise((resolve, reject) => { 53 | execa('ps', ['auxww']).then(result => { 54 | var processes = result.stdout.split('\n'); 55 | 56 | //Remove header 57 | processes.shift(); 58 | processes = processes.reduce(parseProcesses, []); 59 | 60 | processes.query = query; 61 | 62 | resolve(processes); 63 | }); 64 | }); 65 | } 66 | 67 | function getProcess(options) { 68 | return new Promise((resolve, reject) => { 69 | execa('ps', ['aux']).then(result => { 70 | var processes = result.stdout.split('\n'); 71 | 72 | //Remove header 73 | processes.shift(); 74 | processes = processes.reduce(parseProcesses, []); 75 | 76 | processes.query = query; 77 | 78 | resolve(processes); 79 | }); 80 | }); 81 | } 82 | 83 | /** 84 | * Normalizes the process payload into a readable object. 85 | * 86 | * @param {Array} list 87 | * @param {Array} ps 88 | * @return {Array} 89 | */ 90 | function parseProcesses(list, ps) { 91 | var p = ps.split(/ +/); 92 | 93 | list.push({ 94 | user: p[0], 95 | pid: p[1], 96 | cpu: parseFloat(p[2]), 97 | mem: parseFloat(p[3]), 98 | vsz: p[4], 99 | rss: p[5], 100 | tt: p[6], 101 | stat: p[7], 102 | started: p[8], 103 | time: p[9], 104 | command: p.slice(10).join(' ') 105 | }); 106 | 107 | return list; 108 | } 109 | 110 | /** 111 | * Return elements that match a certain query: 112 | * 113 | * @example 114 | * list.query({ 115 | * user: 'root', 116 | * cpu: '>10', 117 | * mem: '>5 <10', 118 | * command: '~chrome' 119 | * }) 120 | * 121 | * @param {Object} q 122 | * @return {Array} 123 | */ 124 | function query(q) { 125 | var filter = Object.keys(q); 126 | var isValid; 127 | var valid; 128 | var val; 129 | 130 | return this.reduce((list, ps) => { 131 | isValid = filter.every(key => { 132 | val = q[key]; 133 | valid = true; 134 | 135 | if (typeof val === 'string') { 136 | if (val.indexOf('<') > -1) { 137 | valid = ps[key] < cleanValue(val, '<'); 138 | } 139 | 140 | if (valid && val.indexOf('>') > -1) { 141 | valid = ps[key] > cleanValue(val, '>'); 142 | } 143 | 144 | if (valid && val.indexOf('~') > -1) { 145 | valid = ps[key].indexOf(q[key].replace('~', '')) > -1; 146 | } 147 | } else { 148 | valid = ps[key] === val; 149 | } 150 | 151 | return valid; 152 | }); 153 | 154 | if (isValid) list.push(ps); 155 | 156 | return list; 157 | }, []); 158 | } 159 | 160 | /** 161 | * Return the value for a certain condition 162 | * 163 | * @example 164 | * cleanValue('foo <100', '<') == 100 165 | * cleanValue('>5 <1 bar', '>') == 5 166 | * 167 | * @param {String} val 168 | * @param {String} char 169 | * @return {Float} 170 | */ 171 | function cleanValue(val, char) { 172 | var num; 173 | var conditions = val.split(' '); 174 | var i = 0; 175 | 176 | while (!num && i < conditions.length) { 177 | if (conditions[i].indexOf(char) > -1) { 178 | num = conditions[i].replace(/<|>|~/g, ''); 179 | } 180 | i++; 181 | } 182 | 183 | return parseFloat(num); 184 | } 185 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "psaux", 3 | "version": "0.4.0", 4 | "description": "Display processes info in Node", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "mocha --reporter spec --ui bdd --timeout 5000 test/*.js" 8 | }, 9 | "engines": { 10 | "node": ">=0.12" 11 | }, 12 | "repository": { 13 | "type": "git", 14 | "url": "https://github.com/zzarcon/psaux.git" 15 | }, 16 | "keywords": [ 17 | "ps", 18 | "aux", 19 | "process", 20 | "status" 21 | ], 22 | "os": [ 23 | "darwin", 24 | "freebsd", 25 | "linux", 26 | "win32" 27 | ], 28 | "author": "zzarcon", 29 | "license": "MIT", 30 | "bugs": { 31 | "url": "https://github.com/zzarcon/psaux/issues" 32 | }, 33 | "homepage": "https://github.com/zzarcon/psaux", 34 | "dependencies": { 35 | "execa": "^0.2.2" 36 | }, 37 | "devDependencies": { 38 | "chai": "^3.5.0", 39 | "mocha": "^2.4.5", 40 | "relaser": "^0.2.0" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /relaser.json: -------------------------------------------------------------------------------- 1 | { 2 | "managers": ["npm"] 3 | } -------------------------------------------------------------------------------- /test/index.js: -------------------------------------------------------------------------------- 1 | var expect = require('chai').expect; 2 | var assert = require('assert'); 3 | var psaux = require('../lib/psaux'); 4 | 5 | describe('psaux', () => { 6 | describe('#List', () => { 7 | it('Return a promise', () => { 8 | expect(psaux).to.be.a('function'); 9 | expect(psaux()).to.be.an.instanceof(Promise); 10 | }); 11 | }); 12 | 13 | describe('#Filter', () => { 14 | it('Apply filters on the returned process list', () => { 15 | expect(psaux).to.be.a('function'); 16 | }); 17 | }); 18 | }); -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | assertion-error@^1.0.1: 6 | version "1.1.0" 7 | resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" 8 | integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== 9 | 10 | chai@^3.5.0: 11 | version "3.5.0" 12 | resolved "https://registry.yarnpkg.com/chai/-/chai-3.5.0.tgz#4d02637b067fe958bdbfdd3a40ec56fef7373247" 13 | integrity sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc= 14 | dependencies: 15 | assertion-error "^1.0.1" 16 | deep-eql "^0.1.3" 17 | type-detect "^1.0.0" 18 | 19 | commander@0.6.1: 20 | version "0.6.1" 21 | resolved "https://registry.yarnpkg.com/commander/-/commander-0.6.1.tgz#fa68a14f6a945d54dbbe50d8cdb3320e9e3b1a06" 22 | integrity sha1-+mihT2qUXVTbvlDYzbMyDp47GgY= 23 | 24 | commander@2.3.0: 25 | version "2.3.0" 26 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.3.0.tgz#fd430e889832ec353b9acd1de217c11cb3eef873" 27 | integrity sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM= 28 | 29 | cross-spawn-async@^2.1.1: 30 | version "2.2.5" 31 | resolved "https://registry.yarnpkg.com/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz#845ff0c0834a3ded9d160daca6d390906bb288cc" 32 | integrity sha1-hF/wwINKPe2dFg2sptOQkGuyiMw= 33 | dependencies: 34 | lru-cache "^4.0.0" 35 | which "^1.2.8" 36 | 37 | debug@2.2.0: 38 | version "2.2.0" 39 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" 40 | integrity sha1-+HBX6ZWxofauaklgZkE3vFbwOdo= 41 | dependencies: 42 | ms "0.7.1" 43 | 44 | deep-eql@^0.1.3: 45 | version "0.1.3" 46 | resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2" 47 | integrity sha1-71WKyrjeJSBs1xOQbXTlaTDrafI= 48 | dependencies: 49 | type-detect "0.1.1" 50 | 51 | diff@1.4.0: 52 | version "1.4.0" 53 | resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" 54 | integrity sha1-fyjS657nsVqX79ic5j3P2qPMur8= 55 | 56 | escape-string-regexp@1.0.2: 57 | version "1.0.2" 58 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz#4dbc2fe674e71949caf3fb2695ce7f2dc1d9a8d1" 59 | integrity sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE= 60 | 61 | execa@^0.2.2: 62 | version "0.2.2" 63 | resolved "https://registry.yarnpkg.com/execa/-/execa-0.2.2.tgz#e2ead472c2c31aad6f73f1ac956eef45e12320cb" 64 | integrity sha1-4urUcsLDGq1vc/GslW7vReEjIMs= 65 | dependencies: 66 | cross-spawn-async "^2.1.1" 67 | npm-run-path "^1.0.0" 68 | object-assign "^4.0.1" 69 | path-key "^1.0.0" 70 | strip-eof "^1.0.0" 71 | 72 | glob@3.2.11: 73 | version "3.2.11" 74 | resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d" 75 | integrity sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0= 76 | dependencies: 77 | inherits "2" 78 | minimatch "0.3" 79 | 80 | growl@1.9.2: 81 | version "1.9.2" 82 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" 83 | integrity sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8= 84 | 85 | inherits@2: 86 | version "2.0.4" 87 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 88 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 89 | 90 | isexe@^2.0.0: 91 | version "2.0.0" 92 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 93 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 94 | 95 | jade@0.26.3: 96 | version "0.26.3" 97 | resolved "https://registry.yarnpkg.com/jade/-/jade-0.26.3.tgz#8f10d7977d8d79f2f6ff862a81b0513ccb25686c" 98 | integrity sha1-jxDXl32NefL2/4YqgbBRPMslaGw= 99 | dependencies: 100 | commander "0.6.1" 101 | mkdirp "0.3.0" 102 | 103 | lru-cache@2: 104 | version "2.7.3" 105 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" 106 | integrity sha1-bUUk6LlV+V1PW1iFHOId1y+06VI= 107 | 108 | lru-cache@^4.0.0: 109 | version "4.1.5" 110 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" 111 | integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== 112 | dependencies: 113 | pseudomap "^1.0.2" 114 | yallist "^2.1.2" 115 | 116 | minimatch@0.3: 117 | version "0.3.0" 118 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd" 119 | integrity sha1-J12O2qxPG7MyZHIInnlJyDlGmd0= 120 | dependencies: 121 | lru-cache "2" 122 | sigmund "~1.0.0" 123 | 124 | minimist@0.0.8: 125 | version "0.0.8" 126 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 127 | integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= 128 | 129 | mkdirp@0.3.0: 130 | version "0.3.0" 131 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" 132 | integrity sha1-G79asbqCevI1dRQ0kEJkVfSB/h4= 133 | 134 | mkdirp@0.5.1: 135 | version "0.5.1" 136 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 137 | integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= 138 | dependencies: 139 | minimist "0.0.8" 140 | 141 | mocha@^2.4.5: 142 | version "2.5.3" 143 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-2.5.3.tgz#161be5bdeb496771eb9b35745050b622b5aefc58" 144 | integrity sha1-FhvlvetJZ3HrmzV0UFC2IrWu/Fg= 145 | dependencies: 146 | commander "2.3.0" 147 | debug "2.2.0" 148 | diff "1.4.0" 149 | escape-string-regexp "1.0.2" 150 | glob "3.2.11" 151 | growl "1.9.2" 152 | jade "0.26.3" 153 | mkdirp "0.5.1" 154 | supports-color "1.2.0" 155 | to-iso-string "0.0.2" 156 | 157 | ms@0.7.1: 158 | version "0.7.1" 159 | resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" 160 | integrity sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg= 161 | 162 | npm-run-path@^1.0.0: 163 | version "1.0.0" 164 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-1.0.0.tgz#f5c32bf595fe81ae927daec52e82f8b000ac3c8f" 165 | integrity sha1-9cMr9ZX+ga6Sfa7FLoL4sACsPI8= 166 | dependencies: 167 | path-key "^1.0.0" 168 | 169 | object-assign@^4.0.1: 170 | version "4.1.1" 171 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 172 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 173 | 174 | path-key@^1.0.0: 175 | version "1.0.0" 176 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-1.0.0.tgz#5d53d578019646c0d68800db4e146e6bdc2ac7af" 177 | integrity sha1-XVPVeAGWRsDWiADbThRua9wqx68= 178 | 179 | progress@^1.1.8: 180 | version "1.1.8" 181 | resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" 182 | integrity sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74= 183 | 184 | pseudomap@^1.0.2: 185 | version "1.0.2" 186 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 187 | integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= 188 | 189 | relaser@^0.2.0: 190 | version "0.2.0" 191 | resolved "https://registry.yarnpkg.com/relaser/-/relaser-0.2.0.tgz#0013d2c539c66ae961b45456b0f8826dcc38be89" 192 | integrity sha1-ABPSxTnGaulhtFRWsPiCbcw4vok= 193 | dependencies: 194 | progress "^1.1.8" 195 | 196 | sigmund@~1.0.0: 197 | version "1.0.1" 198 | resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" 199 | integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA= 200 | 201 | strip-eof@^1.0.0: 202 | version "1.0.0" 203 | resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" 204 | integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= 205 | 206 | supports-color@1.2.0: 207 | version "1.2.0" 208 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-1.2.0.tgz#ff1ed1e61169d06b3cf2d588e188b18d8847e17e" 209 | integrity sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4= 210 | 211 | to-iso-string@0.0.2: 212 | version "0.0.2" 213 | resolved "https://registry.yarnpkg.com/to-iso-string/-/to-iso-string-0.0.2.tgz#4dc19e664dfccbe25bd8db508b00c6da158255d1" 214 | integrity sha1-TcGeZk38y+Jb2NtQiwDG2hWCVdE= 215 | 216 | type-detect@0.1.1: 217 | version "0.1.1" 218 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822" 219 | integrity sha1-C6XsKohWQORw6k6FBZcZANrFiCI= 220 | 221 | type-detect@^1.0.0: 222 | version "1.0.0" 223 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2" 224 | integrity sha1-diIXzAbbJY7EiQihKY6LlRIejqI= 225 | 226 | which@^1.2.8: 227 | version "1.3.1" 228 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 229 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 230 | dependencies: 231 | isexe "^2.0.0" 232 | 233 | yallist@^2.1.2: 234 | version "2.1.2" 235 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 236 | integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= 237 | --------------------------------------------------------------------------------