From 985e5e7c74d0bd0255980faddd465d6ad1dd913e Mon Sep 17 00:00:00 2001 From: Esteban Romero Date: Mon, 28 Apr 2025 17:44:59 -0300 Subject: [PATCH 1/4] fix: add logic to handle multiple errors returned from api call --- src/SfCommandError.ts | 4 +-- src/errorFormatting.ts | 24 ++++++++++++++ src/errorHandling.ts | 22 +++++++++++++ test/unit/errorFormatting.test.ts | 19 +++++++++++ test/unit/errorHandling.test.ts | 53 ++++++++++++++++++++++++++++++- 5 files changed, 119 insertions(+), 3 deletions(-) diff --git a/src/SfCommandError.ts b/src/SfCommandError.ts index 0f94e7fc0..c637b2bad 100644 --- a/src/SfCommandError.ts +++ b/src/SfCommandError.ts @@ -7,7 +7,7 @@ import { inspect } from 'node:util'; import { SfError, StructuredMessage } from '@salesforce/core'; import { AnyJson } from '@salesforce/ts-types'; -import { computeErrorCode } from './errorHandling.js'; +import { computeErrorCode, computeErrorData } from './errorHandling.js'; // These types are 90% the same as SfErrorOptions (but they aren't exported to extend) type ErrorDataProperties = AnyJson; @@ -75,7 +75,7 @@ export class SfCommandError extends SfError { code: 'code' in err && err.code ? err.code : exitCode.toString(10), cause: sfError.cause, commandName: 'commandName' in err ? err.commandName : commandName, - data: 'data' in err ? err.data : undefined, + data: computeErrorData(err), result: 'result' in err ? err.result : undefined, context: 'context' in err ? err.context : commandName, warnings, diff --git a/src/errorFormatting.ts b/src/errorFormatting.ts index 32cdd1b91..7802441d8 100644 --- a/src/errorFormatting.ts +++ b/src/errorFormatting.ts @@ -10,6 +10,7 @@ import type { Ansis } from 'ansis'; import { Mode, Messages, envVars } from '@salesforce/core'; import { StandardColors } from './ux/standardColors.js'; import { SfCommandError } from './SfCommandError.js'; +import { Ux } from './ux/ux.js'; Messages.importMessagesDirectoryFromMetaUrl(import.meta.url); const messages = Messages.loadMessages('@salesforce/sf-plugins-core', 'messages'); @@ -44,6 +45,7 @@ export const formatActions = ( export const formatError = (error: SfCommandError): string => [ `${formatErrorPrefix(error)} ${error.message}`, + ...formatMultipleErrorMessages(error), ...formatActions(error.actions ?? []), error.stack && envVars.getString('SF_ENV') === Mode.DEVELOPMENT ? StandardColors.info(`\n*** Internal Diagnostic ***\n\n${inspect(error)}\n******\n`) @@ -55,3 +57,25 @@ const formatErrorPrefix = (error: SfCommandError): string => const formatErrorCode = (error: SfCommandError): string => typeof error.code === 'string' || typeof error.code === 'number' ? ` (${error.code})` : ''; + +const formatMultipleErrorMessages = (error: SfCommandError): string[] => { + if (!error.data || !Array.isArray(error.data) || error.data.length === 0) { + return []; + } + + const errorData = error.data.map((d) => ({ + errorCode: (d as { errorCode: string }).errorCode || '', + message: (d as { message: string }).message || '', + })); + + const ux = new Ux(); + return [ + ux.makeTable({ + data: errorData, + columns: [ + { key: 'errorCode', name: 'Error Code' }, + { key: 'message', name: 'Message' }, + ], + }), + ]; +}; diff --git a/src/errorHandling.ts b/src/errorHandling.ts index 826e4fb20..c7bc41d17 100644 --- a/src/errorHandling.ts +++ b/src/errorHandling.ts @@ -7,6 +7,7 @@ import { SfError } from '@salesforce/core/sfError'; import { Errors } from '@oclif/core'; +import { AnyJson } from '@salesforce/ts-types'; /** * @@ -44,6 +45,27 @@ export const computeErrorCode = (e: Error | SfError | Errors.CLIError): number = return typeof process.exitCode === 'number' ? process.exitCode : 1; }; +/** + * Computes and extracts error data from different error types. + * + * 1. If the error has a 'data' property with a value, returns that data + * 2. If the error has a 'cause' property with a value: + * - If the cause has a 'data' property, returns cause.data + * - If not, returns undefined + * 3. If none of the above conditions are met, returns undefined + * + * @param e - The error object to extract data from. Can be a standard Error, SfError, or CLIError + * @returns The extracted data as AnyJson or undefined if no data is found + */ +export const computeErrorData = (e: Error | SfError | Errors.CLIError): AnyJson | undefined => + 'data' in e && e.data + ? e.data + : 'cause' in e && e.cause + ? 'data' in (e.cause as { data: AnyJson | undefined }) + ? (e.cause as { data: AnyJson | undefined }).data + : undefined + : undefined; + /** identifies gacks via regex. Searches the error message, stack, and recursively checks the cause chain */ export const errorIsGack = (error: Error | SfError): boolean => { /** see test for samples */ diff --git a/test/unit/errorFormatting.test.ts b/test/unit/errorFormatting.test.ts index 3d0fe439b..92820acc1 100644 --- a/test/unit/errorFormatting.test.ts +++ b/test/unit/errorFormatting.test.ts @@ -79,4 +79,23 @@ describe('errorFormatting.formatError()', () => { expect(errorOutput).to.contain('warnings: undefined'); expect(errorOutput).to.contain('result: undefined'); }); + + it('should have correct output for multiple errors in table format ', () => { + const sfError = SfError.create({ + name: 'myError', + message: 'foo', + actions: ['bar'], + context: 'myContext', + exitCode: 8, + data: [ + { errorCode: 'ERROR_1', message: 'error 1' }, + { errorCode: 'ERROR_2', message: 'error 2' }, + ], + }); + const err = SfCommandError.from(sfError, 'thecommand'); + const errorOutput = formatError(err); + expect(errorOutput).to.match(/Error Code.+Message/); + expect(errorOutput).to.match(/ERROR_1.+error 1/); + expect(errorOutput).to.match(/ERROR_2.+error 2/); + }); }); diff --git a/test/unit/errorHandling.test.ts b/test/unit/errorHandling.test.ts index e00ee75e4..038f501a9 100644 --- a/test/unit/errorHandling.test.ts +++ b/test/unit/errorHandling.test.ts @@ -6,7 +6,9 @@ */ import { expect } from 'chai'; import { SfError } from '@salesforce/core/sfError'; -import { computeErrorCode, errorIsGack, errorIsTypeError } from '../../src/errorHandling.js'; +import { AnyJson } from '@salesforce/ts-types'; +import { Errors } from '@oclif/core'; +import { computeErrorCode, computeErrorData, errorIsGack, errorIsTypeError } from '../../src/errorHandling.js'; import { SfCommandError } from '../../src/SfCommandError.js'; describe('typeErrors', () => { @@ -197,3 +199,52 @@ describe('SfCommandError.toJson()', () => { }); }); }); + +describe('computeErrorData', () => { + interface ErrorWithData extends Error { + data?: AnyJson; + } + + it('should return data from error.data when present', () => { + const sfError = SfError.create({ + name: 'myError', + message: 'foo', + actions: ['bar'], + context: 'myContext', + exitCode: 8, + data: { foo: 'bar' }, + }); + expect(computeErrorData(sfError)).to.deep.equal({ foo: 'bar' }); + }); + + it('should return cause.data when error.data is not present but cause.data is', () => { + const sfError = SfError.create({ + name: 'myError', + message: 'foo', + actions: ['bar'], + context: 'myContext', + exitCode: 8, + }); + const err: ErrorWithData = { name: 'testError', message: 'baz', data: { foo: 'baz' } }; + sfError.cause = err; + expect(computeErrorData(sfError)).to.deep.equal({ foo: 'baz' }); + }); + + it('should return undefined when no data or cause is present', () => { + const error = new Error('test error') as ErrorWithData; + expect(computeErrorData(error)).to.be.undefined; + }); + + it('should handle SfError with data', () => { + const error = new SfError('test error', 'TestError', [], 1, undefined); + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + (error as any).data = { foo: 'bar' }; + expect(computeErrorData(error)).to.deep.equal({ foo: 'bar' }); + }); + + it('should handle CLIError with data', () => { + const err = new Errors.CLIError('Nonexistent flag: --INVALID\nSee more help with --help') as ErrorWithData; + err.data = { foo: 'bar' }; + expect(computeErrorData(err)).to.deep.equal({ foo: 'bar' }); + }); +}); From 647f1106a05cea689987a53cdc897d71b8cc1591 Mon Sep 17 00:00:00 2001 From: Esteban Romero Date: Fri, 9 May 2025 12:42:30 -0300 Subject: [PATCH 2/4] fix: reduce the scope to only jsforce error MULTIPLE_API_ERRORS --- src/SfCommandError.ts | 4 +-- src/errorFormatting.ts | 46 +++++++++++++++------------ src/errorHandling.ts | 23 -------------- test/unit/errorFormatting.test.ts | 15 ++++++--- test/unit/errorHandling.test.ts | 53 +------------------------------ 5 files changed, 38 insertions(+), 103 deletions(-) diff --git a/src/SfCommandError.ts b/src/SfCommandError.ts index c637b2bad..0f94e7fc0 100644 --- a/src/SfCommandError.ts +++ b/src/SfCommandError.ts @@ -7,7 +7,7 @@ import { inspect } from 'node:util'; import { SfError, StructuredMessage } from '@salesforce/core'; import { AnyJson } from '@salesforce/ts-types'; -import { computeErrorCode, computeErrorData } from './errorHandling.js'; +import { computeErrorCode } from './errorHandling.js'; // These types are 90% the same as SfErrorOptions (but they aren't exported to extend) type ErrorDataProperties = AnyJson; @@ -75,7 +75,7 @@ export class SfCommandError extends SfError { code: 'code' in err && err.code ? err.code : exitCode.toString(10), cause: sfError.cause, commandName: 'commandName' in err ? err.commandName : commandName, - data: computeErrorData(err), + data: 'data' in err ? err.data : undefined, result: 'result' in err ? err.result : undefined, context: 'context' in err ? err.context : commandName, warnings, diff --git a/src/errorFormatting.ts b/src/errorFormatting.ts index 7802441d8..dbfb1a95b 100644 --- a/src/errorFormatting.ts +++ b/src/errorFormatting.ts @@ -7,7 +7,8 @@ import { inspect } from 'node:util'; import type { Ansis } from 'ansis'; -import { Mode, Messages, envVars } from '@salesforce/core'; +import { Mode, Messages, envVars, SfError } from '@salesforce/core'; +import { AnyJson } from '@salesforce/ts-types'; import { StandardColors } from './ux/standardColors.js'; import { SfCommandError } from './SfCommandError.js'; import { Ux } from './ux/ux.js'; @@ -45,7 +46,7 @@ export const formatActions = ( export const formatError = (error: SfCommandError): string => [ `${formatErrorPrefix(error)} ${error.message}`, - ...formatMultipleErrorMessages(error), + formatMultipleErrorMessages(error), ...formatActions(error.actions ?? []), error.stack && envVars.getString('SF_ENV') === Mode.DEVELOPMENT ? StandardColors.info(`\n*** Internal Diagnostic ***\n\n${inspect(error)}\n******\n`) @@ -58,24 +59,27 @@ const formatErrorPrefix = (error: SfCommandError): string => const formatErrorCode = (error: SfCommandError): string => typeof error.code === 'string' || typeof error.code === 'number' ? ` (${error.code})` : ''; -const formatMultipleErrorMessages = (error: SfCommandError): string[] => { - if (!error.data || !Array.isArray(error.data) || error.data.length === 0) { - return []; - } - - const errorData = error.data.map((d) => ({ - errorCode: (d as { errorCode: string }).errorCode || '', - message: (d as { message: string }).message || '', - })); +const formatMultipleErrorMessages = (error: SfCommandError): string => { + if (error.code === 'MULTIPLE_API_ERRORS' && error.cause) { + const errorData = getErrorData(error.cause as SfError); + if (errorData && Array.isArray(errorData) && errorData.length > 0) { + const errors = errorData.map((d) => ({ + errorCode: (d as { errorCode: string }).errorCode || '', + message: (d as { message: string }).message || '', + })); - const ux = new Ux(); - return [ - ux.makeTable({ - data: errorData, - columns: [ - { key: 'errorCode', name: 'Error Code' }, - { key: 'message', name: 'Message' }, - ], - }), - ]; + const ux = new Ux(); + return ux.makeTable({ + data: errors, + columns: [ + { key: 'errorCode', name: 'Error Code' }, + { key: 'message', name: 'Message' }, + ], + }); + } + } + return ''; }; + +const getErrorData = (error: SfError): AnyJson | undefined => + 'data' in error && error.data ? error.data : error.cause ? getErrorData(error.cause as SfError) : undefined; diff --git a/src/errorHandling.ts b/src/errorHandling.ts index c7bc41d17..0a1d5c0cb 100644 --- a/src/errorHandling.ts +++ b/src/errorHandling.ts @@ -7,8 +7,6 @@ import { SfError } from '@salesforce/core/sfError'; import { Errors } from '@oclif/core'; -import { AnyJson } from '@salesforce/ts-types'; - /** * * Takes an error and returns an exit code. @@ -45,27 +43,6 @@ export const computeErrorCode = (e: Error | SfError | Errors.CLIError): number = return typeof process.exitCode === 'number' ? process.exitCode : 1; }; -/** - * Computes and extracts error data from different error types. - * - * 1. If the error has a 'data' property with a value, returns that data - * 2. If the error has a 'cause' property with a value: - * - If the cause has a 'data' property, returns cause.data - * - If not, returns undefined - * 3. If none of the above conditions are met, returns undefined - * - * @param e - The error object to extract data from. Can be a standard Error, SfError, or CLIError - * @returns The extracted data as AnyJson or undefined if no data is found - */ -export const computeErrorData = (e: Error | SfError | Errors.CLIError): AnyJson | undefined => - 'data' in e && e.data - ? e.data - : 'cause' in e && e.cause - ? 'data' in (e.cause as { data: AnyJson | undefined }) - ? (e.cause as { data: AnyJson | undefined }).data - : undefined - : undefined; - /** identifies gacks via regex. Searches the error message, stack, and recursively checks the cause chain */ export const errorIsGack = (error: Error | SfError): boolean => { /** see test for samples */ diff --git a/test/unit/errorFormatting.test.ts b/test/unit/errorFormatting.test.ts index 92820acc1..61c8504d1 100644 --- a/test/unit/errorFormatting.test.ts +++ b/test/unit/errorFormatting.test.ts @@ -80,19 +80,24 @@ describe('errorFormatting.formatError()', () => { expect(errorOutput).to.contain('result: undefined'); }); - it('should have correct output for multiple errors in table format ', () => { + it('should have correct output for multiple errors in table format when errorCode is MULTIPLE_API_ERRORS', () => { + const innerError = SfError.create({ + message: 'foo', + data: [ + { errorCode: 'ERROR_1', message: 'error 1' }, + { errorCode: 'ERROR_2', message: 'error 2' }, + ], + }); const sfError = SfError.create({ name: 'myError', message: 'foo', actions: ['bar'], context: 'myContext', exitCode: 8, - data: [ - { errorCode: 'ERROR_1', message: 'error 1' }, - { errorCode: 'ERROR_2', message: 'error 2' }, - ], + cause: innerError, }); const err = SfCommandError.from(sfError, 'thecommand'); + err.code = 'MULTIPLE_API_ERRORS'; const errorOutput = formatError(err); expect(errorOutput).to.match(/Error Code.+Message/); expect(errorOutput).to.match(/ERROR_1.+error 1/); diff --git a/test/unit/errorHandling.test.ts b/test/unit/errorHandling.test.ts index 038f501a9..e00ee75e4 100644 --- a/test/unit/errorHandling.test.ts +++ b/test/unit/errorHandling.test.ts @@ -6,9 +6,7 @@ */ import { expect } from 'chai'; import { SfError } from '@salesforce/core/sfError'; -import { AnyJson } from '@salesforce/ts-types'; -import { Errors } from '@oclif/core'; -import { computeErrorCode, computeErrorData, errorIsGack, errorIsTypeError } from '../../src/errorHandling.js'; +import { computeErrorCode, errorIsGack, errorIsTypeError } from '../../src/errorHandling.js'; import { SfCommandError } from '../../src/SfCommandError.js'; describe('typeErrors', () => { @@ -199,52 +197,3 @@ describe('SfCommandError.toJson()', () => { }); }); }); - -describe('computeErrorData', () => { - interface ErrorWithData extends Error { - data?: AnyJson; - } - - it('should return data from error.data when present', () => { - const sfError = SfError.create({ - name: 'myError', - message: 'foo', - actions: ['bar'], - context: 'myContext', - exitCode: 8, - data: { foo: 'bar' }, - }); - expect(computeErrorData(sfError)).to.deep.equal({ foo: 'bar' }); - }); - - it('should return cause.data when error.data is not present but cause.data is', () => { - const sfError = SfError.create({ - name: 'myError', - message: 'foo', - actions: ['bar'], - context: 'myContext', - exitCode: 8, - }); - const err: ErrorWithData = { name: 'testError', message: 'baz', data: { foo: 'baz' } }; - sfError.cause = err; - expect(computeErrorData(sfError)).to.deep.equal({ foo: 'baz' }); - }); - - it('should return undefined when no data or cause is present', () => { - const error = new Error('test error') as ErrorWithData; - expect(computeErrorData(error)).to.be.undefined; - }); - - it('should handle SfError with data', () => { - const error = new SfError('test error', 'TestError', [], 1, undefined); - // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access - (error as any).data = { foo: 'bar' }; - expect(computeErrorData(error)).to.deep.equal({ foo: 'bar' }); - }); - - it('should handle CLIError with data', () => { - const err = new Errors.CLIError('Nonexistent flag: --INVALID\nSee more help with --help') as ErrorWithData; - err.data = { foo: 'bar' }; - expect(computeErrorData(err)).to.deep.equal({ foo: 'bar' }); - }); -}); From 8d9340e506f3749908ccfc4dc450829ecd7c4176 Mon Sep 17 00:00:00 2001 From: Esteban Romero Date: Fri, 9 May 2025 12:45:04 -0300 Subject: [PATCH 3/4] chore: typo --- src/errorHandling.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/errorHandling.ts b/src/errorHandling.ts index 0a1d5c0cb..826e4fb20 100644 --- a/src/errorHandling.ts +++ b/src/errorHandling.ts @@ -7,6 +7,7 @@ import { SfError } from '@salesforce/core/sfError'; import { Errors } from '@oclif/core'; + /** * * Takes an error and returns an exit code. From 4d9964a52e7889f6570d82e4dc3288afb6ad83c1 Mon Sep 17 00:00:00 2001 From: Cristian Dominguez <6853656+cristiand391@users.noreply.github.com> Date: Wed, 14 May 2025 13:44:00 -0300 Subject: [PATCH 4/4] chore: remove TS assertions (#680) --- package.json | 4 +-- src/errorFormatting.ts | 41 ++++++++++++++++++++++++------ yarn.lock | 57 +++++++++++------------------------------- 3 files changed, 50 insertions(+), 52 deletions(-) diff --git a/package.json b/package.json index 8c9f2396e..85b5d7044 100644 --- a/package.json +++ b/package.json @@ -45,9 +45,9 @@ "dependencies": { "@inquirer/confirm": "^3.1.22", "@inquirer/password": "^2.2.0", - "@oclif/core": "^4.2.10", + "@oclif/core": "^4.3.0", "@oclif/table": "^0.4.6", - "@salesforce/core": "^8.8.5", + "@salesforce/core": "^8.10.0", "@salesforce/kit": "^3.2.3", "@salesforce/ts-types": "^2.0.12", "ansis": "^3.3.2", diff --git a/src/errorFormatting.ts b/src/errorFormatting.ts index dbfb1a95b..b07946c09 100644 --- a/src/errorFormatting.ts +++ b/src/errorFormatting.ts @@ -8,7 +8,7 @@ import { inspect } from 'node:util'; import type { Ansis } from 'ansis'; import { Mode, Messages, envVars, SfError } from '@salesforce/core'; -import { AnyJson } from '@salesforce/ts-types'; +import { AnyJson, ensureString, isAnyJson } from '@salesforce/ts-types'; import { StandardColors } from './ux/standardColors.js'; import { SfCommandError } from './SfCommandError.js'; import { Ux } from './ux/ux.js'; @@ -59,13 +59,21 @@ const formatErrorPrefix = (error: SfCommandError): string => const formatErrorCode = (error: SfCommandError): string => typeof error.code === 'string' || typeof error.code === 'number' ? ` (${error.code})` : ''; +type JsforceApiError = { + errorCode: string; + message?: AnyJson; +}; + +const isJsforceApiError = (item: AnyJson): item is JsforceApiError => + typeof item === 'object' && item !== null && !Array.isArray(item) && ('errorCode' in item || 'message' in item); + const formatMultipleErrorMessages = (error: SfCommandError): string => { if (error.code === 'MULTIPLE_API_ERRORS' && error.cause) { - const errorData = getErrorData(error.cause as SfError); + const errorData = getErrorData(error.cause); if (errorData && Array.isArray(errorData) && errorData.length > 0) { - const errors = errorData.map((d) => ({ - errorCode: (d as { errorCode: string }).errorCode || '', - message: (d as { message: string }).message || '', + const errors = errorData.filter(isJsforceApiError).map((d) => ({ + errorCode: d.errorCode, + message: ensureString(d.message ?? ''), })); const ux = new Ux(); @@ -81,5 +89,24 @@ const formatMultipleErrorMessages = (error: SfCommandError): string => { return ''; }; -const getErrorData = (error: SfError): AnyJson | undefined => - 'data' in error && error.data ? error.data : error.cause ? getErrorData(error.cause as SfError) : undefined; +/** + * Utility function to extract error data from an error object. + * Recursively traverses the error chain to find the first error that contains data. + * Returns undefined if no error in the chain contains data or if the input is not an Error/SfError. + * + * This is used in the top-level catch in sfCommand for deeply-nested error data. + * + * @param error - The error object to extract data from + * @returns The error data if found, undefined otherwise + */ +const getErrorData = (error: unknown): AnyJson | undefined => { + if (!(error instanceof Error || error instanceof SfError)) return undefined; + + if ('data' in error && error.data && isAnyJson(error.data)) { + return error.data; + } else if (error.cause) { + return getErrorData(error.cause); + } else { + return undefined; + } +}; diff --git a/yarn.lock b/yarn.lock index 09df92b8f..f8dd51144 100644 --- a/yarn.lock +++ b/yarn.lock @@ -519,10 +519,10 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@jsforce/jsforce-node@^3.6.5": - version "3.6.6" - resolved "https://registry.yarnpkg.com/@jsforce/jsforce-node/-/jsforce-node-3.6.6.tgz#26fe2fc9f4f3671ca8bfb0c98a728cb8a0219265" - integrity sha512-WdIo2lLbrz6nkfiaz2UynyaNiM8o+fEjaRev7zA4KKSaQYB1MJ66xHubeI5Iheq8WgkY9XGwWKAwPDhuV+GROQ== +"@jsforce/jsforce-node@^3.6.5", "@jsforce/jsforce-node@^3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@jsforce/jsforce-node/-/jsforce-node-3.8.1.tgz#482fcf2820b48a6b10930d33550eb4e4cbd1e480" + integrity sha512-+IZZC7VfNjhkTyeAspBc4Z35Y5eAP0RIWQnyfKahsbY/aLjiFRIM9ejl1YbWbrbabf5ODFSUgBGmOiEYLW3f7Q== dependencies: "@sindresorhus/is" "^4" base64url "^3.0.1" @@ -556,10 +556,10 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@oclif/core@^4.2.10": - version "4.2.10" - resolved "https://registry.yarnpkg.com/@oclif/core/-/core-4.2.10.tgz#31dfb7481c79887c3e672e10c981fcc01fcbaeb3" - integrity sha512-fAqcXgqkUm4v5FYy7qWP4w1HaOlVSVJveah+yVTo5Nm5kTiXhmD5mQQ7+knGeBaStyrtQy6WardoC2xSic9rlQ== +"@oclif/core@^4.3.0": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@oclif/core/-/core-4.3.0.tgz#9a2951f05f81a4c7ae5ffcc00b2d720cca0898e6" + integrity sha512-lIzHY+JMP6evrS5E/sGijNnwrCoNtGy8703jWXcMuPOYKiFhWoAqnIm1BGgoRgmxczkbSfRsHUL/lwsSgh74Lw== dependencies: ansi-escapes "^4.3.2" ansis "^3.17.0" @@ -608,36 +608,12 @@ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== -"@salesforce/core@^8.8.3": - version "8.8.4" - resolved "https://registry.yarnpkg.com/@salesforce/core/-/core-8.8.4.tgz#1995d387a62c48810b4e0a66c68192ccdcf8001f" - integrity sha512-TKioMWh/QWmXjnD0bMNvFHEqaH175TCYWNXUCO1CixdhhI0p1MQj4AnQsk8wuRJiH5kVhiYw6Z7NukcIxLtbUw== +"@salesforce/core@^8.10.0", "@salesforce/core@^8.8.3": + version "8.10.3" + resolved "https://registry.yarnpkg.com/@salesforce/core/-/core-8.10.3.tgz#3cc2c99d097757cb4b08dab921254cfa3a00c7c1" + integrity sha512-juqbU304TBrrjb8sZGw+QkeAJISKu4+v2XIMTCxGJoEjs4LLhsyI7/drxCUY+7FNye+veAGeJdn/PCxkKhSgcA== dependencies: - "@jsforce/jsforce-node" "^3.6.5" - "@salesforce/kit" "^3.2.2" - "@salesforce/schemas" "^1.9.0" - "@salesforce/ts-types" "^2.0.10" - ajv "^8.17.1" - change-case "^4.1.2" - fast-levenshtein "^3.0.0" - faye "^1.4.0" - form-data "^4.0.0" - js2xmlparser "^4.0.1" - jsonwebtoken "9.0.2" - jszip "3.10.1" - pino "^9.4.0" - pino-abstract-transport "^1.2.0" - pino-pretty "^11.2.2" - proper-lockfile "^4.1.2" - semver "^7.6.3" - ts-retry-promise "^0.8.1" - -"@salesforce/core@^8.8.5": - version "8.8.5" - resolved "https://registry.yarnpkg.com/@salesforce/core/-/core-8.8.5.tgz#4004e22523e4e45b42631733d06dc8aec9fdc23d" - integrity sha512-eCiiO4NptvKkz04A4ivBVLzEBy/6IIFmaXoZ4tnF1FcD5MESvC+Xuc+0RFSRiYmPi5oloKNl6njrfVCKAho2zQ== - dependencies: - "@jsforce/jsforce-node" "^3.6.5" + "@jsforce/jsforce-node" "^3.8.1" "@salesforce/kit" "^3.2.2" "@salesforce/schemas" "^1.9.0" "@salesforce/ts-types" "^2.0.10" @@ -1143,12 +1119,7 @@ ansi-styles@^6.0.0, ansi-styles@^6.1.0, ansi-styles@^6.2.1: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== -ansis@^3.10.0, ansis@^3.3.2: - version "3.10.0" - resolved "https://registry.yarnpkg.com/ansis/-/ansis-3.10.0.tgz#6886afb0f729b1fa865df6b710b97a9915b7d0d4" - integrity sha512-hxDKLYT7hy3Y4sF3HxI926A3urzPxi73mZBB629m9bCVF+NyKNxbwCqqm+C/YrGPtxLwnl6d8/ZASCsz6SyvJA== - -ansis@^3.17.0: +ansis@^3.10.0, ansis@^3.17.0, ansis@^3.3.2: version "3.17.0" resolved "https://registry.yarnpkg.com/ansis/-/ansis-3.17.0.tgz#fa8d9c2a93fe7d1177e0c17f9eeb562a58a832d7" integrity sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==