diff --git a/bin/dev.js b/bin/dev.js index 7e1768e2..b6b0aa61 100755 --- a/bin/dev.js +++ b/bin/dev.js @@ -1,9 +1,11 @@ #!/usr/bin/env ts-node async function main() { - const oclif = await import('@oclif/core'); - oclif.settings.performanceEnabled = true; - await oclif.execute({ development: true, dir: import.meta.url }); + const { settings } = await import('@oclif/core/settings'); + const { execute } = await import('@oclif/core/execute'); + + settings.performanceEnabled = true; + await execute({ development: true, dir: import.meta.url }); } await main(); diff --git a/bin/run.js b/bin/run.js index 4a0d3bb9..280d4a82 100755 --- a/bin/run.js +++ b/bin/run.js @@ -3,30 +3,13 @@ // Pre-process/prune flags before creating or running the actual CLI (await import('../dist/flags.js')).preprocessCliFlags(process); -const oclif = await import('@oclif/core'); -const { createRequire } = await import('module'); -const pjson = createRequire(import.meta.url)('../package.json'); +// Since the CLI is a single process, we can have a larger amount of max listeners since +// the process gets shut down. Don't set it to 0 (no limit) since we should still be aware +// of rogue event listeners +process.setMaxListeners(parseInt(process.env.SF_MAX_EVENT_LISTENERS, 10) || 1000); -const cli = await import('../dist/cli.js'); - -async function main() { - // Since the CLI is a single process, we can have a larger amount of max listeners since - // the process gets shut down. Don't set it to 0 (no limit) since we should still be aware - // of rouge event listeners - process.setMaxListeners(parseInt(process.env.SF_MAX_EVENT_LISTENERS, 10) || 1000); - - // Don't let other plugins override the CLI specified max listener count - process.setMaxListeners = () => {}; +// Don't let other plugins override the CLI specified max listener count +process.setMaxListeners = () => {}; - cli - .create({ version: pjson.version, bin: pjson.oclif.bin, channel: 'stable' }) - .run() - .then(async () => { - await oclif.flush(); - }) - .catch(async (err) => { - await oclif.handle(err); - }); -} - -await main(); +const cli = await import('../dist/cli.js'); +await cli.run(); diff --git a/package.json b/package.json index 603f9392..3ae28636 100644 --- a/package.json +++ b/package.json @@ -139,7 +139,7 @@ }, "dependencies": { "@inquirer/select": "^1.3.1", - "@oclif/core": "3.26.9", + "@oclif/core": "4.0.0", "@oclif/plugin-autocomplete": "3.1.2", "@oclif/plugin-commands": "4.0.2", "@oclif/plugin-help": "6.1.0", @@ -169,12 +169,11 @@ "@salesforce/plugin-templates": "56.2.9", "@salesforce/plugin-trust": "3.7.4", "@salesforce/plugin-user": "3.5.11", - "@salesforce/sf-plugins-core": "9.1.1", - "chalk": "^5.3.0", - "debug": "^4.3.4", - "strip-ansi": "^7.1.0" + "@salesforce/sf-plugins-core": "10.0.0", + "ansis": "^3.2.0" }, "pinnedDependencies": [ + "@oclif/core", "@oclif/plugin-autocomplete", "@oclif/plugin-commands", "@oclif/plugin-help", @@ -253,7 +252,6 @@ "@salesforce/plugin-release-management": "^5.4.7", "@salesforce/ts-sinon": "^1.4.19", "@salesforce/ts-types": "^2.0.9", - "@types/debug": "^4.1.12", "aws-sdk": "^2.1631.0", "oclif": "^4.12.3", "ts-node": "^10.9.2", diff --git a/src/cli.ts b/src/cli.ts index dc0aef24..6b6160fa 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -8,12 +8,11 @@ import { platform, arch, release } from 'node:os'; import { resolve } from 'node:path'; import { fileURLToPath } from 'node:url'; -import { Config, Interfaces, run as oclifRun, settings } from '@oclif/core'; -import { set } from '@salesforce/kit'; -import Debug from 'debug'; -import { default as nodeEnv, Env } from './util/env.js'; - -const debug = Debug('sf'); +import { execute } from '@oclif/core/execute'; +import { Config } from '@oclif/core/config'; +import Interfaces from '@oclif/core/interfaces'; +import NodeEnv, { Env } from './util/env.js'; +import { sfStartupLogger, logger } from './logger.js'; const envVars = [ ...new Set([ @@ -41,14 +40,6 @@ export const UPDATE_DISABLED_DEMO = 'Manual and automatic CLI updates have been disabled in DEMO mode. ' + 'To check for a new version, unset the environment variable SF_ENV.'; -export function configureUpdateSites(config: Interfaces.Config, env = nodeEnv): void { - const npmRegistry = env.getNpmRegistryOverride(); - if (npmRegistry) { - // Override config value if set via envar - set(config, 'pjson.oclif.warn-if-update-available.registry', npmRegistry); - } -} - export function configureAutoUpdate(envars: Env): void { if (envars.isDemoMode()) { // Disable autoupdates in demo mode @@ -76,11 +67,12 @@ export function configureAutoUpdate(envars: Env): void { } } -function debugCliInfo(version: string, channel: string, env: Env, config: Interfaces.Config): void { +function debugCliInfo(env: Env, config: Interfaces.Config): void { function debugSection(section: string, items: Array<[string, string]>): void { const pad = 25; - debug('%s:', section.padStart(pad)); - items.forEach(([name, value]) => debug('%s: %s', name.padStart(pad), value)); + const header = `### ${section} ###`; + sfStartupLogger.debug('%s', header.padStart(pad)); + items.forEach(([name, value]) => sfStartupLogger.debug('%s: %s', name.padStart(pad), value)); } debugSection('OS', [ @@ -93,8 +85,8 @@ function debugCliInfo(version: string, channel: string, env: Env, config: Interf debugSection('NODE', [['version', process.versions.node]]); debugSection('CLI', [ - ['version', version], - ['channel', channel], + ['version', config.version], + ['channel', config.channel], ['bin', config.bin], ['data', config.dataDir], ['cache', config.cacheDir], @@ -112,33 +104,15 @@ function debugCliInfo(version: string, channel: string, env: Env, config: Interf ); } -type CreateOptions = { - version: string; - bin: string | undefined; - channel: string; - run?: typeof oclifRun; - env?: typeof nodeEnv; -}; - -export function create({ version, bin, channel, run, env }: CreateOptions): { run: () => Promise } { - settings.performanceEnabled = true; - const root = resolve(fileURLToPath(import.meta.url), '..'); - const args = process.argv.slice(2); - const environment = env ?? nodeEnv; - return { - async run(): Promise { - const config = new Config({ - name: bin, - root, - version, - channel, - }); - await config.load(); - configureUpdateSites(config, environment); - configureAutoUpdate(environment); - debugCliInfo(version, channel, environment, config); - // Example of how run is used in a test https://github.com/salesforcecli/cli/pull/171/files#diff-1deee0a575599b2df117c280da319f7938aaf6fdb0c04bcdbde769dbf464be69R46 - return run ? run(args, config) : oclifRun(args, config); - }, - }; +export async function run(): Promise { + configureAutoUpdate(NodeEnv); + const config = await Config.load({ + root: resolve(fileURLToPath(import.meta.url), '..'), + logger, + enablePerf: true, + }); + debugCliInfo(NodeEnv, config); + return execute({ + loadOptions: config, + }); } diff --git a/src/help/sfCommandHelp.ts b/src/help/sfCommandHelp.ts index 97b49bf3..059f9369 100644 --- a/src/help/sfCommandHelp.ts +++ b/src/help/sfCommandHelp.ts @@ -4,7 +4,9 @@ * Licensed under the BSD 3-Clause license. * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause */ -import { Command, CommandHelp, HelpSection, HelpSectionRenderer, Interfaces } from '@oclif/core'; +import { CommandHelp, HelpSection, HelpSectionRenderer } from '@oclif/core/help'; +import { Command } from '@oclif/core/command'; +import Interfaces from '@oclif/core/interfaces'; type SectionType = { header: string; generate: HelpSectionRenderer }; export class SfCommandHelp extends CommandHelp { diff --git a/src/help/sfHelp.ts b/src/help/sfHelp.ts index ac253483..8b41b7f6 100644 --- a/src/help/sfHelp.ts +++ b/src/help/sfHelp.ts @@ -4,11 +4,16 @@ * Licensed under the BSD 3-Clause license. * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause */ -import { Command, CommandHelp, Help, Interfaces, toConfiguredId } from '@oclif/core'; -import stripAnsi from 'strip-ansi'; -import chalk from 'chalk'; + +import { Command } from '@oclif/core/command'; +import { CommandHelp, Help } from '@oclif/core/help'; +import Interfaces from '@oclif/core/interfaces'; +import { toConfiguredId } from '@oclif/core/util/ids'; +import { Ansis } from 'ansis'; import { SfCommandHelp } from './sfCommandHelp.js'; +const ansis = new Ansis(); + export default class SfHelp extends Help { protected CommandHelpClass: typeof CommandHelp = SfCommandHelp; protected commandHelpClass: SfCommandHelp | undefined; @@ -62,9 +67,9 @@ export default class SfHelp extends Help { protected log(...args: string[]): void { const formatted = args.map((arg) => { let formattedArg = arg.slice(); - const matches = stripAnsi(formattedArg).match(this.commandIdRegex) ?? []; + const matches = ansis.strip(formattedArg).match(this.commandIdRegex) ?? []; for (const match of matches) { - formattedArg = formattedArg.replaceAll(match, chalk.dim(match)); + formattedArg = formattedArg.replaceAll(match, ansis.dim(match)); } return formattedArg; diff --git a/src/hooks/display-release-notes.ts b/src/hooks/display-release-notes.ts index b7be201b..1b4201df 100644 --- a/src/hooks/display-release-notes.ts +++ b/src/hooks/display-release-notes.ts @@ -4,18 +4,19 @@ * Licensed under the BSD 3-Clause license. * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause */ -import { Hook, ux } from '@oclif/core'; +import type { Hook } from '@oclif/core/hooks'; +import ux from '@oclif/core/ux'; -export const hook: Hook<'update'> = async function ({ config }) { +export const hook: Hook.Update = async function ({ config }) { if (process.env.SF_HIDE_RELEASE_NOTES === 'true') return; try { return await config.runCommand('whatsnew', ['--hook']); } catch (err) { const error = err as Error; - ux.log('NOTE: This error can be ignored in CI and may be silenced in the future'); - ux.log('- Set the SF_HIDE_RELEASE_NOTES env var to "true" to skip this script\n'); - ux.log(error.message); + ux.stdout('NOTE: This error can be ignored in CI and may be silenced in the future'); + ux.stdout('- Set the SF_HIDE_RELEASE_NOTES env var to "true" to skip this script\n'); + ux.stdout(error.message); } }; diff --git a/src/hooks/incomplete.ts b/src/hooks/incomplete.ts index 63db13e5..768f894b 100644 --- a/src/hooks/incomplete.ts +++ b/src/hooks/incomplete.ts @@ -5,8 +5,11 @@ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause */ -import * as os from 'node:os'; -import { Command, Hook, toConfiguredId, toStandardizedId, Interfaces, loadHelpClass } from '@oclif/core'; +import os from 'node:os'; +import { Command } from '@oclif/core/command'; +import { type Hook } from '@oclif/core/hooks'; +import { toConfiguredId, toStandardizedId } from '@oclif/core/util/ids'; +import Interfaces from '@oclif/core/interfaces'; function buildChoices( matches: Command.Loadable[], @@ -51,6 +54,7 @@ const hook: Hook.CommandIncomplete = async function ({ config, matches, argv }) ); if (argv.includes('--help') || argv.includes('-h')) { + const { loadHelpClass } = await import('@oclif/core/help'); const Help = await loadHelpClass(config); // eslint-disable-next-line @typescript-eslint/no-unsafe-argument const help = new Help(config, config.pjson.helpOptions); diff --git a/src/hooks/pluginsPreinstall.ts b/src/hooks/pluginsPreinstall.ts index c3c322cf..36b0376f 100644 --- a/src/hooks/pluginsPreinstall.ts +++ b/src/hooks/pluginsPreinstall.ts @@ -5,7 +5,7 @@ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause */ -import { Hook, Errors } from '@oclif/core'; +import { type Hook } from '@oclif/core/hooks'; const hook: Hook.PluginsPreinstall = async function (options) { const verifySignHookResult = await this.config.runHook('plugins:preinstall:verify:signature', options); @@ -14,7 +14,8 @@ const hook: Hook.PluginsPreinstall = async function (options) { ); if (pluginTrustFailure !== undefined) { - await Errors.handle(pluginTrustFailure.error); + const { handle } = await import('@oclif/core/handle'); + await handle(pluginTrustFailure.error); } }; diff --git a/src/hooks/preparse.ts b/src/hooks/preparse.ts index d9cb6721..14fa593f 100644 --- a/src/hooks/preparse.ts +++ b/src/hooks/preparse.ts @@ -4,9 +4,9 @@ * Licensed under the BSD 3-Clause license. * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause */ -import type { Hook } from '@oclif/core'; +import type { Hook } from '@oclif/core/hooks'; -const hook: Hook<'preparse'> = async function ({ argv, options, context }) { +const hook: Hook.Preparse = async function ({ argv, options, context }) { // Skip this hook if command does not have a --flags-dir flag or if it is not present in argv if (!argv.includes('--flags-dir') || !options.flags?.['flags-dir']) return argv; const flagsDir = argv[argv.indexOf('--flags-dir') + 1]; diff --git a/src/hooks/prerun.ts b/src/hooks/prerun.ts index a6c994cc..dd1ad308 100644 --- a/src/hooks/prerun.ts +++ b/src/hooks/prerun.ts @@ -5,7 +5,7 @@ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause */ -import { Hook, ux } from '@oclif/core'; +import { type Hook } from '@oclif/core/hooks'; // eslint-disable-next-line @typescript-eslint/require-await const hook: Hook.Prerun = async function ({ Command, config }) { @@ -21,6 +21,7 @@ const hook: Hook.Prerun = async function ({ Command, config }) { if (!specifiedVersion) return; if (plugin.version !== specifiedVersion) { + const { ux } = await import('@oclif/core/ux'); ux.warn( `Plugin ${plugin.name} (${plugin.version}) differs from the version specified by ${config.bin} (${specifiedVersion})` ); diff --git a/src/logger.ts b/src/logger.ts new file mode 100644 index 00000000..a6dbdf89 --- /dev/null +++ b/src/logger.ts @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2023, salesforce.com, inc. + * All rights reserved. + * Licensed under the BSD 3-Clause license. + * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + */ +import { format } from 'node:util'; +import Interfaces from '@oclif/core/interfaces'; +import { Logger } from '@salesforce/core/logger'; + +const customLogger = (namespace: string): Interfaces.Logger => { + const sfLogger = new Logger(namespace); + return { + child: (ns: string, delimiter?: string) => customLogger(`${namespace}${delimiter ?? ':'}${ns}`), + debug: (formatter: unknown, ...args: unknown[]) => sfLogger.debug(format(formatter, ...args)), + error: (formatter: unknown, ...args: unknown[]) => sfLogger.error(format(formatter, ...args)), + info: (formatter: unknown, ...args: unknown[]) => sfLogger.info(format(formatter, ...args)), + trace: (formatter: unknown, ...args: unknown[]) => sfLogger.trace(format(formatter, ...args)), + warn: (formatter: unknown, ...args: unknown[]) => sfLogger.warn(format(formatter, ...args)), + namespace, + }; +}; + +export const logger = customLogger('sf:oclif'); +export const sfStartupLogger = customLogger('sf-startup'); diff --git a/src/util/env.ts b/src/util/env.ts index c0d6427e..415e59f8 100644 --- a/src/util/env.ts +++ b/src/util/env.ts @@ -45,14 +45,6 @@ export class Env extends EnvVars { return this.getBoolean(Env.SF_INSTALLER); } - public getNpmRegistryOverride(): string | undefined { - return this.getString(Env.SF_NPM_REGISTRY); - } - - public setNpmRegistryOverride(value: string): void { - return this.setString(Env.SF_NPM_REGISTRY, value); - } - public normalizeAutoupdateDisabled(): void { // Ensure that the legacy envar always causes the oclif counterpart to be set // see https://github.com/oclif/plugin-update/blob/3946fb296a0a95544ab6364b36a1f7422c8aeddf/src/hooks/init.ts#L22 diff --git a/test/cli.test.ts b/test/cli.test.ts index 40cab939..a272e80f 100644 --- a/test/cli.test.ts +++ b/test/cli.test.ts @@ -6,16 +6,9 @@ */ // the below, there's lots of un-awaited promises for testing -import { Config, Interfaces } from '@oclif/core'; -import { stubInterface } from '@salesforce/ts-sinon'; -import { getString } from '@salesforce/ts-types'; import { expect } from 'chai'; -import sinon from 'sinon'; -import { Doctor } from '@salesforce/plugin-info'; import { configureAutoUpdate, - configureUpdateSites, - create, UPDATE_DISABLED_DEMO, UPDATE_DISABLED_INSTALLER, UPDATE_DISABLED_NPM, @@ -24,42 +17,6 @@ import { import { Env } from '../src/util/env.js'; describe('cli', () => { - const sandbox = sinon.createSandbox(); - - let doctorInitStub: sinon.SinonStub; - - beforeEach(() => { - doctorInitStub = sandbox.stub(Doctor, 'init'); - }); - - afterEach(() => { - sandbox.restore(); - }); - - describe('create', () => { - it('should create a runnable CLI instance', async () => { - sandbox.stub(Config.prototype, 'load').callsFake(() => Promise.resolve()); - let config: Interfaces.LoadOptions; - const exec = async (argv?: string[], opts?: Interfaces.LoadOptions): Promise => { - config = opts; - }; - const env = new Env({}); - await create({ - version: 'test', - channel: 'test', - bin: 'test', - run: exec, - env, - }).run(); - expect(config).to.exist; - expect(config).to.have.property('options'); - expect(config).to.have.nested.property('options.version').and.equal('test'); - expect(config).to.have.nested.property('options.channel').and.equal('test'); - - expect(doctorInitStub.called).to.be.false; - }); - }); - describe('env', () => { let env: Env; @@ -67,14 +24,6 @@ describe('cli', () => { env = new Env({}); }); - it('should set the npm the oclif config if overridden in an envar', async () => { - const npmRegistry = 'http://example.com:9000/npm'; - const config = stubInterface(sandbox); - env.setNpmRegistryOverride(npmRegistry); - configureUpdateSites(config, env); - expect(getString(config, 'pjson.oclif.warn-if-update-available.registry')).to.equal(npmRegistry); - }); - it('should default to autoupdate disabled for local dev or npm installs', () => { configureAutoUpdate(env); diff --git a/test/hooks/preparse.test.ts b/test/hooks/preparse.test.ts index 85aa1387..2755e02b 100644 --- a/test/hooks/preparse.test.ts +++ b/test/hooks/preparse.test.ts @@ -9,7 +9,8 @@ import fs from 'node:fs/promises'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; -import { Config, Flags } from '@oclif/core'; +import { Config } from '@oclif/core/config'; +import Flags from '@oclif/core/flags'; import { expect } from 'chai'; import sinon from 'sinon'; diff --git a/yarn.lock b/yarn.lock index a3855d70..7813399d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2101,7 +2101,30 @@ wordwrap "^1.0.0" wrap-ansi "^7.0.0" -"@oclif/core@3.26.9", "@oclif/core@^3.26.2", "@oclif/core@^3.26.3", "@oclif/core@^3.26.4", "@oclif/core@^3.26.5", "@oclif/core@^3.26.6": +"@oclif/core@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@oclif/core/-/core-4.0.0.tgz#c47783c9803cb440e3fd325157437400765eae3f" + integrity sha512-BMWGvJrzn5PnG60gTNFEvaBT0jvGNiJCKN4aJBYP6E7Bq/Y5XPnxPrkj7ZZs/Jsd1oVn6K/JRmF6gWpv72DOew== + dependencies: + ansi-escapes "^4.3.2" + ansis "^3.1.1" + clean-stack "^3.0.1" + cli-spinners "^2.9.2" + cosmiconfig "^9.0.0" + debug "^4.3.5" + ejs "^3.1.10" + get-package-type "^0.1.0" + globby "^11.1.0" + indent-string "^4.0.0" + is-wsl "^2.2.0" + minimatch "^9.0.4" + string-width "^4.2.3" + supports-color "^8" + widest-line "^3.1.0" + wordwrap "^1.0.0" + wrap-ansi "^7.0.0" + +"@oclif/core@^3.26.2", "@oclif/core@^3.26.3", "@oclif/core@^3.26.4", "@oclif/core@^3.26.5", "@oclif/core@^3.26.6": version "3.26.9" resolved "https://registry.yarnpkg.com/@oclif/core/-/core-3.26.9.tgz#fccf176f390408b2170d1970ded304b4b20b6808" integrity sha512-yB5Yxd62DsHqqCK/60L8IiGpTRIU4J+fzCqfbPRiIYE5+agfN63kppaM+TbqyMBdsnt/PQOnYD8Bhs1quUr6fg== @@ -2550,16 +2573,16 @@ strip-ansi "6.0.1" ts-retry-promise "^0.8.1" -"@salesforce/core@^7.0.0", "@salesforce/core@^7.2.0", "@salesforce/core@^7.3.1", "@salesforce/core@^7.3.5", "@salesforce/core@^7.3.6", "@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.0.0", "@salesforce/core@^7.2.0", "@salesforce/core@^7.3.1", "@salesforce/core@^7.3.10", "@salesforce/core@^7.3.5", "@salesforce/core@^7.3.6", "@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" @@ -2567,11 +2590,11 @@ 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" @@ -2925,7 +2948,25 @@ resolved "https://registry.yarnpkg.com/@salesforce/schemas/-/schemas-1.9.0.tgz#ba477a112653a20b4edcf989c61c57bdff9aa3ca" integrity sha512-LiN37zG5ODT6z70sL1fxF7BQwtCX9JOWofSU8iliSNIM+WDEeinnoFtVqPInRSNt8I0RiJxIKCrqstsmQRBNvA== -"@salesforce/sf-plugins-core@9.1.1", "@salesforce/sf-plugins-core@^9.0.10", "@salesforce/sf-plugins-core@^9.0.11", "@salesforce/sf-plugins-core@^9.0.12", "@salesforce/sf-plugins-core@^9.0.13", "@salesforce/sf-plugins-core@^9.0.14", "@salesforce/sf-plugins-core@^9.0.7", "@salesforce/sf-plugins-core@^9.1.0", "@salesforce/sf-plugins-core@^9.1.1": +"@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.11", "@salesforce/sf-plugins-core@^9.0.12", "@salesforce/sf-plugins-core@^9.0.13", "@salesforce/sf-plugins-core@^9.0.14", "@salesforce/sf-plugins-core@^9.0.7", "@salesforce/sf-plugins-core@^9.1.0", "@salesforce/sf-plugins-core@^9.1.1": version "9.1.1" resolved "https://registry.yarnpkg.com/@salesforce/sf-plugins-core/-/sf-plugins-core-9.1.1.tgz#8818fdb23e0f174d9e6dded0cf34a88be5e3cc44" integrity sha512-5d4vGLqb1NZoHvDpuTu96TsFg/lexdnQNWC0h7GhOqxikJBpxk6P1DEbk9HrZWL18Gs1YXO9OCj2g8nKqbIC/Q== @@ -3750,13 +3791,6 @@ dependencies: "@types/node" "*" -"@types/debug@^4.1.12": - version "4.1.12" - resolved "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz" - integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== - dependencies: - "@types/ms" "*" - "@types/expect@^1.20.4": version "1.20.4" resolved "https://registry.npmjs.org/@types/expect/-/expect-1.20.4.tgz" @@ -3843,11 +3877,6 @@ resolved "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.6.tgz" integrity sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg== -"@types/ms@*": - version "0.7.34" - resolved "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz" - integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== - "@types/mute-stream@^0.0.1": version "0.0.1" resolved "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.1.tgz" @@ -4126,10 +4155,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" @@ -4148,6 +4177,13 @@ ansi-escapes@^4.2.1, 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" @@ -4177,7 +4213,7 @@ 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" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== @@ -5923,6 +5959,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" @@ -6760,6 +6801,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" @@ -7612,6 +7658,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-generator-function@^1.0.7: version "1.0.10" resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz" @@ -9069,6 +9122,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.2, negotiator@^0.6.3: version "0.6.3" resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" @@ -10161,7 +10219,7 @@ pify@^4.0.1: resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== -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== @@ -11090,6 +11148,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" @@ -11329,16 +11395,7 @@ stream-transform@^2.1.3: dependencies: mixme "^0.5.1" -"string-width-cjs@npm: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== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -11356,6 +11413,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.9: version "1.2.9" resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz" @@ -11403,14 +11469,7 @@ stringify-package@^1.0.1: resolved "https://registry.npmjs.org/stringify-package/-/stringify-package-1.0.1.tgz" integrity sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg== -"strip-ansi-cjs@npm: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== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@6.0.1, strip-ansi@^6, strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@6.0.1, strip-ansi@^6, 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== @@ -11550,6 +11609,14 @@ tar@^6.0.2, tar@^6.1.0, tar@^6.1.11, tar@^6.1.2, tar@^6.2.0, 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" @@ -11697,11 +11764,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" @@ -11802,6 +11864,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.2: version "1.0.2" resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz" @@ -12239,7 +12306,7 @@ workerpool@6.2.1: resolved "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -12257,15 +12324,6 @@ wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz"