diff --git a/README.md b/README.md index a49dc7354..098e2c083 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # @hubspot/cli -[![Official Release](https://img.shields.io/npm/v/@hubspot/cli/latest?label=Official%20Release)](https://www.npmjs.com/package/@hubspot/cli) [![Latest Version](https://img.shields.io/github/v/tag/hubspot/hubspot-cli?label=Latest%20Version)](https://www.npmjs.com/package/@hubspot/cli?activeTab=versions) +[![Official Release](https://img.shields.io/npm/v/@hubspot/cli/latest?label=Official%20Release)](https://www.npmjs.com/package/@hubspot/cli) [![Latest Beta Version](https://img.shields.io/npm/v/@hubspot/cli/next?label=Latest%20Beta%20Version)](https://www.npmjs.com/package/@hubspot/cli?activeTab=versions) A CLI for HubSpot developers to enable local development and automation. [Learn more about building on HubSpot](https://developers.hubspot.com). @@ -58,14 +58,15 @@ There are two ways that the tools can authenticate with HubSpot. 3. Select `OAuth2` and follow the steps _**Note:** The Account ID used should be the Test Account ID (not the developer app ID). Client ID and Client Secret are from the developer app._ + ### Exit Codes The CLI will exit with one of the following exit codes: + - `0`: A successful run - `1`: There was a config problem or an internal error - `2`: There are warnings or validation issues - ## Changelog The best way to stay up to date is to check out the [Github Releases](https://github.com/HubSpot/hubspot-cli/releases) and also follow our [developer changelog posts](https://developers.hubspot.com/changelog) for an easier to read breakdown of major changes. diff --git a/acceptance-tests/tests/commands/hs.spec.ts b/acceptance-tests/tests/commands/hs.spec.ts new file mode 100644 index 000000000..73494eb38 --- /dev/null +++ b/acceptance-tests/tests/commands/hs.spec.ts @@ -0,0 +1,36 @@ +import { describe, beforeAll, it, expect, afterAll } from 'vitest'; +import { TestState } from '../../lib/TestState'; + +describe('hs', () => { + let testState: TestState; + + beforeAll(async () => { + testState = new TestState(); + }); + + afterAll(() => { + testState.cleanup(); + }); + + describe('hs', () => { + it('should log out the help message', async () => { + const output = await testState.cli.executeWithTestConfig([]); + + expect(output).toContain( + 'The command line interface to interact with HubSpot' + ); + }); + + it('should log out the help message when --help is passed', async () => { + const output = await testState.cli.executeWithTestConfig(['--help']); + + expect(output).toContain( + 'The command line interface to interact with HubSpot' + ); + }); + + it('should not throw when --version is passed', async () => { + await testState.cli.executeWithTestConfig(['--version']); + }); + }); +}); diff --git a/acceptance-tests/tests/workflows/secretsFlow.spec.ts b/acceptance-tests/tests/workflows/secretsFlow.spec.ts index 2ce8c4634..5eaaca3f2 100644 --- a/acceptance-tests/tests/workflows/secretsFlow.spec.ts +++ b/acceptance-tests/tests/workflows/secretsFlow.spec.ts @@ -12,8 +12,8 @@ const SECRET = { }; const secretPollingOptions = { - interval: 2000, - timeout: 20000, + interval: 5000, + timeout: 60000, }; async function waitForSecretsListToContainSecret(testState: TestState) { diff --git a/bin/cli.js b/bin/cli.js index 85a013e38..1644f7ed0 100755 --- a/bin/cli.js +++ b/bin/cli.js @@ -108,7 +108,7 @@ const handleFailure = (msg, err, yargs) => { } if (msg === null) { - yargs.showHelp(); + yargs.showHelp('log'); process.exit(EXIT_CODES.SUCCESS); } else { process.exit(EXIT_CODES.ERROR); @@ -177,6 +177,11 @@ const SKIP_CONFIG_VALIDATION = { }; const loadConfigMiddleware = async options => { + // Skip this when no command is provided + if (!options._.length) { + return; + } + const maybeValidateConfig = () => { if ( !isTargetedCommand(options, SKIP_CONFIG_VALIDATION) && @@ -201,7 +206,11 @@ const loadConfigMiddleware = async options => { maybeValidateConfig(); }; -const checkAndWarnGitInclusionMiddleware = () => { +const checkAndWarnGitInclusionMiddleware = options => { + // Skip this when no command is provided + if (!options._.length) { + return; + } checkAndWarnGitInclusion(getConfigPath()); }; @@ -231,6 +240,11 @@ const SKIP_ACCOUNT_VALIDATION = { }; const validateAccountOptions = async options => { + // Skip this when no command is provided + if (!options._.length) { + return; + } + let validAccount = true; if (!isTargetedCommand(options, SKIP_ACCOUNT_VALIDATION)) { validAccount = await validateAccount(options); diff --git a/commands/customObject/create.ts b/commands/customObject/create.ts index 2e483dfde..40e3ea989 100644 --- a/commands/customObject/create.ts +++ b/commands/customObject/create.ts @@ -20,9 +20,14 @@ exports.describe = i18n(`${i18nKey}.describe`); exports.handler = async options => { const { path, name: providedName, derivedAccountId } = options; let definitionPath = path; + let name = providedName; trackCommandUsage('custom-object-batch-create', null, derivedAccountId); + if (!name) { + name = await inputPrompt(i18n(`${i18nKey}.inputName`)); + } + if (!definitionPath) { definitionPath = await inputPrompt(i18n(`${i18nKey}.inputPath`)); } @@ -34,9 +39,6 @@ exports.handler = async options => { process.exit(EXIT_CODES.ERROR); } - const name = - providedName || (await inputPrompt(i18n(`${i18nKey}.inputSchema`))); - try { await batchCreateObjects(derivedAccountId, name, objectJson); logger.success(i18n(`${i18nKey}.success.objectsCreated`)); diff --git a/commands/hubdb/create.ts b/commands/hubdb/create.ts index bb77c8897..a712bcc1e 100644 --- a/commands/hubdb/create.ts +++ b/commands/hubdb/create.ts @@ -51,10 +51,10 @@ exports.handler = async options => { let filePath; try { - const { path: filePath } = + const filePath = 'path' in options ? path.resolve(getCwd(), options.path) - : await selectPathPrompt(options); + : path.resolve(getCwd(), (await selectPathPrompt(options)).path); if (!checkAndConvertToJson(filePath)) { process.exit(EXIT_CODES.ERROR); } diff --git a/commands/project/deploy.ts b/commands/project/deploy.ts index 1952c0af8..5d9245d12 100644 --- a/commands/project/deploy.ts +++ b/commands/project/deploy.ts @@ -114,7 +114,7 @@ exports.handler = async options => { latestBuild.buildId === deployedBuildId ? undefined : latestBuild.buildId, - validate: () => + validate: buildId => validateBuildId( buildId, deployedBuildId, diff --git a/commands/secret/deleteSecret.ts b/commands/secret/deleteSecret.ts index 4b2275747..22fda3cbf 100644 --- a/commands/secret/deleteSecret.ts +++ b/commands/secret/deleteSecret.ts @@ -68,11 +68,13 @@ exports.handler = async options => { }) ); } catch (err) { - logger.error( - i18n(`${i18nKey}.errors.delete`, { - secretName, - }) - ); + if (secretName) { + logger.error( + i18n(`${i18nKey}.errors.delete`, { + secretName, + }) + ); + } logError( err, new ApiErrorContext({ diff --git a/lang/en.lyaml b/lang/en.lyaml index ec2cb9694..3ce2a43d3 100644 --- a/lang/en.lyaml +++ b/lang/en.lyaml @@ -214,8 +214,8 @@ en: describe: "Schema name to add the object instance to" success: objectsCreated: "Objects created" - inputSchema: "What would you like to name the schema?" - inputPath: "[--path] Where is the JSON file containing the object definitions?" + inputName: "[--name] Enter the name of the schema for the custom object(s) you'd like to create:" + inputPath: "[--path] Enter the path to the JSON file containing the object definitions:" schema: describe: "Commands for managing custom object schemas." subcommands: diff --git a/lib/projects/watch.ts b/lib/projects/watch.ts index a67104526..fed80afc5 100644 --- a/lib/projects/watch.ts +++ b/lib/projects/watch.ts @@ -1,36 +1,55 @@ -// @ts-nocheck -const chokidar = require('chokidar'); -const path = require('path'); -const chalk = require('chalk'); -const { default: PQueue } = require('p-queue'); -const { logError, ApiErrorContext } = require('../errorHandlers/index'); -const { i18n } = require('../lang'); -const { logger } = require('@hubspot/local-dev-lib/logger'); -const { isAllowedExtension } = require('@hubspot/local-dev-lib/path'); -const { shouldIgnoreFile } = require('@hubspot/local-dev-lib/ignoreRules'); -const { +import chokidar from 'chokidar'; +import path from 'path'; +import chalk from 'chalk'; +import PQueue from 'p-queue'; +import { logger } from '@hubspot/local-dev-lib/logger'; +import { isAllowedExtension } from '@hubspot/local-dev-lib/path'; +import { JSR_ALLOWED_EXTENSIONS } from '@hubspot/local-dev-lib/constants/extensions'; +import { shouldIgnoreFile } from '@hubspot/local-dev-lib/ignoreRules'; +import { cancelStagedBuild, provisionBuild, uploadFileToBuild, deleteFileFromBuild, queueBuild, -} = require('@hubspot/local-dev-lib/api/projects'); -const { isSpecifiedError } = require('@hubspot/local-dev-lib/errors/index'); -const { PROJECT_ERROR_TYPES } = require('../constants'); +} from '@hubspot/local-dev-lib/api/projects'; +import { isSpecifiedError } from '@hubspot/local-dev-lib/errors/index'; + +import { logError, ApiErrorContext } from '../errorHandlers'; +import { i18n } from '../lang'; +import { PROJECT_ERROR_TYPES } from '../constants'; +import { ProjectConfig } from '../../types/Projects'; const i18nKey = 'commands.project.subcommands.watch'; +type ProjectWatchHandlerFunction = ( + accountId: number, + projectName: string, + currentBuildId: number +) => Promise; + +type WatchEvent = { + filePath: string; + remotePath: string; + action: string; +}; + const queue = new PQueue({ concurrency: 10, }); -const standbyeQueue = []; -let currentBuildId = null; -let handleBuildStatus, handleUserInput; -let timer; +const standbyQueue: WatchEvent[] = []; +let currentBuildId: number; +let handleBuildStatus: ProjectWatchHandlerFunction; +let handleUserInput: ProjectWatchHandlerFunction; +let timer: NodeJS.Timeout; -const processStandByQueue = async (accountId, projectName, platformVersion) => { +async function processStandByQueue( + accountId: number, + projectName: string, + platformVersion: string +): Promise { queue.addAll( - standbyeQueue.map(({ filePath, remotePath, action }) => { + standbyQueue.map(({ filePath, remotePath, action }) => { return async () => { queueFileOrFolder( accountId, @@ -43,15 +62,14 @@ const processStandByQueue = async (accountId, projectName, platformVersion) => { }; }) ); - standbyeQueue.length = 0; + standbyQueue.length = 0; debounceQueueBuild(accountId, projectName, platformVersion); -}; - -const createNewStagingBuild = async ( - accountId, - projectName, - platformVersion -) => { +} +async function createNewStagingBuild( + accountId: number, + projectName: string, + platformVersion: string +): Promise { currentBuildId = await createNewBuild( accountId, projectName, @@ -59,9 +77,13 @@ const createNewStagingBuild = async ( ); handleUserInput(accountId, projectName, currentBuildId); -}; +} -const debounceQueueBuild = (accountId, projectName, platformVersion) => { +function debounceQueueBuild( + accountId: number, + projectName: string, + platformVersion: string +): void { if (timer) { clearTimeout(timer); } @@ -93,7 +115,7 @@ const debounceQueueBuild = (accountId, projectName, platformVersion) => { await createNewStagingBuild(accountId, projectName, platformVersion); - if (standbyeQueue.length > 0) { + if (standbyQueue.length > 0) { await processStandByQueue(accountId, projectName, platformVersion); } @@ -101,17 +123,20 @@ const debounceQueueBuild = (accountId, projectName, platformVersion) => { logger.log(i18n(`${i18nKey}.logs.resuming`)); logger.log(`\n> Press ${chalk.bold('q')} to quit watching\n`); }, 2000); -}; +} -const queueFileOrFolder = async ( - accountId, - projectName, - platformVersion, - filePath, - remotePath, - action -) => { - if (action === 'upload' && !isAllowedExtension(filePath)) { +async function queueFileOrFolder( + accountId: number, + projectName: string, + platformVersion: string, + filePath: string, + remotePath: string, + action: string +): Promise { + if ( + action === 'upload' && + !isAllowedExtension(filePath, Array.from(JSR_ALLOWED_EXTENSIONS)) + ) { logger.debug(i18n(`${i18nKey}.debug.extensionNotAllowed`, { filePath })); return; } @@ -141,9 +166,13 @@ const queueFileOrFolder = async ( ); } }); -}; +} -const createNewBuild = async (accountId, projectName, platformVersion) => { +async function createNewBuild( + accountId: number, + projectName: string, + platformVersion: string +) { try { logger.debug(i18n(`${i18nKey}.debug.attemptNewBuild`)); const { @@ -160,22 +189,22 @@ const createNewBuild = async (accountId, projectName, platformVersion) => { } process.exit(1); } -}; +} -const handleWatchEvent = async ( - accountId, - projectName, - platformVersion, - projectSourceDir, - filePath, +async function handleWatchEvent( + accountId: number, + projectName: string, + platformVersion: string, + projectSourceDir: string, + filePath: string, action = 'upload' -) => { +) { const remotePath = path.relative(projectSourceDir, filePath); if (queue.isPaused) { - if (standbyeQueue.find(file => file.filePath === filePath)) { + if (standbyQueue.find(file => file.filePath === filePath)) { logger.debug(i18n(`${i18nKey}.debug.fileAlreadyQueued`, { filePath })); } else { - standbyeQueue.push({ + standbyQueue.push({ filePath, remotePath, action, @@ -191,15 +220,15 @@ const handleWatchEvent = async ( action ); } -}; +} -const createWatcher = async ( - accountId, - projectConfig, - projectDir, - handleBuildStatusFn, - handleUserInputFn -) => { +export async function createWatcher( + accountId: number, + projectConfig: ProjectConfig, + projectDir: string, + handleBuildStatusFn: ProjectWatchHandlerFunction, + handleUserInputFn: ProjectWatchHandlerFunction +) { const projectSourceDir = path.join(projectDir, projectConfig.srcDir); handleBuildStatus = handleBuildStatusFn; @@ -257,8 +286,4 @@ const createWatcher = async ( 'deleteFolder' ); }); -}; - -module.exports = { - createWatcher, -}; +} diff --git a/package.json b/package.json index 4c08c7090..a51a207e1 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,14 @@ { "name": "@hubspot/cli", - "version": "7.0.0-experimental.2", + "version": "7.0.0", "description": "The official CLI for developing on HubSpot", "license": "Apache-2.0", "repository": "https://github.com/HubSpot/hubspot-cli", "dependencies": { "@hubspot/local-dev-lib": "3.1.0", - "@hubspot/serverless-dev-runtime": "7.0.0", + "@hubspot/serverless-dev-runtime": "7.0.1", "@hubspot/theme-preview-dev-server": "0.0.10", - "@hubspot/ui-extensions-dev-server": "0.8.33", + "@hubspot/ui-extensions-dev-server": "0.8.40", "archiver": "^7.0.1", "chalk": "^4.1.2", "chokidar": "^3.0.1", diff --git a/yarn.lock b/yarn.lock index 1bd1a3387..8d8182926 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1346,17 +1346,17 @@ node-fetch "^2.6.0" url-parse "^1.4.3" -"@hubspot/app-functions-dev-server@0.8.31": - version "0.8.31" - resolved "https://registry.yarnpkg.com/@hubspot/app-functions-dev-server/-/app-functions-dev-server-0.8.31.tgz#48415e8d717076716aea9ff2781ca316ffb72f43" - integrity sha512-4dXalgnsSBvHNySAyywknKoHjCgQyHUUFQd2Cn5pBpx3ekUeQUuqwivAs8Kz12V8mXRUGE9eXtYjYUKHU50rCg== +"@hubspot/app-functions-dev-server@0.8.40": + version "0.8.40" + resolved "https://registry.yarnpkg.com/@hubspot/app-functions-dev-server/-/app-functions-dev-server-0.8.40.tgz#48a6f650d1a9aab86f38b21f32b1993abc62d9f8" + integrity sha512-Lq06p7fRTj9WFFNN381hZ8NcEz7OhA/IPEdJPVdLh+uS0OHywXLsVgJck2lvysi8rEqP6JOq1BHIz0d7ZvZtoA== dependencies: "@hubspot/api-client" "^10.0.0" axios "^1.6.8" - body-parser "1.20.2" cors "^2.8.5" dotenv "^16.3.1" express "^4.18.2" + moment "^2.29.4" uuid "^9.0.1" "@hubspot/cms-components@^0.18.11": @@ -1470,10 +1470,10 @@ semver "^6.3.0" unixify "^1.0.0" -"@hubspot/serverless-dev-runtime@7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@hubspot/serverless-dev-runtime/-/serverless-dev-runtime-7.0.0.tgz#dffe8101e3a9b79fa768691daa2c9ba1f86c25d6" - integrity sha512-8r/Iasu4rjBDPbOpCe8GV9Wx/LY/NID2gRgRVKBsxxGlFAsekTzXS1XPIBNH7ulBOkzGkqJWirEEtDkl6xcn9w== +"@hubspot/serverless-dev-runtime@7.0.1": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@hubspot/serverless-dev-runtime/-/serverless-dev-runtime-7.0.1.tgz#ccb7630c36345a11c9d1a3ea3a70e12f05cff652" + integrity sha512-efnS086lDWrzlCp6bcSSl41XK84DTz2RNDu6nXpywH1hdGfPSg3mPGHcfD79jgHbI6tpFaXRx+zLvxA3go026w== dependencies: body-parser "^1.19.0" chalk "^4.1.0" @@ -1497,17 +1497,20 @@ express "^4.18.2" node-fetch "2.7.0" -"@hubspot/ui-extensions-dev-server@0.8.33": - version "0.8.33" - resolved "https://registry.yarnpkg.com/@hubspot/ui-extensions-dev-server/-/ui-extensions-dev-server-0.8.33.tgz#f1b7e09ff69b5fcc099768ecee22b6a6d5d11dfe" - integrity sha512-2jzTzrYy5v5SBLPsEm0RkrBm0CKn6S3wTvILirYGh2FW2WPOnl1GzOyOLP2MtQzmKFa5cmbgyPHZWWvXgit37w== +"@hubspot/ui-extensions-dev-server@0.8.40": + version "0.8.40" + resolved "https://registry.yarnpkg.com/@hubspot/ui-extensions-dev-server/-/ui-extensions-dev-server-0.8.40.tgz#9b6c72468bd743a945f67cfa0aa4d4323d800350" + integrity sha512-KlbwG/yHl9l6ubttCMpI/R93d9aZaQB40X0u9ME672AryVMr3MXLJDu9InCsOkvt5cO8/wRtMHcQyNmeCub3+g== dependencies: - "@hubspot/app-functions-dev-server" "0.8.31" + "@hubspot/app-functions-dev-server" "0.8.40" + chalk "^5.4.1" + commander "^13.0.0" cors "^2.8.5" detect-port "1.5.1" estraverse "^5.3.0" express "^4.18.2" inquirer "8.2.0" + ora "^8.1.1" vite "^4.4.9" "@humanwhocodes/config-array@^0.13.0": @@ -4422,24 +4425,6 @@ bl@^4.0.3, bl@^4.1.0: inherits "^2.0.4" readable-stream "^3.4.0" -body-parser@1.20.2: - version "1.20.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" - integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== - dependencies: - bytes "3.1.2" - content-type "~1.0.5" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.11.0" - raw-body "2.5.2" - type-is "~1.6.18" - unpipe "1.0.0" - body-parser@1.20.3, body-parser@^1.19.0: version "1.20.3" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" @@ -4682,6 +4667,11 @@ chalk@^5.3.0: resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.4.0.tgz#846fdb5d5d939d6fa3d565cd5545697b6f8b6923" integrity sha512-ZkD35Mx92acjB2yNJgziGqT9oKHEOxjTBTDRpOsRWtdecL/0jM3z5kM/CTzHWvHIen1GvkM85p6TuFfDGfc8/Q== +chalk@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.4.1.tgz#1b48bf0963ec158dce2aacf69c093ae2dd2092d8" + integrity sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w== + char-regex@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" @@ -4763,6 +4753,13 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" +cli-cursor@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-5.0.0.tgz#24a4831ecf5a6b01ddeb32fb71a4b2088b0dce38" + integrity sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw== + dependencies: + restore-cursor "^5.0.0" + cli-progress@^3.11.2, cli-progress@^3.12.0: version "3.12.0" resolved "https://registry.yarnpkg.com/cli-progress/-/cli-progress-3.12.0.tgz#807ee14b66bcc086258e444ad0f19e7d42577942" @@ -4770,7 +4767,7 @@ cli-progress@^3.11.2, cli-progress@^3.12.0: dependencies: string-width "^4.2.3" -cli-spinners@^2.5.0: +cli-spinners@^2.5.0, 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== @@ -4902,6 +4899,11 @@ commander@^12.0.0, commander@^12.1.0: resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== +commander@^13.0.0: + version "13.0.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-13.0.0.tgz#1b161f60ee3ceb8074583a0f95359a4f8701845c" + integrity sha512-oPYleIY8wmTVzkvQq10AEok6YcTC4sRUBl8F9gVuwchGVUCTbl/vhLTaQqutuuySYOsu8YTgV+OxKc/8Yvx+mQ== + commander@^2.19.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" @@ -5606,6 +5608,11 @@ emittery@^0.13.1: resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== +emoji-regex@^10.3.0: + version "10.4.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.4.0.tgz#03553afea80b3975749cfcb36f776ca268e413d4" + integrity sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -6753,6 +6760,11 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-east-asian-width@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz#21b4071ee58ed04ee0db653371b55b4299875389" + integrity sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ== + get-intrinsic@^1.1.3, get-intrinsic@^1.2.2, get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6: version "1.2.6" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.6.tgz#43dd3dd0e7b49b82b2dfcad10dc824bf7fc265d5" @@ -7511,6 +7523,11 @@ is-interactive@^1.0.0: resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== +is-interactive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-2.0.0.tgz#40c57614593826da1100ade6059778d597f16e90" + integrity sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ== + is-map@^2.0.2, is-map@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" @@ -7652,6 +7669,16 @@ is-unicode-supported@^0.1.0: resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== +is-unicode-supported@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz#d824984b616c292a2e198207d4a609983842f714" + integrity sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ== + +is-unicode-supported@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz#09f0ab0de6d3744d48d265ebb98f65d11f2a9b3a" + integrity sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ== + is-url-superb@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-url-superb/-/is-url-superb-4.0.0.tgz#b54d1d2499bb16792748ac967aa3ecb41a33a8c2" @@ -8489,6 +8516,14 @@ log-symbols@^4.0.0, log-symbols@^4.1.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" +log-symbols@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-6.0.0.tgz#bb95e5f05322651cac30c0feb6404f9f2a8a9439" + integrity sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw== + dependencies: + chalk "^5.3.0" + is-unicode-supported "^1.3.0" + log-update@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" @@ -8708,6 +8743,11 @@ mimic-fn@^4.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== +mimic-function@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076" + integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== + mimic-response@^1.0.0, mimic-response@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" @@ -9101,6 +9141,13 @@ onetime@^6.0.0: dependencies: mimic-fn "^4.0.0" +onetime@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-7.0.0.tgz#9f16c92d8c9ef5120e3acd9dd9957cceecc1ab60" + integrity sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ== + dependencies: + mimic-function "^5.0.0" + open@^7.0.3: version "7.4.2" resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" @@ -9150,6 +9197,21 @@ ora@^5.4.1: strip-ansi "^6.0.0" wcwidth "^1.0.1" +ora@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-8.1.1.tgz#8efc8865e44c87e4b55468a47e80a03e678b0e54" + integrity sha512-YWielGi1XzG1UTvOaCFaNgEnuhZVMSHYkW/FQ7UX8O26PtlpdM84c0f7wLPlkvx2RfiQmnzd61d/MGxmpQeJPw== + dependencies: + chalk "^5.3.0" + cli-cursor "^5.0.0" + cli-spinners "^2.9.2" + is-interactive "^2.0.0" + is-unicode-supported "^2.0.0" + log-symbols "^6.0.0" + stdin-discarder "^0.2.2" + string-width "^7.2.0" + strip-ansi "^7.1.0" + os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -9636,13 +9698,6 @@ pure-rand@^6.0.0: resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== -qs@6.11.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== - dependencies: - side-channel "^1.0.4" - qs@6.13.0: version "6.13.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" @@ -10135,6 +10190,14 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" +restore-cursor@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-5.1.0.tgz#0766d95699efacb14150993f55baf0953ea1ebe7" + integrity sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA== + dependencies: + onetime "^7.0.0" + signal-exit "^4.1.0" + reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -10592,6 +10655,11 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== +stdin-discarder@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/stdin-discarder/-/stdin-discarder-0.2.2.tgz#390037f44c4ae1a1ae535c5fe38dc3aba8d997be" + integrity sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ== + stop-iteration-iterator@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz#f481ff70a548f6124d0312c3aa14cbfa7aa542ad" @@ -10659,6 +10727,15 @@ string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" +string-width@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.2.0.tgz#b5bb8e2165ce275d4d43476dd2700ad9091db6dc" + integrity sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ== + dependencies: + emoji-regex "^10.3.0" + get-east-asian-width "^1.0.0" + strip-ansi "^7.1.0" + string.prototype.trim@^1.2.10: version "1.2.10" resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz#40b2dd5ee94c959b4dcfb1d65ce72e90da480c81" @@ -10728,7 +10805,7 @@ strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" -strip-ansi@^7.0.1: +strip-ansi@^7.0.1, strip-ansi@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==