diff --git a/package.json b/package.json index 535be7f7d..376e76159 100644 --- a/package.json +++ b/package.json @@ -5,15 +5,16 @@ "author": "Salesforce", "bugs": "https://github.com/forcedotcom/cli/issues", "dependencies": { - "@oclif/core": "^3.26.6", + "@oclif/core": "^4", "@salesforce/apex-node": "^6.0.0", "@salesforce/core": "^7.3.9", "@salesforce/kit": "^3.1.2", - "@salesforce/sf-plugins-core": "^9.1.1", + "@salesforce/sf-plugins-core": "^10.0.0", "@salesforce/source-deploy-retrieve": "^11.6.2", "@salesforce/source-tracking": "^6.3.3", "@salesforce/ts-types": "^2.0.9", "chalk": "^5.3.0", + "cli-progress": "^3.12.0", "got": "^13.0.0", "proxy-agent": "^6.3.1" }, @@ -21,11 +22,12 @@ "@oclif/plugin-command-snapshot": "^5.1.7", "@oclif/plugin-help": "^6.1.0", "@salesforce/cli-plugins-testkit": "^5.3.5", - "@salesforce/dev-scripts": "^9.1.3", + "@salesforce/dev-scripts": "^10.1.0", "@salesforce/plugin-command-reference": "^3.0.86", "@salesforce/source-testkit": "^2.2.23", "@salesforce/ts-sinon": "1.4.19", "@types/archiver": "^5.3.2", + "@types/cli-progress": "^3.11.5", "archiver": "^5.3.2", "chai-each": "^0.0.1", "cross-env": "^7.0.3", diff --git a/src/commands/force/mdapi/deploy.ts b/src/commands/force/mdapi/deploy.ts index bcda5592c..e198f1bac 100644 --- a/src/commands/force/mdapi/deploy.ts +++ b/src/commands/force/mdapi/deploy.ts @@ -25,7 +25,6 @@ import { } from '../../../deployCommand.js'; import { DeployCommandAsyncResult } from '../../../formatters/source/deployAsyncResultFormatter.js'; import { MdDeployResult, MdDeployResultFormatter } from '../../../formatters/mdapi/mdDeployResultFormatter.js'; -import { ProgressFormatter } from '../../../formatters/progressFormatter.js'; import { DeployProgressBarFormatter } from '../../../formatters/deployProgressBarFormatter.js'; import { DeployProgressStatusFormatter } from '../../../formatters/deployProgressStatusFormatter.js'; import { MdDeployAsyncResultFormatter } from '../../../formatters/mdapi/mdDeployAsyncResultFormatter.js'; @@ -205,8 +204,8 @@ export class Deploy extends DeployCommand { if (!this.isAsync) { if (!this.jsonEnabled()) { - const progressFormatter: ProgressFormatter = env.getBoolean('SF_USE_PROGRESS_BAR', true) - ? new DeployProgressBarFormatter(new Ux({ jsonEnabled: this.jsonEnabled() })) + const progressFormatter = env.getBoolean('SF_USE_PROGRESS_BAR', true) + ? new DeployProgressBarFormatter() : new DeployProgressStatusFormatter(new Ux({ jsonEnabled: this.jsonEnabled() })); progressFormatter.progress(deploy); } diff --git a/src/commands/force/mdapi/deploy/report.ts b/src/commands/force/mdapi/deploy/report.ts index 85a78497c..581402e9d 100644 --- a/src/commands/force/mdapi/deploy/report.ts +++ b/src/commands/force/mdapi/deploy/report.ts @@ -19,7 +19,6 @@ import { import { Interfaces } from '@oclif/core'; import { MdDeployResult, MdDeployResultFormatter } from '../../../../formatters/mdapi/mdDeployResultFormatter.js'; import { DeployCommand, getCoverageFormattersOptions, reportsFormatters } from '../../../../deployCommand.js'; -import { ProgressFormatter } from '../../../../formatters/progressFormatter.js'; import { DeployProgressBarFormatter } from '../../../../formatters/deployProgressBarFormatter.js'; import { DeployProgressStatusFormatter } from '../../../../formatters/deployProgressStatusFormatter.js'; @@ -112,8 +111,8 @@ export class Report extends DeployCommand { const deploy = this.createDeploy(this.org.getConnection(), deployId); if (!this.jsonEnabled()) { - const progressFormatter: ProgressFormatter = env.getBoolean('SF_USE_PROGRESS_BAR', true) - ? new DeployProgressBarFormatter(new Ux({ jsonEnabled: this.jsonEnabled() })) + const progressFormatter = env.getBoolean('SF_USE_PROGRESS_BAR', true) + ? new DeployProgressBarFormatter() : new DeployProgressStatusFormatter(new Ux({ jsonEnabled: this.jsonEnabled() })); progressFormatter.progress(deploy); } diff --git a/src/commands/force/source/deploy.ts b/src/commands/force/source/deploy.ts index b456630f9..2b05d7dae 100644 --- a/src/commands/force/source/deploy.ts +++ b/src/commands/force/source/deploy.ts @@ -29,7 +29,6 @@ import { DeployAsyncResultFormatter, DeployCommandAsyncResult, } from '../../../formatters/source/deployAsyncResultFormatter.js'; -import { ProgressFormatter } from '../../../formatters/progressFormatter.js'; import { DeployProgressBarFormatter } from '../../../formatters/deployProgressBarFormatter.js'; import { DeployProgressStatusFormatter } from '../../../formatters/deployProgressStatusFormatter.js'; import { filterConflictsByComponentSet, trackingSetup, updateTracking } from '../../../trackingFunctions.js'; @@ -283,8 +282,8 @@ export class Deploy extends DeployCommand { if (!this.isAsync) { // we're not print JSON output if (!this.jsonEnabled()) { - const progressFormatter: ProgressFormatter = env.getBoolean('SF_USE_PROGRESS_BAR', true) - ? new DeployProgressBarFormatter(new Ux({ jsonEnabled: this.jsonEnabled() })) + const progressFormatter = env.getBoolean('SF_USE_PROGRESS_BAR', true) + ? new DeployProgressBarFormatter() : new DeployProgressStatusFormatter(new Ux({ jsonEnabled: this.jsonEnabled() }), { verbose: this.flags.verbose, }); diff --git a/src/commands/force/source/deploy/report.ts b/src/commands/force/source/deploy/report.ts index 233e196a6..fbfe3f055 100644 --- a/src/commands/force/source/deploy/report.ts +++ b/src/commands/force/source/deploy/report.ts @@ -23,7 +23,6 @@ import { DeployReportCommandResult, DeployReportResultFormatter, } from '../../../../formatters/deployReportResultFormatter.js'; -import { ProgressFormatter } from '../../../../formatters/progressFormatter.js'; import { DeployProgressBarFormatter } from '../../../../formatters/deployProgressBarFormatter.js'; import { DeployProgressStatusFormatter } from '../../../../formatters/deployProgressStatusFormatter.js'; import { ResultFormatterOptions } from '../../../../formatters/resultFormatter.js'; @@ -112,8 +111,8 @@ export class Report extends DeployCommand { const waitDuration = this.flags.wait; const deploy = this.createDeploy(this.flags['target-org'].getConnection(), deployId); if (!this.jsonEnabled()) { - const progressFormatter: ProgressFormatter = env.getBoolean('SF_USE_PROGRESS_BAR', true) - ? new DeployProgressBarFormatter(new Ux({ jsonEnabled: this.jsonEnabled() })) + const progressFormatter = env.getBoolean('SF_USE_PROGRESS_BAR', true) + ? new DeployProgressBarFormatter() : new DeployProgressStatusFormatter(new Ux({ jsonEnabled: this.jsonEnabled() })); progressFormatter.progress(deploy); } diff --git a/src/commands/force/source/push.ts b/src/commands/force/source/push.ts index b73fce7c4..0f251da99 100644 --- a/src/commands/force/source/push.ts +++ b/src/commands/force/source/push.ts @@ -20,7 +20,6 @@ import { import { Interfaces } from '@oclif/core'; import { DeployCommand } from '../../../deployCommand.js'; import { PushResponse, PushResultFormatter } from '../../../formatters/source/pushResultFormatter.js'; -import { ProgressFormatter } from '../../../formatters/progressFormatter.js'; import { DeployProgressBarFormatter } from '../../../formatters/deployProgressBarFormatter.js'; import { DeployProgressStatusFormatter } from '../../../formatters/deployProgressStatusFormatter.js'; import { trackingSetup, updateTracking } from '../../../trackingFunctions.js'; @@ -149,8 +148,8 @@ export default class Push extends DeployCommand { // we're not print JSON output if (!this.jsonEnabled()) { - const progressFormatter: ProgressFormatter = env.getBoolean('SF_USE_PROGRESS_BAR', true) - ? new DeployProgressBarFormatter(new Ux({ jsonEnabled: this.jsonEnabled() })) + const progressFormatter = env.getBoolean('SF_USE_PROGRESS_BAR', true) + ? new DeployProgressBarFormatter() : new DeployProgressStatusFormatter(new Ux({ jsonEnabled: this.jsonEnabled() })); progressFormatter.progress(deploy); } diff --git a/src/commands/force/source/retrieve.ts b/src/commands/force/source/retrieve.ts index 3570b57e0..d667e51fe 100644 --- a/src/commands/force/source/retrieve.ts +++ b/src/commands/force/source/retrieve.ts @@ -28,7 +28,6 @@ import { requiredOrgFlagWithDeprecations, Ux, } from '@salesforce/sf-plugins-core'; -import { AlphabetLowercase } from '@oclif/core/lib/interfaces'; import { SourceCommand } from '../../../sourceCommand.js'; import { PackageRetrieval, @@ -57,8 +56,7 @@ export class Retrieve extends SourceCommand { message: messages.getMessage('deprecation', [replacement]), }; public static readonly flags = { - // I have no idea why 'a' isn't matching the type AlphabetLowercase automatically - 'api-version': { ...orgApiVersionFlagWithDeprecations, char: 'a' as AlphabetLowercase }, + 'api-version': { ...orgApiVersionFlagWithDeprecations, char: 'a' as const }, loglevel, 'target-org': requiredOrgFlagWithDeprecations, retrievetargetdir: Flags.directory({ diff --git a/src/formatters/deployProgressBarFormatter.ts b/src/formatters/deployProgressBarFormatter.ts index 85311e477..720812934 100644 --- a/src/formatters/deployProgressBarFormatter.ts +++ b/src/formatters/deployProgressBarFormatter.ts @@ -5,42 +5,38 @@ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause */ -import { MetadataApiDeploy } from '@salesforce/source-deploy-retrieve'; -import { once } from '@salesforce/kit'; -import { ux as coreUx } from '@oclif/core'; -import { Ux } from '@salesforce/sf-plugins-core'; -import { ProgressFormatter } from './progressFormatter.js'; +import { MetadataApiDeploy, MetadataApiDeployStatus } from '@salesforce/source-deploy-retrieve'; +import { SingleBar } from 'cli-progress'; -export class DeployProgressBarFormatter extends ProgressFormatter { - protected progressBar = coreUx.progress({ +export class DeployProgressBarFormatter { + protected progressBar = new SingleBar({ format: 'DEPLOY PROGRESS | {bar} | {value}/{total} Components', barCompleteChar: '\u2588', barIncompleteChar: '\u2591', linewrap: true, + noTTYOutput: Boolean(process.env.TERM === 'dumb' || !process.stdin.isTTY), }); - public constructor(ux: Ux) { - super(ux); - } + + public constructor() {} // displays the progress of the Deployment public progress(deploy: MetadataApiDeploy): void { - const startProgressBar = once((componentTotal: number) => { - this.progressBar.start(componentTotal, 0); - }); - - deploy.onUpdate((data) => { - // the numCompTot. isn't computed right away, wait to start until we know how many we have - const total = data.numberComponentsTotal + data.numberTestsTotal; - if (data.numberComponentsTotal) { - startProgressBar(total); - this.progressBar.update(data.numberComponentsDeployed + data.numberTestsCompleted); + this.progressBar.start(0, 0); + deploy.onUpdate( + ({ + numberComponentsTotal, + numberTestsTotal, + numberComponentsDeployed, + numberTestsCompleted, + }: MetadataApiDeployStatus) => { + // the numberComponentsTotal isn't computed right away, wait to start until we know how many we have + const total = numberComponentsTotal + numberTestsTotal; + if (this.progressBar.getTotal() !== total) { + this.progressBar.setTotal(total); + } + this.progressBar.update(numberComponentsDeployed + numberTestsCompleted); } - - // the numTestsTot. isn't computed until validated as tests by the server, update the PB once we know - if (data.numberTestsTotal && data.numberComponentsTotal) { - this.progressBar.setTotal(total); - } - }); + ); // any thing else should stop the progress bar deploy.onFinish((data) => { diff --git a/src/sourceCommand.ts b/src/sourceCommand.ts index 424a96eb5..5d7f61c59 100644 --- a/src/sourceCommand.ts +++ b/src/sourceCommand.ts @@ -11,9 +11,9 @@ import fs from 'node:fs'; import { Messages, SfError } from '@salesforce/core'; import { ComponentSet } from '@salesforce/source-deploy-retrieve'; import { getString, Optional } from '@salesforce/ts-types'; -import { ux } from '@oclif/core'; +import { SingleBar } from 'cli-progress'; import { SfCommand } from '@salesforce/sf-plugins-core'; -import { EnsureFsFlagOptions, FsError, ProgressBar } from './types.js'; +import { EnsureFsFlagOptions, FsError } from './types.js'; Messages.importMessagesDirectoryFromMetaUrl(import.meta.url); const messages = Messages.loadMessages('@salesforce/plugin-source', 'flags.validation'); @@ -21,17 +21,17 @@ const messages = Messages.loadMessages('@salesforce/plugin-source', 'flags.valid export abstract class SourceCommand extends SfCommand { public static readonly DEFAULT_WAIT_MINUTES = 33; - protected progressBar?: ProgressBar; + protected progressBar?: SingleBar; protected componentSet?: ComponentSet; protected initProgressBar(): void { this.debug('initializing progress bar'); - this.progressBar = ux.progress({ + this.progressBar = new SingleBar({ format: 'SOURCE PROGRESS | {bar} | {value}/{total} Components', barCompleteChar: '\u2588', barIncompleteChar: '\u2591', linewrap: true, - }) as ProgressBar; + }); } /** diff --git a/src/types.ts b/src/types.ts index ccfa695bd..6945cd6df 100644 --- a/src/types.ts +++ b/src/types.ts @@ -7,20 +7,11 @@ export type FsError = { code: string; -} & Error +} & Error; export type EnsureFsFlagOptions = { flagName: string; path?: string; type: 'dir' | 'file' | 'any'; throwOnENOENT?: boolean; -} - -export type ProgressBar = { - total?: number; - value?: number; - start: (total: number, startValue: number, payload?: object) => void; - update: (num: number, payload?: object) => void; - setTotal: (num: number) => void; - stop: () => void; }; diff --git a/test/commands/source/progressBarFormatter.test.ts b/test/commands/source/progressBarFormatter.test.ts index f643695d1..52f7d7ad5 100644 --- a/test/commands/source/progressBarFormatter.test.ts +++ b/test/commands/source/progressBarFormatter.test.ts @@ -8,35 +8,33 @@ import { EventEmitter } from 'node:events'; import { MetadataApiDeploy } from '@salesforce/source-deploy-retrieve'; import { spyMethod } from '@salesforce/ts-sinon'; import { assert, expect } from 'chai'; -import { Ux } from '@salesforce/sf-plugins-core'; import { TestContext } from '@salesforce/core/testSetup'; +import { SingleBar } from 'cli-progress'; import { DeployProgressBarFormatter } from '../../../src/formatters/deployProgressBarFormatter.js'; -import { ProgressBar } from '../../../src/types.js'; describe('Progress Bar Events', () => { const sandbox = new TestContext().SANDBOX; const username = 'me@my.org'; const deploy = new MetadataApiDeploy({ usernameOrConnection: username, id: '123' }); - const progressBarFormatter = new DeployProgressBarFormatter(Ux.prototype); - let bar: ProgressBar; + let progressBarFormatter: DeployProgressBarFormatter; + let bar: SingleBar; let events: EventEmitter; const overrideEvent = (event: EventEmitter) => { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore the deploy must be listening to the same EventEmitter emitting events + // @ts-expect-error the deploy must be listening to the same EventEmitter emitting events deploy.event = event; }; - const getProgressbar = () => - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore protected member access - progressBarFormatter.progressBar; + // @ts-expect-error protected member access + const getProgressbar = () => progressBarFormatter.progressBar; + afterEach(() => { sandbox.restore(); }); beforeEach(() => { events = new EventEmitter(); + progressBarFormatter = new DeployProgressBarFormatter(); overrideEvent(events); progressBarFormatter.progress(deploy); bar = getProgressbar(); @@ -49,8 +47,8 @@ describe('Progress Bar Events', () => { numberTestsCompleted: 0, numberTestsTotal: 0, }); - expect(bar.value).to.equal(3); - expect(bar.total).to.equal(5); + expect(bar.getTotal()).to.equal(5); + expect(bar.getProgress()).to.equal(3 / 5); events.emit('finish', { response: { numberComponentsTotal: 5, @@ -68,8 +66,8 @@ describe('Progress Bar Events', () => { numberTestsCompleted: 0, numberTestsTotal: 0, }); - expect(bar.total).to.equal(10); - expect(bar.value).to.equal(3); + expect(bar.getTotal()).to.equal(10); + expect(bar.getProgress()).to.equal(3 / 10); // deploy done, tests running events.emit('update', { numberComponentsTotal: 10, @@ -77,8 +75,8 @@ describe('Progress Bar Events', () => { numberTestsCompleted: 5, numberTestsTotal: 10, }); - expect(bar.total).to.equal(20); - expect(bar.value).to.equal(15); + expect(bar.getTotal()).to.equal(20); + expect(bar.getProgress()).to.equal(15 / 20); // all done events.emit('finish', { response: { @@ -88,7 +86,7 @@ describe('Progress Bar Events', () => { numberTestsTotal: 10, }, }); - expect(bar.value).to.equal(20); + expect(bar.getProgress()).to.equal(20 / 20); }); it('should update progress bar when server returns different calculated value', () => { @@ -98,8 +96,8 @@ describe('Progress Bar Events', () => { numberTestsCompleted: 0, numberTestsTotal: 0, }); - expect(bar.total).to.equal(20); - expect(bar.value).to.equal(3); + expect(bar.getTotal()).to.equal(20); + expect(bar.getProgress()).to.equal(3 / 20); // deploy done, tests running events.emit('update', { numberComponentsTotal: 20, @@ -107,8 +105,8 @@ describe('Progress Bar Events', () => { numberTestsCompleted: 5, numberTestsTotal: 10, }); - expect(bar.total).to.equal(30); - expect(bar.value).to.equal(15); + expect(bar.getTotal()).to.equal(30); + expect(bar.getProgress()).to.equal(15 / 30); // all done - notice 19 comps. deployed events.emit('finish', { response: { @@ -118,8 +116,8 @@ describe('Progress Bar Events', () => { numberTestsTotal: 10, }, }); - expect(bar.value).to.equal(29); - expect(bar.total).to.equal(29); + expect(bar.getProgress()).to.equal(29 / 29); + expect(bar.getTotal()).to.equal(29); }); it('should stop progress bar onCancel', () => { @@ -131,8 +129,8 @@ describe('Progress Bar Events', () => { numberTestsCompleted: 0, numberTestsTotal: 0, }); - expect(bar.total).to.equal(10); - expect(bar.value).to.equal(3); + expect(bar.getTotal()).to.equal(10); + expect(bar.getProgress()).to.equal(3 / 10); events.emit('cancel'); expect(stopSpy.calledOnce).to.be.true; @@ -148,8 +146,8 @@ describe('Progress Bar Events', () => { numberTestsTotal: 0, }); - expect(bar.total).to.equal(10); - expect(bar.value).to.equal(3); + expect(bar.getTotal()).to.equal(10); + expect(bar.getProgress()).to.equal(3 / 10); try { events.emit('error', new Error('error on deploy')); diff --git a/yarn.lock b/yarn.lock index 1f6d2714a..38c5b740d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1341,17 +1341,17 @@ wordwrap "^1.0.0" wrap-ansi "^7.0.0" -"@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.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" @@ -1359,7 +1359,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" @@ -1444,16 +1444,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.6", "@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.10", "@salesforce/core@^7.3.6", "@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" @@ -1461,21 +1461,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.yarnpkg.com/@salesforce/dev-config/-/dev-config-4.1.0.tgz#e529576466d074e7a5f1441236510fef123da01e" 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" @@ -1536,7 +1536,25 @@ resolved "https://registry.yarnpkg.com/@salesforce/schemas/-/schemas-1.9.0.tgz#ba477a112653a20b4edcf989c61c57bdff9aa3ca" integrity sha512-LiN37zG5ODT6z70sL1fxF7BQwtCX9JOWofSU8iliSNIM+WDEeinnoFtVqPInRSNt8I0RiJxIKCrqstsmQRBNvA== -"@salesforce/sf-plugins-core@^9.0.11", "@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.11": 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== @@ -2563,10 +2581,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" @@ -2585,6 +2603,13 @@ 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.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" @@ -2614,7 +2639,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.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== @@ -2624,7 +2649,7 @@ ansicolors@~0.3.2: resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" integrity sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg== -ansis@^3.0.1: +ansis@^3.1.1: version "3.2.0" resolved "https://registry.yarnpkg.com/ansis/-/ansis-3.2.0.tgz#0e050c5be94784f32ffdac4b84fccba064aeae4b" integrity sha512-Yk3BkHH9U7oPyCN3gL5Tc7CpahG/+UFv/6UG03C311Vy9lzRmA5uoxDTpU9CO3rGHL6KzJz/pdDeXZCZ5Mu/Sg== @@ -3709,6 +3734,11 @@ electron-to-chromium@^1.4.668: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.722.tgz#99ae3484c5fc0f387d39ad98d77e1f259b9f4074" integrity sha512-5nLE0TWFFpZ80Crhtp4pIp8LXCztjYX41yUcV6b+bKR2PqzjskTMOOlBi1VjBHlvHwS+4gar7kNKOrsbsewEZQ== +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.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -4396,6 +4426,11 @@ get-caller-file@^2.0.1, 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.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.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" @@ -4994,6 +5029,13 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 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.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -5932,6 +5974,11 @@ natural-orderby@^2.0.3: resolved "https://registry.yarnpkg.com/natural-orderby/-/natural-orderby-2.0.3.tgz#8623bc518ba162f8ff1cdb8941d74deb0fdcc016" 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== + neo-async@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" @@ -6421,7 +6468,7 @@ pify@^4.0.1: resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" 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== @@ -7099,6 +7146,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.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" @@ -7236,16 +7291,7 @@ srcset@^5.0.0: resolved "https://registry.yarnpkg.com/srcset/-/srcset-5.0.0.tgz#9df6c3961b5b44a02532ce6ae4544832609e2e3f" integrity sha512-SqEZaAEhe0A6ETEa9O1IhSPC7MdvehZtCnTR0AftXk3QhY2UNgb+NApFOUPZILXk/YTDfFxMTNJOBpzrJsEdIA== -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - 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@^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@^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.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -7263,6 +7309,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.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" @@ -7304,21 +7359,14 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@6.0.1, strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" -strip-ansi@6.0.1, strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - 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.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== @@ -7357,7 +7405,7 @@ strnum@^1.0.5: resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" 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.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== @@ -7378,11 +7426,6 @@ supports-color@^7, supports-color@^7.0.0, supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@^9.4.0: - version "9.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-9.4.0.tgz#17bfcf686288f531db3dea3215510621ccb55954" - integrity sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw== - supports-hyperlinks@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624" @@ -7407,6 +7450,14 @@ tar-stream@^2.2.0: inherits "^2.0.3" readable-stream "^3.1.1" +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.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" @@ -7519,11 +7570,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.yarnpkg.com/ts-retry-promise/-/ts-retry-promise-0.7.1.tgz#176d6eee6415f07b6c7c286d3657355e284a6906" - 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" @@ -7593,6 +7639,11 @@ type-fest@^0.8.0, type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" 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.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" @@ -7870,7 +7921,7 @@ workerpool@6.2.1: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" 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.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -7888,15 +7939,6 @@ 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.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - 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.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"