├── .gitignore ├── LICENSE ├── README.md ├── bench.js ├── package-lock.json └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .DS_Store -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 James Simpson 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. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Description 2 | node-cloud-bench is a small CLI utility written with Node.js that allows for easy benchmarking of cloud servers, specifically to test CPU performance, network speeds and disk IOPS. When it comes to cloud computing, seeing how consistent the values are over time is just as important as the values themselves, which is why you can specify an interval, length of the test and a location to output a CSV file with the results. 3 | 4 | The results collected include: 5 | 6 | * Network CDN Download (Mbps) 7 | * Network Ping (seconds) 8 | * Network Download (Mbps) 9 | * Network Upload (Mbps) 10 | * CPU Time (seconds) 11 | * Read IOPS 12 | * Write IOPS 13 | * I/O Ping 14 | 15 | ## Installation 16 | 17 | ``` 18 | npm install cloud-bench 19 | ``` 20 | 21 | This script makes use of the following dependencies that you may need to install: 22 | 23 | * [fio](https://github.com/axboe/fio) 24 | * [ioping](https://github.com/koct9i/ioping) 25 | 26 | ## Usage 27 | 28 | ```bash 29 | node cloud-bench \ 30 | --interval [seconds between tests] \ 31 | --limit [number of iterations] \ 32 | --nodisk 33 | --out [output filename] 34 | ``` 35 | 36 | The below command will run performance tests every 30 minutes for 24 hours. 37 | 38 | ```bash 39 | node cloud-bench \ 40 | --interval 1800 \ 41 | --limit 48 \ 42 | --out results.csv 43 | ``` 44 | 45 | Sample output: 46 | 47 | | Time | Download (CDN) | Ping | Download | Upload | CPU Time | Read IOPS | Write IOPS | IO Ping | 48 | | ----- | ---------------- | ----- | ---------- | ------- | ---------- | ----------- | ---------- | --------| 49 | | Mon Apr 02 2018 21:35:05 GMT-0500 (CDT) | 32 | 28 | 49 | 11 | 23.387 | 37936 | 18428 |15.4us | 50 | 51 | If you are running these tests on a remote machine, it is recommended to pair it with something like [forever](https://github.com/nodejitsu/forever) to turn the test into a daemon. 52 | 53 | ## License 54 | 55 | Copyright (c) 2018 [James Simpson](https://twitter.com/GoldFireStudios) and [GoldFire Studios, Inc.](https://goldfirestudios.com) 56 | 57 | Released under the MIT License. 58 | -------------------------------------------------------------------------------- /bench.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * node-cloud-bench 3 | * https://github.com/goldfire/node-cloud-bench 4 | * 5 | * (c) 2018, James Simpson of GoldFire Studios 6 | * goldfirestudios.com 7 | * 8 | * MIT License 9 | */ 10 | 11 | const fs = require('fs'); 12 | const crypto = require('crypto'); 13 | const {exec} = require('child_process'); 14 | const colors = require('colors'); 15 | const opts = require('nomnom').option('nodisk', {flag: true}).parse(); 16 | const {UniversalSpeedtest, SpeedUnits} = require('universal-speedtest'); 17 | 18 | // Prep the speed test. 19 | const universalSpeedtest = new UniversalSpeedtest({ 20 | measureUpload: true, 21 | downloadUnit: SpeedUnits.MBps, 22 | }); 23 | 24 | // Check the usage. 25 | const {interval, limit, out, nodisk} = opts; 26 | const isMac = process.platform === 'darwin'; 27 | const delay = 3000; 28 | if (!interval || !limit || !out) { 29 | console.log("Usage: node cloud-bench --interval [seconds] --limit [number] [--nodisk] --out [output file]".yellow.bold); 30 | return; 31 | } 32 | 33 | // Create the empty output file. 34 | fs.writeFileSync(out, 'Time,Download (CDN),Ping,Download,Upload,CPU Time,Read IOPS,Write IOPS,IO Ping'); 35 | 36 | // Get the high resolution time. 37 | const now = () => { 38 | const hrtime = process.hrtime(); 39 | return hrtime[0] * 1000000 + hrtime[1] / 1000; 40 | }; 41 | 42 | // Begin the interval. 43 | let total = 0; 44 | const bench = () => { 45 | // Check if we've reached the limit. 46 | if (total >= limit) { 47 | console.log("WIN - Benchmark complete!".green.bold); 48 | process.exit(); 49 | return; 50 | } 51 | total += 1; 52 | 53 | let output = fs.readFileSync(out, 'utf-8') + '\n' + new Date(); 54 | 55 | // Execute the download benchmark (uses various CDN tests). 56 | const netBench1 = () => { 57 | let total = 0; 58 | const urls = [ 59 | 'https://cachefly.cachefly.net/100mb.test', 60 | 'https://mirror.nl.leaseweb.net/speedtest/100mb.bin', 61 | 'https://speed.hetzner.de/100MB.bin', 62 | 'https://ping.online.net/100Mo.dat', 63 | 'https://proof.ovh.net/files/100Mb.dat', 64 | ]; 65 | 66 | return Promise.all(urls.map((url) => { 67 | return new Promise((resolve) => { 68 | exec(`curl --max-time 10 -so /dev/null -w '%{speed_download}\n' '${url}'`, (err, stdout) => { 69 | total += parseFloat(stdout) / 1024 / 1024; 70 | 71 | setTimeout(resolve, 5000); 72 | }); 73 | }); 74 | })).then(() => { 75 | // Update the values in the data. 76 | output += `,${total / urls.length}`; 77 | 78 | return new Promise((resolve) => { 79 | setTimeout(resolve, delay); 80 | }); 81 | }); 82 | }; 83 | 84 | // Execute the network benchmark (uses speedtest.net for ping, download & upload). 85 | const netBench2 = () => { 86 | return new Promise((resolve) => { 87 | universalSpeedtest.runCloudflareCom().then((result) => { 88 | const {ping, downloadSpeed, uploadSpeed} = result; 89 | 90 | // Update the values in the data. 91 | output += `,${ping},${downloadSpeed},${uploadSpeed}`; 92 | 93 | setTimeout(resolve, delay); 94 | }); 95 | }); 96 | }; 97 | 98 | // Execute the CPU benchmark (this will run various array, hashing, etc operations and time it). 99 | const cpuBench = () => { 100 | return new Promise((resolve) => { 101 | const start = process.hrtime(); 102 | let hashes = []; 103 | 104 | // Generate md5 hashes. 105 | for (let i = 0; i < 2500000; i += 1) { 106 | hashes.push(crypto.createHash('sha256').update(`${i}`).digest('hex')); 107 | } 108 | 109 | // Sort the array alphabetically. 110 | hashes.sort((a, b) => { 111 | if (a < b) { 112 | return -1; 113 | } 114 | if (a > b) { 115 | return 1; 116 | } 117 | 118 | return 0; 119 | }); 120 | 121 | // Filter out hashes that have an "a" as the first character. 122 | hashes = hashes.filter(hash => hash[0] !== 'a'); 123 | 124 | // Loop through the hashes and splice them from the array. 125 | for (let i = hashes.length - 1; i >= 0; i -= 1) { 126 | hashes.splice(i, 1); 127 | } 128 | 129 | // Add the total time to complete to the output. 130 | const diff = process.hrtime(start); 131 | const seconds = (diff[0] * 1e9 + diff[1]) / 1e9; 132 | output += `,${seconds}`; 133 | 134 | setTimeout(resolve, delay); 135 | }); 136 | }; 137 | 138 | // Execute the disk IO benchmark (random read with fio). 139 | const diskReadBench = () => { 140 | if (nodisk) { 141 | output += ',N/A'; 142 | return Promise.resolve(); 143 | } 144 | 145 | return new Promise((resolve) => { 146 | exec(`fio --name=randread --ioengine=${isMac ? 'posixaio' : 'libaio'} --direct=1 --bs=4k --iodepth=64 --size=4G --rw=randread --gtod_reduce=1 --output-format=json`, (err, stdout) => { 147 | const {iops} = JSON.parse(stdout).jobs[0].read; 148 | 149 | // Update the values in the data. 150 | output += `,${iops}`; 151 | 152 | setTimeout(resolve, delay); 153 | }); 154 | }); 155 | }; 156 | 157 | // Execute the disk IO benchmark (random write with fio). 158 | const diskWriteBench = () => { 159 | if (nodisk) { 160 | output += ',N/A'; 161 | return Promise.resolve(); 162 | } 163 | 164 | return new Promise((resolve) => { 165 | exec(`fio --name=randwrite --ioengine=${isMac ? 'posixaio' : 'libaio'} --direct=1 --bs=4k --iodepth=64 --size=4G --rw=randwrite --gtod_reduce=1 --output-format=json`, (err, stdout) => { 166 | const {iops} = JSON.parse(stdout).jobs[0].write; 167 | 168 | // Update the values in the data. 169 | output += `,${iops}`; 170 | 171 | setTimeout(resolve, delay); 172 | }); 173 | }); 174 | }; 175 | 176 | // Execute the disk ping benchmark (using ioping). 177 | const diskPingBench = () => { 178 | if (nodisk) { 179 | output += ',N/A'; 180 | return Promise.resolve(); 181 | } 182 | 183 | return new Promise((resolve) => { 184 | exec('ioping -c 10 .', (err, stdout) => { 185 | const parsed = new RegExp(/ \/\s(.+?)\s\/ /g).exec(stdout); 186 | 187 | // Update the values in the data. 188 | output += `,${parsed[1]}`; 189 | 190 | setTimeout(resolve, delay); 191 | }); 192 | }); 193 | }; 194 | 195 | // Write the data to the output file. 196 | const writeData = () => { 197 | fs.writeFileSync(out, output); 198 | }; 199 | 200 | netBench1() 201 | .then(netBench2) 202 | .then(cpuBench) 203 | .then(diskReadBench) 204 | .then(diskWriteBench) 205 | .then(diskPingBench) 206 | .then(writeData) 207 | .catch(console.log); 208 | }; 209 | 210 | // Setup the interval to run the benchmarks. 211 | setInterval(bench, interval * 1000); 212 | bench(); 213 | 214 | console.log(("Benchmark underway: " + limit + " " + interval + " second intervals.").cyan); 215 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cloud-bench", 3 | "version": "1.0.8", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@tootallnate/once": { 8 | "version": "1.1.2", 9 | "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", 10 | "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" 11 | }, 12 | "@types/node": { 13 | "version": "16.11.26", 14 | "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.26.tgz", 15 | "integrity": "sha512-GZ7bu5A6+4DtG7q9GsoHXy3ALcgeIHP4NnL0Vv2wu0uUB/yQex26v0tf6/na1mm0+bS9Uw+0DFex7aaKr2qawQ==" 16 | }, 17 | "acorn": { 18 | "version": "8.7.0", 19 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", 20 | "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" 21 | }, 22 | "acorn-walk": { 23 | "version": "8.2.0", 24 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", 25 | "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" 26 | }, 27 | "address": { 28 | "version": "1.1.2", 29 | "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", 30 | "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" 31 | }, 32 | "agent-base": { 33 | "version": "6.0.2", 34 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 35 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 36 | "requires": { 37 | "debug": "4" 38 | }, 39 | "dependencies": { 40 | "debug": { 41 | "version": "4.3.3", 42 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", 43 | "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", 44 | "requires": { 45 | "ms": "2.1.2" 46 | } 47 | }, 48 | "ms": { 49 | "version": "2.1.2", 50 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 51 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 52 | } 53 | } 54 | }, 55 | "ansi-styles": { 56 | "version": "1.0.0", 57 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", 58 | "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=" 59 | }, 60 | "any-promise": { 61 | "version": "1.3.0", 62 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", 63 | "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" 64 | }, 65 | "ast-types": { 66 | "version": "0.13.4", 67 | "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", 68 | "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", 69 | "requires": { 70 | "tslib": "^2.0.1" 71 | } 72 | }, 73 | "bytes": { 74 | "version": "3.1.2", 75 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 76 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" 77 | }, 78 | "call-bind": { 79 | "version": "1.0.2", 80 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 81 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 82 | "requires": { 83 | "function-bind": "^1.1.1", 84 | "get-intrinsic": "^1.0.2" 85 | } 86 | }, 87 | "chalk": { 88 | "version": "0.4.0", 89 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", 90 | "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", 91 | "requires": { 92 | "ansi-styles": "~1.0.0", 93 | "has-color": "~0.1.0", 94 | "strip-ansi": "~0.1.0" 95 | } 96 | }, 97 | "colors": { 98 | "version": "1.4.0", 99 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", 100 | "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" 101 | }, 102 | "content-type": { 103 | "version": "1.0.4", 104 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 105 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 106 | }, 107 | "convert-units": { 108 | "version": "3.0.0-beta.3", 109 | "resolved": "https://registry.npmjs.org/convert-units/-/convert-units-3.0.0-beta.3.tgz", 110 | "integrity": "sha512-TFsn0/ciBdESdvYWdeMYvPCe2V1l+nSl0DBlaowdcm0WMCJ++3D8rW/Fx9ALBpb1pKsvja6qH7UyjJBzBSh0sg==" 111 | }, 112 | "copy-to": { 113 | "version": "2.0.1", 114 | "resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz", 115 | "integrity": "sha1-JoD7uAaKSNCGVrYJgJK9r8kG9KU=" 116 | }, 117 | "core-util-is": { 118 | "version": "1.0.3", 119 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", 120 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" 121 | }, 122 | "data-uri-to-buffer": { 123 | "version": "3.0.1", 124 | "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", 125 | "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==" 126 | }, 127 | "debug": { 128 | "version": "2.6.9", 129 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 130 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 131 | "requires": { 132 | "ms": "2.0.0" 133 | } 134 | }, 135 | "deep-is": { 136 | "version": "0.1.4", 137 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 138 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" 139 | }, 140 | "default-user-agent": { 141 | "version": "1.0.0", 142 | "resolved": "https://registry.npmjs.org/default-user-agent/-/default-user-agent-1.0.0.tgz", 143 | "integrity": "sha1-FsRu/cq6PtxF8k8r1IaLAbfCrcY=", 144 | "requires": { 145 | "os-name": "~1.0.3" 146 | } 147 | }, 148 | "degenerator": { 149 | "version": "3.0.2", 150 | "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.2.tgz", 151 | "integrity": "sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ==", 152 | "requires": { 153 | "ast-types": "^0.13.2", 154 | "escodegen": "^1.8.1", 155 | "esprima": "^4.0.0", 156 | "vm2": "^3.9.8" 157 | } 158 | }, 159 | "depd": { 160 | "version": "2.0.0", 161 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 162 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" 163 | }, 164 | "destroy": { 165 | "version": "1.1.1", 166 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.1.1.tgz", 167 | "integrity": "sha512-jxwFW+yrVOLdwqIWvowFOM8UPdhZnvOF6mhXQQLXMxBDLtv2JVJlVJPEwkDv9prqscEtGtmnxuuI6pQKStK1vA==" 168 | }, 169 | "digest-header": { 170 | "version": "0.0.1", 171 | "resolved": "https://registry.npmjs.org/digest-header/-/digest-header-0.0.1.tgz", 172 | "integrity": "sha1-Ecz23uxXZqw3l0TZAcEsuklRS+Y=", 173 | "requires": { 174 | "utility": "0.1.11" 175 | }, 176 | "dependencies": { 177 | "utility": { 178 | "version": "0.1.11", 179 | "resolved": "https://registry.npmjs.org/utility/-/utility-0.1.11.tgz", 180 | "integrity": "sha1-/eYM+bTkdRlHoM9dEEzik2ciZxU=", 181 | "requires": { 182 | "address": ">=0.0.1" 183 | } 184 | } 185 | } 186 | }, 187 | "ee-first": { 188 | "version": "1.1.1", 189 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 190 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 191 | }, 192 | "end-of-stream": { 193 | "version": "1.4.4", 194 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 195 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 196 | "requires": { 197 | "once": "^1.4.0" 198 | } 199 | }, 200 | "escape-html": { 201 | "version": "1.0.3", 202 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 203 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 204 | }, 205 | "escodegen": { 206 | "version": "1.14.3", 207 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", 208 | "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", 209 | "requires": { 210 | "esprima": "^4.0.1", 211 | "estraverse": "^4.2.0", 212 | "esutils": "^2.0.2", 213 | "optionator": "^0.8.1", 214 | "source-map": "~0.6.1" 215 | } 216 | }, 217 | "esprima": { 218 | "version": "4.0.1", 219 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 220 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" 221 | }, 222 | "estraverse": { 223 | "version": "4.3.0", 224 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 225 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" 226 | }, 227 | "esutils": { 228 | "version": "2.0.3", 229 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 230 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" 231 | }, 232 | "extend-shallow": { 233 | "version": "2.0.1", 234 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 235 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 236 | "requires": { 237 | "is-extendable": "^0.1.0" 238 | } 239 | }, 240 | "fast-levenshtein": { 241 | "version": "2.0.6", 242 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 243 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" 244 | }, 245 | "fast-xml-parser": { 246 | "version": "3.21.1", 247 | "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.21.1.tgz", 248 | "integrity": "sha512-FTFVjYoBOZTJekiUsawGsSYV9QL0A+zDYCRj7y34IO6Jg+2IMYEtQa+bbictpdpV8dHxXywqU7C0gRDEOFtBFg==", 249 | "requires": { 250 | "strnum": "^1.0.4" 251 | } 252 | }, 253 | "file-uri-to-path": { 254 | "version": "2.0.0", 255 | "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz", 256 | "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==" 257 | }, 258 | "formstream": { 259 | "version": "1.1.1", 260 | "resolved": "https://registry.npmjs.org/formstream/-/formstream-1.1.1.tgz", 261 | "integrity": "sha512-yHRxt3qLFnhsKAfhReM4w17jP+U1OlhUjnKPPtonwKbIJO7oBP0MvoxkRUwb8AU9n0MIkYy5X5dK6pQnbj+R2Q==", 262 | "requires": { 263 | "destroy": "^1.0.4", 264 | "mime": "^2.5.2", 265 | "pause-stream": "~0.0.11" 266 | } 267 | }, 268 | "fs-extra": { 269 | "version": "8.1.0", 270 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", 271 | "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", 272 | "requires": { 273 | "graceful-fs": "^4.2.0", 274 | "jsonfile": "^4.0.0", 275 | "universalify": "^0.1.0" 276 | } 277 | }, 278 | "ftp": { 279 | "version": "0.3.10", 280 | "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", 281 | "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", 282 | "requires": { 283 | "readable-stream": "1.1.x", 284 | "xregexp": "2.0.0" 285 | } 286 | }, 287 | "function-bind": { 288 | "version": "1.1.1", 289 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 290 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 291 | }, 292 | "get-intrinsic": { 293 | "version": "1.1.1", 294 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", 295 | "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", 296 | "requires": { 297 | "function-bind": "^1.1.1", 298 | "has": "^1.0.3", 299 | "has-symbols": "^1.0.1" 300 | } 301 | }, 302 | "get-uri": { 303 | "version": "3.0.2", 304 | "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-3.0.2.tgz", 305 | "integrity": "sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==", 306 | "requires": { 307 | "@tootallnate/once": "1", 308 | "data-uri-to-buffer": "3", 309 | "debug": "4", 310 | "file-uri-to-path": "2", 311 | "fs-extra": "^8.1.0", 312 | "ftp": "^0.3.10" 313 | }, 314 | "dependencies": { 315 | "debug": { 316 | "version": "4.3.3", 317 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", 318 | "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", 319 | "requires": { 320 | "ms": "2.1.2" 321 | } 322 | }, 323 | "ms": { 324 | "version": "2.1.2", 325 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 326 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 327 | } 328 | } 329 | }, 330 | "graceful-fs": { 331 | "version": "4.2.9", 332 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", 333 | "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" 334 | }, 335 | "has": { 336 | "version": "1.0.3", 337 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 338 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 339 | "requires": { 340 | "function-bind": "^1.1.1" 341 | } 342 | }, 343 | "has-color": { 344 | "version": "0.1.7", 345 | "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", 346 | "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=" 347 | }, 348 | "has-symbols": { 349 | "version": "1.0.3", 350 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 351 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" 352 | }, 353 | "http-errors": { 354 | "version": "2.0.0", 355 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 356 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 357 | "requires": { 358 | "depd": "2.0.0", 359 | "inherits": "2.0.4", 360 | "setprototypeof": "1.2.0", 361 | "statuses": "2.0.1", 362 | "toidentifier": "1.0.1" 363 | }, 364 | "dependencies": { 365 | "statuses": { 366 | "version": "2.0.1", 367 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 368 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" 369 | } 370 | } 371 | }, 372 | "http-proxy-agent": { 373 | "version": "4.0.1", 374 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", 375 | "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", 376 | "requires": { 377 | "@tootallnate/once": "1", 378 | "agent-base": "6", 379 | "debug": "4" 380 | }, 381 | "dependencies": { 382 | "debug": { 383 | "version": "4.3.3", 384 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", 385 | "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", 386 | "requires": { 387 | "ms": "2.1.2" 388 | } 389 | }, 390 | "ms": { 391 | "version": "2.1.2", 392 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 393 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 394 | } 395 | } 396 | }, 397 | "https-proxy-agent": { 398 | "version": "5.0.0", 399 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", 400 | "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", 401 | "requires": { 402 | "agent-base": "6", 403 | "debug": "4" 404 | }, 405 | "dependencies": { 406 | "debug": { 407 | "version": "4.3.3", 408 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", 409 | "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", 410 | "requires": { 411 | "ms": "2.1.2" 412 | } 413 | }, 414 | "ms": { 415 | "version": "2.1.2", 416 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 417 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 418 | } 419 | } 420 | }, 421 | "humanize-ms": { 422 | "version": "1.2.1", 423 | "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", 424 | "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", 425 | "requires": { 426 | "ms": "^2.0.0" 427 | } 428 | }, 429 | "iconv-lite": { 430 | "version": "0.4.24", 431 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 432 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 433 | "requires": { 434 | "safer-buffer": ">= 2.1.2 < 3" 435 | } 436 | }, 437 | "inherits": { 438 | "version": "2.0.4", 439 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 440 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 441 | }, 442 | "ip": { 443 | "version": "1.1.5", 444 | "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", 445 | "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" 446 | }, 447 | "is-extendable": { 448 | "version": "0.1.1", 449 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", 450 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" 451 | }, 452 | "isarray": { 453 | "version": "0.0.1", 454 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 455 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" 456 | }, 457 | "jsonfile": { 458 | "version": "4.0.0", 459 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", 460 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", 461 | "requires": { 462 | "graceful-fs": "^4.1.6" 463 | } 464 | }, 465 | "levn": { 466 | "version": "0.3.0", 467 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 468 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 469 | "requires": { 470 | "prelude-ls": "~1.1.2", 471 | "type-check": "~0.3.2" 472 | } 473 | }, 474 | "lru-cache": { 475 | "version": "5.1.1", 476 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 477 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 478 | "requires": { 479 | "yallist": "^3.0.2" 480 | } 481 | }, 482 | "mime": { 483 | "version": "2.6.0", 484 | "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", 485 | "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==" 486 | }, 487 | "minimist": { 488 | "version": "1.2.5", 489 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 490 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 491 | }, 492 | "mkdirp": { 493 | "version": "0.5.5", 494 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 495 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 496 | "requires": { 497 | "minimist": "^1.2.5" 498 | } 499 | }, 500 | "ms": { 501 | "version": "2.0.0", 502 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 503 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 504 | }, 505 | "mz": { 506 | "version": "2.7.0", 507 | "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", 508 | "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", 509 | "requires": { 510 | "any-promise": "^1.0.0", 511 | "object-assign": "^4.0.1", 512 | "thenify-all": "^1.0.0" 513 | } 514 | }, 515 | "netmask": { 516 | "version": "2.0.2", 517 | "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", 518 | "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==" 519 | }, 520 | "nomnom": { 521 | "version": "1.8.1", 522 | "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz", 523 | "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=", 524 | "requires": { 525 | "chalk": "~0.4.0", 526 | "underscore": "~1.6.0" 527 | } 528 | }, 529 | "object-assign": { 530 | "version": "4.1.1", 531 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 532 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 533 | }, 534 | "object-inspect": { 535 | "version": "1.12.0", 536 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", 537 | "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==" 538 | }, 539 | "once": { 540 | "version": "1.4.0", 541 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 542 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 543 | "requires": { 544 | "wrappy": "1" 545 | } 546 | }, 547 | "optionator": { 548 | "version": "0.8.3", 549 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", 550 | "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", 551 | "requires": { 552 | "deep-is": "~0.1.3", 553 | "fast-levenshtein": "~2.0.6", 554 | "levn": "~0.3.0", 555 | "prelude-ls": "~1.1.2", 556 | "type-check": "~0.3.2", 557 | "word-wrap": "~1.2.3" 558 | } 559 | }, 560 | "os-name": { 561 | "version": "1.0.3", 562 | "resolved": "https://registry.npmjs.org/os-name/-/os-name-1.0.3.tgz", 563 | "integrity": "sha1-GzefZINa98Wn9JizV8uVIVwVnt8=", 564 | "requires": { 565 | "osx-release": "^1.0.0", 566 | "win-release": "^1.0.0" 567 | } 568 | }, 569 | "osx-release": { 570 | "version": "1.1.0", 571 | "resolved": "https://registry.npmjs.org/osx-release/-/osx-release-1.1.0.tgz", 572 | "integrity": "sha1-8heRGigTaUmvG/kwiyQeJzfTzWw=", 573 | "requires": { 574 | "minimist": "^1.1.0" 575 | } 576 | }, 577 | "pac-proxy-agent": { 578 | "version": "5.0.0", 579 | "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz", 580 | "integrity": "sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==", 581 | "requires": { 582 | "@tootallnate/once": "1", 583 | "agent-base": "6", 584 | "debug": "4", 585 | "get-uri": "3", 586 | "http-proxy-agent": "^4.0.1", 587 | "https-proxy-agent": "5", 588 | "pac-resolver": "^5.0.0", 589 | "raw-body": "^2.2.0", 590 | "socks-proxy-agent": "5" 591 | }, 592 | "dependencies": { 593 | "debug": { 594 | "version": "4.3.3", 595 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", 596 | "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", 597 | "requires": { 598 | "ms": "2.1.2" 599 | } 600 | }, 601 | "ms": { 602 | "version": "2.1.2", 603 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 604 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 605 | } 606 | } 607 | }, 608 | "pac-resolver": { 609 | "version": "5.0.0", 610 | "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.0.tgz", 611 | "integrity": "sha512-H+/A6KitiHNNW+bxBKREk2MCGSxljfqRX76NjummWEYIat7ldVXRU3dhRIE3iXZ0nvGBk6smv3nntxKkzRL8NA==", 612 | "requires": { 613 | "degenerator": "^3.0.1", 614 | "ip": "^1.1.5", 615 | "netmask": "^2.0.1" 616 | } 617 | }, 618 | "pause-stream": { 619 | "version": "0.0.11", 620 | "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", 621 | "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", 622 | "requires": { 623 | "through": "~2.3" 624 | } 625 | }, 626 | "prelude-ls": { 627 | "version": "1.1.2", 628 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 629 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" 630 | }, 631 | "proxy-agent": { 632 | "version": "5.0.0", 633 | "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-5.0.0.tgz", 634 | "integrity": "sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==", 635 | "requires": { 636 | "agent-base": "^6.0.0", 637 | "debug": "4", 638 | "http-proxy-agent": "^4.0.0", 639 | "https-proxy-agent": "^5.0.0", 640 | "lru-cache": "^5.1.1", 641 | "pac-proxy-agent": "^5.0.0", 642 | "proxy-from-env": "^1.0.0", 643 | "socks-proxy-agent": "^5.0.0" 644 | }, 645 | "dependencies": { 646 | "debug": { 647 | "version": "4.3.3", 648 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", 649 | "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", 650 | "requires": { 651 | "ms": "2.1.2" 652 | } 653 | }, 654 | "ms": { 655 | "version": "2.1.2", 656 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 657 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 658 | } 659 | } 660 | }, 661 | "proxy-from-env": { 662 | "version": "1.1.0", 663 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 664 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 665 | }, 666 | "pump": { 667 | "version": "3.0.0", 668 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 669 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 670 | "requires": { 671 | "end-of-stream": "^1.1.0", 672 | "once": "^1.3.1" 673 | } 674 | }, 675 | "qs": { 676 | "version": "6.10.3", 677 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", 678 | "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", 679 | "requires": { 680 | "side-channel": "^1.0.4" 681 | } 682 | }, 683 | "raw-body": { 684 | "version": "2.5.1", 685 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 686 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 687 | "requires": { 688 | "bytes": "3.1.2", 689 | "http-errors": "2.0.0", 690 | "iconv-lite": "0.4.24", 691 | "unpipe": "1.0.0" 692 | } 693 | }, 694 | "readable-stream": { 695 | "version": "1.1.14", 696 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", 697 | "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", 698 | "requires": { 699 | "core-util-is": "~1.0.0", 700 | "inherits": "~2.0.1", 701 | "isarray": "0.0.1", 702 | "string_decoder": "~0.10.x" 703 | } 704 | }, 705 | "safer-buffer": { 706 | "version": "2.1.2", 707 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 708 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 709 | }, 710 | "sax": { 711 | "version": "1.2.4", 712 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", 713 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" 714 | }, 715 | "semver": { 716 | "version": "5.7.1", 717 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 718 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 719 | }, 720 | "setprototypeof": { 721 | "version": "1.2.0", 722 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 723 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 724 | }, 725 | "side-channel": { 726 | "version": "1.0.4", 727 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 728 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 729 | "requires": { 730 | "call-bind": "^1.0.0", 731 | "get-intrinsic": "^1.0.2", 732 | "object-inspect": "^1.9.0" 733 | } 734 | }, 735 | "smart-buffer": { 736 | "version": "4.2.0", 737 | "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", 738 | "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" 739 | }, 740 | "socks": { 741 | "version": "2.6.2", 742 | "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", 743 | "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", 744 | "requires": { 745 | "ip": "^1.1.5", 746 | "smart-buffer": "^4.2.0" 747 | } 748 | }, 749 | "socks-proxy-agent": { 750 | "version": "5.0.1", 751 | "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", 752 | "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", 753 | "requires": { 754 | "agent-base": "^6.0.2", 755 | "debug": "4", 756 | "socks": "^2.3.3" 757 | }, 758 | "dependencies": { 759 | "debug": { 760 | "version": "4.3.3", 761 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", 762 | "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", 763 | "requires": { 764 | "ms": "2.1.2" 765 | } 766 | }, 767 | "ms": { 768 | "version": "2.1.2", 769 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 770 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 771 | } 772 | } 773 | }, 774 | "source-map": { 775 | "version": "0.6.1", 776 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 777 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 778 | "optional": true 779 | }, 780 | "statuses": { 781 | "version": "1.5.0", 782 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 783 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 784 | }, 785 | "string_decoder": { 786 | "version": "0.10.31", 787 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 788 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" 789 | }, 790 | "strip-ansi": { 791 | "version": "0.1.1", 792 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", 793 | "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=" 794 | }, 795 | "strnum": { 796 | "version": "1.0.5", 797 | "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", 798 | "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" 799 | }, 800 | "thenify": { 801 | "version": "3.3.1", 802 | "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", 803 | "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", 804 | "requires": { 805 | "any-promise": "^1.0.0" 806 | } 807 | }, 808 | "thenify-all": { 809 | "version": "1.6.0", 810 | "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", 811 | "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", 812 | "requires": { 813 | "thenify": ">= 3.1.0 < 4" 814 | } 815 | }, 816 | "through": { 817 | "version": "2.3.8", 818 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 819 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" 820 | }, 821 | "toidentifier": { 822 | "version": "1.0.1", 823 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 824 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" 825 | }, 826 | "tslib": { 827 | "version": "2.3.1", 828 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", 829 | "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" 830 | }, 831 | "type-check": { 832 | "version": "0.3.2", 833 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 834 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 835 | "requires": { 836 | "prelude-ls": "~1.1.2" 837 | } 838 | }, 839 | "underscore": { 840 | "version": "1.6.0", 841 | "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", 842 | "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=" 843 | }, 844 | "unescape": { 845 | "version": "1.0.1", 846 | "resolved": "https://registry.npmjs.org/unescape/-/unescape-1.0.1.tgz", 847 | "integrity": "sha512-O0+af1Gs50lyH1nUu3ZyYS1cRh01Q/kUKatTOkSs7jukXE6/NebucDVxyiDsA9AQ4JC1V1jUH9EO8JX2nMDgGQ==", 848 | "requires": { 849 | "extend-shallow": "^2.0.1" 850 | } 851 | }, 852 | "universal-speedtest": { 853 | "version": "2.0.2", 854 | "resolved": "https://registry.npmjs.org/universal-speedtest/-/universal-speedtest-2.0.2.tgz", 855 | "integrity": "sha512-s2St8H+48eNkf8Rfjyh6NYjzQRSvc+4hs18EmMaAx15sqOh+fFhB6NiWrq09krsXwLfaxkawCJnqwxiDB+AOYA==", 856 | "requires": { 857 | "@types/node": "^16.11.12", 858 | "convert-units": "^3.0.0-beta.0", 859 | "fast-xml-parser": "^3.21.1", 860 | "urllib": "^2.38.0", 861 | "xml2js": "^0.4.23" 862 | } 863 | }, 864 | "universalify": { 865 | "version": "0.1.2", 866 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 867 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" 868 | }, 869 | "unpipe": { 870 | "version": "1.0.0", 871 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 872 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 873 | }, 874 | "urllib": { 875 | "version": "2.38.0", 876 | "resolved": "https://registry.npmjs.org/urllib/-/urllib-2.38.0.tgz", 877 | "integrity": "sha512-8nim/hlS5GXtWe2BJ6usPimKx5VE3nenXgcG26ip5Ru+MKPddINH8uLpZ948n6ADhlus6A0AYj8xTYNmGQi8yA==", 878 | "requires": { 879 | "any-promise": "^1.3.0", 880 | "content-type": "^1.0.2", 881 | "debug": "^2.6.9", 882 | "default-user-agent": "^1.0.0", 883 | "digest-header": "^0.0.1", 884 | "ee-first": "~1.1.1", 885 | "formstream": "^1.1.0", 886 | "humanize-ms": "^1.2.0", 887 | "iconv-lite": "^0.4.15", 888 | "ip": "^1.1.5", 889 | "proxy-agent": "^5.0.0", 890 | "pump": "^3.0.0", 891 | "qs": "^6.4.0", 892 | "statuses": "^1.3.1", 893 | "utility": "^1.16.1" 894 | } 895 | }, 896 | "utility": { 897 | "version": "1.17.0", 898 | "resolved": "https://registry.npmjs.org/utility/-/utility-1.17.0.tgz", 899 | "integrity": "sha512-KdVkF9An/0239BJ4+dqOa7NPrPIOeQE9AGfx0XS16O9DBiHNHRJMoeU5nL6pRGAkgJOqdOu8R4gBRcXnAocJKw==", 900 | "requires": { 901 | "copy-to": "^2.0.1", 902 | "escape-html": "^1.0.3", 903 | "mkdirp": "^0.5.1", 904 | "mz": "^2.7.0", 905 | "unescape": "^1.0.1" 906 | } 907 | }, 908 | "vm2": { 909 | "version": "3.9.9", 910 | "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.9.tgz", 911 | "integrity": "sha512-xwTm7NLh/uOjARRBs8/95H0e8fT3Ukw5D/JJWhxMbhKzNh1Nu981jQKvkep9iKYNxzlVrdzD0mlBGkDKZWprlw==", 912 | "requires": { 913 | "acorn": "^8.7.0", 914 | "acorn-walk": "^8.2.0" 915 | } 916 | }, 917 | "win-release": { 918 | "version": "1.1.1", 919 | "resolved": "https://registry.npmjs.org/win-release/-/win-release-1.1.1.tgz", 920 | "integrity": "sha1-X6VeAr58qTTt/BJmVjLoSbcuUgk=", 921 | "requires": { 922 | "semver": "^5.0.1" 923 | } 924 | }, 925 | "word-wrap": { 926 | "version": "1.2.3", 927 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 928 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" 929 | }, 930 | "wrappy": { 931 | "version": "1.0.2", 932 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 933 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 934 | }, 935 | "xml2js": { 936 | "version": "0.4.23", 937 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", 938 | "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", 939 | "requires": { 940 | "sax": ">=0.6.0", 941 | "xmlbuilder": "~11.0.0" 942 | } 943 | }, 944 | "xmlbuilder": { 945 | "version": "11.0.1", 946 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", 947 | "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" 948 | }, 949 | "xregexp": { 950 | "version": "2.0.0", 951 | "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", 952 | "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=" 953 | }, 954 | "yallist": { 955 | "version": "3.1.1", 956 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 957 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" 958 | } 959 | } 960 | } 961 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cloud-bench", 3 | "description": "CLI to benchmark the CPU, network and disk performance of cloud servers over time.", 4 | "homepage": "https://github.com/goldfire/node-cloud-bench", 5 | "version": "1.1.0", 6 | "keywords": [ 7 | "cloud", 8 | "performance", 9 | "vps", 10 | "ec2", 11 | "aws", 12 | "server benchmark", 13 | "benchmark", 14 | "cloud benchmark", 15 | "bench" 16 | ], 17 | "author": "James Simpson (http://goldfirestudios.com)", 18 | "repository": { 19 | "type": "git", 20 | "url": "git://github.com/goldfire/node-cloud-bench.git" 21 | }, 22 | "main": "bench.js", 23 | "license": "MIT", 24 | "dependencies": { 25 | "colors": ">=1.4.0", 26 | "nomnom": ">0.0.1", 27 | "universal-speedtest": "2.0.2" 28 | }, 29 | "engines": [ 30 | "node >= 12.0.0" 31 | ] 32 | } 33 | --------------------------------------------------------------------------------