diff --git a/cli/package.json b/cli/package.json index 884bb7176..898ca69a8 100644 --- a/cli/package.json +++ b/cli/package.json @@ -21,6 +21,7 @@ "node": ">=18" }, "dependencies": { + "@inquirer/prompts": "^5.0.3", "axios": "^0.27.2", "cbor": "^9.0.1", "chalk": "~4.1.2", @@ -29,6 +30,7 @@ "compare-versions": "^5.0.1", "concat-stream": "^2.0.0", "core-js": "^3.26.0", + "ini": "^4.1.2", "js-yaml": "^4.1.0", "json-bigint": "^1.0.0", "lodash": "^4.17.21", @@ -43,6 +45,7 @@ "@faker-js/faker": "^8.1.0", "@types/concat-stream": "^2.0.0", "@types/debug": "^4.1.12", + "@types/ini": "^4.1.0", "@types/js-yaml": "^4.0.5", "@types/json-bigint": "^1.0.4", "@types/lodash": "^4.17.1", diff --git a/cli/src/configs/common.ts b/cli/src/configs/common.ts new file mode 100644 index 000000000..cb18fc64a --- /dev/null +++ b/cli/src/configs/common.ts @@ -0,0 +1,23 @@ +import { join } from 'path' +import { homedir } from 'os' + +// Path to user's home directory +const USER_HOME_DIR = homedir() + +// Path to the config file +const CONFIG_FILE_PATH = join(USER_HOME_DIR, '.mqttx-cli', 'config') + +// Default configuration +const DEFAULT_CONFIG: ConfigModel = { + output: 'text', + mqtt: { + host: 'localhost', + port: 1883, + username: '', + password: '', + }, +} + +const VALID_OUTPUT_MODES: Array = ['text', 'json', 'log'] + +export { USER_HOME_DIR, CONFIG_FILE_PATH, DEFAULT_CONFIG, VALID_OUTPUT_MODES } diff --git a/cli/src/configs/index.ts b/cli/src/configs/index.ts new file mode 100644 index 000000000..16d43d624 --- /dev/null +++ b/cli/src/configs/index.ts @@ -0,0 +1,2 @@ +export * from './load' +export * from './init' diff --git a/cli/src/configs/init.ts b/cli/src/configs/init.ts new file mode 100644 index 000000000..eddedd91d --- /dev/null +++ b/cli/src/configs/init.ts @@ -0,0 +1,79 @@ +import { writeFileSync, mkdirSync } from 'fs' +import { join } from 'path' +import { select, input, password } from '@inquirer/prompts' +import { CONFIG_FILE_PATH, DEFAULT_CONFIG, USER_HOME_DIR } from './common' + +/** + * Generates the content of a configuration INI file based on the provided config object. + * @param config - The configuration object containing the necessary properties. + * @returns The generated configuration file content as a string. + */ +const generateConfigContent = (config: ConfigModel): string => { + return `[default] +output = ${config.output} + +[mqtt] +host = ${config.mqtt.host} +port = ${config.mqtt.port} +username = ${config.mqtt.username} +password = ${config.mqtt.password}` +} + +/** + * Initializes the configuration for MQTTX CLI. + * Creates or updates the configuration file with the provided values. + */ +async function initConfig(): Promise { + const output = (await select({ + message: 'Select MQTTX CLI output mode', + choices: [ + { name: 'Text', value: 'text', description: 'Plain text output' }, + { name: 'JSON', value: 'json', description: 'JSON formatted output' }, + { name: 'Log', value: 'log', description: 'Log file output' }, + ], + default: DEFAULT_CONFIG.output, + })) as ConfigModel['output'] + + const host = await input({ + message: 'Enter the default MQTT broker host', + default: DEFAULT_CONFIG.mqtt.host, + }) + + const port = await input({ + message: 'Enter the default MQTT port', + default: DEFAULT_CONFIG.mqtt.port.toString(), + validate: (input) => !isNaN(parseInt(input, 10)) || 'Port must be a number', + }) + + const username = await input({ + message: 'Enter the default username for MQTT connection authentication', + default: DEFAULT_CONFIG.mqtt.username, + }) + + const passwordAnswer = await password({ + message: 'Enter the default password for MQTT connection authentication', + mask: true, + }) + + const newConfig: ConfigModel = { + output, + mqtt: { + host, + port: parseInt(port, 10), + username, + password: passwordAnswer, + }, + } + + try { + mkdirSync(join(USER_HOME_DIR, '.mqttx-cli'), { recursive: true }) + writeFileSync(CONFIG_FILE_PATH, generateConfigContent(newConfig)) + console.log(`Configuration file created/updated at ${CONFIG_FILE_PATH}`) + } catch (error) { + console.error( + `Unable to create configuration file at ${CONFIG_FILE_PATH}. Please check your permissions and try again.`, + ) + } +} + +export { initConfig } diff --git a/cli/src/configs/load.ts b/cli/src/configs/load.ts new file mode 100644 index 000000000..ed3dfb711 --- /dev/null +++ b/cli/src/configs/load.ts @@ -0,0 +1,49 @@ +import { readFileSync, existsSync } from 'fs' +import ini from 'ini' +import { CONFIG_FILE_PATH, DEFAULT_CONFIG, VALID_OUTPUT_MODES } from './common' + +/** + * Parses the content of a config file and returns a ConfigModel object. + * @param content - The content of the config file. + * @returns The parsed ConfigModel object. + * @throws Error if the output mode is invalid. + */ +const parseConfigFile = (content: string): ConfigModel => { + const config = ini.parse(content) + const output = config.default?.output + if (output && !VALID_OUTPUT_MODES.includes(output)) { + throw new Error(`Invalid output mode: ${output}. Valid modes are: ${VALID_OUTPUT_MODES.join(', ')}`) + } + + return { + output: config.default?.output || DEFAULT_CONFIG.output, + mqtt: { + host: config.mqtt?.host || DEFAULT_CONFIG.mqtt.host, + port: parseInt(config.mqtt?.port, 10) || DEFAULT_CONFIG.mqtt.port, + username: config.mqtt?.username || DEFAULT_CONFIG.mqtt.username, + password: config.mqtt?.password || DEFAULT_CONFIG.mqtt.password, + }, + } +} + +/** + * Loads the configuration from a file. + * If the file exists, it reads the content, parses it, and returns the configuration. + * If the file doesn't exist or there is an error parsing the content, it returns the default configuration. + * + * @returns The loaded configuration. + */ +const loadConfig = (): ConfigModel => { + if (existsSync(CONFIG_FILE_PATH)) { + const configFileContent = readFileSync(CONFIG_FILE_PATH, 'utf-8') + try { + return parseConfigFile(configFileContent) + } catch (error) { + console.error((error as Error).message) + console.error('Invalid configuration file. Using default configuration.') + } + } + return DEFAULT_CONFIG +} + +export { loadConfig } diff --git a/cli/src/index.ts b/cli/src/index.ts index 7e1d9087f..cef560aa4 100755 --- a/cli/src/index.ts +++ b/cli/src/index.ts @@ -21,11 +21,14 @@ import { pub, benchPub, simulatePub } from './lib/pub' import { sub, benchSub } from './lib/sub' import ls from './lib/ls' import { version } from '../package.json' +import { loadConfig, initConfig } from './configs' export class Commander { program: Command constructor() { + const configs = loadConfig() + console.log(configs) this.program = new Command() } @@ -45,6 +48,12 @@ export class Commander { await checkUpdate() }) + this.program + .command('init') + .description('Initialize the configuration file.') + .allowUnknownOption(false) + .action(initConfig) + this.program .command('conn') .description('Create a connection and connect to MQTT Broker.') diff --git a/cli/src/types/global.d.ts b/cli/src/types/global.d.ts index d7f435959..3ded85c78 100644 --- a/cli/src/types/global.d.ts +++ b/cli/src/types/global.d.ts @@ -170,6 +170,16 @@ declare global { reasonCode: number length: number } + + interface ConfigModel { + output: 'text' | 'json' | 'log' + mqtt: { + host: string + port: number + username: string + password: string + } + } } export {} diff --git a/cli/yarn.lock b/cli/yarn.lock index 898381eeb..e100f2e56 100644 --- a/cli/yarn.lock +++ b/cli/yarn.lock @@ -9,9 +9,126 @@ "@faker-js/faker@^8.1.0": version "8.1.0" - resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-8.1.0.tgz#e14896f1c57af2495e341dc4c7bf04125c8aeafd" + resolved "https://registry.npmjs.org/@faker-js/faker/-/faker-8.1.0.tgz" integrity sha512-38DT60rumHfBYynif3lmtxMqMqmsOQIxQgEuPZxCk2yUYN0eqWpTACgxi0VpidvsJB8CRxCpvP7B3anK85FjtQ== +"@inquirer/checkbox@^2.3.3": + version "2.3.3" + resolved "https://registry.yarnpkg.com/@inquirer/checkbox/-/checkbox-2.3.3.tgz#1a707ff5622fdc270cda44f9d85b2b737cf7ab31" + integrity sha512-R64X8RVjVrMLg9wmCB5WTy8R97a/zAYrPdjY1tOybadg4zwx7mk+0Fy69H1pT0x4PRdcMO/CyPmDI0gLooakmw== + dependencies: + "@inquirer/core" "^8.2.0" + "@inquirer/figures" "^1.0.1" + "@inquirer/type" "^1.3.1" + ansi-escapes "^4.3.2" + chalk "^4.1.2" + +"@inquirer/confirm@^3.1.7": + version "3.1.7" + resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-3.1.7.tgz#4568196121e4d26681fc2ff8f1f8d0f2f15e9b73" + integrity sha512-BZjjj19W8gnh5UGFTdP5ZxpgMNRjy03Dzq3k28sB2MDlEUFrcyTkMEoGgvBmGpUw0vNBoCJkTcbHZ3e9tb+d+w== + dependencies: + "@inquirer/core" "^8.2.0" + "@inquirer/type" "^1.3.1" + +"@inquirer/core@^8.2.0": + version "8.2.0" + resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-8.2.0.tgz#524ab7a6737958011f40959a1d0e5a8b90ff3471" + integrity sha512-pexNF9j2orvMMTgoQ/uKOw8V6/R7x/sIDwRwXRhl4i0pPSh6paRzFehpFKpfMbqix1/+gzCekhYTmVbQpWkVjQ== + dependencies: + "@inquirer/figures" "^1.0.1" + "@inquirer/type" "^1.3.1" + "@types/mute-stream" "^0.0.4" + "@types/node" "^20.12.11" + "@types/wrap-ansi" "^3.0.0" + ansi-escapes "^4.3.2" + chalk "^4.1.2" + cli-spinners "^2.9.2" + cli-width "^4.1.0" + mute-stream "^1.0.0" + signal-exit "^4.1.0" + strip-ansi "^6.0.1" + wrap-ansi "^6.2.0" + +"@inquirer/editor@^2.1.7": + version "2.1.7" + resolved "https://registry.yarnpkg.com/@inquirer/editor/-/editor-2.1.7.tgz#eafc8a73c97a06c22850d60d1032cfc7e860247a" + integrity sha512-CGZk//rg57zgXqMp8q8tE2HCc5/rwCC0IwIEtZeb1BF/GJIFlijp4wvN9PeXHsEQ+ul2qRz/0dEk1JqmZzbSbA== + dependencies: + "@inquirer/core" "^8.2.0" + "@inquirer/type" "^1.3.1" + external-editor "^3.1.0" + +"@inquirer/expand@^2.1.7": + version "2.1.7" + resolved "https://registry.yarnpkg.com/@inquirer/expand/-/expand-2.1.7.tgz#e8ccc17e78f2133eef4f6c627742fda0d1efe338" + integrity sha512-zwdd5Zur3kdlpthXwk3O4kH5/bXAdZA/Qfl9v7MFf2Un68Cq8XLATp/gH3iMkHcQtyyBemPFgzD9pHNq0piToQ== + dependencies: + "@inquirer/core" "^8.2.0" + "@inquirer/type" "^1.3.1" + chalk "^4.1.2" + +"@inquirer/figures@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.1.tgz#d65f0bd0e9511a90b4d3543ee6a3ce7211f29417" + integrity sha512-mtup3wVKia3ZwULPHcbs4Mor8Voi+iIXEWD7wCNbIO6lYR62oPCTQyrddi5OMYVXHzeCSoneZwJuS8sBvlEwDw== + +"@inquirer/input@^2.1.7": + version "2.1.7" + resolved "https://registry.yarnpkg.com/@inquirer/input/-/input-2.1.7.tgz#143a7a4e3dc0b85353b478b85649e15d1ed71fc3" + integrity sha512-eRdwlHJI4bpYsi4icIthsz1rZGIrlfufzRZdCf2i1qfQZ8d3vLTWcILIWV7cnjD4v/nrZ81RthRaQog/uxlcGA== + dependencies: + "@inquirer/core" "^8.2.0" + "@inquirer/type" "^1.3.1" + +"@inquirer/password@^2.1.7": + version "2.1.7" + resolved "https://registry.yarnpkg.com/@inquirer/password/-/password-2.1.7.tgz#ebfc859e1c5431126ef1445916e50e1c103744a3" + integrity sha512-RshkS0CRJYJO4Yxbl6MqkC3OQlU4Dmv4mNxxvoYYfRcPtC/UBLYcddm+lIDHi3zegkto9kmSNYXTCQKYNxinvg== + dependencies: + "@inquirer/core" "^8.2.0" + "@inquirer/type" "^1.3.1" + ansi-escapes "^4.3.2" + +"@inquirer/prompts@^5.0.3": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@inquirer/prompts/-/prompts-5.0.3.tgz#23d05c6fd0543f733dcab6556a7a83dd10c7c52c" + integrity sha512-OuSDMbUDlJUOXzlC0z35KWPH+2+W7Y8jPayT92A3L2Ip4ChM4XgcqNlOdPxoDTvKRMcDIddI8gzAQg1WtNB7gA== + dependencies: + "@inquirer/checkbox" "^2.3.3" + "@inquirer/confirm" "^3.1.7" + "@inquirer/editor" "^2.1.7" + "@inquirer/expand" "^2.1.7" + "@inquirer/input" "^2.1.7" + "@inquirer/password" "^2.1.7" + "@inquirer/rawlist" "^2.1.7" + "@inquirer/select" "^2.3.3" + +"@inquirer/rawlist@^2.1.7": + version "2.1.7" + resolved "https://registry.yarnpkg.com/@inquirer/rawlist/-/rawlist-2.1.7.tgz#a3c40c27c236cf0a5bb9742503ff42f4eedb1f29" + integrity sha512-r4tsdYWsYanwEl7MBqmf8GaZTbUAh51C3tMwozOYrAl2wT9YEQVSMDlkcMToFsisRCSq6mQ6zppv92masx4WRQ== + dependencies: + "@inquirer/core" "^8.2.0" + "@inquirer/type" "^1.3.1" + chalk "^4.1.2" + +"@inquirer/select@^2.3.3": + version "2.3.3" + resolved "https://registry.yarnpkg.com/@inquirer/select/-/select-2.3.3.tgz#771ef76fbb0846df3d1954b3b3fd2b684247b2ee" + integrity sha512-0ptHMogTnyTNKIJVEfCl4fFDQSzIR2/SjgBoD1MLXDszP3UbkYroZ9ii3e6x7dMCWrPGkGWZPyxpy3Rs55vWLw== + dependencies: + "@inquirer/core" "^8.2.0" + "@inquirer/figures" "^1.0.1" + "@inquirer/type" "^1.3.1" + ansi-escapes "^4.3.2" + chalk "^4.1.2" + +"@inquirer/type@^1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-1.3.1.tgz#afb95ff78f44fff7e8a00e17d5820db6add2a076" + integrity sha512-Pe3PFccjPVJV1vtlfVvm9OnlbxqdnP5QcscFEFEnK5quChf1ufZtM0r8mR5ToWHMxZOh0s8o/qp9ANGRTo/DAw== + "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" resolved "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz" @@ -74,31 +191,43 @@ "@types/debug@^4.1.12": version "4.1.12" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + resolved "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz" integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== dependencies: "@types/ms" "*" +"@types/ini@^4.1.0": + version "4.1.0" + resolved "https://registry.npmjs.org/@types/ini/-/ini-4.1.0.tgz" + integrity sha512-mTehMtc+xtnWBBvqizcqYCktKDBH2WChvx1GU3Sfe4PysFDXiNe+1YwtpVX1MDtCa4NQrSPw2+3HmvXHY3gt1w== + "@types/js-yaml@^4.0.5": version "4.0.5" - resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.5.tgz#738dd390a6ecc5442f35e7f03fa1431353f7e138" + resolved "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz" integrity sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA== "@types/json-bigint@^1.0.4": version "1.0.4" - resolved "https://registry.yarnpkg.com/@types/json-bigint/-/json-bigint-1.0.4.tgz#250d29e593375499d8ba6efaab22d094c3199ef3" + resolved "https://registry.npmjs.org/@types/json-bigint/-/json-bigint-1.0.4.tgz" integrity sha512-ydHooXLbOmxBbubnA7Eh+RpBzuaIiQjh8WGJYQB50JFGFrdxW7JzVlyEV7fAXw0T2sqJ1ysTneJbiyNLqZRAag== "@types/lodash@^4.17.1": version "4.17.1" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.1.tgz#0fabfcf2f2127ef73b119d98452bd317c4a17eb8" + resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.1.tgz" integrity sha512-X+2qazGS3jxLAIz5JDXDzglAF3KpijdhFxlf/V1+hEsOUc+HnWi81L/uv/EvGuV90WY+7mPGFCUDGfQC3Gj95Q== "@types/ms@*": version "0.7.34" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" + resolved "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz" integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== +"@types/mute-stream@^0.0.4": + version "0.0.4" + resolved "https://registry.yarnpkg.com/@types/mute-stream/-/mute-stream-0.0.4.tgz#77208e56a08767af6c5e1237be8888e2f255c478" + integrity sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow== + dependencies: + "@types/node" "*" + "@types/node@*", "@types/node@>=13.7.0": version "20.3.1" resolved "https://registry.npmjs.org/@types/node/-/node-20.3.1.tgz" @@ -109,6 +238,13 @@ resolved "https://registry.npmjs.org/@types/node/-/node-17.0.43.tgz" integrity sha512-jnUpgw8fL9kP2iszfIDyBQtw5Mf4/XSqy0Loc1J9pI14ejL83XcCEvSf50Gs/4ET0I9VCCDoOfufQysj0S66xA== +"@types/node@^20.12.11": + version "20.12.12" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.12.tgz#7cbecdf902085cec634fdb362172dfe12b8f2050" + integrity sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw== + dependencies: + undici-types "~5.26.4" + "@types/pump@^1.1.1": version "1.1.1" resolved "https://registry.npmjs.org/@types/pump/-/pump-1.1.1.tgz" @@ -138,6 +274,11 @@ dependencies: "@types/node" "*" +"@types/wrap-ansi@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz#18b97a972f94f60a679fd5c796d96421b9abb9fd" + integrity sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g== + "@types/ws@^8.5.3": version "8.5.3" resolved "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz" @@ -145,6 +286,13 @@ dependencies: "@types/node" "*" +ansi-escapes@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" @@ -157,7 +305,7 @@ ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.1.0: +ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== @@ -166,7 +314,7 @@ ansi-styles@^4.1.0: argparse@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== asynckit@^0.4.0: @@ -194,7 +342,7 @@ base64-js@^1.3.1: bignumber.js@^9.0.0: version "9.1.2" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" + resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz" integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== bl@^4.0.2: @@ -229,7 +377,7 @@ buffer@^5.5.0: cbor@^9.0.1: version "9.0.1" - resolved "https://registry.yarnpkg.com/cbor/-/cbor-9.0.1.tgz#b16e393d4948d44758cd54ac6151379d443b37ae" + resolved "https://registry.npmjs.org/cbor/-/cbor-9.0.1.tgz" integrity sha512-/TQOWyamDxvVIv+DY9cOLNuABkoyz8K/F3QE56539pGVYohx0+MEA1f4lChFTX79dBTBS7R1PF6ovH7G+VtBfQ== dependencies: nofilter "^3.1.0" @@ -243,7 +391,7 @@ chalk@^2.3.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@~4.1.2: +chalk@^4.1.2, chalk@~4.1.2: version "4.1.2" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -251,6 +399,16 @@ chalk@~4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +cli-spinners@^2.9.2: + version "2.9.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" + integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== + cli-table3@^0.6.3: version "0.6.3" resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz" @@ -260,6 +418,11 @@ cli-table3@^0.6.3: optionalDependencies: "@colors/colors" "1.5.0" +cli-width@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-4.1.0.tgz#42daac41d3c254ef38ad8ac037672130173691c5" + integrity sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ== + color-convert@^1.9.0: version "1.9.3" resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" @@ -375,6 +538,15 @@ escape-string-regexp@^1.0.5: resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== +external-editor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + figures@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz" @@ -391,7 +563,7 @@ find-up@^2.0.0: follow-redirects@^1.14.9: version "1.15.6" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz" integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== form-data@^4.0.0: @@ -443,6 +615,13 @@ help-me@^3.0.0: glob "^7.1.6" readable-stream "^3.6.0" +iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + ieee754@^1.1.13: version "1.2.1" resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" @@ -461,6 +640,11 @@ inherits@2, inherits@^2.0.3, inherits@^2.0.4: resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +ini@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz" + integrity sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw== + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" @@ -478,14 +662,14 @@ js-sdsl@^2.1.2: js-yaml@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" json-bigint@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1" + resolved "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz" integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== dependencies: bignumber.js "^9.0.0" @@ -596,9 +780,14 @@ ms@2.1.2: resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +mute-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e" + integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== + nofilter@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-3.1.0.tgz#c757ba68801d41ff930ba2ec55bab52ca184aa66" + resolved "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz" integrity sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g== number-allocator@^1.0.9: @@ -616,6 +805,11 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + p-limit@^1.1.0: version "1.3.0" resolved "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz" @@ -673,7 +867,7 @@ process-nextick-args@^2.0.1: protobufjs@^7.2.3: version "7.2.5" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.2.5.tgz#45d5c57387a6d29a17aab6846dcc283f9b8e7f2d" + resolved "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.5.tgz" integrity sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A== dependencies: "@protobufjs/aspromise" "^1.1.2" @@ -721,6 +915,16 @@ safe-buffer@*, safe-buffer@~5.2.0: resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +signal-exit@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + signale@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz" @@ -747,7 +951,7 @@ stream-shift@^1.0.0: resolved "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz" integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== -string-width@^4.2.0: +string-width@^4.1.0, string-width@^4.2.0: version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -763,7 +967,7 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" -strip-ansi@^6.0.1: +strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -789,6 +993,18 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + typedarray@^0.0.6: version "0.0.6" resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" @@ -799,11 +1015,25 @@ typescript@^4.7.3: resolved "https://registry.npmjs.org/typescript/-/typescript-4.7.3.tgz" integrity sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA== +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + util-deprecate@^1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"