From 3f7d75a4d1490037610b55c3f49823ed94decbbd Mon Sep 17 00:00:00 2001 From: peternhale Date: Fri, 11 Jun 2021 14:26:01 -0600 Subject: [PATCH] feat: add auth:accesstoken:store command (#165) * feat: add command auth:token:set @W-8066452@ * chore: update command ref and topic map * chore: unit tests and refactor from team guidance * chore: update cmd ref and package.json * chore: add tests * chore: update command-snapshot * chore: remove .codecov.yml Authored via Leif * chore: sync github PR slack notification (#152) Authored via Leif * feat: identify scratch orgs if hub is known during auth (#148) * feat: identify scratch orgs if hub is known during auth * chore: remove codecov * chore: clean up github folder * refactor: don't use prod-like loginUrl to exit * chore: prune unnecessary ts-comment * test: temporarily remove scratch-org-id to verify tests * style: typos * test: improve logging, temporarily use console * chore: back to regular logging * test: stubs for authinfo.hasAuthentications * style: typos * test: try single test * test: return a promise? * test: check authentications from instance * test: stub method used by hasAuthentications * test: run all the tests again * test: try grant using stubbed listAll * test: stub listAll for web:login * test: store uses stub * style: better error messages * style: typo in nut name! * refactor: changes from review comments * refactor: getFields from authinfo in scratch-id * Revert "refactor: getFields from authinfo in scratch-id" This reverts commit c914648b91e96262737ce4ad02a6d1ed8440d2e1. * style: comment for why we pass in the fields object * fix: use decrypted fields, not result of getFields * chore(release): 1.6.0 [ci skip] * chore: sync github PR slack notification (#152) Authored via Leif * chore: add call to reestablish org full identity * chore: set to fake return empty array * chore: sync github PR slack notification (#152) Authored via Leif * chore: sync github PR slack notification (#152) Authored via Leif * chore: sync github PR slack notification (#152) Authored via Leif * feat: add accesstoken command tests * chore: remove accesstokenfile parameter * chore: requested review changes * chore: clean up messages * chore: update command example missing instanceurl * chore: bump core version to 2.21.0 * chore: bump testkit to 1.1.2 * chore: dep changes * chore: pin dev-scripts to 0.9.11 * chore: fix the tests Co-authored-by: Benjamin Maggi Co-authored-by: SF-CLI-BOT <72033612+SF-CLI-BOT@users.noreply.github.com> Co-authored-by: Shane McLaughlin Co-authored-by: SF-CLI-BOT --- .github/dependabot.yml | 20 +- CHANGELOG.md | 37 +- README.md | 37 +- command-snapshot.json | 13 + messages/accesstoken.store.json | 9 + messages/logout.json | 7 +- messages/messages.json | 6 +- package.json | 7 +- src/commands/auth/accesstoken/store.ts | 109 +++++ src/commands/auth/logout.ts | 3 +- src/common.ts | 1 + src/prompts.ts | 19 +- test/commands/auth/accesstoken/store.nut.ts | 69 +++ test/commands/auth/accesstoken/store.test.ts | 129 +++++ test/commands/auth/web/login.test.ts | 4 +- yarn.lock | 482 ++++++++++--------- 16 files changed, 668 insertions(+), 284 deletions(-) create mode 100644 messages/accesstoken.store.json create mode 100644 src/commands/auth/accesstoken/store.ts create mode 100644 test/commands/auth/accesstoken/store.nut.ts create mode 100644 test/commands/auth/accesstoken/store.test.ts diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 250593b9..6c9016d6 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,17 +1,17 @@ version: 2 updates: - - package-ecosystem: "npm" - directory: "/" + - package-ecosystem: 'npm' + directory: '/' schedule: - interval: "monthly" + interval: 'monthly' labels: - - "dependencies" + - 'dependencies' open-pull-requests-limit: 100 pull-request-branch-name: - separator: "-" + separator: '-' ignore: - - dependency-name: "typescript" - - dependency-name: "sinon" - - dependency-name: "string-ansi" - - dependency-name: "*" - update-types: ["version-update:semver-major"] + - dependency-name: 'typescript' + - dependency-name: 'sinon' + - dependency-name: 'string-ansi' + - dependency-name: '*' + update-types: ['version-update:semver-major'] diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b80b127..3bf015a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,64 +4,57 @@ All notable changes to this project will be documented in this file. See [standa ### [1.6.1](https://github.com/salesforcecli/plugin-auth/compare/v1.6.0...v1.6.1) (2021-05-27) - ### Bug Fixes -* bump core version ([4ac6ee1](https://github.com/salesforcecli/plugin-auth/commit/4ac6ee11544f3cc5aff4aa8e34fa0b7b5120264c)) +- bump core version ([4ac6ee1](https://github.com/salesforcecli/plugin-auth/commit/4ac6ee11544f3cc5aff4aa8e34fa0b7b5120264c)) ## [1.6.0](https://github.com/salesforcecli/plugin-auth/compare/v1.5.4...v1.6.0) (2021-05-14) - ### Features -* identify scratch orgs if hub is known during auth ([#148](https://github.com/salesforcecli/plugin-auth/issues/148)) ([3bd182a](https://github.com/salesforcecli/plugin-auth/commit/3bd182aeb60ee8c2e5ff3183d5c452b20cf46213)) +- identify scratch orgs if hub is known during auth ([#148](https://github.com/salesforcecli/plugin-auth/issues/148)) ([3bd182a](https://github.com/salesforcecli/plugin-auth/commit/3bd182aeb60ee8c2e5ff3183d5c452b20cf46213)) ### [1.5.4](https://github.com/salesforcecli/plugin-auth/compare/v1.5.3...v1.5.4) (2021-05-10) ### [1.5.3](https://github.com/salesforcecli/plugin-auth/compare/v1.5.2...v1.5.3) (2021-04-12) - ### Bug Fixes -* catch lightning urls when passed via -r attribute ([d593e61](https://github.com/salesforcecli/plugin-auth/commit/d593e611724ddd1f45f2217b17e679b88762b3c6)) -* test for lightning instance url ([d997e96](https://github.com/salesforcecli/plugin-auth/commit/d997e96031c7999bc48b62a73c32c1a4291b6944)) +- catch lightning urls when passed via -r attribute ([d593e61](https://github.com/salesforcecli/plugin-auth/commit/d593e611724ddd1f45f2217b17e679b88762b3c6)) +- test for lightning instance url ([d997e96](https://github.com/salesforcecli/plugin-auth/commit/d997e96031c7999bc48b62a73c32c1a4291b6944)) ### [1.5.2](https://github.com/salesforcecli/plugin-auth/compare/v1.5.1...v1.5.2) (2021-04-09) ### [1.5.1](https://github.com/salesforcecli/plugin-auth/compare/v1.5.0...v1.5.1) (2021-03-17) - ### Bug Fixes -* **sfdxauthurl:** error handling regression ([11535e1](https://github.com/salesforcecli/plugin-auth/commit/11535e19c28888a9fff361bad33d199629cd1c77)) +- **sfdxauthurl:** error handling regression ([11535e1](https://github.com/salesforcecli/plugin-auth/commit/11535e19c28888a9fff361bad33d199629cd1c77)) ## [1.5.0](https://github.com/salesforcecli/plugin-auth/compare/v1.4.10...v1.5.0) (2021-03-17) - ### Features -* add compatibility between force:org:display output and auth:sfdxurl:store input ([77e3de9](https://github.com/salesforcecli/plugin-auth/commit/77e3de9a3a943a258ac4890e8c712c1f8b61495c)) - +- add compatibility between force:org:display output and auth:sfdxurl:store input ([77e3de9](https://github.com/salesforcecli/plugin-auth/commit/77e3de9a3a943a258ac4890e8c712c1f8b61495c)) ### Bug Fixes -* allow auth:sfdxurl:store to use a json file ([a9f0300](https://github.com/salesforcecli/plugin-auth/commit/a9f0300f5a3d6deef6b5e44bd15cf354cd9ae92c)) -* cleanup code and unit tests ([882014d](https://github.com/salesforcecli/plugin-auth/commit/882014d3fc25dcb020238f6e3acac02e2f59a135)) -* improve error handling ([1cb5def](https://github.com/salesforcecli/plugin-auth/commit/1cb5def51c3cf06e87f2a6029868ebe135f04161)) -* unit test for using json file ([f749fd3](https://github.com/salesforcecli/plugin-auth/commit/f749fd3c7512dfad416270f1053984ac13930a6c)) -* unit tests now run on Windows ([119d49a](https://github.com/salesforcecli/plugin-auth/commit/119d49a0a1be3a9794cefab3cf17c384be62d613)) -* update documentation ([5033f35](https://github.com/salesforcecli/plugin-auth/commit/5033f354de1108cf266f32b9b3b8600aaf634663)) -* whoopsie ([5b6f898](https://github.com/salesforcecli/plugin-auth/commit/5b6f8981ff46af6cb9add70cb6f7bf0b1fc12ad4)) +- allow auth:sfdxurl:store to use a json file ([a9f0300](https://github.com/salesforcecli/plugin-auth/commit/a9f0300f5a3d6deef6b5e44bd15cf354cd9ae92c)) +- cleanup code and unit tests ([882014d](https://github.com/salesforcecli/plugin-auth/commit/882014d3fc25dcb020238f6e3acac02e2f59a135)) +- improve error handling ([1cb5def](https://github.com/salesforcecli/plugin-auth/commit/1cb5def51c3cf06e87f2a6029868ebe135f04161)) +- unit test for using json file ([f749fd3](https://github.com/salesforcecli/plugin-auth/commit/f749fd3c7512dfad416270f1053984ac13930a6c)) +- unit tests now run on Windows ([119d49a](https://github.com/salesforcecli/plugin-auth/commit/119d49a0a1be3a9794cefab3cf17c384be62d613)) +- update documentation ([5033f35](https://github.com/salesforcecli/plugin-auth/commit/5033f354de1108cf266f32b9b3b8600aaf634663)) +- whoopsie ([5b6f898](https://github.com/salesforcecli/plugin-auth/commit/5b6f8981ff46af6cb9add70cb6f7bf0b1fc12ad4)) ### [1.4.10](https://github.com/salesforcecli/plugin-auth/compare/v1.4.9...v1.4.10) (2021-03-03) ### [1.4.9](https://github.com/salesforcecli/plugin-auth/compare/v1.4.8...v1.4.9) (2021-02-23) - ### Bug Fixes -* add actual error from API and throw ([bf29ff1](https://github.com/salesforcecli/plugin-auth/commit/bf29ff1d5c49e1dcd3dc82baf94345a3f979af32)) -* should throw error with message ([95d53dd](https://github.com/salesforcecli/plugin-auth/commit/95d53ddf767c4b7ea5f289195595f11a0fd11c0f)) +- add actual error from API and throw ([bf29ff1](https://github.com/salesforcecli/plugin-auth/commit/bf29ff1d5c49e1dcd3dc82baf94345a3f979af32)) +- should throw error with message ([95d53dd](https://github.com/salesforcecli/plugin-auth/commit/95d53ddf767c4b7ea5f289195595f11a0fd11c0f)) ### [1.4.8](https://github.com/salesforcecli/plugin-auth/compare/v1.4.7...v1.4.8) (2021-02-04) diff --git a/README.md b/README.md index 26c5e2f9..ae65a57e 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,6 @@ We always recommend using the latest version of these commands bundled with the ## Install - ```bash sfdx plugins:install auth@x.y.z ``` @@ -70,12 +69,13 @@ sfdx plugins # Commands -* [`sfdx auth:device:login [-i ] [-r ] [-d] [-s] [-a ] [--json] [--loglevel trace|debug|info|warn|error|fatal|TRACE|DEBUG|INFO|WARN|ERROR|FATAL]`](#sfdx-authdevicelogin--i-string--r-url--d--s--a-string---json---loglevel-tracedebuginfowarnerrorfataltracedebuginfowarnerrorfatal) -* [`sfdx auth:jwt:grant -u -f -i [-r ] [-d] [-s] [-a ] [--json] [--loglevel trace|debug|info|warn|error|fatal|TRACE|DEBUG|INFO|WARN|ERROR|FATAL]`](#sfdx-authjwtgrant--u-string--f-filepath--i-string--r-url--d--s--a-string---json---loglevel-tracedebuginfowarnerrorfataltracedebuginfowarnerrorfatal) -* [`sfdx auth:list [--json] [--loglevel trace|debug|info|warn|error|fatal|TRACE|DEBUG|INFO|WARN|ERROR|FATAL]`](#sfdx-authlist---json---loglevel-tracedebuginfowarnerrorfataltracedebuginfowarnerrorfatal) -* [`sfdx auth:logout [-a] [-p] [-u ] [--apiversion ] [--json] [--loglevel trace|debug|info|warn|error|fatal|TRACE|DEBUG|INFO|WARN|ERROR|FATAL]`](#sfdx-authlogout--a--p--u-string---apiversion-string---json---loglevel-tracedebuginfowarnerrorfataltracedebuginfowarnerrorfatal) -* [`sfdx auth:sfdxurl:store -f [-d] [-s] [-a ] [--json] [--loglevel trace|debug|info|warn|error|fatal|TRACE|DEBUG|INFO|WARN|ERROR|FATAL]`](#sfdx-authsfdxurlstore--f-filepath--d--s--a-string---json---loglevel-tracedebuginfowarnerrorfataltracedebuginfowarnerrorfatal) -* [`sfdx auth:web:login [-i ] [-r ] [-d] [-s] [-a ] [--json] [--loglevel trace|debug|info|warn|error|fatal|TRACE|DEBUG|INFO|WARN|ERROR|FATAL]`](#sfdx-authweblogin--i-string--r-url--d--s--a-string---json---loglevel-tracedebuginfowarnerrorfataltracedebuginfowarnerrorfatal) + +- [`sfdx auth:device:login [-i ] [-r ] [-d] [-s] [-a ] [--json] [--loglevel trace|debug|info|warn|error|fatal|TRACE|DEBUG|INFO|WARN|ERROR|FATAL]`](#sfdx-authdevicelogin--i-string--r-url--d--s--a-string---json---loglevel-tracedebuginfowarnerrorfataltracedebuginfowarnerrorfatal) +- [`sfdx auth:jwt:grant -u -f -i [-r ] [-d] [-s] [-a ] [--json] [--loglevel trace|debug|info|warn|error|fatal|TRACE|DEBUG|INFO|WARN|ERROR|FATAL]`](#sfdx-authjwtgrant--u-string--f-filepath--i-string--r-url--d--s--a-string---json---loglevel-tracedebuginfowarnerrorfataltracedebuginfowarnerrorfatal) +- [`sfdx auth:list [--json] [--loglevel trace|debug|info|warn|error|fatal|TRACE|DEBUG|INFO|WARN|ERROR|FATAL]`](#sfdx-authlist---json---loglevel-tracedebuginfowarnerrorfataltracedebuginfowarnerrorfatal) +- [`sfdx auth:logout [-a] [-p] [-u ] [--apiversion ] [--json] [--loglevel trace|debug|info|warn|error|fatal|TRACE|DEBUG|INFO|WARN|ERROR|FATAL]`](#sfdx-authlogout--a--p--u-string---apiversion-string---json---loglevel-tracedebuginfowarnerrorfataltracedebuginfowarnerrorfatal) +- [`sfdx auth:sfdxurl:store -f [-d] [-s] [-a ] [--json] [--loglevel trace|debug|info|warn|error|fatal|TRACE|DEBUG|INFO|WARN|ERROR|FATAL]`](#sfdx-authsfdxurlstore--f-filepath--d--s--a-string---json---loglevel-tracedebuginfowarnerrorfataltracedebuginfowarnerrorfatal) +- [`sfdx auth:web:login [-i ] [-r ] [-d] [-s] [-a ] [--json] [--loglevel trace|debug|info|warn|error|fatal|TRACE|DEBUG|INFO|WARN|ERROR|FATAL]`](#sfdx-authweblogin--i-string--r-url--d--s--a-string---json---loglevel-tracedebuginfowarnerrorfataltracedebuginfowarnerrorfatal) ## `sfdx auth:device:login [-i ] [-r ] [-d] [-s] [-a ] [--json] [--loglevel trace|debug|info|warn|error|fatal|TRACE|DEBUG|INFO|WARN|ERROR|FATAL]` @@ -83,7 +83,7 @@ authorize an org using a device code ``` USAGE - $ sfdx auth:device:login [-i ] [-r ] [-d] [-s] [-a ] [--json] [--loglevel + $ sfdx auth:device:login [-i ] [-r ] [-d] [-s] [-a ] [--json] [--loglevel trace|debug|info|warn|error|fatal|TRACE|DEBUG|INFO|WARN|ERROR|FATAL] OPTIONS @@ -126,7 +126,7 @@ authorize an org using the JWT flow ``` USAGE - $ sfdx auth:jwt:grant -u -f -i [-r ] [-d] [-s] [-a ] [--json] [--loglevel + $ sfdx auth:jwt:grant -u -f -i [-r ] [-d] [-s] [-a ] [--json] [--loglevel trace|debug|info|warn|error|fatal|TRACE|DEBUG|INFO|WARN|ERROR|FATAL] OPTIONS @@ -159,8 +159,8 @@ OPTIONS DESCRIPTION Use a certificate associated with your private key that has been uploaded to a personal connected app. - If you specify an --instanceurl value, this value overrides the sfdcLoginUrl value in your sfdx-project.json file. To - specify a My Domain URL, use the format MyDomainName.my.salesforce.com (not MyDomainName.lightning.force.com). To + If you specify an --instanceurl value, this value overrides the sfdcLoginUrl value in your sfdx-project.json file. To + specify a My Domain URL, use the format MyDomainName.my.salesforce.com (not MyDomainName.lightning.force.com). To specify a sandbox, set --instanceurl to https://test.salesforce.com. ALIASES @@ -200,7 +200,7 @@ log out from authorized orgs ``` USAGE - $ sfdx auth:logout [-a] [-p] [-u ] [--apiversion ] [--json] [--loglevel + $ sfdx auth:logout [-a] [-p] [-u ] [--apiversion ] [--json] [--loglevel trace|debug|info|warn|error|fatal|TRACE|DEBUG|INFO|WARN|ERROR|FATAL] OPTIONS @@ -238,7 +238,7 @@ Authorize an org using an SFDX auth URL ``` USAGE - $ sfdx auth:sfdxurl:store -f [-d] [-s] [-a ] [--json] [--loglevel + $ sfdx auth:sfdxurl:store -f [-d] [-s] [-a ] [--json] [--loglevel trace|debug|info|warn|error|fatal|TRACE|DEBUG|INFO|WARN|ERROR|FATAL] OPTIONS @@ -262,9 +262,9 @@ OPTIONS this command invocation DESCRIPTION - Authorize a Salesforce org using an SFDX auth URL stored within a file. The URL must have the format + Authorize a Salesforce org using an SFDX auth URL stored within a file. The URL must have the format "force://@" or "force://::@". - You have three options when creating the auth file. The easiest option is to redirect the output of the `sfdx + You have three options when creating the auth file. The easiest option is to redirect the output of the `sfdx force:org:display --verbose --json` command into a file. For example, using an org you have already authorized: @@ -291,7 +291,7 @@ authorize an org using the web login flow ``` USAGE - $ sfdx auth:web:login [-i ] [-r ] [-d] [-s] [-a ] [--json] [--loglevel + $ sfdx auth:web:login [-i ] [-r ] [-d] [-s] [-a ] [--json] [--loglevel trace|debug|info|warn|error|fatal|TRACE|DEBUG|INFO|WARN|ERROR|FATAL] OPTIONS @@ -318,8 +318,8 @@ OPTIONS this command invocation DESCRIPTION - If you specify an --instanceurl value, this value overrides the sfdcLoginUrl value in your sfdx-project.json file. To - specify a My Domain URL, use the format MyDomainName.my.salesforce.com (not MyDomainName.lightning.force.com). To log + If you specify an --instanceurl value, this value overrides the sfdcLoginUrl value in your sfdx-project.json file. To + specify a My Domain URL, use the format MyDomainName.my.salesforce.com (not MyDomainName.lightning.force.com). To log in to a sandbox, set --instanceurl to https://test.salesforce.com. ALIASES @@ -332,4 +332,5 @@ EXAMPLES ``` _See code: [src/commands/auth/web/login.ts](https://github.com/salesforcecli/plugin-auth/blob/v1.6.1/src/commands/auth/web/login.ts)_ + diff --git a/command-snapshot.json b/command-snapshot.json index fe55d44c..62135ca8 100644 --- a/command-snapshot.json +++ b/command-snapshot.json @@ -1,4 +1,17 @@ [ + { + "command": "auth:accesstoken:store", + "plugin": "@salesforce/plugin-auth", + "flags": [ + "instanceurl", + "json", + "loglevel", + "noprompt", + "setalias", + "setdefaultdevhubusername", + "setdefaultusername" + ] + }, { "command": "auth:device:login", "plugin": "@salesforce/plugin-auth", diff --git a/messages/accesstoken.store.json b/messages/accesstoken.store.json new file mode 100644 index 00000000..ff52b9b2 --- /dev/null +++ b/messages/accesstoken.store.json @@ -0,0 +1,9 @@ +{ + "description": "authorize an org using a Salesforce access token\nWhen run interactively, the command prompts you for the access token.\nTo use the command in a CI/CD script, set the SFDX_ACCESS_TOKEN environment variable to the access token.", + "examples": [ + "sfdx auth:accesstoken:store --instanceurl https://login.salesforce.com", + "sfdx auth:accesstoken:store --instanceurl https://dev-hub.my.salesforce.com", + "export SFDX_ACCESS_TOKEN=00Dxx0000000000!xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\nsfdx auth:accesstoken:store --instanceurl https://dev-hub.my.salesforce.com" + ], + "invalidAccessTokenFormat": "The access token isn't in the correct format.\nIt should follow this pattern: %s." +} diff --git a/messages/logout.json b/messages/logout.json index af981aeb..1a0651af 100644 --- a/messages/logout.json +++ b/messages/logout.json @@ -1,13 +1,8 @@ { "description": "log out from authorized orgs\nBy default, this command logs you out from your default scratch org.", - "examples": [ - "sfdx auth:logout -u me@my.org", - "sfdx auth:logout -a", - "sfdx auth:logout -p" - ], + "examples": ["sfdx auth:logout -u me@my.org", "sfdx auth:logout -a", "sfdx auth:logout -p"], "all": "include all authenticated orgs", "allLong": "Includes all authenticated orgs: for example, Dev Hubs, sandboxes, DE orgs, and expired, deleted, and unknown-status scratch orgs.", - "noPrompt": "do not prompt for confirmation", "logoutCommandYesNo": "Are you sure you want to log out from these org(s)?\n%s\n\nImportant: You need a password to reauthorize scratch orgs. By default, scratch orgs have no password. If you still need your scratch orgs, run \"sfdx force:user:password:generate\" before logging out. If you don't need the scratch orgs anymore, run \"sfdx force:org:delete\" instead of logging out.\n\nLog out (y/n)?", "specifiedBothUserAndAllError": "Specify either --targetusername or --all.", "logoutOrgCommandSuccess": "Successfully logged out of orgs: %s" diff --git a/messages/messages.json b/messages/messages.json index a24604d8..7758dc90 100644 --- a/messages/messages.json +++ b/messages/messages.json @@ -29,5 +29,9 @@ "noPromptAuth": "do not prompt for auth confirmation in demo mode", "disableMasking": "disable masking of user input (for use with problematic terminals)", "clientSecretStdin": "OAuth client secret of personal connected app?", - "invalidInstanceUrl": "Invalid instance URL. Specify a Salesforce instance URL using the format .salesforce.com" + "invalidInstanceUrl": "Invalid instance URL. Specify a Salesforce instance URL using the format .salesforce.com", + "accessTokenStdin": "Access token of user to use for authentication", + "noPrompt": "do not prompt for confirmation", + "overwriteAuthFileYesNo": "An authorization file exists for user \"%s\". Are you sure you want to save the file?\n\nSave the user (y/n)?", + "overwriteAccessTokenAuthUserFile": "A file already exists for user \"%s\", which is associated with the access token you provided.\nAre you sure you want to overwrite the existing file? (y/n)?" } diff --git a/package.json b/package.json index 08f93172..3dd33cc8 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "@oclif/plugin-command-snapshot": "^2.1.1", "@salesforce/cli-plugins-testkit": "^1.1.5", "@salesforce/dev-config": "^2.1.2", - "@salesforce/dev-scripts": "^0.9.11", + "@salesforce/dev-scripts": "0.9.11", "@salesforce/plugin-command-reference": "^1.3.0", "@salesforce/plugin-config": "^1.2.5", "@salesforce/prettier-config": "^0.0.2", @@ -47,7 +47,7 @@ "pretty-quick": "^3.1.0", "shx": "0.3.3", "sinon": "10.0.0", - "ts-node": "^8.10.2", + "ts-node": "^10.0.0", "typescript": "^4.1.3" }, "config": { @@ -95,6 +95,9 @@ "web": { "description": "authorize an org using a web browser" }, + "accesstoken": { + "description": "authorize an org using an access token" + }, "device": { "description": "authorize an org using a device code" } diff --git a/src/commands/auth/accesstoken/store.ts b/src/commands/auth/accesstoken/store.ts new file mode 100644 index 00000000..98922b9c --- /dev/null +++ b/src/commands/auth/accesstoken/store.ts @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2021, salesforce.com, inc. + * All rights reserved. + * Licensed under the BSD 3-Clause license. + * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + */ + +import * as os from 'os'; +import { flags, FlagsConfig, SfdxCommand } from '@salesforce/command'; +import { AuthFields, AuthInfo, AuthInfoConfig, Messages, sfdc, SfdxError } from '@salesforce/core'; +import { ensureString, getString } from '@salesforce/ts-types'; +import { env } from '@salesforce/kit'; +import { Prompts } from '../../../prompts'; +import { Common } from '../../../common'; + +Messages.importMessagesDirectory(__dirname); +const messages = Messages.loadMessages('@salesforce/plugin-auth', 'accesstoken.store'); +const commonMessages = Messages.loadMessages('@salesforce/plugin-auth', 'messages'); + +const ACCESS_TOKEN_FORMAT = '"!"'; + +export default class Store extends SfdxCommand { + public static readonly description = messages.getMessage('description', [ACCESS_TOKEN_FORMAT]); + public static readonly examples = messages.getMessage('examples').split(os.EOL); + public static aliases = ['force:auth:accesstoken:store']; + + public static readonly flagsConfig: FlagsConfig = { + instanceurl: flags.url({ + char: 'r', + description: commonMessages.getMessage('instanceUrl'), + required: true, + }), + setdefaultdevhubusername: flags.boolean({ + char: 's', + description: commonMessages.getMessage('setDefaultDevHub'), + default: false, + }), + setdefaultusername: flags.boolean({ + char: 's', + description: commonMessages.getMessage('setDefaultUsername'), + default: false, + }), + setalias: flags.string({ + char: 'a', + description: commonMessages.getMessage('setAlias'), + }), + noprompt: flags.boolean({ + char: 'p', + description: commonMessages.getMessage('noPrompt'), + required: false, + default: false, + }), + }; + + public async run(): Promise { + const instanceUrl = ensureString(getString(this.flags, 'instanceurl.href')); + const accessToken = await this.getAccessToken(); + const authInfo = await this.getUserInfo(accessToken, instanceUrl); + return this.storeAuthFromAccessToken(authInfo); + } + + private async getUserInfo(accessToken: string, instanceUrl: string): Promise { + return AuthInfo.create({ accessTokenOptions: { accessToken, instanceUrl, loginUrl: instanceUrl } }); + } + + private async storeAuthFromAccessToken(authInfo: AuthInfo): Promise { + if (await this.overwriteAuthInfo(authInfo.getUsername())) { + await this.saveAuthInfo(authInfo); + const successMsg = commonMessages.getMessage('authorizeCommandSuccess', [ + authInfo.getUsername(), + authInfo.getFields(true).orgId, + ]); + this.ux.log(successMsg); + } + return authInfo.getFields(true); + } + + private async saveAuthInfo(authInfo: AuthInfo): Promise { + await authInfo.save(); + await Common.handleSideEffects(authInfo, this.flags); + await Common.identifyPossibleScratchOrgs(authInfo.getFields(true), authInfo); + } + + private async overwriteAuthInfo(username: string): Promise { + if (!this.flags.noprompt) { + const authInfoConfig = await AuthInfoConfig.create({ + ...AuthInfoConfig.getOptions(username), + throwOnNotFound: false, + }); + if (await authInfoConfig.exists()) { + return Prompts.askOverwriteAuthFile(this.ux, username); + } + } + return true; + } + + private async getAccessToken(): Promise { + let accessToken: string; + if (env.getString('SFDX_ACCESS_TOKEN')) { + accessToken = env.getString('SFDX_ACCESS_TOKEN'); + } else { + accessToken = await Prompts.askForAccessToken(this.ux); + } + if (!sfdc.matchesAccessToken(accessToken)) { + throw new SfdxError(messages.getMessage('invalidAccessTokenFormat', [ACCESS_TOKEN_FORMAT])); + } + return accessToken; + } +} diff --git a/src/commands/auth/logout.ts b/src/commands/auth/logout.ts index 7e85f221..85824a6b 100644 --- a/src/commands/auth/logout.ts +++ b/src/commands/auth/logout.ts @@ -12,6 +12,7 @@ import { Prompts } from '../../prompts'; Messages.importMessagesDirectory(__dirname); const messages = Messages.loadMessages('@salesforce/plugin-auth', 'logout'); +const commonMessages = Messages.loadMessages('@salesforce/plugin-auth', 'messages'); export default class Logout extends SfdxCommand { public static readonly description = messages.getMessage('description'); @@ -28,7 +29,7 @@ export default class Logout extends SfdxCommand { }), noprompt: flags.boolean({ char: 'p', - description: messages.getMessage('noPrompt'), + description: commonMessages.getMessage('noPrompt'), required: false, }), }; diff --git a/src/common.ts b/src/common.ts index 39c2a5d7..3f34757d 100644 --- a/src/common.ts +++ b/src/common.ts @@ -58,6 +58,7 @@ export class Common { // fields property is passed in because the consumers of this method have performed the decrypt. // This is so we don't have to call authInfo.getFields(true) and decrypt again OR accidentally save an + // authInfo before it is necessary. public static async identifyPossibleScratchOrgs(fields: AuthFields, orgAuthInfo: AuthInfo): Promise { const logger = await Logger.child('Common', { tag: 'identifyPossibleScratchOrgs' }); diff --git a/src/prompts.ts b/src/prompts.ts index 130c58ec..66436fb8 100644 --- a/src/prompts.ts +++ b/src/prompts.ts @@ -36,8 +36,23 @@ export class Prompts { } } - public static async askForClientSecret(ux: UX, disableMasking: false): Promise { - const msg = dimMessage(messages.getMessage('clientSecretStdin')); + public static async askForClientSecret(ux: UX, disableMasking = false): Promise { + return Prompts.askForHiddenResponse(ux, 'clientSecretStdin', disableMasking); + } + + public static async askForAccessToken(ux: UX, disableMasking = false): Promise { + return Prompts.askForHiddenResponse(ux, 'accessTokenStdin', disableMasking); + } + + public static async askOverwriteAuthFile(ux: UX, username: string): Promise { + const yN = await ux.prompt(messages.getMessage('overwriteAccessTokenAuthUserFile', [username]), { + type: 'normal', + default: 'y', + }); + return Prompts.answeredYes(yN); + } + private static async askForHiddenResponse(ux: UX, messageKey: string, disableMasking = false): Promise { + const msg = dimMessage(messages.getMessage(messageKey)); return ux.prompt(msg, { type: disableMasking ? 'normal' : 'hide', }); diff --git a/test/commands/auth/accesstoken/store.nut.ts b/test/commands/auth/accesstoken/store.nut.ts new file mode 100644 index 00000000..995e3860 --- /dev/null +++ b/test/commands/auth/accesstoken/store.nut.ts @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2020, salesforce.com, inc. + * All rights reserved. + * Licensed under the BSD 3-Clause license. + * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + */ +import { execCmd, TestSession, prepareForJwt } from '@salesforce/cli-plugins-testkit'; +import { expect } from 'chai'; +import { Env } from '@salesforce/kit'; +import { ensureString, getString } from '@salesforce/ts-types'; +import { AuthFields, AuthInfo } from '@salesforce/core'; +import { expectAccessTokenToExist, expectOrgIdToExist, expectUrlToExist } from '../../../testHelper'; + +let testSession: TestSession; + +describe('auth:accesstoken:store NUTs', () => { + const env = new Env(); + let username: string; + let instanceUrl: string; + let clientId: string; + let accessToken: string; + + before('prepare session and ensure environment variables', async () => { + username = ensureString(env.getString('TESTKIT_HUB_USERNAME')); + instanceUrl = ensureString(env.getString('TESTKIT_HUB_INSTANCE')); + clientId = ensureString(env.getString('TESTKIT_JWT_CLIENT_ID')); + ensureString(env.getString('TESTKIT_JWT_KEY')); + testSession = await TestSession.create({ authStrategy: 'NONE' }); + const jwtKeyFilePath = prepareForJwt(testSession.homeDir); + execCmd( + `auth:jwt:grant -f ${jwtKeyFilePath} -i ${clientId} -u ${username} --setdefaultdevhubusername --instanceurl ${instanceUrl} --json`, + { + ensureExitCode: 0, + } + ); + const authInfo = await AuthInfo.create({ username }); + accessToken = authInfo.getFields(true).accessToken; + env.setString('SFDX_ACCESS_TOKEN', accessToken); + execCmd(`auth:logout -p -u ${username}`, { ensureExitCode: 0 }); + }); + + after(async () => { + await testSession?.clean(); + }); + + afterEach(() => { + execCmd(`auth:logout -p -u ${username}`, { ensureExitCode: 0 }); + }); + + it('should authorize an org using access token (json)', () => { + const command = `auth:accesstoken:store --setdefaultdevhubusername --instanceurl ${instanceUrl} --noprompt --json`; + const cmdresult = execCmd(command, { ensureExitCode: 0 }); + const json = cmdresult.jsonOutput; + + expectAccessTokenToExist(json.result); + expectOrgIdToExist(json.result); + expectUrlToExist(json.result, 'instanceUrl'); + expectUrlToExist(json.result, 'loginUrl'); + expect(json.result.username).to.equal(username); + expect(json.result.accessToken).to.equal(accessToken); + }); + + it('should authorize an org using access token (human readable)', () => { + const command = `auth:accesstoken:store --setdefaultdevhubusername --instanceurl ${instanceUrl} --noprompt`; + const result = execCmd(command, { ensureExitCode: 0 }); + const output = getString(result, 'shellOutput.stdout'); + expect(output).to.include(`Successfully authorized ${username} with org ID`); + }); +}); diff --git a/test/commands/auth/accesstoken/store.test.ts b/test/commands/auth/accesstoken/store.test.ts new file mode 100644 index 00000000..c665c9f3 --- /dev/null +++ b/test/commands/auth/accesstoken/store.test.ts @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2020, salesforce.com, inc. + * All rights reserved. + * Licensed under the BSD 3-Clause license. + * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + */ + +/* eslint-disable @typescript-eslint/ban-ts-comment */ + +import { $$, expect } from '@salesforce/command/lib/test'; +import { IConfig } from '@oclif/config'; +import { AuthFields, AuthInfo, ConfigFile, SfdxError } from '@salesforce/core'; +import { Crypto } from '@salesforce/core/lib/crypto'; +import { StubbedType, stubInterface, stubMethod } from '@salesforce/ts-sinon'; +import { UX } from '@salesforce/command'; +import { assert } from 'chai'; +import { Env } from '@salesforce/kit'; +import Store from '../../../../src/commands/auth/accesstoken/store'; + +describe('auth:accesstoken:store', () => { + const config = stubInterface($$.SANDBOX, {}); + let authFields: AuthFields; + let uxStub: StubbedType; + const accessToken = '00Dxx0000000000!xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; + + /* eslint-disable camelcase */ + const userInfo = { + preferred_username: 'foo@baz.org', + organization_id: '00D000000000000', + custom_domain: 'https://foo.bar.org.salesforce.com', + }; + /* eslint-enable camelcase */ + + async function createNewStoreCommand( + flags: Record = {}, + promptAnswer = accessToken, + authFileExists = false, + useSfdxAccessTokenEnvVar = false + ): Promise { + authFields = { + accessToken, + instanceUrl: 'https://foo.bar.org.salesforce.com', + loginUrl: 'https://foo.bar.org.salesforce.com', + orgId: '00D000000000000', + username: 'foo@baz.org', + }; + const ai = await AuthInfo.create({ username: authFields.username }); + ai.update( + { + accessToken, + orgId: authFields.orgId, + instanceUrl: authFields.instanceUrl, + loginUrl: authFields.loginUrl, + username: authFields.username, + }, + false + ); + stubInterface($$.SANDBOX, { + getFields: () => authFields, + save: () => {}, + }); + stubMethod($$.SANDBOX, Crypto.prototype, 'decrypt').callsFake(() => accessToken); + stubMethod($$.SANDBOX, ConfigFile.prototype, 'exists').callsFake(async (): Promise => authFileExists); + stubMethod($$.SANDBOX, Store.prototype, 'saveAuthInfo').resolves(async () => userInfo); + stubMethod($$.SANDBOX, Store.prototype, 'getUserInfo').resolves(ai); + if (useSfdxAccessTokenEnvVar) { + stubMethod($$.SANDBOX, Env.prototype, 'getString').callsFake(() => accessToken); + } + const store = new Store([], config); + uxStub = stubInterface($$.SANDBOX, { + prompt: () => promptAnswer, + }); + // @ts-ignore because protected member + store.ux = uxStub; + // @ts-ignore because protected member + store.flags = Object.assign( + {}, + { instanceurl: { href: 'https://foo.bar.org.salesforce.com' }, noprompt: true }, + flags + ); + return store; + } + + it('should return auth fields after successful auth', async () => { + const store = await createNewStoreCommand(); + const result = await store.run(); + expect(result).to.deep.equal(authFields); + }); + + it('should prompt for access token when accesstokenfile is not present', async () => { + const store = await createNewStoreCommand(); + const result = await store.run(); + expect(uxStub.prompt.callCount).to.equal(1); + expect(result).to.deep.equal(authFields); + }); + + it('should show invalid access token provided as input', async () => { + const store = await createNewStoreCommand({}, 'invalidaccesstokenformat'); + try { + await store.run(); + assert(false, 'should throw error'); + } catch (e) { + const err = e as SfdxError; + expect(err.message).to.include("The access token isn't in the correct format"); + } + }); + + it('should show that auth file already exists', async () => { + const store = await createNewStoreCommand({ noprompt: false }, accessToken, true); + await store.run(); + // prompt twice; one for access token and once to overwrite existing file + expect(uxStub.prompt.calledTwice).to.be.true; + }); + + it('should show that auth file does not already exist', async () => { + const store = await createNewStoreCommand({ noprompt: false }, accessToken); + const result = await store.run(); + // prompt once; one for access token + expect(uxStub.prompt.callCount).to.be.equal(1); + expect(result).to.deep.equal(authFields); + }); + it('should use env var SFDX_ACCESS_TOKEN as input to the store command', async () => { + const store = await createNewStoreCommand({ noprompt: false }, accessToken, false, true); + const result = await store.run(); + // no prompts + expect(uxStub.prompt.callCount).to.be.equal(0); + expect(result).to.deep.equal(authFields); + }); +}); diff --git a/test/commands/auth/web/login.test.ts b/test/commands/auth/web/login.test.ts index 8906f070..d3796db5 100644 --- a/test/commands/auth/web/login.test.ts +++ b/test/commands/auth/web/login.test.ts @@ -35,9 +35,7 @@ describe('auth:web:login', () => { stubMethod($$.SANDBOX, Login.prototype, 'executeLoginFlow').callsFake(async () => { return authInfoStub; }); - $$.SANDBOX.stub(AuthInfo, 'listAllAuthFiles').callsFake(async () => { - return [`${authFields.username}.json`]; - }); + $$.SANDBOX.stub(AuthInfo, 'listAllAuthFiles').callsFake(async () => []); uxStub = stubInterface($$.SANDBOX, { prompt: () => promptAnswer, }); diff --git a/yarn.lock b/yarn.lock index 49b801d0..b9067ca2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,32 +9,32 @@ dependencies: "@babel/highlight" "^7.10.4" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" - integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb" + integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw== dependencies: - "@babel/highlight" "^7.12.13" + "@babel/highlight" "^7.14.5" -"@babel/compat-data@^7.14.4": - version "7.14.4" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.4.tgz#45720fe0cecf3fd42019e1d12cc3d27fadc98d58" - integrity sha512-i2wXrWQNkH6JplJQGn3Rd2I4Pij8GdHkXwHMxm+zV5YG/Jci+bCNrWZEWC4o+umiDkRrRs4dVzH3X4GP7vyjQQ== +"@babel/compat-data@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.5.tgz#8ef4c18e58e801c5c95d3c1c0f2874a2680fadea" + integrity sha512-kixrYn4JwfAVPa0f2yfzc2AWti6WRRyO3XjWW5PJAvtE11qhSayrrcrEnee05KAtNaPC+EwehE8Qt1UedEVB8w== "@babel/core@^7.7.5": - version "7.14.3" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.3.tgz#5395e30405f0776067fbd9cf0884f15bfb770a38" - integrity sha512-jB5AmTKOCSJIZ72sd78ECEhuPiDMKlQdDI/4QRI6lzYATx5SSogS1oQA2AoPecRCknm30gHi2l+QVvNUu3wZAg== - dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.14.3" - "@babel/helper-compilation-targets" "^7.13.16" - "@babel/helper-module-transforms" "^7.14.2" - "@babel/helpers" "^7.14.0" - "@babel/parser" "^7.14.3" - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.14.2" - "@babel/types" "^7.14.2" + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.5.tgz#d281f46a9905f07d1b3bf71ead54d9c7d89cb1e3" + integrity sha512-RN/AwP2DJmQTZSfiDaD+JQQ/J99KsIpOCfBE5pL+5jJSt7nI3nYGoAXZu+ffYSQ029NLs2DstZb+eR81uuARgg== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.14.5" + "@babel/helper-compilation-targets" "^7.14.5" + "@babel/helper-module-transforms" "^7.14.5" + "@babel/helpers" "^7.14.5" + "@babel/parser" "^7.14.5" + "@babel/template" "^7.14.5" + "@babel/traverse" "^7.14.5" + "@babel/types" "^7.14.5" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -42,169 +42,177 @@ semver "^6.3.0" source-map "^0.5.0" -"@babel/generator@^7.14.2", "@babel/generator@^7.14.3": - version "7.14.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.3.tgz#0c2652d91f7bddab7cccc6ba8157e4f40dcedb91" - integrity sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA== +"@babel/generator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.5.tgz#848d7b9f031caca9d0cd0af01b063f226f52d785" + integrity sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA== dependencies: - "@babel/types" "^7.14.2" + "@babel/types" "^7.14.5" jsesc "^2.5.1" source-map "^0.5.0" -"@babel/helper-compilation-targets@^7.13.16": - version "7.14.4" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.4.tgz#33ebd0ffc34248051ee2089350a929ab02f2a516" - integrity sha512-JgdzOYZ/qGaKTVkn5qEDV/SXAh8KcyUVkCoSWGN8T3bwrgd6m+/dJa2kVGi6RJYJgEYPBdZ84BZp9dUjNWkBaA== +"@babel/helper-compilation-targets@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz#7a99c5d0967911e972fe2c3411f7d5b498498ecf" + integrity sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw== dependencies: - "@babel/compat-data" "^7.14.4" - "@babel/helper-validator-option" "^7.12.17" + "@babel/compat-data" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" browserslist "^4.16.6" semver "^6.3.0" -"@babel/helper-function-name@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz#397688b590760b6ef7725b5f0860c82427ebaac2" - integrity sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ== - dependencies: - "@babel/helper-get-function-arity" "^7.12.13" - "@babel/template" "^7.12.13" - "@babel/types" "^7.14.2" - -"@babel/helper-get-function-arity@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" - integrity sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg== - dependencies: - "@babel/types" "^7.12.13" - -"@babel/helper-member-expression-to-functions@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz#dfe368f26d426a07299d8d6513821768216e6d72" - integrity sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw== - dependencies: - "@babel/types" "^7.13.12" - -"@babel/helper-module-imports@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz#c6a369a6f3621cb25da014078684da9196b61977" - integrity sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA== - dependencies: - "@babel/types" "^7.13.12" - -"@babel/helper-module-transforms@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz#ac1cc30ee47b945e3e0c4db12fa0c5389509dfe5" - integrity sha512-OznJUda/soKXv0XhpvzGWDnml4Qnwp16GN+D/kZIdLsWoHj05kyu8Rm5kXmMef+rVJZ0+4pSGLkeixdqNUATDA== - dependencies: - "@babel/helper-module-imports" "^7.13.12" - "@babel/helper-replace-supers" "^7.13.12" - "@babel/helper-simple-access" "^7.13.12" - "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/helper-validator-identifier" "^7.14.0" - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.14.2" - "@babel/types" "^7.14.2" - -"@babel/helper-optimise-call-expression@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea" - integrity sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA== - dependencies: - "@babel/types" "^7.12.13" - -"@babel/helper-replace-supers@^7.13.12": - version "7.14.4" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.14.4.tgz#b2ab16875deecfff3ddfcd539bc315f72998d836" - integrity sha512-zZ7uHCWlxfEAAOVDYQpEf/uyi1dmeC7fX4nCf2iz9drnCwi1zvwXL3HwWWNXUQEJ1k23yVn3VbddiI9iJEXaTQ== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.13.12" - "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/traverse" "^7.14.2" - "@babel/types" "^7.14.4" - -"@babel/helper-simple-access@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz#dd6c538afb61819d205a012c31792a39c7a5eaf6" - integrity sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA== - dependencies: - "@babel/types" "^7.13.12" - -"@babel/helper-split-export-declaration@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05" - integrity sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg== - dependencies: - "@babel/types" "^7.12.13" - -"@babel/helper-validator-identifier@^7.14.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288" - integrity sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A== - -"@babel/helper-validator-option@^7.12.17": - version "7.12.17" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" - integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== - -"@babel/helpers@^7.14.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.0.tgz#ea9b6be9478a13d6f961dbb5f36bf75e2f3b8f62" - integrity sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg== - dependencies: - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.14.0" - "@babel/types" "^7.14.0" - -"@babel/highlight@^7.10.4", "@babel/highlight@^7.12.13": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.0.tgz#3197e375711ef6bf834e67d0daec88e4f46113cf" - integrity sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg== - dependencies: - "@babel/helper-validator-identifier" "^7.14.0" +"@babel/helper-function-name@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz#89e2c474972f15d8e233b52ee8c480e2cfcd50c4" + integrity sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ== + dependencies: + "@babel/helper-get-function-arity" "^7.14.5" + "@babel/template" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/helper-get-function-arity@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz#25fbfa579b0937eee1f3b805ece4ce398c431815" + integrity sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-hoist-variables@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz#e0dd27c33a78e577d7c8884916a3e7ef1f7c7f8d" + integrity sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-member-expression-to-functions@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.5.tgz#d5c70e4ad13b402c95156c7a53568f504e2fb7b8" + integrity sha512-UxUeEYPrqH1Q/k0yRku1JE7dyfyehNwT6SVkMHvYvPDv4+uu627VXBckVj891BO8ruKBkiDoGnZf4qPDD8abDQ== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-module-imports@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz#6d1a44df6a38c957aa7c312da076429f11b422f3" + integrity sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-module-transforms@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz#7de42f10d789b423eb902ebd24031ca77cb1e10e" + integrity sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA== + dependencies: + "@babel/helper-module-imports" "^7.14.5" + "@babel/helper-replace-supers" "^7.14.5" + "@babel/helper-simple-access" "^7.14.5" + "@babel/helper-split-export-declaration" "^7.14.5" + "@babel/helper-validator-identifier" "^7.14.5" + "@babel/template" "^7.14.5" + "@babel/traverse" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/helper-optimise-call-expression@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz#f27395a8619e0665b3f0364cddb41c25d71b499c" + integrity sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-replace-supers@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz#0ecc0b03c41cd567b4024ea016134c28414abb94" + integrity sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.14.5" + "@babel/helper-optimise-call-expression" "^7.14.5" + "@babel/traverse" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/helper-simple-access@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz#66ea85cf53ba0b4e588ba77fc813f53abcaa41c4" + integrity sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-split-export-declaration@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz#22b23a54ef51c2b7605d851930c1976dd0bc693a" + integrity sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-validator-identifier@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz#d0f0e277c512e0c938277faa85a3968c9a44c0e8" + integrity sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg== + +"@babel/helper-validator-option@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" + integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== + +"@babel/helpers@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.5.tgz#4870f8d9a6fdbbd65e5674a3558b4ff7fef0d9b2" + integrity sha512-xtcWOuN9VL6nApgVHtq3PPcQv5qFBJzoSZzJ/2c0QK/IP/gxVcoWSNQwFEGvmbQsuS9rhYqjILDGGXcTkA705Q== + dependencies: + "@babel/template" "^7.14.5" + "@babel/traverse" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/highlight@^7.10.4", "@babel/highlight@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" + integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== + dependencies: + "@babel/helper-validator-identifier" "^7.14.5" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.12.13", "@babel/parser@^7.14.2", "@babel/parser@^7.14.3": - version "7.14.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.4.tgz#a5c560d6db6cd8e6ed342368dea8039232cbab18" - integrity sha512-ArliyUsWDUqEGfWcmzpGUzNfLxTdTp6WU4IuP6QFSp9gGfWS6boxFCkJSJ/L4+RG8z/FnIU3WxCk6hPL9SSWeA== +"@babel/parser@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.5.tgz#4cd2f346261061b2518873ffecdf1612cb032829" + integrity sha512-TM8C+xtH/9n1qzX+JNHi7AN2zHMTiPUtspO0ZdHflW8KaskkALhMmuMHb4bCmNdv9VAPzJX3/bXqkVLnAvsPfg== "@babel/runtime@^7.9.6": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.0.tgz#46794bc20b612c5f75e62dd071e24dfd95f1cbe6" - integrity sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA== + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.5.tgz#665450911c6031af38f81db530f387ec04cd9a98" + integrity sha512-121rumjddw9c3NCQ55KGkyE1h/nzWhU/owjhw0l4mQrkzz4x9SGS1X8gFLraHwX7td3Yo4QTL+qj0NcIzN87BA== dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327" - integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA== - dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/parser" "^7.12.13" - "@babel/types" "^7.12.13" - -"@babel/traverse@^7.14.0", "@babel/traverse@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.2.tgz#9201a8d912723a831c2679c7ebbf2fe1416d765b" - integrity sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA== - dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.14.2" - "@babel/helper-function-name" "^7.14.2" - "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/parser" "^7.14.2" - "@babel/types" "^7.14.2" +"@babel/template@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.14.5.tgz#a9bc9d8b33354ff6e55a9c60d1109200a68974f4" + integrity sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/parser" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/traverse@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.5.tgz#c111b0f58afab4fea3d3385a406f692748c59870" + integrity sha512-G3BiS15vevepdmFqmUc9X+64y0viZYygubAMO8SvBmKARuF6CPSZtH4Ng9vi/lrWlZFGe3FWdXNy835akH8Glg== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.14.5" + "@babel/helper-function-name" "^7.14.5" + "@babel/helper-hoist-variables" "^7.14.5" + "@babel/helper-split-export-declaration" "^7.14.5" + "@babel/parser" "^7.14.5" + "@babel/types" "^7.14.5" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.12.13", "@babel/types@^7.13.12", "@babel/types@^7.14.0", "@babel/types@^7.14.2", "@babel/types@^7.14.4": - version "7.14.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.4.tgz#bfd6980108168593b38b3eb48a24aa026b919bc0" - integrity sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw== +"@babel/types@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.5.tgz#3bb997ba829a2104cedb20689c4a5b8121d383ff" + integrity sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg== dependencies: - "@babel/helper-validator-identifier" "^7.14.0" + "@babel/helper-validator-identifier" "^7.14.5" to-fast-properties "^2.0.0" "@commitlint/cli@^9.1.1": @@ -598,9 +606,9 @@ cli-ux "^4.9.3" "@salesforce/core@^2.15.2", "@salesforce/core@^2.2.0", "@salesforce/core@^2.20.3", "@salesforce/core@^2.23.4": - version "2.23.4" - resolved "https://registry.yarnpkg.com/@salesforce/core/-/core-2.23.4.tgz#e0f6070bb1d6c70cd53e893ca0cf61ed09114efc" - integrity sha512-ZcyoSAGQEKQLzfEbIDpfQhIcstjxvye8YEsPD45WX+uzB9QrQ+aJSTVTUJCkBZyYvCdLPndh1bgRIH+RJGDapA== + version "2.24.0" + resolved "https://registry.yarnpkg.com/@salesforce/core/-/core-2.24.0.tgz#b414731223fbd418e4db065959f73662dfd2a1bc" + integrity sha512-bdN9RNeS/8msA8U+F/6GEEteGNeE/uwc/av9nFSL0u+jyzA9llKnqKcuuAKa8YKuS1WHYfWs4mDNXST1gj+c1A== dependencies: "@salesforce/bunyan" "^2.0.0" "@salesforce/kit" "^1.5.0" @@ -619,7 +627,7 @@ resolved "https://registry.yarnpkg.com/@salesforce/dev-config/-/dev-config-2.1.2.tgz#b4e206f860e87065d068bf8ba3994a032389ad81" integrity sha512-1swy07rynHoTRk8lj6nuC0JceRBo300OuWnovQe2OMvLpQM5Dh1SUnv1SE8012PsrK9BC1WqGXp4BUyMo04x7w== -"@salesforce/dev-scripts@^0.9.11": +"@salesforce/dev-scripts@0.9.11": version "0.9.11" resolved "https://registry.yarnpkg.com/@salesforce/dev-scripts/-/dev-scripts-0.9.11.tgz#bc6f5db7ea47317a2cb792a45759daf642d685fd" integrity sha512-JzzRqQ339FpZbR8wqtSiaOMlmJHz4XPaA66qbFD+AohXpmyX3PDxiTK0F6sAg1QiOnyzcRypLiycbd99NpP8lg== @@ -661,17 +669,17 @@ xunit-file "^1.0.0" "@salesforce/kit@^1.2.2", "@salesforce/kit@^1.4.5", "@salesforce/kit@^1.5.0", "@salesforce/kit@^1.5.10": - version "1.5.10" - resolved "https://registry.yarnpkg.com/@salesforce/kit/-/kit-1.5.10.tgz#cf5b7839afa1330b77e37632800131b37fff021d" - integrity sha512-sCy75l9lHnPGI6cDV3Tjr1Vhud/UL55mLAQi8cHPrjTaRnPTk88pOgebTwlD6rXIXAIVuy4AQU8p3ZQlC79ofQ== + version "1.5.13" + resolved "https://registry.yarnpkg.com/@salesforce/kit/-/kit-1.5.13.tgz#e7e141e95f3f1586de1448ec54139feed30706bc" + integrity sha512-Saq/JyTEbvmfUD/rgCGkYf2mv71Vm0mC8ibH4RUxg1omdPCOPm/YW2ZycQB6pN9mvCyZnCl8VGXjDSGiIv/+gw== dependencies: - "@salesforce/ts-types" "^1.5.13" + "@salesforce/ts-types" "^1.5.17" tslib "^2.2.0" "@salesforce/plugin-command-reference@^1.3.0": - version "1.3.3" - resolved "https://registry.yarnpkg.com/@salesforce/plugin-command-reference/-/plugin-command-reference-1.3.3.tgz#61f0af6ec21410b15e461384b537fcba6e45bc32" - integrity sha512-egya5b3uI0OSf+kntavfGiA94rJff+fe5qYnqVKqd4Fj8KuTStqyP6vvHxCP+9qoaPtv6XsjYmP9R20IAteHzw== + version "1.3.4" + resolved "https://registry.yarnpkg.com/@salesforce/plugin-command-reference/-/plugin-command-reference-1.3.4.tgz#a67358868c512784542cdc7cd802778150322103" + integrity sha512-e/SaG8CBwkLsOLJijXxWPdT7Ma8PlgNoA+pOx19lMuMeRnS8Ba5hs8pp3WEi79cfq8os7ztCfSMighaKAjR4Yw== dependencies: "@oclif/command" "^1.5.19" "@oclif/config" "^1.14.0" @@ -703,20 +711,20 @@ integrity sha512-6D7DvE6nFxpLyyTnrOIbbAeCJw2r/EpinFAcMh6gU0gA/CGfSbwV/8uR3uHLYL2zCyCZLH8jJ4dZ3BzCMqc+Eg== "@salesforce/ts-sinon@^1.3.15": - version "1.3.15" - resolved "https://registry.yarnpkg.com/@salesforce/ts-sinon/-/ts-sinon-1.3.15.tgz#10b3f6cfd45d777d8a68ff618fa63504f119989c" - integrity sha512-zJ/MXuv0ifK0yYwwHV8C1F7w+PJIsGFaJhQpzPMhkpyF8zAnznzpTXAmoZaxvhAykIf2onlrrBrCtrkxA2g1PA== + version "1.3.18" + resolved "https://registry.yarnpkg.com/@salesforce/ts-sinon/-/ts-sinon-1.3.18.tgz#e8706100ece4cfdf02e6fb2745818b030dfe4b2e" + integrity sha512-Gu2yNN3OIRN//fzA5tl5FBzGguN/cgE36LW9qpVc9dX5xvT7A1EndbjCsMjIZG878W7Ea2pemCv1I/260QwBaw== dependencies: - "@salesforce/ts-types" "^1.5.13" + "@salesforce/ts-types" "^1.5.17" sinon "^5.1.1" tslib "^2.2.0" -"@salesforce/ts-types@^1.2.0", "@salesforce/ts-types@^1.5.13", "@salesforce/ts-types@^1.5.5": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@salesforce/ts-types/-/ts-types-1.5.13.tgz#cf6bd3ed3860e305a070ab78718ac2be86d73ee0" - integrity sha512-tyHc0mZrn5u/K+zn5fyhFTnp10vIjLFBQ6CqYL7mvC9SAq4Bi+ZCwzd9aKGBBDLOqARGVvPTRlutmlnRID1BEw== +"@salesforce/ts-types@^1.2.0", "@salesforce/ts-types@^1.5.13", "@salesforce/ts-types@^1.5.17", "@salesforce/ts-types@^1.5.5": + version "1.5.17" + resolved "https://registry.yarnpkg.com/@salesforce/ts-types/-/ts-types-1.5.17.tgz#d69e92dfa716638d84b244a2611be80fb7986024" + integrity sha512-zyF1+4EacGsIWtfntbq7PvxjB2XABz33RzKfOhot15JC4tFiQaSFPtNb8d6hj7BkQSjo2Zs3qEeLJwRFcpaEIQ== dependencies: - tslib "^1.10.0" + tslib "^2.2.0" "@sinonjs/commons@^1", "@sinonjs/commons@^1.3.0", "@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.8.1": version "1.8.3" @@ -786,6 +794,26 @@ resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== +"@tsconfig/node10@^1.0.7": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" + integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg== + +"@tsconfig/node12@^1.0.7": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.8.tgz#a883d62f049a64fea1e56a6bbe66828d11c6241b" + integrity sha512-LM6XwBhjZRls1qJGpiM/It09SntEwe9M0riXRfQ9s6XlJQG0JPGl92ET18LtGeYh/GuOtafIXqwZeqLOd0FNFQ== + +"@tsconfig/node14@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2" + integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg== + +"@tsconfig/node16@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.1.tgz#a6ca6a9a0ff366af433f42f5f0e124794ff6b8f1" + integrity sha512-FTgBI767POY/lKNDNbIzgAX6miIDBs6NTCbdlDb8TrWovHsSvaVIZDlTqym29C6UqhzwcJx4CYr+AlrMywA0cA== + "@types/chai@*", "@types/chai@^4.2.11": version "4.2.18" resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.18.tgz#0c8e298dbff8205e2266606c1ea5fbdba29b46e4" @@ -851,14 +879,14 @@ integrity sha512-ZvO2tAcjmMi8V/5Z3JsyofMe3hasRcaw88cto5etSVMwVQfeivGAlEYmaQgceUSVYFofVjT+ioHsATjdWcFt1w== "@types/node@*": - version "15.12.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-15.12.1.tgz#9b60797dee1895383a725f828a869c86c6caa5c2" - integrity sha512-zyxJM8I1c9q5sRMtVF+zdd13Jt6RU4r4qfhTd7lQubyThvLfx6yYekWSQjGCGV2Tkecgxnlpl/DNlb6Hg+dmEw== + version "15.12.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-15.12.2.tgz#1f2b42c4be7156ff4a6f914b2fb03d05fa84e38d" + integrity sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww== "@types/node@^12.12.6": - version "12.20.14" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.14.tgz#9caf7eea0df08b406829889cc015256a6d81ab10" - integrity sha512-iFJOS5Q470FF+r4Ol2pSley7/wCNVqf+jgjhtxLLaJcDs+To2iCxlXIkJXrGLD9w9G/oJ9ibySu7z92DCwr7Pg== + version "12.20.15" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.15.tgz#10ee6a6a3f971966fddfa3f6e89ef7a73ec622df" + integrity sha512-F6S4Chv4JicJmyrwlDkxUdGNSplsQdGwp1A0AJloEVDirWdZOAiRHhovDlsFkKUrquUXhz1imJhXHsf59auyAg== "@types/normalize-package-data@^2.4.0": version "2.4.0" @@ -1390,9 +1418,9 @@ camelcase@^6.0.0: integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== caniuse-lite@^1.0.30001219: - version "1.0.30001234" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001234.tgz#8fc2e709e3b0679d7af7f073a1c661155c39b975" - integrity sha512-a3gjUVKkmwLdNysa1xkUAwN2VfJUJyVW47rsi3aCbkRCtbHAfo+rOsCqVw29G6coQ8gzAPb5XBXwiGHwme3isA== + version "1.0.30001236" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001236.tgz#0a80de4cdf62e1770bb46a30d884fc8d633e3958" + integrity sha512-o0PRQSrSCGJKCPZcgMzl5fUaj5xHe8qA2m4QRvnyY4e1lITqoNkr7q/Oh1NcpGSy0Th97UZ35yoKcINPoq7YOQ== cardinal@^2.1.1: version "2.1.1" @@ -1785,9 +1813,9 @@ convert-source-map@^1.7.0: safe-buffer "~5.1.1" core-js@^3.6.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.13.1.tgz#30303fabd53638892062d8b4e802cac7599e9fb7" - integrity sha512-JqveUc4igkqwStL2RTRn/EPFGBOfEZHxJl/8ej1mXJR75V3go2mFF4bmUYkEIT1rveHKnkUlcJX/c+f1TyIovQ== + version "3.14.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.14.0.tgz#62322b98c71cc2018b027971a69419e2425c2a6c" + integrity sha512-3s+ed8er9ahK+zJpp9ZtuVcDoFzHNiZsPbNAAE4KXgrRHbjSqqNN6xGSXq6bq7TZIbKj4NLrLb6bJ5i+vSVjHA== core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" @@ -1832,6 +1860,11 @@ crc32-stream@^4.0.2: crc-32 "^1.2.0" readable-stream "^3.4.0" +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -1860,9 +1893,9 @@ csprng@*, csprng@~0.1.2: sequin "*" csv-parse@^4.10.1: - version "4.15.4" - resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-4.15.4.tgz#ad1ec62aaf71a642982dfcb81f1848184d691db5" - integrity sha512-OdBbFc0yZhOm17lSxqkirrHlFFVpKRT0wp4DAGoJelsP3LbGzV9LNr7XmM/lrr0uGkCtaqac9UhP8PDHXOAbMg== + version "4.16.0" + resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-4.16.0.tgz#b4c875e288a41f7ff917cb0d7d45880d563034f6" + integrity sha512-Zb4tGPANH4SW0LgC9+s9Mnequs9aqn7N3/pCqNbVjs2XhEF6yWNU2Vm4OGl1v2Go9nw8rXt87Cm2QN/o6Vpqgg== csv-stringify@^1.0.4: version "1.1.2" @@ -2097,9 +2130,9 @@ ecdsa-sig-formatter@1.0.11: safe-buffer "^5.0.1" electron-to-chromium@^1.3.723: - version "1.3.748" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.748.tgz#16638a8130f407ae5bf2fc168f2173574deb36c5" - integrity sha512-fmIKfYALVeEybk/L2ucdgt7jN3JsbGtg3K9pmF/MRWgkeADBI1VSAa5IzdG2gZwTxsnsrFtdMpOTSM5mrBRKVQ== + version "1.3.752" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.752.tgz#0728587f1b9b970ec9ffad932496429aef750d09" + integrity sha512-2Tg+7jSl3oPxgsBsWKh5H83QazTkmWG/cnNwJplmyZc7KcN61+I10oUgaXSVk/NwfvN3BdkKDR4FYuRBQQ2v0A== "emoji-regex@>=6.0.0 <=6.1.1": version "6.1.1" @@ -3902,9 +3935,9 @@ lint-staged@^11.0.0: stringify-object "^3.3.0" listr2@^3.8.2: - version "3.9.0" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.9.0.tgz#27f23c91ba4fdf513b0682bf604bc6b0ab36b6c1" - integrity sha512-+JxQt7Vi4WEWgJsxmOEX9lDbCumrb3mrEYIeE1VI7I4lf2rXE4v9pq3RMVNp+a9s6mCgc/IsF0ppHsLrx2BEAw== + version "3.10.0" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.10.0.tgz#58105a53ed7fa1430d1b738c6055ef7bb006160f" + integrity sha512-eP40ZHihu70sSmqFNbNy2NL1YwImmlMmPh9WO5sLmPDleurMHt3n+SwEWNu2kzKScexZnkyFtc1VI0z/TGlmpw== dependencies: cli-truncate "^2.1.0" colorette "^1.2.2" @@ -4472,9 +4505,9 @@ node-preload@^0.2.1: process-on-spawn "^1.0.0" node-releases@^1.1.71: - version "1.1.72" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.72.tgz#14802ab6b1039a79a0c7d662b610a5bbd76eacbe" - integrity sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw== + version "1.1.73" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.73.tgz#dd4e81ddd5277ff846b80b52bb40c49edf7a7b20" + integrity sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg== normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.5.0: version "2.5.0" @@ -4955,12 +4988,7 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@^2.0.5: - version "2.3.0" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.0.tgz#b6a5bf1284026ae640f17f7ff5658a7567fc0d18" - integrity sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w== - -prettier@^2.3.1: +prettier@^2.0.5, prettier@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.1.tgz#76903c3f8c4449bc9ac597acefa24dc5ad4cbea6" integrity sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA== @@ -6038,6 +6066,22 @@ ts-json-schema-generator@^0.93.0: json-stable-stringify "^1.0.1" typescript "~4.3.2" +ts-node@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.0.0.tgz#05f10b9a716b0b624129ad44f0ea05dac84ba3be" + integrity sha512-ROWeOIUvfFbPZkoDis0L/55Fk+6gFQNZwwKPLinacRl6tsxstTF1DbAcLKkovwnpKMVvOMHP1TIbnwXwtLg1gg== + dependencies: + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + source-map-support "^0.5.17" + yn "3.1.1" + ts-node@^8.10.2: version "8.10.2" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.10.2.tgz#eee03764633b1234ddd37f8db9ec10b75ec7fb8d" @@ -6059,7 +6103,7 @@ tsconfig-paths@^3.9.0: minimist "^1.2.0" strip-bom "^3.0.0" -tslib@^1, tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: +tslib@^1, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== @@ -6176,9 +6220,9 @@ typescript@^4.1.3, typescript@~4.3.2: integrity sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw== uglify-js@^3.1.4: - version "3.13.8" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.8.tgz#7c2f9f2553f611f3ff592bdc19c6fb208dc60afb" - integrity sha512-PvFLMFIQHfIjFFlvAch69U2IvIxK9TNzNWt1SxZGp9JZ/v70yvqIQuiJeVPPtUMOzoNt+aNRDk4wgxb34wvEqA== + version "3.13.9" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.9.tgz#4d8d21dcd497f29cfd8e9378b9df123ad025999b" + integrity sha512-wZbyTQ1w6Y7fHdt8sJnHfSIuWeDgk6B5rCb4E/AM6QNNPbOMIZph21PW5dRB3h7Df0GszN+t7RuUH6sWK5bF0g== unbox-primitive@^1.0.1: version "1.0.1"