├── .editorconfig ├── .eslintignore ├── .eslintrc.yml ├── .gitignore ├── .npmignore ├── .travis.yml ├── .vscode └── launch.json ├── LICENSE.md ├── README.md ├── bin └── pk.js ├── lib ├── completion.js ├── filter.js └── format.js ├── logo.png ├── package-lock.json ├── package.json └── test ├── cases ├── all-types.json ├── can-parse-version.txt ├── completion-path.txt ├── completion.txt ├── empty-arr.json ├── empty-obj.json ├── get-arr-item.txt ├── get-arr.txt ├── get-bool.txt ├── get-count-arr-empty.txt ├── get-count-arr.txt ├── get-count-obj-empty.txt ├── get-count-obj.txt ├── get-nested-obj.txt ├── get-num.txt ├── get-obj.txt ├── get-relative-path.txt ├── get-str.txt ├── name.json ├── nested-obj.json ├── package.json └── using-local-package.txt └── cli.test.js /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 4 6 | insert_final_newline = true 7 | max_line_length = 100 8 | 9 | [*.{js,json}] 10 | charset = utf-8 11 | trim_trailing_whitespace = true 12 | 13 | [*.txt] 14 | indent_style = tab 15 | indent_size = 8 16 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | doc/ 3 | -------------------------------------------------------------------------------- /.eslintrc.yml: -------------------------------------------------------------------------------- 1 | extends: eslint:recommended 2 | parserOptions: 3 | ecmaVersion: 2017 4 | env: 5 | node: true 6 | mocha: true 7 | es6: true 8 | rules: 9 | no-undefined: off 10 | no-console: off 11 | no-unused-vars: 12 | - error 13 | - argsIgnorePattern: next 14 | require-jsdoc: off 15 | valid-jsdoc: 16 | - error 17 | - requireParamDescription: false 18 | requireReturnDescription: false 19 | max-nested-callbacks: 20 | - error 21 | - 4 22 | camelcase: off 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | * 2 | !lib/**/* 3 | !bin/**/* 4 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | sudo: false 3 | node_js: 4 | - lts/* 5 | - node 6 | script: npm t 7 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "type": "node", 9 | "request": "launch", 10 | "name": "Launch Program", 11 | "skipFiles": [ 12 | "/**/*.js" 13 | ], 14 | "program": "${workspaceFolder}/bin/pk.js", 15 | "cwd": "${workspaceFolder}", 16 | "env": { 17 | "DEBUG": "pk" 18 | }, 19 | "args": [ 20 | "-i", 21 | "test/cases/all-types.json", 22 | "num", 23 | ] 24 | }, 25 | { 26 | "type": "node", 27 | "request": "launch", 28 | "name": "Launch CLI test", 29 | "skipFiles": [ 30 | "/**/*.js" 31 | ], 32 | "env": { 33 | "DEBUG": "pk" 34 | }, 35 | "program": "${workspaceFolder}/node_modules/mocha/bin/mocha", 36 | "args": [ 37 | "test/cli.test.js" 38 | ] 39 | } 40 | ] 41 | } 42 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Copyright 2018 Userpixel 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![npm](https://img.shields.io/npm/dt/pk.svg)](https://www.npmjs.com/package/pk) 2 | [![npm](https://img.shields.io/npm/v/pk.svg)](https://www.npmjs.com/package/pk) 3 | [![Build Status](https://travis-ci.org/userpixel/pk.svg?branch=master)](https://travis-ci.org/userpixel/pk) 4 | [![GitHub issues](https://img.shields.io/github/issues/userpixel/pk.svg)](https://github.com/userpixel/pk/issues) 5 | [![GitHub stars](https://img.shields.io/github/stars/userpixel/pk.svg)](https://github.com/userpixel/pk/stargazers) 6 | [![GitHub license](https://img.shields.io/github/license/userpixel/pk.svg)](https://github.com/userpixel/pk) 7 | [![Twitter](https://img.shields.io/twitter/url/https/github.com/userpixel/pk.svg?style=social)](https://twitter.com/intent/tweet?text=Wow:&url=https%3A%2F%2Fgithub.com%2Fuserpixel%2Fpk) 8 | 9 | ![pk logo](logo.png) 10 | 11 | # Introduction 12 | 13 | `pk` is a small utility CLI for querying JSON files like `package.json` or `manifest.json` etc. 14 | 15 | * Get the value of a particular field 💪 `pk scripts.start` 16 | * Parse semver versions 🐍 `pk -s version` 17 | * Minify json 🐭 `pk -m` 18 | * Beautify json 🐘 `pk -j` 19 | * Get the keys in an object 🔑 `pk -k scripts` 20 | * Get the size of an array or number of keys in an object 🌮 `pk -c dependencies` 21 | * Get a part of a json file ✂ `pk -j repository` 22 | * Check if a path exists in the json and what type it is 🎁 `pk -t keywords` 23 | * The default output is compatible with Unix text processing utils 👓 (`wc`, `sort`, `grep`, `uniq`, `comm`, `shuf`, `paste`, `column`, `pr`, `fold`, `cmp`, `diff`, [etc.](https://github.com/learnbyexample/Command-line-text-processing)) 24 | * Tiny, super quick, 100% Javascript 🦄 25 | * Autocomplete (see 👇) 26 | * Correction suggestion (typos in the path) 😅 27 | 28 | By default it operates on _**p**ac**k**age.json_ where its name comes from but you can specify 29 | any input file using the `-i FILE.json` option. 30 | 31 | # Install 32 | 33 | ```shell 34 | $ npm i -g pk 35 | ``` 36 | 37 | Now you can run it from the terminal. 38 | Check out the command reference to see what you can do with it: 39 | 40 | ```shell 41 | $ pk --help 42 | ``` 43 | 44 | # Install command line completion (optional) 45 | 46 | `pk bashcomp`generates the bash auto complete command 47 | You need to add this script to your bash initialization: 48 | 49 | * On Linux: `$ pk bashcomp >> ~/.bashrc` 50 | * On Mac OS X: `$ pk bashcomp >> ~/.bash_profile` 51 | * Windows Subsystem for Linux: `$ pk bashcomp >> ~/.bashrc` 52 | 53 | Then you need to restart a bash session for this to take effect. 54 | 55 | # Examples 56 | 57 | ### Get the `main` field 58 | 59 | ```shell 60 | $ pk main 61 | index.js 62 | ``` 63 | 64 | If there is no main field nothing will be returned. 65 | 66 | ### Working with objects 67 | 68 | `package.json`: 69 | 70 | ```js 71 | { 72 | "scripts": { 73 | "start": "node server.js", 74 | "build": "webpack .", 75 | } 76 | } 77 | ``` 78 | 79 | Get the list of all scripts along with their commands: 80 | 81 | ```shell 82 | $ pk scripts 83 | start node server.js 84 | build webpack . 85 | ``` 86 | 87 | Just the script names (object keys `-k`): 88 | 89 | ```shell 90 | $ pk scripts -k 91 | start 92 | build 93 | ``` 94 | 95 | Just the values: 96 | 97 | ```shell 98 | $ pk scripts -v 99 | node server.js 100 | webpack . 101 | ``` 102 | 103 | pk is designed with Unix philosophy in mind and plays nice with other tools. 104 | Want to see which script has the word "server" in it? Grep it: 105 | 106 | ```shell 107 | $ pk scripts | grep server 108 | start node server.js 109 | ``` 110 | 111 | #### Nested objects 112 | 113 | `package.json`: 114 | 115 | ```js 116 | { 117 | ... 118 | config: { 119 | port: 8080 120 | } 121 | } 122 | ``` 123 | 124 | Get a particular config (`port` in this case): 125 | 126 | ```shell 127 | $ pk config.port 128 | 8080 129 | ``` 130 | 131 | You can also use autocomplete to see what is available. 132 | Just press TABTAB after istalling the command line completion script. 133 | 134 | ### Working with arrays 135 | 136 | `package.json`: 137 | 138 | ```js 139 | { 140 | keywords: [ "node", "cli", "config", "CI" ] 141 | } 142 | ``` 143 | 144 | Get a particular item: 145 | 146 | ```shell 147 | $ pk keywords[2] 148 | config 149 | ``` 150 | 151 | Get all items: 152 | 153 | ```shell 154 | $ pk keywords 155 | node 156 | cli 157 | config 158 | CI 159 | ``` 160 | 161 | Get it in json format: 162 | 163 | ```shell 164 | $ pk keywords -j 165 | [ 166 | "node", 167 | "cli", 168 | "config", 169 | "CI" 170 | ] 171 | ``` 172 | 173 | Or even minified: 174 | 175 | ```shell 176 | $ pk keywords -j 177 | ["node","cli","config","CI"] 178 | ``` 179 | 180 | By default the output is unix compatible so you can pipe it: 181 | 182 | ```shell 183 | $ pk keywords | sort 184 | CI 185 | cli 186 | config 187 | node 188 | ``` 189 | 190 | Get the type of something: 191 | 192 | ```shell 193 | $ pk -t keywords 194 | array 195 | ``` 196 | 197 | Or the type of an element: 198 | 199 | ```shell 200 | $ pk -t keywords[0] 201 | string 202 | ``` 203 | 204 | If a field doesn't exist, `undefined` will be printed: 205 | 206 | ```shell 207 | $ pk -t license 208 | undefined 209 | ``` 210 | 211 | ### Minify a json file 212 | 213 | There's no magic! It just uses native JSON module without padding. 214 | 215 | `original.json`: 216 | 217 | ```js 218 | { 219 | "name": "Alex" 220 | "city": "Stockholm" 221 | } 222 | ``` 223 | 224 | Minify it and show the output: 225 | 226 | ```shell 227 | $ pk -i original.json -m 228 | {"name":"Alex","city":"Stockholm"} 229 | ``` 230 | 231 | Write the output to a file: 232 | 233 | ```shell 234 | $ pk -i original.json -m > original.min.json 235 | ``` 236 | 237 | ### Prettify a minified or badly formatted JSON 238 | 239 | `original.json`: 240 | 241 | ```js 242 | {"name": "Alex" 243 | "city": "Stockholm", "keywords": ["javascript", "golang", 244 | "vuejs"] 245 | } 246 | ``` 247 | 248 | Show it pretty on screen: 249 | 250 | ```shell 251 | $ pk -i original.json -j 252 | { 253 | "name": "Alex" 254 | "city": "Stockholm", 255 | "keywords": [ 256 | "javascript", 257 | "golang", 258 | "vuejs" 259 | ] 260 | } 261 | ``` 262 | 263 | If the output is too big you may wanna browse it on the terminal: 264 | 265 | ```shell 266 | $ pk -i original.json -j | less 267 | ``` 268 | 269 | Or just write it to a file: 270 | 271 | ```shell 272 | $ pk -i original.json -j > original-prettified.json 273 | ``` 274 | 275 | Even overwrite the original file: 276 | 277 | ```shell 278 | $ pk -i original.json -j > original.json 279 | ``` 280 | 281 | ### Count the number of `devDependencies` 282 | 283 | `package.json`: 284 | 285 | ```js 286 | { 287 | "devDependencies": { 288 | "mocha": "*", 289 | "babel": "*", 290 | "micromustache": "*", 291 | "webpack": "*", 292 | } 293 | } 294 | ``` 295 | 296 | ```shell 297 | $ pk devDependencies -c 298 | 4 299 | ``` 300 | 301 | `package-lock.json` is nutorious! 302 | 303 | ```shell 304 | $ pk -i package-lock.json dependencies -c 305 | 2739 306 | ``` 307 | 308 | If you're referring to an array, it'll return the size of the array: 309 | 310 | ```shell 311 | $ pk -c keywords 312 | 3 313 | ``` 314 | 315 | ### Get part of a JSON file 316 | 317 | `package.json`: 318 | ```js 319 | { 320 | ... 321 | "repository": { 322 | "type": "git", 323 | "url": "git+https://github.com/userpixel/pk.git" 324 | } 325 | } 326 | ``` 327 | 328 | Get the value of the repository: 329 | 330 | ```shell 331 | $ pk -j repository 332 | { 333 | "type": "git", 334 | "url": "git+https://github.com/userpixel/pk.git" 335 | } 336 | ``` 337 | 338 | ### Working with versions 339 | 340 | `package.json`: 341 | 342 | ```js 343 | { 344 | "version": "1.2.3" 345 | } 346 | ``` 347 | 348 | Just get the version string: 349 | 350 | ```shell 351 | $ pk version 352 | 1.2.3 353 | ``` 354 | 355 | Parse it as [semver](https://semver.org/): 356 | 357 | ```shell 358 | $ pk -s version 359 | major 1 360 | minor 2 361 | patch 3 362 | ``` 363 | 364 | You can actually omit "version" part if that's where it is: 365 | 366 | ```shell 367 | $ pk -s 368 | major 1 369 | minor 2 370 | patch 3 371 | ``` 372 | 373 | Yep you can get it in JSON format if you want: 374 | 375 | ```shell 376 | $ pk -s version 377 | { 378 | "major": 0, 379 | "minor": 2, 380 | "patch": 4 381 | } 382 | ``` 383 | 384 | It understands watever [semver](https://www.npmjs.com/package/semver) can parse. 385 | So if the version was "4.3.2-beta.2+build1000" 386 | 387 | ```shell 388 | $ pk -s 389 | major 4 390 | minor 3 391 | patch 2 392 | build ["build1000"] 393 | prerelease ["beta",2] 394 | ``` 395 | ### Command Substitution 396 | 397 | pk is ideal for CI/CD scripts and that was the original motivation for its creation. 398 | For example if you want to compress the current directory and version it you can: 399 | 400 | ```shell 401 | $ zip -r `pk name`-`pk version`.zip . 402 | ``` 403 | 404 | This will zip the current directory to a file that is name `NAME-VERSION.zip` 405 | where `NAME` and `VERSION` in the file name come from `"name"` and `"version"` 406 | fields in the local `package.json`. 407 | 408 | # More 409 | 410 | There's more. See the help for the command reference 411 | 412 | ```shell 413 | $ pk --help`. 414 | ``` 415 | 416 | # Update 417 | 418 | ```shell 419 | # Check the version 420 | $ pk --version 421 | 422 | # Check if there's a new version 423 | $ npm outdated -g pk 424 | 425 | # Update it if needed 426 | $ npm i -g pk@latest` 427 | ``` 428 | 429 | # Uninstall 430 | 431 | ```shell 432 | $ npm un -g pk 433 | ``` 434 | 435 | # License 436 | 437 | MIT 438 | 439 | _Made in Sweden by [@alexewerlof](https://twitter.com/alexewerlof)_ 440 | -------------------------------------------------------------------------------- /bin/pk.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | 'use strict'; 4 | 5 | const fs = require('fs'); 6 | const yargs = require('yargs'); 7 | const _get = require('lodash.get') 8 | const debug = require('debug'); 9 | const didyoumean = require('didyoumean'); 10 | const filter = require('../lib/filter'); 11 | const format = require('../lib/format'); 12 | const completion = require('../lib/completion'); 13 | 14 | const log = debug('pk'); 15 | 16 | const argv = yargs 17 | .usage('Usage: pk [options] [path]\n' + 18 | 'The path can be the name of a key like "name" or "keywords[3]" or "bugs.url".') 19 | .options({ 20 | v: { 21 | describe: 'Get values', 22 | alias: 'val', 23 | type: 'boolean', 24 | conflicts: ['t', 'c'], 25 | }, 26 | k: { 27 | describe: 'Get keys (default)', 28 | alias: 'key', 29 | type: 'boolean', 30 | }, 31 | c: { 32 | describe: 'Count the number of values for an array or number of keys for objects', 33 | alias: 'count', 34 | type: 'boolean', 35 | }, 36 | t: { 37 | describe: 'Show types instead of values', 38 | alias: 'type', 39 | type: 'boolean', 40 | conflicts: ['c', 'v'] 41 | }, 42 | j: { 43 | describe: 'Output JSON', 44 | alias: 'json', 45 | type: 'boolean', 46 | }, 47 | m: { 48 | describe: 'Output minified JSON', 49 | alias: 'min', 50 | type: 'boolean', 51 | }, 52 | s: { 53 | describe: 'Parse the value as a semver version', 54 | alias: 'semver', 55 | type: 'boolean', 56 | }, 57 | i: { 58 | describe: 'The input JSON file', 59 | alias: 'in', 60 | type: 'string', 61 | default: './package.json', 62 | normalize: true, 63 | } 64 | }) 65 | .alias('h', 'help') 66 | .example('pk name', 'prints the value of "name" key from the current "package.json" file') 67 | .version() 68 | .help() 69 | .epilogue('Bugs and feature requests: https://github.com/userpixel/pk/issues') 70 | .completion('bashcomp', function (current, argv) { 71 | try { 72 | log('current:', current, 'argv:', argv) 73 | return completion.pathCompletion(readJSON(argv.i), current) 74 | } catch(e) { 75 | log(e) 76 | return []; 77 | } 78 | }) 79 | .wrap(null) 80 | .argv 81 | 82 | log(argv) 83 | 84 | function readJSON(fileName) { 85 | log('Reading file', fileName) 86 | return JSON.parse(fs.readFileSync(fileName, 'utf8')) 87 | } 88 | 89 | let what; 90 | try { 91 | const path = argv._[0]; 92 | log(path ? `Path is ${path}` : 'There is no path. Operating on the whole file.'); 93 | const jsonContents = readJSON(argv.in); 94 | let result = jsonContents; 95 | if (path) { 96 | result = _get(jsonContents, path) 97 | if (result === undefined) { 98 | log(`Could not lookup the path "${path}"`) 99 | didyoumean.threshold = 0.5 100 | const possiblePaths = didyoumean(path, completion.getKeys(jsonContents)) 101 | if (possiblePaths) { 102 | throw new Error(`There is no "${path}". Did you mean:\n${possiblePaths}`) 103 | } 104 | throw new Error(`Path not found: ${path}`) 105 | } 106 | } 107 | if (argv.key && argv.val) { 108 | log('Both keys are values are desired'); 109 | what = result 110 | } else if (argv.key) { 111 | log('Only keys are requested'); 112 | what = filter.keys(result); 113 | } else if (argv.val) { 114 | log('Only values are requested'); 115 | what = filter.values(result); 116 | } else if (argv.count) { 117 | log('Only count is requested'); 118 | what = filter.count(result); 119 | } else if (argv.type) { 120 | log('Only type is requested'); 121 | what = filter.type(result); 122 | } else if (argv.semver) { 123 | log('Parsing as semver'); 124 | what = filter.semver(result); 125 | } else { 126 | log('No filters specified, operating on the whole JSON'); 127 | what = result; 128 | } 129 | } catch (err) { 130 | log(err) 131 | console.log(err.message || err); 132 | process.exit(1); 133 | } 134 | 135 | let how; 136 | if (argv.min) { 137 | how = 'min'; 138 | } else if (argv.json) { 139 | how = 'json'; 140 | } else { 141 | how = 'unix'; 142 | } 143 | 144 | console.log(format.output(what, how)); 145 | -------------------------------------------------------------------------------- /lib/completion.js: -------------------------------------------------------------------------------- 1 | function getKeys(obj, prefix = '') { 2 | const keys = [] 3 | if (typeof obj === 'object' && obj !== null) { 4 | Object.entries(obj).forEach(([key, val]) => { 5 | let path; 6 | if (prefix) { 7 | if (Array.isArray(obj)) { 8 | path = `${prefix}[${key}]` 9 | } else { 10 | path = `${prefix}.${key}` 11 | } 12 | } else { 13 | path = key 14 | } 15 | keys.push(path) 16 | if (typeof val === 'object') { 17 | keys.push(...getKeys(val, path)) 18 | } 19 | }) 20 | } 21 | return keys 22 | } 23 | 24 | function keepStartingWith(arr, start) { 25 | return arr.filter(key => key.startsWith(start)) 26 | } 27 | 28 | function sortByLength(arr) { 29 | return arr.sort((a, b) => { 30 | const ret = a.length - b.length 31 | if (ret === 0) { 32 | if (a === b) { 33 | return 0 34 | } 35 | return a > b ? 1 : -1 36 | } 37 | return ret 38 | }) 39 | } 40 | 41 | function pathCompletion(json, start) { 42 | return sortByLength(keepStartingWith(getKeys(json), start)) 43 | } 44 | 45 | module.exports = { getKeys, pathCompletion } 46 | -------------------------------------------------------------------------------- /lib/filter.js: -------------------------------------------------------------------------------- 1 | const { parse } = require('semver'); 2 | 3 | 'use strict'; 4 | /* 5 | Every function here should handle: 6 | string 7 | number 8 | boolean 9 | undefined 10 | null 11 | object 12 | array 13 | */ 14 | 15 | function count(rawObj) { 16 | if (typeof rawObj === 'object') { 17 | if (Array.isArray(rawObj)) { 18 | return rawObj.length; 19 | } else { 20 | return rawObj === null ? 0 : Object.keys(rawObj).length; 21 | } 22 | } 23 | // for number, string, boolean or undefined 24 | return rawObj === undefined ? 0 : 1; 25 | } 26 | 27 | function keys(rawObj) { 28 | if (typeof rawObj !== 'object') { 29 | throw new Error(`Cannot get keys for a value of type ${typeof rawObj}`); 30 | } 31 | return Object.keys(rawObj); 32 | } 33 | 34 | function values(rawObj) { 35 | if (rawObj === undefined ) { 36 | return []; 37 | } 38 | if (typeof rawObj !== 'object') { 39 | // for number, string, boolean, undefined 40 | return rawObj; 41 | } 42 | if (Array.isArray(rawObj)) { 43 | return rawObj; 44 | } 45 | return rawObj === null ? [] : Object.values(rawObj); 46 | } 47 | 48 | function type(rawObj) { 49 | if (Array.isArray(rawObj)) { 50 | return 'array'; 51 | } else if (rawObj === null) { 52 | return 'null'; 53 | } 54 | // for number, string, boolean, object and undefined 55 | return typeof rawObj; 56 | } 57 | 58 | function semver(rawObj) { 59 | const parsed = typeof rawObj === 'object' && rawObj !== null ? parse(rawObj.version) : parse(rawObj) 60 | if (parsed) { 61 | const ret = {} 62 | ret.major = parsed.major 63 | ret.minor = parsed.minor 64 | ret.patch = parsed.patch 65 | if (parsed.build.length > 0) { 66 | ret.build = parsed.build 67 | } 68 | if (parsed.prerelease.length > 0) { 69 | ret.prerelease = parsed.prerelease 70 | } 71 | return ret 72 | } 73 | return undefined 74 | } 75 | 76 | module.exports = { count, keys, values, type, semver }; 77 | -------------------------------------------------------------------------------- /lib/format.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | function unix(data) { 4 | if (typeof data === 'object' && data !== null) { 5 | if (Array.isArray(data)) { 6 | return data.join('\n'); 7 | } 8 | return Object.entries(data).map(([k, v]) => `${k}\t${json(v)}`).join('\n'); 9 | } 10 | if (data === undefined) { 11 | return ''; 12 | } 13 | return String(data); 14 | } 15 | 16 | function json(data, indent = 0) { 17 | switch(typeof data) { 18 | case 'number': 19 | case 'boolean': 20 | case 'string': 21 | return String(data); 22 | case 'object': // also includes null and arrays 23 | return JSON.stringify(data, undefined, indent); 24 | case 'undefined': 25 | return '{}'; 26 | default: 27 | throw `Invalid data type (${typeof data}): ${data}`; 28 | } 29 | } 30 | 31 | // TODO support 'unix' and 'yaml|yml' too 32 | // TODO add an option for pretty formatting the JSON objects 33 | // TODO the format should by default be unix so it can be easier to use it in bash scripts 34 | 35 | function output(data, format) { 36 | switch(format) { 37 | case 'json': 38 | return json(data, 2); 39 | case 'min': 40 | return json(data); 41 | case 'unix': 42 | return unix(data); 43 | default: 44 | throw `Invalid format: ${format}`; 45 | } 46 | } 47 | 48 | module.exports = { output }; 49 | -------------------------------------------------------------------------------- /logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexewerlof/pk/a9516e681bed2bc107f759113e4da2c9ce601320/logo.png -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pk", 3 | "version": "1.1.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.5.5", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", 10 | "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.0.0" 14 | } 15 | }, 16 | "@babel/highlight": { 17 | "version": "7.5.0", 18 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", 19 | "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", 20 | "dev": true, 21 | "requires": { 22 | "chalk": "^2.0.0", 23 | "esutils": "^2.0.2", 24 | "js-tokens": "^4.0.0" 25 | } 26 | }, 27 | "acorn": { 28 | "version": "7.1.0", 29 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", 30 | "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", 31 | "dev": true 32 | }, 33 | "acorn-jsx": { 34 | "version": "5.1.0", 35 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", 36 | "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", 37 | "dev": true 38 | }, 39 | "ajv": { 40 | "version": "6.10.2", 41 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", 42 | "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", 43 | "dev": true, 44 | "requires": { 45 | "fast-deep-equal": "^2.0.1", 46 | "fast-json-stable-stringify": "^2.0.0", 47 | "json-schema-traverse": "^0.4.1", 48 | "uri-js": "^4.2.2" 49 | } 50 | }, 51 | "ansi-colors": { 52 | "version": "3.2.3", 53 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", 54 | "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", 55 | "dev": true 56 | }, 57 | "ansi-escapes": { 58 | "version": "4.2.1", 59 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.2.1.tgz", 60 | "integrity": "sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q==", 61 | "dev": true, 62 | "requires": { 63 | "type-fest": "^0.5.2" 64 | } 65 | }, 66 | "ansi-regex": { 67 | "version": "4.1.0", 68 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 69 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" 70 | }, 71 | "ansi-styles": { 72 | "version": "3.2.1", 73 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 74 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 75 | "requires": { 76 | "color-convert": "^1.9.0" 77 | } 78 | }, 79 | "argparse": { 80 | "version": "1.0.10", 81 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 82 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 83 | "dev": true, 84 | "requires": { 85 | "sprintf-js": "~1.0.2" 86 | } 87 | }, 88 | "assertion-error": { 89 | "version": "1.1.0", 90 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", 91 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", 92 | "dev": true 93 | }, 94 | "astral-regex": { 95 | "version": "1.0.0", 96 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", 97 | "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", 98 | "dev": true 99 | }, 100 | "balanced-match": { 101 | "version": "1.0.0", 102 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 103 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 104 | "dev": true 105 | }, 106 | "brace-expansion": { 107 | "version": "1.1.11", 108 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 109 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 110 | "dev": true, 111 | "requires": { 112 | "balanced-match": "^1.0.0", 113 | "concat-map": "0.0.1" 114 | } 115 | }, 116 | "browser-stdout": { 117 | "version": "1.3.1", 118 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 119 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 120 | "dev": true 121 | }, 122 | "callsites": { 123 | "version": "3.1.0", 124 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 125 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 126 | "dev": true 127 | }, 128 | "camelcase": { 129 | "version": "5.3.1", 130 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 131 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" 132 | }, 133 | "chai": { 134 | "version": "4.2.0", 135 | "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", 136 | "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", 137 | "dev": true, 138 | "requires": { 139 | "assertion-error": "^1.1.0", 140 | "check-error": "^1.0.2", 141 | "deep-eql": "^3.0.1", 142 | "get-func-name": "^2.0.0", 143 | "pathval": "^1.1.0", 144 | "type-detect": "^4.0.5" 145 | } 146 | }, 147 | "chalk": { 148 | "version": "2.4.2", 149 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 150 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 151 | "dev": true, 152 | "requires": { 153 | "ansi-styles": "^3.2.1", 154 | "escape-string-regexp": "^1.0.5", 155 | "supports-color": "^5.3.0" 156 | } 157 | }, 158 | "chardet": { 159 | "version": "0.7.0", 160 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 161 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", 162 | "dev": true 163 | }, 164 | "check-error": { 165 | "version": "1.0.2", 166 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", 167 | "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", 168 | "dev": true 169 | }, 170 | "cli-cursor": { 171 | "version": "3.1.0", 172 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", 173 | "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", 174 | "dev": true, 175 | "requires": { 176 | "restore-cursor": "^3.1.0" 177 | } 178 | }, 179 | "cli-width": { 180 | "version": "2.2.0", 181 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", 182 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", 183 | "dev": true 184 | }, 185 | "cliui": { 186 | "version": "5.0.0", 187 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", 188 | "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", 189 | "requires": { 190 | "string-width": "^3.1.0", 191 | "strip-ansi": "^5.2.0", 192 | "wrap-ansi": "^5.1.0" 193 | }, 194 | "dependencies": { 195 | "emoji-regex": { 196 | "version": "7.0.3", 197 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 198 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" 199 | }, 200 | "string-width": { 201 | "version": "3.1.0", 202 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 203 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 204 | "requires": { 205 | "emoji-regex": "^7.0.1", 206 | "is-fullwidth-code-point": "^2.0.0", 207 | "strip-ansi": "^5.1.0" 208 | } 209 | } 210 | } 211 | }, 212 | "color-convert": { 213 | "version": "1.9.3", 214 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 215 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 216 | "requires": { 217 | "color-name": "1.1.3" 218 | } 219 | }, 220 | "color-name": { 221 | "version": "1.1.3", 222 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 223 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 224 | }, 225 | "concat-map": { 226 | "version": "0.0.1", 227 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 228 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 229 | "dev": true 230 | }, 231 | "cross-spawn": { 232 | "version": "6.0.5", 233 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 234 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 235 | "dev": true, 236 | "requires": { 237 | "nice-try": "^1.0.4", 238 | "path-key": "^2.0.1", 239 | "semver": "^5.5.0", 240 | "shebang-command": "^1.2.0", 241 | "which": "^1.2.9" 242 | }, 243 | "dependencies": { 244 | "semver": { 245 | "version": "5.7.1", 246 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 247 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 248 | "dev": true 249 | } 250 | } 251 | }, 252 | "debug": { 253 | "version": "4.1.1", 254 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 255 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 256 | "requires": { 257 | "ms": "^2.1.1" 258 | } 259 | }, 260 | "decamelize": { 261 | "version": "1.2.0", 262 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 263 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 264 | }, 265 | "deep-eql": { 266 | "version": "3.0.1", 267 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", 268 | "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", 269 | "dev": true, 270 | "requires": { 271 | "type-detect": "^4.0.0" 272 | } 273 | }, 274 | "deep-is": { 275 | "version": "0.1.3", 276 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 277 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 278 | "dev": true 279 | }, 280 | "define-properties": { 281 | "version": "1.1.3", 282 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 283 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 284 | "dev": true, 285 | "requires": { 286 | "object-keys": "^1.0.12" 287 | } 288 | }, 289 | "didyoumean": { 290 | "version": "1.2.1", 291 | "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.1.tgz", 292 | "integrity": "sha1-6S7f2tplN9SE1zwBcv0eugxJdv8=" 293 | }, 294 | "diff": { 295 | "version": "3.5.0", 296 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 297 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", 298 | "dev": true 299 | }, 300 | "doctrine": { 301 | "version": "3.0.0", 302 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 303 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 304 | "dev": true, 305 | "requires": { 306 | "esutils": "^2.0.2" 307 | } 308 | }, 309 | "emoji-regex": { 310 | "version": "8.0.0", 311 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 312 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 313 | "dev": true 314 | }, 315 | "es-abstract": { 316 | "version": "1.16.0", 317 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.0.tgz", 318 | "integrity": "sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg==", 319 | "dev": true, 320 | "requires": { 321 | "es-to-primitive": "^1.2.0", 322 | "function-bind": "^1.1.1", 323 | "has": "^1.0.3", 324 | "has-symbols": "^1.0.0", 325 | "is-callable": "^1.1.4", 326 | "is-regex": "^1.0.4", 327 | "object-inspect": "^1.6.0", 328 | "object-keys": "^1.1.1", 329 | "string.prototype.trimleft": "^2.1.0", 330 | "string.prototype.trimright": "^2.1.0" 331 | } 332 | }, 333 | "es-to-primitive": { 334 | "version": "1.2.1", 335 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 336 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 337 | "dev": true, 338 | "requires": { 339 | "is-callable": "^1.1.4", 340 | "is-date-object": "^1.0.1", 341 | "is-symbol": "^1.0.2" 342 | } 343 | }, 344 | "escape-string-regexp": { 345 | "version": "1.0.5", 346 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 347 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 348 | "dev": true 349 | }, 350 | "eslint": { 351 | "version": "6.6.0", 352 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.6.0.tgz", 353 | "integrity": "sha512-PpEBq7b6qY/qrOmpYQ/jTMDYfuQMELR4g4WI1M/NaSDDD/bdcMb+dj4Hgks7p41kW2caXsPsEZAEAyAgjVVC0g==", 354 | "dev": true, 355 | "requires": { 356 | "@babel/code-frame": "^7.0.0", 357 | "ajv": "^6.10.0", 358 | "chalk": "^2.1.0", 359 | "cross-spawn": "^6.0.5", 360 | "debug": "^4.0.1", 361 | "doctrine": "^3.0.0", 362 | "eslint-scope": "^5.0.0", 363 | "eslint-utils": "^1.4.3", 364 | "eslint-visitor-keys": "^1.1.0", 365 | "espree": "^6.1.2", 366 | "esquery": "^1.0.1", 367 | "esutils": "^2.0.2", 368 | "file-entry-cache": "^5.0.1", 369 | "functional-red-black-tree": "^1.0.1", 370 | "glob-parent": "^5.0.0", 371 | "globals": "^11.7.0", 372 | "ignore": "^4.0.6", 373 | "import-fresh": "^3.0.0", 374 | "imurmurhash": "^0.1.4", 375 | "inquirer": "^7.0.0", 376 | "is-glob": "^4.0.0", 377 | "js-yaml": "^3.13.1", 378 | "json-stable-stringify-without-jsonify": "^1.0.1", 379 | "levn": "^0.3.0", 380 | "lodash": "^4.17.14", 381 | "minimatch": "^3.0.4", 382 | "mkdirp": "^0.5.1", 383 | "natural-compare": "^1.4.0", 384 | "optionator": "^0.8.2", 385 | "progress": "^2.0.0", 386 | "regexpp": "^2.0.1", 387 | "semver": "^6.1.2", 388 | "strip-ansi": "^5.2.0", 389 | "strip-json-comments": "^3.0.1", 390 | "table": "^5.2.3", 391 | "text-table": "^0.2.0", 392 | "v8-compile-cache": "^2.0.3" 393 | }, 394 | "dependencies": { 395 | "ansi-regex": { 396 | "version": "4.1.0", 397 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 398 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 399 | "dev": true 400 | }, 401 | "semver": { 402 | "version": "6.3.0", 403 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 404 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 405 | "dev": true 406 | }, 407 | "strip-ansi": { 408 | "version": "5.2.0", 409 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 410 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 411 | "dev": true, 412 | "requires": { 413 | "ansi-regex": "^4.1.0" 414 | } 415 | } 416 | } 417 | }, 418 | "eslint-scope": { 419 | "version": "5.0.0", 420 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", 421 | "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", 422 | "dev": true, 423 | "requires": { 424 | "esrecurse": "^4.1.0", 425 | "estraverse": "^4.1.1" 426 | } 427 | }, 428 | "eslint-utils": { 429 | "version": "1.4.3", 430 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", 431 | "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", 432 | "dev": true, 433 | "requires": { 434 | "eslint-visitor-keys": "^1.1.0" 435 | } 436 | }, 437 | "eslint-visitor-keys": { 438 | "version": "1.1.0", 439 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", 440 | "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", 441 | "dev": true 442 | }, 443 | "espree": { 444 | "version": "6.1.2", 445 | "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", 446 | "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", 447 | "dev": true, 448 | "requires": { 449 | "acorn": "^7.1.0", 450 | "acorn-jsx": "^5.1.0", 451 | "eslint-visitor-keys": "^1.1.0" 452 | } 453 | }, 454 | "esprima": { 455 | "version": "4.0.1", 456 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 457 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 458 | "dev": true 459 | }, 460 | "esquery": { 461 | "version": "1.0.1", 462 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", 463 | "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", 464 | "dev": true, 465 | "requires": { 466 | "estraverse": "^4.0.0" 467 | } 468 | }, 469 | "esrecurse": { 470 | "version": "4.2.1", 471 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", 472 | "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", 473 | "dev": true, 474 | "requires": { 475 | "estraverse": "^4.1.0" 476 | } 477 | }, 478 | "estraverse": { 479 | "version": "4.3.0", 480 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 481 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 482 | "dev": true 483 | }, 484 | "esutils": { 485 | "version": "2.0.3", 486 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 487 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 488 | "dev": true 489 | }, 490 | "external-editor": { 491 | "version": "3.1.0", 492 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", 493 | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", 494 | "dev": true, 495 | "requires": { 496 | "chardet": "^0.7.0", 497 | "iconv-lite": "^0.4.24", 498 | "tmp": "^0.0.33" 499 | } 500 | }, 501 | "fast-deep-equal": { 502 | "version": "2.0.1", 503 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", 504 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", 505 | "dev": true 506 | }, 507 | "fast-json-stable-stringify": { 508 | "version": "2.0.0", 509 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 510 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", 511 | "dev": true 512 | }, 513 | "fast-levenshtein": { 514 | "version": "2.0.6", 515 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 516 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 517 | "dev": true 518 | }, 519 | "figures": { 520 | "version": "3.1.0", 521 | "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", 522 | "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", 523 | "dev": true, 524 | "requires": { 525 | "escape-string-regexp": "^1.0.5" 526 | } 527 | }, 528 | "file-entry-cache": { 529 | "version": "5.0.1", 530 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", 531 | "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", 532 | "dev": true, 533 | "requires": { 534 | "flat-cache": "^2.0.1" 535 | } 536 | }, 537 | "find-up": { 538 | "version": "3.0.0", 539 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", 540 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 541 | "requires": { 542 | "locate-path": "^3.0.0" 543 | } 544 | }, 545 | "flat": { 546 | "version": "4.1.0", 547 | "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", 548 | "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", 549 | "dev": true, 550 | "requires": { 551 | "is-buffer": "~2.0.3" 552 | } 553 | }, 554 | "flat-cache": { 555 | "version": "2.0.1", 556 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", 557 | "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", 558 | "dev": true, 559 | "requires": { 560 | "flatted": "^2.0.0", 561 | "rimraf": "2.6.3", 562 | "write": "1.0.3" 563 | } 564 | }, 565 | "flatted": { 566 | "version": "2.0.1", 567 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", 568 | "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", 569 | "dev": true 570 | }, 571 | "fs.realpath": { 572 | "version": "1.0.0", 573 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 574 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 575 | "dev": true 576 | }, 577 | "function-bind": { 578 | "version": "1.1.1", 579 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 580 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 581 | "dev": true 582 | }, 583 | "functional-red-black-tree": { 584 | "version": "1.0.1", 585 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 586 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 587 | "dev": true 588 | }, 589 | "get-caller-file": { 590 | "version": "2.0.5", 591 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 592 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" 593 | }, 594 | "get-func-name": { 595 | "version": "2.0.0", 596 | "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", 597 | "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", 598 | "dev": true 599 | }, 600 | "glob": { 601 | "version": "7.1.6", 602 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 603 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 604 | "dev": true, 605 | "requires": { 606 | "fs.realpath": "^1.0.0", 607 | "inflight": "^1.0.4", 608 | "inherits": "2", 609 | "minimatch": "^3.0.4", 610 | "once": "^1.3.0", 611 | "path-is-absolute": "^1.0.0" 612 | } 613 | }, 614 | "glob-parent": { 615 | "version": "5.1.0", 616 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", 617 | "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", 618 | "dev": true, 619 | "requires": { 620 | "is-glob": "^4.0.1" 621 | } 622 | }, 623 | "globals": { 624 | "version": "11.12.0", 625 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 626 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 627 | "dev": true 628 | }, 629 | "growl": { 630 | "version": "1.10.5", 631 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", 632 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", 633 | "dev": true 634 | }, 635 | "has": { 636 | "version": "1.0.3", 637 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 638 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 639 | "dev": true, 640 | "requires": { 641 | "function-bind": "^1.1.1" 642 | } 643 | }, 644 | "has-flag": { 645 | "version": "3.0.0", 646 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 647 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 648 | "dev": true 649 | }, 650 | "has-symbols": { 651 | "version": "1.0.0", 652 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", 653 | "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", 654 | "dev": true 655 | }, 656 | "he": { 657 | "version": "1.2.0", 658 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 659 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 660 | "dev": true 661 | }, 662 | "iconv-lite": { 663 | "version": "0.4.24", 664 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 665 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 666 | "dev": true, 667 | "requires": { 668 | "safer-buffer": ">= 2.1.2 < 3" 669 | } 670 | }, 671 | "ignore": { 672 | "version": "4.0.6", 673 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 674 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 675 | "dev": true 676 | }, 677 | "import-fresh": { 678 | "version": "3.1.0", 679 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", 680 | "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", 681 | "dev": true, 682 | "requires": { 683 | "parent-module": "^1.0.0", 684 | "resolve-from": "^4.0.0" 685 | } 686 | }, 687 | "imurmurhash": { 688 | "version": "0.1.4", 689 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 690 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 691 | "dev": true 692 | }, 693 | "inflight": { 694 | "version": "1.0.6", 695 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 696 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 697 | "dev": true, 698 | "requires": { 699 | "once": "^1.3.0", 700 | "wrappy": "1" 701 | } 702 | }, 703 | "inherits": { 704 | "version": "2.0.4", 705 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 706 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 707 | "dev": true 708 | }, 709 | "inquirer": { 710 | "version": "7.0.0", 711 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.0.tgz", 712 | "integrity": "sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ==", 713 | "dev": true, 714 | "requires": { 715 | "ansi-escapes": "^4.2.1", 716 | "chalk": "^2.4.2", 717 | "cli-cursor": "^3.1.0", 718 | "cli-width": "^2.0.0", 719 | "external-editor": "^3.0.3", 720 | "figures": "^3.0.0", 721 | "lodash": "^4.17.15", 722 | "mute-stream": "0.0.8", 723 | "run-async": "^2.2.0", 724 | "rxjs": "^6.4.0", 725 | "string-width": "^4.1.0", 726 | "strip-ansi": "^5.1.0", 727 | "through": "^2.3.6" 728 | }, 729 | "dependencies": { 730 | "ansi-regex": { 731 | "version": "4.1.0", 732 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 733 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 734 | "dev": true 735 | }, 736 | "is-fullwidth-code-point": { 737 | "version": "3.0.0", 738 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 739 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 740 | "dev": true 741 | }, 742 | "string-width": { 743 | "version": "4.1.0", 744 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.1.0.tgz", 745 | "integrity": "sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ==", 746 | "dev": true, 747 | "requires": { 748 | "emoji-regex": "^8.0.0", 749 | "is-fullwidth-code-point": "^3.0.0", 750 | "strip-ansi": "^5.2.0" 751 | } 752 | }, 753 | "strip-ansi": { 754 | "version": "5.2.0", 755 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 756 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 757 | "dev": true, 758 | "requires": { 759 | "ansi-regex": "^4.1.0" 760 | } 761 | } 762 | } 763 | }, 764 | "is-buffer": { 765 | "version": "2.0.4", 766 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", 767 | "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", 768 | "dev": true 769 | }, 770 | "is-callable": { 771 | "version": "1.1.4", 772 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", 773 | "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", 774 | "dev": true 775 | }, 776 | "is-date-object": { 777 | "version": "1.0.1", 778 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", 779 | "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", 780 | "dev": true 781 | }, 782 | "is-extglob": { 783 | "version": "2.1.1", 784 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 785 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 786 | "dev": true 787 | }, 788 | "is-fullwidth-code-point": { 789 | "version": "2.0.0", 790 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 791 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 792 | }, 793 | "is-glob": { 794 | "version": "4.0.1", 795 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 796 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 797 | "dev": true, 798 | "requires": { 799 | "is-extglob": "^2.1.1" 800 | } 801 | }, 802 | "is-promise": { 803 | "version": "2.1.0", 804 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 805 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", 806 | "dev": true 807 | }, 808 | "is-regex": { 809 | "version": "1.0.4", 810 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", 811 | "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", 812 | "dev": true, 813 | "requires": { 814 | "has": "^1.0.1" 815 | } 816 | }, 817 | "is-symbol": { 818 | "version": "1.0.2", 819 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", 820 | "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", 821 | "dev": true, 822 | "requires": { 823 | "has-symbols": "^1.0.0" 824 | } 825 | }, 826 | "isexe": { 827 | "version": "2.0.0", 828 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 829 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 830 | "dev": true 831 | }, 832 | "js-tokens": { 833 | "version": "4.0.0", 834 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 835 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 836 | "dev": true 837 | }, 838 | "js-yaml": { 839 | "version": "3.13.1", 840 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 841 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 842 | "dev": true, 843 | "requires": { 844 | "argparse": "^1.0.7", 845 | "esprima": "^4.0.0" 846 | } 847 | }, 848 | "json-schema-traverse": { 849 | "version": "0.4.1", 850 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 851 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 852 | "dev": true 853 | }, 854 | "json-stable-stringify-without-jsonify": { 855 | "version": "1.0.1", 856 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 857 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 858 | "dev": true 859 | }, 860 | "levn": { 861 | "version": "0.3.0", 862 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 863 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 864 | "dev": true, 865 | "requires": { 866 | "prelude-ls": "~1.1.2", 867 | "type-check": "~0.3.2" 868 | } 869 | }, 870 | "locate-path": { 871 | "version": "3.0.0", 872 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", 873 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", 874 | "requires": { 875 | "p-locate": "^3.0.0", 876 | "path-exists": "^3.0.0" 877 | } 878 | }, 879 | "lodash": { 880 | "version": "4.17.15", 881 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 882 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", 883 | "dev": true 884 | }, 885 | "lodash.get": { 886 | "version": "4.4.2", 887 | "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", 888 | "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" 889 | }, 890 | "log-symbols": { 891 | "version": "2.2.0", 892 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", 893 | "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", 894 | "dev": true, 895 | "requires": { 896 | "chalk": "^2.0.1" 897 | } 898 | }, 899 | "mimic-fn": { 900 | "version": "2.1.0", 901 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 902 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 903 | "dev": true 904 | }, 905 | "minimatch": { 906 | "version": "3.0.4", 907 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 908 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 909 | "dev": true, 910 | "requires": { 911 | "brace-expansion": "^1.1.7" 912 | } 913 | }, 914 | "minimist": { 915 | "version": "0.0.8", 916 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 917 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 918 | "dev": true 919 | }, 920 | "mkdirp": { 921 | "version": "0.5.1", 922 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 923 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 924 | "dev": true, 925 | "requires": { 926 | "minimist": "0.0.8" 927 | } 928 | }, 929 | "mocha": { 930 | "version": "6.2.2", 931 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.2.tgz", 932 | "integrity": "sha512-FgDS9Re79yU1xz5d+C4rv1G7QagNGHZ+iXF81hO8zY35YZZcLEsJVfFolfsqKFWunATEvNzMK0r/CwWd/szO9A==", 933 | "dev": true, 934 | "requires": { 935 | "ansi-colors": "3.2.3", 936 | "browser-stdout": "1.3.1", 937 | "debug": "3.2.6", 938 | "diff": "3.5.0", 939 | "escape-string-regexp": "1.0.5", 940 | "find-up": "3.0.0", 941 | "glob": "7.1.3", 942 | "growl": "1.10.5", 943 | "he": "1.2.0", 944 | "js-yaml": "3.13.1", 945 | "log-symbols": "2.2.0", 946 | "minimatch": "3.0.4", 947 | "mkdirp": "0.5.1", 948 | "ms": "2.1.1", 949 | "node-environment-flags": "1.0.5", 950 | "object.assign": "4.1.0", 951 | "strip-json-comments": "2.0.1", 952 | "supports-color": "6.0.0", 953 | "which": "1.3.1", 954 | "wide-align": "1.1.3", 955 | "yargs": "13.3.0", 956 | "yargs-parser": "13.1.1", 957 | "yargs-unparser": "1.6.0" 958 | }, 959 | "dependencies": { 960 | "ansi-regex": { 961 | "version": "4.1.0", 962 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 963 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 964 | "dev": true 965 | }, 966 | "cliui": { 967 | "version": "5.0.0", 968 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", 969 | "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", 970 | "dev": true, 971 | "requires": { 972 | "string-width": "^3.1.0", 973 | "strip-ansi": "^5.2.0", 974 | "wrap-ansi": "^5.1.0" 975 | } 976 | }, 977 | "debug": { 978 | "version": "3.2.6", 979 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 980 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 981 | "dev": true, 982 | "requires": { 983 | "ms": "^2.1.1" 984 | } 985 | }, 986 | "emoji-regex": { 987 | "version": "7.0.3", 988 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 989 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 990 | "dev": true 991 | }, 992 | "get-caller-file": { 993 | "version": "2.0.5", 994 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 995 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 996 | "dev": true 997 | }, 998 | "glob": { 999 | "version": "7.1.3", 1000 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 1001 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 1002 | "dev": true, 1003 | "requires": { 1004 | "fs.realpath": "^1.0.0", 1005 | "inflight": "^1.0.4", 1006 | "inherits": "2", 1007 | "minimatch": "^3.0.4", 1008 | "once": "^1.3.0", 1009 | "path-is-absolute": "^1.0.0" 1010 | } 1011 | }, 1012 | "ms": { 1013 | "version": "2.1.1", 1014 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 1015 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", 1016 | "dev": true 1017 | }, 1018 | "require-main-filename": { 1019 | "version": "2.0.0", 1020 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 1021 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", 1022 | "dev": true 1023 | }, 1024 | "string-width": { 1025 | "version": "3.1.0", 1026 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1027 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1028 | "dev": true, 1029 | "requires": { 1030 | "emoji-regex": "^7.0.1", 1031 | "is-fullwidth-code-point": "^2.0.0", 1032 | "strip-ansi": "^5.1.0" 1033 | } 1034 | }, 1035 | "strip-ansi": { 1036 | "version": "5.2.0", 1037 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1038 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1039 | "dev": true, 1040 | "requires": { 1041 | "ansi-regex": "^4.1.0" 1042 | } 1043 | }, 1044 | "strip-json-comments": { 1045 | "version": "2.0.1", 1046 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1047 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 1048 | "dev": true 1049 | }, 1050 | "supports-color": { 1051 | "version": "6.0.0", 1052 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", 1053 | "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", 1054 | "dev": true, 1055 | "requires": { 1056 | "has-flag": "^3.0.0" 1057 | } 1058 | }, 1059 | "which": { 1060 | "version": "1.3.1", 1061 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1062 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1063 | "dev": true, 1064 | "requires": { 1065 | "isexe": "^2.0.0" 1066 | } 1067 | }, 1068 | "wrap-ansi": { 1069 | "version": "5.1.0", 1070 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", 1071 | "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", 1072 | "dev": true, 1073 | "requires": { 1074 | "ansi-styles": "^3.2.0", 1075 | "string-width": "^3.0.0", 1076 | "strip-ansi": "^5.0.0" 1077 | } 1078 | }, 1079 | "yargs": { 1080 | "version": "13.3.0", 1081 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", 1082 | "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", 1083 | "dev": true, 1084 | "requires": { 1085 | "cliui": "^5.0.0", 1086 | "find-up": "^3.0.0", 1087 | "get-caller-file": "^2.0.1", 1088 | "require-directory": "^2.1.1", 1089 | "require-main-filename": "^2.0.0", 1090 | "set-blocking": "^2.0.0", 1091 | "string-width": "^3.0.0", 1092 | "which-module": "^2.0.0", 1093 | "y18n": "^4.0.0", 1094 | "yargs-parser": "^13.1.1" 1095 | } 1096 | }, 1097 | "yargs-parser": { 1098 | "version": "13.1.1", 1099 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", 1100 | "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", 1101 | "dev": true, 1102 | "requires": { 1103 | "camelcase": "^5.0.0", 1104 | "decamelize": "^1.2.0" 1105 | } 1106 | } 1107 | } 1108 | }, 1109 | "ms": { 1110 | "version": "2.1.2", 1111 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1112 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1113 | }, 1114 | "mute-stream": { 1115 | "version": "0.0.8", 1116 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", 1117 | "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", 1118 | "dev": true 1119 | }, 1120 | "natural-compare": { 1121 | "version": "1.4.0", 1122 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1123 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 1124 | "dev": true 1125 | }, 1126 | "nice-try": { 1127 | "version": "1.0.5", 1128 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 1129 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", 1130 | "dev": true 1131 | }, 1132 | "node-environment-flags": { 1133 | "version": "1.0.5", 1134 | "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", 1135 | "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", 1136 | "dev": true, 1137 | "requires": { 1138 | "object.getownpropertydescriptors": "^2.0.3", 1139 | "semver": "^5.7.0" 1140 | }, 1141 | "dependencies": { 1142 | "semver": { 1143 | "version": "5.7.1", 1144 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1145 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 1146 | "dev": true 1147 | } 1148 | } 1149 | }, 1150 | "object-inspect": { 1151 | "version": "1.6.0", 1152 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", 1153 | "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", 1154 | "dev": true 1155 | }, 1156 | "object-keys": { 1157 | "version": "1.1.1", 1158 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1159 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 1160 | "dev": true 1161 | }, 1162 | "object.assign": { 1163 | "version": "4.1.0", 1164 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", 1165 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", 1166 | "dev": true, 1167 | "requires": { 1168 | "define-properties": "^1.1.2", 1169 | "function-bind": "^1.1.1", 1170 | "has-symbols": "^1.0.0", 1171 | "object-keys": "^1.0.11" 1172 | } 1173 | }, 1174 | "object.getownpropertydescriptors": { 1175 | "version": "2.0.3", 1176 | "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", 1177 | "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", 1178 | "dev": true, 1179 | "requires": { 1180 | "define-properties": "^1.1.2", 1181 | "es-abstract": "^1.5.1" 1182 | } 1183 | }, 1184 | "once": { 1185 | "version": "1.4.0", 1186 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1187 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1188 | "dev": true, 1189 | "requires": { 1190 | "wrappy": "1" 1191 | } 1192 | }, 1193 | "onetime": { 1194 | "version": "5.1.0", 1195 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", 1196 | "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", 1197 | "dev": true, 1198 | "requires": { 1199 | "mimic-fn": "^2.1.0" 1200 | } 1201 | }, 1202 | "optionator": { 1203 | "version": "0.8.3", 1204 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", 1205 | "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", 1206 | "dev": true, 1207 | "requires": { 1208 | "deep-is": "~0.1.3", 1209 | "fast-levenshtein": "~2.0.6", 1210 | "levn": "~0.3.0", 1211 | "prelude-ls": "~1.1.2", 1212 | "type-check": "~0.3.2", 1213 | "word-wrap": "~1.2.3" 1214 | } 1215 | }, 1216 | "os-tmpdir": { 1217 | "version": "1.0.2", 1218 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1219 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 1220 | "dev": true 1221 | }, 1222 | "p-limit": { 1223 | "version": "2.2.1", 1224 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", 1225 | "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", 1226 | "requires": { 1227 | "p-try": "^2.0.0" 1228 | } 1229 | }, 1230 | "p-locate": { 1231 | "version": "3.0.0", 1232 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", 1233 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", 1234 | "requires": { 1235 | "p-limit": "^2.0.0" 1236 | } 1237 | }, 1238 | "p-try": { 1239 | "version": "2.2.0", 1240 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 1241 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" 1242 | }, 1243 | "parent-module": { 1244 | "version": "1.0.1", 1245 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1246 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1247 | "dev": true, 1248 | "requires": { 1249 | "callsites": "^3.0.0" 1250 | } 1251 | }, 1252 | "path-exists": { 1253 | "version": "3.0.0", 1254 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 1255 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" 1256 | }, 1257 | "path-is-absolute": { 1258 | "version": "1.0.1", 1259 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1260 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1261 | "dev": true 1262 | }, 1263 | "path-key": { 1264 | "version": "2.0.1", 1265 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 1266 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 1267 | "dev": true 1268 | }, 1269 | "pathval": { 1270 | "version": "1.1.0", 1271 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", 1272 | "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", 1273 | "dev": true 1274 | }, 1275 | "prelude-ls": { 1276 | "version": "1.1.2", 1277 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 1278 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 1279 | "dev": true 1280 | }, 1281 | "progress": { 1282 | "version": "2.0.3", 1283 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 1284 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 1285 | "dev": true 1286 | }, 1287 | "punycode": { 1288 | "version": "2.1.1", 1289 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1290 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 1291 | "dev": true 1292 | }, 1293 | "regexpp": { 1294 | "version": "2.0.1", 1295 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", 1296 | "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", 1297 | "dev": true 1298 | }, 1299 | "require-directory": { 1300 | "version": "2.1.1", 1301 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1302 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" 1303 | }, 1304 | "require-main-filename": { 1305 | "version": "2.0.0", 1306 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 1307 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" 1308 | }, 1309 | "resolve-from": { 1310 | "version": "4.0.0", 1311 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1312 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1313 | "dev": true 1314 | }, 1315 | "restore-cursor": { 1316 | "version": "3.1.0", 1317 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", 1318 | "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", 1319 | "dev": true, 1320 | "requires": { 1321 | "onetime": "^5.1.0", 1322 | "signal-exit": "^3.0.2" 1323 | } 1324 | }, 1325 | "rimraf": { 1326 | "version": "2.6.3", 1327 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 1328 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 1329 | "dev": true, 1330 | "requires": { 1331 | "glob": "^7.1.3" 1332 | } 1333 | }, 1334 | "run-async": { 1335 | "version": "2.3.0", 1336 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", 1337 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", 1338 | "dev": true, 1339 | "requires": { 1340 | "is-promise": "^2.1.0" 1341 | } 1342 | }, 1343 | "rxjs": { 1344 | "version": "6.5.3", 1345 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", 1346 | "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", 1347 | "dev": true, 1348 | "requires": { 1349 | "tslib": "^1.9.0" 1350 | } 1351 | }, 1352 | "safer-buffer": { 1353 | "version": "2.1.2", 1354 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1355 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1356 | "dev": true 1357 | }, 1358 | "semver": { 1359 | "version": "6.3.0", 1360 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1361 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" 1362 | }, 1363 | "set-blocking": { 1364 | "version": "2.0.0", 1365 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 1366 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" 1367 | }, 1368 | "shebang-command": { 1369 | "version": "1.2.0", 1370 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 1371 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 1372 | "dev": true, 1373 | "requires": { 1374 | "shebang-regex": "^1.0.0" 1375 | } 1376 | }, 1377 | "shebang-regex": { 1378 | "version": "1.0.0", 1379 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 1380 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 1381 | "dev": true 1382 | }, 1383 | "signal-exit": { 1384 | "version": "3.0.2", 1385 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 1386 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 1387 | "dev": true 1388 | }, 1389 | "slice-ansi": { 1390 | "version": "2.1.0", 1391 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", 1392 | "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", 1393 | "dev": true, 1394 | "requires": { 1395 | "ansi-styles": "^3.2.0", 1396 | "astral-regex": "^1.0.0", 1397 | "is-fullwidth-code-point": "^2.0.0" 1398 | } 1399 | }, 1400 | "sprintf-js": { 1401 | "version": "1.0.3", 1402 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1403 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1404 | "dev": true 1405 | }, 1406 | "string-width": { 1407 | "version": "2.1.0", 1408 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.0.tgz", 1409 | "integrity": "sha1-AwZkVh/BRslCPsfZeP4kV0N/5tA=", 1410 | "dev": true, 1411 | "requires": { 1412 | "is-fullwidth-code-point": "^2.0.0", 1413 | "strip-ansi": "^4.0.0" 1414 | }, 1415 | "dependencies": { 1416 | "ansi-regex": { 1417 | "version": "3.0.0", 1418 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 1419 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 1420 | "dev": true 1421 | }, 1422 | "strip-ansi": { 1423 | "version": "4.0.0", 1424 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1425 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1426 | "dev": true, 1427 | "requires": { 1428 | "ansi-regex": "^3.0.0" 1429 | } 1430 | } 1431 | } 1432 | }, 1433 | "string.prototype.trimleft": { 1434 | "version": "2.1.0", 1435 | "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", 1436 | "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", 1437 | "dev": true, 1438 | "requires": { 1439 | "define-properties": "^1.1.3", 1440 | "function-bind": "^1.1.1" 1441 | } 1442 | }, 1443 | "string.prototype.trimright": { 1444 | "version": "2.1.0", 1445 | "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", 1446 | "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", 1447 | "dev": true, 1448 | "requires": { 1449 | "define-properties": "^1.1.3", 1450 | "function-bind": "^1.1.1" 1451 | } 1452 | }, 1453 | "strip-ansi": { 1454 | "version": "5.2.0", 1455 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1456 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1457 | "requires": { 1458 | "ansi-regex": "^4.1.0" 1459 | } 1460 | }, 1461 | "strip-json-comments": { 1462 | "version": "3.0.1", 1463 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", 1464 | "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", 1465 | "dev": true 1466 | }, 1467 | "supports-color": { 1468 | "version": "5.5.0", 1469 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1470 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1471 | "dev": true, 1472 | "requires": { 1473 | "has-flag": "^3.0.0" 1474 | } 1475 | }, 1476 | "table": { 1477 | "version": "5.4.6", 1478 | "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", 1479 | "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", 1480 | "dev": true, 1481 | "requires": { 1482 | "ajv": "^6.10.2", 1483 | "lodash": "^4.17.14", 1484 | "slice-ansi": "^2.1.0", 1485 | "string-width": "^3.0.0" 1486 | }, 1487 | "dependencies": { 1488 | "ansi-regex": { 1489 | "version": "4.1.0", 1490 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1491 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 1492 | "dev": true 1493 | }, 1494 | "emoji-regex": { 1495 | "version": "7.0.3", 1496 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 1497 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 1498 | "dev": true 1499 | }, 1500 | "string-width": { 1501 | "version": "3.1.0", 1502 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1503 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1504 | "dev": true, 1505 | "requires": { 1506 | "emoji-regex": "^7.0.1", 1507 | "is-fullwidth-code-point": "^2.0.0", 1508 | "strip-ansi": "^5.1.0" 1509 | } 1510 | }, 1511 | "strip-ansi": { 1512 | "version": "5.2.0", 1513 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1514 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1515 | "dev": true, 1516 | "requires": { 1517 | "ansi-regex": "^4.1.0" 1518 | } 1519 | } 1520 | } 1521 | }, 1522 | "text-table": { 1523 | "version": "0.2.0", 1524 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1525 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 1526 | "dev": true 1527 | }, 1528 | "through": { 1529 | "version": "2.3.8", 1530 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1531 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1532 | "dev": true 1533 | }, 1534 | "tmp": { 1535 | "version": "0.0.33", 1536 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 1537 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 1538 | "dev": true, 1539 | "requires": { 1540 | "os-tmpdir": "~1.0.2" 1541 | } 1542 | }, 1543 | "tslib": { 1544 | "version": "1.10.0", 1545 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", 1546 | "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", 1547 | "dev": true 1548 | }, 1549 | "type-check": { 1550 | "version": "0.3.2", 1551 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 1552 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 1553 | "dev": true, 1554 | "requires": { 1555 | "prelude-ls": "~1.1.2" 1556 | } 1557 | }, 1558 | "type-detect": { 1559 | "version": "4.0.8", 1560 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", 1561 | "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", 1562 | "dev": true 1563 | }, 1564 | "type-fest": { 1565 | "version": "0.5.2", 1566 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz", 1567 | "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==", 1568 | "dev": true 1569 | }, 1570 | "uri-js": { 1571 | "version": "4.2.2", 1572 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 1573 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 1574 | "dev": true, 1575 | "requires": { 1576 | "punycode": "^2.1.0" 1577 | } 1578 | }, 1579 | "v8-compile-cache": { 1580 | "version": "2.1.0", 1581 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", 1582 | "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", 1583 | "dev": true 1584 | }, 1585 | "which": { 1586 | "version": "1.3.0", 1587 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", 1588 | "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", 1589 | "dev": true, 1590 | "requires": { 1591 | "isexe": "^2.0.0" 1592 | } 1593 | }, 1594 | "which-module": { 1595 | "version": "2.0.0", 1596 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 1597 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" 1598 | }, 1599 | "wide-align": { 1600 | "version": "1.1.3", 1601 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 1602 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", 1603 | "dev": true, 1604 | "requires": { 1605 | "string-width": "^1.0.2 || 2" 1606 | } 1607 | }, 1608 | "word-wrap": { 1609 | "version": "1.2.3", 1610 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 1611 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 1612 | "dev": true 1613 | }, 1614 | "wrap-ansi": { 1615 | "version": "5.1.0", 1616 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", 1617 | "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", 1618 | "requires": { 1619 | "ansi-styles": "^3.2.0", 1620 | "string-width": "^3.0.0", 1621 | "strip-ansi": "^5.0.0" 1622 | }, 1623 | "dependencies": { 1624 | "emoji-regex": { 1625 | "version": "7.0.3", 1626 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 1627 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" 1628 | }, 1629 | "string-width": { 1630 | "version": "3.1.0", 1631 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1632 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1633 | "requires": { 1634 | "emoji-regex": "^7.0.1", 1635 | "is-fullwidth-code-point": "^2.0.0", 1636 | "strip-ansi": "^5.1.0" 1637 | } 1638 | } 1639 | } 1640 | }, 1641 | "wrappy": { 1642 | "version": "1.0.2", 1643 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1644 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1645 | "dev": true 1646 | }, 1647 | "write": { 1648 | "version": "1.0.3", 1649 | "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", 1650 | "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", 1651 | "dev": true, 1652 | "requires": { 1653 | "mkdirp": "^0.5.1" 1654 | } 1655 | }, 1656 | "y18n": { 1657 | "version": "4.0.0", 1658 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", 1659 | "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" 1660 | }, 1661 | "yargs": { 1662 | "version": "14.2.0", 1663 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.0.tgz", 1664 | "integrity": "sha512-/is78VKbKs70bVZH7w4YaZea6xcJWOAwkhbR0CFuZBmYtfTYF0xjGJF43AYd8g2Uii1yJwmS5GR2vBmrc32sbg==", 1665 | "requires": { 1666 | "cliui": "^5.0.0", 1667 | "decamelize": "^1.2.0", 1668 | "find-up": "^3.0.0", 1669 | "get-caller-file": "^2.0.1", 1670 | "require-directory": "^2.1.1", 1671 | "require-main-filename": "^2.0.0", 1672 | "set-blocking": "^2.0.0", 1673 | "string-width": "^3.0.0", 1674 | "which-module": "^2.0.0", 1675 | "y18n": "^4.0.0", 1676 | "yargs-parser": "^15.0.0" 1677 | }, 1678 | "dependencies": { 1679 | "emoji-regex": { 1680 | "version": "7.0.3", 1681 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 1682 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" 1683 | }, 1684 | "string-width": { 1685 | "version": "3.1.0", 1686 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1687 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1688 | "requires": { 1689 | "emoji-regex": "^7.0.1", 1690 | "is-fullwidth-code-point": "^2.0.0", 1691 | "strip-ansi": "^5.1.0" 1692 | } 1693 | } 1694 | } 1695 | }, 1696 | "yargs-parser": { 1697 | "version": "15.0.0", 1698 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.0.tgz", 1699 | "integrity": "sha512-xLTUnCMc4JhxrPEPUYD5IBR1mWCK/aT6+RJ/K29JY2y1vD+FhtgKK0AXRWvI262q3QSffAQuTouFIKUuHX89wQ==", 1700 | "requires": { 1701 | "camelcase": "^5.0.0", 1702 | "decamelize": "^1.2.0" 1703 | } 1704 | }, 1705 | "yargs-unparser": { 1706 | "version": "1.6.0", 1707 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", 1708 | "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", 1709 | "dev": true, 1710 | "requires": { 1711 | "flat": "^4.1.0", 1712 | "lodash": "^4.17.15", 1713 | "yargs": "^13.3.0" 1714 | }, 1715 | "dependencies": { 1716 | "ansi-regex": { 1717 | "version": "4.1.0", 1718 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1719 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 1720 | "dev": true 1721 | }, 1722 | "cliui": { 1723 | "version": "5.0.0", 1724 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", 1725 | "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", 1726 | "dev": true, 1727 | "requires": { 1728 | "string-width": "^3.1.0", 1729 | "strip-ansi": "^5.2.0", 1730 | "wrap-ansi": "^5.1.0" 1731 | } 1732 | }, 1733 | "emoji-regex": { 1734 | "version": "7.0.3", 1735 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 1736 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 1737 | "dev": true 1738 | }, 1739 | "get-caller-file": { 1740 | "version": "2.0.5", 1741 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 1742 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 1743 | "dev": true 1744 | }, 1745 | "require-main-filename": { 1746 | "version": "2.0.0", 1747 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 1748 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", 1749 | "dev": true 1750 | }, 1751 | "string-width": { 1752 | "version": "3.1.0", 1753 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1754 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1755 | "dev": true, 1756 | "requires": { 1757 | "emoji-regex": "^7.0.1", 1758 | "is-fullwidth-code-point": "^2.0.0", 1759 | "strip-ansi": "^5.1.0" 1760 | } 1761 | }, 1762 | "strip-ansi": { 1763 | "version": "5.2.0", 1764 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1765 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1766 | "dev": true, 1767 | "requires": { 1768 | "ansi-regex": "^4.1.0" 1769 | } 1770 | }, 1771 | "wrap-ansi": { 1772 | "version": "5.1.0", 1773 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", 1774 | "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", 1775 | "dev": true, 1776 | "requires": { 1777 | "ansi-styles": "^3.2.0", 1778 | "string-width": "^3.0.0", 1779 | "strip-ansi": "^5.0.0" 1780 | } 1781 | }, 1782 | "yargs": { 1783 | "version": "13.3.0", 1784 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", 1785 | "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", 1786 | "dev": true, 1787 | "requires": { 1788 | "cliui": "^5.0.0", 1789 | "find-up": "^3.0.0", 1790 | "get-caller-file": "^2.0.1", 1791 | "require-directory": "^2.1.1", 1792 | "require-main-filename": "^2.0.0", 1793 | "set-blocking": "^2.0.0", 1794 | "string-width": "^3.0.0", 1795 | "which-module": "^2.0.0", 1796 | "y18n": "^4.0.0", 1797 | "yargs-parser": "^13.1.1" 1798 | } 1799 | }, 1800 | "yargs-parser": { 1801 | "version": "13.1.1", 1802 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", 1803 | "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", 1804 | "dev": true, 1805 | "requires": { 1806 | "camelcase": "^5.0.0", 1807 | "decamelize": "^1.2.0" 1808 | } 1809 | } 1810 | } 1811 | } 1812 | } 1813 | } 1814 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pk", 3 | "version": "1.1.0", 4 | "private": false, 5 | "description": "A tiny utility to extract info from package.json", 6 | "main": "index.js", 7 | "scripts": { 8 | "lint": "eslint .", 9 | "#pretest": "npm run lint", 10 | "test": "mocha", 11 | "preversion": "npm t", 12 | "postversion": "git push --tags", 13 | "postpublish": "git push" 14 | }, 15 | "bin": { 16 | "pk": "bin/pk.js" 17 | }, 18 | "repository": { 19 | "type": "git", 20 | "url": "git+https://github.com/userpixel/pk.git" 21 | }, 22 | "keywords": [ 23 | "package.json", 24 | "shell", 25 | "npm", 26 | "script" 27 | ], 28 | "author": "userpixel", 29 | "license": "MIT", 30 | "licinse": "MIT", 31 | "licanse": "MIT", 32 | "bugs": { 33 | "url": "https://github.com/userpixel/pk/issues" 34 | }, 35 | "homepage": "https://github.com/userpixel/pk#readme", 36 | "dependencies": { 37 | "debug": "^4.1.1", 38 | "didyoumean": "^1.2.1", 39 | "lodash.get": "^4.4.2", 40 | "semver": "^6.3.0", 41 | "yargs": "^14.2.0" 42 | }, 43 | "devDependencies": { 44 | "chai": "^4.2.0", 45 | "eslint": "^6.6.0", 46 | "mocha": "^6.2.2" 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /test/cases/all-types.json: -------------------------------------------------------------------------------- 1 | { 2 | "str": "hello", 3 | "num": 2, 4 | "arr": [ "zero", "one", "two"], 5 | "bool": true, 6 | "obj": { 7 | "a": "foo", 8 | "b": "bar" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /test/cases/can-parse-version.txt: -------------------------------------------------------------------------------- 1 | can parse a semver version 2 | -s version 3 | major 4 4 | minor 3 5 | patch 2 6 | build ["build1000"] 7 | prerelease ["beta",2] 8 | -------------------------------------------------------------------------------- /test/cases/completion-path.txt: -------------------------------------------------------------------------------- 1 | generates path completion for a sample string 2 | pk --get-yargs-completions sc 3 | scripts 4 | scripts.build 5 | scripts.start 6 | scripts.build:dev 7 | -------------------------------------------------------------------------------- /test/cases/completion.txt: -------------------------------------------------------------------------------- 1 | generates path completion even without a path 2 | pk --get-yargs-completions 3 | name 4 | license 5 | scripts 6 | version 7 | dependencies 8 | scripts.build 9 | scripts.start 10 | devDependencies 11 | scripts.build:dev 12 | devDependencies.mocha 13 | dependencies.micromustache 14 | -------------------------------------------------------------------------------- /test/cases/empty-arr.json: -------------------------------------------------------------------------------- 1 | { 2 | "arr": [] 3 | } -------------------------------------------------------------------------------- /test/cases/empty-obj.json: -------------------------------------------------------------------------------- 1 | { 2 | "obj": {} 3 | } -------------------------------------------------------------------------------- /test/cases/get-arr-item.txt: -------------------------------------------------------------------------------- 1 | gets a specific item from an array 2 | arr[2] -i all-types.json 3 | two 4 | -------------------------------------------------------------------------------- /test/cases/get-arr.txt: -------------------------------------------------------------------------------- 1 | gets an array property 2 | arr -i all-types.json 3 | zero 4 | one 5 | two 6 | -------------------------------------------------------------------------------- /test/cases/get-bool.txt: -------------------------------------------------------------------------------- 1 | gets a boolean property 2 | bool -i all-types.json 3 | true 4 | -------------------------------------------------------------------------------- /test/cases/get-count-arr-empty.txt: -------------------------------------------------------------------------------- 1 | works even when counting an empty array 2 | arr -i empty-arr.json -c 3 | 0 4 | -------------------------------------------------------------------------------- /test/cases/get-count-arr.txt: -------------------------------------------------------------------------------- 1 | counts the number of elements in an array 2 | arr -c -i all-types.json 3 | 3 4 | -------------------------------------------------------------------------------- /test/cases/get-count-obj-empty.txt: -------------------------------------------------------------------------------- 1 | works even when counting number of keys in an empty object 2 | obj -i empty-obj.json -c 3 | 0 4 | -------------------------------------------------------------------------------- /test/cases/get-count-obj.txt: -------------------------------------------------------------------------------- 1 | counting an object gives the number of its keys 2 | obj -i all-types.json -c 3 | 2 4 | -------------------------------------------------------------------------------- /test/cases/get-nested-obj.txt: -------------------------------------------------------------------------------- 1 | get a nested object 2 | a.b.c -i nested-obj.json 3 | value 4 | -------------------------------------------------------------------------------- /test/cases/get-num.txt: -------------------------------------------------------------------------------- 1 | gets a numerical property 2 | num -i all-types.json 3 | 2 4 | -------------------------------------------------------------------------------- /test/cases/get-obj.txt: -------------------------------------------------------------------------------- 1 | gets an object 2 | obj -i all-types.json -kv 3 | a foo 4 | b bar 5 | -------------------------------------------------------------------------------- /test/cases/get-relative-path.txt: -------------------------------------------------------------------------------- 1 | can get from a package.json in another path 2 | name -i ../../package.json 3 | pk 4 | -------------------------------------------------------------------------------- /test/cases/get-str.txt: -------------------------------------------------------------------------------- 1 | gets a string property 2 | str -i all-types.json 3 | hello 4 | -------------------------------------------------------------------------------- /test/cases/name.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "some test" 3 | } -------------------------------------------------------------------------------- /test/cases/nested-obj.json: -------------------------------------------------------------------------------- 1 | { 2 | "a": { 3 | "b": { 4 | "c": "value" 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /test/cases/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sample-package-json", 3 | "version": "4.3.2-beta.2+build1000", 4 | "dependencies": { 5 | "micromustache": "*" 6 | }, 7 | "devDependencies": { 8 | "mocha": "^3.2" 9 | }, 10 | "scripts": { 11 | "build": "babel .", 12 | "build:dev": "webpack --watch", 13 | "start": "node server.js --port 4000" 14 | }, 15 | "license": "MIT" 16 | } 17 | -------------------------------------------------------------------------------- /test/cases/using-local-package.txt: -------------------------------------------------------------------------------- 1 | gets the data from the local package.json 2 | name 3 | sample-package-json 4 | -------------------------------------------------------------------------------- /test/cli.test.js: -------------------------------------------------------------------------------- 1 | const assert = require('assert'); 2 | const fs = require('fs'); 3 | const { join, extname } = require('path'); 4 | const { promisify } = require('util'); 5 | const { exec } = require('child_process'); 6 | const { expect } = require('chai'); 7 | 8 | const readFile = promisify(fs.readFile); 9 | 10 | function relPath(...parts) { 11 | return join(__dirname, ...parts); 12 | } 13 | 14 | function runCli(args) { 15 | return new Promise(resolve => { 16 | exec(`${relPath('../bin/pk.js')} ${args}`, { 17 | cwd: relPath('cases'), 18 | timeout: 2000, //msec 19 | }, (error, stdout, stderr) => { 20 | assert.ifError(error); 21 | if (stderr) { 22 | assert.fail(`Something was printed to standard output: ${stderr}`); 23 | } 24 | resolve(stdout); 25 | }); 26 | }); 27 | } 28 | 29 | async function readTestCase(fileName) { 30 | const testCase = await readFile(relPath('cases', fileName), 'utf8'); 31 | const testCaseLines = testCase.split('\n'); 32 | assert.ok(testCaseLines.length >= 3, `test case should contain description, params and expected output ${testCase}`); 33 | const [ desc, args, ...output ] = testCaseLines; 34 | return { 35 | desc, 36 | args, 37 | expectedOutput: output.join('\n') 38 | }; 39 | } 40 | 41 | describe('cli', () => { 42 | fs.readdirSync(relPath('cases')) 43 | .filter(fileName => extname(fileName) === '.txt') 44 | .forEach((fileName) => { 45 | 46 | it(fileName, async () => { 47 | const { args, expectedOutput } = await readTestCase(fileName); 48 | const output = await runCli(args) 49 | expect(output).to.equal(expectedOutput); 50 | }); 51 | 52 | }); 53 | }); 54 | --------------------------------------------------------------------------------