├── .gitignore ├── .github └── preview │ └── showcase.gif ├── src ├── keshi.config.js ├── index.js ├── config.js ├── taskrunner.js └── presets.js ├── package.json ├── presets └── laravel-development.json ├── LICENSE.md ├── README.md └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | yarn-error.log -------------------------------------------------------------------------------- /.github/preview/showcase.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rexlManu/keshi-cli/HEAD/.github/preview/showcase.gif -------------------------------------------------------------------------------- /src/keshi.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | preset: '', 3 | tasks: { 4 | laravel: 'php artisan serve', 5 | vue: 'yarn dev', 6 | }, 7 | }; 8 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "keshi-cli", 3 | "version": "1.1.1", 4 | "type": "module", 5 | "bin": { 6 | "keshi": "./src/index.js" 7 | }, 8 | "license": "MIT", 9 | "dependencies": { 10 | "chalk": "^5.0.0", 11 | "find-up": "^6.3.0", 12 | "inquirer": "^8.2.0", 13 | "yargs": "^17.3.1" 14 | }, 15 | "author": { 16 | "name": "Emmanuel Lampe", 17 | "email": "mail@emmanuel-lampe.de", 18 | "url": "https://github.com/rexlManu" 19 | }, 20 | "description": "A simple CLI for running commands concurrently" 21 | } 22 | -------------------------------------------------------------------------------- /presets/laravel-development.json: -------------------------------------------------------------------------------- 1 | { 2 | "presets": { 3 | "basic": { 4 | "name": "basic", 5 | "tasks": { 6 | "backend": "php artisan serve", 7 | "frontend": "yarn dev" 8 | } 9 | }, 10 | "extended": { 11 | "name": "extended", 12 | "tasks": { 13 | "backend": "php artisan serve", 14 | "frontend": "yarn dev", 15 | "queue": "php artisan queue:listen" 16 | } 17 | }, 18 | "additional": { 19 | "name": "additional", 20 | "tasks": { 21 | "backend": "php artisan serve", 22 | "frontend": "yarn dev", 23 | "queue": "php artisan queue:listen", 24 | "soketi": "soketi start" 25 | } 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Copyright (c) 2022 Emmanuel Lampe 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 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import yargs from 'yargs'; 4 | import { hideBin } from 'yargs/helpers'; 5 | import { run } from './taskrunner.js'; 6 | import loadConfig, { createDefaultConfig } from './config.js'; 7 | import { createPreset, listPresets, deletePreset } from './presets.js'; 8 | 9 | const config = await loadConfig(); 10 | 11 | yargs(hideBin(process.argv)) 12 | .command( 13 | '$0', 14 | 'Start tasks concurrently', 15 | () => {}, 16 | (argv) => run(argv, config), 17 | ) 18 | .command('init', 'create default config file', () => {}, createDefaultConfig) 19 | .command('create', 'create a new preset', () => {}, createPreset) 20 | .command('list', 'list available presets', () => {}, listPresets) 21 | .command( 22 | 'delete ', 23 | 'delete a preset', 24 | (yargs) => { 25 | return yargs.positional('name', { 26 | describe: 'name of the preset to delete', 27 | }); 28 | }, 29 | deletePreset, 30 | ) 31 | .option('preset', { 32 | alias: 'p', 33 | describe: 'name of the preset to use', 34 | type: 'string', 35 | }) 36 | .parse(); 37 | -------------------------------------------------------------------------------- /src/config.js: -------------------------------------------------------------------------------- 1 | import path from 'path'; 2 | import fs from 'fs'; 3 | import chalk from 'chalk'; 4 | import defaultConfig from './keshi.config.js'; 5 | 6 | const CONFIG_FILE_NAME = 'keshi.config.js'; 7 | 8 | export default async function () { 9 | const cwd = process.cwd(); 10 | // check if a windvel.config.js file exists 11 | const configFile = path.join(cwd, CONFIG_FILE_NAME); 12 | if (fs.existsSync(configFile)) { 13 | // check if on windows 14 | const filePrefix = process.platform === 'win32' ? 'file://' : ''; 15 | const module = (await import(`${filePrefix}${configFile}`)).default; 16 | return { ...defaultConfig, ...module }; 17 | } 18 | // else { 19 | // console.log(chalk.yellow('Using default config.')); 20 | // console.log( 21 | // chalk.yellow('No keshi.config.js file found in the current directory.'), 22 | // ); 23 | // } 24 | return defaultConfig; 25 | } 26 | 27 | export async function createDefaultConfig() { 28 | const cwd = process.cwd(); 29 | const configFile = path.join(cwd, CONFIG_FILE_NAME); 30 | if (fs.existsSync(configFile)) { 31 | console.log(chalk.yellow('keshi.config.js already exists.')); 32 | return; 33 | } 34 | const defaultConfigFile = new URL(CONFIG_FILE_NAME, import.meta.url); 35 | fs.writeFileSync(configFile, fs.readFileSync(defaultConfigFile, 'utf8')); 36 | console.log(chalk.green(`Created ${CONFIG_FILE_NAME}`)); 37 | } 38 | -------------------------------------------------------------------------------- /src/taskrunner.js: -------------------------------------------------------------------------------- 1 | import { spawn } from 'child_process'; 2 | import chalk from 'chalk'; 3 | import { preset as loadPreset } from './presets.js'; 4 | 5 | const runningTasks = []; 6 | 7 | export async function run(argv, config) { 8 | const preset = argv.preset 9 | ? loadPreset(argv.preset) 10 | : config.preset && config.preset != '' 11 | ? loadPreset(config.preset) 12 | : config; 13 | 14 | if (!preset) { 15 | return; 16 | } 17 | 18 | // check if tasks are empty 19 | if (preset.tasks.length === 0) { 20 | console.log(chalk.red('No tasks found in keshi.config.js')); 21 | process.exit(1); 22 | } 23 | // print tasks 24 | console.log(chalk.green(`Tasks: ${Object.values(preset.tasks).join(', ')}`)); 25 | 26 | // spawn a new process for each task and add them to the runningTasks array 27 | Object.keys(preset.tasks).forEach((taskName) => { 28 | const task = preset.tasks[taskName]; 29 | const taskProcess = spawn(task, { 30 | shell: true, 31 | }); 32 | console.log(chalk.green(`Spawned task: ${taskName} (${task})`)); 33 | const prefix = chalk.white(`[${chalk.cyan(taskName)}] `); 34 | runningTasks.push(taskProcess); 35 | // log the task output 36 | taskProcess.stdout.on('data', (data) => { 37 | // split data at newlines 38 | const lines = data.toString().split('\n'); 39 | lines.forEach((line) => { 40 | console.log(prefix + line); 41 | }); 42 | }); 43 | taskProcess.stderr.on('data', (data) => { 44 | // split data at newlines 45 | const lines = data.toString().split('\n'); 46 | lines.forEach((line) => { 47 | console.log(prefix + chalk.red(line)); 48 | }); 49 | }); 50 | 51 | // when a task ends, remove it from the runningTasks array 52 | taskProcess.on('exit', () => { 53 | const index = runningTasks.indexOf(taskProcess); 54 | if (index > -1) { 55 | runningTasks.splice(index, 1); 56 | } 57 | console.log(chalk.green(`Task ${taskName} ended`)); 58 | }); 59 | }); 60 | 61 | // when the process gets terminated, kill all running tasks 62 | process.on('SIGINT', () => { 63 | console.log(chalk.red('\nTerminating all running tasks...')); 64 | runningTasks.forEach((task) => { 65 | task.kill('SIGINT'); 66 | }); 67 | process.exit(1); 68 | }); 69 | } 70 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # keshi 2 | 3 | NPM version 4 | NPM downloads 5 | 6 | A simple CLI for running commands concurrently. 7 | 8 | Made for laravel but works with everything. 9 | 10 | 11 | 12 | ## Installation 13 | 14 | `yarn global add keshi-cli` 15 | 16 | `npm install keshi-cli --global` 17 | 18 | ## Usage 19 | 20 | To start everything, you just need to run the command `keshi`. 21 | 22 | Keshi will then search for a `keshi.default.js` with tasks, if it doesn't exist, the default built in commands will be used. 23 | 24 | ### Commands 25 | 26 | `keshi` - Start all tasks concurrently 27 | 28 | `keshi -p ` - Start all tasks from the preset 29 | 30 | `keshi init` - Create the default config file 31 | 32 | `keshi create` - Create a new preset 33 | 34 | `keshi list` - List available presets 35 | 36 | `keshi delete ` - Delete a preset 37 | 38 | `keshi --help` 39 | 40 | `keshi --version` 41 | 42 | ### Config 43 | 44 | The default looks like this if you generate it with `keshi init`. 45 | 46 | ```js 47 | module.exports = { 48 | preset: '', 49 | tasks: { 50 | laravel: 'php artisan serve', 51 | vue: 'yarn dev', 52 | }, 53 | }; 54 | ``` 55 | 56 | You can set 'preset' to one of your presets 57 | 58 | ## Presets 59 | 60 | Your presets are saved in your user home directory under `.keshirc` or `.keshirc.json`. 61 | 62 | ### Premade presets 63 | 64 | Premade presets for certain development environments. 65 | 66 | #### Laravel 67 | 68 | You can find premade presets for laravel development [here](./presets/laravel-development.json). 69 | 70 | ## Goal 71 | 72 | I originally developed this tool for the purpose, so that I don't have to open multiple terminals at once when programming Laravel apps with VueJS. 73 | 74 | ## Security 75 | 76 | If you discover any security related issues, please email mail@emmanuel-lampe.de instead of using the issue tracker. 77 | 78 | ## Credits 79 | 80 | - [Emmanuel Lampe](https://github.com/rexlmanu) 81 | - [All Contributors](../../contributors) 82 | 83 | ## License 84 | 85 | The MIT License (MIT). Please see [License File](LICENSE.md) for more information. 86 | -------------------------------------------------------------------------------- /src/presets.js: -------------------------------------------------------------------------------- 1 | import path from 'path'; 2 | import fs from 'fs'; 3 | import chalk from 'chalk'; 4 | import inquirer from 'inquirer'; 5 | import { findUp } from 'find-up'; 6 | 7 | const configPath = await findUp(['.keshirc', '.keshirc.json']); 8 | const config = configPath ? JSON.parse(fs.readFileSync(configPath)) : {}; 9 | 10 | const saveConfig = () => { 11 | fs.writeFileSync( 12 | configPath ?? 13 | path.join(process.env.HOME ?? process.env.USERPROFILE ?? '', '.keshirc'), 14 | JSON.stringify(config, null, 2), 15 | ); 16 | }; 17 | 18 | export const createPreset = async () => { 19 | const name = ( 20 | await inquirer.prompt([ 21 | { 22 | type: 'input', 23 | name: 'name', 24 | message: 'What is the name of the preset?', 25 | }, 26 | ]) 27 | ).name; 28 | 29 | // check if name is already taken 30 | if (config.presets && config.presets[name]) { 31 | console.log(chalk.red(`Preset ${name} already exists`)); 32 | return; 33 | } 34 | 35 | const tasks = {}; 36 | while (true) { 37 | const { taskName, task } = await inquirer.prompt([ 38 | { 39 | type: 'input', 40 | name: 'taskName', 41 | message: 'What is the name of the task? (leave empty to stop)', 42 | }, 43 | { 44 | type: 'input', 45 | name: 'task', 46 | message: 'What task would you like to run? (leave empty to stop)', 47 | }, 48 | ]); 49 | if (task === '' || taskName == '') break; 50 | tasks[taskName] = task; 51 | } 52 | const preset = { 53 | name, 54 | tasks, 55 | }; 56 | // display the preset and ask if the user wants to save it 57 | console.log(chalk.green(`Preset ${name} created`)); 58 | console.log(chalk.green(`Tasks: ${Object.values(tasks).join(', ')}`)); 59 | const save = ( 60 | await inquirer.prompt([ 61 | { 62 | type: 'confirm', 63 | name: 'save', 64 | message: 'Save this preset?', 65 | default: true, 66 | }, 67 | ]) 68 | ).save; 69 | if (!save) return; 70 | config.presets = config.presets || {}; 71 | config.presets[name] = preset; 72 | saveConfig(); 73 | 74 | console.log(chalk.green(`Preset ${name} saved`)); 75 | }; 76 | 77 | export const listPresets = () => { 78 | if (!config.presets) { 79 | console.log(chalk.red('No presets found')); 80 | return; 81 | } 82 | // check if presets are empty 83 | if (Object.keys(config.presets).length === 0) { 84 | console.log(chalk.red('No presets found')); 85 | return; 86 | } 87 | console.log(chalk.green('Presets:')); 88 | Object.keys(config.presets).forEach((preset) => { 89 | console.log(' - ' + chalk.green(`${preset}`)); 90 | Object.values(config.presets[preset].tasks).forEach((task) => { 91 | console.log(' - ' + chalk.green(`${task}`)); 92 | }); 93 | }); 94 | }; 95 | export const deletePreset = async (args) => { 96 | const name = args.name; 97 | 98 | // check if name is already taken 99 | if (!config.presets || !config.presets[name]) { 100 | console.log(chalk.red(`Preset ${name} does not exist`)); 101 | return; 102 | } 103 | 104 | // display the preset and ask if the user wants to delete it 105 | console.log(chalk.green(`Preset ${name} will be deleted`)); 106 | const save = ( 107 | await inquirer.prompt([ 108 | { 109 | type: 'confirm', 110 | name: 'save', 111 | message: 'Delete this preset?', 112 | default: true, 113 | }, 114 | ]) 115 | ).save; 116 | if (!save) return; 117 | delete config.presets[name]; 118 | saveConfig(); 119 | 120 | console.log(chalk.green(`Preset ${name} deleted`)); 121 | }; 122 | 123 | export const preset = (name) => { 124 | if (!config.presets || !config.presets[name]) { 125 | console.log(chalk.red(`Preset ${name} does not exist`)); 126 | return; 127 | } 128 | return config.presets[name]; 129 | }; 130 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | ansi-escapes@^4.2.1: 6 | version "4.3.2" 7 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" 8 | integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== 9 | dependencies: 10 | type-fest "^0.21.3" 11 | 12 | ansi-regex@^5.0.1: 13 | version "5.0.1" 14 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 15 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 16 | 17 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 18 | version "4.3.0" 19 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 20 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 21 | dependencies: 22 | color-convert "^2.0.1" 23 | 24 | base64-js@^1.3.1: 25 | version "1.5.1" 26 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" 27 | integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== 28 | 29 | bl@^4.1.0: 30 | version "4.1.0" 31 | resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" 32 | integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== 33 | dependencies: 34 | buffer "^5.5.0" 35 | inherits "^2.0.4" 36 | readable-stream "^3.4.0" 37 | 38 | buffer@^5.5.0: 39 | version "5.7.1" 40 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" 41 | integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== 42 | dependencies: 43 | base64-js "^1.3.1" 44 | ieee754 "^1.1.13" 45 | 46 | chalk@^4.1.0, chalk@^4.1.1: 47 | version "4.1.2" 48 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 49 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 50 | dependencies: 51 | ansi-styles "^4.1.0" 52 | supports-color "^7.1.0" 53 | 54 | chalk@^5.0.0: 55 | version "5.0.0" 56 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.0.0.tgz#bd96c6bb8e02b96e08c0c3ee2a9d90e050c7b832" 57 | integrity sha512-/duVOqst+luxCQRKEo4bNxinsOQtMP80ZYm7mMqzuh5PociNL0PvmHFvREJ9ueYL2TxlHjBcmLCdmocx9Vg+IQ== 58 | 59 | chardet@^0.7.0: 60 | version "0.7.0" 61 | resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" 62 | integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== 63 | 64 | cli-cursor@^3.1.0: 65 | version "3.1.0" 66 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" 67 | integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== 68 | dependencies: 69 | restore-cursor "^3.1.0" 70 | 71 | cli-spinners@^2.5.0: 72 | version "2.6.1" 73 | resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" 74 | integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== 75 | 76 | cli-width@^3.0.0: 77 | version "3.0.0" 78 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" 79 | integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== 80 | 81 | cliui@^7.0.2: 82 | version "7.0.4" 83 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" 84 | integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== 85 | dependencies: 86 | string-width "^4.2.0" 87 | strip-ansi "^6.0.0" 88 | wrap-ansi "^7.0.0" 89 | 90 | clone@^1.0.2: 91 | version "1.0.4" 92 | resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" 93 | integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= 94 | 95 | color-convert@^2.0.1: 96 | version "2.0.1" 97 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 98 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 99 | dependencies: 100 | color-name "~1.1.4" 101 | 102 | color-name@~1.1.4: 103 | version "1.1.4" 104 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 105 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 106 | 107 | defaults@^1.0.3: 108 | version "1.0.3" 109 | resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" 110 | integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= 111 | dependencies: 112 | clone "^1.0.2" 113 | 114 | emoji-regex@^8.0.0: 115 | version "8.0.0" 116 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 117 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 118 | 119 | escalade@^3.1.1: 120 | version "3.1.1" 121 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 122 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 123 | 124 | escape-string-regexp@^1.0.5: 125 | version "1.0.5" 126 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 127 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 128 | 129 | external-editor@^3.0.3: 130 | version "3.1.0" 131 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" 132 | integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== 133 | dependencies: 134 | chardet "^0.7.0" 135 | iconv-lite "^0.4.24" 136 | tmp "^0.0.33" 137 | 138 | figures@^3.0.0: 139 | version "3.2.0" 140 | resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" 141 | integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== 142 | dependencies: 143 | escape-string-regexp "^1.0.5" 144 | 145 | find-up@^6.3.0: 146 | version "6.3.0" 147 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" 148 | integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== 149 | dependencies: 150 | locate-path "^7.1.0" 151 | path-exists "^5.0.0" 152 | 153 | get-caller-file@^2.0.5: 154 | version "2.0.5" 155 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 156 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 157 | 158 | has-flag@^4.0.0: 159 | version "4.0.0" 160 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 161 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 162 | 163 | iconv-lite@^0.4.24: 164 | version "0.4.24" 165 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 166 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 167 | dependencies: 168 | safer-buffer ">= 2.1.2 < 3" 169 | 170 | ieee754@^1.1.13: 171 | version "1.2.1" 172 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" 173 | integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== 174 | 175 | inherits@^2.0.3, inherits@^2.0.4: 176 | version "2.0.4" 177 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 178 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 179 | 180 | inquirer@^8.2.0: 181 | version "8.2.0" 182 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.0.tgz#f44f008dd344bbfc4b30031f45d984e034a3ac3a" 183 | integrity sha512-0crLweprevJ02tTuA6ThpoAERAGyVILC4sS74uib58Xf/zSr1/ZWtmm7D5CI+bSQEaA04f0K7idaHpQbSWgiVQ== 184 | dependencies: 185 | ansi-escapes "^4.2.1" 186 | chalk "^4.1.1" 187 | cli-cursor "^3.1.0" 188 | cli-width "^3.0.0" 189 | external-editor "^3.0.3" 190 | figures "^3.0.0" 191 | lodash "^4.17.21" 192 | mute-stream "0.0.8" 193 | ora "^5.4.1" 194 | run-async "^2.4.0" 195 | rxjs "^7.2.0" 196 | string-width "^4.1.0" 197 | strip-ansi "^6.0.0" 198 | through "^2.3.6" 199 | 200 | is-fullwidth-code-point@^3.0.0: 201 | version "3.0.0" 202 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 203 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 204 | 205 | is-interactive@^1.0.0: 206 | version "1.0.0" 207 | resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" 208 | integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== 209 | 210 | is-unicode-supported@^0.1.0: 211 | version "0.1.0" 212 | resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" 213 | integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== 214 | 215 | locate-path@^7.1.0: 216 | version "7.1.0" 217 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.1.0.tgz#241d62af60739f6097c055efe10329c88b798425" 218 | integrity sha512-HNx5uOnYeK4SxEoid5qnhRfprlJeGMzFRKPLCf/15N3/B4AiofNwC/yq7VBKdVk9dx7m+PiYCJOGg55JYTAqoQ== 219 | dependencies: 220 | p-locate "^6.0.0" 221 | 222 | lodash@^4.17.21: 223 | version "4.17.21" 224 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 225 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 226 | 227 | log-symbols@^4.1.0: 228 | version "4.1.0" 229 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" 230 | integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== 231 | dependencies: 232 | chalk "^4.1.0" 233 | is-unicode-supported "^0.1.0" 234 | 235 | mimic-fn@^2.1.0: 236 | version "2.1.0" 237 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 238 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 239 | 240 | mute-stream@0.0.8: 241 | version "0.0.8" 242 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" 243 | integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== 244 | 245 | onetime@^5.1.0: 246 | version "5.1.2" 247 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" 248 | integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== 249 | dependencies: 250 | mimic-fn "^2.1.0" 251 | 252 | ora@^5.4.1: 253 | version "5.4.1" 254 | resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" 255 | integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== 256 | dependencies: 257 | bl "^4.1.0" 258 | chalk "^4.1.0" 259 | cli-cursor "^3.1.0" 260 | cli-spinners "^2.5.0" 261 | is-interactive "^1.0.0" 262 | is-unicode-supported "^0.1.0" 263 | log-symbols "^4.1.0" 264 | strip-ansi "^6.0.0" 265 | wcwidth "^1.0.1" 266 | 267 | os-tmpdir@~1.0.2: 268 | version "1.0.2" 269 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 270 | integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= 271 | 272 | p-limit@^4.0.0: 273 | version "4.0.0" 274 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" 275 | integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== 276 | dependencies: 277 | yocto-queue "^1.0.0" 278 | 279 | p-locate@^6.0.0: 280 | version "6.0.0" 281 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" 282 | integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== 283 | dependencies: 284 | p-limit "^4.0.0" 285 | 286 | path-exists@^5.0.0: 287 | version "5.0.0" 288 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" 289 | integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== 290 | 291 | readable-stream@^3.4.0: 292 | version "3.6.0" 293 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" 294 | integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== 295 | dependencies: 296 | inherits "^2.0.3" 297 | string_decoder "^1.1.1" 298 | util-deprecate "^1.0.1" 299 | 300 | require-directory@^2.1.1: 301 | version "2.1.1" 302 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 303 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 304 | 305 | restore-cursor@^3.1.0: 306 | version "3.1.0" 307 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" 308 | integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== 309 | dependencies: 310 | onetime "^5.1.0" 311 | signal-exit "^3.0.2" 312 | 313 | run-async@^2.4.0: 314 | version "2.4.1" 315 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" 316 | integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== 317 | 318 | rxjs@^7.2.0: 319 | version "7.5.4" 320 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.4.tgz#3d6bd407e6b7ce9a123e76b1e770dc5761aa368d" 321 | integrity sha512-h5M3Hk78r6wAheJF0a5YahB1yRQKCsZ4MsGdZ5O9ETbVtjPcScGfrMmoOq7EBsCRzd4BDkvDJ7ogP8Sz5tTFiQ== 322 | dependencies: 323 | tslib "^2.1.0" 324 | 325 | safe-buffer@~5.2.0: 326 | version "5.2.1" 327 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 328 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 329 | 330 | "safer-buffer@>= 2.1.2 < 3": 331 | version "2.1.2" 332 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 333 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 334 | 335 | signal-exit@^3.0.2: 336 | version "3.0.7" 337 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" 338 | integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== 339 | 340 | string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: 341 | version "4.2.3" 342 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 343 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 344 | dependencies: 345 | emoji-regex "^8.0.0" 346 | is-fullwidth-code-point "^3.0.0" 347 | strip-ansi "^6.0.1" 348 | 349 | string_decoder@^1.1.1: 350 | version "1.3.0" 351 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" 352 | integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== 353 | dependencies: 354 | safe-buffer "~5.2.0" 355 | 356 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 357 | version "6.0.1" 358 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 359 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 360 | dependencies: 361 | ansi-regex "^5.0.1" 362 | 363 | supports-color@^7.1.0: 364 | version "7.2.0" 365 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 366 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 367 | dependencies: 368 | has-flag "^4.0.0" 369 | 370 | through@^2.3.6: 371 | version "2.3.8" 372 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 373 | integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= 374 | 375 | tmp@^0.0.33: 376 | version "0.0.33" 377 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" 378 | integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== 379 | dependencies: 380 | os-tmpdir "~1.0.2" 381 | 382 | tslib@^2.1.0: 383 | version "2.3.1" 384 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" 385 | integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== 386 | 387 | type-fest@^0.21.3: 388 | version "0.21.3" 389 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" 390 | integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== 391 | 392 | util-deprecate@^1.0.1: 393 | version "1.0.2" 394 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 395 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 396 | 397 | wcwidth@^1.0.1: 398 | version "1.0.1" 399 | resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" 400 | integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= 401 | dependencies: 402 | defaults "^1.0.3" 403 | 404 | wrap-ansi@^7.0.0: 405 | version "7.0.0" 406 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 407 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 408 | dependencies: 409 | ansi-styles "^4.0.0" 410 | string-width "^4.1.0" 411 | strip-ansi "^6.0.0" 412 | 413 | y18n@^5.0.5: 414 | version "5.0.8" 415 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" 416 | integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== 417 | 418 | yargs-parser@^21.0.0: 419 | version "21.0.0" 420 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.0.tgz#a485d3966be4317426dd56bdb6a30131b281dc55" 421 | integrity sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA== 422 | 423 | yargs@^17.3.1: 424 | version "17.3.1" 425 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.3.1.tgz#da56b28f32e2fd45aefb402ed9c26f42be4c07b9" 426 | integrity sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA== 427 | dependencies: 428 | cliui "^7.0.2" 429 | escalade "^3.1.1" 430 | get-caller-file "^2.0.5" 431 | require-directory "^2.1.1" 432 | string-width "^4.2.3" 433 | y18n "^5.0.5" 434 | yargs-parser "^21.0.0" 435 | 436 | yocto-queue@^1.0.0: 437 | version "1.0.0" 438 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" 439 | integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== 440 | --------------------------------------------------------------------------------