diff --git a/messages/password.generate.json b/messages/password.generate.json index d265843a..5e08a529 100644 --- a/messages/password.generate.json +++ b/messages/password.generate.json @@ -8,7 +8,17 @@ "flags": { "onBehalfOf": "comma-separated list of usernames or aliases to assign the password to" }, - "noSelfSetError": "Create a scratch org with the enableSetPasswordInApi org security setting set to TRUE and try again.", + "noSelfSetErrorV50": "Create a scratch org with the enableSetPasswordInApi org security setting set to TRUE and try again.", + + "noSelfSetError": "Starting in Spring '21, EnableSetPasswordInApi is a feature in your scratch org definition file and not a setting. This change is a result of the field Settings.securitySettings.passwordPolicies.enableSetPasswordInApi being deprecated in version 51.0 of the Metadata API.", + "noSelfSetErrorActions": [ + "Update your scratch org definition file and remove enableSetPasswordInApi from the \"securitySettings\" setting. Then add EnableSetPasswordInApi as a feature. For example:", + "", + "\"features\": [\"EnableSetPasswordInApi\"]", + "", + "Then try creating the scratch org again." + ], + "scratchFeaturesUrl": "see https://developer.salesforce.com/docs/atlas.en-us.sfdx_dev.meta/sfdx_dev/sfdx_dev_scratch_orgs_def_file_config_values.htm", "success": "Successfully set the password \"%s\" for user %s.", "successMultiple": "Successfully set passwords:%s", "viewWithCommand": "You can see the password again by running \"sfdx force:user:display -u %s\"." diff --git a/package.json b/package.json index 6c3ccb3e..3f048503 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "dependencies": { "@oclif/config": "^1.17.0", "@salesforce/command": "^3.0.4", - "@salesforce/core": "^2.15.2", + "@salesforce/core": "^2.16.4", "tslib": "^1" }, "devDependencies": { diff --git a/src/commands/force/user/password/generate.ts b/src/commands/force/user/password/generate.ts index d2cb3a5c..931c393a 100644 --- a/src/commands/force/user/password/generate.ts +++ b/src/commands/force/user/password/generate.ts @@ -6,7 +6,7 @@ */ import * as os from 'os'; import { flags, FlagsConfig, SfdxCommand } from '@salesforce/command'; -import { Aliases, AuthInfo, Connection, Messages, Org, SfdxError, User, UserFields } from '@salesforce/core'; +import { Aliases, AuthInfo, Connection, Messages, Org, SfdxError, User } from '@salesforce/core'; Messages.importMessagesDirectory(__dirname); const messages = Messages.loadMessages('@salesforce/plugin-user', 'password.generate'); @@ -33,36 +33,52 @@ export class UserPasswordGenerateCommand extends SfdxCommand { private passwordData: PasswordData[] = []; public async run(): Promise { - if (this.flags.onbehalfof) { - // trim the usernames to avoid whitespace - this.usernames = this.flags.onbehalfof.map((user) => user.trim()); - } else { - this.usernames = [this.org.getUsername()]; - } + this.usernames = this.flags.onbehalfof ?? [this.org.getUsername()]; - for (const username of this.usernames) { + for (const aliasOrUsername of this.usernames) { try { // Convert any aliases to usernames // fetch will return undefined if there's no Alias for that name - const aliasOrUsername = (await Aliases.fetch(username)) || username; + const username = (await Aliases.fetch(aliasOrUsername)) || aliasOrUsername; const authInfo: AuthInfo = await AuthInfo.create({ username }); const connection: Connection = await Connection.create({ authInfo }); const org = await Org.create({ connection }); const user: User = await User.create({ org }); const password = User.generatePasswordUtf8(); - const fields: UserFields = await user.retrieve(username); + // we only need the Id, so instead of User.retrieve we'll just query + // this avoids permission issues if ProfileId is restricted for the user querying for it + const result: { Id: string } = await connection.singleRecordQuery( + `SELECT Id FROM User WHERE Username='${username}'` + ); + // userId is used by `assignPassword` so we need to set it here - authInfo.getFields().userId = fields.id; + authInfo.getFields().userId = result.Id; await user.assignPassword(authInfo, password); + password.value((pass) => { - this.passwordData.push({ username: aliasOrUsername, password: pass.toString('utf-8') }); + this.passwordData.push({ username, password: pass.toString('utf-8') }); authInfo.update({ password: pass.toString('utf-8') }); }); + await authInfo.save(); } catch (e) { - if (e.message.includes('Cannot set password for self')) { - throw SfdxError.create('@salesforce/plugin-user', 'password.generate', 'noSelfSetError'); + if ( + e.message.includes('Cannot set password for self') || + e.message.includes('The requested Resource does not exist') + ) { + // we don't have access to the apiVersion from what happened in the try, so until v51 is r2, we have to check versions the hard way + const authInfo: AuthInfo = await AuthInfo.create({ username: aliasOrUsername }); + const connection: Connection = await Connection.create({ authInfo }); + const org = await Org.create({ connection }); + if (parseInt(await org.retrieveMaxApiVersion(), 10) >= 51) { + throw new SfdxError( + messages.getMessage('noSelfSetError'), + 'noSelfSetError', + messages.getMessage('noSelfSetErrorActions').split(os.EOL) + ); + } + throw new SfdxError(messages.getMessage('noSelfSetErrorV50'), 'noSelfSetError'); } throw SfdxError.wrap(e); } diff --git a/src/commands/force/user/permset/assign.ts b/src/commands/force/user/permset/assign.ts index a2e4433f..ccd0ac38 100644 --- a/src/commands/force/user/permset/assign.ts +++ b/src/commands/force/user/permset/assign.ts @@ -49,12 +49,8 @@ export class UserPermsetAssignCommand extends SfdxCommand { public async run(): Promise { try { - if (this.flags.onbehalfof) { - // trim the usernames to avoid whitespace - this.usernames = this.flags.onbehalfof.map((user) => user.trim()); - } else { - this.usernames = [this.org.getUsername()]; - } + this.usernames = this.flags.onbehalfof ?? [this.org.getUsername()]; + const connection: Connection = this.org.getConnection(); const org = await Org.create({ connection }); diff --git a/test/commands/user/password/generate.test.ts b/test/commands/user/password/generate.test.ts index 99e3ae4e..0403c2bf 100644 --- a/test/commands/user/password/generate.test.ts +++ b/test/commands/user/password/generate.test.ts @@ -18,6 +18,7 @@ describe('force:user:password:generate', () => { let authInfoStub: StubbedType; let authInfoConfigStub: StubbedType; const testData = new MockTestOrgData(); + let queryStub; async function prepareStubs(throws = false) { const authFields = await testData.getConfig(); @@ -30,9 +31,10 @@ describe('force:user:password:generate', () => { stubMethod($$.SANDBOX, Connection, 'create').callsFake(async () => Connection.prototype); stubMethod($$.SANDBOX, Org, 'create').callsFake(async () => Org.prototype); stubMethod($$.SANDBOX, Org.prototype, 'getUsername').returns('defaultusername@test.com'); + stubMethod($$.SANDBOX, Org.prototype, 'retrieveMaxApiVersion').returns('51.0'); stubMethod($$.SANDBOX, User, 'create').callsFake(async () => User.prototype); - stubMethod($$.SANDBOX, User.prototype, 'retrieve').resolves({ - id: '0052D0000043PawWWR', + queryStub = stubMethod($$.SANDBOX, Connection.prototype, 'singleRecordQuery').resolves({ + Id: '0052D0000043PawWWR', }); const secureBuffer: SecureBuffer = new SecureBuffer(); @@ -68,6 +70,7 @@ describe('force:user:password:generate', () => { const result = JSON.parse(ctx.stdout).result; expect(result).to.deep.equal(expected); expect(authInfoStub.update.callCount).to.equal(2); + expect(queryStub.callCount).to.equal(2); }); test @@ -79,6 +82,7 @@ describe('force:user:password:generate', () => { const result = JSON.parse(ctx.stdout).result; expect(result).to.deep.equal(expected); expect(authInfoStub.update.callCount).to.equal(1); + expect(queryStub.callCount).to.equal(1); }); test @@ -92,5 +96,6 @@ describe('force:user:password:generate', () => { expect(result.status).to.equal(1); expect(result.name).to.equal('noSelfSetError'); expect(authInfoStub.update.callCount).to.equal(0); + expect(queryStub.callCount).to.equal(1); }); }); diff --git a/yarn.lock b/yarn.lock index 91dad344..b293b3d6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -513,25 +513,25 @@ safe-json-stringify "~1" "@salesforce/command@^3.0.4": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@salesforce/command/-/command-3.0.5.tgz#262665e0845f247005916b2a3ac62e1244b078e4" - integrity sha512-FhQjRALvcqXjVjv/tjPweqyN6bEhVrxV2cyM+gqns5aY5GQy9KMtNI6Sg/D5Mg4Htf89jHgV+iqgndNzGyDX2g== + version "3.1.0" + resolved "https://registry.yarnpkg.com/@salesforce/command/-/command-3.1.0.tgz#98874539aeda69aeb20765dcf7ed02a2945cec45" + integrity sha512-Ggz+P35uJVd2w+R66TGz1Rs4jr6KKmyC3bkpgbJTm+yjaOjy2l/if2hus6fhZ680LUxCucDVXbyEjdzu3B+ioA== dependencies: "@oclif/command" "^1.5.17" "@oclif/errors" "^1.2.2" "@oclif/parser" "^3.8.3" "@oclif/plugin-help" "^2.2.0" "@oclif/test" "^1.2.4" - "@salesforce/core" "^2.15.2" + "@salesforce/core" "^2.16.3" "@salesforce/kit" "^1.2.2" "@salesforce/ts-types" "^1.2.0" chalk "^2.4.2" cli-ux "^4.9.3" -"@salesforce/core@^2.15.2": - version "2.16.3" - resolved "https://registry.yarnpkg.com/@salesforce/core/-/core-2.16.3.tgz#b2a9b0b44774f6a892ecb830b9c71f5e1c71ad0e" - integrity sha512-cZ7xeacEsIq/sjbFqE6ARkt7xgJv3VDNrh/FlK7yhHYH0ka1pkUjMooYse2IJzAdt+ROyrZWsvvMvZsmfFlfoA== +"@salesforce/core@^2.16.3", "@salesforce/core@^2.16.4": + version "2.16.4" + resolved "https://registry.yarnpkg.com/@salesforce/core/-/core-2.16.4.tgz#a8399b6fe8d76431bf22f9555d3ca207ba8dac60" + integrity sha512-92SNi3yLQ2PCr91wopOXpzWejLsp1+ICEEzI65uRK06cset1YeoVnxSPs7C3nQ1qpJqFuWW52PmheKY310lP2Q== dependencies: "@salesforce/bunyan" "^2.0.0" "@salesforce/kit" "^1.3.3" @@ -549,9 +549,9 @@ sfdx-faye "^1.0.9" "@salesforce/dev-config@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@salesforce/dev-config/-/dev-config-2.0.0.tgz#388d71830e63078a835a844b51d2661c73ac851e" - integrity sha512-CwPeiNrH7bULxjr7RmvStR3uPWu3aMl35mQrUNip2pTMvXQ4QmcDowWqx5MSaLj03JIQaoxnt6g8qWlhyOmxUQ== + version "2.1.0" + resolved "https://registry.yarnpkg.com/@salesforce/dev-config/-/dev-config-2.1.0.tgz#78efdf5d660d7cb839d9cafa036f9882741dc6bc" + integrity sha512-I+zrptt8zI1jbP3TVA6g7i3quuh71tPky8gwCsXaQ2X9ea1xbeAslN4YjWfgqbY5SaxJhqP979oxFADlH+OehQ== "@salesforce/dev-scripts@0.6.2": version "0.6.2" @@ -594,11 +594,11 @@ xunit-file "^1.0.0" "@salesforce/kit@^1.2.2", "@salesforce/kit@^1.3.3": - version "1.3.3" - resolved "https://registry.yarnpkg.com/@salesforce/kit/-/kit-1.3.3.tgz#eaea23b1be7aebb81f9f091c8f77c2733a8ae710" - integrity sha512-Ed5lh8xyCwaXeB1Sovr9xbQZ1tpQg5vSeNvKROlJQRk4Gj3IBm73pKPPuNn+AeXN51lWr9my0ftLREtyig3FoA== + version "1.4.0" + resolved "https://registry.yarnpkg.com/@salesforce/kit/-/kit-1.4.0.tgz#4a43a8633f967066895d865813907eea071ef541" + integrity sha512-/6owokpdkljkbM5axJ7xVgn6ggMS1YJgtD8zv2gBAfIHT/EgIMnwkyU6Rymb8QmWp93q/RoHXdgNQkDonWYSqw== dependencies: - "@salesforce/ts-types" "^1.4.3" + "@salesforce/ts-types" "^1.5.0" tslib "^1.10.0" "@salesforce/prettier-config@^0.0.1": @@ -620,10 +620,10 @@ sinon "5.1.1" tslib "^1.10.0" -"@salesforce/ts-types@^1.0.0", "@salesforce/ts-types@^1.2.0", "@salesforce/ts-types@^1.3.0", "@salesforce/ts-types@^1.4.3": - version "1.4.3" - resolved "https://registry.yarnpkg.com/@salesforce/ts-types/-/ts-types-1.4.3.tgz#941ceac6d72a2983ec03d5263b509f25bab574c3" - integrity sha512-Fdx9KEBalwxBFkP0ZW9uIcndjFys9fm8ma9vItd3EwPZLJcAHWfBa5/y9uHLAvYHkKK8F8FYE0sRrVZ1cn48hw== +"@salesforce/ts-types@^1.0.0", "@salesforce/ts-types@^1.2.0", "@salesforce/ts-types@^1.3.0", "@salesforce/ts-types@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@salesforce/ts-types/-/ts-types-1.5.0.tgz#e2baaca088f30a3f9d10127eb789a12abad44958" + integrity sha512-fJsVXSJ0s8voDNM7TYulPkiRDdR1bC/rE2hsY/+2q0DDa57UAeql34tEdaBs84GGbe/VGCVbiazkLDJW/bX7KQ== dependencies: tslib "^1.10.0" @@ -665,7 +665,7 @@ array-from "^2.1.1" lodash "^4.17.15" -"@sinonjs/samsam@^5.3.0": +"@sinonjs/samsam@^5.3.1": version "5.3.1" resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-5.3.1.tgz#375a45fe6ed4e92fca2fb920e007c48232a6507f" integrity sha512-1Hc0b1TtyfBu8ixF/tpfSHTVWKwCBLY4QJbkgnE7HcwyvT2xArDxb4K7dMgqRm3szI+LJbzmW/s4xxEhv6hwDg== @@ -1784,9 +1784,9 @@ dayjs-plugin-utc@^0.1.2: integrity sha512-ExERH5o3oo6jFOdkvMP3gytTCQ9Ksi5PtylclJWghr7k7m3o2U5QrwtdiJkOxLOH4ghr0EKhpqGefzGz1VvVJg== dayjs@^1.8.16: - version "1.10.3" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.3.tgz#cf3357c8e7f508432826371672ebf376cb7d619b" - integrity sha512-/2fdLN987N8Ki7Id8BUN2nhuiRyxTLumQnSQf9CNncFCyqFsSKb9TNhzRYcC8K8eJSJOKvbvkImo/MKKhNi4iw== + version "1.10.4" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.4.tgz#8e544a9b8683f61783f570980a8a80eaf54ab1e2" + integrity sha512-RI/Hh4kqRc1UKLOAf/T5zdMMX5DQIlDxwUe3wSyMMnEbGunnpENCdbUgM+dW7kXidZqCttBrmw7BhN4TMddkCw== debug@3.2.6: version "3.2.6" @@ -2131,9 +2131,9 @@ eslint-plugin-jsdoc@^27.0.3: spdx-expression-parse "^3.0.1" eslint-plugin-prefer-arrow@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.2.tgz#0c6d25a6b94cb3e0110a23d129760af5860edb6e" - integrity sha512-C8YMhL+r8RMeMdYAw/rQtE6xNdMulj+zGWud/qIGnlmomiPRaLDGLMeskZ3alN6uMBojmooRimtdrXebLN4svQ== + version "1.2.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.3.tgz#e7fbb3fa4cd84ff1015b9c51ad86550e55041041" + integrity sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ== eslint-plugin-prettier@^3.1.3: version "3.3.1" @@ -2428,9 +2428,9 @@ fast-levenshtein@~2.0.6: integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= fastq@^1.6.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.10.0.tgz#74dbefccade964932cdf500473ef302719c652bb" - integrity sha512-NL2Qc5L3iQEsyYzweq7qfgy5OtXCmGzGvhElGEd/SoFWEMOEczNh5s5ocaF01HDetxz+p8ecjNPA6cZxxIHmzA== + version "1.10.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.10.1.tgz#8b8f2ac8bf3632d67afcd65dac248d5fdc45385e" + integrity sha512-AWuv6Ery3pM+dY7LYS8YIaCiQvUaos9OB1RyNgaOWnaX+Tik7Onvcsf8x8c+YtDeT0maYLniBip2hox5KtEXXA== dependencies: reusify "^1.0.4" @@ -2710,9 +2710,9 @@ get-func-name@^2.0.0: integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= get-intrinsic@^1.0.1, get-intrinsic@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.0.2.tgz#6820da226e50b24894e08859469dc68361545d49" - integrity sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg== + version "1.1.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.0.tgz#892e62931e6938c8a23ea5aaebcfb67bd97da97e" + integrity sha512-M11rgtQp5GZMZzDL7jLTNxbDfurpzuau5uqRWDPvlHjfvg3TdScAZo96GLvhMjImrmR8uAt0FS2RLoMrfWGKlg== dependencies: function-bind "^1.1.1" has "^1.0.3" @@ -2768,12 +2768,12 @@ getpass@^0.1.1: assert-plus "^1.0.0" git-raw-commits@^2.0.0: - version "2.0.9" - resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.9.tgz#5cbc707a615cb77b71e687f8a1ee54af46208b22" - integrity sha512-hSpNpxprVno7IOd4PZ93RQ+gNdzPAIrW0x8av6JQDJGV4k1mR9fE01dl8sEqi2P7aKmmwiGUn1BCPuf16Ae0Qw== + version "2.0.10" + resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.10.tgz#e2255ed9563b1c9c3ea6bd05806410290297bbc1" + integrity sha512-sHhX5lsbG9SOO6yXdlwgEMQ/ljIn7qMpAbJZCGfXX2fq5T8M5SrDnpYk9/4HswTildcIqatsWa91vty6VhWSaQ== dependencies: dargs "^7.0.0" - lodash.template "^4.0.2" + lodash "^4.17.15" meow "^8.0.0" split2 "^3.0.0" through2 "^4.0.0" @@ -3033,9 +3033,9 @@ hosted-git-info@^2.1.4: integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== hosted-git-info@^3.0.6: - version "3.0.7" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.7.tgz#a30727385ea85acfcee94e0aad9e368c792e036c" - integrity sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ== + version "3.0.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.8.tgz#6e35d4cc87af2c5f816e4cb9ce350ba87a3f370d" + integrity sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw== dependencies: lru-cache "^6.0.0" @@ -3913,7 +3913,7 @@ lodash.set@^4.3.2: resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" integrity sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM= -lodash.template@^4.0.2, lodash.template@^4.4.0: +lodash.template@^4.4.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== @@ -4798,9 +4798,9 @@ path-type@^4.0.0: integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== pathval@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" - integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= + version "1.1.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== performance-now@^2.1.0: version "2.1.0" @@ -5456,13 +5456,13 @@ sinon@5.1.1: type-detect "^4.0.8" sinon@^9.0.2: - version "9.2.3" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-9.2.3.tgz#f68ce414e843e2fd638703043c97f260697caa52" - integrity sha512-m+DyAWvqVHZtjnjX/nuShasykFeiZ+nPuEfD4G3gpvKGkXRhkF/6NSt2qN2FjZhfrcHXFzUzI+NLnk+42fnLEw== + version "9.2.4" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-9.2.4.tgz#e55af4d3b174a4443a8762fa8421c2976683752b" + integrity sha512-zljcULZQsJxVra28qIAL6ow1Z9tpattkCTEJR4RBP3TGc00FcttsP5pK284Nas5WjMZU5Yzy3kAIp3B3KRf5Yg== dependencies: "@sinonjs/commons" "^1.8.1" "@sinonjs/fake-timers" "^6.0.1" - "@sinonjs/samsam" "^5.3.0" + "@sinonjs/samsam" "^5.3.1" diff "^4.0.2" nise "^4.0.4" supports-color "^7.1.0" @@ -6047,9 +6047,9 @@ tslib@^2.0.0, tslib@^2.0.3: integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== tsutils@^3.17.1: - version "3.19.1" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.19.1.tgz#d8566e0c51c82f32f9c25a4d367cd62409a547a9" - integrity sha512-GEdoBf5XI324lu7ycad7s6laADfnAqCw6wLGI+knxvw9vsIYBaJfYdmeCEG3FMMUiSm3OGgNb+m6utsWf5h9Vw== + version "3.20.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.20.0.tgz#ea03ea45462e146b53d70ce0893de453ff24f698" + integrity sha512-RYbuQuvkhuqVeXweWT3tJLKOEJ/UUw9GjNEZGWdrLLlM+611o1gwLHBpxoFJKKl25fLprp2eVthtKs5JOrNeXg== dependencies: tslib "^1.8.1"