From 7d77a514714372137110c8418b76ef82672f21ce Mon Sep 17 00:00:00 2001 From: Cristian Dominguez Date: Tue, 31 May 2022 17:47:53 -0300 Subject: [PATCH 01/10] fix: wait until all records are emitted --- src/commands/force/data/soql/query.ts | 58 +++++++++++++++++---------- 1 file changed, 36 insertions(+), 22 deletions(-) diff --git a/src/commands/force/data/soql/query.ts b/src/commands/force/data/soql/query.ts index 5142ac2e..0a191947 100644 --- a/src/commands/force/data/soql/query.ts +++ b/src/commands/force/data/soql/query.ts @@ -9,7 +9,7 @@ import * as os from 'os'; import { flags, FlagsConfig } from '@salesforce/command'; import { CliUx } from '@oclif/core'; import { Connection, Logger, Messages, SfdxConfigAggregator } from '@salesforce/core'; -import { QueryOptions, Record } from 'jsforce'; +import { QueryOptions, QueryResult, Record } from 'jsforce'; import { AnyJson, ensureJsonArray, @@ -35,45 +35,54 @@ const commonMessages = Messages.loadMessages('@salesforce/plugin-data', 'message * Will collect all records and the column metadata of the query */ export class SoqlQuery { - public async runSoqlQuery(connection: Connection, query: string, logger: Logger): Promise { - const config: SfdxConfigAggregator = await SfdxConfigAggregator.create(); - + public async runSoqlQuery( + connection: Connection, + query: string, + logger: Logger, + configAgg: SfdxConfigAggregator + ): Promise { let columns: Field[] = []; logger.debug('running query'); - // take the limit from the config, then default 10,000 + // take the limit from the config, then default 50,000 const queryOpts: Partial = { autoFetch: true, - maxFetch: (config.getInfo('maxQueryLimit').value as number) || 10000, + maxFetch: (configAgg.getInfo('maxQueryLimit').value as number) || 50000, }; const records: Record[] = []; - const result = await connection.query(query, queryOpts).on('record', (rec) => records.push(rec)); - - const totalSize = getNumber(result, 'totalSize', 0); + // eslint-disable-next-line @typescript-eslint/no-misused-promises,no-async-promise-executor + const result: QueryResult = await new Promise(async (resolve, reject) => { + const res = await connection + .query(query, queryOpts) + .on('record', (rec) => records.push(rec)) + .on('error', (err) => reject(err)) + .on('end', () => { + resolve({ + done: true, + totalSize: getNumber(res, 'totalSize', 0), + records, + }); + }); + }); - if (records.length && totalSize > records.length) { + if (result.records.length && result.totalSize > result.records.length) { CliUx.ux.warn( - `The query result is missing ${totalSize - records.length} records due to a ${ - queryOpts.maxFetch - } record limit. Increase the number of records returned by setting the config value "maxQueryLimit" or the environment variable "SFDX_MAX_QUERY_LIMIT" to ${totalSize} or greater than ${ + `The query result is missing ${result.totalSize - result.records.length} records due to a ${ queryOpts.maxFetch - }.` + } record limit. Increase the number of records returned by setting the config value "maxQueryLimit" or the environment variable "SFDX_MAX_QUERY_LIMIT" to ${ + result.totalSize + } or greater than ${queryOpts.maxFetch}.` ); } - logger.debug(`Query complete with ${totalSize} records returned`); - if (totalSize) { + logger.debug(`Query complete with ${result.totalSize} records returned`); + if (result.totalSize) { logger.debug('fetching columns for query'); columns = await this.retrieveColumns(connection, query); } - result.records = records; - // remove nextRecordsUrl and force done to true - delete result.nextRecordsUrl; - result.done = true; - return { query, columns, @@ -214,7 +223,12 @@ export class DataSoqlQueryCommand extends DataCommand { if (this.flags.resultformat !== 'json') this.ux.startSpinner(messages.getMessage('queryRunningMessage')); const query = new SoqlQuery(); const conn = this.getConnection(); - const queryResult: SoqlQueryResult = await query.runSoqlQuery(conn as Connection, this.flags.query, this.logger); + const queryResult: SoqlQueryResult = await query.runSoqlQuery( + conn as Connection, + this.flags.query, + this.logger, + this.configAggregator + ); const results = { ...queryResult, }; From 8410d6202bc5ac7702aa1cdc5a463e0f08a0b9ec Mon Sep 17 00:00:00 2001 From: Cristian Dominguez Date: Thu, 9 Jun 2022 17:04:16 -0300 Subject: [PATCH 02/10] fix: use query.run for soql:query command --- src/commands/force/data/soql/query.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/commands/force/data/soql/query.ts b/src/commands/force/data/soql/query.ts index 0a191947..905f3bd2 100644 --- a/src/commands/force/data/soql/query.ts +++ b/src/commands/force/data/soql/query.ts @@ -52,10 +52,9 @@ export class SoqlQuery { const records: Record[] = []; - // eslint-disable-next-line @typescript-eslint/no-misused-promises,no-async-promise-executor - const result: QueryResult = await new Promise(async (resolve, reject) => { - const res = await connection - .query(query, queryOpts) + const result: QueryResult = await new Promise((resolve, reject) => { + const res = connection + .query(query) .on('record', (rec) => records.push(rec)) .on('error', (err) => reject(err)) .on('end', () => { @@ -64,7 +63,8 @@ export class SoqlQuery { totalSize: getNumber(res, 'totalSize', 0), records, }); - }); + }) + .run(queryOpts); }); if (result.records.length && result.totalSize > result.records.length) { From 44dd4edc8c99b8208c8390318b8d7ab3acb00b7c Mon Sep 17 00:00:00 2001 From: Cristian Dominguez Date: Fri, 10 Jun 2022 11:11:05 -0300 Subject: [PATCH 03/10] test: update UTs --- test/soqlQuery.test.ts | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/test/soqlQuery.test.ts b/test/soqlQuery.test.ts index 4ae437de..173955ae 100644 --- a/test/soqlQuery.test.ts +++ b/test/soqlQuery.test.ts @@ -9,7 +9,7 @@ import * as chai from 'chai'; import { expect } from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; -import { Logger } from '@salesforce/core'; +import { Logger, SfdxConfigAggregator } from '@salesforce/core'; import { QueryResult } from 'jsforce'; import sinon = require('sinon'); import { SoqlQuery } from '../src/commands/force/data/soql/query'; @@ -30,6 +30,7 @@ describe('soqlQuery tests', () => { }); it.skip('should handle a simple query with all records returned in single call', async () => { + const configAgg = await SfdxConfigAggregator.create(); sandbox .stub(fakeConnection, 'request') .resolves({ columnMetadata: queryFieldsExemplars.simpleQuery.columnMetadata }); @@ -37,11 +38,12 @@ describe('soqlQuery tests', () => { .stub(fakeConnection, 'query') .resolves(soqlQueryExemplars.simpleQuery.queryResult as unknown as QueryResult); const soqlQuery = new SoqlQuery(); - const results = await soqlQuery.runSoqlQuery(fakeConnection, 'SELECT id, name FROM Contact', logger); + const results = await soqlQuery.runSoqlQuery(fakeConnection, 'SELECT id, name FROM Contact', logger, configAgg); sinon.assert.calledOnce(querySpy); expect(results).to.be.deep.equal(soqlQueryExemplars.simpleQuery.soqlQueryResult); }); it.skip('should handle a query with a subquery', async () => { + const configAgg = await SfdxConfigAggregator.create(); sandbox.stub(fakeConnection, 'request').resolves({ columnMetadata: queryFieldsExemplars.subquery.columnMetadata }); querySpy = sandbox .stub(fakeConnection, 'query') @@ -50,19 +52,22 @@ describe('soqlQuery tests', () => { const results = await soqlQuery.runSoqlQuery( fakeConnection, 'SELECT Name, ( SELECT LastName FROM Contacts ) FROM Account', - logger + logger, + configAgg ); sinon.assert.calledOnce(querySpy); expect(results).to.be.deep.equal(soqlQueryExemplars.subQuery.soqlQueryResult); }); it.skip('should handle empty query', async () => { + const configAgg = await SfdxConfigAggregator.create(); requestSpy = sandbox.stub(fakeConnection, 'request'); querySpy = sandbox.stub(fakeConnection, 'query').resolves(soqlQueryExemplars.emptyQuery.queryResult); const soqlQuery = new SoqlQuery(); const results = await soqlQuery.runSoqlQuery( fakeConnection, "SELECT Name FROM Contact where name = 'some nonexistent name'", - logger + logger, + configAgg ); sinon.assert.calledOnce(querySpy); sinon.assert.notCalled(requestSpy); From 1a1dab7404a46c547604b56334346d8ec64b0fe3 Mon Sep 17 00:00:00 2001 From: Cristian Dominguez Date: Fri, 10 Jun 2022 11:18:23 -0300 Subject: [PATCH 04/10] test: add maxQueryLimit NUTs --- package.json | 4 ++- .../data/soql/query/dataSoqlQuery.nut.ts | 34 +++++++++++++++++++ yarn.lock | 12 +++++-- 3 files changed, 47 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 15827154..692ca233 100644 --- a/package.json +++ b/package.json @@ -103,6 +103,7 @@ "@salesforce/plugin-command-reference": "^1.3.0", "@salesforce/prettier-config": "^0.0.2", "@salesforce/ts-sinon": "^1.3.15", + "@types/shelljs": "^0.8.10", "@types/chai-as-promised": "^7.1.3", "@types/graceful-fs": "^4.1.5", "@types/mkdirp": "^1.0.1", @@ -130,6 +131,7 @@ "shx": "^0.3.3", "sinon": "10.0.0", "ts-node": "^10.4.0", - "typescript": "^4.4.4" + "typescript": "^4.4.4", + "shelljs": "^0.8.3" } } diff --git a/test/commands/force/data/soql/query/dataSoqlQuery.nut.ts b/test/commands/force/data/soql/query/dataSoqlQuery.nut.ts index b2b2527e..6cc07c69 100644 --- a/test/commands/force/data/soql/query/dataSoqlQuery.nut.ts +++ b/test/commands/force/data/soql/query/dataSoqlQuery.nut.ts @@ -5,6 +5,9 @@ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause */ import * as path from 'path'; +import * as shell from 'shelljs'; +import { Env } from '@salesforce/kit'; +import { ensureString } from '@salesforce/ts-types'; import { expect } from 'chai'; import { execCmd, TestSession } from '@salesforce/cli-plugins-testkit'; import { Dictionary, getString } from '@salesforce/ts-types'; @@ -67,6 +70,37 @@ describe('data:soql:query command', () => { await testSession?.clean(); }); + describe('data:soql:query respects maxQueryLimit config', () => { + it('should return 1 account record', () => { + // set maxQueryLimit to 1 globally + shell.exec('sfdx config:set maxQueryLimit=1 -g', { silent: true }); + + const result = runQuery('SELECT Id, Name, Phone FROM Account', { json: true }) as QueryResult; + + expect(result.records.length).to.equal(1); + verifyRecordFields(result?.records[0], ['Id', 'Name', 'Phone', 'attributes']); + }); + + it('should return 3756 ScratchOrgInfo records', () => { + const env = new Env(); + const username = ensureString(env.getString('TESTKIT_HUB_USERNAME')); + // + // set maxQueryLimit to 2456 globally + shell.exec('sfdx config:set maxQueryLimit=3756 -g', { silent: true }); + + const soqlQuery = 'SELECT Id FROM ScratchOrgInfo'; + const queryCmd = `force:data:soql:query --query "${soqlQuery}" --json --targetusername ${username}`; + const results = execCmd(queryCmd, { ensureExitCode: 0 }); + + const queryResult: QueryResult = results.jsonOutput?.result ?? { done: false, records: [], totalSize: 0 }; + expect(queryResult).to.have.property('totalSize').to.be.greaterThan(0); + expect(queryResult).to.have.property('done', true); + expect(queryResult).to.have.property('records').to.not.have.lengthOf(0); + expect(queryResult.records.length).to.equal(3756); + verifyRecordFields(queryResult?.records[0], ['Id', 'attributes']); + }); + }); + describe('data:soql:query verify query errors', () => { it('should error with invalid soql', () => { const result = runQuery('SELECT', { ensureExitCode: 1, json: false }) as string; diff --git a/yarn.lock b/yarn.lock index 9ad91515..3e726bb3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1351,7 +1351,7 @@ dependencies: "@types/node" "*" -"@types/glob@^7.1.1": +"@types/glob@*", "@types/glob@^7.1.1": version "7.2.0" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== @@ -1440,6 +1440,14 @@ resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.9.tgz#152c6c20a7688c30b967ec1841d31ace569863fc" integrity sha512-L/TMpyURfBkf+o/526Zb6kd/tchUP3iBDEPjqjb+U2MAJhVRxxrmr2fwpe08E7QsV7YLcpq0tUaQ9O9x97ZIxQ== +"@types/shelljs@^0.8.10": + version "0.8.11" + resolved "https://registry.yarnpkg.com/@types/shelljs/-/shelljs-0.8.11.tgz#17a5696c825974e96828e96e89585d685646fcb8" + integrity sha512-x9yaMvEh5BEaZKeVQC4vp3l+QoFj3BXcd4aYfuKSzIIyihjdVARAadYy3SMNIz0WCCdS2vB9JL/U6GQk5PaxQw== + dependencies: + "@types/glob" "*" + "@types/node" "*" + "@types/sinon@*", "@types/sinon@10.0.11": version "10.0.11" resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.11.tgz#8245827b05d3fc57a6601bd35aee1f7ad330fc42" @@ -6995,7 +7003,7 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shelljs@^0.8.4, shelljs@^0.8.5, shelljs@~0.8.4: +shelljs@^0.8.3, shelljs@^0.8.4, shelljs@^0.8.5, shelljs@~0.8.4: version "0.8.5" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== From 7e7e61f35f4fc6ca8f41da38f6f204c04c5a9e51 Mon Sep 17 00:00:00 2001 From: Cristian Dominguez Date: Fri, 10 Jun 2022 11:19:02 -0300 Subject: [PATCH 05/10] chore: add bin/dev --- bin/dev | 17 +++++++++++++++++ bin/dev.cmd | 3 +++ 2 files changed, 20 insertions(+) create mode 100755 bin/dev create mode 100644 bin/dev.cmd diff --git a/bin/dev b/bin/dev new file mode 100755 index 00000000..02b50d62 --- /dev/null +++ b/bin/dev @@ -0,0 +1,17 @@ +#!/usr/bin/env node + +const oclif = require('@oclif/core'); + +const path = require('path'); +const project = path.join(__dirname, '..', 'tsconfig.json'); + +// In dev mode -> use ts-node and dev plugins +process.env.NODE_ENV = 'development'; + +require('ts-node').register({ project }); + +// In dev mode, always show stack traces +oclif.settings.debug = true; + +// Start the CLI +oclif.run().then(oclif.flush).catch(oclif.Errors.handle); diff --git a/bin/dev.cmd b/bin/dev.cmd new file mode 100644 index 00000000..8ae2b12c --- /dev/null +++ b/bin/dev.cmd @@ -0,0 +1,3 @@ +@echo off + +node "%~dp0\dev" %* From 4c29e3e8f679abf8d90e9afd7715003e93a1747b Mon Sep 17 00:00:00 2001 From: Cristian Dominguez Date: Fri, 10 Jun 2022 14:19:39 -0300 Subject: [PATCH 06/10] test(nuts): get default hub from current session --- .../force/data/soql/query/dataSoqlQuery.nut.ts | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/test/commands/force/data/soql/query/dataSoqlQuery.nut.ts b/test/commands/force/data/soql/query/dataSoqlQuery.nut.ts index 6cc07c69..1a0d8632 100644 --- a/test/commands/force/data/soql/query/dataSoqlQuery.nut.ts +++ b/test/commands/force/data/soql/query/dataSoqlQuery.nut.ts @@ -6,8 +6,7 @@ */ import * as path from 'path'; import * as shell from 'shelljs'; -import { Env } from '@salesforce/kit'; -import { ensureString } from '@salesforce/ts-types'; +import { isArray, AnyJson, ensureString } from '@salesforce/ts-types'; import { expect } from 'chai'; import { execCmd, TestSession } from '@salesforce/cli-plugins-testkit'; import { Dictionary, getString } from '@salesforce/ts-types'; @@ -51,12 +50,14 @@ function runQuery(query: string, options: QueryOptions = { json: true, ensureExi describe('data:soql:query command', () => { let testSession: TestSession; + let hubOrgUsername: string; before(async () => { testSession = await TestSession.create({ setupCommands: [ 'sfdx force:org:create -f config/project-scratch-def.json --setdefaultusername --wait 10 --durationdays 1', 'sfdx force:source:push', + 'sfdx config:get defaultdevhubusername --json', ], project: { sourceDir: path.join('test', 'test-files', 'data-project') }, }); @@ -64,6 +65,15 @@ describe('data:soql:query command', () => { execCmd(`force:data:tree:import --plan ${path.join('.', 'data', 'accounts-contacts-plan.json')}`, { ensureExitCode: 0, }); + + // get default devhub username + if (isArray(testSession.setup)) { + hubOrgUsername = ensureString( + (testSession.setup[2] as { result: [{ key: string; value: string }] }).result.find( + (config) => config.key === 'defaultdevhubusername' + )?.value + ); + } }); after(async () => { @@ -82,14 +92,12 @@ describe('data:soql:query command', () => { }); it('should return 3756 ScratchOrgInfo records', () => { - const env = new Env(); - const username = ensureString(env.getString('TESTKIT_HUB_USERNAME')); // // set maxQueryLimit to 2456 globally shell.exec('sfdx config:set maxQueryLimit=3756 -g', { silent: true }); const soqlQuery = 'SELECT Id FROM ScratchOrgInfo'; - const queryCmd = `force:data:soql:query --query "${soqlQuery}" --json --targetusername ${username}`; + const queryCmd = `force:data:soql:query --query "${soqlQuery}" --json --targetusername ${hubOrgUsername}`; const results = execCmd(queryCmd, { ensureExitCode: 0 }); const queryResult: QueryResult = results.jsonOutput?.result ?? { done: false, records: [], totalSize: 0 }; From 3cd2723d61c4fdc63f46d121fb452270910af6d5 Mon Sep 17 00:00:00 2001 From: Cristian Dominguez <6853656+cristiand391@users.noreply.github.com> Date: Mon, 13 Jun 2022 11:52:54 -0300 Subject: [PATCH 07/10] Update test/commands/force/data/soql/query/dataSoqlQuery.nut.ts Co-authored-by: Ken Lewis <46458081+klewis-sfdc@users.noreply.github.com> --- test/commands/force/data/soql/query/dataSoqlQuery.nut.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/commands/force/data/soql/query/dataSoqlQuery.nut.ts b/test/commands/force/data/soql/query/dataSoqlQuery.nut.ts index 408a685c..78526cdb 100644 --- a/test/commands/force/data/soql/query/dataSoqlQuery.nut.ts +++ b/test/commands/force/data/soql/query/dataSoqlQuery.nut.ts @@ -93,7 +93,7 @@ describe('data:soql:query command', () => { it('should return 3756 ScratchOrgInfo records', () => { // - // set maxQueryLimit to 2456 globally + // set maxQueryLimit to 3756 globally shell.exec('sfdx config:set maxQueryLimit=3756 -g', { silent: true }); const soqlQuery = 'SELECT Id FROM ScratchOrgInfo'; From 24e01ba851362bd6554154274d6db4fd97a2e258 Mon Sep 17 00:00:00 2001 From: mshanemc Date: Tue, 14 Jun 2022 13:22:40 -0500 Subject: [PATCH 08/10] refactor: avoid let, reduce const scope --- src/commands/force/data/soql/query.ts | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/commands/force/data/soql/query.ts b/src/commands/force/data/soql/query.ts index 905f3bd2..24a25342 100644 --- a/src/commands/force/data/soql/query.ts +++ b/src/commands/force/data/soql/query.ts @@ -41,18 +41,16 @@ export class SoqlQuery { logger: Logger, configAgg: SfdxConfigAggregator ): Promise { - let columns: Field[] = []; logger.debug('running query'); // take the limit from the config, then default 50,000 const queryOpts: Partial = { autoFetch: true, - maxFetch: (configAgg.getInfo('maxQueryLimit').value as number) || 50000, + maxFetch: (configAgg.getInfo('maxQueryLimit').value as number) ?? 50000, }; - const records: Record[] = []; - const result: QueryResult = await new Promise((resolve, reject) => { + const records: Record[] = []; const res = connection .query(query) .on('record', (rec) => records.push(rec)) @@ -78,10 +76,8 @@ export class SoqlQuery { } logger.debug(`Query complete with ${result.totalSize} records returned`); - if (result.totalSize) { - logger.debug('fetching columns for query'); - columns = await this.retrieveColumns(connection, query); - } + + const columns = result.totalSize ? await this.retrieveColumns(connection, query, logger) : []; return { query, @@ -100,7 +96,8 @@ export class SoqlQuery { * @param query */ - public async retrieveColumns(connection: Connection, query: string): Promise { + public async retrieveColumns(connection: Connection, query: string, logger?: Logger): Promise { + logger?.debug('fetching columns for query'); // eslint-disable-next-line no-underscore-dangle const columnUrl = `${connection._baseUrl()}/query?q=${encodeURIComponent(query)}&columns=true`; const results = toJsonMap(await connection.request(columnUrl)); From bfbf1dd06dcaa4461c5e7b4d5600190adce3523e Mon Sep 17 00:00:00 2001 From: Cristian Dominguez Date: Tue, 14 Jun 2022 15:42:22 -0300 Subject: [PATCH 09/10] chore: alphabetize devDeps --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 89dd8e2a..48d2b4be 100644 --- a/package.json +++ b/package.json @@ -128,10 +128,10 @@ "oclif": "^2.6.3", "prettier": "^2.4.1", "pretty-quick": "^3.1.0", + "shelljs": "^0.8.3", "shx": "^0.3.3", "sinon": "10.0.0", "ts-node": "^10.4.0", - "typescript": "^4.4.4", - "shelljs": "^0.8.3" + "typescript": "^4.4.4" } } From df6226dcf5ed3ad91084babb6282f52f5ded8757 Mon Sep 17 00:00:00 2001 From: Cristian Dominguez Date: Wed, 15 Jun 2022 16:11:50 -0300 Subject: [PATCH 10/10] fix: bump core --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 48d2b4be..f75bd24a 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,7 @@ "dependencies": { "@oclif/core": "^1.6.4", "@salesforce/command": "^5.1.3", - "@salesforce/core": "^3.19.0", + "@salesforce/core": "^3.21.1", "@salesforce/ts-types": "^1.5.20", "@types/fs-extra": "^9.0.13", "chalk": "^4.1.0", diff --git a/yarn.lock b/yarn.lock index 33cdbca5..50bebc76 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1104,10 +1104,10 @@ semver "^7.3.5" ts-retry-promise "^0.6.0" -"@salesforce/core@^3.19.0": - version "3.19.1" - resolved "https://registry.yarnpkg.com/@salesforce/core/-/core-3.19.1.tgz#bd154d2676a7ab320b4b3596e5bb61635c52a3fe" - integrity sha512-f2Up1N9dVFv4vEKxK97CrPu6IoYl56IynH6kv07/ZO/f4F6JTxpa27e88ZDmPiZw5eBzURhCWCYqpwk5ev0YBg== +"@salesforce/core@^3.19.0", "@salesforce/core@^3.21.1": + version "3.21.1" + resolved "https://registry.yarnpkg.com/@salesforce/core/-/core-3.21.1.tgz#3e51454d6e5f5fbf523e0372378210b8cf85f60f" + integrity sha512-TdOhTeXrfUhRsqqwQKQsA410uBvHsRQiD66wtC0lmUGHRBNxUYEmK6+zbMvVLyPLo6Db4GOPuZ/3DV839fIVBg== dependencies: "@salesforce/bunyan" "^2.0.0" "@salesforce/kit" "^1.5.41"