diff --git a/package.json b/package.json index d0e50e99..d84f54bf 100644 --- a/package.json +++ b/package.json @@ -8,11 +8,11 @@ }, "bugs": "https://github.com/forcedotcom/cli/issues", "dependencies": { - "@oclif/core": "^3.26.6", + "@oclif/core": "^4", "@salesforce/core": "^7.3.8", "@salesforce/kit": "^3.1.2", "@salesforce/plugin-info": "^3.2.7", - "@salesforce/sf-plugins-core": "^9.0.12", + "@salesforce/sf-plugins-core": "^10.0.0", "got": "^13.0.0", "npm": "^10.8.1", "npm-run-path": "^4.0.1", @@ -23,7 +23,7 @@ "devDependencies": { "@oclif/plugin-command-snapshot": "^5.2.0", "@salesforce/cli-plugins-testkit": "^5.3.9", - "@salesforce/dev-scripts": "^9.1.3", + "@salesforce/dev-scripts": "^10.1.0", "@salesforce/plugin-command-reference": "^3.0.82", "@salesforce/plugin-telemetry": "^3.3.12", "@salesforce/ts-sinon": "^1.4.18", diff --git a/src/hooks/verifyInstallSignature.ts b/src/hooks/verifyInstallSignature.ts index 4308d0c1..6d16aea4 100644 --- a/src/hooks/verifyInstallSignature.ts +++ b/src/hooks/verifyInstallSignature.ts @@ -7,7 +7,7 @@ import { Hook } from '@oclif/core'; import { Logger, Messages } from '@salesforce/core'; -import { ux } from '@oclif/core'; +import { Ux } from '@salesforce/sf-plugins-core/Ux'; import { ConfigContext, doInstallationCodeSigningVerification, @@ -20,6 +20,7 @@ import { import { type NpmName, parseNpmName } from '../shared/npmName.js'; export const hook: Hook.PluginsPreinstall = async function (options) { + const ux = new Ux(); if (options.plugin && options.plugin.type === 'npm') { const logger = await Logger.child('verifyInstallSignature'); const plugin = options.plugin; @@ -56,7 +57,7 @@ export const hook: Hook.PluginsPreinstall = async function (options) { try { logger.debug('doing verification'); - await doInstallationCodeSigningVerification(configContext, { plugin: plugin.name, tag: plugin.tag }, vConfig); + await doInstallationCodeSigningVerification(ux)(configContext, { plugin: plugin.name, tag: plugin.tag }, vConfig); ux.log('Finished digital signature check.'); } catch (error) { if (!(error instanceof Error)) { @@ -75,10 +76,10 @@ export const hook: Hook.PluginsPreinstall = async function (options) { const messages = Messages.loadMessages('@salesforce/plugin-trust', 'verify'); ux.log(messages.getMessage('SkipSignatureCheck', [options.plugin.url])); } else { - await doPrompt(options.plugin.url); + await doPrompt(ux)(options.plugin.url); } } else { - await doPrompt(); + await doPrompt(ux)(); } }; diff --git a/src/shared/installationVerification.ts b/src/shared/installationVerification.ts index 70a1bd48..7e640c5d 100644 --- a/src/shared/installationVerification.ts +++ b/src/shared/installationVerification.ts @@ -11,11 +11,10 @@ import { URL } from 'node:url'; import crypto from 'node:crypto'; import fs from 'node:fs'; import { mkdir } from 'node:fs/promises'; - +import { Ux } from '@salesforce/sf-plugins-core/Ux'; import { Logger, SfError, Messages } from '@salesforce/core'; import got from 'got'; import { ProxyAgent } from 'proxy-agent'; -import { ux } from '@oclif/core'; import { prompts } from '@salesforce/sf-plugins-core'; import { maxSatisfying } from 'semver'; import { NpmModule, NpmMeta } from './npmCommand.js'; @@ -32,11 +31,11 @@ export type ConfigContext = { cacheDir?: string; dataDir?: string; cliRoot?: string; -} +}; export type Verifier = { verify(): Promise; isAllowListed(): Promise; -} +}; class CodeVerifierInfo { private signature?: Readable; @@ -444,62 +443,66 @@ export class InstallationVerification implements Verifier { export class VerificationConfig { public verifier?: Verifier; - + private ux = new Ux(); // eslint-disable-next-line class-methods-use-this public log(message: string): void { - ux.log(message); + this.ux.log(message); } } -export async function doPrompt(plugin?: string): Promise { - const messages = Messages.loadMessages('@salesforce/plugin-trust', 'verify'); - if ( - !(await prompts.confirm({ - message: messages.getMessage('InstallConfirmation', [plugin ?? 'This plugin']), - ms: 30_000, - })) - ) { - throw new SfError('The user canceled the plugin installation.', 'InstallationCanceledError'); - } - // they approved the plugin. Let them know how to automate this. - ux.log(messages.getMessage('SuggestAllowList')); -} - -export async function doInstallationCodeSigningVerification( - config: ConfigContext, - plugin: { plugin: string; tag: string }, - verificationConfig: VerificationConfig -): Promise { - const messages = Messages.loadMessages('@salesforce/plugin-trust', 'verify'); - - if (await verificationConfig.verifier?.isAllowListed()) { - verificationConfig.log(messages.getMessage('SkipSignatureCheck', [plugin.plugin])); - return; - } - try { - if (!verificationConfig.verifier) { - throw new Error('VerificationConfig.verifier is not set.'); +export const doPrompt = + (ux: Ux) => + async (plugin?: string): Promise => { + const messages = Messages.loadMessages('@salesforce/plugin-trust', 'verify'); + if ( + !(await prompts.confirm({ + message: messages.getMessage('InstallConfirmation', [plugin ?? 'This plugin']), + ms: 30_000, + })) + ) { + throw new SfError('The user canceled the plugin installation.', 'InstallationCanceledError'); } - const meta = await verificationConfig.verifier.verify(); - if (!meta.verified) { - const err = messages.createError('FailedDigitalSignatureVerification'); - throw setErrorName(err, 'FailedDigitalSignatureVerification'); + // they approved the plugin. Let them know how to automate this. + ux.log(messages.getMessage('SuggestAllowList')); + }; + +export const doInstallationCodeSigningVerification = + (ux: Ux) => + async ( + config: ConfigContext, + plugin: { plugin: string; tag: string }, + verificationConfig: VerificationConfig + ): Promise => { + const messages = Messages.loadMessages('@salesforce/plugin-trust', 'verify'); + + if (await verificationConfig.verifier?.isAllowListed()) { + verificationConfig.log(messages.getMessage('SkipSignatureCheck', [plugin.plugin])); + return; } - verificationConfig.log(messages.getMessage('SignatureCheckSuccess', [plugin.plugin])); - } catch (err) { - if (err instanceof Error) { - if (err.name === 'NotSigned' || err.message?.includes('Response code 403')) { - if (!verificationConfig.verifier) { - throw new Error('VerificationConfig.verifier is not set.'); + try { + if (!verificationConfig.verifier) { + throw new Error('VerificationConfig.verifier is not set.'); + } + const meta = await verificationConfig.verifier.verify(); + if (!meta.verified) { + const err = messages.createError('FailedDigitalSignatureVerification'); + throw setErrorName(err, 'FailedDigitalSignatureVerification'); + } + verificationConfig.log(messages.getMessage('SignatureCheckSuccess', [plugin.plugin])); + } catch (err) { + if (err instanceof Error) { + if (err.name === 'NotSigned' || err.message?.includes('Response code 403')) { + if (!verificationConfig.verifier) { + throw new Error('VerificationConfig.verifier is not set.'); + } + return doPrompt(ux)(plugin.plugin); + } else if (err.name === 'PluginNotFound' || err.name === 'PluginAccessDenied') { + throw setErrorName(new SfError(err.message ?? 'The user canceled the plugin installation.'), ''); } - return await doPrompt(plugin.plugin); - } else if (err.name === 'PluginNotFound' || err.name === 'PluginAccessDenied') { - throw setErrorName(new SfError(err.message ?? 'The user canceled the plugin installation.'), ''); + throw setErrorName(SfError.wrap(err), err.name); } - throw setErrorName(SfError.wrap(err), err.name); } - } -} + }; /** * Retrieve url content for a host diff --git a/test/hooks/verifyInstallSignatureHook.test.ts b/test/hooks/verifyInstallSignatureHook.test.ts index e41c7faf..68da1162 100644 --- a/test/hooks/verifyInstallSignatureHook.test.ts +++ b/test/hooks/verifyInstallSignatureHook.test.ts @@ -9,8 +9,8 @@ import { assert, expect, config as chaiConfig } from 'chai'; import sinon from 'sinon'; import { stubMethod } from '@salesforce/ts-sinon'; -import { prompts } from '@salesforce/sf-plugins-core'; -import { Config, ux } from '@oclif/core'; +import { Ux, prompts } from '@salesforce/sf-plugins-core'; +import { Config } from '@oclif/core'; import { InstallationVerification, VerificationConfig } from '../../src/shared/installationVerification.js'; chaiConfig.truncateThreshold = 0; @@ -39,7 +39,7 @@ describe('plugin install hook', () => { stubMethod(sandbox, vConfig.verifier, 'isAllowListed').callsFake(async () => false); promptSpy = stubMethod(sandbox, prompts, 'confirm').resolves(false); - stubMethod(sandbox, ux, 'log').callsFake(() => {}); + stubMethod(sandbox, Ux.prototype, 'log').callsFake(() => {}); }); afterEach(() => { diff --git a/test/shared/installationVerification.test.ts b/test/shared/installationVerification.test.ts index ccc7a5a2..63eb6759 100644 --- a/test/shared/installationVerification.test.ts +++ b/test/shared/installationVerification.test.ts @@ -14,7 +14,7 @@ import { OptionsOfTextResponseBody } from 'got'; import shelljs from 'shelljs'; import { stubMethod } from '@salesforce/ts-sinon'; import { SfError } from '@salesforce/core'; -import { prompts } from '@salesforce/sf-plugins-core'; +import { Ux, prompts } from '@salesforce/sf-plugins-core'; import Sinon from 'sinon'; import { ConfigContext, @@ -596,7 +596,7 @@ describe('InstallationVerification Tests', () => { message = _message; }; - await doInstallationCodeSigningVerification({}, BLANK_PLUGIN, vConfig); + await doInstallationCodeSigningVerification(new Ux())({}, BLANK_PLUGIN, vConfig); expect(message).to.include('Successfully'); expect(message).to.include('digital signature'); }); @@ -615,7 +615,7 @@ describe('InstallationVerification Tests', () => { } as Verifier; try { - return await doInstallationCodeSigningVerification({}, BLANK_PLUGIN, vConfig); + return await doInstallationCodeSigningVerification(new Ux())({}, BLANK_PLUGIN, vConfig); } catch (err) { expect(err).to.have.property('name', 'FailedDigitalSignatureVerification'); } @@ -637,7 +637,7 @@ describe('InstallationVerification Tests', () => { stubMethod(sandbox, prompts, 'confirm').resolves(false); try { - await doInstallationCodeSigningVerification({}, BLANK_PLUGIN, vConfig); + await doInstallationCodeSigningVerification(new Ux())({}, BLANK_PLUGIN, vConfig); throw new Error('Failure: This should never happen'); } catch (err) { expect(err).to.have.property('name', 'InstallationCanceledError'); @@ -660,7 +660,7 @@ describe('InstallationVerification Tests', () => { stubMethod(sandbox, prompts, 'confirm').resolves(true); try { - await doInstallationCodeSigningVerification({}, BLANK_PLUGIN, vConfig); + await doInstallationCodeSigningVerification(new Ux())({}, BLANK_PLUGIN, vConfig); throw new Error('Failure: This should never happen'); } catch (err) { expect(err).to.have.property('name', 'UnexpectedHost'); @@ -683,7 +683,7 @@ describe('InstallationVerification Tests', () => { stubMethod(sandbox, prompts, 'confirm').resolves(true); try { - await doInstallationCodeSigningVerification({}, BLANK_PLUGIN, vConfig); + await doInstallationCodeSigningVerification(new Ux())({}, BLANK_PLUGIN, vConfig); } catch (e) { assert(e instanceof Error); const err = new Error("this test shouldn't fail."); @@ -708,7 +708,7 @@ describe('InstallationVerification Tests', () => { stubMethod(sandbox, prompts, 'confirm').resolves(true); try { - await doInstallationCodeSigningVerification({}, BLANK_PLUGIN, vConfig); + await doInstallationCodeSigningVerification(new Ux())({}, BLANK_PLUGIN, vConfig); } catch (e) { assert(e instanceof Error); const err = new Error("this test shouldn't fail."); @@ -733,7 +733,7 @@ describe('InstallationVerification Tests', () => { stubMethod(sandbox, prompts, 'confirm').resolves(true); try { - await doInstallationCodeSigningVerification({}, BLANK_PLUGIN, vConfig); + await doInstallationCodeSigningVerification(new Ux())({}, BLANK_PLUGIN, vConfig); } catch (e) { assert(e instanceof Error); const err = new Error("this test shouldn't fail."); diff --git a/yarn.lock b/yarn.lock index be6354a4..4313796c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1407,13 +1407,13 @@ "@inquirer/type" "^1.1.6" chalk "^4.1.2" -"@inquirer/confirm@^3.1.6", "@inquirer/confirm@^3.1.8": - version "3.1.8" - resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-3.1.8.tgz#db80f23f775d9b980c6de2425dde39f9786bf1d3" - integrity sha512-f3INZ+ca4dQdn+MQiq1yP/mOIR/Oc8BLRYuDh6ciToWd6z4W8yArfzjBCMQ0BPY8PcJKwZxGIt8Z6yNT32eSTw== +"@inquirer/confirm@^3.1.6", "@inquirer/confirm@^3.1.8", "@inquirer/confirm@^3.1.9": + version "3.1.9" + resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-3.1.9.tgz#1bc384bc8267827ec75d0684e189692bb4dda38b" + integrity sha512-UF09aejxCi4Xqm6N/jJAiFXArXfi9al52AFaSD+2uIHnhZGtd1d6lIGTRMPouVSJxbGEi+HkOWSYaiEY/+szUw== dependencies: - "@inquirer/core" "^8.2.1" - "@inquirer/type" "^1.3.2" + "@inquirer/core" "^8.2.2" + "@inquirer/type" "^1.3.3" "@inquirer/core@^6.0.0": version "6.0.0" @@ -1477,6 +1477,15 @@ ansi-escapes "^4.3.2" chalk "^4.1.2" +"@inquirer/password@^2.1.9": + version "2.1.9" + resolved "https://registry.yarnpkg.com/@inquirer/password/-/password-2.1.9.tgz#8d464c17cb67beabb309a039229ff1b0a6337294" + integrity sha512-QPtVcT12Fkn0TyuZJelR7QOtc5l1d/6pB5EfkHOivTzC6QTFxRCHl+Gx7Q3E2U/kgJeCCmDov6itDFggk9nkgA== + dependencies: + "@inquirer/core" "^8.2.2" + "@inquirer/type" "^1.3.3" + ansi-escapes "^4.3.2" + "@inquirer/select@^2.3.4": version "2.3.4" resolved "https://registry.yarnpkg.com/@inquirer/select/-/select-2.3.4.tgz#f1040402ceb51ca4eb7a08d457fba540f01ec6a8" @@ -1816,17 +1825,17 @@ wordwrap "^1.0.0" wrap-ansi "^7.0.0" -"@oclif/core@^4.0.0-beta.12", "@oclif/core@^4.0.0-beta.13": - version "4.0.0-beta.13" - resolved "https://registry.yarnpkg.com/@oclif/core/-/core-4.0.0-beta.13.tgz#0e0a6431cfe612db77073d2f9ef361f14e4090b8" - integrity sha512-ug8CZUCJphgetSZVgd4HQgyewlYVGGG1LIeFXGxjgYsjZ/f5I3nSCj7xpAMEDqjVD/lwmSujtVwa7tvEgLGICw== +"@oclif/core@^4", "@oclif/core@^4.0.0-beta.12", "@oclif/core@^4.0.0-beta.13": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@oclif/core/-/core-4.0.2.tgz#e6b15c4397e52b31fde9b7695f537c20b56634ed" + integrity sha512-0r+JwE1FbVlEYNQlLonMULnZb6rKR0RqT8eUgKeJTb5cILhsKUjlZf2NLIX4GP3SZrK8POwGGLcztmj42hZYiw== dependencies: ansi-escapes "^4.3.2" - ansis "^3.0.1" + ansis "^3.1.1" clean-stack "^3.0.1" cli-spinners "^2.9.2" cosmiconfig "^9.0.0" - debug "^4.3.4" + debug "^4.3.5" ejs "^3.1.10" get-package-type "^0.1.0" globby "^11.1.0" @@ -1834,7 +1843,7 @@ is-wsl "^2.2.0" minimatch "^9.0.4" string-width "^4.2.3" - supports-color "^9.4.0" + supports-color "^8" widest-line "^3.1.0" wordwrap "^1.0.0" wrap-ansi "^7.0.0" @@ -1948,16 +1957,16 @@ strip-ansi "6.0.1" ts-retry-promise "^0.8.1" -"@salesforce/core@^7.3.1", "@salesforce/core@^7.3.5", "@salesforce/core@^7.3.8", "@salesforce/core@^7.3.9": - version "7.3.9" - resolved "https://registry.yarnpkg.com/@salesforce/core/-/core-7.3.9.tgz#8abe2b3e2393989d11e92b7a6b96043fc9d5b9c8" - integrity sha512-eJqDiA5b7wU50Ee/xjmGzSnHrNVJ8S77B7enfX30gm7gxU3i3M3QeBdiV6XAOPLSIL96DseofP6Tv6c+rljlKA== +"@salesforce/core@^7.3.1", "@salesforce/core@^7.3.10", "@salesforce/core@^7.3.5", "@salesforce/core@^7.3.8", "@salesforce/core@^7.3.9": + version "7.3.10" + resolved "https://registry.yarnpkg.com/@salesforce/core/-/core-7.3.10.tgz#83da85c4e93ca625e2c13118aad9c1df2931bc0f" + integrity sha512-kEKoqkmhWNoiucAE3Ylv6FpC4iVgk4aE0dmcwSmNrMjxSbtjQJGUybprfO/itrLJv+56eM7/4FARQQ2gDbRzQQ== dependencies: "@jsforce/jsforce-node" "^3.2.0" "@salesforce/kit" "^3.1.1" "@salesforce/schemas" "^1.9.0" "@salesforce/ts-types" "^2.0.9" - ajv "^8.13.0" + ajv "^8.15.0" change-case "^4.1.2" faye "^1.4.0" form-data "^4.0.0" @@ -1965,21 +1974,21 @@ jsonwebtoken "9.0.2" jszip "3.10.1" pino "^8.21.0" - pino-abstract-transport "^1.1.0" + pino-abstract-transport "^1.2.0" pino-pretty "^10.3.1" proper-lockfile "^4.1.2" semver "^7.6.2" - ts-retry-promise "^0.7.1" + ts-retry-promise "^0.8.1" "@salesforce/dev-config@^4.1.0": version "4.1.0" resolved "https://registry.npmjs.org/@salesforce/dev-config/-/dev-config-4.1.0.tgz" integrity sha512-2iDDepiIwjXHS5IVY7pwv8jMo4xWosJ7p/UTj+lllpB/gnJiYLhjJPE4Z3FCGFKyvfg5jGaimCd8Ca6bLGsCQA== -"@salesforce/dev-scripts@^9.1.3": - version "9.1.3" - resolved "https://registry.yarnpkg.com/@salesforce/dev-scripts/-/dev-scripts-9.1.3.tgz#4a2fc111a8651582125443fd26bd8e842a1300f1" - integrity sha512-UpB/y8pe3hPgQTytC1+yBI2lsAp8mWQFh6OTUMIJsTamVq1fEX34ddJrxjm+F8SIOmV5E5CD0MwxeKOjKahJag== +"@salesforce/dev-scripts@^10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@salesforce/dev-scripts/-/dev-scripts-10.1.0.tgz#9bf765a5c8d46725e35d994fa32a1fe8f25019ba" + integrity sha512-8fItXnCR8G5n950Ymgrjc6CGJjR80376v6GIdjatv3AmMVJAB/GerglcNF/LIJjBXB5OLxiTLAjQdPCvWqBL1g== dependencies: "@commitlint/cli" "^17.1.2" "@commitlint/config-conventional" "^17.8.1" @@ -2070,7 +2079,25 @@ resolved "https://registry.yarnpkg.com/@salesforce/schemas/-/schemas-1.9.0.tgz#ba477a112653a20b4edcf989c61c57bdff9aa3ca" integrity sha512-LiN37zG5ODT6z70sL1fxF7BQwtCX9JOWofSU8iliSNIM+WDEeinnoFtVqPInRSNt8I0RiJxIKCrqstsmQRBNvA== -"@salesforce/sf-plugins-core@^9.0.10", "@salesforce/sf-plugins-core@^9.0.12", "@salesforce/sf-plugins-core@^9.0.5", "@salesforce/sf-plugins-core@^9.0.7": +"@salesforce/sf-plugins-core@^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@salesforce/sf-plugins-core/-/sf-plugins-core-10.0.0.tgz#712b38cf101ab95866e757c2738ffc3ddd27ded5" + integrity sha512-Y18aDrz376Ekza45nfCjpyiI+np1oY9Cc7DxNAYiP37c0lstTajVsgz6wvDvt6p6QGEX//nnqcz/NaMlry/INw== + dependencies: + "@inquirer/confirm" "^3.1.9" + "@inquirer/password" "^2.1.9" + "@oclif/core" "^4" + "@salesforce/core" "^7.3.10" + "@salesforce/kit" "^3.1.2" + "@salesforce/ts-types" "^2.0.9" + ansis "^3.1.1" + cli-progress "^3.12.0" + natural-orderby "^3.0.2" + slice-ansi "^7.1.0" + string-width "^7.1.0" + terminal-link "^3.0.0" + +"@salesforce/sf-plugins-core@^9.0.10", "@salesforce/sf-plugins-core@^9.0.5", "@salesforce/sf-plugins-core@^9.0.7": version "9.0.12" resolved "https://registry.yarnpkg.com/@salesforce/sf-plugins-core/-/sf-plugins-core-9.0.12.tgz#8bcacdb412c3570f66220acd6346636d86f81d62" integrity sha512-KtZErzUdBrDDONpE6ZbW3V5WfBwUwo07Snttnu4IFs82rbsOkyCG/m02b+mbnGBrwWWy7auZW4e2ciRrmbZGDQ== @@ -3083,10 +3110,10 @@ ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.11.0, ajv@^8.13.0: - version "8.13.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.13.0.tgz#a3939eaec9fb80d217ddf0c3376948c023f28c91" - integrity sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA== +ajv@^8.11.0, ajv@^8.15.0: + version "8.16.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.16.0.tgz#22e2a92b94f005f7e0f9c9d39652ef0b8f6f0cb4" + integrity sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw== dependencies: fast-deep-equal "^3.1.3" json-schema-traverse "^1.0.0" @@ -3105,6 +3132,13 @@ ansi-escapes@^4.3.1, ansi-escapes@^4.3.2: dependencies: type-fest "^0.21.3" +ansi-escapes@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-5.0.0.tgz#b6a0caf0eef0c41af190e9a749e0c00ec04bb2a6" + integrity sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA== + dependencies: + type-fest "^1.0.2" + ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" @@ -3134,9 +3168,9 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0, ansi-styles@^4.3.0: dependencies: color-convert "^2.0.1" -ansi-styles@^6.1.0: +ansi-styles@^6.1.0, ansi-styles@^6.2.1: version "6.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== ansicolors@~0.3.2: @@ -3144,7 +3178,7 @@ ansicolors@~0.3.2: resolved "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz" integrity sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg== -ansis@^3.0.1, ansis@^3.2.0: +ansis@^3.1.1, ansis@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansis/-/ansis-3.2.0.tgz#0e050c5be94784f32ffdac4b84fccba064aeae4b" integrity sha512-Yk3BkHH9U7oPyCN3gL5Tc7CpahG/+UFv/6UG03C311Vy9lzRmA5uoxDTpU9CO3rGHL6KzJz/pdDeXZCZ5Mu/Sg== @@ -4282,6 +4316,11 @@ emitter-listener@^1.0.1, emitter-listener@^1.1.1: dependencies: shimmer "^1.2.0" +emoji-regex@^10.3.0: + version "10.3.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.3.0.tgz#76998b9268409eb3dae3de989254d456e70cfe23" + integrity sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" @@ -4988,6 +5027,11 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-east-asian-width@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz#5e6ebd9baee6fb8b7b6bd505221065f0cd91f64e" + integrity sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA== + get-func-name@^2.0.1, get-func-name@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz" @@ -5652,6 +5696,13 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-fullwidth-code-point@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz#9609efced7c2f97da7b60145ef481c787c7ba704" + integrity sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA== + dependencies: + get-east-asian-width "^1.0.0" + is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" @@ -6806,6 +6857,11 @@ natural-orderby@^2.0.3: resolved "https://registry.npmjs.org/natural-orderby/-/natural-orderby-2.0.3.tgz" integrity sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q== +natural-orderby@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/natural-orderby/-/natural-orderby-3.0.2.tgz#1b874d685fbd68beab2c6e7d14f298e03d631ec3" + integrity sha512-x7ZdOwBxZCEm9MM7+eQCjkrNLrW3rkBKNHVr78zbtqnMGVNlnDi6C/eUEYgxHNrcbu0ymvjzcwIL/6H1iHri9g== + negotiator@^0.6.3: version "0.6.3" resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" @@ -7525,7 +7581,7 @@ picomatch@^3.0.1: resolved "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz" integrity sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag== -pino-abstract-transport@^1.0.0, pino-abstract-transport@^1.1.0, pino-abstract-transport@^1.2.0: +pino-abstract-transport@^1.0.0, pino-abstract-transport@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz#97f9f2631931e242da531b5c66d3079c12c9d1b5" integrity sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q== @@ -8293,6 +8349,14 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" +slice-ansi@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-7.1.0.tgz#cd6b4655e298a8d1bdeb04250a433094b347b9a9" + integrity sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg== + dependencies: + ansi-styles "^6.2.1" + is-fullwidth-code-point "^5.0.0" + smart-buffer@^4.2.0: version "4.2.0" resolved "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz" @@ -8474,6 +8538,15 @@ string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" +string-width@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.1.0.tgz#d994252935224729ea3719c49f7206dc9c46550a" + integrity sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw== + dependencies: + emoji-regex "^10.3.0" + get-east-asian-width "^1.0.0" + strip-ansi "^7.1.0" + string.prototype.trim@^1.2.8: version "1.2.8" resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz" @@ -8529,9 +8602,9 @@ strip-ansi@6.0.1, strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-ansi@^7.0.1: +strip-ansi@^7.0.1, strip-ansi@^7.1.0: version "7.1.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: ansi-regex "^6.0.1" @@ -8568,9 +8641,9 @@ strnum@^1.0.5: resolved "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz" integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== -supports-color@8.1.1, supports-color@^8.1.1: +supports-color@8.1.1, supports-color@^8, supports-color@^8.1.1: version "8.1.1" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" @@ -8619,6 +8692,14 @@ tar@^6.1.11, tar@^6.1.2, tar@^6.2.1: mkdirp "^1.0.3" yallist "^4.0.0" +terminal-link@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-3.0.0.tgz#91c82a66b52fc1684123297ce384429faf72ac5c" + integrity sha512-flFL3m4wuixmf6IfhFJd1YPiLiMuxEc8uHRM1buzIeZPm22Au2pDqBJQgdo7n1WfPU1ONFGv7YDwpFBmHGF6lg== + dependencies: + ansi-escapes "^5.0.0" + supports-hyperlinks "^2.2.0" + test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" @@ -8741,11 +8822,6 @@ ts-node@^10.8.1, ts-node@^10.9.2: v8-compile-cache-lib "^3.0.1" yn "3.1.1" -ts-retry-promise@^0.7.1: - version "0.7.1" - resolved "https://registry.npmjs.org/ts-retry-promise/-/ts-retry-promise-0.7.1.tgz" - integrity sha512-NhHOCZ2AQORvH42hOPO5UZxShlcuiRtm7P2jIq2L2RY3PBxw2mLnUsEdHrIslVBFya1v5aZmrR55lWkzo13LrQ== - ts-retry-promise@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/ts-retry-promise/-/ts-retry-promise-0.8.1.tgz#ba90eb07cb03677fcbf78fe38e94c9183927e154" @@ -8824,6 +8900,11 @@ type-fest@^0.8.0, type-fest@^0.8.1: resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== +type-fest@^1.0.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" + integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== + typed-array-buffer@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz"