diff --git a/.eslintrc.js b/.eslintrc.cjs similarity index 97% rename from .eslintrc.js rename to .eslintrc.cjs index dc43f902db..35cfdd4519 100644 --- a/.eslintrc.js +++ b/.eslintrc.cjs @@ -10,6 +10,5 @@ module.exports = { extends: ['eslint-config-salesforce-typescript', 'eslint-config-salesforce-license'], - rules: {}, root: true, }; diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000000..cd1558d7e0 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,10 @@ +#ECCN: Open Source +#GUSINFO:Open Source,Open Source Workflow + +# For more info on this file syntax: +# https://help.github.com/en/articles/about-code-owners + +# These owners will be the default owners for everything in +# the repo. + +* @forcedotcom/platform-cli diff --git a/.github/workflows/bundle.yml b/.github/workflows/bundle.yml new file mode 100644 index 0000000000..ddad80228a --- /dev/null +++ b/.github/workflows/bundle.yml @@ -0,0 +1,41 @@ +name: Bundle +on: + workflow_call: + inputs: + branch: + description: 'Set the branch to bundle core' + required: false + type: string + nodeVersion: + description: version of node to use. It's better to specify latest, lts/* or lts/-1 than to hardode numbers + type: string + default: lts/* + required: false + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ inputs.branch }} + - uses: actions/setup-node@v4 + with: + node-version: ${{ inputs.nodeVersion }} + registry-url: 'https://registry.npmjs.org' + cache: yarn + - uses: salesforcecli/github-workflows/.github/actions/yarnInstallWithRetries@main + - name: Install esbuild Dependencies + run: | + yarn add -D esbuild@^0.19.5 esbuild-plugin-pino@^2.1.0 npm-dts@^1.3.12 esbuild-plugin-tsc@^0.4.0 + - uses: salesforcecli/github-workflows/.github/actions/yarnInstallWithRetries@main + - name: Update for Bundling + run: | + node scripts/updateForBundling.js + - name: Generate Bundle + run: | + yarn build + node scripts/build.js + - name: Post Bundling Update + run: | + node scripts/postBundlingUpdate.js diff --git a/.github/workflows/create-github-release.yml b/.github/workflows/create-github-release.yml new file mode 100644 index 0000000000..64b25c37c6 --- /dev/null +++ b/.github/workflows/create-github-release.yml @@ -0,0 +1,30 @@ +name: create-github-release + +on: + push: + branches: + - main + - prerelease/** + tags-ignore: + - '*' + workflow_dispatch: + inputs: + prerelease: + type: string + description: 'Name to use for the prerelease: beta, dev, etc. NOTE: If this is already set in the package.json, it does not need to be passed in here.' + +jobs: + release: + uses: salesforcecli/github-workflows/.github/workflows/create-github-release.yml@main + secrets: inherit + with: + prerelease: ${{ inputs.prerelease }} + # If this is a push event, we want to skip the release if there are no semantic commits + # However, if this is a manual release (workflow_dispatch), then we want to disable skip-on-empty + # This helps recover from forgetting to add semantic commits ('fix:', 'feat:', etc.) + skip-on-empty: ${{ github.event_name == 'push' }} + docs: + needs: release + if: github.ref_name == 'main' + uses: salesforcecli/github-workflows/.github/workflows/publishTypedoc.yml@main + secrets: inherit diff --git a/.github/workflows/esbuild-publish.yml b/.github/workflows/esbuild-publish.yml new file mode 100644 index 0000000000..740f2f85ac --- /dev/null +++ b/.github/workflows/esbuild-publish.yml @@ -0,0 +1,55 @@ +name: esbuild Compilation & npm Publish Workflow + +on: + workflow_run: + workflows: + - create-github-release + types: + - completed + workflow_dispatch: + inputs: + branch: + description: 'Set the branch to use for automation tests' + type: string + required: false + default: 'main' + nodeVersion: + description: version of node to use. It's better to specify latest, lts/* or lts/-1 than to hardode numbers + type: string + default: lts/* + required: false + +jobs: + build: + runs-on: ubuntu-latest + if: ${{ inputs.branch || (github.event_name == 'workflow_run' && github.event.workflow_run.conclusion == 'success')}} + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ inputs.branch }} + - uses: actions/setup-node@v4 + with: + node-version: ${{ inputs.nodeVersion }} + registry-url: 'https://registry.npmjs.org' + cache: yarn + - uses: salesforcecli/github-workflows/.github/actions/yarnInstallWithRetries@main + - name: Install esbuild Dependencies + run: | + yarn add -D esbuild@^0.19.5 esbuild-plugin-pino@^2.1.0 npm-dts@^1.3.12 esbuild-plugin-tsc@^0.4.0 + - uses: salesforcecli/github-workflows/.github/actions/yarnInstallWithRetries@main + - name: Update for Bundling + run: | + node scripts/updateForBundling.js + - name: Generate Bundle + run: | + yarn build + node scripts/build.js + - name: Post Bundling Update + run: | + node scripts/postBundlingUpdate.js + - name: Publish a Package + run: | + npm config set //registry.npmjs.org/:_authToken=$NODE_AUTH_TOKEN + npm publish + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/failureNotifications.yml b/.github/workflows/failureNotifications.yml index 3f7c0d4441..2fe2fb8e13 100644 --- a/.github/workflows/failureNotifications.yml +++ b/.github/workflows/failureNotifications.yml @@ -1,13 +1,10 @@ name: failureNotifications - on: workflow_run: workflows: - - version, tag and github release - publish types: - completed - jobs: failure-notify: runs-on: ubuntu-latest @@ -15,7 +12,7 @@ jobs: steps: - name: Announce Failure id: slack - uses: slackapi/slack-github-action@v1.21.0 + uses: slackapi/slack-github-action@v1.24.0 env: # for non-CLI-team-owned plugins, you can send this anywhere you like SLACK_WEBHOOK_URL: ${{ secrets.CLI_ALERTS_SLACK_WEBHOOK }} diff --git a/.github/workflows/manualRelease.yml b/.github/workflows/manualRelease.yml deleted file mode 100644 index 8ceb52c3c5..0000000000 --- a/.github/workflows/manualRelease.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: manual release - -on: - workflow_dispatch: - -jobs: - release: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - with: - token: ${{ secrets.SVC_CLI_BOT_GITHUB_TOKEN }} - - name: Conventional Changelog Action - id: changelog - uses: TriPSs/conventional-changelog-action@d360fad3a42feca6462f72c97c165d60a02d4bf2 - # overriding some of the basic behaviors to just get the changelog - with: - git-user-name: svc-cli-bot - git-user-email: svc_cli_bot@salesforce.com - github-token: ${{ secrets.SVC_CLI_BOT_GITHUB_TOKEN }} - output-file: false - # always do the release, even if there are no semantic commits - skip-on-empty: false - tag-prefix: '' - - uses: notiz-dev/github-action-json-property@2192e246737701f108a4571462b76c75e7376216 - id: packageVersion - with: - path: 'package.json' - prop_path: 'version' - - name: Create Github Release - uses: actions/create-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.SVC_CLI_BOT_GITHUB_TOKEN }} - with: - tag_name: ${{ steps.packageVersion.outputs.prop }} - release_name: ${{ steps.packageVersion.outputs.prop }} diff --git a/.github/workflows/onPushToMain.yml b/.github/workflows/onPushToMain.yml deleted file mode 100644 index 24b2a8ef70..0000000000 --- a/.github/workflows/onPushToMain.yml +++ /dev/null @@ -1,18 +0,0 @@ -# test -name: version, tag and github release - -on: - push: - branches: [main] - -jobs: - release: - uses: salesforcecli/github-workflows/.github/workflows/githubRelease.yml@main - secrets: inherit - - # most repos won't use this - # depends on previous job to avoid git collisions, not for any functionality reason - docs: - uses: salesforcecli/github-workflows/.github/workflows/publishTypedoc.yml@main - secrets: inherit - needs: release diff --git a/.github/workflows/onRelease.yml b/.github/workflows/onRelease.yml index f09fde0564..db03117ac4 100644 --- a/.github/workflows/onRelease.yml +++ b/.github/workflows/onRelease.yml @@ -2,7 +2,7 @@ name: publish on: release: - types: [released] + types: [published] # support manual release in case something goes wrong and needs to be repeated or tested workflow_dispatch: inputs: @@ -11,10 +11,22 @@ on: type: string required: true jobs: + # parses the package.json version and detects prerelease tag (ex: beta from 4.4.4-beta.0) + getDistTag: + outputs: + tag: ${{ steps.distTag.outputs.tag }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.release.tag_name || inputs.tag }} + - uses: salesforcecli/github-workflows/.github/actions/getPreReleaseTag@main + id: distTag + npm: uses: salesforcecli/github-workflows/.github/workflows/npmPublish.yml@main + needs: [getDistTag] with: - tag: latest - ctc: true + tag: ${{ needs.getDistTag.outputs.tag || 'latest' }} githubTag: ${{ github.event.release.tag_name || inputs.tag }} secrets: inherit diff --git a/.github/workflows/perf.yml b/.github/workflows/perf.yml new file mode 100644 index 0000000000..4e59114003 --- /dev/null +++ b/.github/workflows/perf.yml @@ -0,0 +1,44 @@ +# runs some very-large-repo tests (for windows filesystem limits) and commits perf results for comparison +name: perf-tests +on: + push: + branches-ignore: [main, gh-pages] + workflow_dispatch: + +# linux will finish ahead of windows, but prevent other branches/commits from hitting simultaneously +# since we're pushing git commits and there would be conflicts +concurrency: perf-test + +jobs: + perf-tests: + strategy: + matrix: + os: [ubuntu-latest, windows-latest] + fail-fast: false + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + cache: yarn + - uses: salesforcecli/github-workflows/.github/actions/yarnInstallWithRetries@main + with: + ignore-scripts: true + - run: yarn build + - run: npm run test:perf | tee test/perf/output.txt + + # Run `github-action-benchmark` action + - name: Store benchmark result + uses: benchmark-action/github-action-benchmark@5bbce78ef18edf5b96cb2d23e8d240b485f9dc4a + with: + name: Logger Benchmarks - ${{ matrix.os }} + tool: 'benchmarkjs' + output-file-path: test/perf/output.txt + comment-on-alert: true + # Push and deploy GitHub pages branch automatically + # this has a bug where it creates duplicate commits when summary-always and aut-push are both true + # summary-always: true + comment-always: true + benchmark-data-dir-path: perf-${{ runner.os}} + auto-push: true + github-token: ${{ secrets.SVC_CLI_BOT_GITHUB_TOKEN }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 02ffdde057..97716a67d1 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -14,7 +14,7 @@ jobs: windows-unit-tests: needs: linux-unit-tests uses: salesforcecli/github-workflows/.github/workflows/unitTestsWindows.yml@main - nuts: + xNuts: needs: linux-unit-tests uses: salesforcecli/github-workflows/.github/workflows/externalNut.yml@main strategy: @@ -22,40 +22,56 @@ jobs: matrix: os: ['ubuntu-latest', 'windows-latest'] externalProjectGitUrl: - - https://github.com/salesforcecli/plugin-config - - https://github.com/salesforcecli/plugin-alias + - https://github.com/salesforcecli/plugin-apex - https://github.com/salesforcecli/plugin-auth + - https://github.com/salesforcecli/plugin-community + - https://github.com/salesforcecli/plugin-custom-metadata + - https://github.com/salesforcecli/plugin-data - https://github.com/salesforcecli/plugin-limits - - https://github.com/salesforcecli/plugin-schema - - https://github.com/salesforcecli/plugin-env - https://github.com/salesforcecli/plugin-org - - https://github.com/salesforcecli/plugin-login + - https://github.com/salesforcecli/plugin-schema + - https://github.com/salesforcecli/plugin-settings + - https://github.com/salesforcecli/plugin-signups + - https://github.com/salesforcecli/plugin-templates + - https://github.com/salesforcecli/plugin-user with: packageName: '@salesforce/core' externalProjectGitUrl: ${{ matrix.externalProjectGitUrl }} command: 'yarn test:nuts' os: ${{ matrix.os }} useCache: false - postBuildCommands: 'shx rm -rf node_modules/jsforce/typings' - preExternalBuildCommands: 'shx rm -rf node_modules/@salesforce/sf-plugins-core/node_modules/@salesforce/core' + preSwapCommands: 'yarn upgrade @jsforce/jsforce-node@latest; npx yarn-deduplicate; yarn install' + preExternalBuildCommands: 'shx rm -rf node_modules/@salesforce/core/node_modules/@jsforce/jsforce-node shx rm -rf node_modules/@salesforce/sf-plugins-core/node_modules/@salesforce/core node_modules/@salesforce/cli-plugins-testkit/node_modules/@salesforce/core node_modules/@salesforce/source-tracking/node_modules/@salesforce/core node_modules/@salesforce/source-deploy-retrieve/node_modules/@salesforce/core node_modules/@salesforce/apex-node/node_modules/@salesforce/core' secrets: inherit # hidden until we fix source-testkit to better handle jwt - # deployRetrieveNuts: - # needs: unit-tests - # uses: salesforcecli/github-workflows/.github/workflows/externalNut.yml@main - # strategy: - # fail-fast: false - # matrix: - # os: ['windows-latest-16x', 'ubuntu-latest-16x'] - # command: - # - yarn test:nuts:deploy:metadata:manifest - # - yarn test:nuts:deploy:metadata:metadata - # - yarn test:nuts:deploy:metadata:source-dir - # - yarn test:nuts:deploy:metadata:test-level - # - yarn test:nuts:static - # with: - # packageName: '@salesforce/core' - # externalProjectGitUrl: 'https://github.com/salesforcecli/plugin-deploy-retrieve' - # command: ${{ matrix.command }} - # os: ${{ matrix.os }} - # secrets: inherit + pdrNuts: + needs: linux-unit-tests + uses: salesforcecli/github-workflows/.github/workflows/externalNut.yml@main + strategy: + fail-fast: false + matrix: + os: ['ubuntu-latest', 'windows-latest'] + command: + - 'yarn test:nuts:convert' + - 'yarn test:nuts:deb' + - 'yarn test:nuts:delete' + - 'yarn test:nuts:deploy:metadata:manifest' + - 'yarn test:nuts:deploy:metadata:metadata' + - 'yarn test:nuts:deploy:metadata:metadata-dir' + - 'yarn test:nuts:deploy:metadata:source-dir' + - 'yarn test:nuts:deploy:metadata:test-level' + - 'yarn test:nuts:destructive' + - 'yarn test:nuts:manifest' + - 'yarn test:nuts:retrieve' + - 'yarn test:nuts:specialTypes' + - 'yarn test:nuts:static' + - 'yarn test:nuts:tracking' + with: + packageName: '@salesforce/core' + externalProjectGitUrl: 'https://github.com/salesforcecli/plugin-deploy-retrieve' + preSwapCommands: 'yarn upgrade @jsforce/jsforce-node@latest; npx yarn-deduplicate; yarn install' + command: ${{ matrix.command }} + os: ${{ matrix.os }} + preExternalBuildCommands: 'shx rm -rf node_modules/@salesforce/core/node_modules/@jsforce/jsforce-node shx rm -rf node_modules/@salesforce/sf-plugins-core/node_modules/@salesforce/core node_modules/@salesforce/cli-plugins-testkit/node_modules/@salesforce/core node_modules/@salesforce/source-tracking/node_modules/@salesforce/core node_modules/@salesforce/source-deploy-retrieve/node_modules/@salesforce/core' + secrets: + TESTKIT_AUTH_URL: ${{ secrets.TESTKIT_AUTH_URL }} diff --git a/.github/workflows/testCoreBundling.yml b/.github/workflows/testCoreBundling.yml new file mode 100644 index 0000000000..ce9bd50aa9 --- /dev/null +++ b/.github/workflows/testCoreBundling.yml @@ -0,0 +1,38 @@ +name: Test Core Bundling +on: + push: + branches-ignore: [main] + workflow_dispatch: + inputs: + branch: + description: 'Set the branch to bundle core' + type: string + required: false + default: main + nodeVersion: + description: version of node to use. It's better to specify latest, lts/* or lts/-1 than to hardode numbers + type: string + required: false + default: lts/* + +jobs: + bundle: + uses: ./.github/workflows/bundle.yml + with: + branch: ${{ github.ref_name || inputs.branch }} + nodeVersion: ${{ inputs.nodeVersion }} + tests: + needs: bundle + uses: ./.github/workflows/testExternalProjects.yml + secrets: inherit + strategy: + fail-fast: false + matrix: + os: ['ubuntu-latest', 'windows-latest'] + externalProjectGit: + - forcedotcom/salesforcedx-templates + - forcedotcom/salesforcedx-apex + with: + externalProjectGit: ${{ matrix.externalProjectGit }} + os: ${{ matrix.os }} + bundledBranch: ${{ github.ref_name || inputs.branch }} diff --git a/.github/workflows/testExternalProjects.yml b/.github/workflows/testExternalProjects.yml new file mode 100644 index 0000000000..7491487c73 --- /dev/null +++ b/.github/workflows/testExternalProjects.yml @@ -0,0 +1,88 @@ +name: Test External Projects +on: + workflow_call: + inputs: + externalProjectGit: + description: 'The url that will be cloned. This contains the tests you want to run. Ex: https://github.com/forcedotcom/templates' + type: string + required: true + nodeVersion: + required: false + description: version of node to run tests against. Use things like [lts/-1, lts/*, latest] to avoid hardcoding versions + type: string + default: lts/* + os: + required: false + description: 'runs-on property, ex: ubuntu-latest, windows-latest' + type: string + default: 'ubuntu-latest' + attempts: + required: false + type: number + default: 3 + bundledBranch: + required: false + description: Branch with the bundled version of core" + type: string + default: 'main' + +jobs: + external-test: + name: run tests + if: ${{ inputs.externalProjectGit == 'forcedotcom/salesforcedx-apex' || (inputs.externalProjectGit == 'forcedotcom/salesforcedx-templates' && inputs.os == 'ubuntu-latest') }} + runs-on: ${{ inputs.os }} + steps: + - name: Configure Git to handle long file paths on Windows + if: ${{ runner.os == 'Windows' }} + run: git config --system core.longpaths true + - name: Setup node + uses: actions/setup-node@v4 + with: + node-version: ${{ inputs.nodeVersion }} + - name: Checkout to external project + uses: actions/checkout@v4 + with: + repository: ${{ inputs.externalProjectGit }} + - name: Swap this dependency for the bundled version + run: | + yarn install --network-timeout 600000 + yarn remove @salesforce/core + yarn add forcedotcom/sfdx-core#${{ inputs.bundledBranch }} + - name: Add dependencies to bundle node_modules + run: | + yarn install --network-timeout 600000 + yarn add -D esbuild@^0.19.5 esbuild-plugin-pino@^2.1.0 npm-dts@^1.3.12 esbuild-plugin-tsc@^0.4.0 + working-directory: node_modules/@salesforce/core + - name: Update for bundling + run: node scripts/updateForBundling.js + working-directory: node_modules/@salesforce/core + - name: Generate Bundle + run: | + yarn build + node scripts/build.js + working-directory: node_modules/@salesforce/core + - name: Post Bundling Update + run: | + node scripts/postBundlingUpdate.js + working-directory: node_modules/@salesforce/core + - name: Yarn deduplicate + run: | + npx yarn-deduplicate + - name: Retrieve Scripts + run: | + git clone https://github.com/forcedotcom/bundle-publish-scripts.git + - name: Update references for core bundle + run: | + node bundle-publish-scripts/scripts/updateForCoreBundle.js + - name: Update folder name + run: | + mv core core-bundle + working-directory: node_modules/@salesforce + - name: Build the external project (where the tests are) + run: yarn build + - name: Run tests with ${{ inputs.attempts }} attempts + uses: salesforcecli/github-workflows/.github/actions/retry@main + with: + max_attempts: ${{ inputs.attempts }} + command: yarn test + retry_on: error diff --git a/.mocharc.json b/.mocharc.json index 90d4ee892d..8bb562fc13 100644 --- a/.mocharc.json +++ b/.mocharc.json @@ -4,5 +4,5 @@ "watch-files": ["src", "test"], "recursive": true, "reporter": "spec", - "timeout": 10000 + "timeout": 20000 } diff --git a/.sfdevrc.json b/.sfdevrc.json index ac25b4a163..2fba7b90c3 100644 --- a/.sfdevrc.json +++ b/.sfdevrc.json @@ -4,10 +4,21 @@ }, "wireit": { "compile": { - "command": "ttsc -p . --pretty --incremental", + "command": "tspc -p . --pretty --incremental", "files": ["src/**/*.ts", "tsconfig.json", "messages", "messageTransformer"], "output": ["lib/**", "*.tsbuildinfo"], "clean": "if-file-deleted" + }, + "build": { + "dependencies": ["compile", "lint"] + }, + "compile-typedoc": { + "command": "tsc -p typedocExamples" + }, + "link-check": { + "command": "node -e \"process.exit(process.env.CI ? 0 : 1)\" || linkinator \"./*.md\" --skip \"examples/README.md|CHANGELOG.md|node_modules|test/|confluence.internal.salesforce.com|my.salesforce.com|%s\" --markdown --retry --directory-listing --verbosity error", + "files": ["./*.md", "./examples/**/*.md", "./messages/**/*.md", "./!(CHANGELOG).md"], + "output": [] } } } diff --git a/CHANGELOG.md b/CHANGELOG.md index 12b2866ffc..472fe8a7b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6722 +1,5385 @@ -## [3.34.1](https://github.com/forcedotcom/sfdx-core/compare/3.34.0...3.34.1) (2023-03-16) - +## [7.3.12](https://github.com/forcedotcom/sfdx-core/compare/7.3.11...7.3.12) (2024-06-07) ### Bug Fixes -* allow completed status to be resume ([484244d](https://github.com/forcedotcom/sfdx-core/commit/484244d2877b6eec610975bd643fea2a368b5f5e)) - - - -# [3.34.0](https://github.com/forcedotcom/sfdx-core/compare/3.33.9...3.34.0) (2023-03-14) +- non-reference clone of transferred listeners ([#1080](https://github.com/forcedotcom/sfdx-core/issues/1080)) ([f5b2b02](https://github.com/forcedotcom/sfdx-core/commit/f5b2b02c77ffc572f25d39f663126eca977cb29b)) +## [7.3.11](https://github.com/forcedotcom/sfdx-core/compare/7.3.10...7.3.11) (2024-06-07) -### Features +### Bug Fixes -* deprecate messages.load and docs ([3229f74](https://github.com/forcedotcom/sfdx-core/commit/3229f742f6ee2d99729e55abb8021cf5f3639b9f)) +- add a did you mean action to AuthInfo ([#1079](https://github.com/forcedotcom/sfdx-core/issues/1079)) ([da5483e](https://github.com/forcedotcom/sfdx-core/commit/da5483e7bbbdd1837f313d168fe5aeaa5e5ec016)) +## [7.3.10](https://github.com/forcedotcom/sfdx-core/compare/7.3.9...7.3.10) (2024-06-04) +### Bug Fixes -## [3.33.9](https://github.com/forcedotcom/sfdx-core/compare/3.33.8...3.33.9) (2023-03-14) +- **deps:** bump ajv from 8.14.0 to 8.15.0 ([66208eb](https://github.com/forcedotcom/sfdx-core/commit/66208eb96499848030d960239bad99a6048d180d)) +## [7.3.9](https://github.com/forcedotcom/sfdx-core/compare/7.3.8...7.3.9) (2024-05-19) ### Bug Fixes -* save expiration date for scratch org ([#775](https://github.com/forcedotcom/sfdx-core/issues/775)) ([a59323b](https://github.com/forcedotcom/sfdx-core/commit/a59323be438e6fc8e021855af8ce6d09700c2e60)) +- **deps:** bump @salesforce/schemas from 1.7.0 to 1.9.0 ([0e3e42d](https://github.com/forcedotcom/sfdx-core/commit/0e3e42daf8d7bc0b03db32763a00963a84bb8854)) +## [7.3.8](https://github.com/forcedotcom/sfdx-core/compare/7.3.7...7.3.8) (2024-05-16) +### Bug Fixes -## [3.33.8](https://github.com/forcedotcom/sfdx-core/compare/3.33.7...3.33.8) (2023-03-14) +- use PlatformCLI not Platform CLI ([#1073](https://github.com/forcedotcom/sfdx-core/issues/1073)) ([281488f](https://github.com/forcedotcom/sfdx-core/commit/281488fb91620a2af062a8c8822fda5b909951a3)) +## [7.3.7](https://github.com/forcedotcom/sfdx-core/compare/7.3.6...7.3.7) (2024-05-16) ### Bug Fixes -* **deps:** bump json5 from 1.0.1 to 1.0.2 ([7ccd063](https://github.com/forcedotcom/sfdx-core/commit/7ccd0637048531d4669252a65e7c371b2e8c5f98)) +- add oauth options data to auth code exchange errors ([#1068](https://github.com/forcedotcom/sfdx-core/issues/1068)) ([ea859ed](https://github.com/forcedotcom/sfdx-core/commit/ea859edee8f6ff8b068433d66bd9606f1278b776)) +## [7.3.6](https://github.com/forcedotcom/sfdx-core/compare/7.3.5...7.3.6) (2024-05-12) +### Bug Fixes -## [3.33.7](https://github.com/forcedotcom/sfdx-core/compare/3.33.6...3.33.7) (2023-03-13) +- **deps:** bump semver from 7.6.0 to 7.6.2 ([e5a480c](https://github.com/forcedotcom/sfdx-core/commit/e5a480c39b8bd84a5407e839c2cf54e13c676f08)) +## [7.3.5](https://github.com/forcedotcom/sfdx-core/compare/7.3.4...7.3.5) (2024-05-06) ### Bug Fixes -* conf file stubs for read and readSync ([a4ceedc](https://github.com/forcedotcom/sfdx-core/commit/a4ceedc086bd293f10a30d2ac78b2f832acc0120)) +- remove namespace if nonamespace option is set ([#1064](https://github.com/forcedotcom/sfdx-core/issues/1064)) ([f90ab68](https://github.com/forcedotcom/sfdx-core/commit/f90ab688658b8267f2cb1238fa90676d1f21d7af)) +## [7.3.4](https://github.com/forcedotcom/sfdx-core/compare/7.3.3...7.3.4) (2024-05-05) +### Bug Fixes -## [3.33.6](https://github.com/forcedotcom/sfdx-core/compare/3.33.5...3.33.6) (2023-03-02) +- **deps:** bump ajv from 8.12.0 to 8.13.0 ([624a01d](https://github.com/forcedotcom/sfdx-core/commit/624a01d7acefdb0c537f954599de0d70fa0a6e05)) +## [7.3.3](https://github.com/forcedotcom/sfdx-core/compare/7.3.2...7.3.3) (2024-04-30) ### Bug Fixes -* check for resumable state for sandbox resume ([157622f](https://github.com/forcedotcom/sfdx-core/commit/157622f10c1d16c531d1576feb44a17eb1b04952)) +- **deps:** bump @jsforce/jsforce-node from 3.1.0 to 3.2.0 ([#1062](https://github.com/forcedotcom/sfdx-core/issues/1062)) ([cfba51b](https://github.com/forcedotcom/sfdx-core/commit/cfba51bb37c9cacd328c17ca28182a72a3f97dfc)) +## [7.3.2](https://github.com/forcedotcom/sfdx-core/compare/7.3.1...7.3.2) (2024-04-28) +### Bug Fixes -## [3.33.5](https://github.com/forcedotcom/sfdx-core/compare/3.33.4...3.33.5) (2023-02-26) +- **deps:** bump pino from 8.19.0 to 8.21.0 ([9f8d872](https://github.com/forcedotcom/sfdx-core/commit/9f8d872fd35747102a34ac8e99b89623fb33a0a1)) +## [7.3.1](https://github.com/forcedotcom/sfdx-core/compare/7.3.0...7.3.1) (2024-04-21) ### Bug Fixes -* **deps:** bump @salesforce/schemas from 1.4.0 to 1.5.0 ([f63c2f8](https://github.com/forcedotcom/sfdx-core/commit/f63c2f8135c27f794c5fce65be3dd5ea9e14f57f)) +- **deps:** bump @salesforce/kit from 3.1.0 to 3.1.1 ([bf1b11e](https://github.com/forcedotcom/sfdx-core/commit/bf1b11ed07c07db974a28487b7e472e3ac719adf)) +# [7.3.0](https://github.com/forcedotcom/sfdx-core/compare/7.2.0...7.3.0) (2024-04-15) +### Features -## [3.33.4](https://github.com/forcedotcom/sfdx-core/compare/3.33.3...3.33.4) (2023-02-22) +- **scratch:** remove language restriction ([97e1989](https://github.com/forcedotcom/sfdx-core/commit/97e19891089d4189181eb54ce5edb3dc03fb12c2)) +# [7.2.0](https://github.com/forcedotcom/sfdx-core/compare/7.1.0...7.2.0) (2024-04-10) -### Bug Fixes +### Features -* **deps:** bump @types/graceful-fs from 4.1.5 to 4.1.6 ([d7500b9](https://github.com/forcedotcom/sfdx-core/commit/d7500b96caf2b13f8b0824c29721e639b0274165)) +- export envVars top-level ([0ed5e69](https://github.com/forcedotcom/sfdx-core/commit/0ed5e694eca8653d34c91a8c97e9e950555b2a02)) +# [7.1.0](https://github.com/forcedotcom/sfdx-core/compare/7.0.0...7.1.0) (2024-04-10) +### Features -## [3.33.3](https://github.com/forcedotcom/sfdx-core/compare/3.33.2...3.33.3) (2023-02-22) +- export of scratchSettingsGenerator for pkg-library ([#1053](https://github.com/forcedotcom/sfdx-core/issues/1053)) ([920b5df](https://github.com/forcedotcom/sfdx-core/commit/920b5df712f6f75a3e00bf210ab146f388b04248)) +# [7.0.0](https://github.com/forcedotcom/sfdx-core/compare/6.7.6...7.0.0) (2024-04-10) -### Bug Fixes +- feat!: jsforce-node, top-level exports, improved sfError ([515011c](https://github.com/forcedotcom/sfdx-core/commit/515011ce231392480cae6f80a88cc540a11e78fd)) -* correct timeout for deploy during scratch org creation ([364985d](https://github.com/forcedotcom/sfdx-core/commit/364985d849d29dc07f4c27c5e3e67e2f3b344ff6)) +### BREAKING CHANGES +- top-level exports will prevent imports from @salesforce/core/lib/etc +- uses jsforce-node in place of jsforce +- type changes for SFError +- remove previously deprecated checkLightningDomain, aliasAccessor +- feat: sfError -## [3.33.2](https://github.com/forcedotcom/sfdx-core/compare/3.33.1...3.33.2) (2023-02-21) +- chore: tsconfig changes to get es2022 error.cause (node 18+) +- refactor: no mutate params, no NamedError -### Bug Fixes +- feat: let cause be unknown for constructor, create (like wrap) -* improve error contents for device login ([#774](https://github.com/forcedotcom/sfdx-core/issues/774)) ([3ad803a](https://github.com/forcedotcom/sfdx-core/commit/3ad803ad4d4b0ff473c04a8dd727c65546bfa86e)) +- chore: wrap an Error (so cause can be the original error) +- chore: tsconfig for postcompile (doc) +- docs: migrating -## [3.33.1](https://github.com/forcedotcom/sfdx-core/compare/3.33.0...3.33.1) (2023-01-23) +- chore: top-level export of config +- refactor: interface => type -### Bug Fixes +- refactor: simplify exports, add stateAggregator -* remove source tracking files with Org.delete() ([a85c5bf](https://github.com/forcedotcom/sfdx-core/commit/a85c5bf4dc2312e6be689f70e3b2e74f61cfbfc4)) +- chore: import default on messageTransformer +- refactor: typing for sfError.getObject, omit undefined props +- refactor: restore param mutation/side-effects -# [3.33.0](https://github.com/forcedotcom/sfdx-core/compare/3.32.14...3.33.0) (2023-01-19) +## [6.7.6](https://github.com/forcedotcom/sfdx-core/compare/6.7.5...6.7.6) (2024-04-04) +## [6.7.5](https://github.com/forcedotcom/sfdx-core/compare/6.7.4...6.7.5) (2024-04-04) -### Features +### Bug Fixes -* backward compatible messages.createError ([ac564b9](https://github.com/forcedotcom/sfdx-core/commit/ac564b927bd0c85c874cda39641afb9d9206e268)) +- current linter standards, allow 2 ([20601d0](https://github.com/forcedotcom/sfdx-core/commit/20601d09a48a7dbba47cc7acbc318fd379a2351e)) +## [6.7.4](https://github.com/forcedotcom/sfdx-core/compare/6.7.3...6.7.4) (2024-03-31) +### Bug Fixes -## [3.32.14](https://github.com/forcedotcom/sfdx-core/compare/3.32.13...3.32.14) (2023-01-18) +- **deps:** bump @salesforce/kit from 3.0.15 to 3.1.0 ([ad320e0](https://github.com/forcedotcom/sfdx-core/commit/ad320e0b1c23e19680e8aa933b8b56cf8ef51e88)) +## [6.7.3](https://github.com/forcedotcom/sfdx-core/compare/6.7.2...6.7.3) (2024-03-22) ### Bug Fixes -* snapshot is optional ([e81684c](https://github.com/forcedotcom/sfdx-core/commit/e81684cbe78c22e63b5c191264d26cef70c6c2f8)) +- **auth-server:** handle preflight requests ([#1040](https://github.com/forcedotcom/sfdx-core/issues/1040)) ([7a109d9](https://github.com/forcedotcom/sfdx-core/commit/7a109d9deb05fb583578b9e2e7dfb2f62aca3673)) +## [6.7.2](https://github.com/forcedotcom/sfdx-core/compare/6.7.1...6.7.2) (2024-03-22) +### Bug Fixes -## [3.32.13](https://github.com/forcedotcom/sfdx-core/compare/3.32.12...3.32.13) (2023-01-12) +- updating CN Edition test references ([46ed37e](https://github.com/forcedotcom/sfdx-core/commit/46ed37eced4cf300ffab1aa967317149b644fc52)) +## [6.7.1](https://github.com/forcedotcom/sfdx-core/compare/6.7.0...6.7.1) (2024-03-11) ### Bug Fixes -* **deps:** bump @salesforce/ts-types from 1.7.1 to 1.7.2 ([cadc91f](https://github.com/forcedotcom/sfdx-core/commit/cadc91fd5d0ced7cf15fed9ddeda1eea63f20f5b)) +- re-enable code challenge support ([#1035](https://github.com/forcedotcom/sfdx-core/issues/1035)) ([5786688](https://github.com/forcedotcom/sfdx-core/commit/5786688ac47fae008d31ca04f058efb932de88f7)) +# [6.7.0](https://github.com/forcedotcom/sfdx-core/compare/6.6.0...6.7.0) (2024-02-28) +### Features -## [3.32.12](https://github.com/forcedotcom/sfdx-core/compare/3.32.11...3.32.12) (2022-12-23) +- support stronger ciphers ([#810](https://github.com/forcedotcom/sfdx-core/issues/810)) ([dfe8a17](https://github.com/forcedotcom/sfdx-core/commit/dfe8a1707ff65c7f5994f3005f7ebc58f1873716)) +# [6.6.0](https://github.com/forcedotcom/sfdx-core/compare/6.5.6...6.6.0) (2024-02-27) ### Bug Fixes -* **deps:** bump jsonwebtoken from 8.5.1 to 9.0.0 ([c40ea0a](https://github.com/forcedotcom/sfdx-core/commit/c40ea0aa3025045488c542bd35684ae7f296b5f5)) - +- delete sandbox auth files before writing new one ([e88d780](https://github.com/forcedotcom/sfdx-core/commit/e88d7807231c16e88e09361f2f0469fe7d977907)) +### Features -## [3.32.11](https://github.com/forcedotcom/sfdx-core/compare/3.32.10...3.32.11) (2022-12-16) +- add support for refreshing sandboxes ([1071303](https://github.com/forcedotcom/sfdx-core/commit/107130360ea84395451d762874ba70c5cddd78fd)) +## [6.5.6](https://github.com/forcedotcom/sfdx-core/compare/6.5.5...6.5.6) (2024-02-25) ### Bug Fixes -* add password to mock org getConfig ([#729](https://github.com/forcedotcom/sfdx-core/issues/729)) ([00ee0fc](https://github.com/forcedotcom/sfdx-core/commit/00ee0fc940592cc04bc5b3ad6e609a3d5e6c2582)) +- **deps:** bump @types/semver from 7.5.7 to 7.5.8 ([ee55b66](https://github.com/forcedotcom/sfdx-core/commit/ee55b66579b244985c236334a3608c76bff0921d)) +## [6.5.5](https://github.com/forcedotcom/sfdx-core/compare/6.5.4...6.5.5) (2024-02-18) +### Bug Fixes -## [3.32.10](https://github.com/forcedotcom/sfdx-core/compare/3.32.9...3.32.10) (2022-12-15) +- **deps:** bump semver and @types/semver ([a868c32](https://github.com/forcedotcom/sfdx-core/commit/a868c3221038e6d925c481da803395e8285a5a6c)) +## [6.5.4](https://github.com/forcedotcom/sfdx-core/compare/6.5.3...6.5.4) (2024-02-18) ### Bug Fixes -* provide way to stub user data ([#728](https://github.com/forcedotcom/sfdx-core/issues/728)) ([98b2503](https://github.com/forcedotcom/sfdx-core/commit/98b25035043676a745692181e4cf0f1c889ea9d0)) +- **deps:** bump pino from 8.18.0 to 8.19.0 ([ff148e1](https://github.com/forcedotcom/sfdx-core/commit/ff148e118db7d5a144f0dc6e92239cbd8a39ca35)) +## [6.5.3](https://github.com/forcedotcom/sfdx-core/compare/6.5.2...6.5.3) (2024-02-06) +### Bug Fixes -## [3.32.9](https://github.com/forcedotcom/sfdx-core/compare/3.32.8...3.32.9) (2022-12-08) +- remove unused env/config ([1c5bc73](https://github.com/forcedotcom/sfdx-core/commit/1c5bc739e3a930847e6e9f31e7e25cfc5f357909)) +## [6.5.2](https://github.com/forcedotcom/sfdx-core/compare/6.5.1...6.5.2) (2024-02-04) ### Bug Fixes -* add password property to ([1995c01](https://github.com/forcedotcom/sfdx-core/commit/1995c010d13967a49cd4e460cf7acf27eb4327f7)) +- **deps:** bump pino from 8.17.2 to 8.18.0 ([5485a4d](https://github.com/forcedotcom/sfdx-core/commit/5485a4d72ecba6796165d35900c23d989a2ce6b8)) +## [6.5.1](https://github.com/forcedotcom/sfdx-core/compare/6.5.0...6.5.1) (2024-01-24) +### Bug Fixes -## [3.32.8](https://github.com/forcedotcom/sfdx-core/compare/3.32.7...3.32.8) (2022-12-04) +- correct typings for configStore `get` ([4dad8c7](https://github.com/forcedotcom/sfdx-core/commit/4dad8c75e38252d2ecafe1a4349cc5b0d19d68ac)) +# [6.5.0](https://github.com/forcedotcom/sfdx-core/compare/6.4.8-dev.0...6.5.0) (2024-01-22) ### Bug Fixes -* **deps:** bump ajv from 8.11.0 to 8.11.2 ([78eb48d](https://github.com/forcedotcom/sfdx-core/commit/78eb48d394a63fb21655d8c84de64e2ea8efa987)) +- emit warning if config var is unset ([fc32218](https://github.com/forcedotcom/sfdx-core/commit/fc3221886ed47d83999de102e7d76e82a29c0c0c)) +- properly handle undefined ([94fe825](https://github.com/forcedotcom/sfdx-core/commit/94fe825c8e4772bce6ed97f3ab6842e5011f7dd2)) +## [6.4.8-dev.0](https://github.com/forcedotcom/sfdx-core/compare/6.4.7...6.4.8-dev.0) (2024-01-17) +### Features -## [3.32.7](https://github.com/forcedotcom/sfdx-core/compare/3.32.6...3.32.7) (2022-12-04) +- **scratch:** add `org-capitalize-record-types` ([725bf67](https://github.com/forcedotcom/sfdx-core/commit/725bf67bf0c7b4ba274644581005ed921862da09)) +## [6.4.7](https://github.com/forcedotcom/sfdx-core/compare/6.4.6...6.4.7) (2024-01-10) ### Bug Fixes -* **deps:** bump decode-uri-component from 0.2.0 to 0.2.2 ([bb4c0d1](https://github.com/forcedotcom/sfdx-core/commit/bb4c0d1b6d0ca3dcc07532a728ef1a27b019d256)) +- **deps:** bump pino from 8.16.2 to 8.17.2 ([c63976b](https://github.com/forcedotcom/sfdx-core/commit/c63976ba14a575f631ffad219d2022e7374755e3)) +## [6.4.6](https://github.com/forcedotcom/sfdx-core/compare/6.4.5...6.4.6) (2024-01-09) +### Bug Fixes -## [3.32.6](https://github.com/forcedotcom/sfdx-core/compare/3.32.5...3.32.6) (2022-12-01) +- address review comments ([ea7ad36](https://github.com/forcedotcom/sfdx-core/commit/ea7ad36c65231b9a289c19f5dd185ca5bcf9c735)) +- better header check ([ae4757f](https://github.com/forcedotcom/sfdx-core/commit/ae4757f99746866b6bf0e73c4d8f5e9ac8e418c0)) +- handle html server response ([90d025d](https://github.com/forcedotcom/sfdx-core/commit/90d025d07e749499206c96f2eabe2055899f38cb)) +## [6.4.5](https://github.com/forcedotcom/sfdx-core/compare/6.4.4...6.4.5) (2024-01-09) ### Bug Fixes -* remove refs to legacy client id ([82689ea](https://github.com/forcedotcom/sfdx-core/commit/82689ea5257b95a94d91326200293c6eb464287f)) +- ignore requests for site icons ([aeab4a9](https://github.com/forcedotcom/sfdx-core/commit/aeab4a9eb0c11b987d9d20e217726688fbc3fd9b)) +## [6.4.4](https://github.com/forcedotcom/sfdx-core/compare/6.4.3...6.4.4) (2024-01-04) +### Bug Fixes -## [3.32.5](https://github.com/forcedotcom/sfdx-core/compare/3.32.4...3.32.5) (2022-11-30) +- remove slash char from error message ([1bb300b](https://github.com/forcedotcom/sfdx-core/commit/1bb300b2bb9f4990c6e19b9b8c33453416c24c95)) +## [6.4.3](https://github.com/forcedotcom/sfdx-core/compare/6.4.2...6.4.3) (2023-12-31) ### Bug Fixes -* update a few tests ([6952b44](https://github.com/forcedotcom/sfdx-core/commit/6952b4429bf7adf4ed4c5c0c9681ab04986f7720)) -* use API version cache more often ([36b0e81](https://github.com/forcedotcom/sfdx-core/commit/36b0e81abecd75ef8d69543470a0b1ad36f14a03)) +- **deps:** bump pino-pretty from 10.3.0 to 10.3.1 ([e68014a](https://github.com/forcedotcom/sfdx-core/commit/e68014a992b8a6b7c7b5ff5f35bc5a2e238d834c)) +## [6.4.2](https://github.com/forcedotcom/sfdx-core/compare/6.4.1...6.4.2) (2023-12-17) +### Bug Fixes -## [3.32.4](https://github.com/forcedotcom/sfdx-core/compare/3.32.3...3.32.4) (2022-11-27) +- **deps:** bump pino-pretty from 10.2.3 to 10.3.0 ([f7da5be](https://github.com/forcedotcom/sfdx-core/commit/f7da5be9a1384e56a60363ff04906fd7bd15de61)) +## [6.4.1](https://github.com/forcedotcom/sfdx-core/compare/6.4.0...6.4.1) (2023-12-12) ### Bug Fixes -* **deps:** bump @types/semver from 7.3.10 to 7.3.13 ([0584bf6](https://github.com/forcedotcom/sfdx-core/commit/0584bf642f1d01508594d16fd5391d7419f243f4)) +- update max query limit env var ([7b42e94](https://github.com/forcedotcom/sfdx-core/commit/7b42e949a88885c9eea236d667e07aa10a411b49)) +# [6.4.0](https://github.com/forcedotcom/sfdx-core/compare/6.3.0...6.4.0) (2023-12-08) +### Features -## [3.32.3](https://github.com/forcedotcom/sfdx-core/compare/3.32.2...3.32.3) (2022-11-27) +- import messages with 2 fewer imports ([#1003](https://github.com/forcedotcom/sfdx-core/issues/1003)) ([8080fc9](https://github.com/forcedotcom/sfdx-core/commit/8080fc98de2630603422369efd3e3aca101d0087)) +# [6.3.0](https://github.com/forcedotcom/sfdx-core/compare/6.2.3-qa.1...6.3.0) (2023-12-05) + +## [6.2.3-qa.1](https://github.com/forcedotcom/sfdx-core/compare/6.2.3-qa.0...6.2.3-qa.1) (2023-12-04) ### Bug Fixes -* **deps:** bump @salesforce/schemas from 1.1.3 to 1.4.0 ([9b0f2a9](https://github.com/forcedotcom/sfdx-core/commit/9b0f2a977868b40bc6c113ee2bff178c3ac3ceec)) +- backward logic on scratch/sbox ([98762d5](https://github.com/forcedotcom/sfdx-core/commit/98762d510ad9fab37ede32a0670bf85a9fe9ab8f)) +## [6.2.3-qa.0](https://github.com/forcedotcom/sfdx-core/compare/6.2.2...6.2.3-qa.0) (2023-12-04) +### Features -## [3.32.2](https://github.com/forcedotcom/sfdx-core/compare/3.32.1...3.32.2) (2022-11-22) +- return a value, use that instead of mutating state ([b311cb1](https://github.com/forcedotcom/sfdx-core/commit/b311cb1a9340e9494c8deff127900d04f921aab8)) +## [6.2.2-qa.0](https://github.com/forcedotcom/sfdx-core/compare/6.2.1...6.2.2-qa.0) (2023-11-27) ### Bug Fixes -* pass value to message correctly ([c21f088](https://github.com/forcedotcom/sfdx-core/commit/c21f0881a13f8d16ef5a02c5bdec1e9612d8acc8)) - +- jsdoc error ([985c2f6](https://github.com/forcedotcom/sfdx-core/commit/985c2f6b8fa90ee5302ecb84a07df8c4e2f214a4)) +- only hit server for undefined values, not false ([c0f3845](https://github.com/forcedotcom/sfdx-core/commit/c0f3845de26400381ee953782444abfdbaa530b9)) +### Features -## [3.32.1](https://github.com/forcedotcom/sfdx-core/compare/3.32.0...3.32.1) (2022-11-17) +- set some known props during scratch org creation ([447b070](https://github.com/forcedotcom/sfdx-core/commit/447b070d02badbe488f20c961b8db79ac6e9aef9)) +## [6.2.2](https://github.com/forcedotcom/sfdx-core/compare/6.2.2-qa.0...6.2.2) (2023-11-28) ### Bug Fixes -* **deps:** bump @salesforce/kit from 1.7.0 to 1.8.0 ([8e065a7](https://github.com/forcedotcom/sfdx-core/commit/8e065a76bbfb6182d2851ed51b18630bdcc097dc)) +- bump jsforce ([#1001](https://github.com/forcedotcom/sfdx-core/issues/1001)) ([bc5a6f0](https://github.com/forcedotcom/sfdx-core/commit/bc5a6f08c25087fb8f63a49882ade9e1a7a63bbc)) +## [6.2.2-qa.0](https://github.com/forcedotcom/sfdx-core/compare/6.2.1...6.2.2-qa.0) (2023-11-27) +### Bug Fixes -# [3.32.0](https://github.com/forcedotcom/sfdx-core/compare/3.31.19...3.32.0) (2022-11-17) - +- jsdoc error ([985c2f6](https://github.com/forcedotcom/sfdx-core/commit/985c2f6b8fa90ee5302ecb84a07df8c4e2f214a4)) +- only hit server for undefined values, not false ([c0f3845](https://github.com/forcedotcom/sfdx-core/commit/c0f3845de26400381ee953782444abfdbaa530b9)) ### Features -* getConnection accepts an optional version ([c4299f8](https://github.com/forcedotcom/sfdx-core/commit/c4299f88acf2c45979c13ca8d093919308619c99)) -* log when unnecessarily setting api version ([9e4afd2](https://github.com/forcedotcom/sfdx-core/commit/9e4afd2c573219eea43e2e43d5f3ca5822d936b3)) +- set some known props during scratch org creation ([447b070](https://github.com/forcedotcom/sfdx-core/commit/447b070d02badbe488f20c961b8db79ac6e9aef9)) +## [6.2.1](https://github.com/forcedotcom/sfdx-core/compare/6.2.0...6.2.1) (2023-11-26) +### Bug Fixes -## [3.31.19](https://github.com/forcedotcom/sfdx-core/compare/3.31.18...3.31.19) (2022-11-12) +- **deps:** bump @types/semver from 7.5.5 to 7.5.6 ([c12440d](https://github.com/forcedotcom/sfdx-core/commit/c12440de94c8479f4a885157082ee28065e43cff)) +# [6.2.0](https://github.com/forcedotcom/sfdx-core/compare/6.1.4...6.2.0) (2023-11-21) -### Bug Fixes +### Features -* ajv allows union type schema, sfProject doesn't validate ([#698](https://github.com/forcedotcom/sfdx-core/issues/698)) ([ca726ae](https://github.com/forcedotcom/sfdx-core/commit/ca726ae1cb6313f7eaf179517552f15b769a5b74)) +- generic type for sfError.data ([49beee5](https://github.com/forcedotcom/sfdx-core/commit/49beee53824a843a53e44e6b78f38b628b4eb0f8)) +## [6.1.4](https://github.com/forcedotcom/sfdx-core/compare/6.1.3...6.1.4) (2023-11-19) +### Bug Fixes -## [3.31.18](https://github.com/forcedotcom/sfdx-core/compare/3.31.17...3.31.18) (2022-11-07) +- **deps:** bump pino from 8.16.1 to 8.16.2 ([44678d4](https://github.com/forcedotcom/sfdx-core/commit/44678d4b8a7d1c5d89c67070807c324165c267fb)) +## [6.1.3](https://github.com/forcedotcom/sfdx-core/compare/6.1.2...6.1.3) (2023-11-15) ### Bug Fixes -* deduplicate headers case on Connect.request ([#697](https://github.com/forcedotcom/sfdx-core/issues/697)) ([fc592b2](https://github.com/forcedotcom/sfdx-core/commit/fc592b215bcc9184f3ca8003d382b6053447349b)) +- no retries on sync lock ([b7f5588](https://github.com/forcedotcom/sfdx-core/commit/b7f55882d10bb69c945ebd0cb89bcc6f1d48b9da)) +## [6.1.2](https://github.com/forcedotcom/sfdx-core/compare/6.1.1...6.1.2) (2023-11-15) +### Bug Fixes -## [3.31.17](https://github.com/forcedotcom/sfdx-core/compare/3.31.16...3.31.17) (2022-10-24) +- **types:** additional props for packaging lib ([25b3cf1](https://github.com/forcedotcom/sfdx-core/commit/25b3cf1b28d58bdaeebfef13d4463c33ed8a4b8a)) +## [6.1.1](https://github.com/forcedotcom/sfdx-core/compare/6.1.0...6.1.1) (2023-11-15) ### Bug Fixes -* improve `hubOrgIsNotDevHub` error msg ([#689](https://github.com/forcedotcom/sfdx-core/issues/689)) ([d3787fa](https://github.com/forcedotcom/sfdx-core/commit/d3787faf8c8aea75624b8a1b140384e1e567f1bc)) - +- write safety and valid typing for sfProject ([ff8b066](https://github.com/forcedotcom/sfdx-core/commit/ff8b06696f7ef88ac74a35f60e281b90eb74471b)) +# [6.1.0](https://github.com/forcedotcom/sfdx-core/compare/5.3.20...6.1.0) (2023-11-14) -## [3.31.16](https://github.com/forcedotcom/sfdx-core/compare/3.31.15...3.31.16) (2022-10-19) +### Bug Fixes +- permissionSet type changes ([7412d10](https://github.com/forcedotcom/sfdx-core/commit/7412d103703cfe2df2211546fcf2e6d93a689bc0)) +### Features -## [3.31.15](https://github.com/forcedotcom/sfdx-core/compare/3.31.13-0...3.31.15) (2022-10-19) +- remove sfdxConfig class ([80f21a3](https://github.com/forcedotcom/sfdx-core/commit/80f21a3a44e25443bd59259a80e69c23f6917986)) +- reusable file locks outside of ConfigFile ([29c59e0](https://github.com/forcedotcom/sfdx-core/commit/29c59e013f0cf25407430bd0d4752e4df8686ab5)) +- ts5 and ts-patch ([4e66905](https://github.com/forcedotcom/sfdx-core/commit/4e66905b9c0bd8997c2b995f11d3f36648ec15cb)) +### Performance Improvements -### Bug Fixes +- parallelize clear writes ([25a525a](https://github.com/forcedotcom/sfdx-core/commit/25a525ac62f26c2616d062dd3ddc08acee9ef20b)) -* remove prerelease portion of version number ([6dffeac](https://github.com/forcedotcom/sfdx-core/commit/6dffeacd0f12c24b32b3e9de13011c8a1cd22c0b)) +# [5.4.0-crdt.1](https://github.com/forcedotcom/sfdx-core/compare/6.0.1-crdt.0...5.4.0-crdt.1) (2023-10-13) +## [6.0.1-crdt.0](https://github.com/forcedotcom/sfdx-core/compare/5.3.9...6.0.1-crdt.0) (2023-10-13) +### Features -## [3.31.13-0](https://github.com/forcedotcom/sfdx-core/compare/3.31.12...3.31.13-0) (2022-10-18) +- configFile file locks and write-via-merge ([91316a7](https://github.com/forcedotcom/sfdx-core/commit/91316a7d8478810a07b8948e3de179e2e0abfb3f)) +- typing for what goes in the org-user file ([bde5005](https://github.com/forcedotcom/sfdx-core/commit/bde5005c9d688e179c55fa8a5a94de0611321571)) +- **wip:** crdt-configfile ([bad6dfb](https://github.com/forcedotcom/sfdx-core/commit/bad6dfbbb9bab8d0b3466f8f2d069e132fb871c9)) +## [5.3.20](https://github.com/forcedotcom/sfdx-core/compare/5.3.19...5.3.20) (2023-11-10) ### Bug Fixes -* reset SFDX_INTEROPERABILITY on contextRestore ([#673](https://github.com/forcedotcom/sfdx-core/issues/673)) ([4c8ecae](https://github.com/forcedotcom/sfdx-core/commit/4c8ecae69f871309b00f69a68228e3833923eee9)) +- http 420 errors ([6deabcd](https://github.com/forcedotcom/sfdx-core/commit/6deabcd603055786311994cb25c8c9282ff9971d)) +## [5.3.19](https://github.com/forcedotcom/sfdx-core/compare/5.3.18...5.3.19) (2023-11-08) +### Bug Fixes -## [3.31.12](https://github.com/forcedotcom/sfdx-core/compare/3.31.11...3.31.12) (2022-10-18) +- use memory logger instance when disabled ([c2ef3a0](https://github.com/forcedotcom/sfdx-core/commit/c2ef3a0f8fea0518b5eec2f6f515064e9741b46e)) +## [5.3.18](https://github.com/forcedotcom/sfdx-core/compare/5.3.17...5.3.18) (2023-11-05) ### Bug Fixes -* incorrect url for scratch org error codes documentation ([#681](https://github.com/forcedotcom/sfdx-core/issues/681)) ([ab91644](https://github.com/forcedotcom/sfdx-core/commit/ab91644820e031a28f6fb262e0f7826e8419e5d7)) +- **deps:** bump @types/semver from 7.5.3 to 7.5.4 ([a3be392](https://github.com/forcedotcom/sfdx-core/commit/a3be3922f96f8420eb871c413858eac395a95ad3)) +## [5.3.17](https://github.com/forcedotcom/sfdx-core/compare/5.3.16...5.3.17) (2023-11-02) +### Bug Fixes -## [3.31.11](https://github.com/forcedotcom/sfdx-core/compare/3.31.10...3.31.11) (2022-10-18) +- **deps:** testSetup has non ts-sinon dependency ([9fcb206](https://github.com/forcedotcom/sfdx-core/commit/9fcb206220174af1c20fcc041e127409a41c3593)) +## [5.3.16](https://github.com/forcedotcom/sfdx-core/compare/5.3.15...5.3.16) (2023-10-29) ### Bug Fixes -* function addLogFileStreamSync to use recursive mkdir ([#683](https://github.com/forcedotcom/sfdx-core/issues/683)) ([c85c69c](https://github.com/forcedotcom/sfdx-core/commit/c85c69c4179b2b06e4b2e6cbe5727d2a98918304)) +- **deps:** bump @salesforce/kit from 3.0.14 to 3.0.15 ([6189030](https://github.com/forcedotcom/sfdx-core/commit/61890307e557962cc44e02d542c276c56a9329f7)) +## [5.3.15](https://github.com/forcedotcom/sfdx-core/compare/5.3.14...5.3.15) (2023-10-29) +### Bug Fixes -## [3.31.10](https://github.com/forcedotcom/sfdx-core/compare/3.31.9...3.31.10) (2022-10-14) +- **deps:** bump @salesforce/ts-types from 2.0.8 to 2.0.9 ([80dea3d](https://github.com/forcedotcom/sfdx-core/commit/80dea3dd60e36be37852177b11f4db18e9a8653a)) +## [5.3.14](https://github.com/forcedotcom/sfdx-core/compare/5.3.13...5.3.14) (2023-10-26) ### Bug Fixes -* getPackageFromPath now handles nested package paths ([#678](https://github.com/forcedotcom/sfdx-core/issues/678)) ([d8c43c6](https://github.com/forcedotcom/sfdx-core/commit/d8c43c66ec4ea58e0398009083740fab0bac1439)) +- add scopeProfiles to project type ([b130982](https://github.com/forcedotcom/sfdx-core/commit/b1309829cbcc8511e60cb6c88a5721edb3c060dd)) +- update schemas dep ([3f70e8f](https://github.com/forcedotcom/sfdx-core/commit/3f70e8fcc64aff0a0a10a864f32aa6325a2ba144)) +## [5.3.13](https://github.com/forcedotcom/sfdx-core/compare/5.3.12...5.3.13) (2023-10-26) +### Bug Fixes -## [3.31.9](https://github.com/forcedotcom/sfdx-core/compare/3.31.8...3.31.9) (2022-10-13) +- handle alias file with no `orgs` prop ([c59c7c7](https://github.com/forcedotcom/sfdx-core/commit/c59c7c7387f159537b9d352057299842f864b864)) +## [5.3.12](https://github.com/forcedotcom/sfdx-core/compare/5.3.11...5.3.12) (2023-10-24) ### Bug Fixes -* ensure the hubOrg passes is actually a DevHub, throw error if not ([#669](https://github.com/forcedotcom/sfdx-core/issues/669)) ([753292f](https://github.com/forcedotcom/sfdx-core/commit/753292fcf51d57a39aab36190a2053152caaacd8)) +- **deps:** bump pino from 8.15.6 to 8.16.0 ([7e05681](https://github.com/forcedotcom/sfdx-core/commit/7e0568183015151e649883ebcf581be298f792b3)) +## [5.3.11](https://github.com/forcedotcom/sfdx-core/compare/5.3.10...5.3.11) (2023-10-22) +### Bug Fixes -## [3.31.8](https://github.com/forcedotcom/sfdx-core/compare/3.30.14...3.31.8) (2022-10-13) +- **deps:** bump @salesforce/kit from 3.0.13 to 3.0.14 ([9e366de](https://github.com/forcedotcom/sfdx-core/commit/9e366de1c4d674ae9cc83f5f0cff6859edd18974)) +## [5.3.10](https://github.com/forcedotcom/sfdx-core/compare/5.4.0-crdt.1...5.3.10) (2023-10-20) ### Bug Fixes -* force release ([da5ffa0](https://github.com/forcedotcom/sfdx-core/commit/da5ffa0e51855746decf1b63d6195d793929b846)) +- bump jsforce ([#958](https://github.com/forcedotcom/sfdx-core/issues/958)) ([98a6fef](https://github.com/forcedotcom/sfdx-core/commit/98a6fef4b21320b57f2e0730f94918cdb590953c)) +# [5.4.0-crdt.1](https://github.com/forcedotcom/sfdx-core/compare/6.0.1-crdt.0...5.4.0-crdt.1) (2023-10-13) + +## [6.0.1-crdt.0](https://github.com/forcedotcom/sfdx-core/compare/5.3.9...6.0.1-crdt.0) (2023-10-13) ### Features -* deprecate testSetup and refactor TestContext ([#676](https://github.com/forcedotcom/sfdx-core/issues/676)) ([6e2f547](https://github.com/forcedotcom/sfdx-core/commit/6e2f547229199da2e2839e4ea70dabd13089c487)) +- configFile file locks and write-via-merge ([91316a7](https://github.com/forcedotcom/sfdx-core/commit/91316a7d8478810a07b8948e3de179e2e0abfb3f)) +- typing for what goes in the org-user file ([bde5005](https://github.com/forcedotcom/sfdx-core/commit/bde5005c9d688e179c55fa8a5a94de0611321571)) +- **wip:** crdt-configfile ([bad6dfb](https://github.com/forcedotcom/sfdx-core/commit/bad6dfbbb9bab8d0b3466f8f2d069e132fb871c9)) +## [5.3.9](https://github.com/forcedotcom/sfdx-core/compare/5.3.8...5.3.9) (2023-10-09) +### Bug Fixes -## [3.30.14](https://github.com/forcedotcom/sfdx-core/compare/3.30.13...3.30.14) (2022-10-11) +- **deps:** bump @salesforce/kit from 3.0.12 to 3.0.13 ([08fb56b](https://github.com/forcedotcom/sfdx-core/commit/08fb56b1a14385168adba81bc44d67fc987040e6)) +## [5.3.8](https://github.com/forcedotcom/sfdx-core/compare/5.3.7...5.3.8) (2023-10-08) ### Bug Fixes -* type on TokenAccessor.set ([#675](https://github.com/forcedotcom/sfdx-core/issues/675)) ([94fdf1e](https://github.com/forcedotcom/sfdx-core/commit/94fdf1ed9ded8f8fbe1a66d55affbd0ac27e79bb)) +- **deps:** bump pino from 8.15.1 to 8.15.6 ([2a5a9cc](https://github.com/forcedotcom/sfdx-core/commit/2a5a9cc69e6616ed6b4338c3ce26e5c5dbd9abab)) +## [5.3.7](https://github.com/forcedotcom/sfdx-core/compare/5.3.6...5.3.7) (2023-10-08) +### Bug Fixes -## [3.30.13](https://github.com/forcedotcom/sfdx-core/compare/3.30.12...3.30.13) (2022-10-10) +- **deps:** bump @types/semver from 7.5.2 to 7.5.3 ([9e8a0a7](https://github.com/forcedotcom/sfdx-core/commit/9e8a0a7e53d8b5900baf00e01548ea81c1ecfd4e)) +## [5.3.6](https://github.com/forcedotcom/sfdx-core/compare/5.3.5...5.3.6) (2023-10-08) ### Bug Fixes -* add tooling query support to autoFetchQuery ([#665](https://github.com/forcedotcom/sfdx-core/issues/665)) ([608b119](https://github.com/forcedotcom/sfdx-core/commit/608b11971d893f7417fcfe5f4eea710f38b8e7cf)) +- **deps:** bump pino-pretty from 10.2.0 to 10.2.3 ([9e925c5](https://github.com/forcedotcom/sfdx-core/commit/9e925c599cbb7f5826ac6a0afe6043f6465e7dcf)) +## [5.3.5](https://github.com/forcedotcom/sfdx-core/compare/5.3.4...5.3.5) (2023-10-06) +### Bug Fixes -## [3.30.12](https://github.com/forcedotcom/sfdx-core/compare/3.30.11...3.30.12) (2022-10-08) +- allow padding on id and secret ([b93ac50](https://github.com/forcedotcom/sfdx-core/commit/b93ac504d09145dad3d5b5beea4ce1d5a56985cd)) +## [5.3.4](https://github.com/forcedotcom/sfdx-core/compare/5.3.3...5.3.4) (2023-10-04) ### Bug Fixes -* **deps:** bump ts-retry-promise from 0.6.2 to 0.7.0 ([5def87a](https://github.com/forcedotcom/sfdx-core/commit/5def87ae3be6eac81503abfaff96e29ba2c82bdf)) +- handle multiple sandbox processes in resumable state ([#944](https://github.com/forcedotcom/sfdx-core/issues/944)) ([a49409d](https://github.com/forcedotcom/sfdx-core/commit/a49409d05ce7edbea861eaa0de91c2c9d8a70ddd)) +## [5.3.3](https://github.com/forcedotcom/sfdx-core/compare/5.3.2...5.3.3) (2023-10-01) +### Bug Fixes -## [3.30.11](https://github.com/forcedotcom/sfdx-core/compare/3.30.10...3.30.11) (2022-10-07) +- **deps:** bump @salesforce/ts-types from 2.0.7 to 2.0.8 ([d3e22b9](https://github.com/forcedotcom/sfdx-core/commit/d3e22b9420beae576ca085fd4827c169f8b54535)) +## [5.3.2](https://github.com/forcedotcom/sfdx-core/compare/5.3.1...5.3.2) (2023-10-01) ### Bug Fixes -* update kit, testSetup plus major refactor ([453b886](https://github.com/forcedotcom/sfdx-core/commit/453b8860c16991796252f05a3c933dee1e9d7e3b)) +- **deps:** bump @salesforce/kit from 3.0.11 to 3.0.12 ([b738085](https://github.com/forcedotcom/sfdx-core/commit/b738085f2266801fbc94241824ebfe899ba80fd6)) +## [5.3.1](https://github.com/forcedotcom/sfdx-core/compare/5.3.0...5.3.1) (2023-09-28) +### Bug Fixes -## [3.30.10](https://github.com/forcedotcom/sfdx-core/compare/3.30.9...3.30.10) (2022-10-04) +- **deps:** bump get-func-name from 2.0.0 to 2.0.2 ([19aeb98](https://github.com/forcedotcom/sfdx-core/commit/19aeb98c16297da433f3227e413fe92833929108)) +# [5.3.0](https://github.com/forcedotcom/sfdx-core/compare/5.2.10...5.3.0) (2023-09-27) +### Features -## [3.30.9](https://github.com/forcedotcom/sfdx-core/compare/3.30.8...3.30.9) (2022-09-28) +- unique listener names for lifecycle events ([#941](https://github.com/forcedotcom/sfdx-core/issues/941)) ([c5d60ae](https://github.com/forcedotcom/sfdx-core/commit/c5d60ae62e4bbcacdd3a496d17fbd3ce0cfbafba)) +## [5.2.10](https://github.com/forcedotcom/sfdx-core/compare/5.2.9...5.2.10) (2023-09-17) ### Bug Fixes -* fix package dir functions ([#660](https://github.com/forcedotcom/sfdx-core/issues/660)) ([7df117c](https://github.com/forcedotcom/sfdx-core/commit/7df117c6b5aecf500af82adb52efe5e931fb8718)) - - - -## [3.30.8](https://github.com/forcedotcom/sfdx-core/compare/3.30.7...3.30.8) (2022-09-23) +- **deps:** bump @types/semver from 7.5.1 to 7.5.2 ([3994b3b](https://github.com/forcedotcom/sfdx-core/commit/3994b3b4d4234a7ed5d79e355a018d4d9249480c)) +## [5.2.9](https://github.com/forcedotcom/sfdx-core/compare/5.2.8...5.2.9) (2023-09-10) ### Bug Fixes -* **scratch:** respect `apiVersion` config value ([#656](https://github.com/forcedotcom/sfdx-core/issues/656)) ([1a29482](https://github.com/forcedotcom/sfdx-core/commit/1a294821c07f334494f2e56295dcd1a23570fa4b)) +- **deps:** bump pino from 8.15.0 to 8.15.1 ([617c440](https://github.com/forcedotcom/sfdx-core/commit/617c44030a320575f87ed14c23de2a45544a8441)) +## [5.2.8](https://github.com/forcedotcom/sfdx-core/compare/5.2.7...5.2.8) (2023-09-10) +### Bug Fixes -## [3.30.7](https://github.com/forcedotcom/sfdx-core/compare/3.30.4...3.30.7) (2022-09-23) +- **deps:** bump @types/semver from 7.5.0 to 7.5.1 ([90e2870](https://github.com/forcedotcom/sfdx-core/commit/90e2870fc911c495176a917007dacd9bbf64a91c)) +## [5.2.7](https://github.com/forcedotcom/sfdx-core/compare/5.2.6...5.2.7) (2023-09-04) ### Bug Fixes -* force build ([cb0b831](https://github.com/forcedotcom/sfdx-core/commit/cb0b8310ca2b2fc9e537229c0034deb1063c3a34)) -* revert 3.30.4 ([#658](https://github.com/forcedotcom/sfdx-core/issues/658)) ([3ed9565](https://github.com/forcedotcom/sfdx-core/commit/3ed95653fd03f80483d0bbd137697cb7df87ddd8)), closes [#657](https://github.com/forcedotcom/sfdx-core/issues/657) [#655](https://github.com/forcedotcom/sfdx-core/issues/655) +- **deps:** bump ts-retry-promise from 0.7.0 to 0.7.1 ([d71420a](https://github.com/forcedotcom/sfdx-core/commit/d71420a7360e81c8c561e07becbb085ddaf5f6ce)) +## [5.2.6](https://github.com/forcedotcom/sfdx-core/compare/5.2.5...5.2.6) (2023-09-03) +### Bug Fixes -## [3.30.4](https://github.com/forcedotcom/sfdx-core/compare/3.30.3...3.30.4) (2022-09-23) +- **deps:** bump jsonwebtoken from 9.0.1 to 9.0.2 ([8323f3c](https://github.com/forcedotcom/sfdx-core/commit/8323f3cd253527210050b87b9936fb210ea74974)) +## [5.2.5](https://github.com/forcedotcom/sfdx-core/compare/5.2.4...5.2.5) (2023-09-01) ### Bug Fixes -* retire use of pkgdir.name field ([#655](https://github.com/forcedotcom/sfdx-core/issues/655)) ([227f9a8](https://github.com/forcedotcom/sfdx-core/commit/227f9a8663401813b3e8626344fa59464510a732)) +- **deps:** bump pino from 8.14.2 to 8.15.0 ([e6770e6](https://github.com/forcedotcom/sfdx-core/commit/e6770e694024adee8b844bf47385f55a4d298efe)) +## [5.2.4](https://github.com/forcedotcom/sfdx-core/compare/5.2.3...5.2.4) (2023-08-31) +### Bug Fixes -## [3.30.3](https://github.com/forcedotcom/sfdx-core/compare/v3.30.2...3.30.3) (2022-09-20) +- **perf:** perf tweaks, semver is a dep ([#918](https://github.com/forcedotcom/sfdx-core/issues/918)) ([5636083](https://github.com/forcedotcom/sfdx-core/commit/563608375fa23d1831673503bee501e487a8b1e4)) +## [5.2.3](https://github.com/forcedotcom/sfdx-core/compare/5.2.2...5.2.3) (2023-08-27) ### Bug Fixes -* add helper functions to project for pkging ([1ed5563](https://github.com/forcedotcom/sfdx-core/commit/1ed556348cd0cc2f8c9dae7125a12bf177206c5c)) +- **deps:** bump @salesforce/kit from 3.0.9 to 3.0.11 ([8bad544](https://github.com/forcedotcom/sfdx-core/commit/8bad544318f9999c4b73ac58ecfc976180c769b0)) +## [5.2.2](https://github.com/forcedotcom/sfdx-core/compare/5.2.1...5.2.2) (2023-08-27) +### Bug Fixes -## [3.30.2](https://github.com/forcedotcom/sfdx-core/compare/v3.30.1...v3.30.2) (2022-09-16) +- **deps:** bump @salesforce/ts-types from 2.0.6 to 2.0.7 ([ee069f4](https://github.com/forcedotcom/sfdx-core/commit/ee069f4bfe8339779bc03f9c961d56cc45bc7a45)) +## [5.2.1](https://github.com/forcedotcom/sfdx-core/compare/5.2.0...5.2.1) (2023-08-13) ### Bug Fixes -* **logger:** support `SF_*` env vars ([#637](https://github.com/forcedotcom/sfdx-core/issues/637)) ([53c4296](https://github.com/forcedotcom/sfdx-core/commit/53c4296d0ab0728a798e39626a29168371e1a062)) +- **deps:** bump @salesforce/kit from 3.0.6 to 3.0.9 ([a9d45eb](https://github.com/forcedotcom/sfdx-core/commit/a9d45eb7ac4f116464f2852cd4cce889d07e9228)) +# [5.2.0](https://github.com/forcedotcom/sfdx-core/compare/5.1.6...5.2.0) (2023-08-03) +### Features -## [3.30.1](https://github.com/forcedotcom/sfdx-core/compare/v3.30.0...v3.30.1) (2022-09-15) +- save namespacePrefix in auth file ([8d2dd7e](https://github.com/forcedotcom/sfdx-core/commit/8d2dd7ea9a5752a2ad9df3c2b5233476119db1b2)) +## [5.1.6](https://github.com/forcedotcom/sfdx-core/compare/5.1.5...5.1.6) (2023-08-03) ### Bug Fixes -* await postOrgCreate hook ([#636](https://github.com/forcedotcom/sfdx-core/issues/636)) ([b9934d2](https://github.com/forcedotcom/sfdx-core/commit/b9934d2df6f5ea49b4f8bae44779aa5cab0e897f)) +- use debug levels that are numbers from the env ([f051963](https://github.com/forcedotcom/sfdx-core/commit/f051963272c91ace99e948ba36de8f7e29952796)) +## [5.1.5](https://github.com/forcedotcom/sfdx-core/compare/5.1.4...5.1.5) (2023-08-02) +### Bug Fixes -# [3.30.0](https://github.com/forcedotcom/sfdx-core/compare/v3.26.3...v3.30.0) (2022-09-12) +- better type for SandboxFields ([9bf4154](https://github.com/forcedotcom/sfdx-core/commit/9bf4154216dc0bd07438f8be34a3902fa0e64d8f)) +- check devhubs and non-scratch orgs and sandboxes ([57c0bae](https://github.com/forcedotcom/sfdx-core/commit/57c0bae9098f5d750a8ee4d90bc8bfa30a88f38b)) +- identify sandboxes during authentication ([a79117e](https://github.com/forcedotcom/sfdx-core/commit/a79117e2b83ef934addfd06ba74c06e32d66d056)) +- query devhubs, non-scratch orgs, and non-sandboxes to identify sandboxes ([26d923e](https://github.com/forcedotcom/sfdx-core/commit/26d923e5ec34efd9236675ef8c0290341da48c40)) +## [5.1.4](https://github.com/forcedotcom/sfdx-core/compare/5.1.3...5.1.4) (2023-07-31) +### Bug Fixes -## [3.26.3](https://github.com/forcedotcom/sfdx-core/compare/v3.26.2...v3.26.3) (2022-09-06) +- **deps:** bump pino-pretty from 10.0.0 to 10.2.0 ([0b66a21](https://github.com/forcedotcom/sfdx-core/commit/0b66a21da0fe3a0f7c76b39a96c3a525ab654659)) +## [5.1.3](https://github.com/forcedotcom/sfdx-core/compare/5.1.2...5.1.3) (2023-07-30) +### Bug Fixes -## [3.26.2](https://github.com/forcedotcom/sfdx-core/compare/v3.26.1...v3.26.2) (2022-08-16) +- **deps:** bump pino from 8.14.1 to 8.14.2 ([461f8e4](https://github.com/forcedotcom/sfdx-core/commit/461f8e45fb879e59becb69548a0539e7931764a9)) +## [5.1.2](https://github.com/forcedotcom/sfdx-core/compare/5.1.1...5.1.2) (2023-07-28) +### Bug Fixes -## [3.26.1](https://github.com/forcedotcom/sfdx-core/compare/v3.26.0...v3.26.1) (2022-08-08) +- **deps:** bump @salesforce/kit from 3.0.4 to 3.0.6 ([ecb5525](https://github.com/forcedotcom/sfdx-core/commit/ecb5525e5661571b36545d22d02e404a2deecda5)) +## [5.1.1](https://github.com/forcedotcom/sfdx-core/compare/5.1.0...5.1.1) (2023-07-28) ### Bug Fixes -* update jsforce ([0353330](https://github.com/forcedotcom/sfdx-core/commit/03533307f0ea1f8877027a5619c970e1ae2443ec)) +- **deps:** bump @salesforce/ts-types from 2.0.4 to 2.0.5 ([0b13602](https://github.com/forcedotcom/sfdx-core/commit/0b136024d90e7a361c87f35039d4869255ca2e39)) +# [5.1.0](https://github.com/forcedotcom/sfdx-core/compare/5.0.1-v5-beta.1...5.1.0) (2023-07-27) +## [5.0.1-v5-beta.1](https://github.com/forcedotcom/sfdx-core/compare/5.0.1-v5-beta.0...5.0.1-v5-beta.1) (2023-07-24) -# [3.26.0](https://github.com/forcedotcom/sfdx-core/compare/v3.25.1...v3.26.0) (2022-08-04) +## [5.0.1-v5-beta.0](https://github.com/forcedotcom/sfdx-core/compare/4.3.11...5.0.1-v5-beta.0) (2023-07-20) + +### Bug Fixes +- bump jsforce ([1f52733](https://github.com/forcedotcom/sfdx-core/commit/1f527330f060ea47044c8245b62f5bdd08c65dae)) ### Features -* remove GlobalInfo ([57bd0fa](https://github.com/forcedotcom/sfdx-core/commit/57bd0fa50c5fe3cc859ca107fd0a18dc1b871c1f)) +- clean up week+ old log files ([2af0bb9](https://github.com/forcedotcom/sfdx-core/commit/2af0bb928c5bfc10e136ae694b11a9d54f2b2544)) +- parameterize log cleanup for test use ([b927164](https://github.com/forcedotcom/sfdx-core/commit/b92716483eae0a2b9494605d82cce083e8d762b5)) +- pino logger ([7b6565b](https://github.com/forcedotcom/sfdx-core/commit/7b6565b2f36322be85e6c9ff3dbb51844279c8f5)) +## [4.3.11](https://github.com/forcedotcom/sfdx-core/compare/4.3.10...4.3.11) (2023-07-16) +### Bug Fixes -## [3.25.1](https://github.com/forcedotcom/sfdx-core/compare/v3.25.0...v3.25.1) (2022-08-03) +- **deps:** bump jsonwebtoken from 9.0.0 to 9.0.1 ([ae66699](https://github.com/forcedotcom/sfdx-core/commit/ae66699c99012999db0edd85384237ba7405b7bf)) +## [4.3.10](https://github.com/forcedotcom/sfdx-core/compare/4.3.9...4.3.10) (2023-07-11) ### Bug Fixes -* add interop between templates config/env var ([eea3d05](https://github.com/forcedotcom/sfdx-core/commit/eea3d055b75ceb61639e06bc53e309a01f70a8e2)) +- **deps:** bump semver from 5.7.1 to 5.7.2 ([eef3f68](https://github.com/forcedotcom/sfdx-core/commit/eef3f68337ff0b087072e4e911f309eefe60efb4)) +## [4.3.9](https://github.com/forcedotcom/sfdx-core/compare/4.3.8...4.3.9) (2023-07-10) +### Bug Fixes -# [3.25.0](https://github.com/forcedotcom/sfdx-core/compare/v3.24.5...v3.25.0) (2022-07-29) +- **deps:** bump @salesforce/schemas from 1.5.1 to 1.6.0 ([2be2263](https://github.com/forcedotcom/sfdx-core/commit/2be226386f14a3b3ffa1a4d6483d2db3d032c3f1)) +## [4.3.8](https://github.com/forcedotcom/sfdx-core/compare/4.3.7...4.3.8) (2023-07-09) -### Features +### Bug Fixes -* orgAccessor.get has throwOnNotFound option ([a2ee821](https://github.com/forcedotcom/sfdx-core/commit/a2ee8219adf692de7de17ba254e05f501ef5814c)) +- **deps:** bump @salesforce/kit from 3.0.3 to 3.0.4 ([a88baa7](https://github.com/forcedotcom/sfdx-core/commit/a88baa79116250d3e75aca3c9cd2958619cfe154)) +## [4.3.7](https://github.com/forcedotcom/sfdx-core/compare/4.3.6...4.3.7) (2023-07-08) +### Bug Fixes -## [3.24.5](https://github.com/forcedotcom/sfdx-core/compare/v3.24.4...v3.24.5) (2022-07-28) +- **deps:** bump tough-cookie from 4.0.0 to 4.1.3 ([230c975](https://github.com/forcedotcom/sfdx-core/commit/230c975c5b024ea64196400752c76750dae20669)) +## [4.3.6](https://github.com/forcedotcom/sfdx-core/compare/4.3.5...4.3.6) (2023-07-06) ### Bug Fixes -* set correct file mode for log file ([30aa3fc](https://github.com/forcedotcom/sfdx-core/commit/30aa3fc09ba2bf0db600ee6528fde5b0ff97b217)) +- query scratch orgs by provided Id ([cbfc47a](https://github.com/forcedotcom/sfdx-core/commit/cbfc47a66975a482cc51af2f1528142775aca3be)) +## [4.3.5](https://github.com/forcedotcom/sfdx-core/compare/4.3.4...4.3.5) (2023-06-29) +### Bug Fixes -## [3.24.4](https://github.com/forcedotcom/sfdx-core/compare/v3.24.3...v3.24.4) (2022-07-28) +- unset aliases and configs when org is deleted ([a06ce1f](https://github.com/forcedotcom/sfdx-core/commit/a06ce1f7c500313f1f317ec68bb5c98f5aef1728)) +## [4.3.4](https://github.com/forcedotcom/sfdx-core/compare/4.3.3...4.3.4) (2023-06-28) +### Bug Fixes -## [3.24.3](https://github.com/forcedotcom/sfdx-core/compare/v3.24.2...v3.24.3) (2022-07-28) +- **deps:** bump jsforce from 2.0.0-beta.24 to 2.0.0-beta.27 ([a0aa6c1](https://github.com/forcedotcom/sfdx-core/commit/a0aa6c1d74a8dcc4b3bc62927d1663132971d961)) +## [4.3.3](https://github.com/forcedotcom/sfdx-core/compare/4.3.2...4.3.3) (2023-06-26) ### Bug Fixes -* handle ancestor keywords when creating scratch org ([72af55a](https://github.com/forcedotcom/sfdx-core/commit/72af55a53b87f1d81d22dc4e53891b3b0ab2966f)) +- tolerate broken auth files (with warning) during readAll ([#869](https://github.com/forcedotcom/sfdx-core/issues/869)) ([4cea657](https://github.com/forcedotcom/sfdx-core/commit/4cea657213054b6c3f22bb70a00753105caf2337)) +## [4.3.2](https://github.com/forcedotcom/sfdx-core/compare/4.3.1...4.3.2) (2023-06-20) +### Bug Fixes -## [3.24.2](https://github.com/forcedotcom/sfdx-core/compare/v3.24.1...v3.24.2) (2022-07-26) +- better scratch org settings messages ([39d1124](https://github.com/forcedotcom/sfdx-core/commit/39d1124804ee845533888878c9a7aeb2c0ed8c25)) +## [4.3.1](https://github.com/forcedotcom/sfdx-core/compare/4.3.0...4.3.1) (2023-06-13) ### Bug Fixes -* use correct field for clone requests ([#623](https://github.com/forcedotcom/sfdx-core/issues/623)) ([2372f03](https://github.com/forcedotcom/sfdx-core/commit/2372f0364b87a7ac498c8d7ef637a9b5fdc725ea)) +- **messageTransformer:** remove export, require deep import from lib ([#861](https://github.com/forcedotcom/sfdx-core/issues/861)) ([49abe60](https://github.com/forcedotcom/sfdx-core/commit/49abe603e765a29bbcb5f29c664dd862c29493be)) +# [4.3.0](https://github.com/forcedotcom/sfdx-core/compare/4.2.2...4.3.0) (2023-06-13) +### Features -## [3.24.1](https://github.com/forcedotcom/sfdx-core/compare/v3.24.0...v3.24.1) (2022-07-21) +- export msgTransformer for other libraries ([25a5b4f](https://github.com/forcedotcom/sfdx-core/commit/25a5b4f1f3e12864fb3ac735a44eebc3b0a19293)) +## [4.2.2](https://github.com/forcedotcom/sfdx-core/compare/4.2.1...4.2.2) (2023-06-11) ### Bug Fixes -* bump jsforce ([#622](https://github.com/forcedotcom/sfdx-core/issues/622)) ([c7b53b7](https://github.com/forcedotcom/sfdx-core/commit/c7b53b73977012f81e029a15f39c3fb35bc1041d)) +- **deps:** bump @salesforce/kit from 3.0.2 to 3.0.3 ([19c1cf6](https://github.com/forcedotcom/sfdx-core/commit/19c1cf6310c61826ee8da296ab558f477b5817a0)) +## [4.2.1](https://github.com/forcedotcom/sfdx-core/compare/4.2.0...4.2.1) (2023-06-08) +### Bug Fixes -# [3.24.0](https://github.com/forcedotcom/sfdx-core/compare/v3.23.9...v3.24.0) (2022-07-14) +- typos ([58064b1](https://github.com/forcedotcom/sfdx-core/commit/58064b140adfb78895f3d09a72dd731a4d299dff)) +# [4.2.0](https://github.com/forcedotcom/sfdx-core/compare/4.1.3...4.2.0) (2023-06-06) ### Bug Fixes -* align messages/files ([5a5f04d](https://github.com/forcedotcom/sfdx-core/commit/5a5f04d3ea8ffb30fdbbfe2c83824ec56a56ec34)) -* load messages by name ([7c3a2d9](https://github.com/forcedotcom/sfdx-core/commit/7c3a2d9d84f9553bb9cf1bc369b49ca46100484e)) -* use named messages always ([2bb25a9](https://github.com/forcedotcom/sfdx-core/commit/2bb25a9c24fcb7146e363783ea81bc3708060a18)) - +- improve test robustness ([1b29bd3](https://github.com/forcedotcom/sfdx-core/commit/1b29bd360a753a0d9c7606e45e096c6d7c7fa5e6)) ### Features -* org.scratchOrgCreate uses all options except hub ([045a7aa](https://github.com/forcedotcom/sfdx-core/commit/045a7aa56c97323aa8b3191c4879cd1b43f0cfb1)) - - - -## [3.23.9](https://github.com/forcedotcom/sfdx-core/compare/v3.23.8...v3.23.9) (2022-07-14) +- replace archiver with jszip for ZipWriter ([c8d03d4](https://github.com/forcedotcom/sfdx-core/commit/c8d03d429cf14140fa025cdbf2499876b56a9b38)) +## [4.1.3](https://github.com/forcedotcom/sfdx-core/compare/4.1.2...4.1.3) (2023-06-06) +### Bug Fixes -## [3.23.8](https://github.com/forcedotcom/sfdx-core/compare/v3.23.7...v3.23.8) (2022-07-13) +- **deps:** bump @types/semver from 7.3.13 to 7.5.0 ([4a84e39](https://github.com/forcedotcom/sfdx-core/commit/4a84e39caaf5b66266de29a275bd46a1fde003fc)) +## [4.1.2](https://github.com/forcedotcom/sfdx-core/compare/4.1.1...4.1.2) (2023-06-05) ### Bug Fixes -* remove greedy matching for AuthInfo encryptedKeys ([12c6dcc](https://github.com/forcedotcom/sfdx-core/commit/12c6dcc5137a48d59e0da4a20426d8fa2cf747d9)) +- **deps:** bump @salesforce/kit from 3.0.0 to 3.0.2 ([c1e75d0](https://github.com/forcedotcom/sfdx-core/commit/c1e75d038a3fb6776bde246348935d6a2857f6dc)) +## [4.1.1](https://github.com/forcedotcom/sfdx-core/compare/4.1.0...4.1.1) (2023-06-05) +### Bug Fixes -## [3.23.7](https://github.com/forcedotcom/sfdx-core/compare/v3.23.6...v3.23.7) (2022-07-08) +- trigger gha ([efbd179](https://github.com/forcedotcom/sfdx-core/commit/efbd1798fb5600545b4507ca894819d03375e0c5)) +- trigger gha ([a6cb99a](https://github.com/forcedotcom/sfdx-core/commit/a6cb99adbd28e8c1abd6bd38550c3b45d9f33c74)) +- use SF prefixed env vars, add UTs ([e266340](https://github.com/forcedotcom/sfdx-core/commit/e266340f57c6512acaf71eb3cf8a9d292f37ca01)) +# [4.1.0](https://github.com/forcedotcom/sfdx-core/compare/4.0.1...4.1.0) (2023-06-01) ### Bug Fixes -* add structure writer interface and refactor ([daef19c](https://github.com/forcedotcom/sfdx-core/commit/daef19cb3a4d145ebb22c4f721a1bd47ffddce40)) +- everything but ut/testsetup ([616488a](https://github.com/forcedotcom/sfdx-core/commit/616488af548498c32cf1fde45b79fd52490db6f3)) +### Features +- file locking for aliases ([d351ebb](https://github.com/forcedotcom/sfdx-core/commit/d351ebb1136cd97d1c2d70f14d29622b4b40e711)) -## [3.23.6](https://github.com/forcedotcom/sfdx-core/compare/v3.23.5...v3.23.6) (2022-07-06) +## [4.0.1](https://github.com/forcedotcom/sfdx-core/compare/3.36.2...4.0.1) (2023-05-30) +## [3.36.2](https://github.com/forcedotcom/sfdx-core/compare/3.36.1...3.36.2) (2023-05-22) ### Bug Fixes -* workaround for jsforce update bug ([1776f50](https://github.com/forcedotcom/sfdx-core/commit/1776f505671a5a764c4e966736c2981df2b178a4)) +- bump jsforce to latest beta ([32c46c1](https://github.com/forcedotcom/sfdx-core/commit/32c46c187738cbb6b686e9901a03183e0a02cf34)) + +## [3.36.1](https://github.com/forcedotcom/sfdx-core/compare/3.36.0...3.36.1) (2023-05-11) +### Bug Fixes +- handle unknown config keys that moved to plugins ([5077340](https://github.com/forcedotcom/sfdx-core/commit/5077340d04b8225bf3089112502de106af911841)) -## [3.23.5](https://github.com/forcedotcom/sfdx-core/compare/v3.23.4...v3.23.5) (2022-07-06) +# [3.36.0](https://github.com/forcedotcom/sfdx-core/compare/3.35.0...3.36.0) (2023-04-28) +# [3.35.0-qa.3](https://github.com/forcedotcom/sfdx-core/compare/3.35.0-qa.2...3.35.0-qa.3) (2023-04-24) ### Bug Fixes -* add resolveAlias ([#605](https://github.com/forcedotcom/sfdx-core/issues/605)) ([ffa9ed6](https://github.com/forcedotcom/sfdx-core/commit/ffa9ed63ea583baa327071db4030ea5346d1128f)) +- load config for deprecated stuff, too ([ef1c71b](https://github.com/forcedotcom/sfdx-core/commit/ef1c71b2f9989f7afeb99e662f5b441ef077515f)) +# [3.35.0-qa.2](https://github.com/forcedotcom/sfdx-core/compare/3.34.8...3.35.0-qa.2) (2023-04-24) +### Features -## [3.23.4](https://github.com/forcedotcom/sfdx-core/compare/v3.23.3...v3.23.4) (2022-07-05) +- sf rest_deploy via env ([46ae051](https://github.com/forcedotcom/sfdx-core/commit/46ae051bd36a52be0244b55274dc4aa438286286)) +# [3.35.0-qa.1](https://github.com/forcedotcom/sfdx-core/compare/3.34.7...3.35.0-qa.1) (2023-04-21) ### Bug Fixes -* force publish ([3eb660d](https://github.com/forcedotcom/sfdx-core/commit/3eb660dd23ee959e085a9ac3dbd65de92e511d74)) - - - -## [3.23.3](https://github.com/forcedotcom/sfdx-core/compare/v3.23.2...v3.23.3) (2022-06-30) +- prerelease branch for testing ([cdeaa51](https://github.com/forcedotcom/sfdx-core/commit/cdeaa514497456d7cae198e04079eb2d12630d7a)) +# [3.35.0](https://github.com/forcedotcom/sfdx-core/compare/3.34.9...3.35.0) (2023-04-28) ### Bug Fixes -* force publish ([b767232](https://github.com/forcedotcom/sfdx-core/commit/b767232f2f76a4a00387e37128428ad18221a594)) - +- bad error message for in progress scratch orgs ([b18d112](https://github.com/forcedotcom/sfdx-core/commit/b18d1121b56c96f7bb9cddfcacc0bae58f977628)) +### Features -## [3.23.2](https://github.com/forcedotcom/sfdx-core/compare/v3.23.1...v3.23.2) (2022-06-30) +- backward compatible configs/envs with warnings ([51ed461](https://github.com/forcedotcom/sfdx-core/commit/51ed461ba06fd62bbada398dcc86656eb9b34fac)) +- sfdxConfigAggregator = configAggregator ([a98cd97](https://github.com/forcedotcom/sfdx-core/commit/a98cd975e17e4bc75f76c3f6034050816d0f9e1e)) +- warnings from config ([a84993e](https://github.com/forcedotcom/sfdx-core/commit/a84993edeee942175f80c5e96683164579a4fa70)) +## [3.34.9](https://github.com/forcedotcom/sfdx-core/compare/3.35.0-qa.3...3.34.9) (2023-04-27) ### Bug Fixes -* add getter for shape dir name ([#614](https://github.com/forcedotcom/sfdx-core/issues/614)) ([06282d8](https://github.com/forcedotcom/sfdx-core/commit/06282d868b508b2d8417fcd4de404a7863c74b14)) +- redirect to oauth success url ([#811](https://github.com/forcedotcom/sfdx-core/issues/811)) ([e505351](https://github.com/forcedotcom/sfdx-core/commit/e505351e2d91cc8481b2e3908914d2406ea5a217)) +## [3.34.8](https://github.com/forcedotcom/sfdx-core/compare/3.35.0-qa.1...3.34.8) (2023-04-21) +### Bug Fixes -## [3.23.1](https://github.com/forcedotcom/sfdx-core/compare/v3.23.0...v3.23.1) (2022-06-30) +- prevent logging loop ([55bcbc3](https://github.com/forcedotcom/sfdx-core/commit/55bcbc357e9ac04b6d064e3d42a07e2975213d96)) +# [3.35.0-qa.3](https://github.com/forcedotcom/sfdx-core/compare/3.35.0-qa.2...3.35.0-qa.3) (2023-04-24) ### Bug Fixes -* isScratch should be boolean ([ebda782](https://github.com/forcedotcom/sfdx-core/commit/ebda782bfd4f3927bc12ce4e6402673361ac47d6)) -* update AuthFields type ([766efec](https://github.com/forcedotcom/sfdx-core/commit/766efec26f404cc1f0e4d380d82f4f05aa455e95)) - +- load config for deprecated stuff, too ([ef1c71b](https://github.com/forcedotcom/sfdx-core/commit/ef1c71b2f9989f7afeb99e662f5b441ef077515f)) +# [3.35.0-qa.2](https://github.com/forcedotcom/sfdx-core/compare/3.34.8...3.35.0-qa.2) (2023-04-24) -# [3.23.0](https://github.com/forcedotcom/sfdx-core/compare/v3.22.1...v3.23.0) (2022-06-30) +### Features +- sf rest_deploy via env ([46ae051](https://github.com/forcedotcom/sfdx-core/commit/46ae051bd36a52be0244b55274dc4aa438286286)) -### Features +# [3.35.0-qa.1](https://github.com/forcedotcom/sfdx-core/compare/3.34.7...3.35.0-qa.1) (2023-04-21) -* support more enhanced domains, wider test cases ([f1bac94](https://github.com/forcedotcom/sfdx-core/commit/f1bac945d9b135a9a8165260b95f7de5568ccca6)) +### Bug Fixes +- bad error message for in progress scratch orgs ([b18d112](https://github.com/forcedotcom/sfdx-core/commit/b18d1121b56c96f7bb9cddfcacc0bae58f977628)) +- prerelease branch for testing ([cdeaa51](https://github.com/forcedotcom/sfdx-core/commit/cdeaa514497456d7cae198e04079eb2d12630d7a)) +### Features -## [3.22.1](https://github.com/forcedotcom/sfdx-core/compare/v3.22.0...v3.22.1) (2022-06-28) +- backward compatible configs/envs with warnings ([51ed461](https://github.com/forcedotcom/sfdx-core/commit/51ed461ba06fd62bbada398dcc86656eb9b34fac)) +- sfdxConfigAggregator = configAggregator ([a98cd97](https://github.com/forcedotcom/sfdx-core/commit/a98cd975e17e4bc75f76c3f6034050816d0f9e1e)) +- warnings from config ([a84993e](https://github.com/forcedotcom/sfdx-core/commit/a84993edeee942175f80c5e96683164579a4fa70)) +## [3.34.8](https://github.com/forcedotcom/sfdx-core/compare/3.35.0-qa.1...3.34.8) (2023-04-21) ### Bug Fixes -* encrypted key regex tests will no longer be stateful ([06b7fa2](https://github.com/forcedotcom/sfdx-core/commit/06b7fa2f41401155b472c84f13cbf5608150a43e)) -* update dev-scripts so yarn build won't change line endings for LICENSE.txt on Windows ([ec5e48e](https://github.com/forcedotcom/sfdx-core/commit/ec5e48ee1dab2b3999f630aa56c53d353baa717e)) +- prevent logging loop ([55bcbc3](https://github.com/forcedotcom/sfdx-core/commit/55bcbc357e9ac04b6d064e3d42a07e2975213d96)) +# [3.35.0-qa.1](https://github.com/forcedotcom/sfdx-core/compare/3.34.7...3.35.0-qa.1) (2023-04-21) +### Bug Fixes -# [3.22.0](https://github.com/forcedotcom/sfdx-core/compare/v3.21.6...v3.22.0) (2022-06-23) - +- bad error message for in progress scratch orgs ([b18d112](https://github.com/forcedotcom/sfdx-core/commit/b18d1121b56c96f7bb9cddfcacc0bae58f977628)) +- prerelease branch for testing ([cdeaa51](https://github.com/forcedotcom/sfdx-core/commit/cdeaa514497456d7cae198e04079eb2d12630d7a)) ### Features -* modify uniqid to accept length and template ([#604](https://github.com/forcedotcom/sfdx-core/issues/604)) ([1fd1b5c](https://github.com/forcedotcom/sfdx-core/commit/1fd1b5c40ab7f9b4d66eada94f3ecfa149b263b7)) +- backward compatible configs/envs with warnings ([51ed461](https://github.com/forcedotcom/sfdx-core/commit/51ed461ba06fd62bbada398dcc86656eb9b34fac)) +- sfdxConfigAggregator = configAggregator ([a98cd97](https://github.com/forcedotcom/sfdx-core/commit/a98cd975e17e4bc75f76c3f6034050816d0f9e1e)) +- warnings from config ([a84993e](https://github.com/forcedotcom/sfdx-core/commit/a84993edeee942175f80c5e96683164579a4fa70)) +## [3.34.7](https://github.com/forcedotcom/sfdx-core/compare/3.34.6...3.34.7) (2023-04-16) +### Bug Fixes -## [3.21.6](https://github.com/forcedotcom/sfdx-core/compare/v3.21.5...v3.21.6) (2022-06-23) +- **deps:** bump jsforce from 2.0.0-beta.20 to 2.0.0-beta.21 ([4a5ee12](https://github.com/forcedotcom/sfdx-core/commit/4a5ee126aaf10bd6d35f0f6b9bd76bed0e74e5f6)) +## [3.34.6](https://github.com/forcedotcom/sfdx-core/compare/3.34.5...3.34.6) (2023-03-26) +### Bug Fixes -## [3.21.5](https://github.com/forcedotcom/sfdx-core/compare/v3.21.4...v3.21.5) (2022-06-23) +- **deps:** bump @salesforce/schemas from 1.5.0 to 1.5.1 ([d447260](https://github.com/forcedotcom/sfdx-core/commit/d447260323d6b4e8cc556b4f0c9ef084c11b579f)) +## [3.34.5](https://github.com/forcedotcom/sfdx-core/compare/3.34.4...3.34.5) (2023-03-26) ### Bug Fixes -* bump jsforce ([b1e8604](https://github.com/forcedotcom/sfdx-core/commit/b1e8604203b09df7b252fd6520fb73405e287aa4)) +- **deps:** bump json5 from 1.0.1 to 1.0.2 ([0dbbcf6](https://github.com/forcedotcom/sfdx-core/commit/0dbbcf61576512d527799240a50b311f723ab200)) +## [3.34.4](https://github.com/forcedotcom/sfdx-core/compare/3.34.3...3.34.4) (2023-03-22) +### Bug Fixes -## [3.21.4](https://github.com/forcedotcom/sfdx-core/compare/v3.21.3...v3.21.4) (2022-06-22) +- check resumable state before emitting first progress event ([#793](https://github.com/forcedotcom/sfdx-core/issues/793)) ([6677d0f](https://github.com/forcedotcom/sfdx-core/commit/6677d0f02e155e7d245701b7f73ee19dc8aa03be)) +## [3.34.3](https://github.com/forcedotcom/sfdx-core/compare/3.34.2...3.34.3) (2023-03-20) ### Bug Fixes -* cause release for jsforce again ([0700356](https://github.com/forcedotcom/sfdx-core/commit/0700356759506fce59b426e84fefbe85ae2f247e)) +- **deps:** bump graceful-fs from 4.2.10 to 4.2.11 ([8384d3f](https://github.com/forcedotcom/sfdx-core/commit/8384d3fcef55fc0ef609590364311c146f171d46)) +## [3.34.2](https://github.com/forcedotcom/sfdx-core/compare/3.34.1...3.34.2) (2023-03-19) +### Bug Fixes -## [3.21.3](https://github.com/forcedotcom/sfdx-core/compare/v3.21.2...v3.21.3) (2022-06-22) +- **deps:** bump jsforce from 2.0.0-beta.19 to 2.0.0-beta.20 ([9026092](https://github.com/forcedotcom/sfdx-core/commit/90260926103273ae5ffac382db38d6aea9e2bcc3)) +## [3.34.1](https://github.com/forcedotcom/sfdx-core/compare/3.34.0...3.34.1) (2023-03-16) ### Bug Fixes -* jsforce autofech fix 2 ([3865af9](https://github.com/forcedotcom/sfdx-core/commit/3865af9c607a8739ce6b04a166b746d7057f064c)) +- allow completed status to be resume ([484244d](https://github.com/forcedotcom/sfdx-core/commit/484244d2877b6eec610975bd643fea2a368b5f5e)) +# [3.34.0](https://github.com/forcedotcom/sfdx-core/compare/3.33.9...3.34.0) (2023-03-14) +### Features -## [3.21.2](https://github.com/forcedotcom/sfdx-core/compare/v3.21.1...v3.21.2) (2022-06-21) +- deprecate messages.load and docs ([3229f74](https://github.com/forcedotcom/sfdx-core/commit/3229f742f6ee2d99729e55abb8021cf5f3639b9f)) +## [3.33.9](https://github.com/forcedotcom/sfdx-core/compare/3.33.8...3.33.9) (2023-03-14) ### Bug Fixes -* bump jsforce to latest v2 ([8a05add](https://github.com/forcedotcom/sfdx-core/commit/8a05add08c78f2bc3b6e6c30d4f1763e9fda24b0)) - - - -## [3.21.1](https://github.com/forcedotcom/sfdx-core/compare/v3.21.0...v3.21.1) (2022-06-15) +- save expiration date for scratch org ([#775](https://github.com/forcedotcom/sfdx-core/issues/775)) ([a59323b](https://github.com/forcedotcom/sfdx-core/commit/a59323be438e6fc8e021855af8ce6d09700c2e60)) +## [3.33.8](https://github.com/forcedotcom/sfdx-core/compare/3.33.7...3.33.8) (2023-03-14) ### Bug Fixes -* deprecate maxQueryLimit config var ([48105be](https://github.com/forcedotcom/sfdx-core/commit/48105bedf01d69b38a7fa527ad74c78053f7d4ef)) +- **deps:** bump json5 from 1.0.1 to 1.0.2 ([7ccd063](https://github.com/forcedotcom/sfdx-core/commit/7ccd0637048531d4669252a65e7c371b2e8c5f98)) +## [3.33.7](https://github.com/forcedotcom/sfdx-core/compare/3.33.6...3.33.7) (2023-03-13) +### Bug Fixes -# [3.21.0](https://github.com/forcedotcom/sfdx-core/compare/v3.20.3...v3.21.0) (2022-06-15) +- conf file stubs for read and readSync ([a4ceedc](https://github.com/forcedotcom/sfdx-core/commit/a4ceedc086bd293f10a30d2ac78b2f832acc0120)) +## [3.33.6](https://github.com/forcedotcom/sfdx-core/compare/3.33.5...3.33.6) (2023-03-02) -### Features +### Bug Fixes -* add getConnection method to MockTestOrgData ([#600](https://github.com/forcedotcom/sfdx-core/issues/600)) ([a642f28](https://github.com/forcedotcom/sfdx-core/commit/a642f28dc1179552ba5c646c96d2d55f5b6f3f61)) +- check for resumable state for sandbox resume ([157622f](https://github.com/forcedotcom/sfdx-core/commit/157622f10c1d16c531d1576feb44a17eb1b04952)) +## [3.33.5](https://github.com/forcedotcom/sfdx-core/compare/3.33.4...3.33.5) (2023-02-26) +### Bug Fixes -## [3.20.3](https://github.com/forcedotcom/sfdx-core/compare/v3.20.2...v3.20.3) (2022-06-15) +- **deps:** bump @salesforce/schemas from 1.4.0 to 1.5.0 ([f63c2f8](https://github.com/forcedotcom/sfdx-core/commit/f63c2f8135c27f794c5fce65be3dd5ea9e14f57f)) +## [3.33.4](https://github.com/forcedotcom/sfdx-core/compare/3.33.3...3.33.4) (2023-02-22) ### Bug Fixes -* **url:** support sandboxes with enhanced domains enabled ([7c958d1](https://github.com/forcedotcom/sfdx-core/commit/7c958d1f59efc6ef55a7b4c60126603616b21794)) +- **deps:** bump @types/graceful-fs from 4.1.5 to 4.1.6 ([d7500b9](https://github.com/forcedotcom/sfdx-core/commit/d7500b96caf2b13f8b0824c29721e639b0274165)) +## [3.33.3](https://github.com/forcedotcom/sfdx-core/compare/3.33.2...3.33.3) (2023-02-22) +### Bug Fixes -## [3.20.2](https://github.com/forcedotcom/sfdx-core/compare/v3.20.1...v3.20.2) (2022-06-13) +- correct timeout for deploy during scratch org creation ([364985d](https://github.com/forcedotcom/sfdx-core/commit/364985d849d29dc07f4c27c5e3e67e2f3b344ff6)) +## [3.33.2](https://github.com/forcedotcom/sfdx-core/compare/3.33.1...3.33.2) (2023-02-21) ### Bug Fixes -* instanceUrl config now using org-instance-url ([54cb450](https://github.com/forcedotcom/sfdx-core/commit/54cb450c53f3db5352d9f0fdb83d33dce1da728e)) +- improve error contents for device login ([#774](https://github.com/forcedotcom/sfdx-core/issues/774)) ([3ad803a](https://github.com/forcedotcom/sfdx-core/commit/3ad803ad4d4b0ff473c04a8dd727c65546bfa86e)) +## [3.33.1](https://github.com/forcedotcom/sfdx-core/compare/3.33.0...3.33.1) (2023-01-23) +### Bug Fixes -## [3.20.1](https://github.com/forcedotcom/sfdx-core/compare/v3.19.5...v3.20.1) (2022-06-08) +- remove source tracking files with Org.delete() ([a85c5bf](https://github.com/forcedotcom/sfdx-core/commit/a85c5bf4dc2312e6be689f70e3b2e74f61cfbfc4)) +# [3.33.0](https://github.com/forcedotcom/sfdx-core/compare/3.32.14...3.33.0) (2023-01-19) ### Features -* cause a publish from previous skip ([069c366](https://github.com/forcedotcom/sfdx-core/commit/069c36646f5dc10a4172868ef7b5f9cd82ef7503)) -* safer caching for nuts ([fa0af41](https://github.com/forcedotcom/sfdx-core/commit/fa0af41451a4363c84e9713685c8ece439acf3bc)) +- backward compatible messages.createError ([ac564b9](https://github.com/forcedotcom/sfdx-core/commit/ac564b927bd0c85c874cda39641afb9d9206e268)) +## [3.32.14](https://github.com/forcedotcom/sfdx-core/compare/3.32.13...3.32.14) (2023-01-18) +### Bug Fixes -## [3.19.5](https://github.com/forcedotcom/sfdx-core/compare/v3.19.4...v3.19.5) (2022-06-06) +- snapshot is optional ([e81684c](https://github.com/forcedotcom/sfdx-core/commit/e81684cbe78c22e63b5c191264d26cef70c6c2f8)) +## [3.32.13](https://github.com/forcedotcom/sfdx-core/compare/3.32.12...3.32.13) (2023-01-12) ### Bug Fixes -* update `NamedOrgNotFound` err name ([6a6a627](https://github.com/forcedotcom/sfdx-core/commit/6a6a62782046858c062ecb24a1d28631ea1f3bbe)) +- **deps:** bump @salesforce/ts-types from 1.7.1 to 1.7.2 ([cadc91f](https://github.com/forcedotcom/sfdx-core/commit/cadc91fd5d0ced7cf15fed9ddeda1eea63f20f5b)) +## [3.32.12](https://github.com/forcedotcom/sfdx-core/compare/3.32.11...3.32.12) (2022-12-23) +### Bug Fixes -## [3.19.4](https://github.com/forcedotcom/sfdx-core/compare/v3.19.3...v3.19.4) (2022-06-06) +- **deps:** bump jsonwebtoken from 8.5.1 to 9.0.0 ([c40ea0a](https://github.com/forcedotcom/sfdx-core/commit/c40ea0aa3025045488c542bd35684ae7f296b5f5)) +## [3.32.11](https://github.com/forcedotcom/sfdx-core/compare/3.32.10...3.32.11) (2022-12-16) ### Bug Fixes -* add stat method to OrgAccessor ([f4e297c](https://github.com/forcedotcom/sfdx-core/commit/f4e297c576647b32be62621377d6e3fc5c8dc5f1)) +- add password to mock org getConfig ([#729](https://github.com/forcedotcom/sfdx-core/issues/729)) ([00ee0fc](https://github.com/forcedotcom/sfdx-core/commit/00ee0fc940592cc04bc5b3ad6e609a3d5e6c2582)) +## [3.32.10](https://github.com/forcedotcom/sfdx-core/compare/3.32.9...3.32.10) (2022-12-15) +### Bug Fixes -## [3.19.3](https://github.com/forcedotcom/sfdx-core/compare/v3.19.2...v3.19.3) (2022-06-06) +- provide way to stub user data ([#728](https://github.com/forcedotcom/sfdx-core/issues/728)) ([98b2503](https://github.com/forcedotcom/sfdx-core/commit/98b25035043676a745692181e4cf0f1c889ea9d0)) +## [3.32.9](https://github.com/forcedotcom/sfdx-core/compare/3.32.8...3.32.9) (2022-12-08) +### Bug Fixes -## [3.19.2](https://github.com/forcedotcom/sfdx-core/compare/v3.19.1...v3.19.2) (2022-06-02) +- add password property to ([1995c01](https://github.com/forcedotcom/sfdx-core/commit/1995c010d13967a49cd4e460cf7acf27eb4327f7)) +## [3.32.8](https://github.com/forcedotcom/sfdx-core/compare/3.32.7...3.32.8) (2022-12-04) ### Bug Fixes -* loosen audience url determination ([#588](https://github.com/forcedotcom/sfdx-core/issues/588)) ([a58ab89](https://github.com/forcedotcom/sfdx-core/commit/a58ab89e2ada34fbdb6d8c72d88966a5281db60b)) +- **deps:** bump ajv from 8.11.0 to 8.11.2 ([78eb48d](https://github.com/forcedotcom/sfdx-core/commit/78eb48d394a63fb21655d8c84de64e2ea8efa987)) +## [3.32.7](https://github.com/forcedotcom/sfdx-core/compare/3.32.6...3.32.7) (2022-12-04) +### Bug Fixes -## [3.19.1](https://github.com/forcedotcom/sfdx-core/compare/v3.19.0...v3.19.1) (2022-05-27) +- **deps:** bump decode-uri-component from 0.2.0 to 0.2.2 ([bb4c0d1](https://github.com/forcedotcom/sfdx-core/commit/bb4c0d1b6d0ca3dcc07532a728ef1a27b019d256)) +## [3.32.6](https://github.com/forcedotcom/sfdx-core/compare/3.32.5...3.32.6) (2022-12-01) ### Bug Fixes -* env var resolution in ConfigAggregator ([#590](https://github.com/forcedotcom/sfdx-core/issues/590)) ([a65cfbd](https://github.com/forcedotcom/sfdx-core/commit/a65cfbdd0e2a6c3806aa4da3270b237f68b37133)) +- remove refs to legacy client id ([82689ea](https://github.com/forcedotcom/sfdx-core/commit/82689ea5257b95a94d91326200293c6eb464287f)) +## [3.32.5](https://github.com/forcedotcom/sfdx-core/compare/3.32.4...3.32.5) (2022-11-30) +### Bug Fixes -# [3.19.0](https://github.com/forcedotcom/sfdx-core/compare/v3.18.3...v3.19.0) (2022-05-20) +- update a few tests ([6952b44](https://github.com/forcedotcom/sfdx-core/commit/6952b4429bf7adf4ed4c5c0c9681ab04986f7720)) +- use API version cache more often ([36b0e81](https://github.com/forcedotcom/sfdx-core/commit/36b0e81abecd75ef8d69543470a0b1ad36f14a03)) +## [3.32.4](https://github.com/forcedotcom/sfdx-core/compare/3.32.3...3.32.4) (2022-11-27) -### Features +### Bug Fixes -* missing prop and logic correction ([debe97e](https://github.com/forcedotcom/sfdx-core/commit/debe97e08f54bbd55edd2cb5b18e9d14abd3652f)) -* property on org with inteligent defaults and handling of undefined ([e7295d3](https://github.com/forcedotcom/sfdx-core/commit/e7295d38f2b8defdb54a77e61b4ef8862e5398f9)) -* tracking property on AuthFields ([2243d34](https://github.com/forcedotcom/sfdx-core/commit/2243d345c5cc81bd637c889adbe1db6eae6c93fc)) -* tracksSource in TestSetup mock ([7544c60](https://github.com/forcedotcom/sfdx-core/commit/7544c604bd4a32d21d105e8472f41b2d37fbf601)) +- **deps:** bump @types/semver from 7.3.10 to 7.3.13 ([0584bf6](https://github.com/forcedotcom/sfdx-core/commit/0584bf642f1d01508594d16fd5391d7419f243f4)) +## [3.32.3](https://github.com/forcedotcom/sfdx-core/compare/3.32.2...3.32.3) (2022-11-27) +### Bug Fixes -## [3.18.3](https://github.com/forcedotcom/sfdx-core/compare/v3.18.2...v3.18.3) (2022-05-20) +- **deps:** bump @salesforce/schemas from 1.1.3 to 1.4.0 ([9b0f2a9](https://github.com/forcedotcom/sfdx-core/commit/9b0f2a977868b40bc6c113ee2bff178c3ac3ceec)) +## [3.32.2](https://github.com/forcedotcom/sfdx-core/compare/3.32.1...3.32.2) (2022-11-22) +### Bug Fixes -## [3.18.2](https://github.com/forcedotcom/sfdx-core/compare/v3.18.1...v3.18.2) (2022-05-17) +- pass value to message correctly ([c21f088](https://github.com/forcedotcom/sfdx-core/commit/c21f0881a13f8d16ef5a02c5bdec1e9612d8acc8)) +## [3.32.1](https://github.com/forcedotcom/sfdx-core/compare/3.32.0...3.32.1) (2022-11-17) ### Bug Fixes -* remove unreachable code ([#585](https://github.com/forcedotcom/sfdx-core/issues/585)) ([2a6d611](https://github.com/forcedotcom/sfdx-core/commit/2a6d611a9ded7d4a0718864ca4023a0f7f259e8a)) +- **deps:** bump @salesforce/kit from 1.7.0 to 1.8.0 ([8e065a7](https://github.com/forcedotcom/sfdx-core/commit/8e065a76bbfb6182d2851ed51b18630bdcc097dc)) +# [3.32.0](https://github.com/forcedotcom/sfdx-core/compare/3.31.19...3.32.0) (2022-11-17) +### Features -## [3.18.1](https://github.com/forcedotcom/sfdx-core/compare/v3.18.0...v3.18.1) (2022-05-16) +- getConnection accepts an optional version ([c4299f8](https://github.com/forcedotcom/sfdx-core/commit/c4299f88acf2c45979c13ca8d093919308619c99)) +- log when unnecessarily setting api version ([9e4afd2](https://github.com/forcedotcom/sfdx-core/commit/9e4afd2c573219eea43e2e43d5f3ca5822d936b3)) +## [3.31.19](https://github.com/forcedotcom/sfdx-core/compare/3.31.18...3.31.19) (2022-11-12) +### Bug Fixes -# [3.18.0](https://github.com/forcedotcom/sfdx-core/compare/v3.17.0...v3.18.0) (2022-05-12) +- ajv allows union type schema, sfProject doesn't validate ([#698](https://github.com/forcedotcom/sfdx-core/issues/698)) ([ca726ae](https://github.com/forcedotcom/sfdx-core/commit/ca726ae1cb6313f7eaf179517552f15b769a5b74)) +## [3.31.18](https://github.com/forcedotcom/sfdx-core/compare/3.31.17...3.31.18) (2022-11-07) -### Features +### Bug Fixes -* bump jsforce for metadata rest api ([#583](https://github.com/forcedotcom/sfdx-core/issues/583)) ([6addcfd](https://github.com/forcedotcom/sfdx-core/commit/6addcfd9b2bd480974f6c965b4d04c610a38f2db)) +- deduplicate headers case on Connect.request ([#697](https://github.com/forcedotcom/sfdx-core/issues/697)) ([fc592b2](https://github.com/forcedotcom/sfdx-core/commit/fc592b215bcc9184f3ca8003d382b6053447349b)) +## [3.31.17](https://github.com/forcedotcom/sfdx-core/compare/3.31.16...3.31.17) (2022-10-24) +### Bug Fixes -# [3.17.0](https://github.com/forcedotcom/sfdx-core/compare/v3.16.2...v3.17.0) (2022-05-12) +- improve `hubOrgIsNotDevHub` error msg ([#689](https://github.com/forcedotcom/sfdx-core/issues/689)) ([d3787fa](https://github.com/forcedotcom/sfdx-core/commit/d3787faf8c8aea75624b8a1b140384e1e567f1bc)) +## [3.31.16](https://github.com/forcedotcom/sfdx-core/compare/3.31.15...3.31.16) (2022-10-19) -### Features +## [3.31.15](https://github.com/forcedotcom/sfdx-core/compare/3.31.13-0...3.31.15) (2022-10-19) -* sandboxStatus for v3 ([#571](https://github.com/forcedotcom/sfdx-core/issues/571)) ([60a004b](https://github.com/forcedotcom/sfdx-core/commit/60a004b663d918ec8b37d6ded7ddf12ce112b7f8)) +### Bug Fixes +- remove prerelease portion of version number ([6dffeac](https://github.com/forcedotcom/sfdx-core/commit/6dffeacd0f12c24b32b3e9de13011c8a1cd22c0b)) +## [3.31.13-0](https://github.com/forcedotcom/sfdx-core/compare/3.31.12...3.31.13-0) (2022-10-18) -## [3.16.2](https://github.com/forcedotcom/sfdx-core/compare/v3.16.1...v3.16.2) (2022-05-11) +### Bug Fixes +- reset SFDX_INTEROPERABILITY on contextRestore ([#673](https://github.com/forcedotcom/sfdx-core/issues/673)) ([4c8ecae](https://github.com/forcedotcom/sfdx-core/commit/4c8ecae69f871309b00f69a68228e3833923eee9)) +## [3.31.12](https://github.com/forcedotcom/sfdx-core/compare/3.31.11...3.31.12) (2022-10-18) -## [3.16.1](https://github.com/forcedotcom/sfdx-core/compare/v3.16.0...v3.16.1) (2022-05-11) +### Bug Fixes +- incorrect url for scratch org error codes documentation ([#681](https://github.com/forcedotcom/sfdx-core/issues/681)) ([ab91644](https://github.com/forcedotcom/sfdx-core/commit/ab91644820e031a28f6fb262e0f7826e8419e5d7)) + +## [3.31.11](https://github.com/forcedotcom/sfdx-core/compare/3.31.10...3.31.11) (2022-10-18) ### Bug Fixes -* homedir can change after Core loads ([bb1e4f5](https://github.com/forcedotcom/sfdx-core/commit/bb1e4f5b1f59269f6d48a5389b1d76eeee252db0)) +- function addLogFileStreamSync to use recursive mkdir ([#683](https://github.com/forcedotcom/sfdx-core/issues/683)) ([c85c69c](https://github.com/forcedotcom/sfdx-core/commit/c85c69c4179b2b06e4b2e6cbe5727d2a98918304)) +## [3.31.10](https://github.com/forcedotcom/sfdx-core/compare/3.31.9...3.31.10) (2022-10-14) +### Bug Fixes -# [3.16.0](https://github.com/forcedotcom/sfdx-core/compare/v3.15.5...v3.16.0) (2022-05-04) +- getPackageFromPath now handles nested package paths ([#678](https://github.com/forcedotcom/sfdx-core/issues/678)) ([d8c43c6](https://github.com/forcedotcom/sfdx-core/commit/d8c43c66ec4ea58e0398009083740fab0bac1439)) +## [3.31.9](https://github.com/forcedotcom/sfdx-core/compare/3.31.8...3.31.9) (2022-10-13) ### Bug Fixes -* disable schemaValidation ([#578](https://github.com/forcedotcom/sfdx-core/issues/578)) ([9b60cb4](https://github.com/forcedotcom/sfdx-core/commit/9b60cb4dd3181f0bfbafadb72bcd0904e851084f)) +- ensure the hubOrg passes is actually a DevHub, throw error if not ([#669](https://github.com/forcedotcom/sfdx-core/issues/669)) ([753292f](https://github.com/forcedotcom/sfdx-core/commit/753292fcf51d57a39aab36190a2053152caaacd8)) +## [3.31.8](https://github.com/forcedotcom/sfdx-core/compare/3.30.14...3.31.8) (2022-10-13) -### Features +### Bug Fixes -* force v3 release ([05620c8](https://github.com/forcedotcom/sfdx-core/commit/05620c80256052a1b814b631e9afd951d63bea9e)) +- force release ([da5ffa0](https://github.com/forcedotcom/sfdx-core/commit/da5ffa0e51855746decf1b63d6195d793929b846)) +### Features +- deprecate testSetup and refactor TestContext ([#676](https://github.com/forcedotcom/sfdx-core/issues/676)) ([6e2f547](https://github.com/forcedotcom/sfdx-core/commit/6e2f547229199da2e2839e4ea70dabd13089c487)) -## [3.15.5](https://github.com/forcedotcom/sfdx-core/compare/v3.15.4...v3.15.5) (2022-05-03) - +## [3.30.14](https://github.com/forcedotcom/sfdx-core/compare/3.30.13...3.30.14) (2022-10-11) ### Bug Fixes -* SfdxConfigAggregator ([238ad07](https://github.com/forcedotcom/sfdx-core/commit/238ad0757cc332ecc1897bd7230140a31a559332)) +- type on TokenAccessor.set ([#675](https://github.com/forcedotcom/sfdx-core/issues/675)) ([94fdf1e](https://github.com/forcedotcom/sfdx-core/commit/94fdf1ed9ded8f8fbe1a66d55affbd0ac27e79bb)) +## [3.30.13](https://github.com/forcedotcom/sfdx-core/compare/3.30.12...3.30.13) (2022-10-10) +### Bug Fixes -## [3.15.4](https://github.com/forcedotcom/sfdx-core/compare/v3.15.3...v3.15.4) (2022-05-03) +- add tooling query support to autoFetchQuery ([#665](https://github.com/forcedotcom/sfdx-core/issues/665)) ([608b119](https://github.com/forcedotcom/sfdx-core/commit/608b11971d893f7417fcfe5f4eea710f38b8e7cf)) +## [3.30.12](https://github.com/forcedotcom/sfdx-core/compare/3.30.11...3.30.12) (2022-10-08) ### Bug Fixes -* SfdxConfigAggregator ([#576](https://github.com/forcedotcom/sfdx-core/issues/576)) ([9a25928](https://github.com/forcedotcom/sfdx-core/commit/9a259282efd3d2d97da42a54fd76c45d7f73df27)) +- **deps:** bump ts-retry-promise from 0.6.2 to 0.7.0 ([5def87a](https://github.com/forcedotcom/sfdx-core/commit/5def87ae3be6eac81503abfaff96e29ba2c82bdf)) +## [3.30.11](https://github.com/forcedotcom/sfdx-core/compare/3.30.10...3.30.11) (2022-10-07) +### Bug Fixes -## [3.15.3](https://github.com/forcedotcom/sfdx-core/compare/v3.15.2...v3.15.3) (2022-05-02) +- update kit, testSetup plus major refactor ([453b886](https://github.com/forcedotcom/sfdx-core/commit/453b8860c16991796252f05a3c933dee1e9d7e3b)) +## [3.30.10](https://github.com/forcedotcom/sfdx-core/compare/3.30.9...3.30.10) (2022-10-04) + +## [3.30.9](https://github.com/forcedotcom/sfdx-core/compare/3.30.8...3.30.9) (2022-09-28) ### Bug Fixes -* SfdxConfigAggregator ([6ee1437](https://github.com/forcedotcom/sfdx-core/commit/6ee14378f10df123ac38325853bc3b83d4d953bd)) +- fix package dir functions ([#660](https://github.com/forcedotcom/sfdx-core/issues/660)) ([7df117c](https://github.com/forcedotcom/sfdx-core/commit/7df117c6b5aecf500af82adb52efe5e931fb8718)) +## [3.30.8](https://github.com/forcedotcom/sfdx-core/compare/3.30.7...3.30.8) (2022-09-23) +### Bug Fixes -## [3.15.2](https://github.com/forcedotcom/sfdx-core/compare/v3.15.1...v3.15.2) (2022-05-02) +- **scratch:** respect `apiVersion` config value ([#656](https://github.com/forcedotcom/sfdx-core/issues/656)) ([1a29482](https://github.com/forcedotcom/sfdx-core/commit/1a294821c07f334494f2e56295dcd1a23570fa4b)) +## [3.30.7](https://github.com/forcedotcom/sfdx-core/compare/3.30.4...3.30.7) (2022-09-23) ### Bug Fixes -* allow ConfigAggregator to accept custom config vars ([#575](https://github.com/forcedotcom/sfdx-core/issues/575)) ([2642128](https://github.com/forcedotcom/sfdx-core/commit/264212898cf14d8f34638926841ace89abf7efb0)) +- force build ([cb0b831](https://github.com/forcedotcom/sfdx-core/commit/cb0b8310ca2b2fc9e537229c0034deb1063c3a34)) +- revert 3.30.4 ([#658](https://github.com/forcedotcom/sfdx-core/issues/658)) ([3ed9565](https://github.com/forcedotcom/sfdx-core/commit/3ed95653fd03f80483d0bbd137697cb7df87ddd8)), closes [#657](https://github.com/forcedotcom/sfdx-core/issues/657) [#655](https://github.com/forcedotcom/sfdx-core/issues/655) +## [3.30.4](https://github.com/forcedotcom/sfdx-core/compare/3.30.3...3.30.4) (2022-09-23) +### Bug Fixes -## [3.15.1](https://github.com/forcedotcom/sfdx-core/compare/v3.15.0...v3.15.1) (2022-04-28) +- retire use of pkgdir.name field ([#655](https://github.com/forcedotcom/sfdx-core/issues/655)) ([227f9a8](https://github.com/forcedotcom/sfdx-core/commit/227f9a8663401813b3e8626344fa59464510a732)) +## [3.30.3](https://github.com/forcedotcom/sfdx-core/compare/v3.30.2...3.30.3) (2022-09-20) ### Bug Fixes -* replace jsen ([664da58](https://github.com/forcedotcom/sfdx-core/commit/664da58cbe06019465ccf70ed17dfafb2425e06b)) +- add helper functions to project for pkging ([1ed5563](https://github.com/forcedotcom/sfdx-core/commit/1ed556348cd0cc2f8c9dae7125a12bf177206c5c)) +## [3.30.2](https://github.com/forcedotcom/sfdx-core/compare/v3.30.1...v3.30.2) (2022-09-16) +### Bug Fixes -# [3.15.0](https://github.com/forcedotcom/sfdx-core/compare/v3.14.0...v3.15.0) (2022-04-26) +- **logger:** support `SF_*` env vars ([#637](https://github.com/forcedotcom/sfdx-core/issues/637)) ([53c4296](https://github.com/forcedotcom/sfdx-core/commit/53c4296d0ab0728a798e39626a29168371e1a062)) +## [3.30.1](https://github.com/forcedotcom/sfdx-core/compare/v3.30.0...v3.30.1) (2022-09-15) -### Features +### Bug Fixes -* core changes to support create scratch and sandboxes ([#570](https://github.com/forcedotcom/sfdx-core/issues/570)) ([916eeb1](https://github.com/forcedotcom/sfdx-core/commit/916eeb1f96bebd5dce255f13c838ac0b10bf5b96)) +- await postOrgCreate hook ([#636](https://github.com/forcedotcom/sfdx-core/issues/636)) ([b9934d2](https://github.com/forcedotcom/sfdx-core/commit/b9934d2df6f5ea49b4f8bae44779aa5cab0e897f)) +# [3.30.0](https://github.com/forcedotcom/sfdx-core/compare/v3.26.3...v3.30.0) (2022-09-12) +## [3.26.3](https://github.com/forcedotcom/sfdx-core/compare/v3.26.2...v3.26.3) (2022-09-06) -# [3.14.0](https://github.com/forcedotcom/sfdx-core/compare/v3.13.1...v3.14.0) (2022-04-25) +## [3.26.2](https://github.com/forcedotcom/sfdx-core/compare/v3.26.1...v3.26.2) (2022-08-16) +## [3.26.1](https://github.com/forcedotcom/sfdx-core/compare/v3.26.0...v3.26.1) (2022-08-08) -### Features +### Bug Fixes -* add SfdxConfigAggregator ([#563](https://github.com/forcedotcom/sfdx-core/issues/563)) ([cd4debd](https://github.com/forcedotcom/sfdx-core/commit/cd4debdc99046580090b5d21bbd9da9030822d4a)) +- update jsforce ([0353330](https://github.com/forcedotcom/sfdx-core/commit/03533307f0ea1f8877027a5619c970e1ae2443ec)) +# [3.26.0](https://github.com/forcedotcom/sfdx-core/compare/v3.25.1...v3.26.0) (2022-08-04) +### Features -## [3.13.1](https://github.com/forcedotcom/sfdx-core/compare/v3.13.0...v3.13.1) (2022-04-21) +- remove GlobalInfo ([57bd0fa](https://github.com/forcedotcom/sfdx-core/commit/57bd0fa50c5fe3cc859ca107fd0a18dc1b871c1f)) +## [3.25.1](https://github.com/forcedotcom/sfdx-core/compare/v3.25.0...v3.25.1) (2022-08-03) ### Bug Fixes -* log rotation errors ([#564](https://github.com/forcedotcom/sfdx-core/issues/564)) ([8a4c9de](https://github.com/forcedotcom/sfdx-core/commit/8a4c9de85840ae0efa0ee8a27494d63a61545da5)) +- add interop between templates config/env var ([eea3d05](https://github.com/forcedotcom/sfdx-core/commit/eea3d055b75ceb61639e06bc53e309a01f70a8e2)) +# [3.25.0](https://github.com/forcedotcom/sfdx-core/compare/v3.24.5...v3.25.0) (2022-07-29) +### Features -# [3.13.0](https://github.com/forcedotcom/sfdx-core/compare/v3.12.2...v3.13.0) (2022-04-20) +- orgAccessor.get has throwOnNotFound option ([a2ee821](https://github.com/forcedotcom/sfdx-core/commit/a2ee8219adf692de7de17ba254e05f501ef5814c)) +## [3.24.5](https://github.com/forcedotcom/sfdx-core/compare/v3.24.4...v3.24.5) (2022-07-28) -### Features +### Bug Fixes -* detect if org is a devhub at auth time ([#560](https://github.com/forcedotcom/sfdx-core/issues/560)) ([958e2e7](https://github.com/forcedotcom/sfdx-core/commit/958e2e7317e670b738b3e7c82260ef741e1416d2)) +- set correct file mode for log file ([30aa3fc](https://github.com/forcedotcom/sfdx-core/commit/30aa3fc09ba2bf0db600ee6528fde5b0ff97b217)) +## [3.24.4](https://github.com/forcedotcom/sfdx-core/compare/v3.24.3...v3.24.4) (2022-07-28) +## [3.24.3](https://github.com/forcedotcom/sfdx-core/compare/v3.24.2...v3.24.3) (2022-07-28) -## [3.12.2](https://github.com/forcedotcom/sfdx-core/compare/v3.12.1...v3.12.2) (2022-04-14) +### Bug Fixes +- handle ancestor keywords when creating scratch org ([72af55a](https://github.com/forcedotcom/sfdx-core/commit/72af55a53b87f1d81d22dc4e53891b3b0ab2966f)) + +## [3.24.2](https://github.com/forcedotcom/sfdx-core/compare/v3.24.1...v3.24.2) (2022-07-26) ### Bug Fixes -* sandbox cname recognition ([#556](https://github.com/forcedotcom/sfdx-core/issues/556)) ([2f85709](https://github.com/forcedotcom/sfdx-core/commit/2f8570912cae38fb0ddeaa37836395444c47611a)) +- use correct field for clone requests ([#623](https://github.com/forcedotcom/sfdx-core/issues/623)) ([2372f03](https://github.com/forcedotcom/sfdx-core/commit/2372f0364b87a7ac498c8d7ef637a9b5fdc725ea)) +## [3.24.1](https://github.com/forcedotcom/sfdx-core/compare/v3.24.0...v3.24.1) (2022-07-21) +### Bug Fixes -## [3.12.1](https://github.com/forcedotcom/sfdx-core/compare/v3.12.0...v3.12.1) (2022-04-05) +- bump jsforce ([#622](https://github.com/forcedotcom/sfdx-core/issues/622)) ([c7b53b7](https://github.com/forcedotcom/sfdx-core/commit/c7b53b73977012f81e029a15f39c3fb35bc1041d)) +# [3.24.0](https://github.com/forcedotcom/sfdx-core/compare/v3.23.9...v3.24.0) (2022-07-14) ### Bug Fixes -* more FormData with buffers and headers ([5ebf78f](https://github.com/forcedotcom/sfdx-core/commit/5ebf78fe2b037df395c87197b90ee06a0d34d5d0)) +- align messages/files ([5a5f04d](https://github.com/forcedotcom/sfdx-core/commit/5a5f04d3ea8ffb30fdbbfe2c83824ec56a56ec34)) +- load messages by name ([7c3a2d9](https://github.com/forcedotcom/sfdx-core/commit/7c3a2d9d84f9553bb9cf1bc369b49ca46100484e)) +- use named messages always ([2bb25a9](https://github.com/forcedotcom/sfdx-core/commit/2bb25a9c24fcb7146e363783ea81bc3708060a18)) +### Features +- org.scratchOrgCreate uses all options except hub ([045a7aa](https://github.com/forcedotcom/sfdx-core/commit/045a7aa56c97323aa8b3191c4879cd1b43f0cfb1)) -# [3.12.0](https://github.com/forcedotcom/sfdx-core/compare/v3.11.1...v3.12.0) (2022-04-04) +## [3.23.9](https://github.com/forcedotcom/sfdx-core/compare/v3.23.8...v3.23.9) (2022-07-14) +## [3.23.8](https://github.com/forcedotcom/sfdx-core/compare/v3.23.7...v3.23.8) (2022-07-13) -### Features +### Bug Fixes -* move common authinfo utils to core ([01b8cf3](https://github.com/forcedotcom/sfdx-core/commit/01b8cf3fa38162380da5ce15f6dee1d2a5d2d72d)) +- remove greedy matching for AuthInfo encryptedKeys ([12c6dcc](https://github.com/forcedotcom/sfdx-core/commit/12c6dcc5137a48d59e0da4a20426d8fa2cf747d9)) +## [3.23.7](https://github.com/forcedotcom/sfdx-core/compare/v3.23.6...v3.23.7) (2022-07-08) +### Bug Fixes -## [3.11.1](https://github.com/forcedotcom/sfdx-core/compare/v3.11.0...v3.11.1) (2022-04-01) +- add structure writer interface and refactor ([daef19c](https://github.com/forcedotcom/sfdx-core/commit/daef19cb3a4d145ebb22c4f721a1bd47ffddce40)) +## [3.23.6](https://github.com/forcedotcom/sfdx-core/compare/v3.23.5...v3.23.6) (2022-07-06) +### Bug Fixes -# [3.11.0](https://github.com/forcedotcom/sfdx-core/compare/v3.10.1...v3.11.0) (2022-03-30) +- workaround for jsforce update bug ([1776f50](https://github.com/forcedotcom/sfdx-core/commit/1776f505671a5a764c4e966736c2981df2b178a4)) +## [3.23.5](https://github.com/forcedotcom/sfdx-core/compare/v3.23.4...v3.23.5) (2022-07-06) -### Features +### Bug Fixes -* normalize config vars for sf ([#543](https://github.com/forcedotcom/sfdx-core/issues/543)) ([93f3cbe](https://github.com/forcedotcom/sfdx-core/commit/93f3cbe90103fa159f21f532ffc173931037651c)) +- add resolveAlias ([#605](https://github.com/forcedotcom/sfdx-core/issues/605)) ([ffa9ed6](https://github.com/forcedotcom/sfdx-core/commit/ffa9ed63ea583baa327071db4030ea5346d1128f)) +## [3.23.4](https://github.com/forcedotcom/sfdx-core/compare/v3.23.3...v3.23.4) (2022-07-05) +### Bug Fixes -## [3.10.1](https://github.com/forcedotcom/sfdx-core/compare/v3.10.0...v3.10.1) (2022-03-24) +- force publish ([3eb660d](https://github.com/forcedotcom/sfdx-core/commit/3eb660dd23ee959e085a9ac3dbd65de92e511d74)) +## [3.23.3](https://github.com/forcedotcom/sfdx-core/compare/v3.23.2...v3.23.3) (2022-06-30) ### Bug Fixes -* rotating file logs ([ef5df25](https://github.com/forcedotcom/sfdx-core/commit/ef5df25c17a67541d12d5c228c18b75775251d98)) +- force publish ([b767232](https://github.com/forcedotcom/sfdx-core/commit/b767232f2f76a4a00387e37128428ad18221a594)) +## [3.23.2](https://github.com/forcedotcom/sfdx-core/compare/v3.23.1...v3.23.2) (2022-06-30) +### Bug Fixes -# [3.10.0](https://github.com/forcedotcom/sfdx-core/compare/v3.9.0...v3.10.0) (2022-03-23) +- add getter for shape dir name ([#614](https://github.com/forcedotcom/sfdx-core/issues/614)) ([06282d8](https://github.com/forcedotcom/sfdx-core/commit/06282d868b508b2d8417fcd4de404a7863c74b14)) +## [3.23.1](https://github.com/forcedotcom/sfdx-core/compare/v3.23.0...v3.23.1) (2022-06-30) ### Bug Fixes -* casing typo for import ([066a2bb](https://github.com/forcedotcom/sfdx-core/commit/066a2bbb37b07f62415f021ef511344976315128)) -* warnings about tracking aren't a throw (org will still auth, default) ([38114a3](https://github.com/forcedotcom/sfdx-core/commit/38114a3526267a615fa8f5d3470b79c9b36a8fa8)) +- isScratch should be boolean ([ebda782](https://github.com/forcedotcom/sfdx-core/commit/ebda782bfd4f3927bc12ce4e6402673361ac47d6)) +- update AuthFields type ([766efec](https://github.com/forcedotcom/sfdx-core/commit/766efec26f404cc1f0e4d380d82f4f05aa455e95)) +# [3.23.0](https://github.com/forcedotcom/sfdx-core/compare/v3.22.1...v3.23.0) (2022-06-30) ### Features -* lifecycle events for scratch org create ([cba673b](https://github.com/forcedotcom/sfdx-core/commit/cba673b515df311165f3c392b155fcf5fbf9e2c6)) -* scratch org lifecycle events ([541349d](https://github.com/forcedotcom/sfdx-core/commit/541349d84b4784356d8bc504d1e331450487b6ec)) +- support more enhanced domains, wider test cases ([f1bac94](https://github.com/forcedotcom/sfdx-core/commit/f1bac945d9b135a9a8165260b95f7de5568ccca6)) +## [3.22.1](https://github.com/forcedotcom/sfdx-core/compare/v3.22.0...v3.22.1) (2022-06-28) +### Bug Fixes -# [3.9.0](https://github.com/forcedotcom/sfdx-core/compare/v3.8.1...v3.9.0) (2022-03-21) +- encrypted key regex tests will no longer be stateful ([06b7fa2](https://github.com/forcedotcom/sfdx-core/commit/06b7fa2f41401155b472c84f13cbf5608150a43e)) +- update dev-scripts so yarn build won't change line endings for LICENSE.txt on Windows ([ec5e48e](https://github.com/forcedotcom/sfdx-core/commit/ec5e48ee1dab2b3999f630aa56c53d353baa717e)) +# [3.22.0](https://github.com/forcedotcom/sfdx-core/compare/v3.21.6...v3.22.0) (2022-06-23) ### Features -* add TTLConfig ([#538](https://github.com/forcedotcom/sfdx-core/issues/538)) ([e623241](https://github.com/forcedotcom/sfdx-core/commit/e623241c7e513778c8f179dde4dc16e603a3778c)) - - +- modify uniqid to accept length and template ([#604](https://github.com/forcedotcom/sfdx-core/issues/604)) ([1fd1b5c](https://github.com/forcedotcom/sfdx-core/commit/1fd1b5c40ab7f9b4d66eada94f3ecfa149b263b7)) -## [3.8.1](https://github.com/forcedotcom/sfdx-core/compare/v3.8.0...v3.8.1) (2022-03-18) +## [3.21.6](https://github.com/forcedotcom/sfdx-core/compare/v3.21.5...v3.21.6) (2022-06-23) +## [3.21.5](https://github.com/forcedotcom/sfdx-core/compare/v3.21.4...v3.21.5) (2022-06-23) ### Bug Fixes -* adjust mock org test data to conform to v3 ([38faf50](https://github.com/forcedotcom/sfdx-core/commit/38faf5063931955066312c24b4188b12c40098a5)) -* side effects function should not save when no changes ([#541](https://github.com/forcedotcom/sfdx-core/issues/541)) ([6bfb841](https://github.com/forcedotcom/sfdx-core/commit/6bfb84172fdf74882102b9ffc6e6fbfe58e6ffbc)) +- bump jsforce ([b1e8604](https://github.com/forcedotcom/sfdx-core/commit/b1e8604203b09df7b252fd6520fb73405e287aa4)) +## [3.21.4](https://github.com/forcedotcom/sfdx-core/compare/v3.21.3...v3.21.4) (2022-06-22) +### Bug Fixes -# [3.8.0](https://github.com/forcedotcom/sfdx-core/compare/v3.7.9...v3.8.0) (2022-03-09) +- cause release for jsforce again ([0700356](https://github.com/forcedotcom/sfdx-core/commit/0700356759506fce59b426e84fefbe85ae2f247e)) +## [3.21.3](https://github.com/forcedotcom/sfdx-core/compare/v3.21.2...v3.21.3) (2022-06-22) -### Features +### Bug Fixes -* add handle side effect function to authinfo ([64c78e7](https://github.com/forcedotcom/sfdx-core/commit/64c78e74bc5e1cfb748fd2d64e4b1e8fc1062bf6)) +- jsforce autofech fix 2 ([3865af9](https://github.com/forcedotcom/sfdx-core/commit/3865af9c607a8739ce6b04a166b746d7057f064c)) +## [3.21.2](https://github.com/forcedotcom/sfdx-core/compare/v3.21.1...v3.21.2) (2022-06-21) +### Bug Fixes -## [3.7.9](https://github.com/forcedotcom/sfdx-core/compare/v3.7.8...v3.7.9) (2022-03-04) +- bump jsforce to latest v2 ([8a05add](https://github.com/forcedotcom/sfdx-core/commit/8a05add08c78f2bc3b6e6c30d4f1763e9fda24b0)) +## [3.21.1](https://github.com/forcedotcom/sfdx-core/compare/v3.21.0...v3.21.1) (2022-06-15) ### Bug Fixes -* error literal to match the error thrown ([#533](https://github.com/forcedotcom/sfdx-core/issues/533)) ([b91ce5c](https://github.com/forcedotcom/sfdx-core/commit/b91ce5c329c9b2b88fb4b0ad028aee5f6d5b6e77)) +- deprecate maxQueryLimit config var ([48105be](https://github.com/forcedotcom/sfdx-core/commit/48105bedf01d69b38a7fa527ad74c78053f7d4ef)) +# [3.21.0](https://github.com/forcedotcom/sfdx-core/compare/v3.20.3...v3.21.0) (2022-06-15) +### Features -## [3.7.8](https://github.com/forcedotcom/sfdx-core/compare/v3.7.7...v3.7.8) (2022-03-03) +- add getConnection method to MockTestOrgData ([#600](https://github.com/forcedotcom/sfdx-core/issues/600)) ([a642f28](https://github.com/forcedotcom/sfdx-core/commit/a642f28dc1179552ba5c646c96d2d55f5b6f3f61)) +## [3.20.3](https://github.com/forcedotcom/sfdx-core/compare/v3.20.2...v3.20.3) (2022-06-15) ### Bug Fixes -* add create warning and info convenience functions ([#526](https://github.com/forcedotcom/sfdx-core/issues/526)) ([e3428b3](https://github.com/forcedotcom/sfdx-core/commit/e3428b35e00b9cee3c90153ed6ce08b352535ff7)) +- **url:** support sandboxes with enhanced domains enabled ([7c958d1](https://github.com/forcedotcom/sfdx-core/commit/7c958d1f59efc6ef55a7b4c60126603616b21794)) +## [3.20.2](https://github.com/forcedotcom/sfdx-core/compare/v3.20.1...v3.20.2) (2022-06-13) +### Bug Fixes -## [3.7.7](https://github.com/forcedotcom/sfdx-core/compare/v3.7.6...v3.7.7) (2022-03-01) +- instanceUrl config now using org-instance-url ([54cb450](https://github.com/forcedotcom/sfdx-core/commit/54cb450c53f3db5352d9f0fdb83d33dce1da728e)) +## [3.20.1](https://github.com/forcedotcom/sfdx-core/compare/v3.19.5...v3.20.1) (2022-06-08) +### Features -## [3.7.6](https://github.com/forcedotcom/sfdx-core/compare/v4.0.0...v3.7.6) (2022-02-28) +- cause a publish from previous skip ([069c366](https://github.com/forcedotcom/sfdx-core/commit/069c36646f5dc10a4172868ef7b5f9cd82ef7503)) +- safer caching for nuts ([fa0af41](https://github.com/forcedotcom/sfdx-core/commit/fa0af41451a4363c84e9713685c8ece439acf3bc)) +## [3.19.5](https://github.com/forcedotcom/sfdx-core/compare/v3.19.4...v3.19.5) (2022-06-06) +### Bug Fixes -# [4.0.0](https://github.com/forcedotcom/sfdx-core/compare/v2.35.2...v4.0.0) (2022-02-28) +- update `NamedOrgNotFound` err name ([6a6a627](https://github.com/forcedotcom/sfdx-core/commit/6a6a62782046858c062ecb24a1d28631ea1f3bbe)) + +## [3.19.4](https://github.com/forcedotcom/sfdx-core/compare/v3.19.3...v3.19.4) (2022-06-06) +### Bug Fixes +- add stat method to OrgAccessor ([f4e297c](https://github.com/forcedotcom/sfdx-core/commit/f4e297c576647b32be62621377d6e3fc5c8dc5f1)) -## [3.7.5](https://github.com/forcedotcom/sfdx-core/compare/v2.35.1...v3.7.5) (2022-02-14) +## [3.19.3](https://github.com/forcedotcom/sfdx-core/compare/v3.19.2...v3.19.3) (2022-06-06) +## [3.19.2](https://github.com/forcedotcom/sfdx-core/compare/v3.19.1...v3.19.2) (2022-06-02) ### Bug Fixes -* add env vars from sfdx-cli init to envvars ([#520](https://github.com/forcedotcom/sfdx-core/issues/520)) ([8ef2785](https://github.com/forcedotcom/sfdx-core/commit/8ef27859d95bfffc5999b14f4792874d04f0504c)) +- loosen audience url determination ([#588](https://github.com/forcedotcom/sfdx-core/issues/588)) ([a58ab89](https://github.com/forcedotcom/sfdx-core/commit/a58ab89e2ada34fbdb6d8c72d88966a5281db60b)) +## [3.19.1](https://github.com/forcedotcom/sfdx-core/compare/v3.19.0...v3.19.1) (2022-05-27) +### Bug Fixes -## [3.7.4](https://github.com/forcedotcom/sfdx-core/compare/v2.35.0...v3.7.4) (2022-02-07) +- env var resolution in ConfigAggregator ([#590](https://github.com/forcedotcom/sfdx-core/issues/590)) ([a65cfbd](https://github.com/forcedotcom/sfdx-core/commit/a65cfbdd0e2a6c3806aa4da3270b237f68b37133)) +# [3.19.0](https://github.com/forcedotcom/sfdx-core/compare/v3.18.3...v3.19.0) (2022-05-20) -### Bug Fixes +### Features -* pin ts to 4.4.4 and bump other deps ([#509](https://github.com/forcedotcom/sfdx-core/issues/509)) ([1c0e15c](https://github.com/forcedotcom/sfdx-core/commit/1c0e15cd9a96f03e24476c13d73b62577a535fa3)) +- missing prop and logic correction ([debe97e](https://github.com/forcedotcom/sfdx-core/commit/debe97e08f54bbd55edd2cb5b18e9d14abd3652f)) +- property on org with inteligent defaults and handling of undefined ([e7295d3](https://github.com/forcedotcom/sfdx-core/commit/e7295d38f2b8defdb54a77e61b4ef8862e5398f9)) +- tracking property on AuthFields ([2243d34](https://github.com/forcedotcom/sfdx-core/commit/2243d345c5cc81bd637c889adbe1db6eae6c93fc)) +- tracksSource in TestSetup mock ([7544c60](https://github.com/forcedotcom/sfdx-core/commit/7544c604bd4a32d21d105e8472f41b2d37fbf601)) +## [3.18.3](https://github.com/forcedotcom/sfdx-core/compare/v3.18.2...v3.18.3) (2022-05-20) +## [3.18.2](https://github.com/forcedotcom/sfdx-core/compare/v3.18.1...v3.18.2) (2022-05-17) -## [3.7.3](https://github.com/forcedotcom/sfdx-core/compare/v2.33.1...v3.7.3) (2021-12-16) +### Bug Fixes +- remove unreachable code ([#585](https://github.com/forcedotcom/sfdx-core/issues/585)) ([2a6d611](https://github.com/forcedotcom/sfdx-core/commit/2a6d611a9ded7d4a0718864ca4023a0f7f259e8a)) +## [3.18.1](https://github.com/forcedotcom/sfdx-core/compare/v3.18.0...v3.18.1) (2022-05-16) -## [3.7.2](https://github.com/forcedotcom/sfdx-core/compare/v3.7.1...v3.7.2) (2021-10-28) +# [3.18.0](https://github.com/forcedotcom/sfdx-core/compare/v3.17.0...v3.18.0) (2022-05-12) +### Features -### Bug Fixes +- bump jsforce for metadata rest api ([#583](https://github.com/forcedotcom/sfdx-core/issues/583)) ([6addcfd](https://github.com/forcedotcom/sfdx-core/commit/6addcfd9b2bd480974f6c965b4d04c610a38f2db)) -* make @types/sfdx-faye a dependendcy ([683680b](https://github.com/forcedotcom/sfdx-core/commit/683680b8133048f71d25ef4df7aa24d9700dc5e8)) +# [3.17.0](https://github.com/forcedotcom/sfdx-core/compare/v3.16.2...v3.17.0) (2022-05-12) +### Features +- sandboxStatus for v3 ([#571](https://github.com/forcedotcom/sfdx-core/issues/571)) ([60a004b](https://github.com/forcedotcom/sfdx-core/commit/60a004b663d918ec8b37d6ded7ddf12ce112b7f8)) -## [3.7.1](https://github.com/forcedotcom/sfdx-core/compare/v2.28.2...v3.7.1) (2021-10-28) +## [3.16.2](https://github.com/forcedotcom/sfdx-core/compare/v3.16.1...v3.16.2) (2022-05-11) + +## [3.16.1](https://github.com/forcedotcom/sfdx-core/compare/v3.16.0...v3.16.1) (2022-05-11) +### Bug Fixes +- homedir can change after Core loads ([bb1e4f5](https://github.com/forcedotcom/sfdx-core/commit/bb1e4f5b1f59269f6d48a5389b1d76eeee252db0)) -# [3.7.0](https://github.com/forcedotcom/sfdx-core/compare/v3.6.6...v3.7.0) (2021-10-12) +# [3.16.0](https://github.com/forcedotcom/sfdx-core/compare/v3.15.5...v3.16.0) (2022-05-04) + +### Bug Fixes +- disable schemaValidation ([#578](https://github.com/forcedotcom/sfdx-core/issues/578)) ([9b60cb4](https://github.com/forcedotcom/sfdx-core/commit/9b60cb4dd3181f0bfbafadb72bcd0904e851084f)) ### Features -* use jsforce v2 ([#457](https://github.com/forcedotcom/sfdx-core/issues/457)) ([4a9094e](https://github.com/forcedotcom/sfdx-core/commit/4a9094e958288cdcc6c69f5d87b10a70a437d8e9)) +- force v3 release ([05620c8](https://github.com/forcedotcom/sfdx-core/commit/05620c80256052a1b814b631e9afd951d63bea9e)) +## [3.15.5](https://github.com/forcedotcom/sfdx-core/compare/v3.15.4...v3.15.5) (2022-05-03) +### Bug Fixes -## [3.6.6](https://github.com/forcedotcom/sfdx-core/compare/v2.28.1...v3.6.6) (2021-10-08) +- SfdxConfigAggregator ([238ad07](https://github.com/forcedotcom/sfdx-core/commit/238ad0757cc332ecc1897bd7230140a31a559332)) +## [3.15.4](https://github.com/forcedotcom/sfdx-core/compare/v3.15.3...v3.15.4) (2022-05-03) +### Bug Fixes -## [3.6.5](https://github.com/forcedotcom/sfdx-core/compare/v3.6.4...v3.6.5) (2021-09-29) +- SfdxConfigAggregator ([#576](https://github.com/forcedotcom/sfdx-core/issues/576)) ([9a25928](https://github.com/forcedotcom/sfdx-core/commit/9a259282efd3d2d97da42a54fd76c45d7f73df27)) +## [3.15.3](https://github.com/forcedotcom/sfdx-core/compare/v3.15.2...v3.15.3) (2022-05-02) ### Bug Fixes -* add getValue to AliasAccessor ([c4b69f5](https://github.com/forcedotcom/sfdx-core/commit/c4b69f5ff38547fad640c64833291fe0c6e06a79)) +- SfdxConfigAggregator ([6ee1437](https://github.com/forcedotcom/sfdx-core/commit/6ee14378f10df123ac38325853bc3b83d4d953bd)) +## [3.15.2](https://github.com/forcedotcom/sfdx-core/compare/v3.15.1...v3.15.2) (2022-05-02) +### Bug Fixes -## [3.6.4](https://github.com/forcedotcom/sfdx-core/compare/v3.6.3...v3.6.4) (2021-09-23) +- allow ConfigAggregator to accept custom config vars ([#575](https://github.com/forcedotcom/sfdx-core/issues/575)) ([2642128](https://github.com/forcedotcom/sfdx-core/commit/264212898cf14d8f34638926841ace89abf7efb0)) +## [3.15.1](https://github.com/forcedotcom/sfdx-core/compare/v3.15.0...v3.15.1) (2022-04-28) ### Bug Fixes -* edit the env var blurbs ([#482](https://github.com/forcedotcom/sfdx-core/issues/482)) ([bbbdb6d](https://github.com/forcedotcom/sfdx-core/commit/bbbdb6d0800015e94ce0f0c551eec8ed73dd87c6)) +- replace jsen ([664da58](https://github.com/forcedotcom/sfdx-core/commit/664da58cbe06019465ccf70ed17dfafb2425e06b)) +# [3.15.0](https://github.com/forcedotcom/sfdx-core/compare/v3.14.0...v3.15.0) (2022-04-26) +### Features -## [3.6.3](https://github.com/forcedotcom/sfdx-core/compare/v3.6.2...v3.6.3) (2021-09-23) +- core changes to support create scratch and sandboxes ([#570](https://github.com/forcedotcom/sfdx-core/issues/570)) ([916eeb1](https://github.com/forcedotcom/sfdx-core/commit/916eeb1f96bebd5dce255f13c838ac0b10bf5b96)) +# [3.14.0](https://github.com/forcedotcom/sfdx-core/compare/v3.13.1...v3.14.0) (2022-04-25) -### Bug Fixes +### Features -* edit the config var blurbs ([#480](https://github.com/forcedotcom/sfdx-core/issues/480)) ([f845512](https://github.com/forcedotcom/sfdx-core/commit/f8455121bfd96f27495bc124dc06570632dfce70)) +- add SfdxConfigAggregator ([#563](https://github.com/forcedotcom/sfdx-core/issues/563)) ([cd4debd](https://github.com/forcedotcom/sfdx-core/commit/cd4debdc99046580090b5d21bbd9da9030822d4a)) +## [3.13.1](https://github.com/forcedotcom/sfdx-core/compare/v3.13.0...v3.13.1) (2022-04-21) +### Bug Fixes -## [3.6.2](https://github.com/forcedotcom/sfdx-core/compare/v2.28.0...v3.6.2) (2021-09-17) +- log rotation errors ([#564](https://github.com/forcedotcom/sfdx-core/issues/564)) ([8a4c9de](https://github.com/forcedotcom/sfdx-core/commit/8a4c9de85840ae0efa0ee8a27494d63a61545da5)) +# [3.13.0](https://github.com/forcedotcom/sfdx-core/compare/v3.12.2...v3.13.0) (2022-04-20) -### Bug Fixes +### Features -* improve time to build auths for many orgs @W-9914839@ ([#478](https://github.com/forcedotcom/sfdx-core/issues/478)) ([c788541](https://github.com/forcedotcom/sfdx-core/commit/c7885415d59994b28552227f0b84dcee5d3ec7cf)) +- detect if org is a devhub at auth time ([#560](https://github.com/forcedotcom/sfdx-core/issues/560)) ([958e2e7](https://github.com/forcedotcom/sfdx-core/commit/958e2e7317e670b738b3e7c82260ef741e1416d2)) +## [3.12.2](https://github.com/forcedotcom/sfdx-core/compare/v3.12.1...v3.12.2) (2022-04-14) +### Bug Fixes -## [3.6.1](https://github.com/forcedotcom/sfdx-core/compare/v3.6.0...v3.6.1) (2021-09-13) +- sandbox cname recognition ([#556](https://github.com/forcedotcom/sfdx-core/issues/556)) ([2f85709](https://github.com/forcedotcom/sfdx-core/commit/2f8570912cae38fb0ddeaa37836395444c47611a)) +## [3.12.1](https://github.com/forcedotcom/sfdx-core/compare/v3.12.0...v3.12.1) (2022-04-05) ### Bug Fixes -* remove tokens associated with org ([#477](https://github.com/forcedotcom/sfdx-core/issues/477)) ([5034fa2](https://github.com/forcedotcom/sfdx-core/commit/5034fa2d4c52d347c00499e137a71366e4feba7f)) +- more FormData with buffers and headers ([5ebf78f](https://github.com/forcedotcom/sfdx-core/commit/5ebf78fe2b037df395c87197b90ee06a0d34d5d0)) + +# [3.12.0](https://github.com/forcedotcom/sfdx-core/compare/v3.11.1...v3.12.0) (2022-04-04) +### Features +- move common authinfo utils to core ([01b8cf3](https://github.com/forcedotcom/sfdx-core/commit/01b8cf3fa38162380da5ce15f6dee1d2a5d2d72d)) -# [3.6.0](https://github.com/forcedotcom/sfdx-core/compare/v3.5.0...v3.6.0) (2021-09-10) +## [3.11.1](https://github.com/forcedotcom/sfdx-core/compare/v3.11.0...v3.11.1) (2022-04-01) +# [3.11.0](https://github.com/forcedotcom/sfdx-core/compare/v3.10.1...v3.11.0) (2022-03-30) ### Features -* add help section helper ([#474](https://github.com/forcedotcom/sfdx-core/issues/474)) ([b34c2d7](https://github.com/forcedotcom/sfdx-core/commit/b34c2d7a442aed2cf091fd394a7c3656287d1dbf)) +- normalize config vars for sf ([#543](https://github.com/forcedotcom/sfdx-core/issues/543)) ([93f3cbe](https://github.com/forcedotcom/sfdx-core/commit/93f3cbe90103fa159f21f532ffc173931037651c)) +## [3.10.1](https://github.com/forcedotcom/sfdx-core/compare/v3.10.0...v3.10.1) (2022-03-24) +### Bug Fixes -# [3.5.0](https://github.com/forcedotcom/sfdx-core/compare/v3.4.5...v3.5.0) (2021-09-09) +- rotating file logs ([ef5df25](https://github.com/forcedotcom/sfdx-core/commit/ef5df25c17a67541d12d5c228c18b75775251d98)) +# [3.10.0](https://github.com/forcedotcom/sfdx-core/compare/v3.9.0...v3.10.0) (2022-03-23) + +### Bug Fixes + +- casing typo for import ([066a2bb](https://github.com/forcedotcom/sfdx-core/commit/066a2bbb37b07f62415f021ef511344976315128)) +- warnings about tracking aren't a throw (org will still auth, default) ([38114a3](https://github.com/forcedotcom/sfdx-core/commit/38114a3526267a615fa8f5d3470b79c9b36a8fa8)) ### Features -* expose well known env vars as part of core ([#473](https://github.com/forcedotcom/sfdx-core/issues/473)) ([11c3f53](https://github.com/forcedotcom/sfdx-core/commit/11c3f53f964459072826274e6ebb33d4a9ecb990)) +- lifecycle events for scratch org create ([cba673b](https://github.com/forcedotcom/sfdx-core/commit/cba673b515df311165f3c392b155fcf5fbf9e2c6)) +- scratch org lifecycle events ([541349d](https://github.com/forcedotcom/sfdx-core/commit/541349d84b4784356d8bc504d1e331450487b6ec)) +# [3.9.0](https://github.com/forcedotcom/sfdx-core/compare/v3.8.1...v3.9.0) (2022-03-21) +### Features -## [3.4.5](https://github.com/forcedotcom/sfdx-core/compare/v3.4.4...v3.4.5) (2021-09-03) +- add TTLConfig ([#538](https://github.com/forcedotcom/sfdx-core/issues/538)) ([e623241](https://github.com/forcedotcom/sfdx-core/commit/e623241c7e513778c8f179dde4dc16e603a3778c)) +## [3.8.1](https://github.com/forcedotcom/sfdx-core/compare/v3.8.0...v3.8.1) (2022-03-18) ### Bug Fixes -* provide the correct options to SfdxConfig ([fa2117e](https://github.com/forcedotcom/sfdx-core/commit/fa2117e12d7a903f26067bdcf35d7ec9c142101e)) +- adjust mock org test data to conform to v3 ([38faf50](https://github.com/forcedotcom/sfdx-core/commit/38faf5063931955066312c24b4188b12c40098a5)) +- side effects function should not save when no changes ([#541](https://github.com/forcedotcom/sfdx-core/issues/541)) ([6bfb841](https://github.com/forcedotcom/sfdx-core/commit/6bfb84172fdf74882102b9ffc6e6fbfe58e6ffbc)) +# [3.8.0](https://github.com/forcedotcom/sfdx-core/compare/v3.7.9...v3.8.0) (2022-03-09) +### Features -## [3.4.4](https://github.com/forcedotcom/sfdx-core/compare/v3.4.3...v3.4.4) (2021-09-03) +- add handle side effect function to authinfo ([64c78e7](https://github.com/forcedotcom/sfdx-core/commit/64c78e74bc5e1cfb748fd2d64e4b1e8fc1062bf6)) +## [3.7.9](https://github.com/forcedotcom/sfdx-core/compare/v3.7.8...v3.7.9) (2022-03-04) +### Bug Fixes -## [3.4.3](https://github.com/forcedotcom/sfdx-core/compare/v3.4.2...v3.4.3) (2021-08-26) +- error literal to match the error thrown ([#533](https://github.com/forcedotcom/sfdx-core/issues/533)) ([b91ce5c](https://github.com/forcedotcom/sfdx-core/commit/b91ce5c329c9b2b88fb4b0ad028aee5f6d5b6e77)) +## [3.7.8](https://github.com/forcedotcom/sfdx-core/compare/v3.7.7...v3.7.8) (2022-03-03) +### Bug Fixes -## [3.4.2](https://github.com/forcedotcom/sfdx-core/compare/v3.4.1...v3.4.2) (2021-08-17) +- add create warning and info convenience functions ([#526](https://github.com/forcedotcom/sfdx-core/issues/526)) ([e3428b3](https://github.com/forcedotcom/sfdx-core/commit/e3428b35e00b9cee3c90153ed6ce08b352535ff7)) +## [3.7.7](https://github.com/forcedotcom/sfdx-core/compare/v3.7.6...v3.7.7) (2022-03-01) -### Bug Fixes +## [3.7.6](https://github.com/forcedotcom/sfdx-core/compare/v4.0.0...v3.7.6) (2022-02-28) -* improve interoperability when unsetting ([#467](https://github.com/forcedotcom/sfdx-core/issues/467)) ([ad781d5](https://github.com/forcedotcom/sfdx-core/commit/ad781d5378652dfd64ccb476c11f418e940b8669)) +# [4.0.0](https://github.com/forcedotcom/sfdx-core/compare/v2.35.2...v4.0.0) (2022-02-28) +## [3.7.5](https://github.com/forcedotcom/sfdx-core/compare/v2.35.1...v3.7.5) (2022-02-14) +### Bug Fixes -## [3.4.1](https://github.com/forcedotcom/sfdx-core/compare/v3.4.0...v3.4.1) (2021-08-11) +- add env vars from sfdx-cli init to envvars ([#520](https://github.com/forcedotcom/sfdx-core/issues/520)) ([8ef2785](https://github.com/forcedotcom/sfdx-core/commit/8ef27859d95bfffc5999b14f4792874d04f0504c)) +## [3.7.4](https://github.com/forcedotcom/sfdx-core/compare/v2.35.0...v3.7.4) (2022-02-07) ### Bug Fixes -* optionally throw error when reading deprecated config key ([#466](https://github.com/forcedotcom/sfdx-core/issues/466)) ([3118ad8](https://github.com/forcedotcom/sfdx-core/commit/3118ad836db384ac27c2b1db88c4753e6121e4db)) +- pin ts to 4.4.4 and bump other deps ([#509](https://github.com/forcedotcom/sfdx-core/issues/509)) ([1c0e15c](https://github.com/forcedotcom/sfdx-core/commit/1c0e15cd9a96f03e24476c13d73b62577a535fa3)) +## [3.7.3](https://github.com/forcedotcom/sfdx-core/compare/v2.33.1...v3.7.3) (2021-12-16) +## [3.7.2](https://github.com/forcedotcom/sfdx-core/compare/v3.7.1...v3.7.2) (2021-10-28) -# [3.4.0](https://github.com/forcedotcom/sfdx-core/compare/v3.3.12...v3.4.0) (2021-08-11) +### Bug Fixes +- make @types/sfdx-faye a dependendcy ([683680b](https://github.com/forcedotcom/sfdx-core/commit/683680b8133048f71d25ef4df7aa24d9700dc5e8)) -### Features +## [3.7.1](https://github.com/forcedotcom/sfdx-core/compare/v2.28.2...v3.7.1) (2021-10-28) -* config interoperability ([#461](https://github.com/forcedotcom/sfdx-core/issues/461)) ([11b60ad](https://github.com/forcedotcom/sfdx-core/commit/11b60adbe54acc8e16a90327c77abbe2613fbaab)) +# [3.7.0](https://github.com/forcedotcom/sfdx-core/compare/v3.6.6...v3.7.0) (2021-10-12) +### Features +- use jsforce v2 ([#457](https://github.com/forcedotcom/sfdx-core/issues/457)) ([4a9094e](https://github.com/forcedotcom/sfdx-core/commit/4a9094e958288cdcc6c69f5d87b10a70a437d8e9)) -## [3.3.12](https://github.com/forcedotcom/sfdx-core/compare/v2.27.2...v3.3.12) (2021-08-10) +## [3.6.6](https://github.com/forcedotcom/sfdx-core/compare/v2.28.1...v3.6.6) (2021-10-08) +## [3.6.5](https://github.com/forcedotcom/sfdx-core/compare/v3.6.4...v3.6.5) (2021-09-29) ### Bug Fixes -* add predicate function to list all auths ([ccdb02c](https://github.com/forcedotcom/sfdx-core/commit/ccdb02c268fae7532b23e0c791bcdd831f77cf98)) +- add getValue to AliasAccessor ([c4b69f5](https://github.com/forcedotcom/sfdx-core/commit/c4b69f5ff38547fad640c64833291fe0c6e06a79)) +## [3.6.4](https://github.com/forcedotcom/sfdx-core/compare/v3.6.3...v3.6.4) (2021-09-23) +### Bug Fixes -## [3.3.11](https://github.com/forcedotcom/sfdx-core/compare/v3.3.10...v3.3.11) (2021-08-04) +- edit the env var blurbs ([#482](https://github.com/forcedotcom/sfdx-core/issues/482)) ([bbbdb6d](https://github.com/forcedotcom/sfdx-core/commit/bbbdb6d0800015e94ce0f0c551eec8ed73dd87c6)) +## [3.6.3](https://github.com/forcedotcom/sfdx-core/compare/v3.6.2...v3.6.3) (2021-09-23) ### Bug Fixes -* allows for message keys of error and errors ([#455](https://github.com/forcedotcom/sfdx-core/issues/455)) ([3bfac58](https://github.com/forcedotcom/sfdx-core/commit/3bfac587c6cf1734af6f2b517439d278591ddd50)) +- edit the config var blurbs ([#480](https://github.com/forcedotcom/sfdx-core/issues/480)) ([f845512](https://github.com/forcedotcom/sfdx-core/commit/f8455121bfd96f27495bc124dc06570632dfce70)) +## [3.6.2](https://github.com/forcedotcom/sfdx-core/compare/v2.28.0...v3.6.2) (2021-09-17) +### Bug Fixes -## [3.3.10](https://github.com/forcedotcom/sfdx-core/compare/v3.3.9...v3.3.10) (2021-08-04) +- improve time to build auths for many orgs @W-9914839@ ([#478](https://github.com/forcedotcom/sfdx-core/issues/478)) ([c788541](https://github.com/forcedotcom/sfdx-core/commit/c7885415d59994b28552227f0b84dcee5d3ec7cf)) +## [3.6.1](https://github.com/forcedotcom/sfdx-core/compare/v3.6.0...v3.6.1) (2021-09-13) +### Bug Fixes -## [3.3.9](https://github.com/forcedotcom/sfdx-core/compare/v3.3.8...v3.3.9) (2021-08-04) +- remove tokens associated with org ([#477](https://github.com/forcedotcom/sfdx-core/issues/477)) ([5034fa2](https://github.com/forcedotcom/sfdx-core/commit/5034fa2d4c52d347c00499e137a71366e4feba7f)) +# [3.6.0](https://github.com/forcedotcom/sfdx-core/compare/v3.5.0...v3.6.0) (2021-09-10) -### Bug Fixes +### Features -* merge main(v2) into v3 ([#452](https://github.com/forcedotcom/sfdx-core/issues/452)) ([3a003b9](https://github.com/forcedotcom/sfdx-core/commit/3a003b9c17962f77344e4a23314bb608e1ae50db)) +- add help section helper ([#474](https://github.com/forcedotcom/sfdx-core/issues/474)) ([b34c2d7](https://github.com/forcedotcom/sfdx-core/commit/b34c2d7a442aed2cf091fd394a7c3656287d1dbf)) +# [3.5.0](https://github.com/forcedotcom/sfdx-core/compare/v3.4.5...v3.5.0) (2021-09-09) +### Features -## [3.3.8](https://github.com/forcedotcom/sfdx-core/compare/v3.3.7...v3.3.8) (2021-08-02) +- expose well known env vars as part of core ([#473](https://github.com/forcedotcom/sfdx-core/issues/473)) ([11c3f53](https://github.com/forcedotcom/sfdx-core/commit/11c3f53f964459072826274e6ebb33d4a9ecb990)) +## [3.4.5](https://github.com/forcedotcom/sfdx-core/compare/v3.4.4...v3.4.5) (2021-09-03) ### Bug Fixes -* return all info from AuthInfo.listAllAuthorizations ([#449](https://github.com/forcedotcom/sfdx-core/issues/449)) ([17e60ea](https://github.com/forcedotcom/sfdx-core/commit/17e60eabe87c73a83c26344967076f365ddea81c)) - +- provide the correct options to SfdxConfig ([fa2117e](https://github.com/forcedotcom/sfdx-core/commit/fa2117e12d7a903f26067bdcf35d7ec9c142101e)) +## [3.4.4](https://github.com/forcedotcom/sfdx-core/compare/v3.4.3...v3.4.4) (2021-09-03) -## [3.3.7](https://github.com/forcedotcom/sfdx-core/compare/v2.27.0...v3.3.7) (2021-07-30) +## [3.4.3](https://github.com/forcedotcom/sfdx-core/compare/v3.4.2...v3.4.3) (2021-08-26) +## [3.4.2](https://github.com/forcedotcom/sfdx-core/compare/v3.4.1...v3.4.2) (2021-08-17) +### Bug Fixes -## [3.3.6](https://github.com/forcedotcom/sfdx-core/compare/v3.3.5...v3.3.6) (2021-07-28) +- improve interoperability when unsetting ([#467](https://github.com/forcedotcom/sfdx-core/issues/467)) ([ad781d5](https://github.com/forcedotcom/sfdx-core/commit/ad781d5378652dfd64ccb476c11f418e940b8669)) +## [3.4.1](https://github.com/forcedotcom/sfdx-core/compare/v3.4.0...v3.4.1) (2021-08-11) ### Bug Fixes -* use correct method to get username ([#446](https://github.com/forcedotcom/sfdx-core/issues/446)) ([79a6b2f](https://github.com/forcedotcom/sfdx-core/commit/79a6b2f069f95b0c50a6c03ecbac07cf0d1832b1)) +- optionally throw error when reading deprecated config key ([#466](https://github.com/forcedotcom/sfdx-core/issues/466)) ([3118ad8](https://github.com/forcedotcom/sfdx-core/commit/3118ad836db384ac27c2b1db88c4753e6121e4db)) +# [3.4.0](https://github.com/forcedotcom/sfdx-core/compare/v3.3.12...v3.4.0) (2021-08-11) +### Features -## [3.3.5](https://github.com/forcedotcom/sfdx-core/compare/v3.3.4...v3.3.5) (2021-07-28) +- config interoperability ([#461](https://github.com/forcedotcom/sfdx-core/issues/461)) ([11b60ad](https://github.com/forcedotcom/sfdx-core/commit/11b60adbe54acc8e16a90327c77abbe2613fbaab)) +## [3.3.12](https://github.com/forcedotcom/sfdx-core/compare/v2.27.2...v3.3.12) (2021-08-10) +### Bug Fixes -## [3.3.4](https://github.com/forcedotcom/sfdx-core/compare/v3.3.3...v3.3.4) (2021-07-26) +- add predicate function to list all auths ([ccdb02c](https://github.com/forcedotcom/sfdx-core/commit/ccdb02c268fae7532b23e0c791bcdd831f77cf98)) +## [3.3.11](https://github.com/forcedotcom/sfdx-core/compare/v3.3.10...v3.3.11) (2021-08-04) ### Bug Fixes -* remove bad validator function ([1b97dc6](https://github.com/forcedotcom/sfdx-core/commit/1b97dc6f4d657a5b86489d33c4843ebfd54b3715)) +- allows for message keys of error and errors ([#455](https://github.com/forcedotcom/sfdx-core/issues/455)) ([3bfac58](https://github.com/forcedotcom/sfdx-core/commit/3bfac587c6cf1734af6f2b517439d278591ddd50)) + +## [3.3.10](https://github.com/forcedotcom/sfdx-core/compare/v3.3.9...v3.3.10) (2021-08-04) +## [3.3.9](https://github.com/forcedotcom/sfdx-core/compare/v3.3.8...v3.3.9) (2021-08-04) +### Bug Fixes -## [3.3.3](https://github.com/forcedotcom/sfdx-core/compare/v3.3.2...v3.3.3) (2021-07-22) +- merge main(v2) into v3 ([#452](https://github.com/forcedotcom/sfdx-core/issues/452)) ([3a003b9](https://github.com/forcedotcom/sfdx-core/commit/3a003b9c17962f77344e4a23314bb608e1ae50db)) +## [3.3.8](https://github.com/forcedotcom/sfdx-core/compare/v3.3.7...v3.3.8) (2021-08-02) ### Bug Fixes -* write sf.json contents on init ([c47f649](https://github.com/forcedotcom/sfdx-core/commit/c47f64954118d0d2f7f4a8e992d3450516239084)) +- return all info from AuthInfo.listAllAuthorizations ([#449](https://github.com/forcedotcom/sfdx-core/issues/449)) ([17e60ea](https://github.com/forcedotcom/sfdx-core/commit/17e60eabe87c73a83c26344967076f365ddea81c)) +## [3.3.7](https://github.com/forcedotcom/sfdx-core/compare/v2.27.0...v3.3.7) (2021-07-30) +## [3.3.6](https://github.com/forcedotcom/sfdx-core/compare/v3.3.5...v3.3.6) (2021-07-28) -## [3.3.2](https://github.com/forcedotcom/sfdx-core/compare/v2.26.1...v3.3.2) (2021-07-21) +### Bug Fixes +- use correct method to get username ([#446](https://github.com/forcedotcom/sfdx-core/issues/446)) ([79a6b2f](https://github.com/forcedotcom/sfdx-core/commit/79a6b2f069f95b0c50a6c03ecbac07cf0d1832b1)) + +## [3.3.5](https://github.com/forcedotcom/sfdx-core/compare/v3.3.4...v3.3.5) (2021-07-28) + +## [3.3.4](https://github.com/forcedotcom/sfdx-core/compare/v3.3.3...v3.3.4) (2021-07-26) ### Bug Fixes -* correct jsdoc ([a362e94](https://github.com/forcedotcom/sfdx-core/commit/a362e94c4ae7538cbbcd7dae8fcd3244629d845c)) +- remove bad validator function ([1b97dc6](https://github.com/forcedotcom/sfdx-core/commit/1b97dc6f4d657a5b86489d33c4843ebfd54b3715)) +## [3.3.3](https://github.com/forcedotcom/sfdx-core/compare/v3.3.2...v3.3.3) (2021-07-22) +### Bug Fixes -## [3.3.1](https://github.com/forcedotcom/sfdx-core/compare/v3.3.0...v3.3.1) (2021-07-15) +- write sf.json contents on init ([c47f649](https://github.com/forcedotcom/sfdx-core/commit/c47f64954118d0d2f7f4a8e992d3450516239084)) +## [3.3.2](https://github.com/forcedotcom/sfdx-core/compare/v2.26.1...v3.3.2) (2021-07-21) ### Bug Fixes -* temporarily point Alias back to .sfdx ([#438](https://github.com/forcedotcom/sfdx-core/issues/438)) ([4bffcd8](https://github.com/forcedotcom/sfdx-core/commit/4bffcd84362d5b3049ef428e90dc1b538a435f81)) +- correct jsdoc ([a362e94](https://github.com/forcedotcom/sfdx-core/commit/a362e94c4ae7538cbbcd7dae8fcd3244629d845c)) + +## [3.3.1](https://github.com/forcedotcom/sfdx-core/compare/v3.3.0...v3.3.1) (2021-07-15) +### Bug Fixes +- temporarily point Alias back to .sfdx ([#438](https://github.com/forcedotcom/sfdx-core/issues/438)) ([4bffcd8](https://github.com/forcedotcom/sfdx-core/commit/4bffcd84362d5b3049ef428e90dc1b538a435f81)) # [3.3.0](https://github.com/forcedotcom/sfdx-core/compare/v3.2.0-v3.0...v3.3.0) (2021-07-14) - ### Features -* V3 merge ([#436](https://github.com/forcedotcom/sfdx-core/issues/436)) ([1193449](https://github.com/forcedotcom/sfdx-core/commit/119344969147679088e30bae4c4fc5e941661078)), closes [#413](https://github.com/forcedotcom/sfdx-core/issues/413) [#415](https://github.com/forcedotcom/sfdx-core/issues/415) [#428](https://github.com/forcedotcom/sfdx-core/issues/428) [#429](https://github.com/forcedotcom/sfdx-core/issues/429) [#427](https://github.com/forcedotcom/sfdx-core/issues/427) [#432](https://github.com/forcedotcom/sfdx-core/issues/432) - - +- V3 merge ([#436](https://github.com/forcedotcom/sfdx-core/issues/436)) ([1193449](https://github.com/forcedotcom/sfdx-core/commit/119344969147679088e30bae4c4fc5e941661078)), closes [#413](https://github.com/forcedotcom/sfdx-core/issues/413) [#415](https://github.com/forcedotcom/sfdx-core/issues/415) [#428](https://github.com/forcedotcom/sfdx-core/issues/428) [#429](https://github.com/forcedotcom/sfdx-core/issues/429) [#427](https://github.com/forcedotcom/sfdx-core/issues/427) [#432](https://github.com/forcedotcom/sfdx-core/issues/432) # [3.2.0-v3.0](https://github.com/forcedotcom/sfdx-core/compare/v2.26.0...v3.2.0-v3.0) (2021-07-14) - ### Features -* use .sf/config.json @W-9546117@ ([#433](https://github.com/forcedotcom/sfdx-core/issues/433)) ([6c41653](https://github.com/forcedotcom/sfdx-core/commit/6c416531a9bae10e855ded3efc289a99196bc26b)) - - +- use .sf/config.json @W-9546117@ ([#433](https://github.com/forcedotcom/sfdx-core/issues/433)) ([6c41653](https://github.com/forcedotcom/sfdx-core/commit/6c416531a9bae10e855ded3efc289a99196bc26b)) ## [3.1.1-v3.2](https://github.com/forcedotcom/sfdx-core/compare/v2.24.2...v3.1.1-v3.2) (2021-06-29) - ### Bug Fixes -* do not use function prop ([#426](https://github.com/forcedotcom/sfdx-core/issues/426)) ([39efe0c](https://github.com/forcedotcom/sfdx-core/commit/39efe0ccc84b05bc891e54b24bfcddc62790ae0e)) - - +- do not use function prop ([#426](https://github.com/forcedotcom/sfdx-core/issues/426)) ([39efe0c](https://github.com/forcedotcom/sfdx-core/commit/39efe0ccc84b05bc891e54b24bfcddc62790ae0e)) ## [3.1.1-v3.1](https://github.com/forcedotcom/sfdx-core/compare/v2.24.0...v3.1.1-v3.1) (2021-06-14) - ### Bug Fixes -* keep track of auth changes ([210be6c](https://github.com/forcedotcom/sfdx-core/commit/210be6cb408bd9ecc861989570df0e14f6a3a566)) - - +- keep track of auth changes ([210be6c](https://github.com/forcedotcom/sfdx-core/commit/210be6cb408bd9ecc861989570df0e14f6a3a566)) ## [3.1.1-v3.0](https://github.com/forcedotcom/sfdx-core/compare/v2.23.3...v3.1.1-v3.0) (2021-06-03) - ### Bug Fixes -* compilation errors ([33a9876](https://github.com/forcedotcom/sfdx-core/commit/33a9876575eff7944bb287d428f52413831725d9)) -* unit test failures ([4507575](https://github.com/forcedotcom/sfdx-core/commit/45075754175d411b6cb71eb809096e6eb3e23d95)) -* unsetAuthorization ([#399](https://github.com/forcedotcom/sfdx-core/issues/399)) ([dd57438](https://github.com/forcedotcom/sfdx-core/commit/dd57438a95b49515f560d3b915cdf916a4b8643b)) - +- compilation errors ([33a9876](https://github.com/forcedotcom/sfdx-core/commit/33a9876575eff7944bb287d428f52413831725d9)) +- unit test failures ([4507575](https://github.com/forcedotcom/sfdx-core/commit/45075754175d411b6cb71eb809096e6eb3e23d95)) +- unsetAuthorization ([#399](https://github.com/forcedotcom/sfdx-core/issues/399)) ([dd57438](https://github.com/forcedotcom/sfdx-core/commit/dd57438a95b49515f560d3b915cdf916a4b8643b)) ### Features -* add GlobalInfo config file ([#397](https://github.com/forcedotcom/sfdx-core/issues/397)) ([889425c](https://github.com/forcedotcom/sfdx-core/commit/889425c06e8ed6a364d9a2bc3dd5ef0a38a66046)) -* add message support for markdown files ([0f235a2](https://github.com/forcedotcom/sfdx-core/commit/0f235a23d5dddbd7b3f07544d8c7e380875c6c55)) -* move crypto to config file @W-9225317@ ([#406](https://github.com/forcedotcom/sfdx-core/issues/406)) ([bac83c3](https://github.com/forcedotcom/sfdx-core/commit/bac83c3a52b15c9b462dfb68be9d080e710493cd)) - - +- add GlobalInfo config file ([#397](https://github.com/forcedotcom/sfdx-core/issues/397)) ([889425c](https://github.com/forcedotcom/sfdx-core/commit/889425c06e8ed6a364d9a2bc3dd5ef0a38a66046)) +- add message support for markdown files ([0f235a2](https://github.com/forcedotcom/sfdx-core/commit/0f235a23d5dddbd7b3f07544d8c7e380875c6c55)) +- move crypto to config file @W-9225317@ ([#406](https://github.com/forcedotcom/sfdx-core/issues/406)) ([bac83c3](https://github.com/forcedotcom/sfdx-core/commit/bac83c3a52b15c9b462dfb68be9d080e710493cd)) ## [2.35.2](https://github.com/forcedotcom/sfdx-core/compare/v3.7.5...v2.35.2) (2022-02-16) - ### Bug Fixes -* network error tolerance ([#517](https://github.com/forcedotcom/sfdx-core/issues/517)) ([676ebfe](https://github.com/forcedotcom/sfdx-core/commit/676ebfe58b13826b53f461b2fef321c21f583004)) - - +- network error tolerance ([#517](https://github.com/forcedotcom/sfdx-core/issues/517)) ([676ebfe](https://github.com/forcedotcom/sfdx-core/commit/676ebfe58b13826b53f461b2fef321c21f583004)) ## [2.35.1](https://github.com/forcedotcom/sfdx-core/compare/v3.7.4...v2.35.1) (2022-02-10) - ### Bug Fixes -* add error message on failed settings deploy ([e218b1e](https://github.com/forcedotcom/sfdx-core/commit/e218b1e40414ea9e4fec256b74224626d96eff4a)) -* prefer instanceUrl for loginUrl on user:create ([#518](https://github.com/forcedotcom/sfdx-core/issues/518)) ([c070a87](https://github.com/forcedotcom/sfdx-core/commit/c070a871861409dea722e85845eeb91f262ab66f)) - - +- add error message on failed settings deploy ([e218b1e](https://github.com/forcedotcom/sfdx-core/commit/e218b1e40414ea9e4fec256b74224626d96eff4a)) +- prefer instanceUrl for loginUrl on user:create ([#518](https://github.com/forcedotcom/sfdx-core/issues/518)) ([c070a87](https://github.com/forcedotcom/sfdx-core/commit/c070a871861409dea722e85845eeb91f262ab66f)) # [2.35.0](https://github.com/forcedotcom/sfdx-core/compare/v2.34.2...v2.35.0) (2022-01-25) - ### Bug Fixes -* jsforce dep and pjson version realign ([#516](https://github.com/forcedotcom/sfdx-core/issues/516)) ([9f35f2f](https://github.com/forcedotcom/sfdx-core/commit/9f35f2f0ce30e996a0b4c88461c2babb536c33f7)) - - +- jsforce dep and pjson version realign ([#516](https://github.com/forcedotcom/sfdx-core/issues/516)) ([9f35f2f](https://github.com/forcedotcom/sfdx-core/commit/9f35f2f0ce30e996a0b4c88461c2babb536c33f7)) ## [2.34.2](https://github.com/forcedotcom/sfdx-core/compare/v2.33.2...v2.34.2) (2022-01-25) - - ## [2.33.2](https://github.com/forcedotcom/sfdx-core/compare/v3.7.3...v2.33.2) (2022-01-25) - ### Bug Fixes -* correct import declaration ([4c69d2d](https://github.com/forcedotcom/sfdx-core/commit/4c69d2dc3370c5f920becfe260ccb178279e4d92)) -* exit deploy loop with error on status SucceededPartial ([492e891](https://github.com/forcedotcom/sfdx-core/commit/492e89184e4c865cc7fcf7df41b9c6af6a6f2237)) -* refresh auth on a connection, too ([ff32a70](https://github.com/forcedotcom/sfdx-core/commit/ff32a705d87d6e410d06597eefa407b54eeb215d)) -* remove unwanted dep ([12ccc3a](https://github.com/forcedotcom/sfdx-core/commit/12ccc3adc0efbe687059187ab4d849b1741c823d)) -* save auth info ([226bbd2](https://github.com/forcedotcom/sfdx-core/commit/226bbd2dc09a7a8df5887c0ae7548c83ae19b748)) - - +- correct import declaration ([4c69d2d](https://github.com/forcedotcom/sfdx-core/commit/4c69d2dc3370c5f920becfe260ccb178279e4d92)) +- exit deploy loop with error on status SucceededPartial ([492e891](https://github.com/forcedotcom/sfdx-core/commit/492e89184e4c865cc7fcf7df41b9c6af6a6f2237)) +- refresh auth on a connection, too ([ff32a70](https://github.com/forcedotcom/sfdx-core/commit/ff32a705d87d6e410d06597eefa407b54eeb215d)) +- remove unwanted dep ([12ccc3a](https://github.com/forcedotcom/sfdx-core/commit/12ccc3adc0efbe687059187ab4d849b1741c823d)) +- save auth info ([226bbd2](https://github.com/forcedotcom/sfdx-core/commit/226bbd2dc09a7a8df5887c0ae7548c83ae19b748)) ## [2.33.1](https://github.com/forcedotcom/sfdx-core/compare/v2.33.0...v2.33.1) (2021-12-15) - ### Bug Fixes -* faye doesn't use custom stuff passed it ([b1cefc7](https://github.com/forcedotcom/sfdx-core/commit/b1cefc76afde7f0dd56ed72b5539a47c118eef63)) - - +- faye doesn't use custom stuff passed it ([b1cefc7](https://github.com/forcedotcom/sfdx-core/commit/b1cefc76afde7f0dd56ed72b5539a47c118eef63)) # [2.33.0](https://github.com/forcedotcom/sfdx-core/compare/v2.32.0...v2.33.0) (2021-12-14) - ### Features -* sandbox creation ([314dcf1](https://github.com/forcedotcom/sfdx-core/commit/314dcf164d93bd0e3a5f4763a4dfcdde7d0cb14a)) - - +- sandbox creation ([314dcf1](https://github.com/forcedotcom/sfdx-core/commit/314dcf164d93bd0e3a5f4763a4dfcdde7d0cb14a)) # [2.32.0](https://github.com/forcedotcom/sfdx-core/compare/v2.31.1...v2.32.0) (2021-12-14) - ### Bug Fixes -* no maxquery warning when records.length is 0 ([758f912](https://github.com/forcedotcom/sfdx-core/commit/758f912a23bd3e9f8d4f854f3e07682dd4d4c4aa)) -* remove redundant warnings about no listerners on warnings ([7a5bd23](https://github.com/forcedotcom/sfdx-core/commit/7a5bd2390713da929e886f41d9dcbc811104f99a)) - +- no maxquery warning when records.length is 0 ([758f912](https://github.com/forcedotcom/sfdx-core/commit/758f912a23bd3e9f8d4f854f3e07682dd4d4c4aa)) +- remove redundant warnings about no listerners on warnings ([7a5bd23](https://github.com/forcedotcom/sfdx-core/commit/7a5bd2390713da929e886f41d9dcbc811104f99a)) ### Features -* switch sfdx-faye with faye ([a0545e5](https://github.com/forcedotcom/sfdx-core/commit/a0545e57d5041c97e499f284afbd7fcb16cf2247)) - +- switch sfdx-faye with faye ([a0545e5](https://github.com/forcedotcom/sfdx-core/commit/a0545e57d5041c97e499f284afbd7fcb16cf2247)) ### Reverts -* Revert "test: added basic tests for settings" ([28e656c](https://github.com/forcedotcom/sfdx-core/commit/28e656ce6f8b8461dbc866474137829941a7bde0)) - - +- Revert "test: added basic tests for settings" ([28e656c](https://github.com/forcedotcom/sfdx-core/commit/28e656ce6f8b8461dbc866474137829941a7bde0)) ## [2.31.1](https://github.com/forcedotcom/sfdx-core/compare/v2.31.0...v2.31.1) (2021-12-06) - - # [2.31.0](https://github.com/forcedotcom/sfdx-core/compare/v2.30.1...v2.31.0) (2021-11-30) - ### Features -* bump version of jsforce ([7d89024](https://github.com/forcedotcom/sfdx-core/commit/7d89024f593968c031af22ac817efc26d00fcd54)) - - +- bump version of jsforce ([7d89024](https://github.com/forcedotcom/sfdx-core/commit/7d89024f593968c031af22ac817efc26d00fcd54)) ## [2.30.1](https://github.com/forcedotcom/sfdx-core/compare/v2.30.0...v2.30.1) (2021-11-30) - ### Bug Fixes -* better output for authUrl errors ([f3ec729](https://github.com/forcedotcom/sfdx-core/commit/f3ec7298bdbd3194d3d14bfea09f47f413669376)) - - +- better output for authUrl errors ([f3ec729](https://github.com/forcedotcom/sfdx-core/commit/f3ec7298bdbd3194d3d14bfea09f47f413669376)) # [2.30.0](https://github.com/forcedotcom/sfdx-core/compare/v2.29.0...v2.30.0) (2021-11-25) - ### Features -* delete scratch orgs and sandboxes ([#491](https://github.com/forcedotcom/sfdx-core/issues/491)) ([468c348](https://github.com/forcedotcom/sfdx-core/commit/468c348f0ecc69ddeea02927bf7a26ca660a86ca)) - - +- delete scratch orgs and sandboxes ([#491](https://github.com/forcedotcom/sfdx-core/issues/491)) ([468c348](https://github.com/forcedotcom/sfdx-core/commit/468c348f0ecc69ddeea02927bf7a26ca660a86ca)) # [2.29.0](https://github.com/forcedotcom/sfdx-core/compare/v2.28.4...v2.29.0) (2021-11-17) - ### Bug Fixes -* use correct dir structure ([e947fec](https://github.com/forcedotcom/sfdx-core/commit/e947fecf33a1c19ff80b33f7515e39d4e524f77f)) - - +- use correct dir structure ([e947fec](https://github.com/forcedotcom/sfdx-core/commit/e947fecf33a1c19ff80b33f7515e39d4e524f77f)) ## [2.28.4](https://github.com/forcedotcom/sfdx-core/compare/v2.28.3...v2.28.4) (2021-11-10) - ### Bug Fixes -* bump jsforce types and run unit tests on Windows ([#485](https://github.com/forcedotcom/sfdx-core/issues/485)) ([3952c8f](https://github.com/forcedotcom/sfdx-core/commit/3952c8fe248531a0597477ed12240f611048caba)) -* transfer listeners when upgrading the global instance to newer version ([0a40831](https://github.com/forcedotcom/sfdx-core/commit/0a408317c132548771ced0fe196178d2e9c76232)) - +- bump jsforce types and run unit tests on Windows ([#485](https://github.com/forcedotcom/sfdx-core/issues/485)) ([3952c8f](https://github.com/forcedotcom/sfdx-core/commit/3952c8fe248531a0597477ed12240f611048caba)) +- transfer listeners when upgrading the global instance to newer version ([0a40831](https://github.com/forcedotcom/sfdx-core/commit/0a408317c132548771ced0fe196178d2e9c76232)) ### Features -* cleans up old listeners from upgraded instance ([e3f2d69](https://github.com/forcedotcom/sfdx-core/commit/e3f2d69ccd5c096d37addb1b982e19354175f11a)) -* use warnings instead of process in sfdx-core ([c1f7e98](https://github.com/forcedotcom/sfdx-core/commit/c1f7e98f6b19d57da1a2ee0cdf58e449079f0ee7)) -* warning and telemetry events ([80a8039](https://github.com/forcedotcom/sfdx-core/commit/80a8039e2f686d973ddbc24c9a2980fb93928d13)) -* warning and telemetry events ([a04b293](https://github.com/forcedotcom/sfdx-core/commit/a04b29355c8ca6c7e37e071ccc159aff5e5e9ca0)) - - +- cleans up old listeners from upgraded instance ([e3f2d69](https://github.com/forcedotcom/sfdx-core/commit/e3f2d69ccd5c096d37addb1b982e19354175f11a)) +- use warnings instead of process in sfdx-core ([c1f7e98](https://github.com/forcedotcom/sfdx-core/commit/c1f7e98f6b19d57da1a2ee0cdf58e449079f0ee7)) +- warning and telemetry events ([80a8039](https://github.com/forcedotcom/sfdx-core/commit/80a8039e2f686d973ddbc24c9a2980fb93928d13)) +- warning and telemetry events ([a04b293](https://github.com/forcedotcom/sfdx-core/commit/a04b29355c8ca6c7e37e071ccc159aff5e5e9ca0)) ## [2.28.3](https://github.com/forcedotcom/sfdx-core/compare/v3.7.2...v2.28.3) (2021-11-08) - ### Bug Fixes -* fix unit test ([d903c04](https://github.com/forcedotcom/sfdx-core/commit/d903c04e5f3e4f01fccb3f00b91560c443013ddf)) -* force new release ([124bb74](https://github.com/forcedotcom/sfdx-core/commit/124bb744c5ecc28cb8babf285c6d8c3032eb7ef6)) - - +- fix unit test ([d903c04](https://github.com/forcedotcom/sfdx-core/commit/d903c04e5f3e4f01fccb3f00b91560c443013ddf)) +- force new release ([124bb74](https://github.com/forcedotcom/sfdx-core/commit/124bb744c5ecc28cb8babf285c6d8c3032eb7ef6)) ## [2.28.2](https://github.com/forcedotcom/sfdx-core/compare/v3.7.0...v2.28.2) (2021-10-13) - ### Bug Fixes -* support for .mil sandboxes ([9ef35c7](https://github.com/forcedotcom/sfdx-core/commit/9ef35c7b1ef0fe974c3bd3b89b862a436e00f7d9)) - - +- support for .mil sandboxes ([9ef35c7](https://github.com/forcedotcom/sfdx-core/commit/9ef35c7b1ef0fe974c3bd3b89b862a436e00f7d9)) ## [2.28.1](https://github.com/forcedotcom/sfdx-core/compare/v3.6.5...v2.28.1) (2021-10-06) - ### Bug Fixes -* cant use require on json as module use readFileSync instead ([3085029](https://github.com/forcedotcom/sfdx-core/commit/3085029e70d7f88e2535bf0b80240855f13abf37)) -* crmforce.mil ([e263d5d](https://github.com/forcedotcom/sfdx-core/commit/e263d5d74be9c0651e5c2676d6eec1c31fca05e4)) - - +- cant use require on json as module use readFileSync instead ([3085029](https://github.com/forcedotcom/sfdx-core/commit/3085029e70d7f88e2535bf0b80240855f13abf37)) +- crmforce.mil ([e263d5d](https://github.com/forcedotcom/sfdx-core/commit/e263d5d74be9c0651e5c2676d6eec1c31fca05e4)) # [2.28.0](https://github.com/forcedotcom/sfdx-core/compare/v3.6.1...v2.28.0) (2021-09-16) - ### Features -* add custom templates config ([3cf8a8c](https://github.com/forcedotcom/sfdx-core/commit/3cf8a8cee1e7196efced989dcca9b545e1283386)) -* add validator for custom templates config ([dd2bcfe](https://github.com/forcedotcom/sfdx-core/commit/dd2bcfe8e7fee5c5c1c6321189ec04288103d5b6)) -* update config name ([72e84bf](https://github.com/forcedotcom/sfdx-core/commit/72e84bfacef48a1c2d00a61ebbae3f632601abbd)) - - +- add custom templates config ([3cf8a8c](https://github.com/forcedotcom/sfdx-core/commit/3cf8a8cee1e7196efced989dcca9b545e1283386)) +- add validator for custom templates config ([dd2bcfe](https://github.com/forcedotcom/sfdx-core/commit/dd2bcfe8e7fee5c5c1c6321189ec04288103d5b6)) +- update config name ([72e84bf](https://github.com/forcedotcom/sfdx-core/commit/72e84bfacef48a1c2d00a61ebbae3f632601abbd)) ## [2.27.2](https://github.com/forcedotcom/sfdx-core/compare/v2.27.1...v2.27.2) (2021-08-05) - ### Bug Fixes -* improve error handling while removing config props ([eecf7b0](https://github.com/forcedotcom/sfdx-core/commit/eecf7b0d0cf14e1371dc4c5ef03a413f864b0a8b)) - - +- improve error handling while removing config props ([eecf7b0](https://github.com/forcedotcom/sfdx-core/commit/eecf7b0d0cf14e1371dc4c5ef03a413f864b0a8b)) ## [2.27.1](https://github.com/forcedotcom/sfdx-core/compare/v3.3.11...v2.27.1) (2021-08-05) - ### Bug Fixes -* dont fail when trying to unset sf config keys ([#456](https://github.com/forcedotcom/sfdx-core/issues/456)) ([8aff9fd](https://github.com/forcedotcom/sfdx-core/commit/8aff9fd4bdb73ec20e58f5a16a8192a8eecba912)) -* improve error message when providing an invalid username ([2ab4bbd](https://github.com/forcedotcom/sfdx-core/commit/2ab4bbdefd962283d88ccb735de88c88fe189d39)) - - +- dont fail when trying to unset sf config keys ([#456](https://github.com/forcedotcom/sfdx-core/issues/456)) ([8aff9fd](https://github.com/forcedotcom/sfdx-core/commit/8aff9fd4bdb73ec20e58f5a16a8192a8eecba912)) +- improve error message when providing an invalid username ([2ab4bbd](https://github.com/forcedotcom/sfdx-core/commit/2ab4bbdefd962283d88ccb735de88c88fe189d39)) # [2.27.0](https://github.com/forcedotcom/sfdx-core/compare/v3.3.6...v2.27.0) (2021-07-29) - ### Features -* Core URL class SfdcUrl ([#420](https://github.com/forcedotcom/sfdx-core/issues/420)) ([66881ea](https://github.com/forcedotcom/sfdx-core/commit/66881eae2f30215c862ea398bfc1630d9a5898fe)) - - +- Core URL class SfdcUrl ([#420](https://github.com/forcedotcom/sfdx-core/issues/420)) ([66881ea](https://github.com/forcedotcom/sfdx-core/commit/66881eae2f30215c862ea398bfc1630d9a5898fe)) ## [2.26.1](https://github.com/forcedotcom/sfdx-core/compare/v3.3.1...v2.26.1) (2021-07-19) - ### Bug Fixes -* force:org:open force:org:open --urlonly display bug ([#439](https://github.com/forcedotcom/sfdx-core/issues/439)) ([2ea0e74](https://github.com/forcedotcom/sfdx-core/commit/2ea0e74b8bf1bff6de8af70372025cac10fc8c18)) - - +- force:org:open force:org:open --urlonly display bug ([#439](https://github.com/forcedotcom/sfdx-core/issues/439)) ([2ea0e74](https://github.com/forcedotcom/sfdx-core/commit/2ea0e74b8bf1bff6de8af70372025cac10fc8c18)) # [2.26.0](https://github.com/forcedotcom/sfdx-core/compare/v2.25.1...v2.26.0) (2021-07-13) - ### Features -* update generate password functionality ([#432](https://github.com/forcedotcom/sfdx-core/issues/432)) ([ed65e83](https://github.com/forcedotcom/sfdx-core/commit/ed65e83da3afe0d101743ee89cc7b2a7a38d5254)) - - +- update generate password functionality ([#432](https://github.com/forcedotcom/sfdx-core/issues/432)) ([ed65e83](https://github.com/forcedotcom/sfdx-core/commit/ed65e83da3afe0d101743ee89cc7b2a7a38d5254)) ## [2.25.1](https://github.com/forcedotcom/sfdx-core/compare/v3.1.1-3.2...v2.25.1) (2021-06-30) - ### Bug Fixes -* set retries to INFINITELY for polling client ([31539b4](https://github.com/forcedotcom/sfdx-core/commit/31539b4f0edd0cc1c049f70331ed5e40b8af55ea)) - - +- set retries to INFINITELY for polling client ([31539b4](https://github.com/forcedotcom/sfdx-core/commit/31539b4f0edd0cc1c049f70331ed5e40b8af55ea)) ## [3.1.1-3.2](https://github.com/forcedotcom/sfdx-core/compare/v2.25.0...v3.1.1-3.2) (2021-06-30) - ### Features -* @W-9517449@ Allow signupTargetLoginUrl to be overridden via env var ([#429](https://github.com/forcedotcom/sfdx-core/issues/429)) ([e2b8b36](https://github.com/forcedotcom/sfdx-core/commit/e2b8b36b2836b5277c83ffe22922978dc32e7b11)), closes [#427](https://github.com/forcedotcom/sfdx-core/issues/427) - - +- @W-9517449@ Allow signupTargetLoginUrl to be overridden via env var ([#429](https://github.com/forcedotcom/sfdx-core/issues/429)) ([e2b8b36](https://github.com/forcedotcom/sfdx-core/commit/e2b8b36b2836b5277c83ffe22922978dc32e7b11)), closes [#427](https://github.com/forcedotcom/sfdx-core/issues/427) ## [2.24.2](https://github.com/forcedotcom/sfdx-core/compare/v3.1.1-3.1...v2.24.2) (2021-06-23) - - ## [3.1.1-3.1](https://github.com/forcedotcom/sfdx-core/compare/v2.24.1...v3.1.1-3.1) (2021-06-23) - ### Bug Fixes -* puts some types back in dependencies ([94bea31](https://github.com/forcedotcom/sfdx-core/commit/94bea31037a41d4377faecb22bce8a2d12e95f4f)) -* rewrite polling client ([8d363d1](https://github.com/forcedotcom/sfdx-core/commit/8d363d13616f5efa944d4bb717a010add3c996b5)) - - +- puts some types back in dependencies ([94bea31](https://github.com/forcedotcom/sfdx-core/commit/94bea31037a41d4377faecb22bce8a2d12e95f4f)) +- rewrite polling client ([8d363d1](https://github.com/forcedotcom/sfdx-core/commit/8d363d13616f5efa944d4bb717a010add3c996b5)) # [2.24.0](https://github.com/forcedotcom/sfdx-core/compare/v2.23.5...v2.24.0) (2021-06-08) - ### Features -* exported function checkLightningDomain() ([#415](https://github.com/forcedotcom/sfdx-core/issues/415)) ([8e75231](https://github.com/forcedotcom/sfdx-core/commit/8e752313abf4a383a6ef18250ffac78b398987dd)) - - +- exported function checkLightningDomain() ([#415](https://github.com/forcedotcom/sfdx-core/issues/415)) ([8e75231](https://github.com/forcedotcom/sfdx-core/commit/8e752313abf4a383a6ef18250ffac78b398987dd)) ## [2.23.5](https://github.com/forcedotcom/sfdx-core/compare/v3.1.1-3.0...v2.23.5) (2021-06-07) - ### Bug Fixes -* w-9299422 (login url from config) and fs-parallelization ([043bb17](https://github.com/forcedotcom/sfdx-core/commit/043bb179dbf64f9c4522a4c0f0720ae09794227c)) - - +- w-9299422 (login url from config) and fs-parallelization ([043bb17](https://github.com/forcedotcom/sfdx-core/commit/043bb179dbf64f9c4522a4c0f0720ae09794227c)) ## [3.1.1-3.0](https://github.com/forcedotcom/sfdx-core/compare/v2.23.4...v3.1.1-3.0) (2021-06-03) - ### Bug Fixes -* works with TS4+ and jsforce types ([#413](https://github.com/forcedotcom/sfdx-core/issues/413)) ([b77cdad](https://github.com/forcedotcom/sfdx-core/commit/b77cdad56b114290b8e5fd23d968e23e7d4eedf4)) - - +- works with TS4+ and jsforce types ([#413](https://github.com/forcedotcom/sfdx-core/issues/413)) ([b77cdad](https://github.com/forcedotcom/sfdx-core/commit/b77cdad56b114290b8e5fd23d968e23e7d4eedf4)) ## [3.7.5](https://github.com/forcedotcom/sfdx-core/compare/v2.35.1...v3.7.5) (2022-02-14) - ### Bug Fixes -* add env vars from sfdx-cli init to envvars ([#520](https://github.com/forcedotcom/sfdx-core/issues/520)) ([8ef2785](https://github.com/forcedotcom/sfdx-core/commit/8ef27859d95bfffc5999b14f4792874d04f0504c)) - - +- add env vars from sfdx-cli init to envvars ([#520](https://github.com/forcedotcom/sfdx-core/issues/520)) ([8ef2785](https://github.com/forcedotcom/sfdx-core/commit/8ef27859d95bfffc5999b14f4792874d04f0504c)) ## [3.7.4](https://github.com/forcedotcom/sfdx-core/compare/v2.35.0...v3.7.4) (2022-02-07) - ### Bug Fixes -* pin ts to 4.4.4 and bump other deps ([#509](https://github.com/forcedotcom/sfdx-core/issues/509)) ([1c0e15c](https://github.com/forcedotcom/sfdx-core/commit/1c0e15cd9a96f03e24476c13d73b62577a535fa3)) - - +- pin ts to 4.4.4 and bump other deps ([#509](https://github.com/forcedotcom/sfdx-core/issues/509)) ([1c0e15c](https://github.com/forcedotcom/sfdx-core/commit/1c0e15cd9a96f03e24476c13d73b62577a535fa3)) ## [3.7.3](https://github.com/forcedotcom/sfdx-core/compare/v2.33.1...v3.7.3) (2021-12-16) - - ## [3.7.2](https://github.com/forcedotcom/sfdx-core/compare/v3.7.1...v3.7.2) (2021-10-28) - ### Bug Fixes -* make @types/sfdx-faye a dependendcy ([683680b](https://github.com/forcedotcom/sfdx-core/commit/683680b8133048f71d25ef4df7aa24d9700dc5e8)) - - +- make @types/sfdx-faye a dependendcy ([683680b](https://github.com/forcedotcom/sfdx-core/commit/683680b8133048f71d25ef4df7aa24d9700dc5e8)) ## [3.7.1](https://github.com/forcedotcom/sfdx-core/compare/v2.28.2...v3.7.1) (2021-10-28) - - # [3.7.0](https://github.com/forcedotcom/sfdx-core/compare/v3.6.6...v3.7.0) (2021-10-12) - ### Features -* use jsforce v2 ([#457](https://github.com/forcedotcom/sfdx-core/issues/457)) ([4a9094e](https://github.com/forcedotcom/sfdx-core/commit/4a9094e958288cdcc6c69f5d87b10a70a437d8e9)) - - +- use jsforce v2 ([#457](https://github.com/forcedotcom/sfdx-core/issues/457)) ([4a9094e](https://github.com/forcedotcom/sfdx-core/commit/4a9094e958288cdcc6c69f5d87b10a70a437d8e9)) ## [3.6.6](https://github.com/forcedotcom/sfdx-core/compare/v2.28.1...v3.6.6) (2021-10-08) - - ## [3.6.5](https://github.com/forcedotcom/sfdx-core/compare/v3.6.4...v3.6.5) (2021-09-29) - ### Bug Fixes -* add getValue to AliasAccessor ([c4b69f5](https://github.com/forcedotcom/sfdx-core/commit/c4b69f5ff38547fad640c64833291fe0c6e06a79)) - - +- add getValue to AliasAccessor ([c4b69f5](https://github.com/forcedotcom/sfdx-core/commit/c4b69f5ff38547fad640c64833291fe0c6e06a79)) ## [3.6.4](https://github.com/forcedotcom/sfdx-core/compare/v3.6.3...v3.6.4) (2021-09-23) - ### Bug Fixes -* edit the env var blurbs ([#482](https://github.com/forcedotcom/sfdx-core/issues/482)) ([bbbdb6d](https://github.com/forcedotcom/sfdx-core/commit/bbbdb6d0800015e94ce0f0c551eec8ed73dd87c6)) - - +- edit the env var blurbs ([#482](https://github.com/forcedotcom/sfdx-core/issues/482)) ([bbbdb6d](https://github.com/forcedotcom/sfdx-core/commit/bbbdb6d0800015e94ce0f0c551eec8ed73dd87c6)) ## [3.6.3](https://github.com/forcedotcom/sfdx-core/compare/v3.6.2...v3.6.3) (2021-09-23) - ### Bug Fixes -* edit the config var blurbs ([#480](https://github.com/forcedotcom/sfdx-core/issues/480)) ([f845512](https://github.com/forcedotcom/sfdx-core/commit/f8455121bfd96f27495bc124dc06570632dfce70)) - - +- edit the config var blurbs ([#480](https://github.com/forcedotcom/sfdx-core/issues/480)) ([f845512](https://github.com/forcedotcom/sfdx-core/commit/f8455121bfd96f27495bc124dc06570632dfce70)) ## [3.6.2](https://github.com/forcedotcom/sfdx-core/compare/v2.28.0...v3.6.2) (2021-09-17) - ### Bug Fixes -* improve time to build auths for many orgs @W-9914839@ ([#478](https://github.com/forcedotcom/sfdx-core/issues/478)) ([c788541](https://github.com/forcedotcom/sfdx-core/commit/c7885415d59994b28552227f0b84dcee5d3ec7cf)) - - +- improve time to build auths for many orgs @W-9914839@ ([#478](https://github.com/forcedotcom/sfdx-core/issues/478)) ([c788541](https://github.com/forcedotcom/sfdx-core/commit/c7885415d59994b28552227f0b84dcee5d3ec7cf)) ## [3.6.1](https://github.com/forcedotcom/sfdx-core/compare/v3.6.0...v3.6.1) (2021-09-13) - ### Bug Fixes -* remove tokens associated with org ([#477](https://github.com/forcedotcom/sfdx-core/issues/477)) ([5034fa2](https://github.com/forcedotcom/sfdx-core/commit/5034fa2d4c52d347c00499e137a71366e4feba7f)) - - +- remove tokens associated with org ([#477](https://github.com/forcedotcom/sfdx-core/issues/477)) ([5034fa2](https://github.com/forcedotcom/sfdx-core/commit/5034fa2d4c52d347c00499e137a71366e4feba7f)) # [3.6.0](https://github.com/forcedotcom/sfdx-core/compare/v3.5.0...v3.6.0) (2021-09-10) - ### Features -* add help section helper ([#474](https://github.com/forcedotcom/sfdx-core/issues/474)) ([b34c2d7](https://github.com/forcedotcom/sfdx-core/commit/b34c2d7a442aed2cf091fd394a7c3656287d1dbf)) - - +- add help section helper ([#474](https://github.com/forcedotcom/sfdx-core/issues/474)) ([b34c2d7](https://github.com/forcedotcom/sfdx-core/commit/b34c2d7a442aed2cf091fd394a7c3656287d1dbf)) # [3.5.0](https://github.com/forcedotcom/sfdx-core/compare/v3.4.5...v3.5.0) (2021-09-09) - ### Features -* expose well known env vars as part of core ([#473](https://github.com/forcedotcom/sfdx-core/issues/473)) ([11c3f53](https://github.com/forcedotcom/sfdx-core/commit/11c3f53f964459072826274e6ebb33d4a9ecb990)) - - +- expose well known env vars as part of core ([#473](https://github.com/forcedotcom/sfdx-core/issues/473)) ([11c3f53](https://github.com/forcedotcom/sfdx-core/commit/11c3f53f964459072826274e6ebb33d4a9ecb990)) ## [3.4.5](https://github.com/forcedotcom/sfdx-core/compare/v3.4.4...v3.4.5) (2021-09-03) - ### Bug Fixes -* provide the correct options to SfdxConfig ([fa2117e](https://github.com/forcedotcom/sfdx-core/commit/fa2117e12d7a903f26067bdcf35d7ec9c142101e)) - - +- provide the correct options to SfdxConfig ([fa2117e](https://github.com/forcedotcom/sfdx-core/commit/fa2117e12d7a903f26067bdcf35d7ec9c142101e)) ## [3.4.4](https://github.com/forcedotcom/sfdx-core/compare/v3.4.3...v3.4.4) (2021-09-03) - - ## [3.4.3](https://github.com/forcedotcom/sfdx-core/compare/v3.4.2...v3.4.3) (2021-08-26) - - ## [3.4.2](https://github.com/forcedotcom/sfdx-core/compare/v3.4.1...v3.4.2) (2021-08-17) - ### Bug Fixes -* improve interoperability when unsetting ([#467](https://github.com/forcedotcom/sfdx-core/issues/467)) ([ad781d5](https://github.com/forcedotcom/sfdx-core/commit/ad781d5378652dfd64ccb476c11f418e940b8669)) - - +- improve interoperability when unsetting ([#467](https://github.com/forcedotcom/sfdx-core/issues/467)) ([ad781d5](https://github.com/forcedotcom/sfdx-core/commit/ad781d5378652dfd64ccb476c11f418e940b8669)) ## [3.4.1](https://github.com/forcedotcom/sfdx-core/compare/v3.4.0...v3.4.1) (2021-08-11) - ### Bug Fixes -* optionally throw error when reading deprecated config key ([#466](https://github.com/forcedotcom/sfdx-core/issues/466)) ([3118ad8](https://github.com/forcedotcom/sfdx-core/commit/3118ad836db384ac27c2b1db88c4753e6121e4db)) - - +- optionally throw error when reading deprecated config key ([#466](https://github.com/forcedotcom/sfdx-core/issues/466)) ([3118ad8](https://github.com/forcedotcom/sfdx-core/commit/3118ad836db384ac27c2b1db88c4753e6121e4db)) # [3.4.0](https://github.com/forcedotcom/sfdx-core/compare/v3.3.12...v3.4.0) (2021-08-11) - ### Features -* config interoperability ([#461](https://github.com/forcedotcom/sfdx-core/issues/461)) ([11b60ad](https://github.com/forcedotcom/sfdx-core/commit/11b60adbe54acc8e16a90327c77abbe2613fbaab)) - - +- config interoperability ([#461](https://github.com/forcedotcom/sfdx-core/issues/461)) ([11b60ad](https://github.com/forcedotcom/sfdx-core/commit/11b60adbe54acc8e16a90327c77abbe2613fbaab)) ## [3.3.12](https://github.com/forcedotcom/sfdx-core/compare/v2.27.2...v3.3.12) (2021-08-10) - ### Bug Fixes -* add predicate function to list all auths ([ccdb02c](https://github.com/forcedotcom/sfdx-core/commit/ccdb02c268fae7532b23e0c791bcdd831f77cf98)) - - +- add predicate function to list all auths ([ccdb02c](https://github.com/forcedotcom/sfdx-core/commit/ccdb02c268fae7532b23e0c791bcdd831f77cf98)) ## [3.3.11](https://github.com/forcedotcom/sfdx-core/compare/v3.3.10...v3.3.11) (2021-08-04) - ### Bug Fixes -* allows for message keys of error and errors ([#455](https://github.com/forcedotcom/sfdx-core/issues/455)) ([3bfac58](https://github.com/forcedotcom/sfdx-core/commit/3bfac587c6cf1734af6f2b517439d278591ddd50)) - - +- allows for message keys of error and errors ([#455](https://github.com/forcedotcom/sfdx-core/issues/455)) ([3bfac58](https://github.com/forcedotcom/sfdx-core/commit/3bfac587c6cf1734af6f2b517439d278591ddd50)) ## [3.3.10](https://github.com/forcedotcom/sfdx-core/compare/v3.3.9...v3.3.10) (2021-08-04) - - ## [3.3.9](https://github.com/forcedotcom/sfdx-core/compare/v3.3.8...v3.3.9) (2021-08-04) - ### Bug Fixes -* merge main(v2) into v3 ([#452](https://github.com/forcedotcom/sfdx-core/issues/452)) ([3a003b9](https://github.com/forcedotcom/sfdx-core/commit/3a003b9c17962f77344e4a23314bb608e1ae50db)) - - +- merge main(v2) into v3 ([#452](https://github.com/forcedotcom/sfdx-core/issues/452)) ([3a003b9](https://github.com/forcedotcom/sfdx-core/commit/3a003b9c17962f77344e4a23314bb608e1ae50db)) ## [3.3.8](https://github.com/forcedotcom/sfdx-core/compare/v3.3.7...v3.3.8) (2021-08-02) - ### Bug Fixes -* return all info from AuthInfo.listAllAuthorizations ([#449](https://github.com/forcedotcom/sfdx-core/issues/449)) ([17e60ea](https://github.com/forcedotcom/sfdx-core/commit/17e60eabe87c73a83c26344967076f365ddea81c)) - - +- return all info from AuthInfo.listAllAuthorizations ([#449](https://github.com/forcedotcom/sfdx-core/issues/449)) ([17e60ea](https://github.com/forcedotcom/sfdx-core/commit/17e60eabe87c73a83c26344967076f365ddea81c)) ## [3.3.7](https://github.com/forcedotcom/sfdx-core/compare/v2.27.0...v3.3.7) (2021-07-30) - - ## [3.3.6](https://github.com/forcedotcom/sfdx-core/compare/v3.3.5...v3.3.6) (2021-07-28) - ### Bug Fixes -* use correct method to get username ([#446](https://github.com/forcedotcom/sfdx-core/issues/446)) ([79a6b2f](https://github.com/forcedotcom/sfdx-core/commit/79a6b2f069f95b0c50a6c03ecbac07cf0d1832b1)) - - +- use correct method to get username ([#446](https://github.com/forcedotcom/sfdx-core/issues/446)) ([79a6b2f](https://github.com/forcedotcom/sfdx-core/commit/79a6b2f069f95b0c50a6c03ecbac07cf0d1832b1)) ## [3.3.5](https://github.com/forcedotcom/sfdx-core/compare/v3.3.4...v3.3.5) (2021-07-28) - - ## [3.3.4](https://github.com/forcedotcom/sfdx-core/compare/v3.3.3...v3.3.4) (2021-07-26) - ### Bug Fixes -* remove bad validator function ([1b97dc6](https://github.com/forcedotcom/sfdx-core/commit/1b97dc6f4d657a5b86489d33c4843ebfd54b3715)) - - +- remove bad validator function ([1b97dc6](https://github.com/forcedotcom/sfdx-core/commit/1b97dc6f4d657a5b86489d33c4843ebfd54b3715)) ## [3.3.3](https://github.com/forcedotcom/sfdx-core/compare/v3.3.2...v3.3.3) (2021-07-22) - ### Bug Fixes -* write sf.json contents on init ([c47f649](https://github.com/forcedotcom/sfdx-core/commit/c47f64954118d0d2f7f4a8e992d3450516239084)) - - +- write sf.json contents on init ([c47f649](https://github.com/forcedotcom/sfdx-core/commit/c47f64954118d0d2f7f4a8e992d3450516239084)) ## [3.3.2](https://github.com/forcedotcom/sfdx-core/compare/v2.26.1...v3.3.2) (2021-07-21) - ### Bug Fixes -* correct jsdoc ([a362e94](https://github.com/forcedotcom/sfdx-core/commit/a362e94c4ae7538cbbcd7dae8fcd3244629d845c)) - - +- correct jsdoc ([a362e94](https://github.com/forcedotcom/sfdx-core/commit/a362e94c4ae7538cbbcd7dae8fcd3244629d845c)) ## [3.3.1](https://github.com/forcedotcom/sfdx-core/compare/v3.3.0...v3.3.1) (2021-07-15) - ### Bug Fixes -* temporarily point Alias back to .sfdx ([#438](https://github.com/forcedotcom/sfdx-core/issues/438)) ([4bffcd8](https://github.com/forcedotcom/sfdx-core/commit/4bffcd84362d5b3049ef428e90dc1b538a435f81)) - - +- temporarily point Alias back to .sfdx ([#438](https://github.com/forcedotcom/sfdx-core/issues/438)) ([4bffcd8](https://github.com/forcedotcom/sfdx-core/commit/4bffcd84362d5b3049ef428e90dc1b538a435f81)) # [3.3.0](https://github.com/forcedotcom/sfdx-core/compare/v3.2.0-v3.0...v3.3.0) (2021-07-14) - ### Features -* V3 merge ([#436](https://github.com/forcedotcom/sfdx-core/issues/436)) ([1193449](https://github.com/forcedotcom/sfdx-core/commit/119344969147679088e30bae4c4fc5e941661078)), closes [#413](https://github.com/forcedotcom/sfdx-core/issues/413) [#415](https://github.com/forcedotcom/sfdx-core/issues/415) [#428](https://github.com/forcedotcom/sfdx-core/issues/428) [#429](https://github.com/forcedotcom/sfdx-core/issues/429) [#427](https://github.com/forcedotcom/sfdx-core/issues/427) [#432](https://github.com/forcedotcom/sfdx-core/issues/432) - - +- V3 merge ([#436](https://github.com/forcedotcom/sfdx-core/issues/436)) ([1193449](https://github.com/forcedotcom/sfdx-core/commit/119344969147679088e30bae4c4fc5e941661078)), closes [#413](https://github.com/forcedotcom/sfdx-core/issues/413) [#415](https://github.com/forcedotcom/sfdx-core/issues/415) [#428](https://github.com/forcedotcom/sfdx-core/issues/428) [#429](https://github.com/forcedotcom/sfdx-core/issues/429) [#427](https://github.com/forcedotcom/sfdx-core/issues/427) [#432](https://github.com/forcedotcom/sfdx-core/issues/432) # [3.2.0-v3.0](https://github.com/forcedotcom/sfdx-core/compare/v2.26.0...v3.2.0-v3.0) (2021-07-14) - ### Features -* use .sf/config.json @W-9546117@ ([#433](https://github.com/forcedotcom/sfdx-core/issues/433)) ([6c41653](https://github.com/forcedotcom/sfdx-core/commit/6c416531a9bae10e855ded3efc289a99196bc26b)) - - +- use .sf/config.json @W-9546117@ ([#433](https://github.com/forcedotcom/sfdx-core/issues/433)) ([6c41653](https://github.com/forcedotcom/sfdx-core/commit/6c416531a9bae10e855ded3efc289a99196bc26b)) ## [3.1.1-v3.2](https://github.com/forcedotcom/sfdx-core/compare/v2.24.2...v3.1.1-v3.2) (2021-06-29) - ### Bug Fixes -* do not use function prop ([#426](https://github.com/forcedotcom/sfdx-core/issues/426)) ([39efe0c](https://github.com/forcedotcom/sfdx-core/commit/39efe0ccc84b05bc891e54b24bfcddc62790ae0e)) - - +- do not use function prop ([#426](https://github.com/forcedotcom/sfdx-core/issues/426)) ([39efe0c](https://github.com/forcedotcom/sfdx-core/commit/39efe0ccc84b05bc891e54b24bfcddc62790ae0e)) ## [3.1.1-v3.1](https://github.com/forcedotcom/sfdx-core/compare/v2.24.0...v3.1.1-v3.1) (2021-06-14) - ### Bug Fixes -* keep track of auth changes ([210be6c](https://github.com/forcedotcom/sfdx-core/commit/210be6cb408bd9ecc861989570df0e14f6a3a566)) - - +- keep track of auth changes ([210be6c](https://github.com/forcedotcom/sfdx-core/commit/210be6cb408bd9ecc861989570df0e14f6a3a566)) ## [3.1.1-v3.0](https://github.com/forcedotcom/sfdx-core/compare/v2.23.3...v3.1.1-v3.0) (2021-06-03) - ### Bug Fixes -* compilation errors ([33a9876](https://github.com/forcedotcom/sfdx-core/commit/33a9876575eff7944bb287d428f52413831725d9)) -* unit test failures ([4507575](https://github.com/forcedotcom/sfdx-core/commit/45075754175d411b6cb71eb809096e6eb3e23d95)) -* unsetAuthorization ([#399](https://github.com/forcedotcom/sfdx-core/issues/399)) ([dd57438](https://github.com/forcedotcom/sfdx-core/commit/dd57438a95b49515f560d3b915cdf916a4b8643b)) - +- compilation errors ([33a9876](https://github.com/forcedotcom/sfdx-core/commit/33a9876575eff7944bb287d428f52413831725d9)) +- unit test failures ([4507575](https://github.com/forcedotcom/sfdx-core/commit/45075754175d411b6cb71eb809096e6eb3e23d95)) +- unsetAuthorization ([#399](https://github.com/forcedotcom/sfdx-core/issues/399)) ([dd57438](https://github.com/forcedotcom/sfdx-core/commit/dd57438a95b49515f560d3b915cdf916a4b8643b)) ### Features -* add GlobalInfo config file ([#397](https://github.com/forcedotcom/sfdx-core/issues/397)) ([889425c](https://github.com/forcedotcom/sfdx-core/commit/889425c06e8ed6a364d9a2bc3dd5ef0a38a66046)) -* add message support for markdown files ([0f235a2](https://github.com/forcedotcom/sfdx-core/commit/0f235a23d5dddbd7b3f07544d8c7e380875c6c55)) -* move crypto to config file @W-9225317@ ([#406](https://github.com/forcedotcom/sfdx-core/issues/406)) ([bac83c3](https://github.com/forcedotcom/sfdx-core/commit/bac83c3a52b15c9b462dfb68be9d080e710493cd)) - - +- add GlobalInfo config file ([#397](https://github.com/forcedotcom/sfdx-core/issues/397)) ([889425c](https://github.com/forcedotcom/sfdx-core/commit/889425c06e8ed6a364d9a2bc3dd5ef0a38a66046)) +- add message support for markdown files ([0f235a2](https://github.com/forcedotcom/sfdx-core/commit/0f235a23d5dddbd7b3f07544d8c7e380875c6c55)) +- move crypto to config file @W-9225317@ ([#406](https://github.com/forcedotcom/sfdx-core/issues/406)) ([bac83c3](https://github.com/forcedotcom/sfdx-core/commit/bac83c3a52b15c9b462dfb68be9d080e710493cd)) ## [2.35.1](https://github.com/forcedotcom/sfdx-core/compare/v3.7.4...v2.35.1) (2022-02-10) - ### Bug Fixes -* add error message on failed settings deploy ([e218b1e](https://github.com/forcedotcom/sfdx-core/commit/e218b1e40414ea9e4fec256b74224626d96eff4a)) -* prefer instanceUrl for loginUrl on user:create ([#518](https://github.com/forcedotcom/sfdx-core/issues/518)) ([c070a87](https://github.com/forcedotcom/sfdx-core/commit/c070a871861409dea722e85845eeb91f262ab66f)) - - +- add error message on failed settings deploy ([e218b1e](https://github.com/forcedotcom/sfdx-core/commit/e218b1e40414ea9e4fec256b74224626d96eff4a)) +- prefer instanceUrl for loginUrl on user:create ([#518](https://github.com/forcedotcom/sfdx-core/issues/518)) ([c070a87](https://github.com/forcedotcom/sfdx-core/commit/c070a871861409dea722e85845eeb91f262ab66f)) # [2.35.0](https://github.com/forcedotcom/sfdx-core/compare/v2.34.2...v2.35.0) (2022-01-25) - ### Bug Fixes -* jsforce dep and pjson version realign ([#516](https://github.com/forcedotcom/sfdx-core/issues/516)) ([9f35f2f](https://github.com/forcedotcom/sfdx-core/commit/9f35f2f0ce30e996a0b4c88461c2babb536c33f7)) - - +- jsforce dep and pjson version realign ([#516](https://github.com/forcedotcom/sfdx-core/issues/516)) ([9f35f2f](https://github.com/forcedotcom/sfdx-core/commit/9f35f2f0ce30e996a0b4c88461c2babb536c33f7)) ## [2.34.2](https://github.com/forcedotcom/sfdx-core/compare/v2.33.2...v2.34.2) (2022-01-25) - - ## [2.33.2](https://github.com/forcedotcom/sfdx-core/compare/v3.7.3...v2.33.2) (2022-01-25) - ### Bug Fixes -* correct import declaration ([4c69d2d](https://github.com/forcedotcom/sfdx-core/commit/4c69d2dc3370c5f920becfe260ccb178279e4d92)) -* exit deploy loop with error on status SucceededPartial ([492e891](https://github.com/forcedotcom/sfdx-core/commit/492e89184e4c865cc7fcf7df41b9c6af6a6f2237)) -* refresh auth on a connection, too ([ff32a70](https://github.com/forcedotcom/sfdx-core/commit/ff32a705d87d6e410d06597eefa407b54eeb215d)) -* remove unwanted dep ([12ccc3a](https://github.com/forcedotcom/sfdx-core/commit/12ccc3adc0efbe687059187ab4d849b1741c823d)) -* save auth info ([226bbd2](https://github.com/forcedotcom/sfdx-core/commit/226bbd2dc09a7a8df5887c0ae7548c83ae19b748)) - - +- correct import declaration ([4c69d2d](https://github.com/forcedotcom/sfdx-core/commit/4c69d2dc3370c5f920becfe260ccb178279e4d92)) +- exit deploy loop with error on status SucceededPartial ([492e891](https://github.com/forcedotcom/sfdx-core/commit/492e89184e4c865cc7fcf7df41b9c6af6a6f2237)) +- refresh auth on a connection, too ([ff32a70](https://github.com/forcedotcom/sfdx-core/commit/ff32a705d87d6e410d06597eefa407b54eeb215d)) +- remove unwanted dep ([12ccc3a](https://github.com/forcedotcom/sfdx-core/commit/12ccc3adc0efbe687059187ab4d849b1741c823d)) +- save auth info ([226bbd2](https://github.com/forcedotcom/sfdx-core/commit/226bbd2dc09a7a8df5887c0ae7548c83ae19b748)) ## [2.33.1](https://github.com/forcedotcom/sfdx-core/compare/v2.33.0...v2.33.1) (2021-12-15) - ### Bug Fixes -* faye doesn't use custom stuff passed it ([b1cefc7](https://github.com/forcedotcom/sfdx-core/commit/b1cefc76afde7f0dd56ed72b5539a47c118eef63)) - - +- faye doesn't use custom stuff passed it ([b1cefc7](https://github.com/forcedotcom/sfdx-core/commit/b1cefc76afde7f0dd56ed72b5539a47c118eef63)) # [2.33.0](https://github.com/forcedotcom/sfdx-core/compare/v2.32.0...v2.33.0) (2021-12-14) - ### Features -* sandbox creation ([314dcf1](https://github.com/forcedotcom/sfdx-core/commit/314dcf164d93bd0e3a5f4763a4dfcdde7d0cb14a)) - - +- sandbox creation ([314dcf1](https://github.com/forcedotcom/sfdx-core/commit/314dcf164d93bd0e3a5f4763a4dfcdde7d0cb14a)) # [2.32.0](https://github.com/forcedotcom/sfdx-core/compare/v2.31.1...v2.32.0) (2021-12-14) - ### Bug Fixes -* no maxquery warning when records.length is 0 ([758f912](https://github.com/forcedotcom/sfdx-core/commit/758f912a23bd3e9f8d4f854f3e07682dd4d4c4aa)) - +- no maxquery warning when records.length is 0 ([758f912](https://github.com/forcedotcom/sfdx-core/commit/758f912a23bd3e9f8d4f854f3e07682dd4d4c4aa)) ### Features -* switch sfdx-faye with faye ([a0545e5](https://github.com/forcedotcom/sfdx-core/commit/a0545e57d5041c97e499f284afbd7fcb16cf2247)) - +- switch sfdx-faye with faye ([a0545e5](https://github.com/forcedotcom/sfdx-core/commit/a0545e57d5041c97e499f284afbd7fcb16cf2247)) ### Reverts -* Revert "test: added basic tests for settings" ([28e656c](https://github.com/forcedotcom/sfdx-core/commit/28e656ce6f8b8461dbc866474137829941a7bde0)) - - +- Revert "test: added basic tests for settings" ([28e656c](https://github.com/forcedotcom/sfdx-core/commit/28e656ce6f8b8461dbc866474137829941a7bde0)) ## [2.31.1](https://github.com/forcedotcom/sfdx-core/compare/v2.31.0...v2.31.1) (2021-12-06) - - # [2.31.0](https://github.com/forcedotcom/sfdx-core/compare/v2.30.1...v2.31.0) (2021-11-30) - ### Features -* bump version of jsforce ([7d89024](https://github.com/forcedotcom/sfdx-core/commit/7d89024f593968c031af22ac817efc26d00fcd54)) - - +- bump version of jsforce ([7d89024](https://github.com/forcedotcom/sfdx-core/commit/7d89024f593968c031af22ac817efc26d00fcd54)) ## [2.30.1](https://github.com/forcedotcom/sfdx-core/compare/v2.30.0...v2.30.1) (2021-11-30) - ### Bug Fixes -* better output for authUrl errors ([f3ec729](https://github.com/forcedotcom/sfdx-core/commit/f3ec7298bdbd3194d3d14bfea09f47f413669376)) - - +- better output for authUrl errors ([f3ec729](https://github.com/forcedotcom/sfdx-core/commit/f3ec7298bdbd3194d3d14bfea09f47f413669376)) # [2.30.0](https://github.com/forcedotcom/sfdx-core/compare/v2.29.0...v2.30.0) (2021-11-25) - ### Features -* delete scratch orgs and sandboxes ([#491](https://github.com/forcedotcom/sfdx-core/issues/491)) ([468c348](https://github.com/forcedotcom/sfdx-core/commit/468c348f0ecc69ddeea02927bf7a26ca660a86ca)) - - +- delete scratch orgs and sandboxes ([#491](https://github.com/forcedotcom/sfdx-core/issues/491)) ([468c348](https://github.com/forcedotcom/sfdx-core/commit/468c348f0ecc69ddeea02927bf7a26ca660a86ca)) # [2.29.0](https://github.com/forcedotcom/sfdx-core/compare/v2.28.4...v2.29.0) (2021-11-17) - ### Bug Fixes -* use correct dir structure ([e947fec](https://github.com/forcedotcom/sfdx-core/commit/e947fecf33a1c19ff80b33f7515e39d4e524f77f)) - - +- use correct dir structure ([e947fec](https://github.com/forcedotcom/sfdx-core/commit/e947fecf33a1c19ff80b33f7515e39d4e524f77f)) ## [2.28.4](https://github.com/forcedotcom/sfdx-core/compare/v2.28.3...v2.28.4) (2021-11-10) - ### Bug Fixes -* bump jsforce types and run unit tests on Windows ([#485](https://github.com/forcedotcom/sfdx-core/issues/485)) ([3952c8f](https://github.com/forcedotcom/sfdx-core/commit/3952c8fe248531a0597477ed12240f611048caba)) -* transfer listeners when upgrading the global instance to newer version ([0a40831](https://github.com/forcedotcom/sfdx-core/commit/0a408317c132548771ced0fe196178d2e9c76232)) - +- bump jsforce types and run unit tests on Windows ([#485](https://github.com/forcedotcom/sfdx-core/issues/485)) ([3952c8f](https://github.com/forcedotcom/sfdx-core/commit/3952c8fe248531a0597477ed12240f611048caba)) +- transfer listeners when upgrading the global instance to newer version ([0a40831](https://github.com/forcedotcom/sfdx-core/commit/0a408317c132548771ced0fe196178d2e9c76232)) ### Features -* cleans up old listeners from upgraded instance ([e3f2d69](https://github.com/forcedotcom/sfdx-core/commit/e3f2d69ccd5c096d37addb1b982e19354175f11a)) -* use warnings instead of process in sfdx-core ([c1f7e98](https://github.com/forcedotcom/sfdx-core/commit/c1f7e98f6b19d57da1a2ee0cdf58e449079f0ee7)) -* warning and telemetry events ([80a8039](https://github.com/forcedotcom/sfdx-core/commit/80a8039e2f686d973ddbc24c9a2980fb93928d13)) -* warning and telemetry events ([a04b293](https://github.com/forcedotcom/sfdx-core/commit/a04b29355c8ca6c7e37e071ccc159aff5e5e9ca0)) - - +- cleans up old listeners from upgraded instance ([e3f2d69](https://github.com/forcedotcom/sfdx-core/commit/e3f2d69ccd5c096d37addb1b982e19354175f11a)) +- use warnings instead of process in sfdx-core ([c1f7e98](https://github.com/forcedotcom/sfdx-core/commit/c1f7e98f6b19d57da1a2ee0cdf58e449079f0ee7)) +- warning and telemetry events ([80a8039](https://github.com/forcedotcom/sfdx-core/commit/80a8039e2f686d973ddbc24c9a2980fb93928d13)) +- warning and telemetry events ([a04b293](https://github.com/forcedotcom/sfdx-core/commit/a04b29355c8ca6c7e37e071ccc159aff5e5e9ca0)) ## [2.28.3](https://github.com/forcedotcom/sfdx-core/compare/v3.7.2...v2.28.3) (2021-11-08) - ### Bug Fixes -* fix unit test ([d903c04](https://github.com/forcedotcom/sfdx-core/commit/d903c04e5f3e4f01fccb3f00b91560c443013ddf)) -* force new release ([124bb74](https://github.com/forcedotcom/sfdx-core/commit/124bb744c5ecc28cb8babf285c6d8c3032eb7ef6)) - - +- fix unit test ([d903c04](https://github.com/forcedotcom/sfdx-core/commit/d903c04e5f3e4f01fccb3f00b91560c443013ddf)) +- force new release ([124bb74](https://github.com/forcedotcom/sfdx-core/commit/124bb744c5ecc28cb8babf285c6d8c3032eb7ef6)) ## [2.28.2](https://github.com/forcedotcom/sfdx-core/compare/v3.7.0...v2.28.2) (2021-10-13) - ### Bug Fixes -* support for .mil sandboxes ([9ef35c7](https://github.com/forcedotcom/sfdx-core/commit/9ef35c7b1ef0fe974c3bd3b89b862a436e00f7d9)) - - +- support for .mil sandboxes ([9ef35c7](https://github.com/forcedotcom/sfdx-core/commit/9ef35c7b1ef0fe974c3bd3b89b862a436e00f7d9)) ## [2.28.1](https://github.com/forcedotcom/sfdx-core/compare/v3.6.5...v2.28.1) (2021-10-06) - ### Bug Fixes -* cant use require on json as module use readFileSync instead ([3085029](https://github.com/forcedotcom/sfdx-core/commit/3085029e70d7f88e2535bf0b80240855f13abf37)) -* crmforce.mil ([e263d5d](https://github.com/forcedotcom/sfdx-core/commit/e263d5d74be9c0651e5c2676d6eec1c31fca05e4)) - - +- cant use require on json as module use readFileSync instead ([3085029](https://github.com/forcedotcom/sfdx-core/commit/3085029e70d7f88e2535bf0b80240855f13abf37)) +- crmforce.mil ([e263d5d](https://github.com/forcedotcom/sfdx-core/commit/e263d5d74be9c0651e5c2676d6eec1c31fca05e4)) # [2.28.0](https://github.com/forcedotcom/sfdx-core/compare/v3.6.1...v2.28.0) (2021-09-16) - ### Features -* add custom templates config ([3cf8a8c](https://github.com/forcedotcom/sfdx-core/commit/3cf8a8cee1e7196efced989dcca9b545e1283386)) -* add validator for custom templates config ([dd2bcfe](https://github.com/forcedotcom/sfdx-core/commit/dd2bcfe8e7fee5c5c1c6321189ec04288103d5b6)) -* update config name ([72e84bf](https://github.com/forcedotcom/sfdx-core/commit/72e84bfacef48a1c2d00a61ebbae3f632601abbd)) - - +- add custom templates config ([3cf8a8c](https://github.com/forcedotcom/sfdx-core/commit/3cf8a8cee1e7196efced989dcca9b545e1283386)) +- add validator for custom templates config ([dd2bcfe](https://github.com/forcedotcom/sfdx-core/commit/dd2bcfe8e7fee5c5c1c6321189ec04288103d5b6)) +- update config name ([72e84bf](https://github.com/forcedotcom/sfdx-core/commit/72e84bfacef48a1c2d00a61ebbae3f632601abbd)) ## [2.27.2](https://github.com/forcedotcom/sfdx-core/compare/v2.27.1...v2.27.2) (2021-08-05) - ### Bug Fixes -* improve error handling while removing config props ([eecf7b0](https://github.com/forcedotcom/sfdx-core/commit/eecf7b0d0cf14e1371dc4c5ef03a413f864b0a8b)) - - +- improve error handling while removing config props ([eecf7b0](https://github.com/forcedotcom/sfdx-core/commit/eecf7b0d0cf14e1371dc4c5ef03a413f864b0a8b)) ## [2.27.1](https://github.com/forcedotcom/sfdx-core/compare/v3.3.11...v2.27.1) (2021-08-05) +### Bug Fixes -### Bug Fixes - -* dont fail when trying to unset sf config keys ([#456](https://github.com/forcedotcom/sfdx-core/issues/456)) ([8aff9fd](https://github.com/forcedotcom/sfdx-core/commit/8aff9fd4bdb73ec20e58f5a16a8192a8eecba912)) -* improve error message when providing an invalid username ([2ab4bbd](https://github.com/forcedotcom/sfdx-core/commit/2ab4bbdefd962283d88ccb735de88c88fe189d39)) - - +- dont fail when trying to unset sf config keys ([#456](https://github.com/forcedotcom/sfdx-core/issues/456)) ([8aff9fd](https://github.com/forcedotcom/sfdx-core/commit/8aff9fd4bdb73ec20e58f5a16a8192a8eecba912)) +- improve error message when providing an invalid username ([2ab4bbd](https://github.com/forcedotcom/sfdx-core/commit/2ab4bbdefd962283d88ccb735de88c88fe189d39)) # [2.27.0](https://github.com/forcedotcom/sfdx-core/compare/v3.3.6...v2.27.0) (2021-07-29) - ### Features -* Core URL class SfdcUrl ([#420](https://github.com/forcedotcom/sfdx-core/issues/420)) ([66881ea](https://github.com/forcedotcom/sfdx-core/commit/66881eae2f30215c862ea398bfc1630d9a5898fe)) - - +- Core URL class SfdcUrl ([#420](https://github.com/forcedotcom/sfdx-core/issues/420)) ([66881ea](https://github.com/forcedotcom/sfdx-core/commit/66881eae2f30215c862ea398bfc1630d9a5898fe)) ## [2.26.1](https://github.com/forcedotcom/sfdx-core/compare/v3.3.1...v2.26.1) (2021-07-19) - ### Bug Fixes -* force:org:open force:org:open --urlonly display bug ([#439](https://github.com/forcedotcom/sfdx-core/issues/439)) ([2ea0e74](https://github.com/forcedotcom/sfdx-core/commit/2ea0e74b8bf1bff6de8af70372025cac10fc8c18)) - - +- force:org:open force:org:open --urlonly display bug ([#439](https://github.com/forcedotcom/sfdx-core/issues/439)) ([2ea0e74](https://github.com/forcedotcom/sfdx-core/commit/2ea0e74b8bf1bff6de8af70372025cac10fc8c18)) # [2.26.0](https://github.com/forcedotcom/sfdx-core/compare/v2.25.1...v2.26.0) (2021-07-13) - ### Features -* update generate password functionality ([#432](https://github.com/forcedotcom/sfdx-core/issues/432)) ([ed65e83](https://github.com/forcedotcom/sfdx-core/commit/ed65e83da3afe0d101743ee89cc7b2a7a38d5254)) - - +- update generate password functionality ([#432](https://github.com/forcedotcom/sfdx-core/issues/432)) ([ed65e83](https://github.com/forcedotcom/sfdx-core/commit/ed65e83da3afe0d101743ee89cc7b2a7a38d5254)) ## [2.25.1](https://github.com/forcedotcom/sfdx-core/compare/v3.1.1-3.2...v2.25.1) (2021-06-30) - ### Bug Fixes -* set retries to INFINITELY for polling client ([31539b4](https://github.com/forcedotcom/sfdx-core/commit/31539b4f0edd0cc1c049f70331ed5e40b8af55ea)) - - +- set retries to INFINITELY for polling client ([31539b4](https://github.com/forcedotcom/sfdx-core/commit/31539b4f0edd0cc1c049f70331ed5e40b8af55ea)) ## [3.1.1-3.2](https://github.com/forcedotcom/sfdx-core/compare/v2.25.0...v3.1.1-3.2) (2021-06-30) - ### Features -* @W-9517449@ Allow signupTargetLoginUrl to be overridden via env var ([#429](https://github.com/forcedotcom/sfdx-core/issues/429)) ([e2b8b36](https://github.com/forcedotcom/sfdx-core/commit/e2b8b36b2836b5277c83ffe22922978dc32e7b11)), closes [#427](https://github.com/forcedotcom/sfdx-core/issues/427) - - +- @W-9517449@ Allow signupTargetLoginUrl to be overridden via env var ([#429](https://github.com/forcedotcom/sfdx-core/issues/429)) ([e2b8b36](https://github.com/forcedotcom/sfdx-core/commit/e2b8b36b2836b5277c83ffe22922978dc32e7b11)), closes [#427](https://github.com/forcedotcom/sfdx-core/issues/427) ## [2.24.2](https://github.com/forcedotcom/sfdx-core/compare/v3.1.1-3.1...v2.24.2) (2021-06-23) - - ## [3.1.1-3.1](https://github.com/forcedotcom/sfdx-core/compare/v2.24.1...v3.1.1-3.1) (2021-06-23) - ### Bug Fixes -* puts some types back in dependencies ([94bea31](https://github.com/forcedotcom/sfdx-core/commit/94bea31037a41d4377faecb22bce8a2d12e95f4f)) -* rewrite polling client ([8d363d1](https://github.com/forcedotcom/sfdx-core/commit/8d363d13616f5efa944d4bb717a010add3c996b5)) - - +- puts some types back in dependencies ([94bea31](https://github.com/forcedotcom/sfdx-core/commit/94bea31037a41d4377faecb22bce8a2d12e95f4f)) +- rewrite polling client ([8d363d1](https://github.com/forcedotcom/sfdx-core/commit/8d363d13616f5efa944d4bb717a010add3c996b5)) # [2.24.0](https://github.com/forcedotcom/sfdx-core/compare/v2.23.5...v2.24.0) (2021-06-08) - ### Features -* exported function checkLightningDomain() ([#415](https://github.com/forcedotcom/sfdx-core/issues/415)) ([8e75231](https://github.com/forcedotcom/sfdx-core/commit/8e752313abf4a383a6ef18250ffac78b398987dd)) - - +- exported function checkLightningDomain() ([#415](https://github.com/forcedotcom/sfdx-core/issues/415)) ([8e75231](https://github.com/forcedotcom/sfdx-core/commit/8e752313abf4a383a6ef18250ffac78b398987dd)) ## [2.23.5](https://github.com/forcedotcom/sfdx-core/compare/v3.1.1-3.0...v2.23.5) (2021-06-07) - ### Bug Fixes -* w-9299422 (login url from config) and fs-parallelization ([043bb17](https://github.com/forcedotcom/sfdx-core/commit/043bb179dbf64f9c4522a4c0f0720ae09794227c)) - - +- w-9299422 (login url from config) and fs-parallelization ([043bb17](https://github.com/forcedotcom/sfdx-core/commit/043bb179dbf64f9c4522a4c0f0720ae09794227c)) ## [3.1.1-3.0](https://github.com/forcedotcom/sfdx-core/compare/v2.23.4...v3.1.1-3.0) (2021-06-03) - ### Bug Fixes -* works with TS4+ and jsforce types ([#413](https://github.com/forcedotcom/sfdx-core/issues/413)) ([b77cdad](https://github.com/forcedotcom/sfdx-core/commit/b77cdad56b114290b8e5fd23d968e23e7d4eedf4)) - - +- works with TS4+ and jsforce types ([#413](https://github.com/forcedotcom/sfdx-core/issues/413)) ([b77cdad](https://github.com/forcedotcom/sfdx-core/commit/b77cdad56b114290b8e5fd23d968e23e7d4eedf4)) ## [3.7.4](https://github.com/forcedotcom/sfdx-core/compare/v2.35.0...v3.7.4) (2022-02-07) - ### Bug Fixes -* pin ts to 4.4.4 and bump other deps ([#509](https://github.com/forcedotcom/sfdx-core/issues/509)) ([1c0e15c](https://github.com/forcedotcom/sfdx-core/commit/1c0e15cd9a96f03e24476c13d73b62577a535fa3)) - - +- pin ts to 4.4.4 and bump other deps ([#509](https://github.com/forcedotcom/sfdx-core/issues/509)) ([1c0e15c](https://github.com/forcedotcom/sfdx-core/commit/1c0e15cd9a96f03e24476c13d73b62577a535fa3)) ## [3.7.3](https://github.com/forcedotcom/sfdx-core/compare/v2.33.1...v3.7.3) (2021-12-16) - - ## [3.7.2](https://github.com/forcedotcom/sfdx-core/compare/v3.7.1...v3.7.2) (2021-10-28) - ### Bug Fixes -* make @types/sfdx-faye a dependendcy ([683680b](https://github.com/forcedotcom/sfdx-core/commit/683680b8133048f71d25ef4df7aa24d9700dc5e8)) - - +- make @types/sfdx-faye a dependendcy ([683680b](https://github.com/forcedotcom/sfdx-core/commit/683680b8133048f71d25ef4df7aa24d9700dc5e8)) ## [3.7.1](https://github.com/forcedotcom/sfdx-core/compare/v2.28.2...v3.7.1) (2021-10-28) - - # [3.7.0](https://github.com/forcedotcom/sfdx-core/compare/v3.6.6...v3.7.0) (2021-10-12) - ### Features -* use jsforce v2 ([#457](https://github.com/forcedotcom/sfdx-core/issues/457)) ([4a9094e](https://github.com/forcedotcom/sfdx-core/commit/4a9094e958288cdcc6c69f5d87b10a70a437d8e9)) - - +- use jsforce v2 ([#457](https://github.com/forcedotcom/sfdx-core/issues/457)) ([4a9094e](https://github.com/forcedotcom/sfdx-core/commit/4a9094e958288cdcc6c69f5d87b10a70a437d8e9)) ## [3.6.6](https://github.com/forcedotcom/sfdx-core/compare/v2.28.1...v3.6.6) (2021-10-08) - - ## [3.6.5](https://github.com/forcedotcom/sfdx-core/compare/v3.6.4...v3.6.5) (2021-09-29) - ### Bug Fixes -* add getValue to AliasAccessor ([c4b69f5](https://github.com/forcedotcom/sfdx-core/commit/c4b69f5ff38547fad640c64833291fe0c6e06a79)) - - +- add getValue to AliasAccessor ([c4b69f5](https://github.com/forcedotcom/sfdx-core/commit/c4b69f5ff38547fad640c64833291fe0c6e06a79)) ## [3.6.4](https://github.com/forcedotcom/sfdx-core/compare/v3.6.3...v3.6.4) (2021-09-23) - ### Bug Fixes -* edit the env var blurbs ([#482](https://github.com/forcedotcom/sfdx-core/issues/482)) ([bbbdb6d](https://github.com/forcedotcom/sfdx-core/commit/bbbdb6d0800015e94ce0f0c551eec8ed73dd87c6)) - - +- edit the env var blurbs ([#482](https://github.com/forcedotcom/sfdx-core/issues/482)) ([bbbdb6d](https://github.com/forcedotcom/sfdx-core/commit/bbbdb6d0800015e94ce0f0c551eec8ed73dd87c6)) ## [3.6.3](https://github.com/forcedotcom/sfdx-core/compare/v3.6.2...v3.6.3) (2021-09-23) - ### Bug Fixes -* edit the config var blurbs ([#480](https://github.com/forcedotcom/sfdx-core/issues/480)) ([f845512](https://github.com/forcedotcom/sfdx-core/commit/f8455121bfd96f27495bc124dc06570632dfce70)) - - +- edit the config var blurbs ([#480](https://github.com/forcedotcom/sfdx-core/issues/480)) ([f845512](https://github.com/forcedotcom/sfdx-core/commit/f8455121bfd96f27495bc124dc06570632dfce70)) ## [3.6.2](https://github.com/forcedotcom/sfdx-core/compare/v2.28.0...v3.6.2) (2021-09-17) - ### Bug Fixes -* improve time to build auths for many orgs @W-9914839@ ([#478](https://github.com/forcedotcom/sfdx-core/issues/478)) ([c788541](https://github.com/forcedotcom/sfdx-core/commit/c7885415d59994b28552227f0b84dcee5d3ec7cf)) - - +- improve time to build auths for many orgs @W-9914839@ ([#478](https://github.com/forcedotcom/sfdx-core/issues/478)) ([c788541](https://github.com/forcedotcom/sfdx-core/commit/c7885415d59994b28552227f0b84dcee5d3ec7cf)) ## [3.6.1](https://github.com/forcedotcom/sfdx-core/compare/v3.6.0...v3.6.1) (2021-09-13) - ### Bug Fixes -* remove tokens associated with org ([#477](https://github.com/forcedotcom/sfdx-core/issues/477)) ([5034fa2](https://github.com/forcedotcom/sfdx-core/commit/5034fa2d4c52d347c00499e137a71366e4feba7f)) - - +- remove tokens associated with org ([#477](https://github.com/forcedotcom/sfdx-core/issues/477)) ([5034fa2](https://github.com/forcedotcom/sfdx-core/commit/5034fa2d4c52d347c00499e137a71366e4feba7f)) # [3.6.0](https://github.com/forcedotcom/sfdx-core/compare/v3.5.0...v3.6.0) (2021-09-10) - ### Features -* add help section helper ([#474](https://github.com/forcedotcom/sfdx-core/issues/474)) ([b34c2d7](https://github.com/forcedotcom/sfdx-core/commit/b34c2d7a442aed2cf091fd394a7c3656287d1dbf)) - - +- add help section helper ([#474](https://github.com/forcedotcom/sfdx-core/issues/474)) ([b34c2d7](https://github.com/forcedotcom/sfdx-core/commit/b34c2d7a442aed2cf091fd394a7c3656287d1dbf)) # [3.5.0](https://github.com/forcedotcom/sfdx-core/compare/v3.4.5...v3.5.0) (2021-09-09) - ### Features -* expose well known env vars as part of core ([#473](https://github.com/forcedotcom/sfdx-core/issues/473)) ([11c3f53](https://github.com/forcedotcom/sfdx-core/commit/11c3f53f964459072826274e6ebb33d4a9ecb990)) - - +- expose well known env vars as part of core ([#473](https://github.com/forcedotcom/sfdx-core/issues/473)) ([11c3f53](https://github.com/forcedotcom/sfdx-core/commit/11c3f53f964459072826274e6ebb33d4a9ecb990)) ## [3.4.5](https://github.com/forcedotcom/sfdx-core/compare/v3.4.4...v3.4.5) (2021-09-03) - ### Bug Fixes -* provide the correct options to SfdxConfig ([fa2117e](https://github.com/forcedotcom/sfdx-core/commit/fa2117e12d7a903f26067bdcf35d7ec9c142101e)) - - +- provide the correct options to SfdxConfig ([fa2117e](https://github.com/forcedotcom/sfdx-core/commit/fa2117e12d7a903f26067bdcf35d7ec9c142101e)) ## [3.4.4](https://github.com/forcedotcom/sfdx-core/compare/v3.4.3...v3.4.4) (2021-09-03) - - ## [3.4.3](https://github.com/forcedotcom/sfdx-core/compare/v3.4.2...v3.4.3) (2021-08-26) - - ## [3.4.2](https://github.com/forcedotcom/sfdx-core/compare/v3.4.1...v3.4.2) (2021-08-17) - ### Bug Fixes -* improve interoperability when unsetting ([#467](https://github.com/forcedotcom/sfdx-core/issues/467)) ([ad781d5](https://github.com/forcedotcom/sfdx-core/commit/ad781d5378652dfd64ccb476c11f418e940b8669)) - - +- improve interoperability when unsetting ([#467](https://github.com/forcedotcom/sfdx-core/issues/467)) ([ad781d5](https://github.com/forcedotcom/sfdx-core/commit/ad781d5378652dfd64ccb476c11f418e940b8669)) ## [3.4.1](https://github.com/forcedotcom/sfdx-core/compare/v3.4.0...v3.4.1) (2021-08-11) - ### Bug Fixes -* optionally throw error when reading deprecated config key ([#466](https://github.com/forcedotcom/sfdx-core/issues/466)) ([3118ad8](https://github.com/forcedotcom/sfdx-core/commit/3118ad836db384ac27c2b1db88c4753e6121e4db)) - - +- optionally throw error when reading deprecated config key ([#466](https://github.com/forcedotcom/sfdx-core/issues/466)) ([3118ad8](https://github.com/forcedotcom/sfdx-core/commit/3118ad836db384ac27c2b1db88c4753e6121e4db)) # [3.4.0](https://github.com/forcedotcom/sfdx-core/compare/v3.3.12...v3.4.0) (2021-08-11) - ### Features -* config interoperability ([#461](https://github.com/forcedotcom/sfdx-core/issues/461)) ([11b60ad](https://github.com/forcedotcom/sfdx-core/commit/11b60adbe54acc8e16a90327c77abbe2613fbaab)) - - +- config interoperability ([#461](https://github.com/forcedotcom/sfdx-core/issues/461)) ([11b60ad](https://github.com/forcedotcom/sfdx-core/commit/11b60adbe54acc8e16a90327c77abbe2613fbaab)) ## [3.3.12](https://github.com/forcedotcom/sfdx-core/compare/v2.27.2...v3.3.12) (2021-08-10) - ### Bug Fixes -* add predicate function to list all auths ([ccdb02c](https://github.com/forcedotcom/sfdx-core/commit/ccdb02c268fae7532b23e0c791bcdd831f77cf98)) - - +- add predicate function to list all auths ([ccdb02c](https://github.com/forcedotcom/sfdx-core/commit/ccdb02c268fae7532b23e0c791bcdd831f77cf98)) ## [3.3.11](https://github.com/forcedotcom/sfdx-core/compare/v3.3.10...v3.3.11) (2021-08-04) - ### Bug Fixes -* allows for message keys of error and errors ([#455](https://github.com/forcedotcom/sfdx-core/issues/455)) ([3bfac58](https://github.com/forcedotcom/sfdx-core/commit/3bfac587c6cf1734af6f2b517439d278591ddd50)) - - +- allows for message keys of error and errors ([#455](https://github.com/forcedotcom/sfdx-core/issues/455)) ([3bfac58](https://github.com/forcedotcom/sfdx-core/commit/3bfac587c6cf1734af6f2b517439d278591ddd50)) ## [3.3.10](https://github.com/forcedotcom/sfdx-core/compare/v3.3.9...v3.3.10) (2021-08-04) - - ## [3.3.9](https://github.com/forcedotcom/sfdx-core/compare/v3.3.8...v3.3.9) (2021-08-04) - ### Bug Fixes -* merge main(v2) into v3 ([#452](https://github.com/forcedotcom/sfdx-core/issues/452)) ([3a003b9](https://github.com/forcedotcom/sfdx-core/commit/3a003b9c17962f77344e4a23314bb608e1ae50db)) - - +- merge main(v2) into v3 ([#452](https://github.com/forcedotcom/sfdx-core/issues/452)) ([3a003b9](https://github.com/forcedotcom/sfdx-core/commit/3a003b9c17962f77344e4a23314bb608e1ae50db)) ## [3.3.8](https://github.com/forcedotcom/sfdx-core/compare/v3.3.7...v3.3.8) (2021-08-02) - ### Bug Fixes -* return all info from AuthInfo.listAllAuthorizations ([#449](https://github.com/forcedotcom/sfdx-core/issues/449)) ([17e60ea](https://github.com/forcedotcom/sfdx-core/commit/17e60eabe87c73a83c26344967076f365ddea81c)) - - +- return all info from AuthInfo.listAllAuthorizations ([#449](https://github.com/forcedotcom/sfdx-core/issues/449)) ([17e60ea](https://github.com/forcedotcom/sfdx-core/commit/17e60eabe87c73a83c26344967076f365ddea81c)) ## [3.3.7](https://github.com/forcedotcom/sfdx-core/compare/v2.27.0...v3.3.7) (2021-07-30) - - ## [3.3.6](https://github.com/forcedotcom/sfdx-core/compare/v3.3.5...v3.3.6) (2021-07-28) - ### Bug Fixes -* use correct method to get username ([#446](https://github.com/forcedotcom/sfdx-core/issues/446)) ([79a6b2f](https://github.com/forcedotcom/sfdx-core/commit/79a6b2f069f95b0c50a6c03ecbac07cf0d1832b1)) - - +- use correct method to get username ([#446](https://github.com/forcedotcom/sfdx-core/issues/446)) ([79a6b2f](https://github.com/forcedotcom/sfdx-core/commit/79a6b2f069f95b0c50a6c03ecbac07cf0d1832b1)) ## [3.3.5](https://github.com/forcedotcom/sfdx-core/compare/v3.3.4...v3.3.5) (2021-07-28) - - ## [3.3.4](https://github.com/forcedotcom/sfdx-core/compare/v3.3.3...v3.3.4) (2021-07-26) - ### Bug Fixes -* remove bad validator function ([1b97dc6](https://github.com/forcedotcom/sfdx-core/commit/1b97dc6f4d657a5b86489d33c4843ebfd54b3715)) - - +- remove bad validator function ([1b97dc6](https://github.com/forcedotcom/sfdx-core/commit/1b97dc6f4d657a5b86489d33c4843ebfd54b3715)) ## [3.3.3](https://github.com/forcedotcom/sfdx-core/compare/v3.3.2...v3.3.3) (2021-07-22) - ### Bug Fixes -* write sf.json contents on init ([c47f649](https://github.com/forcedotcom/sfdx-core/commit/c47f64954118d0d2f7f4a8e992d3450516239084)) - - +- write sf.json contents on init ([c47f649](https://github.com/forcedotcom/sfdx-core/commit/c47f64954118d0d2f7f4a8e992d3450516239084)) ## [3.3.2](https://github.com/forcedotcom/sfdx-core/compare/v2.26.1...v3.3.2) (2021-07-21) - ### Bug Fixes -* correct jsdoc ([a362e94](https://github.com/forcedotcom/sfdx-core/commit/a362e94c4ae7538cbbcd7dae8fcd3244629d845c)) - - +- correct jsdoc ([a362e94](https://github.com/forcedotcom/sfdx-core/commit/a362e94c4ae7538cbbcd7dae8fcd3244629d845c)) ## [3.3.1](https://github.com/forcedotcom/sfdx-core/compare/v3.3.0...v3.3.1) (2021-07-15) - ### Bug Fixes -* temporarily point Alias back to .sfdx ([#438](https://github.com/forcedotcom/sfdx-core/issues/438)) ([4bffcd8](https://github.com/forcedotcom/sfdx-core/commit/4bffcd84362d5b3049ef428e90dc1b538a435f81)) - - +- temporarily point Alias back to .sfdx ([#438](https://github.com/forcedotcom/sfdx-core/issues/438)) ([4bffcd8](https://github.com/forcedotcom/sfdx-core/commit/4bffcd84362d5b3049ef428e90dc1b538a435f81)) # [3.3.0](https://github.com/forcedotcom/sfdx-core/compare/v3.2.0-v3.0...v3.3.0) (2021-07-14) - ### Features -* V3 merge ([#436](https://github.com/forcedotcom/sfdx-core/issues/436)) ([1193449](https://github.com/forcedotcom/sfdx-core/commit/119344969147679088e30bae4c4fc5e941661078)), closes [#413](https://github.com/forcedotcom/sfdx-core/issues/413) [#415](https://github.com/forcedotcom/sfdx-core/issues/415) [#428](https://github.com/forcedotcom/sfdx-core/issues/428) [#429](https://github.com/forcedotcom/sfdx-core/issues/429) [#427](https://github.com/forcedotcom/sfdx-core/issues/427) [#432](https://github.com/forcedotcom/sfdx-core/issues/432) - - +- V3 merge ([#436](https://github.com/forcedotcom/sfdx-core/issues/436)) ([1193449](https://github.com/forcedotcom/sfdx-core/commit/119344969147679088e30bae4c4fc5e941661078)), closes [#413](https://github.com/forcedotcom/sfdx-core/issues/413) [#415](https://github.com/forcedotcom/sfdx-core/issues/415) [#428](https://github.com/forcedotcom/sfdx-core/issues/428) [#429](https://github.com/forcedotcom/sfdx-core/issues/429) [#427](https://github.com/forcedotcom/sfdx-core/issues/427) [#432](https://github.com/forcedotcom/sfdx-core/issues/432) # [3.2.0-v3.0](https://github.com/forcedotcom/sfdx-core/compare/v2.26.0...v3.2.0-v3.0) (2021-07-14) - ### Features -* use .sf/config.json @W-9546117@ ([#433](https://github.com/forcedotcom/sfdx-core/issues/433)) ([6c41653](https://github.com/forcedotcom/sfdx-core/commit/6c416531a9bae10e855ded3efc289a99196bc26b)) - - +- use .sf/config.json @W-9546117@ ([#433](https://github.com/forcedotcom/sfdx-core/issues/433)) ([6c41653](https://github.com/forcedotcom/sfdx-core/commit/6c416531a9bae10e855ded3efc289a99196bc26b)) ## [3.1.1-v3.2](https://github.com/forcedotcom/sfdx-core/compare/v2.24.2...v3.1.1-v3.2) (2021-06-29) - ### Bug Fixes -* do not use function prop ([#426](https://github.com/forcedotcom/sfdx-core/issues/426)) ([39efe0c](https://github.com/forcedotcom/sfdx-core/commit/39efe0ccc84b05bc891e54b24bfcddc62790ae0e)) - - +- do not use function prop ([#426](https://github.com/forcedotcom/sfdx-core/issues/426)) ([39efe0c](https://github.com/forcedotcom/sfdx-core/commit/39efe0ccc84b05bc891e54b24bfcddc62790ae0e)) ## [3.1.1-v3.1](https://github.com/forcedotcom/sfdx-core/compare/v2.24.0...v3.1.1-v3.1) (2021-06-14) - ### Bug Fixes -* keep track of auth changes ([210be6c](https://github.com/forcedotcom/sfdx-core/commit/210be6cb408bd9ecc861989570df0e14f6a3a566)) - - +- keep track of auth changes ([210be6c](https://github.com/forcedotcom/sfdx-core/commit/210be6cb408bd9ecc861989570df0e14f6a3a566)) ## [3.1.1-v3.0](https://github.com/forcedotcom/sfdx-core/compare/v2.23.3...v3.1.1-v3.0) (2021-06-03) - ### Bug Fixes -* compilation errors ([33a9876](https://github.com/forcedotcom/sfdx-core/commit/33a9876575eff7944bb287d428f52413831725d9)) -* unit test failures ([4507575](https://github.com/forcedotcom/sfdx-core/commit/45075754175d411b6cb71eb809096e6eb3e23d95)) -* unsetAuthorization ([#399](https://github.com/forcedotcom/sfdx-core/issues/399)) ([dd57438](https://github.com/forcedotcom/sfdx-core/commit/dd57438a95b49515f560d3b915cdf916a4b8643b)) - +- compilation errors ([33a9876](https://github.com/forcedotcom/sfdx-core/commit/33a9876575eff7944bb287d428f52413831725d9)) +- unit test failures ([4507575](https://github.com/forcedotcom/sfdx-core/commit/45075754175d411b6cb71eb809096e6eb3e23d95)) +- unsetAuthorization ([#399](https://github.com/forcedotcom/sfdx-core/issues/399)) ([dd57438](https://github.com/forcedotcom/sfdx-core/commit/dd57438a95b49515f560d3b915cdf916a4b8643b)) ### Features -* add GlobalInfo config file ([#397](https://github.com/forcedotcom/sfdx-core/issues/397)) ([889425c](https://github.com/forcedotcom/sfdx-core/commit/889425c06e8ed6a364d9a2bc3dd5ef0a38a66046)) -* add message support for markdown files ([0f235a2](https://github.com/forcedotcom/sfdx-core/commit/0f235a23d5dddbd7b3f07544d8c7e380875c6c55)) -* move crypto to config file @W-9225317@ ([#406](https://github.com/forcedotcom/sfdx-core/issues/406)) ([bac83c3](https://github.com/forcedotcom/sfdx-core/commit/bac83c3a52b15c9b462dfb68be9d080e710493cd)) - - +- add GlobalInfo config file ([#397](https://github.com/forcedotcom/sfdx-core/issues/397)) ([889425c](https://github.com/forcedotcom/sfdx-core/commit/889425c06e8ed6a364d9a2bc3dd5ef0a38a66046)) +- add message support for markdown files ([0f235a2](https://github.com/forcedotcom/sfdx-core/commit/0f235a23d5dddbd7b3f07544d8c7e380875c6c55)) +- move crypto to config file @W-9225317@ ([#406](https://github.com/forcedotcom/sfdx-core/issues/406)) ([bac83c3](https://github.com/forcedotcom/sfdx-core/commit/bac83c3a52b15c9b462dfb68be9d080e710493cd)) # [2.35.0](https://github.com/forcedotcom/sfdx-core/compare/v2.34.2...v2.35.0) (2022-01-25) - ### Bug Fixes -* jsforce dep and pjson version realign ([#516](https://github.com/forcedotcom/sfdx-core/issues/516)) ([9f35f2f](https://github.com/forcedotcom/sfdx-core/commit/9f35f2f0ce30e996a0b4c88461c2babb536c33f7)) -* refresh auth on a connection, too ([ff32a70](https://github.com/forcedotcom/sfdx-core/commit/ff32a705d87d6e410d06597eefa407b54eeb215d)) - - +- jsforce dep and pjson version realign ([#516](https://github.com/forcedotcom/sfdx-core/issues/516)) ([9f35f2f](https://github.com/forcedotcom/sfdx-core/commit/9f35f2f0ce30e996a0b4c88461c2babb536c33f7)) +- refresh auth on a connection, too ([ff32a70](https://github.com/forcedotcom/sfdx-core/commit/ff32a705d87d6e410d06597eefa407b54eeb215d)) ## [2.34.2](https://github.com/forcedotcom/sfdx-core/compare/v2.33.2...v2.34.2) (2022-01-25) - - ## [2.33.2](https://github.com/forcedotcom/sfdx-core/compare/v3.7.3...v2.33.2) (2022-01-25) - ### Bug Fixes -* correct import declaration ([4c69d2d](https://github.com/forcedotcom/sfdx-core/commit/4c69d2dc3370c5f920becfe260ccb178279e4d92)) -* exit deploy loop with error on status SucceededPartial ([492e891](https://github.com/forcedotcom/sfdx-core/commit/492e89184e4c865cc7fcf7df41b9c6af6a6f2237)) -* remove unwanted dep ([12ccc3a](https://github.com/forcedotcom/sfdx-core/commit/12ccc3adc0efbe687059187ab4d849b1741c823d)) -* save auth info ([226bbd2](https://github.com/forcedotcom/sfdx-core/commit/226bbd2dc09a7a8df5887c0ae7548c83ae19b748)) - - +- correct import declaration ([4c69d2d](https://github.com/forcedotcom/sfdx-core/commit/4c69d2dc3370c5f920becfe260ccb178279e4d92)) +- exit deploy loop with error on status SucceededPartial ([492e891](https://github.com/forcedotcom/sfdx-core/commit/492e89184e4c865cc7fcf7df41b9c6af6a6f2237)) +- remove unwanted dep ([12ccc3a](https://github.com/forcedotcom/sfdx-core/commit/12ccc3adc0efbe687059187ab4d849b1741c823d)) +- save auth info ([226bbd2](https://github.com/forcedotcom/sfdx-core/commit/226bbd2dc09a7a8df5887c0ae7548c83ae19b748)) ## [2.33.1](https://github.com/forcedotcom/sfdx-core/compare/v2.33.0...v2.33.1) (2021-12-15) - ### Bug Fixes -* faye doesn't use custom stuff passed it ([b1cefc7](https://github.com/forcedotcom/sfdx-core/commit/b1cefc76afde7f0dd56ed72b5539a47c118eef63)) - - +- faye doesn't use custom stuff passed it ([b1cefc7](https://github.com/forcedotcom/sfdx-core/commit/b1cefc76afde7f0dd56ed72b5539a47c118eef63)) # [2.33.0](https://github.com/forcedotcom/sfdx-core/compare/v2.32.0...v2.33.0) (2021-12-14) - ### Features -* sandbox creation ([314dcf1](https://github.com/forcedotcom/sfdx-core/commit/314dcf164d93bd0e3a5f4763a4dfcdde7d0cb14a)) - - +- sandbox creation ([314dcf1](https://github.com/forcedotcom/sfdx-core/commit/314dcf164d93bd0e3a5f4763a4dfcdde7d0cb14a)) # [2.32.0](https://github.com/forcedotcom/sfdx-core/compare/v2.31.1...v2.32.0) (2021-12-14) - ### Bug Fixes -* no maxquery warning when records.length is 0 ([758f912](https://github.com/forcedotcom/sfdx-core/commit/758f912a23bd3e9f8d4f854f3e07682dd4d4c4aa)) - +- no maxquery warning when records.length is 0 ([758f912](https://github.com/forcedotcom/sfdx-core/commit/758f912a23bd3e9f8d4f854f3e07682dd4d4c4aa)) ### Features -* switch sfdx-faye with faye ([a0545e5](https://github.com/forcedotcom/sfdx-core/commit/a0545e57d5041c97e499f284afbd7fcb16cf2247)) - +- switch sfdx-faye with faye ([a0545e5](https://github.com/forcedotcom/sfdx-core/commit/a0545e57d5041c97e499f284afbd7fcb16cf2247)) ### Reverts -* Revert "test: added basic tests for settings" ([28e656c](https://github.com/forcedotcom/sfdx-core/commit/28e656ce6f8b8461dbc866474137829941a7bde0)) - - +- Revert "test: added basic tests for settings" ([28e656c](https://github.com/forcedotcom/sfdx-core/commit/28e656ce6f8b8461dbc866474137829941a7bde0)) ## [2.31.1](https://github.com/forcedotcom/sfdx-core/compare/v2.31.0...v2.31.1) (2021-12-06) - - # [2.31.0](https://github.com/forcedotcom/sfdx-core/compare/v2.30.1...v2.31.0) (2021-11-30) - ### Features -* bump version of jsforce ([7d89024](https://github.com/forcedotcom/sfdx-core/commit/7d89024f593968c031af22ac817efc26d00fcd54)) - - +- bump version of jsforce ([7d89024](https://github.com/forcedotcom/sfdx-core/commit/7d89024f593968c031af22ac817efc26d00fcd54)) ## [2.30.1](https://github.com/forcedotcom/sfdx-core/compare/v2.30.0...v2.30.1) (2021-11-30) - ### Bug Fixes -* better output for authUrl errors ([f3ec729](https://github.com/forcedotcom/sfdx-core/commit/f3ec7298bdbd3194d3d14bfea09f47f413669376)) - - +- better output for authUrl errors ([f3ec729](https://github.com/forcedotcom/sfdx-core/commit/f3ec7298bdbd3194d3d14bfea09f47f413669376)) # [2.30.0](https://github.com/forcedotcom/sfdx-core/compare/v2.29.0...v2.30.0) (2021-11-25) - ### Features -* delete scratch orgs and sandboxes ([#491](https://github.com/forcedotcom/sfdx-core/issues/491)) ([468c348](https://github.com/forcedotcom/sfdx-core/commit/468c348f0ecc69ddeea02927bf7a26ca660a86ca)) - - +- delete scratch orgs and sandboxes ([#491](https://github.com/forcedotcom/sfdx-core/issues/491)) ([468c348](https://github.com/forcedotcom/sfdx-core/commit/468c348f0ecc69ddeea02927bf7a26ca660a86ca)) # [2.29.0](https://github.com/forcedotcom/sfdx-core/compare/v2.28.4...v2.29.0) (2021-11-17) - ### Bug Fixes -* use correct dir structure ([e947fec](https://github.com/forcedotcom/sfdx-core/commit/e947fecf33a1c19ff80b33f7515e39d4e524f77f)) - - +- use correct dir structure ([e947fec](https://github.com/forcedotcom/sfdx-core/commit/e947fecf33a1c19ff80b33f7515e39d4e524f77f)) ## [2.28.4](https://github.com/forcedotcom/sfdx-core/compare/v2.28.3...v2.28.4) (2021-11-10) - ### Bug Fixes -* bump jsforce types and run unit tests on Windows ([#485](https://github.com/forcedotcom/sfdx-core/issues/485)) ([3952c8f](https://github.com/forcedotcom/sfdx-core/commit/3952c8fe248531a0597477ed12240f611048caba)) -* transfer listeners when upgrading the global instance to newer version ([0a40831](https://github.com/forcedotcom/sfdx-core/commit/0a408317c132548771ced0fe196178d2e9c76232)) - +- bump jsforce types and run unit tests on Windows ([#485](https://github.com/forcedotcom/sfdx-core/issues/485)) ([3952c8f](https://github.com/forcedotcom/sfdx-core/commit/3952c8fe248531a0597477ed12240f611048caba)) +- transfer listeners when upgrading the global instance to newer version ([0a40831](https://github.com/forcedotcom/sfdx-core/commit/0a408317c132548771ced0fe196178d2e9c76232)) ### Features -* cleans up old listeners from upgraded instance ([e3f2d69](https://github.com/forcedotcom/sfdx-core/commit/e3f2d69ccd5c096d37addb1b982e19354175f11a)) -* use warnings instead of process in sfdx-core ([c1f7e98](https://github.com/forcedotcom/sfdx-core/commit/c1f7e98f6b19d57da1a2ee0cdf58e449079f0ee7)) -* warning and telemetry events ([80a8039](https://github.com/forcedotcom/sfdx-core/commit/80a8039e2f686d973ddbc24c9a2980fb93928d13)) -* warning and telemetry events ([a04b293](https://github.com/forcedotcom/sfdx-core/commit/a04b29355c8ca6c7e37e071ccc159aff5e5e9ca0)) - - +- cleans up old listeners from upgraded instance ([e3f2d69](https://github.com/forcedotcom/sfdx-core/commit/e3f2d69ccd5c096d37addb1b982e19354175f11a)) +- use warnings instead of process in sfdx-core ([c1f7e98](https://github.com/forcedotcom/sfdx-core/commit/c1f7e98f6b19d57da1a2ee0cdf58e449079f0ee7)) +- warning and telemetry events ([80a8039](https://github.com/forcedotcom/sfdx-core/commit/80a8039e2f686d973ddbc24c9a2980fb93928d13)) +- warning and telemetry events ([a04b293](https://github.com/forcedotcom/sfdx-core/commit/a04b29355c8ca6c7e37e071ccc159aff5e5e9ca0)) ## [2.28.3](https://github.com/forcedotcom/sfdx-core/compare/v3.7.2...v2.28.3) (2021-11-08) - ### Bug Fixes -* fix unit test ([d903c04](https://github.com/forcedotcom/sfdx-core/commit/d903c04e5f3e4f01fccb3f00b91560c443013ddf)) -* force new release ([124bb74](https://github.com/forcedotcom/sfdx-core/commit/124bb744c5ecc28cb8babf285c6d8c3032eb7ef6)) - - +- fix unit test ([d903c04](https://github.com/forcedotcom/sfdx-core/commit/d903c04e5f3e4f01fccb3f00b91560c443013ddf)) +- force new release ([124bb74](https://github.com/forcedotcom/sfdx-core/commit/124bb744c5ecc28cb8babf285c6d8c3032eb7ef6)) ## [2.28.2](https://github.com/forcedotcom/sfdx-core/compare/v3.7.0...v2.28.2) (2021-10-13) - ### Bug Fixes -* support for .mil sandboxes ([9ef35c7](https://github.com/forcedotcom/sfdx-core/commit/9ef35c7b1ef0fe974c3bd3b89b862a436e00f7d9)) - - +- support for .mil sandboxes ([9ef35c7](https://github.com/forcedotcom/sfdx-core/commit/9ef35c7b1ef0fe974c3bd3b89b862a436e00f7d9)) ## [2.28.1](https://github.com/forcedotcom/sfdx-core/compare/v3.6.5...v2.28.1) (2021-10-06) - ### Bug Fixes -* cant use require on json as module use readFileSync instead ([3085029](https://github.com/forcedotcom/sfdx-core/commit/3085029e70d7f88e2535bf0b80240855f13abf37)) -* crmforce.mil ([e263d5d](https://github.com/forcedotcom/sfdx-core/commit/e263d5d74be9c0651e5c2676d6eec1c31fca05e4)) - - +- cant use require on json as module use readFileSync instead ([3085029](https://github.com/forcedotcom/sfdx-core/commit/3085029e70d7f88e2535bf0b80240855f13abf37)) +- crmforce.mil ([e263d5d](https://github.com/forcedotcom/sfdx-core/commit/e263d5d74be9c0651e5c2676d6eec1c31fca05e4)) # [2.28.0](https://github.com/forcedotcom/sfdx-core/compare/v3.6.1...v2.28.0) (2021-09-16) - ### Features -* add custom templates config ([3cf8a8c](https://github.com/forcedotcom/sfdx-core/commit/3cf8a8cee1e7196efced989dcca9b545e1283386)) -* add validator for custom templates config ([dd2bcfe](https://github.com/forcedotcom/sfdx-core/commit/dd2bcfe8e7fee5c5c1c6321189ec04288103d5b6)) -* update config name ([72e84bf](https://github.com/forcedotcom/sfdx-core/commit/72e84bfacef48a1c2d00a61ebbae3f632601abbd)) - - +- add custom templates config ([3cf8a8c](https://github.com/forcedotcom/sfdx-core/commit/3cf8a8cee1e7196efced989dcca9b545e1283386)) +- add validator for custom templates config ([dd2bcfe](https://github.com/forcedotcom/sfdx-core/commit/dd2bcfe8e7fee5c5c1c6321189ec04288103d5b6)) +- update config name ([72e84bf](https://github.com/forcedotcom/sfdx-core/commit/72e84bfacef48a1c2d00a61ebbae3f632601abbd)) ## [2.27.2](https://github.com/forcedotcom/sfdx-core/compare/v2.27.1...v2.27.2) (2021-08-05) - ### Bug Fixes -* improve error handling while removing config props ([eecf7b0](https://github.com/forcedotcom/sfdx-core/commit/eecf7b0d0cf14e1371dc4c5ef03a413f864b0a8b)) - - +- improve error handling while removing config props ([eecf7b0](https://github.com/forcedotcom/sfdx-core/commit/eecf7b0d0cf14e1371dc4c5ef03a413f864b0a8b)) ## [2.27.1](https://github.com/forcedotcom/sfdx-core/compare/v3.3.11...v2.27.1) (2021-08-05) - ### Bug Fixes -* dont fail when trying to unset sf config keys ([#456](https://github.com/forcedotcom/sfdx-core/issues/456)) ([8aff9fd](https://github.com/forcedotcom/sfdx-core/commit/8aff9fd4bdb73ec20e58f5a16a8192a8eecba912)) -* improve error message when providing an invalid username ([2ab4bbd](https://github.com/forcedotcom/sfdx-core/commit/2ab4bbdefd962283d88ccb735de88c88fe189d39)) - - +- dont fail when trying to unset sf config keys ([#456](https://github.com/forcedotcom/sfdx-core/issues/456)) ([8aff9fd](https://github.com/forcedotcom/sfdx-core/commit/8aff9fd4bdb73ec20e58f5a16a8192a8eecba912)) +- improve error message when providing an invalid username ([2ab4bbd](https://github.com/forcedotcom/sfdx-core/commit/2ab4bbdefd962283d88ccb735de88c88fe189d39)) # [2.27.0](https://github.com/forcedotcom/sfdx-core/compare/v3.3.6...v2.27.0) (2021-07-29) - ### Features -* Core URL class SfdcUrl ([#420](https://github.com/forcedotcom/sfdx-core/issues/420)) ([66881ea](https://github.com/forcedotcom/sfdx-core/commit/66881eae2f30215c862ea398bfc1630d9a5898fe)) - - +- Core URL class SfdcUrl ([#420](https://github.com/forcedotcom/sfdx-core/issues/420)) ([66881ea](https://github.com/forcedotcom/sfdx-core/commit/66881eae2f30215c862ea398bfc1630d9a5898fe)) ## [2.26.1](https://github.com/forcedotcom/sfdx-core/compare/v3.3.1...v2.26.1) (2021-07-19) - ### Bug Fixes -* force:org:open force:org:open --urlonly display bug ([#439](https://github.com/forcedotcom/sfdx-core/issues/439)) ([2ea0e74](https://github.com/forcedotcom/sfdx-core/commit/2ea0e74b8bf1bff6de8af70372025cac10fc8c18)) - - +- force:org:open force:org:open --urlonly display bug ([#439](https://github.com/forcedotcom/sfdx-core/issues/439)) ([2ea0e74](https://github.com/forcedotcom/sfdx-core/commit/2ea0e74b8bf1bff6de8af70372025cac10fc8c18)) # [2.26.0](https://github.com/forcedotcom/sfdx-core/compare/v2.25.1...v2.26.0) (2021-07-13) - ### Features -* update generate password functionality ([#432](https://github.com/forcedotcom/sfdx-core/issues/432)) ([ed65e83](https://github.com/forcedotcom/sfdx-core/commit/ed65e83da3afe0d101743ee89cc7b2a7a38d5254)) - - +- update generate password functionality ([#432](https://github.com/forcedotcom/sfdx-core/issues/432)) ([ed65e83](https://github.com/forcedotcom/sfdx-core/commit/ed65e83da3afe0d101743ee89cc7b2a7a38d5254)) ## [2.25.1](https://github.com/forcedotcom/sfdx-core/compare/v3.1.1-3.2...v2.25.1) (2021-06-30) - ### Bug Fixes -* set retries to INFINITELY for polling client ([31539b4](https://github.com/forcedotcom/sfdx-core/commit/31539b4f0edd0cc1c049f70331ed5e40b8af55ea)) - - +- set retries to INFINITELY for polling client ([31539b4](https://github.com/forcedotcom/sfdx-core/commit/31539b4f0edd0cc1c049f70331ed5e40b8af55ea)) ## [3.1.1-3.2](https://github.com/forcedotcom/sfdx-core/compare/v2.25.0...v3.1.1-3.2) (2021-06-30) - ### Features -* @W-9517449@ Allow signupTargetLoginUrl to be overridden via env var ([#429](https://github.com/forcedotcom/sfdx-core/issues/429)) ([e2b8b36](https://github.com/forcedotcom/sfdx-core/commit/e2b8b36b2836b5277c83ffe22922978dc32e7b11)), closes [#427](https://github.com/forcedotcom/sfdx-core/issues/427) - - +- @W-9517449@ Allow signupTargetLoginUrl to be overridden via env var ([#429](https://github.com/forcedotcom/sfdx-core/issues/429)) ([e2b8b36](https://github.com/forcedotcom/sfdx-core/commit/e2b8b36b2836b5277c83ffe22922978dc32e7b11)), closes [#427](https://github.com/forcedotcom/sfdx-core/issues/427) ## [2.24.2](https://github.com/forcedotcom/sfdx-core/compare/v3.1.1-3.1...v2.24.2) (2021-06-23) - - ## [3.1.1-3.1](https://github.com/forcedotcom/sfdx-core/compare/v2.24.1...v3.1.1-3.1) (2021-06-23) - ### Bug Fixes -* puts some types back in dependencies ([94bea31](https://github.com/forcedotcom/sfdx-core/commit/94bea31037a41d4377faecb22bce8a2d12e95f4f)) -* rewrite polling client ([8d363d1](https://github.com/forcedotcom/sfdx-core/commit/8d363d13616f5efa944d4bb717a010add3c996b5)) - - +- puts some types back in dependencies ([94bea31](https://github.com/forcedotcom/sfdx-core/commit/94bea31037a41d4377faecb22bce8a2d12e95f4f)) +- rewrite polling client ([8d363d1](https://github.com/forcedotcom/sfdx-core/commit/8d363d13616f5efa944d4bb717a010add3c996b5)) # [2.24.0](https://github.com/forcedotcom/sfdx-core/compare/v2.23.5...v2.24.0) (2021-06-08) - ### Features -* exported function checkLightningDomain() ([#415](https://github.com/forcedotcom/sfdx-core/issues/415)) ([8e75231](https://github.com/forcedotcom/sfdx-core/commit/8e752313abf4a383a6ef18250ffac78b398987dd)) - - +- exported function checkLightningDomain() ([#415](https://github.com/forcedotcom/sfdx-core/issues/415)) ([8e75231](https://github.com/forcedotcom/sfdx-core/commit/8e752313abf4a383a6ef18250ffac78b398987dd)) ## [2.23.5](https://github.com/forcedotcom/sfdx-core/compare/v3.1.1-3.0...v2.23.5) (2021-06-07) - ### Bug Fixes -* w-9299422 (login url from config) and fs-parallelization ([043bb17](https://github.com/forcedotcom/sfdx-core/commit/043bb179dbf64f9c4522a4c0f0720ae09794227c)) - - +- w-9299422 (login url from config) and fs-parallelization ([043bb17](https://github.com/forcedotcom/sfdx-core/commit/043bb179dbf64f9c4522a4c0f0720ae09794227c)) ## [3.1.1-3.0](https://github.com/forcedotcom/sfdx-core/compare/v2.23.4...v3.1.1-3.0) (2021-06-03) - ### Bug Fixes -* works with TS4+ and jsforce types ([#413](https://github.com/forcedotcom/sfdx-core/issues/413)) ([b77cdad](https://github.com/forcedotcom/sfdx-core/commit/b77cdad56b114290b8e5fd23d968e23e7d4eedf4)) - - +- works with TS4+ and jsforce types ([#413](https://github.com/forcedotcom/sfdx-core/issues/413)) ([b77cdad](https://github.com/forcedotcom/sfdx-core/commit/b77cdad56b114290b8e5fd23d968e23e7d4eedf4)) ## [3.7.3](https://github.com/forcedotcom/sfdx-core/compare/v2.33.1...v3.7.3) (2021-12-16) - - ## [3.7.2](https://github.com/forcedotcom/sfdx-core/compare/v3.7.1...v3.7.2) (2021-10-28) - ### Bug Fixes -* make @types/sfdx-faye a dependendcy ([683680b](https://github.com/forcedotcom/sfdx-core/commit/683680b8133048f71d25ef4df7aa24d9700dc5e8)) - - +- make @types/sfdx-faye a dependendcy ([683680b](https://github.com/forcedotcom/sfdx-core/commit/683680b8133048f71d25ef4df7aa24d9700dc5e8)) ## [3.7.1](https://github.com/forcedotcom/sfdx-core/compare/v2.28.2...v3.7.1) (2021-10-28) - - # [3.7.0](https://github.com/forcedotcom/sfdx-core/compare/v3.6.6...v3.7.0) (2021-10-12) - ### Features -* use jsforce v2 ([#457](https://github.com/forcedotcom/sfdx-core/issues/457)) ([4a9094e](https://github.com/forcedotcom/sfdx-core/commit/4a9094e958288cdcc6c69f5d87b10a70a437d8e9)) - - +- use jsforce v2 ([#457](https://github.com/forcedotcom/sfdx-core/issues/457)) ([4a9094e](https://github.com/forcedotcom/sfdx-core/commit/4a9094e958288cdcc6c69f5d87b10a70a437d8e9)) ## [3.6.6](https://github.com/forcedotcom/sfdx-core/compare/v2.28.1...v3.6.6) (2021-10-08) - - ## [3.6.5](https://github.com/forcedotcom/sfdx-core/compare/v3.6.4...v3.6.5) (2021-09-29) - ### Bug Fixes -* add getValue to AliasAccessor ([c4b69f5](https://github.com/forcedotcom/sfdx-core/commit/c4b69f5ff38547fad640c64833291fe0c6e06a79)) - - +- add getValue to AliasAccessor ([c4b69f5](https://github.com/forcedotcom/sfdx-core/commit/c4b69f5ff38547fad640c64833291fe0c6e06a79)) ## [3.6.4](https://github.com/forcedotcom/sfdx-core/compare/v3.6.3...v3.6.4) (2021-09-23) - ### Bug Fixes -* edit the env var blurbs ([#482](https://github.com/forcedotcom/sfdx-core/issues/482)) ([bbbdb6d](https://github.com/forcedotcom/sfdx-core/commit/bbbdb6d0800015e94ce0f0c551eec8ed73dd87c6)) - - +- edit the env var blurbs ([#482](https://github.com/forcedotcom/sfdx-core/issues/482)) ([bbbdb6d](https://github.com/forcedotcom/sfdx-core/commit/bbbdb6d0800015e94ce0f0c551eec8ed73dd87c6)) ## [3.6.3](https://github.com/forcedotcom/sfdx-core/compare/v3.6.2...v3.6.3) (2021-09-23) - ### Bug Fixes -* edit the config var blurbs ([#480](https://github.com/forcedotcom/sfdx-core/issues/480)) ([f845512](https://github.com/forcedotcom/sfdx-core/commit/f8455121bfd96f27495bc124dc06570632dfce70)) - - +- edit the config var blurbs ([#480](https://github.com/forcedotcom/sfdx-core/issues/480)) ([f845512](https://github.com/forcedotcom/sfdx-core/commit/f8455121bfd96f27495bc124dc06570632dfce70)) ## [3.6.2](https://github.com/forcedotcom/sfdx-core/compare/v2.28.0...v3.6.2) (2021-09-17) - ### Bug Fixes -* improve time to build auths for many orgs @W-9914839@ ([#478](https://github.com/forcedotcom/sfdx-core/issues/478)) ([c788541](https://github.com/forcedotcom/sfdx-core/commit/c7885415d59994b28552227f0b84dcee5d3ec7cf)) - - +- improve time to build auths for many orgs @W-9914839@ ([#478](https://github.com/forcedotcom/sfdx-core/issues/478)) ([c788541](https://github.com/forcedotcom/sfdx-core/commit/c7885415d59994b28552227f0b84dcee5d3ec7cf)) ## [3.6.1](https://github.com/forcedotcom/sfdx-core/compare/v3.6.0...v3.6.1) (2021-09-13) - ### Bug Fixes -* remove tokens associated with org ([#477](https://github.com/forcedotcom/sfdx-core/issues/477)) ([5034fa2](https://github.com/forcedotcom/sfdx-core/commit/5034fa2d4c52d347c00499e137a71366e4feba7f)) - - +- remove tokens associated with org ([#477](https://github.com/forcedotcom/sfdx-core/issues/477)) ([5034fa2](https://github.com/forcedotcom/sfdx-core/commit/5034fa2d4c52d347c00499e137a71366e4feba7f)) # [3.6.0](https://github.com/forcedotcom/sfdx-core/compare/v3.5.0...v3.6.0) (2021-09-10) - ### Features -* add help section helper ([#474](https://github.com/forcedotcom/sfdx-core/issues/474)) ([b34c2d7](https://github.com/forcedotcom/sfdx-core/commit/b34c2d7a442aed2cf091fd394a7c3656287d1dbf)) - - +- add help section helper ([#474](https://github.com/forcedotcom/sfdx-core/issues/474)) ([b34c2d7](https://github.com/forcedotcom/sfdx-core/commit/b34c2d7a442aed2cf091fd394a7c3656287d1dbf)) # [3.5.0](https://github.com/forcedotcom/sfdx-core/compare/v3.4.5...v3.5.0) (2021-09-09) - ### Features -* expose well known env vars as part of core ([#473](https://github.com/forcedotcom/sfdx-core/issues/473)) ([11c3f53](https://github.com/forcedotcom/sfdx-core/commit/11c3f53f964459072826274e6ebb33d4a9ecb990)) - - +- expose well known env vars as part of core ([#473](https://github.com/forcedotcom/sfdx-core/issues/473)) ([11c3f53](https://github.com/forcedotcom/sfdx-core/commit/11c3f53f964459072826274e6ebb33d4a9ecb990)) ## [3.4.5](https://github.com/forcedotcom/sfdx-core/compare/v3.4.4...v3.4.5) (2021-09-03) - ### Bug Fixes -* provide the correct options to SfdxConfig ([fa2117e](https://github.com/forcedotcom/sfdx-core/commit/fa2117e12d7a903f26067bdcf35d7ec9c142101e)) - - +- provide the correct options to SfdxConfig ([fa2117e](https://github.com/forcedotcom/sfdx-core/commit/fa2117e12d7a903f26067bdcf35d7ec9c142101e)) ## [3.4.4](https://github.com/forcedotcom/sfdx-core/compare/v3.4.3...v3.4.4) (2021-09-03) - - -## [3.4.3](https://github.com/forcedotcom/sfdx-core/compare/v3.4.2...v3.4.3) (2021-08-26) - - +## [3.4.3](https://github.com/forcedotcom/sfdx-core/compare/v3.4.2...v3.4.3) (2021-08-26) ## [3.4.2](https://github.com/forcedotcom/sfdx-core/compare/v3.4.1...v3.4.2) (2021-08-17) - ### Bug Fixes -* improve interoperability when unsetting ([#467](https://github.com/forcedotcom/sfdx-core/issues/467)) ([ad781d5](https://github.com/forcedotcom/sfdx-core/commit/ad781d5378652dfd64ccb476c11f418e940b8669)) - - +- improve interoperability when unsetting ([#467](https://github.com/forcedotcom/sfdx-core/issues/467)) ([ad781d5](https://github.com/forcedotcom/sfdx-core/commit/ad781d5378652dfd64ccb476c11f418e940b8669)) ## [3.4.1](https://github.com/forcedotcom/sfdx-core/compare/v3.4.0...v3.4.1) (2021-08-11) - ### Bug Fixes -* optionally throw error when reading deprecated config key ([#466](https://github.com/forcedotcom/sfdx-core/issues/466)) ([3118ad8](https://github.com/forcedotcom/sfdx-core/commit/3118ad836db384ac27c2b1db88c4753e6121e4db)) - - +- optionally throw error when reading deprecated config key ([#466](https://github.com/forcedotcom/sfdx-core/issues/466)) ([3118ad8](https://github.com/forcedotcom/sfdx-core/commit/3118ad836db384ac27c2b1db88c4753e6121e4db)) # [3.4.0](https://github.com/forcedotcom/sfdx-core/compare/v3.3.12...v3.4.0) (2021-08-11) - ### Features -* config interoperability ([#461](https://github.com/forcedotcom/sfdx-core/issues/461)) ([11b60ad](https://github.com/forcedotcom/sfdx-core/commit/11b60adbe54acc8e16a90327c77abbe2613fbaab)) - - +- config interoperability ([#461](https://github.com/forcedotcom/sfdx-core/issues/461)) ([11b60ad](https://github.com/forcedotcom/sfdx-core/commit/11b60adbe54acc8e16a90327c77abbe2613fbaab)) ## [3.3.12](https://github.com/forcedotcom/sfdx-core/compare/v2.27.2...v3.3.12) (2021-08-10) - ### Bug Fixes -* add predicate function to list all auths ([ccdb02c](https://github.com/forcedotcom/sfdx-core/commit/ccdb02c268fae7532b23e0c791bcdd831f77cf98)) - - +- add predicate function to list all auths ([ccdb02c](https://github.com/forcedotcom/sfdx-core/commit/ccdb02c268fae7532b23e0c791bcdd831f77cf98)) ## [3.3.11](https://github.com/forcedotcom/sfdx-core/compare/v3.3.10...v3.3.11) (2021-08-04) - ### Bug Fixes -* allows for message keys of error and errors ([#455](https://github.com/forcedotcom/sfdx-core/issues/455)) ([3bfac58](https://github.com/forcedotcom/sfdx-core/commit/3bfac587c6cf1734af6f2b517439d278591ddd50)) - - +- allows for message keys of error and errors ([#455](https://github.com/forcedotcom/sfdx-core/issues/455)) ([3bfac58](https://github.com/forcedotcom/sfdx-core/commit/3bfac587c6cf1734af6f2b517439d278591ddd50)) ## [3.3.10](https://github.com/forcedotcom/sfdx-core/compare/v3.3.9...v3.3.10) (2021-08-04) - - ## [3.3.9](https://github.com/forcedotcom/sfdx-core/compare/v3.3.8...v3.3.9) (2021-08-04) - ### Bug Fixes -* merge main(v2) into v3 ([#452](https://github.com/forcedotcom/sfdx-core/issues/452)) ([3a003b9](https://github.com/forcedotcom/sfdx-core/commit/3a003b9c17962f77344e4a23314bb608e1ae50db)) - - +- merge main(v2) into v3 ([#452](https://github.com/forcedotcom/sfdx-core/issues/452)) ([3a003b9](https://github.com/forcedotcom/sfdx-core/commit/3a003b9c17962f77344e4a23314bb608e1ae50db)) ## [3.3.8](https://github.com/forcedotcom/sfdx-core/compare/v3.3.7...v3.3.8) (2021-08-02) - ### Bug Fixes -* return all info from AuthInfo.listAllAuthorizations ([#449](https://github.com/forcedotcom/sfdx-core/issues/449)) ([17e60ea](https://github.com/forcedotcom/sfdx-core/commit/17e60eabe87c73a83c26344967076f365ddea81c)) - - +- return all info from AuthInfo.listAllAuthorizations ([#449](https://github.com/forcedotcom/sfdx-core/issues/449)) ([17e60ea](https://github.com/forcedotcom/sfdx-core/commit/17e60eabe87c73a83c26344967076f365ddea81c)) ## [3.3.7](https://github.com/forcedotcom/sfdx-core/compare/v2.27.0...v3.3.7) (2021-07-30) - - ## [3.3.6](https://github.com/forcedotcom/sfdx-core/compare/v3.3.5...v3.3.6) (2021-07-28) - ### Bug Fixes -* use correct method to get username ([#446](https://github.com/forcedotcom/sfdx-core/issues/446)) ([79a6b2f](https://github.com/forcedotcom/sfdx-core/commit/79a6b2f069f95b0c50a6c03ecbac07cf0d1832b1)) - - +- use correct method to get username ([#446](https://github.com/forcedotcom/sfdx-core/issues/446)) ([79a6b2f](https://github.com/forcedotcom/sfdx-core/commit/79a6b2f069f95b0c50a6c03ecbac07cf0d1832b1)) ## [3.3.5](https://github.com/forcedotcom/sfdx-core/compare/v3.3.4...v3.3.5) (2021-07-28) - - ## [3.3.4](https://github.com/forcedotcom/sfdx-core/compare/v3.3.3...v3.3.4) (2021-07-26) - ### Bug Fixes -* remove bad validator function ([1b97dc6](https://github.com/forcedotcom/sfdx-core/commit/1b97dc6f4d657a5b86489d33c4843ebfd54b3715)) - - +- remove bad validator function ([1b97dc6](https://github.com/forcedotcom/sfdx-core/commit/1b97dc6f4d657a5b86489d33c4843ebfd54b3715)) ## [3.3.3](https://github.com/forcedotcom/sfdx-core/compare/v3.3.2...v3.3.3) (2021-07-22) - ### Bug Fixes -* write sf.json contents on init ([c47f649](https://github.com/forcedotcom/sfdx-core/commit/c47f64954118d0d2f7f4a8e992d3450516239084)) - - +- write sf.json contents on init ([c47f649](https://github.com/forcedotcom/sfdx-core/commit/c47f64954118d0d2f7f4a8e992d3450516239084)) ## [3.3.2](https://github.com/forcedotcom/sfdx-core/compare/v2.26.1...v3.3.2) (2021-07-21) - ### Bug Fixes -* correct jsdoc ([a362e94](https://github.com/forcedotcom/sfdx-core/commit/a362e94c4ae7538cbbcd7dae8fcd3244629d845c)) - - +- correct jsdoc ([a362e94](https://github.com/forcedotcom/sfdx-core/commit/a362e94c4ae7538cbbcd7dae8fcd3244629d845c)) ## [3.3.1](https://github.com/forcedotcom/sfdx-core/compare/v3.3.0...v3.3.1) (2021-07-15) - ### Bug Fixes -* temporarily point Alias back to .sfdx ([#438](https://github.com/forcedotcom/sfdx-core/issues/438)) ([4bffcd8](https://github.com/forcedotcom/sfdx-core/commit/4bffcd84362d5b3049ef428e90dc1b538a435f81)) - - +- temporarily point Alias back to .sfdx ([#438](https://github.com/forcedotcom/sfdx-core/issues/438)) ([4bffcd8](https://github.com/forcedotcom/sfdx-core/commit/4bffcd84362d5b3049ef428e90dc1b538a435f81)) # [3.3.0](https://github.com/forcedotcom/sfdx-core/compare/v3.2.0-v3.0...v3.3.0) (2021-07-14) - ### Features -* V3 merge ([#436](https://github.com/forcedotcom/sfdx-core/issues/436)) ([1193449](https://github.com/forcedotcom/sfdx-core/commit/119344969147679088e30bae4c4fc5e941661078)), closes [#413](https://github.com/forcedotcom/sfdx-core/issues/413) [#415](https://github.com/forcedotcom/sfdx-core/issues/415) [#428](https://github.com/forcedotcom/sfdx-core/issues/428) [#429](https://github.com/forcedotcom/sfdx-core/issues/429) [#427](https://github.com/forcedotcom/sfdx-core/issues/427) [#432](https://github.com/forcedotcom/sfdx-core/issues/432) - - +- V3 merge ([#436](https://github.com/forcedotcom/sfdx-core/issues/436)) ([1193449](https://github.com/forcedotcom/sfdx-core/commit/119344969147679088e30bae4c4fc5e941661078)), closes [#413](https://github.com/forcedotcom/sfdx-core/issues/413) [#415](https://github.com/forcedotcom/sfdx-core/issues/415) [#428](https://github.com/forcedotcom/sfdx-core/issues/428) [#429](https://github.com/forcedotcom/sfdx-core/issues/429) [#427](https://github.com/forcedotcom/sfdx-core/issues/427) [#432](https://github.com/forcedotcom/sfdx-core/issues/432) # [3.2.0-v3.0](https://github.com/forcedotcom/sfdx-core/compare/v2.26.0...v3.2.0-v3.0) (2021-07-14) - ### Features -* use .sf/config.json @W-9546117@ ([#433](https://github.com/forcedotcom/sfdx-core/issues/433)) ([6c41653](https://github.com/forcedotcom/sfdx-core/commit/6c416531a9bae10e855ded3efc289a99196bc26b)) - - +- use .sf/config.json @W-9546117@ ([#433](https://github.com/forcedotcom/sfdx-core/issues/433)) ([6c41653](https://github.com/forcedotcom/sfdx-core/commit/6c416531a9bae10e855ded3efc289a99196bc26b)) ## [3.1.1-v3.2](https://github.com/forcedotcom/sfdx-core/compare/v2.24.2...v3.1.1-v3.2) (2021-06-29) - ### Bug Fixes -* do not use function prop ([#426](https://github.com/forcedotcom/sfdx-core/issues/426)) ([39efe0c](https://github.com/forcedotcom/sfdx-core/commit/39efe0ccc84b05bc891e54b24bfcddc62790ae0e)) - - +- do not use function prop ([#426](https://github.com/forcedotcom/sfdx-core/issues/426)) ([39efe0c](https://github.com/forcedotcom/sfdx-core/commit/39efe0ccc84b05bc891e54b24bfcddc62790ae0e)) ## [3.1.1-v3.1](https://github.com/forcedotcom/sfdx-core/compare/v2.24.0...v3.1.1-v3.1) (2021-06-14) - ### Bug Fixes -* keep track of auth changes ([210be6c](https://github.com/forcedotcom/sfdx-core/commit/210be6cb408bd9ecc861989570df0e14f6a3a566)) - - +- keep track of auth changes ([210be6c](https://github.com/forcedotcom/sfdx-core/commit/210be6cb408bd9ecc861989570df0e14f6a3a566)) ## [3.1.1-v3.0](https://github.com/forcedotcom/sfdx-core/compare/v2.23.3...v3.1.1-v3.0) (2021-06-03) - ### Bug Fixes -* compilation errors ([33a9876](https://github.com/forcedotcom/sfdx-core/commit/33a9876575eff7944bb287d428f52413831725d9)) -* unit test failures ([4507575](https://github.com/forcedotcom/sfdx-core/commit/45075754175d411b6cb71eb809096e6eb3e23d95)) -* unsetAuthorization ([#399](https://github.com/forcedotcom/sfdx-core/issues/399)) ([dd57438](https://github.com/forcedotcom/sfdx-core/commit/dd57438a95b49515f560d3b915cdf916a4b8643b)) - +- compilation errors ([33a9876](https://github.com/forcedotcom/sfdx-core/commit/33a9876575eff7944bb287d428f52413831725d9)) +- unit test failures ([4507575](https://github.com/forcedotcom/sfdx-core/commit/45075754175d411b6cb71eb809096e6eb3e23d95)) +- unsetAuthorization ([#399](https://github.com/forcedotcom/sfdx-core/issues/399)) ([dd57438](https://github.com/forcedotcom/sfdx-core/commit/dd57438a95b49515f560d3b915cdf916a4b8643b)) ### Features -* add GlobalInfo config file ([#397](https://github.com/forcedotcom/sfdx-core/issues/397)) ([889425c](https://github.com/forcedotcom/sfdx-core/commit/889425c06e8ed6a364d9a2bc3dd5ef0a38a66046)) -* add message support for markdown files ([0f235a2](https://github.com/forcedotcom/sfdx-core/commit/0f235a23d5dddbd7b3f07544d8c7e380875c6c55)) -* move crypto to config file @W-9225317@ ([#406](https://github.com/forcedotcom/sfdx-core/issues/406)) ([bac83c3](https://github.com/forcedotcom/sfdx-core/commit/bac83c3a52b15c9b462dfb68be9d080e710493cd)) - - +- add GlobalInfo config file ([#397](https://github.com/forcedotcom/sfdx-core/issues/397)) ([889425c](https://github.com/forcedotcom/sfdx-core/commit/889425c06e8ed6a364d9a2bc3dd5ef0a38a66046)) +- add message support for markdown files ([0f235a2](https://github.com/forcedotcom/sfdx-core/commit/0f235a23d5dddbd7b3f07544d8c7e380875c6c55)) +- move crypto to config file @W-9225317@ ([#406](https://github.com/forcedotcom/sfdx-core/issues/406)) ([bac83c3](https://github.com/forcedotcom/sfdx-core/commit/bac83c3a52b15c9b462dfb68be9d080e710493cd)) ## [2.33.1](https://github.com/forcedotcom/sfdx-core/compare/v2.33.0...v2.33.1) (2021-12-15) - ### Bug Fixes -* faye doesn't use custom stuff passed it ([b1cefc7](https://github.com/forcedotcom/sfdx-core/commit/b1cefc76afde7f0dd56ed72b5539a47c118eef63)) - - +- faye doesn't use custom stuff passed it ([b1cefc7](https://github.com/forcedotcom/sfdx-core/commit/b1cefc76afde7f0dd56ed72b5539a47c118eef63)) # [2.33.0](https://github.com/forcedotcom/sfdx-core/compare/v2.32.0...v2.33.0) (2021-12-14) - ### Features -* sandbox creation ([314dcf1](https://github.com/forcedotcom/sfdx-core/commit/314dcf164d93bd0e3a5f4763a4dfcdde7d0cb14a)) - - +- sandbox creation ([314dcf1](https://github.com/forcedotcom/sfdx-core/commit/314dcf164d93bd0e3a5f4763a4dfcdde7d0cb14a)) # [2.32.0](https://github.com/forcedotcom/sfdx-core/compare/v2.31.1...v2.32.0) (2021-12-14) - ### Bug Fixes -* no maxquery warning when records.length is 0 ([758f912](https://github.com/forcedotcom/sfdx-core/commit/758f912a23bd3e9f8d4f854f3e07682dd4d4c4aa)) - +- no maxquery warning when records.length is 0 ([758f912](https://github.com/forcedotcom/sfdx-core/commit/758f912a23bd3e9f8d4f854f3e07682dd4d4c4aa)) ### Features -* switch sfdx-faye with faye ([a0545e5](https://github.com/forcedotcom/sfdx-core/commit/a0545e57d5041c97e499f284afbd7fcb16cf2247)) - - +- switch sfdx-faye with faye ([a0545e5](https://github.com/forcedotcom/sfdx-core/commit/a0545e57d5041c97e499f284afbd7fcb16cf2247)) ## [2.31.1](https://github.com/forcedotcom/sfdx-core/compare/v2.31.0...v2.31.1) (2021-12-06) - - # [2.31.0](https://github.com/forcedotcom/sfdx-core/compare/v2.30.1...v2.31.0) (2021-11-30) - ### Features -* bump version of jsforce ([7d89024](https://github.com/forcedotcom/sfdx-core/commit/7d89024f593968c031af22ac817efc26d00fcd54)) - - +- bump version of jsforce ([7d89024](https://github.com/forcedotcom/sfdx-core/commit/7d89024f593968c031af22ac817efc26d00fcd54)) ## [2.30.1](https://github.com/forcedotcom/sfdx-core/compare/v2.30.0...v2.30.1) (2021-11-30) - ### Bug Fixes -* better output for authUrl errors ([f3ec729](https://github.com/forcedotcom/sfdx-core/commit/f3ec7298bdbd3194d3d14bfea09f47f413669376)) - - +- better output for authUrl errors ([f3ec729](https://github.com/forcedotcom/sfdx-core/commit/f3ec7298bdbd3194d3d14bfea09f47f413669376)) # [2.30.0](https://github.com/forcedotcom/sfdx-core/compare/v2.29.0...v2.30.0) (2021-11-25) - ### Features -* delete scratch orgs and sandboxes ([#491](https://github.com/forcedotcom/sfdx-core/issues/491)) ([468c348](https://github.com/forcedotcom/sfdx-core/commit/468c348f0ecc69ddeea02927bf7a26ca660a86ca)) - - +- delete scratch orgs and sandboxes ([#491](https://github.com/forcedotcom/sfdx-core/issues/491)) ([468c348](https://github.com/forcedotcom/sfdx-core/commit/468c348f0ecc69ddeea02927bf7a26ca660a86ca)) # [2.29.0](https://github.com/forcedotcom/sfdx-core/compare/v2.28.4...v2.29.0) (2021-11-17) - ### Bug Fixes -* transfer listeners when upgrading the global instance to newer version ([0a40831](https://github.com/forcedotcom/sfdx-core/commit/0a408317c132548771ced0fe196178d2e9c76232)) - +- transfer listeners when upgrading the global instance to newer version ([0a40831](https://github.com/forcedotcom/sfdx-core/commit/0a408317c132548771ced0fe196178d2e9c76232)) ### Features -* cleans up old listeners from upgraded instance ([e3f2d69](https://github.com/forcedotcom/sfdx-core/commit/e3f2d69ccd5c096d37addb1b982e19354175f11a)) -* use warnings instead of process in sfdx-core ([c1f7e98](https://github.com/forcedotcom/sfdx-core/commit/c1f7e98f6b19d57da1a2ee0cdf58e449079f0ee7)) -* warning and telemetry events ([80a8039](https://github.com/forcedotcom/sfdx-core/commit/80a8039e2f686d973ddbc24c9a2980fb93928d13)) -* warning and telemetry events ([a04b293](https://github.com/forcedotcom/sfdx-core/commit/a04b29355c8ca6c7e37e071ccc159aff5e5e9ca0)) - - +- cleans up old listeners from upgraded instance ([e3f2d69](https://github.com/forcedotcom/sfdx-core/commit/e3f2d69ccd5c096d37addb1b982e19354175f11a)) +- use warnings instead of process in sfdx-core ([c1f7e98](https://github.com/forcedotcom/sfdx-core/commit/c1f7e98f6b19d57da1a2ee0cdf58e449079f0ee7)) +- warning and telemetry events ([80a8039](https://github.com/forcedotcom/sfdx-core/commit/80a8039e2f686d973ddbc24c9a2980fb93928d13)) +- warning and telemetry events ([a04b293](https://github.com/forcedotcom/sfdx-core/commit/a04b29355c8ca6c7e37e071ccc159aff5e5e9ca0)) ## [2.28.4](https://github.com/forcedotcom/sfdx-core/compare/v2.28.3...v2.28.4) (2021-11-10) - ### Bug Fixes -* bump jsforce types and run unit tests on Windows ([#485](https://github.com/forcedotcom/sfdx-core/issues/485)) ([3952c8f](https://github.com/forcedotcom/sfdx-core/commit/3952c8fe248531a0597477ed12240f611048caba)) - - +- bump jsforce types and run unit tests on Windows ([#485](https://github.com/forcedotcom/sfdx-core/issues/485)) ([3952c8f](https://github.com/forcedotcom/sfdx-core/commit/3952c8fe248531a0597477ed12240f611048caba)) ## [2.28.3](https://github.com/forcedotcom/sfdx-core/compare/v3.7.2...v2.28.3) (2021-11-08) - ### Bug Fixes -* fix unit test ([d903c04](https://github.com/forcedotcom/sfdx-core/commit/d903c04e5f3e4f01fccb3f00b91560c443013ddf)) -* force new release ([124bb74](https://github.com/forcedotcom/sfdx-core/commit/124bb744c5ecc28cb8babf285c6d8c3032eb7ef6)) - - +- fix unit test ([d903c04](https://github.com/forcedotcom/sfdx-core/commit/d903c04e5f3e4f01fccb3f00b91560c443013ddf)) +- force new release ([124bb74](https://github.com/forcedotcom/sfdx-core/commit/124bb744c5ecc28cb8babf285c6d8c3032eb7ef6)) ## [2.28.2](https://github.com/forcedotcom/sfdx-core/compare/v3.7.0...v2.28.2) (2021-10-13) - ### Bug Fixes -* support for .mil sandboxes ([9ef35c7](https://github.com/forcedotcom/sfdx-core/commit/9ef35c7b1ef0fe974c3bd3b89b862a436e00f7d9)) - - +- support for .mil sandboxes ([9ef35c7](https://github.com/forcedotcom/sfdx-core/commit/9ef35c7b1ef0fe974c3bd3b89b862a436e00f7d9)) ## [2.28.1](https://github.com/forcedotcom/sfdx-core/compare/v3.6.5...v2.28.1) (2021-10-06) - ### Bug Fixes -* crmforce.mil ([e263d5d](https://github.com/forcedotcom/sfdx-core/commit/e263d5d74be9c0651e5c2676d6eec1c31fca05e4)) - - +- crmforce.mil ([e263d5d](https://github.com/forcedotcom/sfdx-core/commit/e263d5d74be9c0651e5c2676d6eec1c31fca05e4)) # [2.28.0](https://github.com/forcedotcom/sfdx-core/compare/v3.6.1...v2.28.0) (2021-09-16) - ### Features -* add custom templates config ([3cf8a8c](https://github.com/forcedotcom/sfdx-core/commit/3cf8a8cee1e7196efced989dcca9b545e1283386)) -* add validator for custom templates config ([dd2bcfe](https://github.com/forcedotcom/sfdx-core/commit/dd2bcfe8e7fee5c5c1c6321189ec04288103d5b6)) -* update config name ([72e84bf](https://github.com/forcedotcom/sfdx-core/commit/72e84bfacef48a1c2d00a61ebbae3f632601abbd)) - - +- add custom templates config ([3cf8a8c](https://github.com/forcedotcom/sfdx-core/commit/3cf8a8cee1e7196efced989dcca9b545e1283386)) +- add validator for custom templates config ([dd2bcfe](https://github.com/forcedotcom/sfdx-core/commit/dd2bcfe8e7fee5c5c1c6321189ec04288103d5b6)) +- update config name ([72e84bf](https://github.com/forcedotcom/sfdx-core/commit/72e84bfacef48a1c2d00a61ebbae3f632601abbd)) ## [2.27.2](https://github.com/forcedotcom/sfdx-core/compare/v2.27.1...v2.27.2) (2021-08-05) - ### Bug Fixes -* improve error handling while removing config props ([eecf7b0](https://github.com/forcedotcom/sfdx-core/commit/eecf7b0d0cf14e1371dc4c5ef03a413f864b0a8b)) - - +- improve error handling while removing config props ([eecf7b0](https://github.com/forcedotcom/sfdx-core/commit/eecf7b0d0cf14e1371dc4c5ef03a413f864b0a8b)) ## [2.27.1](https://github.com/forcedotcom/sfdx-core/compare/v3.3.11...v2.27.1) (2021-08-05) - ### Bug Fixes -* dont fail when trying to unset sf config keys ([#456](https://github.com/forcedotcom/sfdx-core/issues/456)) ([8aff9fd](https://github.com/forcedotcom/sfdx-core/commit/8aff9fd4bdb73ec20e58f5a16a8192a8eecba912)) -* improve error message when providing an invalid username ([2ab4bbd](https://github.com/forcedotcom/sfdx-core/commit/2ab4bbdefd962283d88ccb735de88c88fe189d39)) - - +- dont fail when trying to unset sf config keys ([#456](https://github.com/forcedotcom/sfdx-core/issues/456)) ([8aff9fd](https://github.com/forcedotcom/sfdx-core/commit/8aff9fd4bdb73ec20e58f5a16a8192a8eecba912)) +- improve error message when providing an invalid username ([2ab4bbd](https://github.com/forcedotcom/sfdx-core/commit/2ab4bbdefd962283d88ccb735de88c88fe189d39)) # [2.27.0](https://github.com/forcedotcom/sfdx-core/compare/v3.3.6...v2.27.0) (2021-07-29) - ### Features -* Core URL class SfdcUrl ([#420](https://github.com/forcedotcom/sfdx-core/issues/420)) ([66881ea](https://github.com/forcedotcom/sfdx-core/commit/66881eae2f30215c862ea398bfc1630d9a5898fe)) - - +- Core URL class SfdcUrl ([#420](https://github.com/forcedotcom/sfdx-core/issues/420)) ([66881ea](https://github.com/forcedotcom/sfdx-core/commit/66881eae2f30215c862ea398bfc1630d9a5898fe)) ## [2.26.1](https://github.com/forcedotcom/sfdx-core/compare/v3.3.1...v2.26.1) (2021-07-19) - ### Bug Fixes -* force:org:open force:org:open --urlonly display bug ([#439](https://github.com/forcedotcom/sfdx-core/issues/439)) ([2ea0e74](https://github.com/forcedotcom/sfdx-core/commit/2ea0e74b8bf1bff6de8af70372025cac10fc8c18)) - - +- force:org:open force:org:open --urlonly display bug ([#439](https://github.com/forcedotcom/sfdx-core/issues/439)) ([2ea0e74](https://github.com/forcedotcom/sfdx-core/commit/2ea0e74b8bf1bff6de8af70372025cac10fc8c18)) # [2.26.0](https://github.com/forcedotcom/sfdx-core/compare/v2.25.1...v2.26.0) (2021-07-13) - ### Features -* update generate password functionality ([#432](https://github.com/forcedotcom/sfdx-core/issues/432)) ([ed65e83](https://github.com/forcedotcom/sfdx-core/commit/ed65e83da3afe0d101743ee89cc7b2a7a38d5254)) - - +- update generate password functionality ([#432](https://github.com/forcedotcom/sfdx-core/issues/432)) ([ed65e83](https://github.com/forcedotcom/sfdx-core/commit/ed65e83da3afe0d101743ee89cc7b2a7a38d5254)) ## [2.25.1](https://github.com/forcedotcom/sfdx-core/compare/v3.1.1-3.2...v2.25.1) (2021-06-30) - ### Bug Fixes -* set retries to INFINITELY for polling client ([31539b4](https://github.com/forcedotcom/sfdx-core/commit/31539b4f0edd0cc1c049f70331ed5e40b8af55ea)) - - +- set retries to INFINITELY for polling client ([31539b4](https://github.com/forcedotcom/sfdx-core/commit/31539b4f0edd0cc1c049f70331ed5e40b8af55ea)) ## [3.1.1-3.2](https://github.com/forcedotcom/sfdx-core/compare/v2.25.0...v3.1.1-3.2) (2021-06-30) - ### Features -* @W-9517449@ Allow signupTargetLoginUrl to be overridden via env var ([#429](https://github.com/forcedotcom/sfdx-core/issues/429)) ([e2b8b36](https://github.com/forcedotcom/sfdx-core/commit/e2b8b36b2836b5277c83ffe22922978dc32e7b11)), closes [#427](https://github.com/forcedotcom/sfdx-core/issues/427) - - +- @W-9517449@ Allow signupTargetLoginUrl to be overridden via env var ([#429](https://github.com/forcedotcom/sfdx-core/issues/429)) ([e2b8b36](https://github.com/forcedotcom/sfdx-core/commit/e2b8b36b2836b5277c83ffe22922978dc32e7b11)), closes [#427](https://github.com/forcedotcom/sfdx-core/issues/427) ## [2.24.2](https://github.com/forcedotcom/sfdx-core/compare/v3.1.1-3.1...v2.24.2) (2021-06-23) - - ## [3.1.1-3.1](https://github.com/forcedotcom/sfdx-core/compare/v2.24.1...v3.1.1-3.1) (2021-06-23) - ### Bug Fixes -* puts some types back in dependencies ([94bea31](https://github.com/forcedotcom/sfdx-core/commit/94bea31037a41d4377faecb22bce8a2d12e95f4f)) -* rewrite polling client ([8d363d1](https://github.com/forcedotcom/sfdx-core/commit/8d363d13616f5efa944d4bb717a010add3c996b5)) - - +- puts some types back in dependencies ([94bea31](https://github.com/forcedotcom/sfdx-core/commit/94bea31037a41d4377faecb22bce8a2d12e95f4f)) +- rewrite polling client ([8d363d1](https://github.com/forcedotcom/sfdx-core/commit/8d363d13616f5efa944d4bb717a010add3c996b5)) # [2.24.0](https://github.com/forcedotcom/sfdx-core/compare/v2.23.5...v2.24.0) (2021-06-08) - ### Features -* exported function checkLightningDomain() ([#415](https://github.com/forcedotcom/sfdx-core/issues/415)) ([8e75231](https://github.com/forcedotcom/sfdx-core/commit/8e752313abf4a383a6ef18250ffac78b398987dd)) - - +- exported function checkLightningDomain() ([#415](https://github.com/forcedotcom/sfdx-core/issues/415)) ([8e75231](https://github.com/forcedotcom/sfdx-core/commit/8e752313abf4a383a6ef18250ffac78b398987dd)) ## [2.23.5](https://github.com/forcedotcom/sfdx-core/compare/v3.1.1-3.0...v2.23.5) (2021-06-07) - ### Bug Fixes -* w-9299422 (login url from config) and fs-parallelization ([043bb17](https://github.com/forcedotcom/sfdx-core/commit/043bb179dbf64f9c4522a4c0f0720ae09794227c)) - - +- w-9299422 (login url from config) and fs-parallelization ([043bb17](https://github.com/forcedotcom/sfdx-core/commit/043bb179dbf64f9c4522a4c0f0720ae09794227c)) ## [3.1.1-3.0](https://github.com/forcedotcom/sfdx-core/compare/v2.23.4...v3.1.1-3.0) (2021-06-03) - ### Bug Fixes -* works with TS4+ and jsforce types ([#413](https://github.com/forcedotcom/sfdx-core/issues/413)) ([b77cdad](https://github.com/forcedotcom/sfdx-core/commit/b77cdad56b114290b8e5fd23d968e23e7d4eedf4)) - - +- works with TS4+ and jsforce types ([#413](https://github.com/forcedotcom/sfdx-core/issues/413)) ([b77cdad](https://github.com/forcedotcom/sfdx-core/commit/b77cdad56b114290b8e5fd23d968e23e7d4eedf4)) ## [3.7.2](https://github.com/forcedotcom/sfdx-core/compare/v3.7.1...v3.7.2) (2021-10-28) - ### Bug Fixes -* make @types/sfdx-faye a dependendcy ([683680b](https://github.com/forcedotcom/sfdx-core/commit/683680b8133048f71d25ef4df7aa24d9700dc5e8)) - - +- make @types/sfdx-faye a dependendcy ([683680b](https://github.com/forcedotcom/sfdx-core/commit/683680b8133048f71d25ef4df7aa24d9700dc5e8)) ## [3.7.1](https://github.com/forcedotcom/sfdx-core/compare/v2.28.2...v3.7.1) (2021-10-28) - - # [3.7.0](https://github.com/forcedotcom/sfdx-core/compare/v3.6.6...v3.7.0) (2021-10-12) - ### Features -* use jsforce v2 ([#457](https://github.com/forcedotcom/sfdx-core/issues/457)) ([4a9094e](https://github.com/forcedotcom/sfdx-core/commit/4a9094e958288cdcc6c69f5d87b10a70a437d8e9)) - - +- use jsforce v2 ([#457](https://github.com/forcedotcom/sfdx-core/issues/457)) ([4a9094e](https://github.com/forcedotcom/sfdx-core/commit/4a9094e958288cdcc6c69f5d87b10a70a437d8e9)) ## [3.6.6](https://github.com/forcedotcom/sfdx-core/compare/v2.28.1...v3.6.6) (2021-10-08) - - ## [3.6.5](https://github.com/forcedotcom/sfdx-core/compare/v3.6.4...v3.6.5) (2021-09-29) - ### Bug Fixes -* add getValue to AliasAccessor ([c4b69f5](https://github.com/forcedotcom/sfdx-core/commit/c4b69f5ff38547fad640c64833291fe0c6e06a79)) - - +- add getValue to AliasAccessor ([c4b69f5](https://github.com/forcedotcom/sfdx-core/commit/c4b69f5ff38547fad640c64833291fe0c6e06a79)) ## [3.6.4](https://github.com/forcedotcom/sfdx-core/compare/v3.6.3...v3.6.4) (2021-09-23) - ### Bug Fixes -* edit the env var blurbs ([#482](https://github.com/forcedotcom/sfdx-core/issues/482)) ([bbbdb6d](https://github.com/forcedotcom/sfdx-core/commit/bbbdb6d0800015e94ce0f0c551eec8ed73dd87c6)) - - +- edit the env var blurbs ([#482](https://github.com/forcedotcom/sfdx-core/issues/482)) ([bbbdb6d](https://github.com/forcedotcom/sfdx-core/commit/bbbdb6d0800015e94ce0f0c551eec8ed73dd87c6)) ## [3.6.3](https://github.com/forcedotcom/sfdx-core/compare/v3.6.2...v3.6.3) (2021-09-23) - ### Bug Fixes -* edit the config var blurbs ([#480](https://github.com/forcedotcom/sfdx-core/issues/480)) ([f845512](https://github.com/forcedotcom/sfdx-core/commit/f8455121bfd96f27495bc124dc06570632dfce70)) - - +- edit the config var blurbs ([#480](https://github.com/forcedotcom/sfdx-core/issues/480)) ([f845512](https://github.com/forcedotcom/sfdx-core/commit/f8455121bfd96f27495bc124dc06570632dfce70)) ## [3.6.2](https://github.com/forcedotcom/sfdx-core/compare/v2.28.0...v3.6.2) (2021-09-17) - ### Bug Fixes -* improve time to build auths for many orgs @W-9914839@ ([#478](https://github.com/forcedotcom/sfdx-core/issues/478)) ([c788541](https://github.com/forcedotcom/sfdx-core/commit/c7885415d59994b28552227f0b84dcee5d3ec7cf)) - - +- improve time to build auths for many orgs @W-9914839@ ([#478](https://github.com/forcedotcom/sfdx-core/issues/478)) ([c788541](https://github.com/forcedotcom/sfdx-core/commit/c7885415d59994b28552227f0b84dcee5d3ec7cf)) ## [3.6.1](https://github.com/forcedotcom/sfdx-core/compare/v3.6.0...v3.6.1) (2021-09-13) - ### Bug Fixes -* remove tokens associated with org ([#477](https://github.com/forcedotcom/sfdx-core/issues/477)) ([5034fa2](https://github.com/forcedotcom/sfdx-core/commit/5034fa2d4c52d347c00499e137a71366e4feba7f)) - - +- remove tokens associated with org ([#477](https://github.com/forcedotcom/sfdx-core/issues/477)) ([5034fa2](https://github.com/forcedotcom/sfdx-core/commit/5034fa2d4c52d347c00499e137a71366e4feba7f)) # [3.6.0](https://github.com/forcedotcom/sfdx-core/compare/v3.5.0...v3.6.0) (2021-09-10) - ### Features -* add help section helper ([#474](https://github.com/forcedotcom/sfdx-core/issues/474)) ([b34c2d7](https://github.com/forcedotcom/sfdx-core/commit/b34c2d7a442aed2cf091fd394a7c3656287d1dbf)) - - +- add help section helper ([#474](https://github.com/forcedotcom/sfdx-core/issues/474)) ([b34c2d7](https://github.com/forcedotcom/sfdx-core/commit/b34c2d7a442aed2cf091fd394a7c3656287d1dbf)) # [3.5.0](https://github.com/forcedotcom/sfdx-core/compare/v3.4.5...v3.5.0) (2021-09-09) - ### Features -* expose well known env vars as part of core ([#473](https://github.com/forcedotcom/sfdx-core/issues/473)) ([11c3f53](https://github.com/forcedotcom/sfdx-core/commit/11c3f53f964459072826274e6ebb33d4a9ecb990)) - - +- expose well known env vars as part of core ([#473](https://github.com/forcedotcom/sfdx-core/issues/473)) ([11c3f53](https://github.com/forcedotcom/sfdx-core/commit/11c3f53f964459072826274e6ebb33d4a9ecb990)) ## [3.4.5](https://github.com/forcedotcom/sfdx-core/compare/v3.4.4...v3.4.5) (2021-09-03) - ### Bug Fixes -* provide the correct options to SfdxConfig ([fa2117e](https://github.com/forcedotcom/sfdx-core/commit/fa2117e12d7a903f26067bdcf35d7ec9c142101e)) - - +- provide the correct options to SfdxConfig ([fa2117e](https://github.com/forcedotcom/sfdx-core/commit/fa2117e12d7a903f26067bdcf35d7ec9c142101e)) ## [3.4.4](https://github.com/forcedotcom/sfdx-core/compare/v3.4.3...v3.4.4) (2021-09-03) - - ## [3.4.3](https://github.com/forcedotcom/sfdx-core/compare/v3.4.2...v3.4.3) (2021-08-26) - - ## [3.4.2](https://github.com/forcedotcom/sfdx-core/compare/v3.4.1...v3.4.2) (2021-08-17) - ### Bug Fixes -* improve interoperability when unsetting ([#467](https://github.com/forcedotcom/sfdx-core/issues/467)) ([ad781d5](https://github.com/forcedotcom/sfdx-core/commit/ad781d5378652dfd64ccb476c11f418e940b8669)) - - +- improve interoperability when unsetting ([#467](https://github.com/forcedotcom/sfdx-core/issues/467)) ([ad781d5](https://github.com/forcedotcom/sfdx-core/commit/ad781d5378652dfd64ccb476c11f418e940b8669)) ## [3.4.1](https://github.com/forcedotcom/sfdx-core/compare/v3.4.0...v3.4.1) (2021-08-11) - ### Bug Fixes -* optionally throw error when reading deprecated config key ([#466](https://github.com/forcedotcom/sfdx-core/issues/466)) ([3118ad8](https://github.com/forcedotcom/sfdx-core/commit/3118ad836db384ac27c2b1db88c4753e6121e4db)) - - +- optionally throw error when reading deprecated config key ([#466](https://github.com/forcedotcom/sfdx-core/issues/466)) ([3118ad8](https://github.com/forcedotcom/sfdx-core/commit/3118ad836db384ac27c2b1db88c4753e6121e4db)) # [3.4.0](https://github.com/forcedotcom/sfdx-core/compare/v3.3.12...v3.4.0) (2021-08-11) - ### Features -* config interoperability ([#461](https://github.com/forcedotcom/sfdx-core/issues/461)) ([11b60ad](https://github.com/forcedotcom/sfdx-core/commit/11b60adbe54acc8e16a90327c77abbe2613fbaab)) - - +- config interoperability ([#461](https://github.com/forcedotcom/sfdx-core/issues/461)) ([11b60ad](https://github.com/forcedotcom/sfdx-core/commit/11b60adbe54acc8e16a90327c77abbe2613fbaab)) ## [3.3.12](https://github.com/forcedotcom/sfdx-core/compare/v2.27.2...v3.3.12) (2021-08-10) - ### Bug Fixes -* add predicate function to list all auths ([ccdb02c](https://github.com/forcedotcom/sfdx-core/commit/ccdb02c268fae7532b23e0c791bcdd831f77cf98)) - - +- add predicate function to list all auths ([ccdb02c](https://github.com/forcedotcom/sfdx-core/commit/ccdb02c268fae7532b23e0c791bcdd831f77cf98)) ## [3.3.11](https://github.com/forcedotcom/sfdx-core/compare/v3.3.10...v3.3.11) (2021-08-04) - ### Bug Fixes -* allows for message keys of error and errors ([#455](https://github.com/forcedotcom/sfdx-core/issues/455)) ([3bfac58](https://github.com/forcedotcom/sfdx-core/commit/3bfac587c6cf1734af6f2b517439d278591ddd50)) - - +- allows for message keys of error and errors ([#455](https://github.com/forcedotcom/sfdx-core/issues/455)) ([3bfac58](https://github.com/forcedotcom/sfdx-core/commit/3bfac587c6cf1734af6f2b517439d278591ddd50)) ## [3.3.10](https://github.com/forcedotcom/sfdx-core/compare/v3.3.9...v3.3.10) (2021-08-04) - - ## [3.3.9](https://github.com/forcedotcom/sfdx-core/compare/v3.3.8...v3.3.9) (2021-08-04) - ### Bug Fixes -* merge main(v2) into v3 ([#452](https://github.com/forcedotcom/sfdx-core/issues/452)) ([3a003b9](https://github.com/forcedotcom/sfdx-core/commit/3a003b9c17962f77344e4a23314bb608e1ae50db)) - - +- merge main(v2) into v3 ([#452](https://github.com/forcedotcom/sfdx-core/issues/452)) ([3a003b9](https://github.com/forcedotcom/sfdx-core/commit/3a003b9c17962f77344e4a23314bb608e1ae50db)) ## [3.3.8](https://github.com/forcedotcom/sfdx-core/compare/v3.3.7...v3.3.8) (2021-08-02) - ### Bug Fixes -* return all info from AuthInfo.listAllAuthorizations ([#449](https://github.com/forcedotcom/sfdx-core/issues/449)) ([17e60ea](https://github.com/forcedotcom/sfdx-core/commit/17e60eabe87c73a83c26344967076f365ddea81c)) - - +- return all info from AuthInfo.listAllAuthorizations ([#449](https://github.com/forcedotcom/sfdx-core/issues/449)) ([17e60ea](https://github.com/forcedotcom/sfdx-core/commit/17e60eabe87c73a83c26344967076f365ddea81c)) ## [3.3.7](https://github.com/forcedotcom/sfdx-core/compare/v2.27.0...v3.3.7) (2021-07-30) - - ## [3.3.6](https://github.com/forcedotcom/sfdx-core/compare/v3.3.5...v3.3.6) (2021-07-28) - ### Bug Fixes -* use correct method to get username ([#446](https://github.com/forcedotcom/sfdx-core/issues/446)) ([79a6b2f](https://github.com/forcedotcom/sfdx-core/commit/79a6b2f069f95b0c50a6c03ecbac07cf0d1832b1)) - - +- use correct method to get username ([#446](https://github.com/forcedotcom/sfdx-core/issues/446)) ([79a6b2f](https://github.com/forcedotcom/sfdx-core/commit/79a6b2f069f95b0c50a6c03ecbac07cf0d1832b1)) ## [3.3.5](https://github.com/forcedotcom/sfdx-core/compare/v3.3.4...v3.3.5) (2021-07-28) - - ## [3.3.4](https://github.com/forcedotcom/sfdx-core/compare/v3.3.3...v3.3.4) (2021-07-26) - ### Bug Fixes -* remove bad validator function ([1b97dc6](https://github.com/forcedotcom/sfdx-core/commit/1b97dc6f4d657a5b86489d33c4843ebfd54b3715)) - - +- remove bad validator function ([1b97dc6](https://github.com/forcedotcom/sfdx-core/commit/1b97dc6f4d657a5b86489d33c4843ebfd54b3715)) ## [3.3.3](https://github.com/forcedotcom/sfdx-core/compare/v3.3.2...v3.3.3) (2021-07-22) - ### Bug Fixes -* write sf.json contents on init ([c47f649](https://github.com/forcedotcom/sfdx-core/commit/c47f64954118d0d2f7f4a8e992d3450516239084)) - - +- write sf.json contents on init ([c47f649](https://github.com/forcedotcom/sfdx-core/commit/c47f64954118d0d2f7f4a8e992d3450516239084)) ## [3.3.2](https://github.com/forcedotcom/sfdx-core/compare/v2.26.1...v3.3.2) (2021-07-21) - ### Bug Fixes -* correct jsdoc ([a362e94](https://github.com/forcedotcom/sfdx-core/commit/a362e94c4ae7538cbbcd7dae8fcd3244629d845c)) - - +- correct jsdoc ([a362e94](https://github.com/forcedotcom/sfdx-core/commit/a362e94c4ae7538cbbcd7dae8fcd3244629d845c)) ## [3.3.1](https://github.com/forcedotcom/sfdx-core/compare/v3.3.0...v3.3.1) (2021-07-15) - ### Bug Fixes -* temporarily point Alias back to .sfdx ([#438](https://github.com/forcedotcom/sfdx-core/issues/438)) ([4bffcd8](https://github.com/forcedotcom/sfdx-core/commit/4bffcd84362d5b3049ef428e90dc1b538a435f81)) - - +- temporarily point Alias back to .sfdx ([#438](https://github.com/forcedotcom/sfdx-core/issues/438)) ([4bffcd8](https://github.com/forcedotcom/sfdx-core/commit/4bffcd84362d5b3049ef428e90dc1b538a435f81)) # [3.3.0](https://github.com/forcedotcom/sfdx-core/compare/v3.2.0-v3.0...v3.3.0) (2021-07-14) - ### Features -* V3 merge ([#436](https://github.com/forcedotcom/sfdx-core/issues/436)) ([1193449](https://github.com/forcedotcom/sfdx-core/commit/119344969147679088e30bae4c4fc5e941661078)), closes [#413](https://github.com/forcedotcom/sfdx-core/issues/413) [#415](https://github.com/forcedotcom/sfdx-core/issues/415) [#428](https://github.com/forcedotcom/sfdx-core/issues/428) [#429](https://github.com/forcedotcom/sfdx-core/issues/429) [#427](https://github.com/forcedotcom/sfdx-core/issues/427) [#432](https://github.com/forcedotcom/sfdx-core/issues/432) - - +- V3 merge ([#436](https://github.com/forcedotcom/sfdx-core/issues/436)) ([1193449](https://github.com/forcedotcom/sfdx-core/commit/119344969147679088e30bae4c4fc5e941661078)), closes [#413](https://github.com/forcedotcom/sfdx-core/issues/413) [#415](https://github.com/forcedotcom/sfdx-core/issues/415) [#428](https://github.com/forcedotcom/sfdx-core/issues/428) [#429](https://github.com/forcedotcom/sfdx-core/issues/429) [#427](https://github.com/forcedotcom/sfdx-core/issues/427) [#432](https://github.com/forcedotcom/sfdx-core/issues/432) # [3.2.0-v3.0](https://github.com/forcedotcom/sfdx-core/compare/v2.26.0...v3.2.0-v3.0) (2021-07-14) - ### Features -* use .sf/config.json @W-9546117@ ([#433](https://github.com/forcedotcom/sfdx-core/issues/433)) ([6c41653](https://github.com/forcedotcom/sfdx-core/commit/6c416531a9bae10e855ded3efc289a99196bc26b)) - - +- use .sf/config.json @W-9546117@ ([#433](https://github.com/forcedotcom/sfdx-core/issues/433)) ([6c41653](https://github.com/forcedotcom/sfdx-core/commit/6c416531a9bae10e855ded3efc289a99196bc26b)) ## [3.1.1-v3.2](https://github.com/forcedotcom/sfdx-core/compare/v2.24.2...v3.1.1-v3.2) (2021-06-29) - ### Bug Fixes -* do not use function prop ([#426](https://github.com/forcedotcom/sfdx-core/issues/426)) ([39efe0c](https://github.com/forcedotcom/sfdx-core/commit/39efe0ccc84b05bc891e54b24bfcddc62790ae0e)) - - +- do not use function prop ([#426](https://github.com/forcedotcom/sfdx-core/issues/426)) ([39efe0c](https://github.com/forcedotcom/sfdx-core/commit/39efe0ccc84b05bc891e54b24bfcddc62790ae0e)) ## [3.1.1-v3.1](https://github.com/forcedotcom/sfdx-core/compare/v2.24.0...v3.1.1-v3.1) (2021-06-14) - ### Bug Fixes -* keep track of auth changes ([210be6c](https://github.com/forcedotcom/sfdx-core/commit/210be6cb408bd9ecc861989570df0e14f6a3a566)) - - +- keep track of auth changes ([210be6c](https://github.com/forcedotcom/sfdx-core/commit/210be6cb408bd9ecc861989570df0e14f6a3a566)) ## [3.1.1-v3.0](https://github.com/forcedotcom/sfdx-core/compare/v2.23.3...v3.1.1-v3.0) (2021-06-03) - ### Bug Fixes -* compilation errors ([33a9876](https://github.com/forcedotcom/sfdx-core/commit/33a9876575eff7944bb287d428f52413831725d9)) -* unit test failures ([4507575](https://github.com/forcedotcom/sfdx-core/commit/45075754175d411b6cb71eb809096e6eb3e23d95)) -* unsetAuthorization ([#399](https://github.com/forcedotcom/sfdx-core/issues/399)) ([dd57438](https://github.com/forcedotcom/sfdx-core/commit/dd57438a95b49515f560d3b915cdf916a4b8643b)) - +- compilation errors ([33a9876](https://github.com/forcedotcom/sfdx-core/commit/33a9876575eff7944bb287d428f52413831725d9)) +- unit test failures ([4507575](https://github.com/forcedotcom/sfdx-core/commit/45075754175d411b6cb71eb809096e6eb3e23d95)) +- unsetAuthorization ([#399](https://github.com/forcedotcom/sfdx-core/issues/399)) ([dd57438](https://github.com/forcedotcom/sfdx-core/commit/dd57438a95b49515f560d3b915cdf916a4b8643b)) ### Features -* add GlobalInfo config file ([#397](https://github.com/forcedotcom/sfdx-core/issues/397)) ([889425c](https://github.com/forcedotcom/sfdx-core/commit/889425c06e8ed6a364d9a2bc3dd5ef0a38a66046)) -* add message support for markdown files ([0f235a2](https://github.com/forcedotcom/sfdx-core/commit/0f235a23d5dddbd7b3f07544d8c7e380875c6c55)) -* move crypto to config file @W-9225317@ ([#406](https://github.com/forcedotcom/sfdx-core/issues/406)) ([bac83c3](https://github.com/forcedotcom/sfdx-core/commit/bac83c3a52b15c9b462dfb68be9d080e710493cd)) - - +- add GlobalInfo config file ([#397](https://github.com/forcedotcom/sfdx-core/issues/397)) ([889425c](https://github.com/forcedotcom/sfdx-core/commit/889425c06e8ed6a364d9a2bc3dd5ef0a38a66046)) +- add message support for markdown files ([0f235a2](https://github.com/forcedotcom/sfdx-core/commit/0f235a23d5dddbd7b3f07544d8c7e380875c6c55)) +- move crypto to config file @W-9225317@ ([#406](https://github.com/forcedotcom/sfdx-core/issues/406)) ([bac83c3](https://github.com/forcedotcom/sfdx-core/commit/bac83c3a52b15c9b462dfb68be9d080e710493cd)) ## [2.28.2](https://github.com/forcedotcom/sfdx-core/compare/v3.7.0...v2.28.2) (2021-10-13) - ### Bug Fixes -* support for .mil sandboxes ([9ef35c7](https://github.com/forcedotcom/sfdx-core/commit/9ef35c7b1ef0fe974c3bd3b89b862a436e00f7d9)) - - +- support for .mil sandboxes ([9ef35c7](https://github.com/forcedotcom/sfdx-core/commit/9ef35c7b1ef0fe974c3bd3b89b862a436e00f7d9)) ## [2.28.1](https://github.com/forcedotcom/sfdx-core/compare/v3.6.5...v2.28.1) (2021-10-06) - ### Bug Fixes -* crmforce.mil ([e263d5d](https://github.com/forcedotcom/sfdx-core/commit/e263d5d74be9c0651e5c2676d6eec1c31fca05e4)) - - +- crmforce.mil ([e263d5d](https://github.com/forcedotcom/sfdx-core/commit/e263d5d74be9c0651e5c2676d6eec1c31fca05e4)) # [2.28.0](https://github.com/forcedotcom/sfdx-core/compare/v3.6.1...v2.28.0) (2021-09-16) - ### Features -* add custom templates config ([3cf8a8c](https://github.com/forcedotcom/sfdx-core/commit/3cf8a8cee1e7196efced989dcca9b545e1283386)) -* add validator for custom templates config ([dd2bcfe](https://github.com/forcedotcom/sfdx-core/commit/dd2bcfe8e7fee5c5c1c6321189ec04288103d5b6)) -* update config name ([72e84bf](https://github.com/forcedotcom/sfdx-core/commit/72e84bfacef48a1c2d00a61ebbae3f632601abbd)) - - +- add custom templates config ([3cf8a8c](https://github.com/forcedotcom/sfdx-core/commit/3cf8a8cee1e7196efced989dcca9b545e1283386)) +- add validator for custom templates config ([dd2bcfe](https://github.com/forcedotcom/sfdx-core/commit/dd2bcfe8e7fee5c5c1c6321189ec04288103d5b6)) +- update config name ([72e84bf](https://github.com/forcedotcom/sfdx-core/commit/72e84bfacef48a1c2d00a61ebbae3f632601abbd)) ## [2.27.2](https://github.com/forcedotcom/sfdx-core/compare/v2.27.1...v2.27.2) (2021-08-05) - ### Bug Fixes -* improve error handling while removing config props ([eecf7b0](https://github.com/forcedotcom/sfdx-core/commit/eecf7b0d0cf14e1371dc4c5ef03a413f864b0a8b)) - - +- improve error handling while removing config props ([eecf7b0](https://github.com/forcedotcom/sfdx-core/commit/eecf7b0d0cf14e1371dc4c5ef03a413f864b0a8b)) ## [2.27.1](https://github.com/forcedotcom/sfdx-core/compare/v3.3.11...v2.27.1) (2021-08-05) - ### Bug Fixes -* dont fail when trying to unset sf config keys ([#456](https://github.com/forcedotcom/sfdx-core/issues/456)) ([8aff9fd](https://github.com/forcedotcom/sfdx-core/commit/8aff9fd4bdb73ec20e58f5a16a8192a8eecba912)) - - +- dont fail when trying to unset sf config keys ([#456](https://github.com/forcedotcom/sfdx-core/issues/456)) ([8aff9fd](https://github.com/forcedotcom/sfdx-core/commit/8aff9fd4bdb73ec20e58f5a16a8192a8eecba912)) # [2.27.0](https://github.com/forcedotcom/sfdx-core/compare/v3.3.6...v2.27.0) (2021-07-29) - ### Features -* Core URL class SfdcUrl ([#420](https://github.com/forcedotcom/sfdx-core/issues/420)) ([66881ea](https://github.com/forcedotcom/sfdx-core/commit/66881eae2f30215c862ea398bfc1630d9a5898fe)) - - +- Core URL class SfdcUrl ([#420](https://github.com/forcedotcom/sfdx-core/issues/420)) ([66881ea](https://github.com/forcedotcom/sfdx-core/commit/66881eae2f30215c862ea398bfc1630d9a5898fe)) ## [2.26.1](https://github.com/forcedotcom/sfdx-core/compare/v3.3.1...v2.26.1) (2021-07-19) - ### Bug Fixes -* force:org:open force:org:open --urlonly display bug ([#439](https://github.com/forcedotcom/sfdx-core/issues/439)) ([2ea0e74](https://github.com/forcedotcom/sfdx-core/commit/2ea0e74b8bf1bff6de8af70372025cac10fc8c18)) - - - -# [2.26.0](https://github.com/forcedotcom/sfdx-core/compare/v2.25.1...v2.26.0) (2021-07-13) - - -### Features +- force:org:open force:org:open --urlonly display bug ([#439](https://github.com/forcedotcom/sfdx-core/issues/439)) ([2ea0e74](https://github.com/forcedotcom/sfdx-core/commit/2ea0e74b8bf1bff6de8af70372025cac10fc8c18)) -* update generate password functionality ([#432](https://github.com/forcedotcom/sfdx-core/issues/432)) ([ed65e83](https://github.com/forcedotcom/sfdx-core/commit/ed65e83da3afe0d101743ee89cc7b2a7a38d5254)) +# [2.26.0](https://github.com/forcedotcom/sfdx-core/compare/v2.25.1...v2.26.0) (2021-07-13) +### Features +- update generate password functionality ([#432](https://github.com/forcedotcom/sfdx-core/issues/432)) ([ed65e83](https://github.com/forcedotcom/sfdx-core/commit/ed65e83da3afe0d101743ee89cc7b2a7a38d5254)) ## [2.25.1](https://github.com/forcedotcom/sfdx-core/compare/v3.1.1-3.2...v2.25.1) (2021-06-30) - ### Bug Fixes -* set retries to INFINITELY for polling client ([31539b4](https://github.com/forcedotcom/sfdx-core/commit/31539b4f0edd0cc1c049f70331ed5e40b8af55ea)) - - +- set retries to INFINITELY for polling client ([31539b4](https://github.com/forcedotcom/sfdx-core/commit/31539b4f0edd0cc1c049f70331ed5e40b8af55ea)) ## [3.1.1-3.2](https://github.com/forcedotcom/sfdx-core/compare/v2.25.0...v3.1.1-3.2) (2021-06-30) - ### Features -* @W-9517449@ Allow signupTargetLoginUrl to be overridden via env var ([#429](https://github.com/forcedotcom/sfdx-core/issues/429)) ([e2b8b36](https://github.com/forcedotcom/sfdx-core/commit/e2b8b36b2836b5277c83ffe22922978dc32e7b11)), closes [#427](https://github.com/forcedotcom/sfdx-core/issues/427) - - +- @W-9517449@ Allow signupTargetLoginUrl to be overridden via env var ([#429](https://github.com/forcedotcom/sfdx-core/issues/429)) ([e2b8b36](https://github.com/forcedotcom/sfdx-core/commit/e2b8b36b2836b5277c83ffe22922978dc32e7b11)), closes [#427](https://github.com/forcedotcom/sfdx-core/issues/427) ## [2.24.2](https://github.com/forcedotcom/sfdx-core/compare/v3.1.1-3.1...v2.24.2) (2021-06-23) - - ## [3.1.1-3.1](https://github.com/forcedotcom/sfdx-core/compare/v2.24.1...v3.1.1-3.1) (2021-06-23) - ### Bug Fixes -* puts some types back in dependencies ([94bea31](https://github.com/forcedotcom/sfdx-core/commit/94bea31037a41d4377faecb22bce8a2d12e95f4f)) -* rewrite polling client ([8d363d1](https://github.com/forcedotcom/sfdx-core/commit/8d363d13616f5efa944d4bb717a010add3c996b5)) - - +- puts some types back in dependencies ([94bea31](https://github.com/forcedotcom/sfdx-core/commit/94bea31037a41d4377faecb22bce8a2d12e95f4f)) +- rewrite polling client ([8d363d1](https://github.com/forcedotcom/sfdx-core/commit/8d363d13616f5efa944d4bb717a010add3c996b5)) # [2.24.0](https://github.com/forcedotcom/sfdx-core/compare/v2.23.5...v2.24.0) (2021-06-08) - ### Features -* exported function checkLightningDomain() ([#415](https://github.com/forcedotcom/sfdx-core/issues/415)) ([8e75231](https://github.com/forcedotcom/sfdx-core/commit/8e752313abf4a383a6ef18250ffac78b398987dd)) - - +- exported function checkLightningDomain() ([#415](https://github.com/forcedotcom/sfdx-core/issues/415)) ([8e75231](https://github.com/forcedotcom/sfdx-core/commit/8e752313abf4a383a6ef18250ffac78b398987dd)) ## [2.23.5](https://github.com/forcedotcom/sfdx-core/compare/v3.1.1-3.0...v2.23.5) (2021-06-07) - ### Bug Fixes -* w-9299422 (login url from config) and fs-parallelization ([043bb17](https://github.com/forcedotcom/sfdx-core/commit/043bb179dbf64f9c4522a4c0f0720ae09794227c)) - - +- w-9299422 (login url from config) and fs-parallelization ([043bb17](https://github.com/forcedotcom/sfdx-core/commit/043bb179dbf64f9c4522a4c0f0720ae09794227c)) ## [3.1.1-3.0](https://github.com/forcedotcom/sfdx-core/compare/v2.23.4...v3.1.1-3.0) (2021-06-03) - ### Bug Fixes -* works with TS4+ and jsforce types ([#413](https://github.com/forcedotcom/sfdx-core/issues/413)) ([b77cdad](https://github.com/forcedotcom/sfdx-core/commit/b77cdad56b114290b8e5fd23d968e23e7d4eedf4)) - - +- works with TS4+ and jsforce types ([#413](https://github.com/forcedotcom/sfdx-core/issues/413)) ([b77cdad](https://github.com/forcedotcom/sfdx-core/commit/b77cdad56b114290b8e5fd23d968e23e7d4eedf4)) # [3.7.0](https://github.com/forcedotcom/sfdx-core/compare/v3.6.6...v3.7.0) (2021-10-12) - ### Features -* use jsforce v2 ([#457](https://github.com/forcedotcom/sfdx-core/issues/457)) ([4a9094e](https://github.com/forcedotcom/sfdx-core/commit/4a9094e958288cdcc6c69f5d87b10a70a437d8e9)) - - +- use jsforce v2 ([#457](https://github.com/forcedotcom/sfdx-core/issues/457)) ([4a9094e](https://github.com/forcedotcom/sfdx-core/commit/4a9094e958288cdcc6c69f5d87b10a70a437d8e9)) ## [3.6.6](https://github.com/forcedotcom/sfdx-core/compare/v2.28.1...v3.6.6) (2021-10-08) - - ## [3.6.5](https://github.com/forcedotcom/sfdx-core/compare/v3.6.4...v3.6.5) (2021-09-29) - ### Bug Fixes -* add getValue to AliasAccessor ([c4b69f5](https://github.com/forcedotcom/sfdx-core/commit/c4b69f5ff38547fad640c64833291fe0c6e06a79)) - - +- add getValue to AliasAccessor ([c4b69f5](https://github.com/forcedotcom/sfdx-core/commit/c4b69f5ff38547fad640c64833291fe0c6e06a79)) ## [3.6.4](https://github.com/forcedotcom/sfdx-core/compare/v3.6.3...v3.6.4) (2021-09-23) - ### Bug Fixes -* edit the env var blurbs ([#482](https://github.com/forcedotcom/sfdx-core/issues/482)) ([bbbdb6d](https://github.com/forcedotcom/sfdx-core/commit/bbbdb6d0800015e94ce0f0c551eec8ed73dd87c6)) - - +- edit the env var blurbs ([#482](https://github.com/forcedotcom/sfdx-core/issues/482)) ([bbbdb6d](https://github.com/forcedotcom/sfdx-core/commit/bbbdb6d0800015e94ce0f0c551eec8ed73dd87c6)) ## [3.6.3](https://github.com/forcedotcom/sfdx-core/compare/v3.6.2...v3.6.3) (2021-09-23) - ### Bug Fixes -* edit the config var blurbs ([#480](https://github.com/forcedotcom/sfdx-core/issues/480)) ([f845512](https://github.com/forcedotcom/sfdx-core/commit/f8455121bfd96f27495bc124dc06570632dfce70)) - - +- edit the config var blurbs ([#480](https://github.com/forcedotcom/sfdx-core/issues/480)) ([f845512](https://github.com/forcedotcom/sfdx-core/commit/f8455121bfd96f27495bc124dc06570632dfce70)) ## [3.6.2](https://github.com/forcedotcom/sfdx-core/compare/v2.28.0...v3.6.2) (2021-09-17) - ### Bug Fixes -* improve time to build auths for many orgs @W-9914839@ ([#478](https://github.com/forcedotcom/sfdx-core/issues/478)) ([c788541](https://github.com/forcedotcom/sfdx-core/commit/c7885415d59994b28552227f0b84dcee5d3ec7cf)) - - +- improve time to build auths for many orgs @W-9914839@ ([#478](https://github.com/forcedotcom/sfdx-core/issues/478)) ([c788541](https://github.com/forcedotcom/sfdx-core/commit/c7885415d59994b28552227f0b84dcee5d3ec7cf)) ## [3.6.1](https://github.com/forcedotcom/sfdx-core/compare/v3.6.0...v3.6.1) (2021-09-13) - ### Bug Fixes -* remove tokens associated with org ([#477](https://github.com/forcedotcom/sfdx-core/issues/477)) ([5034fa2](https://github.com/forcedotcom/sfdx-core/commit/5034fa2d4c52d347c00499e137a71366e4feba7f)) - - +- remove tokens associated with org ([#477](https://github.com/forcedotcom/sfdx-core/issues/477)) ([5034fa2](https://github.com/forcedotcom/sfdx-core/commit/5034fa2d4c52d347c00499e137a71366e4feba7f)) # [3.6.0](https://github.com/forcedotcom/sfdx-core/compare/v3.5.0...v3.6.0) (2021-09-10) - ### Features -* add help section helper ([#474](https://github.com/forcedotcom/sfdx-core/issues/474)) ([b34c2d7](https://github.com/forcedotcom/sfdx-core/commit/b34c2d7a442aed2cf091fd394a7c3656287d1dbf)) - - +- add help section helper ([#474](https://github.com/forcedotcom/sfdx-core/issues/474)) ([b34c2d7](https://github.com/forcedotcom/sfdx-core/commit/b34c2d7a442aed2cf091fd394a7c3656287d1dbf)) # [3.5.0](https://github.com/forcedotcom/sfdx-core/compare/v3.4.5...v3.5.0) (2021-09-09) - ### Features -* expose well known env vars as part of core ([#473](https://github.com/forcedotcom/sfdx-core/issues/473)) ([11c3f53](https://github.com/forcedotcom/sfdx-core/commit/11c3f53f964459072826274e6ebb33d4a9ecb990)) - - +- expose well known env vars as part of core ([#473](https://github.com/forcedotcom/sfdx-core/issues/473)) ([11c3f53](https://github.com/forcedotcom/sfdx-core/commit/11c3f53f964459072826274e6ebb33d4a9ecb990)) ## [3.4.5](https://github.com/forcedotcom/sfdx-core/compare/v3.4.4...v3.4.5) (2021-09-03) - ### Bug Fixes -* provide the correct options to SfdxConfig ([fa2117e](https://github.com/forcedotcom/sfdx-core/commit/fa2117e12d7a903f26067bdcf35d7ec9c142101e)) - - +- provide the correct options to SfdxConfig ([fa2117e](https://github.com/forcedotcom/sfdx-core/commit/fa2117e12d7a903f26067bdcf35d7ec9c142101e)) ## [3.4.4](https://github.com/forcedotcom/sfdx-core/compare/v3.4.3...v3.4.4) (2021-09-03) - - ## [3.4.3](https://github.com/forcedotcom/sfdx-core/compare/v3.4.2...v3.4.3) (2021-08-26) - - ## [3.4.2](https://github.com/forcedotcom/sfdx-core/compare/v3.4.1...v3.4.2) (2021-08-17) - ### Bug Fixes -* improve interoperability when unsetting ([#467](https://github.com/forcedotcom/sfdx-core/issues/467)) ([ad781d5](https://github.com/forcedotcom/sfdx-core/commit/ad781d5378652dfd64ccb476c11f418e940b8669)) - - +- improve interoperability when unsetting ([#467](https://github.com/forcedotcom/sfdx-core/issues/467)) ([ad781d5](https://github.com/forcedotcom/sfdx-core/commit/ad781d5378652dfd64ccb476c11f418e940b8669)) ## [3.4.1](https://github.com/forcedotcom/sfdx-core/compare/v3.4.0...v3.4.1) (2021-08-11) - ### Bug Fixes -* optionally throw error when reading deprecated config key ([#466](https://github.com/forcedotcom/sfdx-core/issues/466)) ([3118ad8](https://github.com/forcedotcom/sfdx-core/commit/3118ad836db384ac27c2b1db88c4753e6121e4db)) - - +- optionally throw error when reading deprecated config key ([#466](https://github.com/forcedotcom/sfdx-core/issues/466)) ([3118ad8](https://github.com/forcedotcom/sfdx-core/commit/3118ad836db384ac27c2b1db88c4753e6121e4db)) # [3.4.0](https://github.com/forcedotcom/sfdx-core/compare/v3.3.12...v3.4.0) (2021-08-11) - ### Features -* config interoperability ([#461](https://github.com/forcedotcom/sfdx-core/issues/461)) ([11b60ad](https://github.com/forcedotcom/sfdx-core/commit/11b60adbe54acc8e16a90327c77abbe2613fbaab)) - - +- config interoperability ([#461](https://github.com/forcedotcom/sfdx-core/issues/461)) ([11b60ad](https://github.com/forcedotcom/sfdx-core/commit/11b60adbe54acc8e16a90327c77abbe2613fbaab)) ## [3.3.12](https://github.com/forcedotcom/sfdx-core/compare/v2.27.2...v3.3.12) (2021-08-10) - ### Bug Fixes -* add predicate function to list all auths ([ccdb02c](https://github.com/forcedotcom/sfdx-core/commit/ccdb02c268fae7532b23e0c791bcdd831f77cf98)) - - +- add predicate function to list all auths ([ccdb02c](https://github.com/forcedotcom/sfdx-core/commit/ccdb02c268fae7532b23e0c791bcdd831f77cf98)) ## [3.3.11](https://github.com/forcedotcom/sfdx-core/compare/v3.3.10...v3.3.11) (2021-08-04) - ### Bug Fixes -* allows for message keys of error and errors ([#455](https://github.com/forcedotcom/sfdx-core/issues/455)) ([3bfac58](https://github.com/forcedotcom/sfdx-core/commit/3bfac587c6cf1734af6f2b517439d278591ddd50)) - - +- allows for message keys of error and errors ([#455](https://github.com/forcedotcom/sfdx-core/issues/455)) ([3bfac58](https://github.com/forcedotcom/sfdx-core/commit/3bfac587c6cf1734af6f2b517439d278591ddd50)) ## [3.3.10](https://github.com/forcedotcom/sfdx-core/compare/v3.3.9...v3.3.10) (2021-08-04) - - ## [3.3.9](https://github.com/forcedotcom/sfdx-core/compare/v3.3.8...v3.3.9) (2021-08-04) - ### Bug Fixes -* merge main(v2) into v3 ([#452](https://github.com/forcedotcom/sfdx-core/issues/452)) ([3a003b9](https://github.com/forcedotcom/sfdx-core/commit/3a003b9c17962f77344e4a23314bb608e1ae50db)) - - +- merge main(v2) into v3 ([#452](https://github.com/forcedotcom/sfdx-core/issues/452)) ([3a003b9](https://github.com/forcedotcom/sfdx-core/commit/3a003b9c17962f77344e4a23314bb608e1ae50db)) ## [3.3.8](https://github.com/forcedotcom/sfdx-core/compare/v3.3.7...v3.3.8) (2021-08-02) - ### Bug Fixes -* return all info from AuthInfo.listAllAuthorizations ([#449](https://github.com/forcedotcom/sfdx-core/issues/449)) ([17e60ea](https://github.com/forcedotcom/sfdx-core/commit/17e60eabe87c73a83c26344967076f365ddea81c)) - - +- return all info from AuthInfo.listAllAuthorizations ([#449](https://github.com/forcedotcom/sfdx-core/issues/449)) ([17e60ea](https://github.com/forcedotcom/sfdx-core/commit/17e60eabe87c73a83c26344967076f365ddea81c)) ## [3.3.7](https://github.com/forcedotcom/sfdx-core/compare/v2.27.0...v3.3.7) (2021-07-30) - - ## [3.3.6](https://github.com/forcedotcom/sfdx-core/compare/v3.3.5...v3.3.6) (2021-07-28) - ### Bug Fixes -* use correct method to get username ([#446](https://github.com/forcedotcom/sfdx-core/issues/446)) ([79a6b2f](https://github.com/forcedotcom/sfdx-core/commit/79a6b2f069f95b0c50a6c03ecbac07cf0d1832b1)) - - +- use correct method to get username ([#446](https://github.com/forcedotcom/sfdx-core/issues/446)) ([79a6b2f](https://github.com/forcedotcom/sfdx-core/commit/79a6b2f069f95b0c50a6c03ecbac07cf0d1832b1)) ## [3.3.5](https://github.com/forcedotcom/sfdx-core/compare/v3.3.4...v3.3.5) (2021-07-28) - - ## [3.3.4](https://github.com/forcedotcom/sfdx-core/compare/v3.3.3...v3.3.4) (2021-07-26) - ### Bug Fixes -* remove bad validator function ([1b97dc6](https://github.com/forcedotcom/sfdx-core/commit/1b97dc6f4d657a5b86489d33c4843ebfd54b3715)) - - +- remove bad validator function ([1b97dc6](https://github.com/forcedotcom/sfdx-core/commit/1b97dc6f4d657a5b86489d33c4843ebfd54b3715)) ## [3.3.3](https://github.com/forcedotcom/sfdx-core/compare/v3.3.2...v3.3.3) (2021-07-22) - ### Bug Fixes -* write sf.json contents on init ([c47f649](https://github.com/forcedotcom/sfdx-core/commit/c47f64954118d0d2f7f4a8e992d3450516239084)) - - +- write sf.json contents on init ([c47f649](https://github.com/forcedotcom/sfdx-core/commit/c47f64954118d0d2f7f4a8e992d3450516239084)) ## [3.3.2](https://github.com/forcedotcom/sfdx-core/compare/v2.26.1...v3.3.2) (2021-07-21) - ### Bug Fixes -* correct jsdoc ([a362e94](https://github.com/forcedotcom/sfdx-core/commit/a362e94c4ae7538cbbcd7dae8fcd3244629d845c)) - - +- correct jsdoc ([a362e94](https://github.com/forcedotcom/sfdx-core/commit/a362e94c4ae7538cbbcd7dae8fcd3244629d845c)) ## [3.3.1](https://github.com/forcedotcom/sfdx-core/compare/v3.3.0...v3.3.1) (2021-07-15) - ### Bug Fixes -* temporarily point Alias back to .sfdx ([#438](https://github.com/forcedotcom/sfdx-core/issues/438)) ([4bffcd8](https://github.com/forcedotcom/sfdx-core/commit/4bffcd84362d5b3049ef428e90dc1b538a435f81)) - - +- temporarily point Alias back to .sfdx ([#438](https://github.com/forcedotcom/sfdx-core/issues/438)) ([4bffcd8](https://github.com/forcedotcom/sfdx-core/commit/4bffcd84362d5b3049ef428e90dc1b538a435f81)) # [3.3.0](https://github.com/forcedotcom/sfdx-core/compare/v3.2.0-v3.0...v3.3.0) (2021-07-14) - ### Features -* V3 merge ([#436](https://github.com/forcedotcom/sfdx-core/issues/436)) ([1193449](https://github.com/forcedotcom/sfdx-core/commit/119344969147679088e30bae4c4fc5e941661078)), closes [#413](https://github.com/forcedotcom/sfdx-core/issues/413) [#415](https://github.com/forcedotcom/sfdx-core/issues/415) [#428](https://github.com/forcedotcom/sfdx-core/issues/428) [#429](https://github.com/forcedotcom/sfdx-core/issues/429) [#427](https://github.com/forcedotcom/sfdx-core/issues/427) [#432](https://github.com/forcedotcom/sfdx-core/issues/432) - - +- V3 merge ([#436](https://github.com/forcedotcom/sfdx-core/issues/436)) ([1193449](https://github.com/forcedotcom/sfdx-core/commit/119344969147679088e30bae4c4fc5e941661078)), closes [#413](https://github.com/forcedotcom/sfdx-core/issues/413) [#415](https://github.com/forcedotcom/sfdx-core/issues/415) [#428](https://github.com/forcedotcom/sfdx-core/issues/428) [#429](https://github.com/forcedotcom/sfdx-core/issues/429) [#427](https://github.com/forcedotcom/sfdx-core/issues/427) [#432](https://github.com/forcedotcom/sfdx-core/issues/432) # [3.2.0-v3.0](https://github.com/forcedotcom/sfdx-core/compare/v2.26.0...v3.2.0-v3.0) (2021-07-14) - ### Features -* use .sf/config.json @W-9546117@ ([#433](https://github.com/forcedotcom/sfdx-core/issues/433)) ([6c41653](https://github.com/forcedotcom/sfdx-core/commit/6c416531a9bae10e855ded3efc289a99196bc26b)) - - +- use .sf/config.json @W-9546117@ ([#433](https://github.com/forcedotcom/sfdx-core/issues/433)) ([6c41653](https://github.com/forcedotcom/sfdx-core/commit/6c416531a9bae10e855ded3efc289a99196bc26b)) ## [3.1.1-v3.2](https://github.com/forcedotcom/sfdx-core/compare/v2.24.2...v3.1.1-v3.2) (2021-06-29) - ### Bug Fixes -* do not use function prop ([#426](https://github.com/forcedotcom/sfdx-core/issues/426)) ([39efe0c](https://github.com/forcedotcom/sfdx-core/commit/39efe0ccc84b05bc891e54b24bfcddc62790ae0e)) - - +- do not use function prop ([#426](https://github.com/forcedotcom/sfdx-core/issues/426)) ([39efe0c](https://github.com/forcedotcom/sfdx-core/commit/39efe0ccc84b05bc891e54b24bfcddc62790ae0e)) ## [3.1.1-v3.1](https://github.com/forcedotcom/sfdx-core/compare/v2.24.0...v3.1.1-v3.1) (2021-06-14) - ### Bug Fixes -* keep track of auth changes ([210be6c](https://github.com/forcedotcom/sfdx-core/commit/210be6cb408bd9ecc861989570df0e14f6a3a566)) - - +- keep track of auth changes ([210be6c](https://github.com/forcedotcom/sfdx-core/commit/210be6cb408bd9ecc861989570df0e14f6a3a566)) ## [3.1.1-v3.0](https://github.com/forcedotcom/sfdx-core/compare/v2.23.3...v3.1.1-v3.0) (2021-06-03) - ### Bug Fixes -* compilation errors ([33a9876](https://github.com/forcedotcom/sfdx-core/commit/33a9876575eff7944bb287d428f52413831725d9)) -* unit test failures ([4507575](https://github.com/forcedotcom/sfdx-core/commit/45075754175d411b6cb71eb809096e6eb3e23d95)) -* unsetAuthorization ([#399](https://github.com/forcedotcom/sfdx-core/issues/399)) ([dd57438](https://github.com/forcedotcom/sfdx-core/commit/dd57438a95b49515f560d3b915cdf916a4b8643b)) - +- compilation errors ([33a9876](https://github.com/forcedotcom/sfdx-core/commit/33a9876575eff7944bb287d428f52413831725d9)) +- unit test failures ([4507575](https://github.com/forcedotcom/sfdx-core/commit/45075754175d411b6cb71eb809096e6eb3e23d95)) +- unsetAuthorization ([#399](https://github.com/forcedotcom/sfdx-core/issues/399)) ([dd57438](https://github.com/forcedotcom/sfdx-core/commit/dd57438a95b49515f560d3b915cdf916a4b8643b)) ### Features -* add GlobalInfo config file ([#397](https://github.com/forcedotcom/sfdx-core/issues/397)) ([889425c](https://github.com/forcedotcom/sfdx-core/commit/889425c06e8ed6a364d9a2bc3dd5ef0a38a66046)) -* add message support for markdown files ([0f235a2](https://github.com/forcedotcom/sfdx-core/commit/0f235a23d5dddbd7b3f07544d8c7e380875c6c55)) -* move crypto to config file @W-9225317@ ([#406](https://github.com/forcedotcom/sfdx-core/issues/406)) ([bac83c3](https://github.com/forcedotcom/sfdx-core/commit/bac83c3a52b15c9b462dfb68be9d080e710493cd)) - - +- add GlobalInfo config file ([#397](https://github.com/forcedotcom/sfdx-core/issues/397)) ([889425c](https://github.com/forcedotcom/sfdx-core/commit/889425c06e8ed6a364d9a2bc3dd5ef0a38a66046)) +- add message support for markdown files ([0f235a2](https://github.com/forcedotcom/sfdx-core/commit/0f235a23d5dddbd7b3f07544d8c7e380875c6c55)) +- move crypto to config file @W-9225317@ ([#406](https://github.com/forcedotcom/sfdx-core/issues/406)) ([bac83c3](https://github.com/forcedotcom/sfdx-core/commit/bac83c3a52b15c9b462dfb68be9d080e710493cd)) ## [2.28.1](https://github.com/forcedotcom/sfdx-core/compare/v3.6.5...v2.28.1) (2021-10-06) - ### Bug Fixes -* crmforce.mil ([e263d5d](https://github.com/forcedotcom/sfdx-core/commit/e263d5d74be9c0651e5c2676d6eec1c31fca05e4)) - - +- crmforce.mil ([e263d5d](https://github.com/forcedotcom/sfdx-core/commit/e263d5d74be9c0651e5c2676d6eec1c31fca05e4)) # [2.28.0](https://github.com/forcedotcom/sfdx-core/compare/v3.6.1...v2.28.0) (2021-09-16) - ### Features -* add custom templates config ([3cf8a8c](https://github.com/forcedotcom/sfdx-core/commit/3cf8a8cee1e7196efced989dcca9b545e1283386)) -* add validator for custom templates config ([dd2bcfe](https://github.com/forcedotcom/sfdx-core/commit/dd2bcfe8e7fee5c5c1c6321189ec04288103d5b6)) -* update config name ([72e84bf](https://github.com/forcedotcom/sfdx-core/commit/72e84bfacef48a1c2d00a61ebbae3f632601abbd)) - - +- add custom templates config ([3cf8a8c](https://github.com/forcedotcom/sfdx-core/commit/3cf8a8cee1e7196efced989dcca9b545e1283386)) +- add validator for custom templates config ([dd2bcfe](https://github.com/forcedotcom/sfdx-core/commit/dd2bcfe8e7fee5c5c1c6321189ec04288103d5b6)) +- update config name ([72e84bf](https://github.com/forcedotcom/sfdx-core/commit/72e84bfacef48a1c2d00a61ebbae3f632601abbd)) ## [2.27.2](https://github.com/forcedotcom/sfdx-core/compare/v2.27.1...v2.27.2) (2021-08-05) - ### Bug Fixes -* improve error handling while removing config props ([eecf7b0](https://github.com/forcedotcom/sfdx-core/commit/eecf7b0d0cf14e1371dc4c5ef03a413f864b0a8b)) - - +- improve error handling while removing config props ([eecf7b0](https://github.com/forcedotcom/sfdx-core/commit/eecf7b0d0cf14e1371dc4c5ef03a413f864b0a8b)) ## [2.27.1](https://github.com/forcedotcom/sfdx-core/compare/v3.3.11...v2.27.1) (2021-08-05) - ### Bug Fixes -* dont fail when trying to unset sf config keys ([#456](https://github.com/forcedotcom/sfdx-core/issues/456)) ([8aff9fd](https://github.com/forcedotcom/sfdx-core/commit/8aff9fd4bdb73ec20e58f5a16a8192a8eecba912)) - - +- dont fail when trying to unset sf config keys ([#456](https://github.com/forcedotcom/sfdx-core/issues/456)) ([8aff9fd](https://github.com/forcedotcom/sfdx-core/commit/8aff9fd4bdb73ec20e58f5a16a8192a8eecba912)) # [2.27.0](https://github.com/forcedotcom/sfdx-core/compare/v3.3.6...v2.27.0) (2021-07-29) - ### Features -* Core URL class SfdcUrl ([#420](https://github.com/forcedotcom/sfdx-core/issues/420)) ([66881ea](https://github.com/forcedotcom/sfdx-core/commit/66881eae2f30215c862ea398bfc1630d9a5898fe)) - - +- Core URL class SfdcUrl ([#420](https://github.com/forcedotcom/sfdx-core/issues/420)) ([66881ea](https://github.com/forcedotcom/sfdx-core/commit/66881eae2f30215c862ea398bfc1630d9a5898fe)) ## [2.26.1](https://github.com/forcedotcom/sfdx-core/compare/v3.3.1...v2.26.1) (2021-07-19) - ### Bug Fixes -* force:org:open force:org:open --urlonly display bug ([#439](https://github.com/forcedotcom/sfdx-core/issues/439)) ([2ea0e74](https://github.com/forcedotcom/sfdx-core/commit/2ea0e74b8bf1bff6de8af70372025cac10fc8c18)) - - +- force:org:open force:org:open --urlonly display bug ([#439](https://github.com/forcedotcom/sfdx-core/issues/439)) ([2ea0e74](https://github.com/forcedotcom/sfdx-core/commit/2ea0e74b8bf1bff6de8af70372025cac10fc8c18)) # [2.26.0](https://github.com/forcedotcom/sfdx-core/compare/v2.25.1...v2.26.0) (2021-07-13) - ### Features -* update generate password functionality ([#432](https://github.com/forcedotcom/sfdx-core/issues/432)) ([ed65e83](https://github.com/forcedotcom/sfdx-core/commit/ed65e83da3afe0d101743ee89cc7b2a7a38d5254)) - - +- update generate password functionality ([#432](https://github.com/forcedotcom/sfdx-core/issues/432)) ([ed65e83](https://github.com/forcedotcom/sfdx-core/commit/ed65e83da3afe0d101743ee89cc7b2a7a38d5254)) ## [2.25.1](https://github.com/forcedotcom/sfdx-core/compare/v3.1.1-3.2...v2.25.1) (2021-06-30) - ### Bug Fixes -* set retries to INFINITELY for polling client ([31539b4](https://github.com/forcedotcom/sfdx-core/commit/31539b4f0edd0cc1c049f70331ed5e40b8af55ea)) - - +- set retries to INFINITELY for polling client ([31539b4](https://github.com/forcedotcom/sfdx-core/commit/31539b4f0edd0cc1c049f70331ed5e40b8af55ea)) ## [3.1.1-3.2](https://github.com/forcedotcom/sfdx-core/compare/v2.25.0...v3.1.1-3.2) (2021-06-30) - ### Features -* @W-9517449@ Allow signupTargetLoginUrl to be overridden via env var ([#429](https://github.com/forcedotcom/sfdx-core/issues/429)) ([e2b8b36](https://github.com/forcedotcom/sfdx-core/commit/e2b8b36b2836b5277c83ffe22922978dc32e7b11)), closes [#427](https://github.com/forcedotcom/sfdx-core/issues/427) - - +- @W-9517449@ Allow signupTargetLoginUrl to be overridden via env var ([#429](https://github.com/forcedotcom/sfdx-core/issues/429)) ([e2b8b36](https://github.com/forcedotcom/sfdx-core/commit/e2b8b36b2836b5277c83ffe22922978dc32e7b11)), closes [#427](https://github.com/forcedotcom/sfdx-core/issues/427) ## [2.24.2](https://github.com/forcedotcom/sfdx-core/compare/v3.1.1-3.1...v2.24.2) (2021-06-23) - - ## [3.1.1-3.1](https://github.com/forcedotcom/sfdx-core/compare/v2.24.1...v3.1.1-3.1) (2021-06-23) - ### Bug Fixes -* puts some types back in dependencies ([94bea31](https://github.com/forcedotcom/sfdx-core/commit/94bea31037a41d4377faecb22bce8a2d12e95f4f)) -* rewrite polling client ([8d363d1](https://github.com/forcedotcom/sfdx-core/commit/8d363d13616f5efa944d4bb717a010add3c996b5)) - - +- puts some types back in dependencies ([94bea31](https://github.com/forcedotcom/sfdx-core/commit/94bea31037a41d4377faecb22bce8a2d12e95f4f)) +- rewrite polling client ([8d363d1](https://github.com/forcedotcom/sfdx-core/commit/8d363d13616f5efa944d4bb717a010add3c996b5)) # [2.24.0](https://github.com/forcedotcom/sfdx-core/compare/v2.23.5...v2.24.0) (2021-06-08) - ### Features -* exported function checkLightningDomain() ([#415](https://github.com/forcedotcom/sfdx-core/issues/415)) ([8e75231](https://github.com/forcedotcom/sfdx-core/commit/8e752313abf4a383a6ef18250ffac78b398987dd)) - - +- exported function checkLightningDomain() ([#415](https://github.com/forcedotcom/sfdx-core/issues/415)) ([8e75231](https://github.com/forcedotcom/sfdx-core/commit/8e752313abf4a383a6ef18250ffac78b398987dd)) ## [2.23.5](https://github.com/forcedotcom/sfdx-core/compare/v3.1.1-3.0...v2.23.5) (2021-06-07) - ### Bug Fixes -* w-9299422 (login url from config) and fs-parallelization ([043bb17](https://github.com/forcedotcom/sfdx-core/commit/043bb179dbf64f9c4522a4c0f0720ae09794227c)) - - +- w-9299422 (login url from config) and fs-parallelization ([043bb17](https://github.com/forcedotcom/sfdx-core/commit/043bb179dbf64f9c4522a4c0f0720ae09794227c)) ## [3.1.1-3.0](https://github.com/forcedotcom/sfdx-core/compare/v2.23.4...v3.1.1-3.0) (2021-06-03) - ### Bug Fixes -* works with TS4+ and jsforce types ([#413](https://github.com/forcedotcom/sfdx-core/issues/413)) ([b77cdad](https://github.com/forcedotcom/sfdx-core/commit/b77cdad56b114290b8e5fd23d968e23e7d4eedf4)) - - +- works with TS4+ and jsforce types ([#413](https://github.com/forcedotcom/sfdx-core/issues/413)) ([b77cdad](https://github.com/forcedotcom/sfdx-core/commit/b77cdad56b114290b8e5fd23d968e23e7d4eedf4)) ## [3.6.5](https://github.com/forcedotcom/sfdx-core/compare/v3.6.4...v3.6.5) (2021-09-29) - ### Bug Fixes -* add getValue to AliasAccessor ([c4b69f5](https://github.com/forcedotcom/sfdx-core/commit/c4b69f5ff38547fad640c64833291fe0c6e06a79)) - - +- add getValue to AliasAccessor ([c4b69f5](https://github.com/forcedotcom/sfdx-core/commit/c4b69f5ff38547fad640c64833291fe0c6e06a79)) ## [3.6.4](https://github.com/forcedotcom/sfdx-core/compare/v3.6.3...v3.6.4) (2021-09-23) - ### Bug Fixes -* edit the env var blurbs ([#482](https://github.com/forcedotcom/sfdx-core/issues/482)) ([bbbdb6d](https://github.com/forcedotcom/sfdx-core/commit/bbbdb6d0800015e94ce0f0c551eec8ed73dd87c6)) - - +- edit the env var blurbs ([#482](https://github.com/forcedotcom/sfdx-core/issues/482)) ([bbbdb6d](https://github.com/forcedotcom/sfdx-core/commit/bbbdb6d0800015e94ce0f0c551eec8ed73dd87c6)) ## [3.6.3](https://github.com/forcedotcom/sfdx-core/compare/v3.6.2...v3.6.3) (2021-09-23) - ### Bug Fixes -* edit the config var blurbs ([#480](https://github.com/forcedotcom/sfdx-core/issues/480)) ([f845512](https://github.com/forcedotcom/sfdx-core/commit/f8455121bfd96f27495bc124dc06570632dfce70)) - - +- edit the config var blurbs ([#480](https://github.com/forcedotcom/sfdx-core/issues/480)) ([f845512](https://github.com/forcedotcom/sfdx-core/commit/f8455121bfd96f27495bc124dc06570632dfce70)) ## [3.6.2](https://github.com/forcedotcom/sfdx-core/compare/v2.28.0...v3.6.2) (2021-09-17) - ### Bug Fixes -* improve time to build auths for many orgs @W-9914839@ ([#478](https://github.com/forcedotcom/sfdx-core/issues/478)) ([c788541](https://github.com/forcedotcom/sfdx-core/commit/c7885415d59994b28552227f0b84dcee5d3ec7cf)) - - +- improve time to build auths for many orgs @W-9914839@ ([#478](https://github.com/forcedotcom/sfdx-core/issues/478)) ([c788541](https://github.com/forcedotcom/sfdx-core/commit/c7885415d59994b28552227f0b84dcee5d3ec7cf)) ## [3.6.1](https://github.com/forcedotcom/sfdx-core/compare/v3.6.0...v3.6.1) (2021-09-13) - ### Bug Fixes -* remove tokens associated with org ([#477](https://github.com/forcedotcom/sfdx-core/issues/477)) ([5034fa2](https://github.com/forcedotcom/sfdx-core/commit/5034fa2d4c52d347c00499e137a71366e4feba7f)) - - +- remove tokens associated with org ([#477](https://github.com/forcedotcom/sfdx-core/issues/477)) ([5034fa2](https://github.com/forcedotcom/sfdx-core/commit/5034fa2d4c52d347c00499e137a71366e4feba7f)) # [3.6.0](https://github.com/forcedotcom/sfdx-core/compare/v3.5.0...v3.6.0) (2021-09-10) - ### Features -* add help section helper ([#474](https://github.com/forcedotcom/sfdx-core/issues/474)) ([b34c2d7](https://github.com/forcedotcom/sfdx-core/commit/b34c2d7a442aed2cf091fd394a7c3656287d1dbf)) - - +- add help section helper ([#474](https://github.com/forcedotcom/sfdx-core/issues/474)) ([b34c2d7](https://github.com/forcedotcom/sfdx-core/commit/b34c2d7a442aed2cf091fd394a7c3656287d1dbf)) # [3.5.0](https://github.com/forcedotcom/sfdx-core/compare/v3.4.5...v3.5.0) (2021-09-09) - ### Features -* expose well known env vars as part of core ([#473](https://github.com/forcedotcom/sfdx-core/issues/473)) ([11c3f53](https://github.com/forcedotcom/sfdx-core/commit/11c3f53f964459072826274e6ebb33d4a9ecb990)) - - +- expose well known env vars as part of core ([#473](https://github.com/forcedotcom/sfdx-core/issues/473)) ([11c3f53](https://github.com/forcedotcom/sfdx-core/commit/11c3f53f964459072826274e6ebb33d4a9ecb990)) ## [3.4.5](https://github.com/forcedotcom/sfdx-core/compare/v3.4.4...v3.4.5) (2021-09-03) - ### Bug Fixes -* provide the correct options to SfdxConfig ([fa2117e](https://github.com/forcedotcom/sfdx-core/commit/fa2117e12d7a903f26067bdcf35d7ec9c142101e)) - - +- provide the correct options to SfdxConfig ([fa2117e](https://github.com/forcedotcom/sfdx-core/commit/fa2117e12d7a903f26067bdcf35d7ec9c142101e)) ## [3.4.4](https://github.com/forcedotcom/sfdx-core/compare/v3.4.3...v3.4.4) (2021-09-03) - - ## [3.4.3](https://github.com/forcedotcom/sfdx-core/compare/v3.4.2...v3.4.3) (2021-08-26) - - ## [3.4.2](https://github.com/forcedotcom/sfdx-core/compare/v3.4.1...v3.4.2) (2021-08-17) - ### Bug Fixes -* improve interoperability when unsetting ([#467](https://github.com/forcedotcom/sfdx-core/issues/467)) ([ad781d5](https://github.com/forcedotcom/sfdx-core/commit/ad781d5378652dfd64ccb476c11f418e940b8669)) - - +- improve interoperability when unsetting ([#467](https://github.com/forcedotcom/sfdx-core/issues/467)) ([ad781d5](https://github.com/forcedotcom/sfdx-core/commit/ad781d5378652dfd64ccb476c11f418e940b8669)) ## [3.4.1](https://github.com/forcedotcom/sfdx-core/compare/v3.4.0...v3.4.1) (2021-08-11) - ### Bug Fixes -* optionally throw error when reading deprecated config key ([#466](https://github.com/forcedotcom/sfdx-core/issues/466)) ([3118ad8](https://github.com/forcedotcom/sfdx-core/commit/3118ad836db384ac27c2b1db88c4753e6121e4db)) - - +- optionally throw error when reading deprecated config key ([#466](https://github.com/forcedotcom/sfdx-core/issues/466)) ([3118ad8](https://github.com/forcedotcom/sfdx-core/commit/3118ad836db384ac27c2b1db88c4753e6121e4db)) # [3.4.0](https://github.com/forcedotcom/sfdx-core/compare/v3.3.12...v3.4.0) (2021-08-11) - ### Features -* config interoperability ([#461](https://github.com/forcedotcom/sfdx-core/issues/461)) ([11b60ad](https://github.com/forcedotcom/sfdx-core/commit/11b60adbe54acc8e16a90327c77abbe2613fbaab)) - - +- config interoperability ([#461](https://github.com/forcedotcom/sfdx-core/issues/461)) ([11b60ad](https://github.com/forcedotcom/sfdx-core/commit/11b60adbe54acc8e16a90327c77abbe2613fbaab)) ## [3.3.12](https://github.com/forcedotcom/sfdx-core/compare/v2.27.2...v3.3.12) (2021-08-10) - ### Bug Fixes -* add predicate function to list all auths ([ccdb02c](https://github.com/forcedotcom/sfdx-core/commit/ccdb02c268fae7532b23e0c791bcdd831f77cf98)) - - +- add predicate function to list all auths ([ccdb02c](https://github.com/forcedotcom/sfdx-core/commit/ccdb02c268fae7532b23e0c791bcdd831f77cf98)) ## [3.3.11](https://github.com/forcedotcom/sfdx-core/compare/v3.3.10...v3.3.11) (2021-08-04) - ### Bug Fixes -* allows for message keys of error and errors ([#455](https://github.com/forcedotcom/sfdx-core/issues/455)) ([3bfac58](https://github.com/forcedotcom/sfdx-core/commit/3bfac587c6cf1734af6f2b517439d278591ddd50)) - - +- allows for message keys of error and errors ([#455](https://github.com/forcedotcom/sfdx-core/issues/455)) ([3bfac58](https://github.com/forcedotcom/sfdx-core/commit/3bfac587c6cf1734af6f2b517439d278591ddd50)) ## [3.3.10](https://github.com/forcedotcom/sfdx-core/compare/v3.3.9...v3.3.10) (2021-08-04) - - ## [3.3.9](https://github.com/forcedotcom/sfdx-core/compare/v3.3.8...v3.3.9) (2021-08-04) - ### Bug Fixes -* merge main(v2) into v3 ([#452](https://github.com/forcedotcom/sfdx-core/issues/452)) ([3a003b9](https://github.com/forcedotcom/sfdx-core/commit/3a003b9c17962f77344e4a23314bb608e1ae50db)) - - +- merge main(v2) into v3 ([#452](https://github.com/forcedotcom/sfdx-core/issues/452)) ([3a003b9](https://github.com/forcedotcom/sfdx-core/commit/3a003b9c17962f77344e4a23314bb608e1ae50db)) ## [3.3.8](https://github.com/forcedotcom/sfdx-core/compare/v3.3.7...v3.3.8) (2021-08-02) - ### Bug Fixes -* return all info from AuthInfo.listAllAuthorizations ([#449](https://github.com/forcedotcom/sfdx-core/issues/449)) ([17e60ea](https://github.com/forcedotcom/sfdx-core/commit/17e60eabe87c73a83c26344967076f365ddea81c)) - - +- return all info from AuthInfo.listAllAuthorizations ([#449](https://github.com/forcedotcom/sfdx-core/issues/449)) ([17e60ea](https://github.com/forcedotcom/sfdx-core/commit/17e60eabe87c73a83c26344967076f365ddea81c)) ## [3.3.7](https://github.com/forcedotcom/sfdx-core/compare/v2.27.0...v3.3.7) (2021-07-30) - - ## [3.3.6](https://github.com/forcedotcom/sfdx-core/compare/v3.3.5...v3.3.6) (2021-07-28) - ### Bug Fixes -* use correct method to get username ([#446](https://github.com/forcedotcom/sfdx-core/issues/446)) ([79a6b2f](https://github.com/forcedotcom/sfdx-core/commit/79a6b2f069f95b0c50a6c03ecbac07cf0d1832b1)) - - +- use correct method to get username ([#446](https://github.com/forcedotcom/sfdx-core/issues/446)) ([79a6b2f](https://github.com/forcedotcom/sfdx-core/commit/79a6b2f069f95b0c50a6c03ecbac07cf0d1832b1)) ## [3.3.5](https://github.com/forcedotcom/sfdx-core/compare/v3.3.4...v3.3.5) (2021-07-28) - - ## [3.3.4](https://github.com/forcedotcom/sfdx-core/compare/v3.3.3...v3.3.4) (2021-07-26) - ### Bug Fixes -* remove bad validator function ([1b97dc6](https://github.com/forcedotcom/sfdx-core/commit/1b97dc6f4d657a5b86489d33c4843ebfd54b3715)) - - +- remove bad validator function ([1b97dc6](https://github.com/forcedotcom/sfdx-core/commit/1b97dc6f4d657a5b86489d33c4843ebfd54b3715)) ## [3.3.3](https://github.com/forcedotcom/sfdx-core/compare/v3.3.2...v3.3.3) (2021-07-22) - ### Bug Fixes -* write sf.json contents on init ([c47f649](https://github.com/forcedotcom/sfdx-core/commit/c47f64954118d0d2f7f4a8e992d3450516239084)) - - +- write sf.json contents on init ([c47f649](https://github.com/forcedotcom/sfdx-core/commit/c47f64954118d0d2f7f4a8e992d3450516239084)) ## [3.3.2](https://github.com/forcedotcom/sfdx-core/compare/v2.26.1...v3.3.2) (2021-07-21) - ### Bug Fixes -* correct jsdoc ([a362e94](https://github.com/forcedotcom/sfdx-core/commit/a362e94c4ae7538cbbcd7dae8fcd3244629d845c)) - - +- correct jsdoc ([a362e94](https://github.com/forcedotcom/sfdx-core/commit/a362e94c4ae7538cbbcd7dae8fcd3244629d845c)) ## [3.3.1](https://github.com/forcedotcom/sfdx-core/compare/v3.3.0...v3.3.1) (2021-07-15) - ### Bug Fixes -* temporarily point Alias back to .sfdx ([#438](https://github.com/forcedotcom/sfdx-core/issues/438)) ([4bffcd8](https://github.com/forcedotcom/sfdx-core/commit/4bffcd84362d5b3049ef428e90dc1b538a435f81)) - - +- temporarily point Alias back to .sfdx ([#438](https://github.com/forcedotcom/sfdx-core/issues/438)) ([4bffcd8](https://github.com/forcedotcom/sfdx-core/commit/4bffcd84362d5b3049ef428e90dc1b538a435f81)) # [3.3.0](https://github.com/forcedotcom/sfdx-core/compare/v3.2.0-v3.0...v3.3.0) (2021-07-14) - ### Features -* V3 merge ([#436](https://github.com/forcedotcom/sfdx-core/issues/436)) ([1193449](https://github.com/forcedotcom/sfdx-core/commit/119344969147679088e30bae4c4fc5e941661078)), closes [#413](https://github.com/forcedotcom/sfdx-core/issues/413) [#415](https://github.com/forcedotcom/sfdx-core/issues/415) [#428](https://github.com/forcedotcom/sfdx-core/issues/428) [#429](https://github.com/forcedotcom/sfdx-core/issues/429) [#427](https://github.com/forcedotcom/sfdx-core/issues/427) [#432](https://github.com/forcedotcom/sfdx-core/issues/432) - - +- V3 merge ([#436](https://github.com/forcedotcom/sfdx-core/issues/436)) ([1193449](https://github.com/forcedotcom/sfdx-core/commit/119344969147679088e30bae4c4fc5e941661078)), closes [#413](https://github.com/forcedotcom/sfdx-core/issues/413) [#415](https://github.com/forcedotcom/sfdx-core/issues/415) [#428](https://github.com/forcedotcom/sfdx-core/issues/428) [#429](https://github.com/forcedotcom/sfdx-core/issues/429) [#427](https://github.com/forcedotcom/sfdx-core/issues/427) [#432](https://github.com/forcedotcom/sfdx-core/issues/432) # [3.2.0-v3.0](https://github.com/forcedotcom/sfdx-core/compare/v2.26.0...v3.2.0-v3.0) (2021-07-14) - ### Features -* use .sf/config.json @W-9546117@ ([#433](https://github.com/forcedotcom/sfdx-core/issues/433)) ([6c41653](https://github.com/forcedotcom/sfdx-core/commit/6c416531a9bae10e855ded3efc289a99196bc26b)) - - +- use .sf/config.json @W-9546117@ ([#433](https://github.com/forcedotcom/sfdx-core/issues/433)) ([6c41653](https://github.com/forcedotcom/sfdx-core/commit/6c416531a9bae10e855ded3efc289a99196bc26b)) ## [3.1.1-v3.2](https://github.com/forcedotcom/sfdx-core/compare/v2.24.2...v3.1.1-v3.2) (2021-06-29) - ### Bug Fixes -* do not use function prop ([#426](https://github.com/forcedotcom/sfdx-core/issues/426)) ([39efe0c](https://github.com/forcedotcom/sfdx-core/commit/39efe0ccc84b05bc891e54b24bfcddc62790ae0e)) - - +- do not use function prop ([#426](https://github.com/forcedotcom/sfdx-core/issues/426)) ([39efe0c](https://github.com/forcedotcom/sfdx-core/commit/39efe0ccc84b05bc891e54b24bfcddc62790ae0e)) ## [3.1.1-v3.1](https://github.com/forcedotcom/sfdx-core/compare/v2.24.0...v3.1.1-v3.1) (2021-06-14) - ### Bug Fixes -* keep track of auth changes ([210be6c](https://github.com/forcedotcom/sfdx-core/commit/210be6cb408bd9ecc861989570df0e14f6a3a566)) - - +- keep track of auth changes ([210be6c](https://github.com/forcedotcom/sfdx-core/commit/210be6cb408bd9ecc861989570df0e14f6a3a566)) ## [3.1.1-v3.0](https://github.com/forcedotcom/sfdx-core/compare/v2.23.3...v3.1.1-v3.0) (2021-06-03) - ### Bug Fixes -* compilation errors ([33a9876](https://github.com/forcedotcom/sfdx-core/commit/33a9876575eff7944bb287d428f52413831725d9)) -* unit test failures ([4507575](https://github.com/forcedotcom/sfdx-core/commit/45075754175d411b6cb71eb809096e6eb3e23d95)) -* unsetAuthorization ([#399](https://github.com/forcedotcom/sfdx-core/issues/399)) ([dd57438](https://github.com/forcedotcom/sfdx-core/commit/dd57438a95b49515f560d3b915cdf916a4b8643b)) - +- compilation errors ([33a9876](https://github.com/forcedotcom/sfdx-core/commit/33a9876575eff7944bb287d428f52413831725d9)) +- unit test failures ([4507575](https://github.com/forcedotcom/sfdx-core/commit/45075754175d411b6cb71eb809096e6eb3e23d95)) +- unsetAuthorization ([#399](https://github.com/forcedotcom/sfdx-core/issues/399)) ([dd57438](https://github.com/forcedotcom/sfdx-core/commit/dd57438a95b49515f560d3b915cdf916a4b8643b)) ### Features -* add GlobalInfo config file ([#397](https://github.com/forcedotcom/sfdx-core/issues/397)) ([889425c](https://github.com/forcedotcom/sfdx-core/commit/889425c06e8ed6a364d9a2bc3dd5ef0a38a66046)) -* add message support for markdown files ([0f235a2](https://github.com/forcedotcom/sfdx-core/commit/0f235a23d5dddbd7b3f07544d8c7e380875c6c55)) -* move crypto to config file @W-9225317@ ([#406](https://github.com/forcedotcom/sfdx-core/issues/406)) ([bac83c3](https://github.com/forcedotcom/sfdx-core/commit/bac83c3a52b15c9b462dfb68be9d080e710493cd)) - - +- add GlobalInfo config file ([#397](https://github.com/forcedotcom/sfdx-core/issues/397)) ([889425c](https://github.com/forcedotcom/sfdx-core/commit/889425c06e8ed6a364d9a2bc3dd5ef0a38a66046)) +- add message support for markdown files ([0f235a2](https://github.com/forcedotcom/sfdx-core/commit/0f235a23d5dddbd7b3f07544d8c7e380875c6c55)) +- move crypto to config file @W-9225317@ ([#406](https://github.com/forcedotcom/sfdx-core/issues/406)) ([bac83c3](https://github.com/forcedotcom/sfdx-core/commit/bac83c3a52b15c9b462dfb68be9d080e710493cd)) # [2.28.0](https://github.com/forcedotcom/sfdx-core/compare/v3.6.1...v2.28.0) (2021-09-16) - ### Features -* add custom templates config ([3cf8a8c](https://github.com/forcedotcom/sfdx-core/commit/3cf8a8cee1e7196efced989dcca9b545e1283386)) -* add validator for custom templates config ([dd2bcfe](https://github.com/forcedotcom/sfdx-core/commit/dd2bcfe8e7fee5c5c1c6321189ec04288103d5b6)) -* update config name ([72e84bf](https://github.com/forcedotcom/sfdx-core/commit/72e84bfacef48a1c2d00a61ebbae3f632601abbd)) - - +- add custom templates config ([3cf8a8c](https://github.com/forcedotcom/sfdx-core/commit/3cf8a8cee1e7196efced989dcca9b545e1283386)) +- add validator for custom templates config ([dd2bcfe](https://github.com/forcedotcom/sfdx-core/commit/dd2bcfe8e7fee5c5c1c6321189ec04288103d5b6)) +- update config name ([72e84bf](https://github.com/forcedotcom/sfdx-core/commit/72e84bfacef48a1c2d00a61ebbae3f632601abbd)) ## [2.27.2](https://github.com/forcedotcom/sfdx-core/compare/v2.27.1...v2.27.2) (2021-08-05) - ### Bug Fixes -* improve error handling while removing config props ([eecf7b0](https://github.com/forcedotcom/sfdx-core/commit/eecf7b0d0cf14e1371dc4c5ef03a413f864b0a8b)) - - +- improve error handling while removing config props ([eecf7b0](https://github.com/forcedotcom/sfdx-core/commit/eecf7b0d0cf14e1371dc4c5ef03a413f864b0a8b)) ## [2.27.1](https://github.com/forcedotcom/sfdx-core/compare/v3.3.11...v2.27.1) (2021-08-05) - ### Bug Fixes -* dont fail when trying to unset sf config keys ([#456](https://github.com/forcedotcom/sfdx-core/issues/456)) ([8aff9fd](https://github.com/forcedotcom/sfdx-core/commit/8aff9fd4bdb73ec20e58f5a16a8192a8eecba912)) - - +- dont fail when trying to unset sf config keys ([#456](https://github.com/forcedotcom/sfdx-core/issues/456)) ([8aff9fd](https://github.com/forcedotcom/sfdx-core/commit/8aff9fd4bdb73ec20e58f5a16a8192a8eecba912)) # [2.27.0](https://github.com/forcedotcom/sfdx-core/compare/v3.3.6...v2.27.0) (2021-07-29) - ### Features -* Core URL class SfdcUrl ([#420](https://github.com/forcedotcom/sfdx-core/issues/420)) ([66881ea](https://github.com/forcedotcom/sfdx-core/commit/66881eae2f30215c862ea398bfc1630d9a5898fe)) - - +- Core URL class SfdcUrl ([#420](https://github.com/forcedotcom/sfdx-core/issues/420)) ([66881ea](https://github.com/forcedotcom/sfdx-core/commit/66881eae2f30215c862ea398bfc1630d9a5898fe)) ## [2.26.1](https://github.com/forcedotcom/sfdx-core/compare/v3.3.1...v2.26.1) (2021-07-19) +### Bug Fixes -### Bug Fixes - -* force:org:open force:org:open --urlonly display bug ([#439](https://github.com/forcedotcom/sfdx-core/issues/439)) ([2ea0e74](https://github.com/forcedotcom/sfdx-core/commit/2ea0e74b8bf1bff6de8af70372025cac10fc8c18)) - - +- force:org:open force:org:open --urlonly display bug ([#439](https://github.com/forcedotcom/sfdx-core/issues/439)) ([2ea0e74](https://github.com/forcedotcom/sfdx-core/commit/2ea0e74b8bf1bff6de8af70372025cac10fc8c18)) # [2.26.0](https://github.com/forcedotcom/sfdx-core/compare/v2.25.1...v2.26.0) (2021-07-13) - ### Features -* update generate password functionality ([#432](https://github.com/forcedotcom/sfdx-core/issues/432)) ([ed65e83](https://github.com/forcedotcom/sfdx-core/commit/ed65e83da3afe0d101743ee89cc7b2a7a38d5254)) - - +- update generate password functionality ([#432](https://github.com/forcedotcom/sfdx-core/issues/432)) ([ed65e83](https://github.com/forcedotcom/sfdx-core/commit/ed65e83da3afe0d101743ee89cc7b2a7a38d5254)) ## [2.25.1](https://github.com/forcedotcom/sfdx-core/compare/v3.1.1-3.2...v2.25.1) (2021-06-30) - ### Bug Fixes -* set retries to INFINITELY for polling client ([31539b4](https://github.com/forcedotcom/sfdx-core/commit/31539b4f0edd0cc1c049f70331ed5e40b8af55ea)) - - +- set retries to INFINITELY for polling client ([31539b4](https://github.com/forcedotcom/sfdx-core/commit/31539b4f0edd0cc1c049f70331ed5e40b8af55ea)) ## [3.1.1-3.2](https://github.com/forcedotcom/sfdx-core/compare/v2.25.0...v3.1.1-3.2) (2021-06-30) - ### Features -* @W-9517449@ Allow signupTargetLoginUrl to be overridden via env var ([#429](https://github.com/forcedotcom/sfdx-core/issues/429)) ([e2b8b36](https://github.com/forcedotcom/sfdx-core/commit/e2b8b36b2836b5277c83ffe22922978dc32e7b11)), closes [#427](https://github.com/forcedotcom/sfdx-core/issues/427) - - +- @W-9517449@ Allow signupTargetLoginUrl to be overridden via env var ([#429](https://github.com/forcedotcom/sfdx-core/issues/429)) ([e2b8b36](https://github.com/forcedotcom/sfdx-core/commit/e2b8b36b2836b5277c83ffe22922978dc32e7b11)), closes [#427](https://github.com/forcedotcom/sfdx-core/issues/427) ## [2.24.2](https://github.com/forcedotcom/sfdx-core/compare/v3.1.1-3.1...v2.24.2) (2021-06-23) - - ## [3.1.1-3.1](https://github.com/forcedotcom/sfdx-core/compare/v2.24.1...v3.1.1-3.1) (2021-06-23) - ### Bug Fixes -* puts some types back in dependencies ([94bea31](https://github.com/forcedotcom/sfdx-core/commit/94bea31037a41d4377faecb22bce8a2d12e95f4f)) -* rewrite polling client ([8d363d1](https://github.com/forcedotcom/sfdx-core/commit/8d363d13616f5efa944d4bb717a010add3c996b5)) - - +- puts some types back in dependencies ([94bea31](https://github.com/forcedotcom/sfdx-core/commit/94bea31037a41d4377faecb22bce8a2d12e95f4f)) +- rewrite polling client ([8d363d1](https://github.com/forcedotcom/sfdx-core/commit/8d363d13616f5efa944d4bb717a010add3c996b5)) # [2.24.0](https://github.com/forcedotcom/sfdx-core/compare/v2.23.5...v2.24.0) (2021-06-08) - ### Features -* exported function checkLightningDomain() ([#415](https://github.com/forcedotcom/sfdx-core/issues/415)) ([8e75231](https://github.com/forcedotcom/sfdx-core/commit/8e752313abf4a383a6ef18250ffac78b398987dd)) - - +- exported function checkLightningDomain() ([#415](https://github.com/forcedotcom/sfdx-core/issues/415)) ([8e75231](https://github.com/forcedotcom/sfdx-core/commit/8e752313abf4a383a6ef18250ffac78b398987dd)) ## [2.23.5](https://github.com/forcedotcom/sfdx-core/compare/v3.1.1-3.0...v2.23.5) (2021-06-07) - ### Bug Fixes -* w-9299422 (login url from config) and fs-parallelization ([043bb17](https://github.com/forcedotcom/sfdx-core/commit/043bb179dbf64f9c4522a4c0f0720ae09794227c)) - - +- w-9299422 (login url from config) and fs-parallelization ([043bb17](https://github.com/forcedotcom/sfdx-core/commit/043bb179dbf64f9c4522a4c0f0720ae09794227c)) ## [3.1.1-3.0](https://github.com/forcedotcom/sfdx-core/compare/v2.23.4...v3.1.1-3.0) (2021-06-03) - ### Bug Fixes -* works with TS4+ and jsforce types ([#413](https://github.com/forcedotcom/sfdx-core/issues/413)) ([b77cdad](https://github.com/forcedotcom/sfdx-core/commit/b77cdad56b114290b8e5fd23d968e23e7d4eedf4)) - - +- works with TS4+ and jsforce types ([#413](https://github.com/forcedotcom/sfdx-core/issues/413)) ([b77cdad](https://github.com/forcedotcom/sfdx-core/commit/b77cdad56b114290b8e5fd23d968e23e7d4eedf4)) ## [3.6.1](https://github.com/forcedotcom/sfdx-core/compare/v3.6.0...v3.6.1) (2021-09-13) - ### Bug Fixes -* remove tokens associated with org ([#477](https://github.com/forcedotcom/sfdx-core/issues/477)) ([5034fa2](https://github.com/forcedotcom/sfdx-core/commit/5034fa2d4c52d347c00499e137a71366e4feba7f)) - - +- remove tokens associated with org ([#477](https://github.com/forcedotcom/sfdx-core/issues/477)) ([5034fa2](https://github.com/forcedotcom/sfdx-core/commit/5034fa2d4c52d347c00499e137a71366e4feba7f)) # [3.6.0](https://github.com/forcedotcom/sfdx-core/compare/v3.5.0...v3.6.0) (2021-09-10) - ### Features -* add help section helper ([#474](https://github.com/forcedotcom/sfdx-core/issues/474)) ([b34c2d7](https://github.com/forcedotcom/sfdx-core/commit/b34c2d7a442aed2cf091fd394a7c3656287d1dbf)) - - +- add help section helper ([#474](https://github.com/forcedotcom/sfdx-core/issues/474)) ([b34c2d7](https://github.com/forcedotcom/sfdx-core/commit/b34c2d7a442aed2cf091fd394a7c3656287d1dbf)) # [3.5.0](https://github.com/forcedotcom/sfdx-core/compare/v3.4.5...v3.5.0) (2021-09-09) - ### Features -* expose well known env vars as part of core ([#473](https://github.com/forcedotcom/sfdx-core/issues/473)) ([11c3f53](https://github.com/forcedotcom/sfdx-core/commit/11c3f53f964459072826274e6ebb33d4a9ecb990)) - - +- expose well known env vars as part of core ([#473](https://github.com/forcedotcom/sfdx-core/issues/473)) ([11c3f53](https://github.com/forcedotcom/sfdx-core/commit/11c3f53f964459072826274e6ebb33d4a9ecb990)) ## [3.4.5](https://github.com/forcedotcom/sfdx-core/compare/v3.4.4...v3.4.5) (2021-09-03) - ### Bug Fixes -* provide the correct options to SfdxConfig ([fa2117e](https://github.com/forcedotcom/sfdx-core/commit/fa2117e12d7a903f26067bdcf35d7ec9c142101e)) - - +- provide the correct options to SfdxConfig ([fa2117e](https://github.com/forcedotcom/sfdx-core/commit/fa2117e12d7a903f26067bdcf35d7ec9c142101e)) ## [3.4.4](https://github.com/forcedotcom/sfdx-core/compare/v3.4.3...v3.4.4) (2021-09-03) - - ## [3.4.3](https://github.com/forcedotcom/sfdx-core/compare/v3.4.2...v3.4.3) (2021-08-26) - - ## [3.4.2](https://github.com/forcedotcom/sfdx-core/compare/v3.4.1...v3.4.2) (2021-08-17) - ### Bug Fixes -* improve interoperability when unsetting ([#467](https://github.com/forcedotcom/sfdx-core/issues/467)) ([ad781d5](https://github.com/forcedotcom/sfdx-core/commit/ad781d5378652dfd64ccb476c11f418e940b8669)) - - +- improve interoperability when unsetting ([#467](https://github.com/forcedotcom/sfdx-core/issues/467)) ([ad781d5](https://github.com/forcedotcom/sfdx-core/commit/ad781d5378652dfd64ccb476c11f418e940b8669)) ## [3.4.1](https://github.com/forcedotcom/sfdx-core/compare/v3.4.0...v3.4.1) (2021-08-11) - ### Bug Fixes -* optionally throw error when reading deprecated config key ([#466](https://github.com/forcedotcom/sfdx-core/issues/466)) ([3118ad8](https://github.com/forcedotcom/sfdx-core/commit/3118ad836db384ac27c2b1db88c4753e6121e4db)) - - +- optionally throw error when reading deprecated config key ([#466](https://github.com/forcedotcom/sfdx-core/issues/466)) ([3118ad8](https://github.com/forcedotcom/sfdx-core/commit/3118ad836db384ac27c2b1db88c4753e6121e4db)) # [3.4.0](https://github.com/forcedotcom/sfdx-core/compare/v3.3.12...v3.4.0) (2021-08-11) - ### Features -* config interoperability ([#461](https://github.com/forcedotcom/sfdx-core/issues/461)) ([11b60ad](https://github.com/forcedotcom/sfdx-core/commit/11b60adbe54acc8e16a90327c77abbe2613fbaab)) - - +- config interoperability ([#461](https://github.com/forcedotcom/sfdx-core/issues/461)) ([11b60ad](https://github.com/forcedotcom/sfdx-core/commit/11b60adbe54acc8e16a90327c77abbe2613fbaab)) ## [3.3.12](https://github.com/forcedotcom/sfdx-core/compare/v2.27.2...v3.3.12) (2021-08-10) - ### Bug Fixes -* add predicate function to list all auths ([ccdb02c](https://github.com/forcedotcom/sfdx-core/commit/ccdb02c268fae7532b23e0c791bcdd831f77cf98)) - - +- add predicate function to list all auths ([ccdb02c](https://github.com/forcedotcom/sfdx-core/commit/ccdb02c268fae7532b23e0c791bcdd831f77cf98)) ## [3.3.11](https://github.com/forcedotcom/sfdx-core/compare/v3.3.10...v3.3.11) (2021-08-04) - ### Bug Fixes -* allows for message keys of error and errors ([#455](https://github.com/forcedotcom/sfdx-core/issues/455)) ([3bfac58](https://github.com/forcedotcom/sfdx-core/commit/3bfac587c6cf1734af6f2b517439d278591ddd50)) - - +- allows for message keys of error and errors ([#455](https://github.com/forcedotcom/sfdx-core/issues/455)) ([3bfac58](https://github.com/forcedotcom/sfdx-core/commit/3bfac587c6cf1734af6f2b517439d278591ddd50)) ## [3.3.10](https://github.com/forcedotcom/sfdx-core/compare/v3.3.9...v3.3.10) (2021-08-04) - - ## [3.3.9](https://github.com/forcedotcom/sfdx-core/compare/v3.3.8...v3.3.9) (2021-08-04) - ### Bug Fixes -* merge main(v2) into v3 ([#452](https://github.com/forcedotcom/sfdx-core/issues/452)) ([3a003b9](https://github.com/forcedotcom/sfdx-core/commit/3a003b9c17962f77344e4a23314bb608e1ae50db)) - - +- merge main(v2) into v3 ([#452](https://github.com/forcedotcom/sfdx-core/issues/452)) ([3a003b9](https://github.com/forcedotcom/sfdx-core/commit/3a003b9c17962f77344e4a23314bb608e1ae50db)) ## [3.3.8](https://github.com/forcedotcom/sfdx-core/compare/v3.3.7...v3.3.8) (2021-08-02) - ### Bug Fixes -* return all info from AuthInfo.listAllAuthorizations ([#449](https://github.com/forcedotcom/sfdx-core/issues/449)) ([17e60ea](https://github.com/forcedotcom/sfdx-core/commit/17e60eabe87c73a83c26344967076f365ddea81c)) - - +- return all info from AuthInfo.listAllAuthorizations ([#449](https://github.com/forcedotcom/sfdx-core/issues/449)) ([17e60ea](https://github.com/forcedotcom/sfdx-core/commit/17e60eabe87c73a83c26344967076f365ddea81c)) ## [3.3.7](https://github.com/forcedotcom/sfdx-core/compare/v2.27.0...v3.3.7) (2021-07-30) - - ## [3.3.6](https://github.com/forcedotcom/sfdx-core/compare/v3.3.5...v3.3.6) (2021-07-28) - ### Bug Fixes -* use correct method to get username ([#446](https://github.com/forcedotcom/sfdx-core/issues/446)) ([79a6b2f](https://github.com/forcedotcom/sfdx-core/commit/79a6b2f069f95b0c50a6c03ecbac07cf0d1832b1)) - - +- use correct method to get username ([#446](https://github.com/forcedotcom/sfdx-core/issues/446)) ([79a6b2f](https://github.com/forcedotcom/sfdx-core/commit/79a6b2f069f95b0c50a6c03ecbac07cf0d1832b1)) ## [3.3.5](https://github.com/forcedotcom/sfdx-core/compare/v3.3.4...v3.3.5) (2021-07-28) - - ## [3.3.4](https://github.com/forcedotcom/sfdx-core/compare/v3.3.3...v3.3.4) (2021-07-26) - ### Bug Fixes -* remove bad validator function ([1b97dc6](https://github.com/forcedotcom/sfdx-core/commit/1b97dc6f4d657a5b86489d33c4843ebfd54b3715)) - - +- remove bad validator function ([1b97dc6](https://github.com/forcedotcom/sfdx-core/commit/1b97dc6f4d657a5b86489d33c4843ebfd54b3715)) ## [3.3.3](https://github.com/forcedotcom/sfdx-core/compare/v3.3.2...v3.3.3) (2021-07-22) - ### Bug Fixes -* write sf.json contents on init ([c47f649](https://github.com/forcedotcom/sfdx-core/commit/c47f64954118d0d2f7f4a8e992d3450516239084)) - - +- write sf.json contents on init ([c47f649](https://github.com/forcedotcom/sfdx-core/commit/c47f64954118d0d2f7f4a8e992d3450516239084)) ## [3.3.2](https://github.com/forcedotcom/sfdx-core/compare/v2.26.1...v3.3.2) (2021-07-21) - ### Bug Fixes -* correct jsdoc ([a362e94](https://github.com/forcedotcom/sfdx-core/commit/a362e94c4ae7538cbbcd7dae8fcd3244629d845c)) - - +- correct jsdoc ([a362e94](https://github.com/forcedotcom/sfdx-core/commit/a362e94c4ae7538cbbcd7dae8fcd3244629d845c)) ## [3.3.1](https://github.com/forcedotcom/sfdx-core/compare/v3.3.0...v3.3.1) (2021-07-15) - ### Bug Fixes -* temporarily point Alias back to .sfdx ([#438](https://github.com/forcedotcom/sfdx-core/issues/438)) ([4bffcd8](https://github.com/forcedotcom/sfdx-core/commit/4bffcd84362d5b3049ef428e90dc1b538a435f81)) - - +- temporarily point Alias back to .sfdx ([#438](https://github.com/forcedotcom/sfdx-core/issues/438)) ([4bffcd8](https://github.com/forcedotcom/sfdx-core/commit/4bffcd84362d5b3049ef428e90dc1b538a435f81)) # [3.3.0](https://github.com/forcedotcom/sfdx-core/compare/v3.2.0-v3.0...v3.3.0) (2021-07-14) - ### Features -* V3 merge ([#436](https://github.com/forcedotcom/sfdx-core/issues/436)) ([1193449](https://github.com/forcedotcom/sfdx-core/commit/119344969147679088e30bae4c4fc5e941661078)), closes [#413](https://github.com/forcedotcom/sfdx-core/issues/413) [#415](https://github.com/forcedotcom/sfdx-core/issues/415) [#428](https://github.com/forcedotcom/sfdx-core/issues/428) [#429](https://github.com/forcedotcom/sfdx-core/issues/429) [#427](https://github.com/forcedotcom/sfdx-core/issues/427) [#432](https://github.com/forcedotcom/sfdx-core/issues/432) - - +- V3 merge ([#436](https://github.com/forcedotcom/sfdx-core/issues/436)) ([1193449](https://github.com/forcedotcom/sfdx-core/commit/119344969147679088e30bae4c4fc5e941661078)), closes [#413](https://github.com/forcedotcom/sfdx-core/issues/413) [#415](https://github.com/forcedotcom/sfdx-core/issues/415) [#428](https://github.com/forcedotcom/sfdx-core/issues/428) [#429](https://github.com/forcedotcom/sfdx-core/issues/429) [#427](https://github.com/forcedotcom/sfdx-core/issues/427) [#432](https://github.com/forcedotcom/sfdx-core/issues/432) # [3.2.0-v3.0](https://github.com/forcedotcom/sfdx-core/compare/v2.26.0...v3.2.0-v3.0) (2021-07-14) - ### Features -* use .sf/config.json @W-9546117@ ([#433](https://github.com/forcedotcom/sfdx-core/issues/433)) ([6c41653](https://github.com/forcedotcom/sfdx-core/commit/6c416531a9bae10e855ded3efc289a99196bc26b)) - - +- use .sf/config.json @W-9546117@ ([#433](https://github.com/forcedotcom/sfdx-core/issues/433)) ([6c41653](https://github.com/forcedotcom/sfdx-core/commit/6c416531a9bae10e855ded3efc289a99196bc26b)) ## [3.1.1-v3.2](https://github.com/forcedotcom/sfdx-core/compare/v2.24.2...v3.1.1-v3.2) (2021-06-29) - ### Bug Fixes -* do not use function prop ([#426](https://github.com/forcedotcom/sfdx-core/issues/426)) ([39efe0c](https://github.com/forcedotcom/sfdx-core/commit/39efe0ccc84b05bc891e54b24bfcddc62790ae0e)) - - +- do not use function prop ([#426](https://github.com/forcedotcom/sfdx-core/issues/426)) ([39efe0c](https://github.com/forcedotcom/sfdx-core/commit/39efe0ccc84b05bc891e54b24bfcddc62790ae0e)) ## [3.1.1-v3.1](https://github.com/forcedotcom/sfdx-core/compare/v2.24.0...v3.1.1-v3.1) (2021-06-14) - ### Bug Fixes -* keep track of auth changes ([210be6c](https://github.com/forcedotcom/sfdx-core/commit/210be6cb408bd9ecc861989570df0e14f6a3a566)) - - +- keep track of auth changes ([210be6c](https://github.com/forcedotcom/sfdx-core/commit/210be6cb408bd9ecc861989570df0e14f6a3a566)) ## [3.1.1-v3.0](https://github.com/forcedotcom/sfdx-core/compare/v2.23.3...v3.1.1-v3.0) (2021-06-03) - ### Bug Fixes -* compilation errors ([33a9876](https://github.com/forcedotcom/sfdx-core/commit/33a9876575eff7944bb287d428f52413831725d9)) -* unit test failures ([4507575](https://github.com/forcedotcom/sfdx-core/commit/45075754175d411b6cb71eb809096e6eb3e23d95)) -* unsetAuthorization ([#399](https://github.com/forcedotcom/sfdx-core/issues/399)) ([dd57438](https://github.com/forcedotcom/sfdx-core/commit/dd57438a95b49515f560d3b915cdf916a4b8643b)) - +- compilation errors ([33a9876](https://github.com/forcedotcom/sfdx-core/commit/33a9876575eff7944bb287d428f52413831725d9)) +- unit test failures ([4507575](https://github.com/forcedotcom/sfdx-core/commit/45075754175d411b6cb71eb809096e6eb3e23d95)) +- unsetAuthorization ([#399](https://github.com/forcedotcom/sfdx-core/issues/399)) ([dd57438](https://github.com/forcedotcom/sfdx-core/commit/dd57438a95b49515f560d3b915cdf916a4b8643b)) ### Features -* add GlobalInfo config file ([#397](https://github.com/forcedotcom/sfdx-core/issues/397)) ([889425c](https://github.com/forcedotcom/sfdx-core/commit/889425c06e8ed6a364d9a2bc3dd5ef0a38a66046)) -* add message support for markdown files ([0f235a2](https://github.com/forcedotcom/sfdx-core/commit/0f235a23d5dddbd7b3f07544d8c7e380875c6c55)) -* move crypto to config file @W-9225317@ ([#406](https://github.com/forcedotcom/sfdx-core/issues/406)) ([bac83c3](https://github.com/forcedotcom/sfdx-core/commit/bac83c3a52b15c9b462dfb68be9d080e710493cd)) - - +- add GlobalInfo config file ([#397](https://github.com/forcedotcom/sfdx-core/issues/397)) ([889425c](https://github.com/forcedotcom/sfdx-core/commit/889425c06e8ed6a364d9a2bc3dd5ef0a38a66046)) +- add message support for markdown files ([0f235a2](https://github.com/forcedotcom/sfdx-core/commit/0f235a23d5dddbd7b3f07544d8c7e380875c6c55)) +- move crypto to config file @W-9225317@ ([#406](https://github.com/forcedotcom/sfdx-core/issues/406)) ([bac83c3](https://github.com/forcedotcom/sfdx-core/commit/bac83c3a52b15c9b462dfb68be9d080e710493cd)) ## [2.27.2](https://github.com/forcedotcom/sfdx-core/compare/v2.27.1...v2.27.2) (2021-08-05) - ### Bug Fixes -* improve error handling while removing config props ([eecf7b0](https://github.com/forcedotcom/sfdx-core/commit/eecf7b0d0cf14e1371dc4c5ef03a413f864b0a8b)) - - +- improve error handling while removing config props ([eecf7b0](https://github.com/forcedotcom/sfdx-core/commit/eecf7b0d0cf14e1371dc4c5ef03a413f864b0a8b)) ## [2.27.1](https://github.com/forcedotcom/sfdx-core/compare/v3.3.11...v2.27.1) (2021-08-05) - ### Bug Fixes -* dont fail when trying to unset sf config keys ([#456](https://github.com/forcedotcom/sfdx-core/issues/456)) ([8aff9fd](https://github.com/forcedotcom/sfdx-core/commit/8aff9fd4bdb73ec20e58f5a16a8192a8eecba912)) - - +- dont fail when trying to unset sf config keys ([#456](https://github.com/forcedotcom/sfdx-core/issues/456)) ([8aff9fd](https://github.com/forcedotcom/sfdx-core/commit/8aff9fd4bdb73ec20e58f5a16a8192a8eecba912)) # [2.27.0](https://github.com/forcedotcom/sfdx-core/compare/v3.3.6...v2.27.0) (2021-07-29) - ### Features -* Core URL class SfdcUrl ([#420](https://github.com/forcedotcom/sfdx-core/issues/420)) ([66881ea](https://github.com/forcedotcom/sfdx-core/commit/66881eae2f30215c862ea398bfc1630d9a5898fe)) - - +- Core URL class SfdcUrl ([#420](https://github.com/forcedotcom/sfdx-core/issues/420)) ([66881ea](https://github.com/forcedotcom/sfdx-core/commit/66881eae2f30215c862ea398bfc1630d9a5898fe)) ## [2.26.1](https://github.com/forcedotcom/sfdx-core/compare/v3.3.1...v2.26.1) (2021-07-19) - ### Bug Fixes -* force:org:open force:org:open --urlonly display bug ([#439](https://github.com/forcedotcom/sfdx-core/issues/439)) ([2ea0e74](https://github.com/forcedotcom/sfdx-core/commit/2ea0e74b8bf1bff6de8af70372025cac10fc8c18)) - - +- force:org:open force:org:open --urlonly display bug ([#439](https://github.com/forcedotcom/sfdx-core/issues/439)) ([2ea0e74](https://github.com/forcedotcom/sfdx-core/commit/2ea0e74b8bf1bff6de8af70372025cac10fc8c18)) # [2.26.0](https://github.com/forcedotcom/sfdx-core/compare/v2.25.1...v2.26.0) (2021-07-13) - ### Features -* update generate password functionality ([#432](https://github.com/forcedotcom/sfdx-core/issues/432)) ([ed65e83](https://github.com/forcedotcom/sfdx-core/commit/ed65e83da3afe0d101743ee89cc7b2a7a38d5254)) - - +- update generate password functionality ([#432](https://github.com/forcedotcom/sfdx-core/issues/432)) ([ed65e83](https://github.com/forcedotcom/sfdx-core/commit/ed65e83da3afe0d101743ee89cc7b2a7a38d5254)) ## [2.25.1](https://github.com/forcedotcom/sfdx-core/compare/v3.1.1-3.2...v2.25.1) (2021-06-30) - ### Bug Fixes -* set retries to INFINITELY for polling client ([31539b4](https://github.com/forcedotcom/sfdx-core/commit/31539b4f0edd0cc1c049f70331ed5e40b8af55ea)) - - +- set retries to INFINITELY for polling client ([31539b4](https://github.com/forcedotcom/sfdx-core/commit/31539b4f0edd0cc1c049f70331ed5e40b8af55ea)) ## [3.1.1-3.2](https://github.com/forcedotcom/sfdx-core/compare/v2.25.0...v3.1.1-3.2) (2021-06-30) - ### Features -* @W-9517449@ Allow signupTargetLoginUrl to be overridden via env var ([#429](https://github.com/forcedotcom/sfdx-core/issues/429)) ([e2b8b36](https://github.com/forcedotcom/sfdx-core/commit/e2b8b36b2836b5277c83ffe22922978dc32e7b11)), closes [#427](https://github.com/forcedotcom/sfdx-core/issues/427) - - +- @W-9517449@ Allow signupTargetLoginUrl to be overridden via env var ([#429](https://github.com/forcedotcom/sfdx-core/issues/429)) ([e2b8b36](https://github.com/forcedotcom/sfdx-core/commit/e2b8b36b2836b5277c83ffe22922978dc32e7b11)), closes [#427](https://github.com/forcedotcom/sfdx-core/issues/427) ## [2.24.2](https://github.com/forcedotcom/sfdx-core/compare/v3.1.1-3.1...v2.24.2) (2021-06-23) - - ## [3.1.1-3.1](https://github.com/forcedotcom/sfdx-core/compare/v2.24.1...v3.1.1-3.1) (2021-06-23) - ### Bug Fixes -* puts some types back in dependencies ([94bea31](https://github.com/forcedotcom/sfdx-core/commit/94bea31037a41d4377faecb22bce8a2d12e95f4f)) -* rewrite polling client ([8d363d1](https://github.com/forcedotcom/sfdx-core/commit/8d363d13616f5efa944d4bb717a010add3c996b5)) - - +- puts some types back in dependencies ([94bea31](https://github.com/forcedotcom/sfdx-core/commit/94bea31037a41d4377faecb22bce8a2d12e95f4f)) +- rewrite polling client ([8d363d1](https://github.com/forcedotcom/sfdx-core/commit/8d363d13616f5efa944d4bb717a010add3c996b5)) # [2.24.0](https://github.com/forcedotcom/sfdx-core/compare/v2.23.5...v2.24.0) (2021-06-08) - ### Features -* exported function checkLightningDomain() ([#415](https://github.com/forcedotcom/sfdx-core/issues/415)) ([8e75231](https://github.com/forcedotcom/sfdx-core/commit/8e752313abf4a383a6ef18250ffac78b398987dd)) - - +- exported function checkLightningDomain() ([#415](https://github.com/forcedotcom/sfdx-core/issues/415)) ([8e75231](https://github.com/forcedotcom/sfdx-core/commit/8e752313abf4a383a6ef18250ffac78b398987dd)) ## [2.23.5](https://github.com/forcedotcom/sfdx-core/compare/v3.1.1-3.0...v2.23.5) (2021-06-07) - ### Bug Fixes -* w-9299422 (login url from config) and fs-parallelization ([043bb17](https://github.com/forcedotcom/sfdx-core/commit/043bb179dbf64f9c4522a4c0f0720ae09794227c)) - - +- w-9299422 (login url from config) and fs-parallelization ([043bb17](https://github.com/forcedotcom/sfdx-core/commit/043bb179dbf64f9c4522a4c0f0720ae09794227c)) ## [3.1.1-3.0](https://github.com/forcedotcom/sfdx-core/compare/v2.23.4...v3.1.1-3.0) (2021-06-03) - ### Bug Fixes -* works with TS4+ and jsforce types ([#413](https://github.com/forcedotcom/sfdx-core/issues/413)) ([b77cdad](https://github.com/forcedotcom/sfdx-core/commit/b77cdad56b114290b8e5fd23d968e23e7d4eedf4)) - - +- works with TS4+ and jsforce types ([#413](https://github.com/forcedotcom/sfdx-core/issues/413)) ([b77cdad](https://github.com/forcedotcom/sfdx-core/commit/b77cdad56b114290b8e5fd23d968e23e7d4eedf4)) ## [3.3.11](https://github.com/forcedotcom/sfdx-core/compare/v3.3.10...v3.3.11) (2021-08-04) - ### Bug Fixes -* allows for message keys of error and errors ([#455](https://github.com/forcedotcom/sfdx-core/issues/455)) ([3bfac58](https://github.com/forcedotcom/sfdx-core/commit/3bfac587c6cf1734af6f2b517439d278591ddd50)) - - +- allows for message keys of error and errors ([#455](https://github.com/forcedotcom/sfdx-core/issues/455)) ([3bfac58](https://github.com/forcedotcom/sfdx-core/commit/3bfac587c6cf1734af6f2b517439d278591ddd50)) ## [3.3.10](https://github.com/forcedotcom/sfdx-core/compare/v3.3.9...v3.3.10) (2021-08-04) - - ## [3.3.9](https://github.com/forcedotcom/sfdx-core/compare/v3.3.8...v3.3.9) (2021-08-04) - ### Bug Fixes -* merge main(v2) into v3 ([#452](https://github.com/forcedotcom/sfdx-core/issues/452)) ([3a003b9](https://github.com/forcedotcom/sfdx-core/commit/3a003b9c17962f77344e4a23314bb608e1ae50db)) - - +- merge main(v2) into v3 ([#452](https://github.com/forcedotcom/sfdx-core/issues/452)) ([3a003b9](https://github.com/forcedotcom/sfdx-core/commit/3a003b9c17962f77344e4a23314bb608e1ae50db)) ## [3.3.8](https://github.com/forcedotcom/sfdx-core/compare/v3.3.7...v3.3.8) (2021-08-02) - ### Bug Fixes -* return all info from AuthInfo.listAllAuthorizations ([#449](https://github.com/forcedotcom/sfdx-core/issues/449)) ([17e60ea](https://github.com/forcedotcom/sfdx-core/commit/17e60eabe87c73a83c26344967076f365ddea81c)) - - +- return all info from AuthInfo.listAllAuthorizations ([#449](https://github.com/forcedotcom/sfdx-core/issues/449)) ([17e60ea](https://github.com/forcedotcom/sfdx-core/commit/17e60eabe87c73a83c26344967076f365ddea81c)) ## [3.3.7](https://github.com/forcedotcom/sfdx-core/compare/v2.27.0...v3.3.7) (2021-07-30) - - ## [3.3.6](https://github.com/forcedotcom/sfdx-core/compare/v3.3.5...v3.3.6) (2021-07-28) - ### Bug Fixes -* use correct method to get username ([#446](https://github.com/forcedotcom/sfdx-core/issues/446)) ([79a6b2f](https://github.com/forcedotcom/sfdx-core/commit/79a6b2f069f95b0c50a6c03ecbac07cf0d1832b1)) - - +- use correct method to get username ([#446](https://github.com/forcedotcom/sfdx-core/issues/446)) ([79a6b2f](https://github.com/forcedotcom/sfdx-core/commit/79a6b2f069f95b0c50a6c03ecbac07cf0d1832b1)) ## [3.3.5](https://github.com/forcedotcom/sfdx-core/compare/v3.3.4...v3.3.5) (2021-07-28) - - ## [3.3.4](https://github.com/forcedotcom/sfdx-core/compare/v3.3.3...v3.3.4) (2021-07-26) - ### Bug Fixes -* remove bad validator function ([1b97dc6](https://github.com/forcedotcom/sfdx-core/commit/1b97dc6f4d657a5b86489d33c4843ebfd54b3715)) - - +- remove bad validator function ([1b97dc6](https://github.com/forcedotcom/sfdx-core/commit/1b97dc6f4d657a5b86489d33c4843ebfd54b3715)) ## [3.3.3](https://github.com/forcedotcom/sfdx-core/compare/v3.3.2...v3.3.3) (2021-07-22) - ### Bug Fixes -* write sf.json contents on init ([c47f649](https://github.com/forcedotcom/sfdx-core/commit/c47f64954118d0d2f7f4a8e992d3450516239084)) - - +- write sf.json contents on init ([c47f649](https://github.com/forcedotcom/sfdx-core/commit/c47f64954118d0d2f7f4a8e992d3450516239084)) ## [3.3.2](https://github.com/forcedotcom/sfdx-core/compare/v2.26.1...v3.3.2) (2021-07-21) - ### Bug Fixes -* correct jsdoc ([a362e94](https://github.com/forcedotcom/sfdx-core/commit/a362e94c4ae7538cbbcd7dae8fcd3244629d845c)) - - +- correct jsdoc ([a362e94](https://github.com/forcedotcom/sfdx-core/commit/a362e94c4ae7538cbbcd7dae8fcd3244629d845c)) ## [3.3.1](https://github.com/forcedotcom/sfdx-core/compare/v3.3.0...v3.3.1) (2021-07-15) - ### Bug Fixes -* temporarily point Alias back to .sfdx ([#438](https://github.com/forcedotcom/sfdx-core/issues/438)) ([4bffcd8](https://github.com/forcedotcom/sfdx-core/commit/4bffcd84362d5b3049ef428e90dc1b538a435f81)) - - +- temporarily point Alias back to .sfdx ([#438](https://github.com/forcedotcom/sfdx-core/issues/438)) ([4bffcd8](https://github.com/forcedotcom/sfdx-core/commit/4bffcd84362d5b3049ef428e90dc1b538a435f81)) # [3.3.0](https://github.com/forcedotcom/sfdx-core/compare/v3.2.0-v3.0...v3.3.0) (2021-07-14) - ### Features -* V3 merge ([#436](https://github.com/forcedotcom/sfdx-core/issues/436)) ([1193449](https://github.com/forcedotcom/sfdx-core/commit/119344969147679088e30bae4c4fc5e941661078)), closes [#413](https://github.com/forcedotcom/sfdx-core/issues/413) [#415](https://github.com/forcedotcom/sfdx-core/issues/415) [#428](https://github.com/forcedotcom/sfdx-core/issues/428) [#429](https://github.com/forcedotcom/sfdx-core/issues/429) [#427](https://github.com/forcedotcom/sfdx-core/issues/427) [#432](https://github.com/forcedotcom/sfdx-core/issues/432) - - +- V3 merge ([#436](https://github.com/forcedotcom/sfdx-core/issues/436)) ([1193449](https://github.com/forcedotcom/sfdx-core/commit/119344969147679088e30bae4c4fc5e941661078)), closes [#413](https://github.com/forcedotcom/sfdx-core/issues/413) [#415](https://github.com/forcedotcom/sfdx-core/issues/415) [#428](https://github.com/forcedotcom/sfdx-core/issues/428) [#429](https://github.com/forcedotcom/sfdx-core/issues/429) [#427](https://github.com/forcedotcom/sfdx-core/issues/427) [#432](https://github.com/forcedotcom/sfdx-core/issues/432) # [3.2.0-v3.0](https://github.com/forcedotcom/sfdx-core/compare/v2.26.0...v3.2.0-v3.0) (2021-07-14) - ### Features -* use .sf/config.json @W-9546117@ ([#433](https://github.com/forcedotcom/sfdx-core/issues/433)) ([6c41653](https://github.com/forcedotcom/sfdx-core/commit/6c416531a9bae10e855ded3efc289a99196bc26b)) - - +- use .sf/config.json @W-9546117@ ([#433](https://github.com/forcedotcom/sfdx-core/issues/433)) ([6c41653](https://github.com/forcedotcom/sfdx-core/commit/6c416531a9bae10e855ded3efc289a99196bc26b)) ## [3.1.1-v3.2](https://github.com/forcedotcom/sfdx-core/compare/v2.24.2...v3.1.1-v3.2) (2021-06-29) - ### Bug Fixes -* do not use function prop ([#426](https://github.com/forcedotcom/sfdx-core/issues/426)) ([39efe0c](https://github.com/forcedotcom/sfdx-core/commit/39efe0ccc84b05bc891e54b24bfcddc62790ae0e)) - - +- do not use function prop ([#426](https://github.com/forcedotcom/sfdx-core/issues/426)) ([39efe0c](https://github.com/forcedotcom/sfdx-core/commit/39efe0ccc84b05bc891e54b24bfcddc62790ae0e)) ## [3.1.1-v3.1](https://github.com/forcedotcom/sfdx-core/compare/v2.24.0...v3.1.1-v3.1) (2021-06-14) - ### Bug Fixes -* keep track of auth changes ([210be6c](https://github.com/forcedotcom/sfdx-core/commit/210be6cb408bd9ecc861989570df0e14f6a3a566)) - - +- keep track of auth changes ([210be6c](https://github.com/forcedotcom/sfdx-core/commit/210be6cb408bd9ecc861989570df0e14f6a3a566)) ## [3.1.1-v3.0](https://github.com/forcedotcom/sfdx-core/compare/v2.23.3...v3.1.1-v3.0) (2021-06-03) - ### Bug Fixes -* compilation errors ([33a9876](https://github.com/forcedotcom/sfdx-core/commit/33a9876575eff7944bb287d428f52413831725d9)) -* unit test failures ([4507575](https://github.com/forcedotcom/sfdx-core/commit/45075754175d411b6cb71eb809096e6eb3e23d95)) -* unsetAuthorization ([#399](https://github.com/forcedotcom/sfdx-core/issues/399)) ([dd57438](https://github.com/forcedotcom/sfdx-core/commit/dd57438a95b49515f560d3b915cdf916a4b8643b)) - +- compilation errors ([33a9876](https://github.com/forcedotcom/sfdx-core/commit/33a9876575eff7944bb287d428f52413831725d9)) +- unit test failures ([4507575](https://github.com/forcedotcom/sfdx-core/commit/45075754175d411b6cb71eb809096e6eb3e23d95)) +- unsetAuthorization ([#399](https://github.com/forcedotcom/sfdx-core/issues/399)) ([dd57438](https://github.com/forcedotcom/sfdx-core/commit/dd57438a95b49515f560d3b915cdf916a4b8643b)) ### Features -* add GlobalInfo config file ([#397](https://github.com/forcedotcom/sfdx-core/issues/397)) ([889425c](https://github.com/forcedotcom/sfdx-core/commit/889425c06e8ed6a364d9a2bc3dd5ef0a38a66046)) -* add message support for markdown files ([0f235a2](https://github.com/forcedotcom/sfdx-core/commit/0f235a23d5dddbd7b3f07544d8c7e380875c6c55)) -* move crypto to config file @W-9225317@ ([#406](https://github.com/forcedotcom/sfdx-core/issues/406)) ([bac83c3](https://github.com/forcedotcom/sfdx-core/commit/bac83c3a52b15c9b462dfb68be9d080e710493cd)) - - +- add GlobalInfo config file ([#397](https://github.com/forcedotcom/sfdx-core/issues/397)) ([889425c](https://github.com/forcedotcom/sfdx-core/commit/889425c06e8ed6a364d9a2bc3dd5ef0a38a66046)) +- add message support for markdown files ([0f235a2](https://github.com/forcedotcom/sfdx-core/commit/0f235a23d5dddbd7b3f07544d8c7e380875c6c55)) +- move crypto to config file @W-9225317@ ([#406](https://github.com/forcedotcom/sfdx-core/issues/406)) ([bac83c3](https://github.com/forcedotcom/sfdx-core/commit/bac83c3a52b15c9b462dfb68be9d080e710493cd)) # [2.27.0](https://github.com/forcedotcom/sfdx-core/compare/v3.3.6...v2.27.0) (2021-07-29) - ### Features -* Core URL class SfdcUrl ([#420](https://github.com/forcedotcom/sfdx-core/issues/420)) ([66881ea](https://github.com/forcedotcom/sfdx-core/commit/66881eae2f30215c862ea398bfc1630d9a5898fe)) - - +- Core URL class SfdcUrl ([#420](https://github.com/forcedotcom/sfdx-core/issues/420)) ([66881ea](https://github.com/forcedotcom/sfdx-core/commit/66881eae2f30215c862ea398bfc1630d9a5898fe)) ## [2.26.1](https://github.com/forcedotcom/sfdx-core/compare/v3.3.1...v2.26.1) (2021-07-19) - ### Bug Fixes -* force:org:open force:org:open --urlonly display bug ([#439](https://github.com/forcedotcom/sfdx-core/issues/439)) ([2ea0e74](https://github.com/forcedotcom/sfdx-core/commit/2ea0e74b8bf1bff6de8af70372025cac10fc8c18)) - - +- force:org:open force:org:open --urlonly display bug ([#439](https://github.com/forcedotcom/sfdx-core/issues/439)) ([2ea0e74](https://github.com/forcedotcom/sfdx-core/commit/2ea0e74b8bf1bff6de8af70372025cac10fc8c18)) # [2.26.0](https://github.com/forcedotcom/sfdx-core/compare/v2.25.1...v2.26.0) (2021-07-13) - ### Features -* update generate password functionality ([#432](https://github.com/forcedotcom/sfdx-core/issues/432)) ([ed65e83](https://github.com/forcedotcom/sfdx-core/commit/ed65e83da3afe0d101743ee89cc7b2a7a38d5254)) - - +- update generate password functionality ([#432](https://github.com/forcedotcom/sfdx-core/issues/432)) ([ed65e83](https://github.com/forcedotcom/sfdx-core/commit/ed65e83da3afe0d101743ee89cc7b2a7a38d5254)) ## [2.25.1](https://github.com/forcedotcom/sfdx-core/compare/v3.1.1-3.2...v2.25.1) (2021-06-30) - ### Bug Fixes -* set retries to INFINITELY for polling client ([31539b4](https://github.com/forcedotcom/sfdx-core/commit/31539b4f0edd0cc1c049f70331ed5e40b8af55ea)) - - +- set retries to INFINITELY for polling client ([31539b4](https://github.com/forcedotcom/sfdx-core/commit/31539b4f0edd0cc1c049f70331ed5e40b8af55ea)) ## [3.1.1-3.2](https://github.com/forcedotcom/sfdx-core/compare/v2.25.0...v3.1.1-3.2) (2021-06-30) - ### Features -* @W-9517449@ Allow signupTargetLoginUrl to be overridden via env var ([#429](https://github.com/forcedotcom/sfdx-core/issues/429)) ([e2b8b36](https://github.com/forcedotcom/sfdx-core/commit/e2b8b36b2836b5277c83ffe22922978dc32e7b11)), closes [#427](https://github.com/forcedotcom/sfdx-core/issues/427) - - +- @W-9517449@ Allow signupTargetLoginUrl to be overridden via env var ([#429](https://github.com/forcedotcom/sfdx-core/issues/429)) ([e2b8b36](https://github.com/forcedotcom/sfdx-core/commit/e2b8b36b2836b5277c83ffe22922978dc32e7b11)), closes [#427](https://github.com/forcedotcom/sfdx-core/issues/427) ## [2.24.2](https://github.com/forcedotcom/sfdx-core/compare/v3.1.1-3.1...v2.24.2) (2021-06-23) - - ## [3.1.1-3.1](https://github.com/forcedotcom/sfdx-core/compare/v2.24.1...v3.1.1-3.1) (2021-06-23) - ### Bug Fixes -* puts some types back in dependencies ([94bea31](https://github.com/forcedotcom/sfdx-core/commit/94bea31037a41d4377faecb22bce8a2d12e95f4f)) -* rewrite polling client ([8d363d1](https://github.com/forcedotcom/sfdx-core/commit/8d363d13616f5efa944d4bb717a010add3c996b5)) - - +- puts some types back in dependencies ([94bea31](https://github.com/forcedotcom/sfdx-core/commit/94bea31037a41d4377faecb22bce8a2d12e95f4f)) +- rewrite polling client ([8d363d1](https://github.com/forcedotcom/sfdx-core/commit/8d363d13616f5efa944d4bb717a010add3c996b5)) # [2.24.0](https://github.com/forcedotcom/sfdx-core/compare/v2.23.5...v2.24.0) (2021-06-08) - ### Features -* exported function checkLightningDomain() ([#415](https://github.com/forcedotcom/sfdx-core/issues/415)) ([8e75231](https://github.com/forcedotcom/sfdx-core/commit/8e752313abf4a383a6ef18250ffac78b398987dd)) - - +- exported function checkLightningDomain() ([#415](https://github.com/forcedotcom/sfdx-core/issues/415)) ([8e75231](https://github.com/forcedotcom/sfdx-core/commit/8e752313abf4a383a6ef18250ffac78b398987dd)) ## [2.23.5](https://github.com/forcedotcom/sfdx-core/compare/v3.1.1-3.0...v2.23.5) (2021-06-07) - ### Bug Fixes -* w-9299422 (login url from config) and fs-parallelization ([043bb17](https://github.com/forcedotcom/sfdx-core/commit/043bb179dbf64f9c4522a4c0f0720ae09794227c)) - - +- w-9299422 (login url from config) and fs-parallelization ([043bb17](https://github.com/forcedotcom/sfdx-core/commit/043bb179dbf64f9c4522a4c0f0720ae09794227c)) ## [3.1.1-3.0](https://github.com/forcedotcom/sfdx-core/compare/v2.23.4...v3.1.1-3.0) (2021-06-03) - ### Bug Fixes -* works with TS4+ and jsforce types ([#413](https://github.com/forcedotcom/sfdx-core/issues/413)) ([b77cdad](https://github.com/forcedotcom/sfdx-core/commit/b77cdad56b114290b8e5fd23d968e23e7d4eedf4)) - - +- works with TS4+ and jsforce types ([#413](https://github.com/forcedotcom/sfdx-core/issues/413)) ([b77cdad](https://github.com/forcedotcom/sfdx-core/commit/b77cdad56b114290b8e5fd23d968e23e7d4eedf4)) ## [3.3.6](https://github.com/forcedotcom/sfdx-core/compare/v3.3.5...v3.3.6) (2021-07-28) - ### Bug Fixes -* use correct method to get username ([#446](https://github.com/forcedotcom/sfdx-core/issues/446)) ([79a6b2f](https://github.com/forcedotcom/sfdx-core/commit/79a6b2f069f95b0c50a6c03ecbac07cf0d1832b1)) - - +- use correct method to get username ([#446](https://github.com/forcedotcom/sfdx-core/issues/446)) ([79a6b2f](https://github.com/forcedotcom/sfdx-core/commit/79a6b2f069f95b0c50a6c03ecbac07cf0d1832b1)) ## [3.3.5](https://github.com/forcedotcom/sfdx-core/compare/v3.3.4...v3.3.5) (2021-07-28) - - ## [3.3.4](https://github.com/forcedotcom/sfdx-core/compare/v3.3.3...v3.3.4) (2021-07-26) - ### Bug Fixes -* remove bad validator function ([1b97dc6](https://github.com/forcedotcom/sfdx-core/commit/1b97dc6f4d657a5b86489d33c4843ebfd54b3715)) - - +- remove bad validator function ([1b97dc6](https://github.com/forcedotcom/sfdx-core/commit/1b97dc6f4d657a5b86489d33c4843ebfd54b3715)) ## [3.3.3](https://github.com/forcedotcom/sfdx-core/compare/v3.3.2...v3.3.3) (2021-07-22) - ### Bug Fixes -* write sf.json contents on init ([c47f649](https://github.com/forcedotcom/sfdx-core/commit/c47f64954118d0d2f7f4a8e992d3450516239084)) - - +- write sf.json contents on init ([c47f649](https://github.com/forcedotcom/sfdx-core/commit/c47f64954118d0d2f7f4a8e992d3450516239084)) ## [3.3.2](https://github.com/forcedotcom/sfdx-core/compare/v2.26.1...v3.3.2) (2021-07-21) - ### Bug Fixes -* correct jsdoc ([a362e94](https://github.com/forcedotcom/sfdx-core/commit/a362e94c4ae7538cbbcd7dae8fcd3244629d845c)) - - +- correct jsdoc ([a362e94](https://github.com/forcedotcom/sfdx-core/commit/a362e94c4ae7538cbbcd7dae8fcd3244629d845c)) ## [3.3.1](https://github.com/forcedotcom/sfdx-core/compare/v3.3.0...v3.3.1) (2021-07-15) - ### Bug Fixes -* temporarily point Alias back to .sfdx ([#438](https://github.com/forcedotcom/sfdx-core/issues/438)) ([4bffcd8](https://github.com/forcedotcom/sfdx-core/commit/4bffcd84362d5b3049ef428e90dc1b538a435f81)) - - +- temporarily point Alias back to .sfdx ([#438](https://github.com/forcedotcom/sfdx-core/issues/438)) ([4bffcd8](https://github.com/forcedotcom/sfdx-core/commit/4bffcd84362d5b3049ef428e90dc1b538a435f81)) # [3.3.0](https://github.com/forcedotcom/sfdx-core/compare/v3.2.0-v3.0...v3.3.0) (2021-07-14) - ### Features -* V3 merge ([#436](https://github.com/forcedotcom/sfdx-core/issues/436)) ([1193449](https://github.com/forcedotcom/sfdx-core/commit/119344969147679088e30bae4c4fc5e941661078)), closes [#413](https://github.com/forcedotcom/sfdx-core/issues/413) [#415](https://github.com/forcedotcom/sfdx-core/issues/415) [#428](https://github.com/forcedotcom/sfdx-core/issues/428) [#429](https://github.com/forcedotcom/sfdx-core/issues/429) [#427](https://github.com/forcedotcom/sfdx-core/issues/427) [#432](https://github.com/forcedotcom/sfdx-core/issues/432) - - +- V3 merge ([#436](https://github.com/forcedotcom/sfdx-core/issues/436)) ([1193449](https://github.com/forcedotcom/sfdx-core/commit/119344969147679088e30bae4c4fc5e941661078)), closes [#413](https://github.com/forcedotcom/sfdx-core/issues/413) [#415](https://github.com/forcedotcom/sfdx-core/issues/415) [#428](https://github.com/forcedotcom/sfdx-core/issues/428) [#429](https://github.com/forcedotcom/sfdx-core/issues/429) [#427](https://github.com/forcedotcom/sfdx-core/issues/427) [#432](https://github.com/forcedotcom/sfdx-core/issues/432) # [3.2.0-v3.0](https://github.com/forcedotcom/sfdx-core/compare/v2.26.0...v3.2.0-v3.0) (2021-07-14) - ### Features -* use .sf/config.json @W-9546117@ ([#433](https://github.com/forcedotcom/sfdx-core/issues/433)) ([6c41653](https://github.com/forcedotcom/sfdx-core/commit/6c416531a9bae10e855ded3efc289a99196bc26b)) - - +- use .sf/config.json @W-9546117@ ([#433](https://github.com/forcedotcom/sfdx-core/issues/433)) ([6c41653](https://github.com/forcedotcom/sfdx-core/commit/6c416531a9bae10e855ded3efc289a99196bc26b)) ## [3.1.1-v3.2](https://github.com/forcedotcom/sfdx-core/compare/v2.24.2...v3.1.1-v3.2) (2021-06-29) - ### Bug Fixes -* do not use function prop ([#426](https://github.com/forcedotcom/sfdx-core/issues/426)) ([39efe0c](https://github.com/forcedotcom/sfdx-core/commit/39efe0ccc84b05bc891e54b24bfcddc62790ae0e)) - - +- do not use function prop ([#426](https://github.com/forcedotcom/sfdx-core/issues/426)) ([39efe0c](https://github.com/forcedotcom/sfdx-core/commit/39efe0ccc84b05bc891e54b24bfcddc62790ae0e)) ## [3.1.1-v3.1](https://github.com/forcedotcom/sfdx-core/compare/v2.24.0...v3.1.1-v3.1) (2021-06-14) - ### Bug Fixes -* keep track of auth changes ([210be6c](https://github.com/forcedotcom/sfdx-core/commit/210be6cb408bd9ecc861989570df0e14f6a3a566)) - - +- keep track of auth changes ([210be6c](https://github.com/forcedotcom/sfdx-core/commit/210be6cb408bd9ecc861989570df0e14f6a3a566)) ## [3.1.1-v3.0](https://github.com/forcedotcom/sfdx-core/compare/v2.23.3...v3.1.1-v3.0) (2021-06-03) - ### Bug Fixes -* compilation errors ([33a9876](https://github.com/forcedotcom/sfdx-core/commit/33a9876575eff7944bb287d428f52413831725d9)) -* unit test failures ([4507575](https://github.com/forcedotcom/sfdx-core/commit/45075754175d411b6cb71eb809096e6eb3e23d95)) -* unsetAuthorization ([#399](https://github.com/forcedotcom/sfdx-core/issues/399)) ([dd57438](https://github.com/forcedotcom/sfdx-core/commit/dd57438a95b49515f560d3b915cdf916a4b8643b)) - +- compilation errors ([33a9876](https://github.com/forcedotcom/sfdx-core/commit/33a9876575eff7944bb287d428f52413831725d9)) +- unit test failures ([4507575](https://github.com/forcedotcom/sfdx-core/commit/45075754175d411b6cb71eb809096e6eb3e23d95)) +- unsetAuthorization ([#399](https://github.com/forcedotcom/sfdx-core/issues/399)) ([dd57438](https://github.com/forcedotcom/sfdx-core/commit/dd57438a95b49515f560d3b915cdf916a4b8643b)) ### Features -* add GlobalInfo config file ([#397](https://github.com/forcedotcom/sfdx-core/issues/397)) ([889425c](https://github.com/forcedotcom/sfdx-core/commit/889425c06e8ed6a364d9a2bc3dd5ef0a38a66046)) -* add message support for markdown files ([0f235a2](https://github.com/forcedotcom/sfdx-core/commit/0f235a23d5dddbd7b3f07544d8c7e380875c6c55)) -* move crypto to config file @W-9225317@ ([#406](https://github.com/forcedotcom/sfdx-core/issues/406)) ([bac83c3](https://github.com/forcedotcom/sfdx-core/commit/bac83c3a52b15c9b462dfb68be9d080e710493cd)) - - +- add GlobalInfo config file ([#397](https://github.com/forcedotcom/sfdx-core/issues/397)) ([889425c](https://github.com/forcedotcom/sfdx-core/commit/889425c06e8ed6a364d9a2bc3dd5ef0a38a66046)) +- add message support for markdown files ([0f235a2](https://github.com/forcedotcom/sfdx-core/commit/0f235a23d5dddbd7b3f07544d8c7e380875c6c55)) +- move crypto to config file @W-9225317@ ([#406](https://github.com/forcedotcom/sfdx-core/issues/406)) ([bac83c3](https://github.com/forcedotcom/sfdx-core/commit/bac83c3a52b15c9b462dfb68be9d080e710493cd)) ## [2.26.1](https://github.com/forcedotcom/sfdx-core/compare/v3.3.1...v2.26.1) (2021-07-19) - ### Bug Fixes -* force:org:open force:org:open --urlonly display bug ([#439](https://github.com/forcedotcom/sfdx-core/issues/439)) ([2ea0e74](https://github.com/forcedotcom/sfdx-core/commit/2ea0e74b8bf1bff6de8af70372025cac10fc8c18)) - - +- force:org:open force:org:open --urlonly display bug ([#439](https://github.com/forcedotcom/sfdx-core/issues/439)) ([2ea0e74](https://github.com/forcedotcom/sfdx-core/commit/2ea0e74b8bf1bff6de8af70372025cac10fc8c18)) # [2.26.0](https://github.com/forcedotcom/sfdx-core/compare/v2.25.1...v2.26.0) (2021-07-13) - ### Features -* update generate password functionality ([#432](https://github.com/forcedotcom/sfdx-core/issues/432)) ([ed65e83](https://github.com/forcedotcom/sfdx-core/commit/ed65e83da3afe0d101743ee89cc7b2a7a38d5254)) - - +- update generate password functionality ([#432](https://github.com/forcedotcom/sfdx-core/issues/432)) ([ed65e83](https://github.com/forcedotcom/sfdx-core/commit/ed65e83da3afe0d101743ee89cc7b2a7a38d5254)) ## [2.25.1](https://github.com/forcedotcom/sfdx-core/compare/v3.1.1-3.2...v2.25.1) (2021-06-30) - ### Bug Fixes -* set retries to INFINITELY for polling client ([31539b4](https://github.com/forcedotcom/sfdx-core/commit/31539b4f0edd0cc1c049f70331ed5e40b8af55ea)) - - +- set retries to INFINITELY for polling client ([31539b4](https://github.com/forcedotcom/sfdx-core/commit/31539b4f0edd0cc1c049f70331ed5e40b8af55ea)) ## [3.1.1-3.2](https://github.com/forcedotcom/sfdx-core/compare/v2.25.0...v3.1.1-3.2) (2021-06-30) - ### Features -* @W-9517449@ Allow signupTargetLoginUrl to be overridden via env var ([#429](https://github.com/forcedotcom/sfdx-core/issues/429)) ([e2b8b36](https://github.com/forcedotcom/sfdx-core/commit/e2b8b36b2836b5277c83ffe22922978dc32e7b11)), closes [#427](https://github.com/forcedotcom/sfdx-core/issues/427) - - - -## [2.24.2](https://github.com/forcedotcom/sfdx-core/compare/v3.1.1-3.1...v2.24.2) (2021-06-23) - +- @W-9517449@ Allow signupTargetLoginUrl to be overridden via env var ([#429](https://github.com/forcedotcom/sfdx-core/issues/429)) ([e2b8b36](https://github.com/forcedotcom/sfdx-core/commit/e2b8b36b2836b5277c83ffe22922978dc32e7b11)), closes [#427](https://github.com/forcedotcom/sfdx-core/issues/427) +## [2.24.2](https://github.com/forcedotcom/sfdx-core/compare/v3.1.1-3.1...v2.24.2) (2021-06-23) ## [3.1.1-3.1](https://github.com/forcedotcom/sfdx-core/compare/v2.24.1...v3.1.1-3.1) (2021-06-23) - ### Bug Fixes -* puts some types back in dependencies ([94bea31](https://github.com/forcedotcom/sfdx-core/commit/94bea31037a41d4377faecb22bce8a2d12e95f4f)) -* rewrite polling client ([8d363d1](https://github.com/forcedotcom/sfdx-core/commit/8d363d13616f5efa944d4bb717a010add3c996b5)) - - +- puts some types back in dependencies ([94bea31](https://github.com/forcedotcom/sfdx-core/commit/94bea31037a41d4377faecb22bce8a2d12e95f4f)) +- rewrite polling client ([8d363d1](https://github.com/forcedotcom/sfdx-core/commit/8d363d13616f5efa944d4bb717a010add3c996b5)) # [2.24.0](https://github.com/forcedotcom/sfdx-core/compare/v2.23.5...v2.24.0) (2021-06-08) - ### Features -* exported function checkLightningDomain() ([#415](https://github.com/forcedotcom/sfdx-core/issues/415)) ([8e75231](https://github.com/forcedotcom/sfdx-core/commit/8e752313abf4a383a6ef18250ffac78b398987dd)) - - +- exported function checkLightningDomain() ([#415](https://github.com/forcedotcom/sfdx-core/issues/415)) ([8e75231](https://github.com/forcedotcom/sfdx-core/commit/8e752313abf4a383a6ef18250ffac78b398987dd)) ## [2.23.5](https://github.com/forcedotcom/sfdx-core/compare/v3.1.1-3.0...v2.23.5) (2021-06-07) - ### Bug Fixes -* w-9299422 (login url from config) and fs-parallelization ([043bb17](https://github.com/forcedotcom/sfdx-core/commit/043bb179dbf64f9c4522a4c0f0720ae09794227c)) - - +- w-9299422 (login url from config) and fs-parallelization ([043bb17](https://github.com/forcedotcom/sfdx-core/commit/043bb179dbf64f9c4522a4c0f0720ae09794227c)) ## [3.1.1-3.0](https://github.com/forcedotcom/sfdx-core/compare/v2.23.4...v3.1.1-3.0) (2021-06-03) - ### Bug Fixes -* works with TS4+ and jsforce types ([#413](https://github.com/forcedotcom/sfdx-core/issues/413)) ([b77cdad](https://github.com/forcedotcom/sfdx-core/commit/b77cdad56b114290b8e5fd23d968e23e7d4eedf4)) - - +- works with TS4+ and jsforce types ([#413](https://github.com/forcedotcom/sfdx-core/issues/413)) ([b77cdad](https://github.com/forcedotcom/sfdx-core/commit/b77cdad56b114290b8e5fd23d968e23e7d4eedf4)) ## [3.3.1](https://github.com/forcedotcom/sfdx-core/compare/v3.3.0...v3.3.1) (2021-07-15) - ### Bug Fixes -* temporarily point Alias back to .sfdx ([#438](https://github.com/forcedotcom/sfdx-core/issues/438)) ([4bffcd8](https://github.com/forcedotcom/sfdx-core/commit/4bffcd84362d5b3049ef428e90dc1b538a435f81)) - - +- temporarily point Alias back to .sfdx ([#438](https://github.com/forcedotcom/sfdx-core/issues/438)) ([4bffcd8](https://github.com/forcedotcom/sfdx-core/commit/4bffcd84362d5b3049ef428e90dc1b538a435f81)) # [3.3.0](https://github.com/forcedotcom/sfdx-core/compare/v3.2.0-v3.0...v3.3.0) (2021-07-14) - ### Features -* V3 merge ([#436](https://github.com/forcedotcom/sfdx-core/issues/436)) ([1193449](https://github.com/forcedotcom/sfdx-core/commit/119344969147679088e30bae4c4fc5e941661078)), closes [#413](https://github.com/forcedotcom/sfdx-core/issues/413) [#415](https://github.com/forcedotcom/sfdx-core/issues/415) [#428](https://github.com/forcedotcom/sfdx-core/issues/428) [#429](https://github.com/forcedotcom/sfdx-core/issues/429) [#427](https://github.com/forcedotcom/sfdx-core/issues/427) [#432](https://github.com/forcedotcom/sfdx-core/issues/432) - - +- V3 merge ([#436](https://github.com/forcedotcom/sfdx-core/issues/436)) ([1193449](https://github.com/forcedotcom/sfdx-core/commit/119344969147679088e30bae4c4fc5e941661078)), closes [#413](https://github.com/forcedotcom/sfdx-core/issues/413) [#415](https://github.com/forcedotcom/sfdx-core/issues/415) [#428](https://github.com/forcedotcom/sfdx-core/issues/428) [#429](https://github.com/forcedotcom/sfdx-core/issues/429) [#427](https://github.com/forcedotcom/sfdx-core/issues/427) [#432](https://github.com/forcedotcom/sfdx-core/issues/432) # [3.2.0-v3.0](https://github.com/forcedotcom/sfdx-core/compare/v2.26.0...v3.2.0-v3.0) (2021-07-14) - ### Features -* use .sf/config.json @W-9546117@ ([#433](https://github.com/forcedotcom/sfdx-core/issues/433)) ([6c41653](https://github.com/forcedotcom/sfdx-core/commit/6c416531a9bae10e855ded3efc289a99196bc26b)) - - +- use .sf/config.json @W-9546117@ ([#433](https://github.com/forcedotcom/sfdx-core/issues/433)) ([6c41653](https://github.com/forcedotcom/sfdx-core/commit/6c416531a9bae10e855ded3efc289a99196bc26b)) ## [3.1.1-v3.2](https://github.com/forcedotcom/sfdx-core/compare/v2.24.2...v3.1.1-v3.2) (2021-06-29) - ### Bug Fixes -* do not use function prop ([#426](https://github.com/forcedotcom/sfdx-core/issues/426)) ([39efe0c](https://github.com/forcedotcom/sfdx-core/commit/39efe0ccc84b05bc891e54b24bfcddc62790ae0e)) - - +- do not use function prop ([#426](https://github.com/forcedotcom/sfdx-core/issues/426)) ([39efe0c](https://github.com/forcedotcom/sfdx-core/commit/39efe0ccc84b05bc891e54b24bfcddc62790ae0e)) ## [3.1.1-v3.1](https://github.com/forcedotcom/sfdx-core/compare/v2.24.0...v3.1.1-v3.1) (2021-06-14) - ### Bug Fixes -* keep track of auth changes ([210be6c](https://github.com/forcedotcom/sfdx-core/commit/210be6cb408bd9ecc861989570df0e14f6a3a566)) - - +- keep track of auth changes ([210be6c](https://github.com/forcedotcom/sfdx-core/commit/210be6cb408bd9ecc861989570df0e14f6a3a566)) ## [3.1.1-v3.0](https://github.com/forcedotcom/sfdx-core/compare/v2.23.3...v3.1.1-v3.0) (2021-06-03) - ### Bug Fixes -* compilation errors ([33a9876](https://github.com/forcedotcom/sfdx-core/commit/33a9876575eff7944bb287d428f52413831725d9)) -* unit test failures ([4507575](https://github.com/forcedotcom/sfdx-core/commit/45075754175d411b6cb71eb809096e6eb3e23d95)) -* unsetAuthorization ([#399](https://github.com/forcedotcom/sfdx-core/issues/399)) ([dd57438](https://github.com/forcedotcom/sfdx-core/commit/dd57438a95b49515f560d3b915cdf916a4b8643b)) - +- compilation errors ([33a9876](https://github.com/forcedotcom/sfdx-core/commit/33a9876575eff7944bb287d428f52413831725d9)) +- unit test failures ([4507575](https://github.com/forcedotcom/sfdx-core/commit/45075754175d411b6cb71eb809096e6eb3e23d95)) +- unsetAuthorization ([#399](https://github.com/forcedotcom/sfdx-core/issues/399)) ([dd57438](https://github.com/forcedotcom/sfdx-core/commit/dd57438a95b49515f560d3b915cdf916a4b8643b)) ### Features -* add GlobalInfo config file ([#397](https://github.com/forcedotcom/sfdx-core/issues/397)) ([889425c](https://github.com/forcedotcom/sfdx-core/commit/889425c06e8ed6a364d9a2bc3dd5ef0a38a66046)) -* add message support for markdown files ([0f235a2](https://github.com/forcedotcom/sfdx-core/commit/0f235a23d5dddbd7b3f07544d8c7e380875c6c55)) -* move crypto to config file @W-9225317@ ([#406](https://github.com/forcedotcom/sfdx-core/issues/406)) ([bac83c3](https://github.com/forcedotcom/sfdx-core/commit/bac83c3a52b15c9b462dfb68be9d080e710493cd)) - - +- add GlobalInfo config file ([#397](https://github.com/forcedotcom/sfdx-core/issues/397)) ([889425c](https://github.com/forcedotcom/sfdx-core/commit/889425c06e8ed6a364d9a2bc3dd5ef0a38a66046)) +- add message support for markdown files ([0f235a2](https://github.com/forcedotcom/sfdx-core/commit/0f235a23d5dddbd7b3f07544d8c7e380875c6c55)) +- move crypto to config file @W-9225317@ ([#406](https://github.com/forcedotcom/sfdx-core/issues/406)) ([bac83c3](https://github.com/forcedotcom/sfdx-core/commit/bac83c3a52b15c9b462dfb68be9d080e710493cd)) # [2.26.0](https://github.com/forcedotcom/sfdx-core/compare/v2.25.1...v2.26.0) (2021-07-13) - ### Features -* update generate password functionality ([#432](https://github.com/forcedotcom/sfdx-core/issues/432)) ([ed65e83](https://github.com/forcedotcom/sfdx-core/commit/ed65e83da3afe0d101743ee89cc7b2a7a38d5254)) - - +- update generate password functionality ([#432](https://github.com/forcedotcom/sfdx-core/issues/432)) ([ed65e83](https://github.com/forcedotcom/sfdx-core/commit/ed65e83da3afe0d101743ee89cc7b2a7a38d5254)) ## [2.25.1](https://github.com/forcedotcom/sfdx-core/compare/v3.1.1-3.2...v2.25.1) (2021-06-30) - ### Bug Fixes -* set retries to INFINITELY for polling client ([31539b4](https://github.com/forcedotcom/sfdx-core/commit/31539b4f0edd0cc1c049f70331ed5e40b8af55ea)) - - +- set retries to INFINITELY for polling client ([31539b4](https://github.com/forcedotcom/sfdx-core/commit/31539b4f0edd0cc1c049f70331ed5e40b8af55ea)) ## [3.1.1-3.2](https://github.com/forcedotcom/sfdx-core/compare/v2.25.0...v3.1.1-3.2) (2021-06-30) - ### Features -* @W-9517449@ Allow signupTargetLoginUrl to be overridden via env var ([#429](https://github.com/forcedotcom/sfdx-core/issues/429)) ([e2b8b36](https://github.com/forcedotcom/sfdx-core/commit/e2b8b36b2836b5277c83ffe22922978dc32e7b11)), closes [#427](https://github.com/forcedotcom/sfdx-core/issues/427) - - +- @W-9517449@ Allow signupTargetLoginUrl to be overridden via env var ([#429](https://github.com/forcedotcom/sfdx-core/issues/429)) ([e2b8b36](https://github.com/forcedotcom/sfdx-core/commit/e2b8b36b2836b5277c83ffe22922978dc32e7b11)), closes [#427](https://github.com/forcedotcom/sfdx-core/issues/427) ## [2.24.2](https://github.com/forcedotcom/sfdx-core/compare/v3.1.1-3.1...v2.24.2) (2021-06-23) - - ## [3.1.1-3.1](https://github.com/forcedotcom/sfdx-core/compare/v2.24.1...v3.1.1-3.1) (2021-06-23) - ### Bug Fixes -* puts some types back in dependencies ([94bea31](https://github.com/forcedotcom/sfdx-core/commit/94bea31037a41d4377faecb22bce8a2d12e95f4f)) -* rewrite polling client ([8d363d1](https://github.com/forcedotcom/sfdx-core/commit/8d363d13616f5efa944d4bb717a010add3c996b5)) - - +- puts some types back in dependencies ([94bea31](https://github.com/forcedotcom/sfdx-core/commit/94bea31037a41d4377faecb22bce8a2d12e95f4f)) +- rewrite polling client ([8d363d1](https://github.com/forcedotcom/sfdx-core/commit/8d363d13616f5efa944d4bb717a010add3c996b5)) # [2.24.0](https://github.com/forcedotcom/sfdx-core/compare/v2.23.5...v2.24.0) (2021-06-08) - ### Features -* exported function checkLightningDomain() ([#415](https://github.com/forcedotcom/sfdx-core/issues/415)) ([8e75231](https://github.com/forcedotcom/sfdx-core/commit/8e752313abf4a383a6ef18250ffac78b398987dd)) - - +- exported function checkLightningDomain() ([#415](https://github.com/forcedotcom/sfdx-core/issues/415)) ([8e75231](https://github.com/forcedotcom/sfdx-core/commit/8e752313abf4a383a6ef18250ffac78b398987dd)) ## [2.23.5](https://github.com/forcedotcom/sfdx-core/compare/v3.1.1-3.0...v2.23.5) (2021-06-07) - ### Bug Fixes -* w-9299422 (login url from config) and fs-parallelization ([043bb17](https://github.com/forcedotcom/sfdx-core/commit/043bb179dbf64f9c4522a4c0f0720ae09794227c)) - - +- w-9299422 (login url from config) and fs-parallelization ([043bb17](https://github.com/forcedotcom/sfdx-core/commit/043bb179dbf64f9c4522a4c0f0720ae09794227c)) ## [3.1.1-3.0](https://github.com/forcedotcom/sfdx-core/compare/v2.23.4...v3.1.1-3.0) (2021-06-03) - ### Bug Fixes -* works with TS4+ and jsforce types ([#413](https://github.com/forcedotcom/sfdx-core/issues/413)) ([b77cdad](https://github.com/forcedotcom/sfdx-core/commit/b77cdad56b114290b8e5fd23d968e23e7d4eedf4)) - - +- works with TS4+ and jsforce types ([#413](https://github.com/forcedotcom/sfdx-core/issues/413)) ([b77cdad](https://github.com/forcedotcom/sfdx-core/commit/b77cdad56b114290b8e5fd23d968e23e7d4eedf4)) ## [3.1.1-v3.2](https://github.com/forcedotcom/sfdx-core/compare/v2.24.2...v3.1.1-v3.2) (2021-06-29) - ### Bug Fixes -* do not use function prop ([#426](https://github.com/forcedotcom/sfdx-core/issues/426)) ([39efe0c](https://github.com/forcedotcom/sfdx-core/commit/39efe0ccc84b05bc891e54b24bfcddc62790ae0e)) - - +- do not use function prop ([#426](https://github.com/forcedotcom/sfdx-core/issues/426)) ([39efe0c](https://github.com/forcedotcom/sfdx-core/commit/39efe0ccc84b05bc891e54b24bfcddc62790ae0e)) ## [3.1.1-v3.1](https://github.com/forcedotcom/sfdx-core/compare/v2.24.0...v3.1.1-v3.1) (2021-06-14) - ### Bug Fixes -* keep track of auth changes ([210be6c](https://github.com/forcedotcom/sfdx-core/commit/210be6cb408bd9ecc861989570df0e14f6a3a566)) - - +- keep track of auth changes ([210be6c](https://github.com/forcedotcom/sfdx-core/commit/210be6cb408bd9ecc861989570df0e14f6a3a566)) ## [3.1.1-v3.0](https://github.com/forcedotcom/sfdx-core/compare/v2.23.3...v3.1.1-v3.0) (2021-06-03) - ### Bug Fixes -* compilation errors ([33a9876](https://github.com/forcedotcom/sfdx-core/commit/33a9876575eff7944bb287d428f52413831725d9)) -* unit test failures ([4507575](https://github.com/forcedotcom/sfdx-core/commit/45075754175d411b6cb71eb809096e6eb3e23d95)) -* unsetAuthorization ([#399](https://github.com/forcedotcom/sfdx-core/issues/399)) ([dd57438](https://github.com/forcedotcom/sfdx-core/commit/dd57438a95b49515f560d3b915cdf916a4b8643b)) - +- compilation errors ([33a9876](https://github.com/forcedotcom/sfdx-core/commit/33a9876575eff7944bb287d428f52413831725d9)) +- unit test failures ([4507575](https://github.com/forcedotcom/sfdx-core/commit/45075754175d411b6cb71eb809096e6eb3e23d95)) +- unsetAuthorization ([#399](https://github.com/forcedotcom/sfdx-core/issues/399)) ([dd57438](https://github.com/forcedotcom/sfdx-core/commit/dd57438a95b49515f560d3b915cdf916a4b8643b)) ### Features -* add GlobalInfo config file ([#397](https://github.com/forcedotcom/sfdx-core/issues/397)) ([889425c](https://github.com/forcedotcom/sfdx-core/commit/889425c06e8ed6a364d9a2bc3dd5ef0a38a66046)) -* add message support for markdown files ([0f235a2](https://github.com/forcedotcom/sfdx-core/commit/0f235a23d5dddbd7b3f07544d8c7e380875c6c55)) -* move crypto to config file @W-9225317@ ([#406](https://github.com/forcedotcom/sfdx-core/issues/406)) ([bac83c3](https://github.com/forcedotcom/sfdx-core/commit/bac83c3a52b15c9b462dfb68be9d080e710493cd)) - - +- add GlobalInfo config file ([#397](https://github.com/forcedotcom/sfdx-core/issues/397)) ([889425c](https://github.com/forcedotcom/sfdx-core/commit/889425c06e8ed6a364d9a2bc3dd5ef0a38a66046)) +- add message support for markdown files ([0f235a2](https://github.com/forcedotcom/sfdx-core/commit/0f235a23d5dddbd7b3f07544d8c7e380875c6c55)) +- move crypto to config file @W-9225317@ ([#406](https://github.com/forcedotcom/sfdx-core/issues/406)) ([bac83c3](https://github.com/forcedotcom/sfdx-core/commit/bac83c3a52b15c9b462dfb68be9d080e710493cd)) ## [2.24.2](https://github.com/forcedotcom/sfdx-core/compare/v3.1.1-3.1...v2.24.2) (2021-06-23) - ### Bug Fixes -* puts some types back in dependencies ([94bea31](https://github.com/forcedotcom/sfdx-core/commit/94bea31037a41d4377faecb22bce8a2d12e95f4f)) - - +- puts some types back in dependencies ([94bea31](https://github.com/forcedotcom/sfdx-core/commit/94bea31037a41d4377faecb22bce8a2d12e95f4f)) ## [3.1.1-3.1](https://github.com/forcedotcom/sfdx-core/compare/v2.24.1...v3.1.1-3.1) (2021-06-23) - ### Bug Fixes -* rewrite polling client ([8d363d1](https://github.com/forcedotcom/sfdx-core/commit/8d363d13616f5efa944d4bb717a010add3c996b5)) - - +- rewrite polling client ([8d363d1](https://github.com/forcedotcom/sfdx-core/commit/8d363d13616f5efa944d4bb717a010add3c996b5)) # [2.24.0](https://github.com/forcedotcom/sfdx-core/compare/v2.23.5...v2.24.0) (2021-06-08) - ### Features -* exported function checkLightningDomain() ([#415](https://github.com/forcedotcom/sfdx-core/issues/415)) ([8e75231](https://github.com/forcedotcom/sfdx-core/commit/8e752313abf4a383a6ef18250ffac78b398987dd)) - - +- exported function checkLightningDomain() ([#415](https://github.com/forcedotcom/sfdx-core/issues/415)) ([8e75231](https://github.com/forcedotcom/sfdx-core/commit/8e752313abf4a383a6ef18250ffac78b398987dd)) ## [2.23.5](https://github.com/forcedotcom/sfdx-core/compare/v3.1.1-3.0...v2.23.5) (2021-06-07) - ### Bug Fixes -* w-9299422 (login url from config) and fs-parallelization ([043bb17](https://github.com/forcedotcom/sfdx-core/commit/043bb179dbf64f9c4522a4c0f0720ae09794227c)) - - +- w-9299422 (login url from config) and fs-parallelization ([043bb17](https://github.com/forcedotcom/sfdx-core/commit/043bb179dbf64f9c4522a4c0f0720ae09794227c)) ## [3.1.1-3.0](https://github.com/forcedotcom/sfdx-core/compare/v2.23.4...v3.1.1-3.0) (2021-06-03) - ### Bug Fixes -* works with TS4+ and jsforce types ([#413](https://github.com/forcedotcom/sfdx-core/issues/413)) ([b77cdad](https://github.com/forcedotcom/sfdx-core/commit/b77cdad56b114290b8e5fd23d968e23e7d4eedf4)) - - +- works with TS4+ and jsforce types ([#413](https://github.com/forcedotcom/sfdx-core/issues/413)) ([b77cdad](https://github.com/forcedotcom/sfdx-core/commit/b77cdad56b114290b8e5fd23d968e23e7d4eedf4)) ## [3.1.1-v3.1](https://github.com/forcedotcom/sfdx-core/compare/v2.24.0...v3.1.1-v3.1) (2021-06-14) - ### Bug Fixes -* keep track of auth changes ([210be6c](https://github.com/forcedotcom/sfdx-core/commit/210be6cb408bd9ecc861989570df0e14f6a3a566)) - - +- keep track of auth changes ([210be6c](https://github.com/forcedotcom/sfdx-core/commit/210be6cb408bd9ecc861989570df0e14f6a3a566)) ## [3.1.1-v3.0](https://github.com/forcedotcom/sfdx-core/compare/v2.23.3...v3.1.1-v3.0) (2021-06-03) - ### Bug Fixes -* compilation errors ([33a9876](https://github.com/forcedotcom/sfdx-core/commit/33a9876575eff7944bb287d428f52413831725d9)) -* unit test failures ([4507575](https://github.com/forcedotcom/sfdx-core/commit/45075754175d411b6cb71eb809096e6eb3e23d95)) -* unsetAuthorization ([#399](https://github.com/forcedotcom/sfdx-core/issues/399)) ([dd57438](https://github.com/forcedotcom/sfdx-core/commit/dd57438a95b49515f560d3b915cdf916a4b8643b)) - +- compilation errors ([33a9876](https://github.com/forcedotcom/sfdx-core/commit/33a9876575eff7944bb287d428f52413831725d9)) +- unit test failures ([4507575](https://github.com/forcedotcom/sfdx-core/commit/45075754175d411b6cb71eb809096e6eb3e23d95)) +- unsetAuthorization ([#399](https://github.com/forcedotcom/sfdx-core/issues/399)) ([dd57438](https://github.com/forcedotcom/sfdx-core/commit/dd57438a95b49515f560d3b915cdf916a4b8643b)) ### Features -* add GlobalInfo config file ([#397](https://github.com/forcedotcom/sfdx-core/issues/397)) ([889425c](https://github.com/forcedotcom/sfdx-core/commit/889425c06e8ed6a364d9a2bc3dd5ef0a38a66046)) -* add message support for markdown files ([0f235a2](https://github.com/forcedotcom/sfdx-core/commit/0f235a23d5dddbd7b3f07544d8c7e380875c6c55)) -* move crypto to config file @W-9225317@ ([#406](https://github.com/forcedotcom/sfdx-core/issues/406)) ([bac83c3](https://github.com/forcedotcom/sfdx-core/commit/bac83c3a52b15c9b462dfb68be9d080e710493cd)) - - +- add GlobalInfo config file ([#397](https://github.com/forcedotcom/sfdx-core/issues/397)) ([889425c](https://github.com/forcedotcom/sfdx-core/commit/889425c06e8ed6a364d9a2bc3dd5ef0a38a66046)) +- add message support for markdown files ([0f235a2](https://github.com/forcedotcom/sfdx-core/commit/0f235a23d5dddbd7b3f07544d8c7e380875c6c55)) +- move crypto to config file @W-9225317@ ([#406](https://github.com/forcedotcom/sfdx-core/issues/406)) ([bac83c3](https://github.com/forcedotcom/sfdx-core/commit/bac83c3a52b15c9b462dfb68be9d080e710493cd)) # [2.24.0](https://github.com/forcedotcom/sfdx-core/compare/v2.23.5...v2.24.0) (2021-06-08) - ### Features -* exported function checkLightningDomain() ([#415](https://github.com/forcedotcom/sfdx-core/issues/415)) ([8e75231](https://github.com/forcedotcom/sfdx-core/commit/8e752313abf4a383a6ef18250ffac78b398987dd)) - - +- exported function checkLightningDomain() ([#415](https://github.com/forcedotcom/sfdx-core/issues/415)) ([8e75231](https://github.com/forcedotcom/sfdx-core/commit/8e752313abf4a383a6ef18250ffac78b398987dd)) ## [2.23.5](https://github.com/forcedotcom/sfdx-core/compare/v3.1.1-3.0...v2.23.5) (2021-06-07) - ### Bug Fixes -* w-9299422 (login url from config) and fs-parallelization ([043bb17](https://github.com/forcedotcom/sfdx-core/commit/043bb179dbf64f9c4522a4c0f0720ae09794227c)) - - +- w-9299422 (login url from config) and fs-parallelization ([043bb17](https://github.com/forcedotcom/sfdx-core/commit/043bb179dbf64f9c4522a4c0f0720ae09794227c)) ## [3.1.1-3.0](https://github.com/forcedotcom/sfdx-core/compare/v2.23.4...v3.1.1-3.0) (2021-06-03) - ### Bug Fixes -* works with TS4+ and jsforce types ([#413](https://github.com/forcedotcom/sfdx-core/issues/413)) ([b77cdad](https://github.com/forcedotcom/sfdx-core/commit/b77cdad56b114290b8e5fd23d968e23e7d4eedf4)) - - +- works with TS4+ and jsforce types ([#413](https://github.com/forcedotcom/sfdx-core/issues/413)) ([b77cdad](https://github.com/forcedotcom/sfdx-core/commit/b77cdad56b114290b8e5fd23d968e23e7d4eedf4)) ## [3.1.1-v3.0](https://github.com/forcedotcom/sfdx-core/compare/v2.23.3...v3.1.1-v3.0) (2021-06-03) - ### Bug Fixes -* compilation errors ([33a9876](https://github.com/forcedotcom/sfdx-core/commit/33a9876575eff7944bb287d428f52413831725d9)) -* unit test failures ([4507575](https://github.com/forcedotcom/sfdx-core/commit/45075754175d411b6cb71eb809096e6eb3e23d95)) -* unsetAuthorization ([#399](https://github.com/forcedotcom/sfdx-core/issues/399)) ([dd57438](https://github.com/forcedotcom/sfdx-core/commit/dd57438a95b49515f560d3b915cdf916a4b8643b)) - +- compilation errors ([33a9876](https://github.com/forcedotcom/sfdx-core/commit/33a9876575eff7944bb287d428f52413831725d9)) +- unit test failures ([4507575](https://github.com/forcedotcom/sfdx-core/commit/45075754175d411b6cb71eb809096e6eb3e23d95)) +- unsetAuthorization ([#399](https://github.com/forcedotcom/sfdx-core/issues/399)) ([dd57438](https://github.com/forcedotcom/sfdx-core/commit/dd57438a95b49515f560d3b915cdf916a4b8643b)) ### Features -* add GlobalInfo config file ([#397](https://github.com/forcedotcom/sfdx-core/issues/397)) ([889425c](https://github.com/forcedotcom/sfdx-core/commit/889425c06e8ed6a364d9a2bc3dd5ef0a38a66046)) -* add message support for markdown files ([0f235a2](https://github.com/forcedotcom/sfdx-core/commit/0f235a23d5dddbd7b3f07544d8c7e380875c6c55)) -* move crypto to config file @W-9225317@ ([#406](https://github.com/forcedotcom/sfdx-core/issues/406)) ([bac83c3](https://github.com/forcedotcom/sfdx-core/commit/bac83c3a52b15c9b462dfb68be9d080e710493cd)) - - +- add GlobalInfo config file ([#397](https://github.com/forcedotcom/sfdx-core/issues/397)) ([889425c](https://github.com/forcedotcom/sfdx-core/commit/889425c06e8ed6a364d9a2bc3dd5ef0a38a66046)) +- add message support for markdown files ([0f235a2](https://github.com/forcedotcom/sfdx-core/commit/0f235a23d5dddbd7b3f07544d8c7e380875c6c55)) +- move crypto to config file @W-9225317@ ([#406](https://github.com/forcedotcom/sfdx-core/issues/406)) ([bac83c3](https://github.com/forcedotcom/sfdx-core/commit/bac83c3a52b15c9b462dfb68be9d080e710493cd)) ## [2.23.3](https://github.com/forcedotcom/sfdx-core/compare/v2.23.2...v2.23.3) (2021-06-03) - - ## [2.23.2](https://github.com/forcedotcom/sfdx-core/compare/v2.23.1...v2.23.2) (2021-06-02) - ### Bug Fixes -* authinfo returning only lowercase usernames. ([#411](https://github.com/forcedotcom/sfdx-core/issues/411)) ([243668e](https://github.com/forcedotcom/sfdx-core/commit/243668e61cd8418b6acb2f0d4806da50ccf37b29)), closes [#405](https://github.com/forcedotcom/sfdx-core/issues/405) - - +- authinfo returning only lowercase usernames. ([#411](https://github.com/forcedotcom/sfdx-core/issues/411)) ([243668e](https://github.com/forcedotcom/sfdx-core/commit/243668e61cd8418b6acb2f0d4806da50ccf37b29)), closes [#405](https://github.com/forcedotcom/sfdx-core/issues/405) ## [2.23.1](https://github.com/forcedotcom/sfdx-core/compare/v2.23.0...v2.23.1) (2021-05-27) - - # [2.23.0](https://github.com/forcedotcom/sfdx-core/compare/v2.22.0...v2.23.0) (2021-05-26) - ### Bug Fixes -* export library method ([d0016f9](https://github.com/forcedotcom/sfdx-core/commit/d0016f96da1246535049884c1043399239a33c00)) - +- export library method ([d0016f9](https://github.com/forcedotcom/sfdx-core/commit/d0016f96da1246535049884c1043399239a33c00)) ### Features -* export getJwtAudienceUrl ([e7d26d2](https://github.com/forcedotcom/sfdx-core/commit/e7d26d20106d6abb6b424936bdf26c0a9f8cd175)) - - +- export getJwtAudienceUrl ([e7d26d2](https://github.com/forcedotcom/sfdx-core/commit/e7d26d20106d6abb6b424936bdf26c0a9f8cd175)) # [2.22.0](https://github.com/forcedotcom/sfdx-core/compare/v2.21.0...v2.22.0) (2021-05-24) - ### Features -* export getJwtAudienceUrl ([#407](https://github.com/forcedotcom/sfdx-core/issues/407)) ([585bb07](https://github.com/forcedotcom/sfdx-core/commit/585bb073434d73473a855ee52b7ddc6f0228aae1)) - - +- export getJwtAudienceUrl ([#407](https://github.com/forcedotcom/sfdx-core/issues/407)) ([585bb07](https://github.com/forcedotcom/sfdx-core/commit/585bb073434d73473a855ee52b7ddc6f0228aae1)) # [2.21.0](https://github.com/forcedotcom/sfdx-core/compare/v2.20.11...v2.21.0) (2021-05-24) - ### Features -* modify authInfo to return username for access token auth ([160b7d2](https://github.com/forcedotcom/sfdx-core/commit/160b7d20e32b80d7a54c8cf679154fcbaa9e8cda)) - - +- modify authInfo to return username for access token auth ([160b7d2](https://github.com/forcedotcom/sfdx-core/commit/160b7d20e32b80d7a54c8cf679154fcbaa9e8cda)) ## [2.20.11](https://github.com/forcedotcom/sfdx-core/compare/v3.1.0-3.0...v2.20.11) (2021-05-12) - ### Bug Fixes -* force release ([f0b837a](https://github.com/forcedotcom/sfdx-core/commit/f0b837ab7b4d0361c2fa3ba15fe56cd2f7cc1fd0)) - - +- force release ([f0b837a](https://github.com/forcedotcom/sfdx-core/commit/f0b837ab7b4d0361c2fa3ba15fe56cd2f7cc1fd0)) # [3.1.0-3.0](https://github.com/forcedotcom/sfdx-core/compare/v3.0.1-3.0...v3.1.0-3.0) (2021-05-12) - - ## [3.0.1-3.0](https://github.com/forcedotcom/sfdx-core/compare/v2.20.10...v3.0.1-3.0) (2021-05-05) - - ## [2.20.10](https://github.com/forcedotcom/sfdx-core/compare/v2.20.9...v2.20.10) (2021-04-14) - ### Bug Fixes -* add another internal test env domain ([6ea538f](https://github.com/forcedotcom/sfdx-core/commit/6ea538f2ce62daba7262a247472ce821c6e2616f)) - - +- add another internal test env domain ([6ea538f](https://github.com/forcedotcom/sfdx-core/commit/6ea538f2ce62daba7262a247472ce821c6e2616f)) ## [2.20.9](https://github.com/forcedotcom/sfdx-core/compare/v2.20.8...v2.20.9) (2021-04-05) - ### Bug Fixes -* allow = in authUrl tokens ([2337fcd](https://github.com/forcedotcom/sfdx-core/commit/2337fcddfb1907a7092cd52f5b3ad73ae963d59e)) - - +- allow = in authUrl tokens ([2337fcd](https://github.com/forcedotcom/sfdx-core/commit/2337fcddfb1907a7092cd52f5b3ad73ae963d59e)) ## [2.20.8](https://github.com/forcedotcom/sfdx-core/compare/v2.20.7...v2.20.8) (2021-04-03) - ### Bug Fixes -* debugEnabled should be public ([dbd0124](https://github.com/forcedotcom/sfdx-core/commit/dbd01243003f555b8b4db45c83e81cc08b8cb9a1)) - - +- debugEnabled should be public ([dbd0124](https://github.com/forcedotcom/sfdx-core/commit/dbd01243003f555b8b4db45c83e81cc08b8cb9a1)) ## [2.20.7](https://github.com/forcedotcom/sfdx-core/compare/v2.20.6...v2.20.7) (2021-04-02) - ### Bug Fixes -* add deployRecentValidation ([62d367b](https://github.com/forcedotcom/sfdx-core/commit/62d367b217e6b552573bd7176b064e28252348c5)) -* add deployRecentValidation ([a39c329](https://github.com/forcedotcom/sfdx-core/commit/a39c329b3fab603b537ae5ed8cce4773bdf24eb6)) -* add test, clarify comments ([8d5679e](https://github.com/forcedotcom/sfdx-core/commit/8d5679ecbd482af84842f5c1c8908a059d97ef3f)) - - +- add deployRecentValidation ([62d367b](https://github.com/forcedotcom/sfdx-core/commit/62d367b217e6b552573bd7176b064e28252348c5)) +- add deployRecentValidation ([a39c329](https://github.com/forcedotcom/sfdx-core/commit/a39c329b3fab603b537ae5ed8cce4773bdf24eb6)) +- add test, clarify comments ([8d5679e](https://github.com/forcedotcom/sfdx-core/commit/8d5679ecbd482af84842f5c1c8908a059d97ef3f)) ## [2.20.6](https://github.com/forcedotcom/sfdx-core/compare/v2.20.5...v2.20.6) (2021-04-02) - ### Bug Fixes -* add REST deploy and test ([a1204f8](https://github.com/forcedotcom/sfdx-core/commit/a1204f857654ef979913708a8404d3b1e5328352)) -* deploy with REST working :) ([ec36851](https://github.com/forcedotcom/sfdx-core/commit/ec368515cd2d5d947f947573abbdaa83d3a853a2)) -* remove requrie ts-node/register from package ([5377fe4](https://github.com/forcedotcom/sfdx-core/commit/5377fe46c3ed5707d31e45794f9fd397aabbcf63)) -* rest deploy without fs :D ([9a4202d](https://github.com/forcedotcom/sfdx-core/commit/9a4202d157131fbf6aebb007a0334d3d1ce1d4e8)) -* working on adding REST deploy ([0b3947b](https://github.com/forcedotcom/sfdx-core/commit/0b3947b4e39b1ecd790cd6c03077e4388faf2b04)) - - +- add REST deploy and test ([a1204f8](https://github.com/forcedotcom/sfdx-core/commit/a1204f857654ef979913708a8404d3b1e5328352)) +- deploy with REST working :) ([ec36851](https://github.com/forcedotcom/sfdx-core/commit/ec368515cd2d5d947f947573abbdaa83d3a853a2)) +- remove requrie ts-node/register from package ([5377fe4](https://github.com/forcedotcom/sfdx-core/commit/5377fe46c3ed5707d31e45794f9fd397aabbcf63)) +- rest deploy without fs :D ([9a4202d](https://github.com/forcedotcom/sfdx-core/commit/9a4202d157131fbf6aebb007a0334d3d1ce1d4e8)) +- working on adding REST deploy ([0b3947b](https://github.com/forcedotcom/sfdx-core/commit/0b3947b4e39b1ecd790cd6c03077e4388faf2b04)) ## [2.20.5](https://github.com/forcedotcom/sfdx-core/compare/v2.20.4...v2.20.5) (2021-03-08) - ### Bug Fixes -* qualify a sandbox url via cname lookup ([#385](https://github.com/forcedotcom/sfdx-core/issues/385)) ([3e27623](https://github.com/forcedotcom/sfdx-core/commit/3e276237278fabb609b890e3271c4d8a28c0f573)) - - +- qualify a sandbox url via cname lookup ([#385](https://github.com/forcedotcom/sfdx-core/issues/385)) ([3e27623](https://github.com/forcedotcom/sfdx-core/commit/3e276237278fabb609b890e3271c4d8a28c0f573)) ## [2.20.4](https://github.com/forcedotcom/sfdx-core/compare/v2.20.3...v2.20.4) (2021-03-03) - - ## [2.20.3](https://github.com/forcedotcom/sfdx-core/compare/v2.20.2...v2.20.3) (2021-02-25) - ### Bug Fixes -* await the call to authInfo.save ([299499e](https://github.com/forcedotcom/sfdx-core/commit/299499ee29e9243b7d60fb9bdef22165a34b4611)) -* web:login fails when org cannot access REST ([31b139a](https://github.com/forcedotcom/sfdx-core/commit/31b139a56ce37e0d8a15946163dbf96c872c565b)) - +- await the call to authInfo.save ([299499e](https://github.com/forcedotcom/sfdx-core/commit/299499ee29e9243b7d60fb9bdef22165a34b4611)) +- web:login fails when org cannot access REST ([31b139a](https://github.com/forcedotcom/sfdx-core/commit/31b139a56ce37e0d8a15946163dbf96c872c565b)) ### Performance Improvements -* small queries to identify a devHub ([7bc75c1](https://github.com/forcedotcom/sfdx-core/commit/7bc75c16c7d03a81031e4e645e24aa9d23205028)) - - +- small queries to identify a devHub ([7bc75c1](https://github.com/forcedotcom/sfdx-core/commit/7bc75c16c7d03a81031e4e645e24aa9d23205028)) ## [2.20.2](https://github.com/forcedotcom/sfdx-core/compare/v2.20.1...v2.20.2) (2021-02-25) - ### Performance Improvements -* small queries to identify a devHub ([2bae295](https://github.com/forcedotcom/sfdx-core/commit/2bae295a63cb28ee7e7ea31f8d4b8f165ccd6173)) - - +- small queries to identify a devHub ([2bae295](https://github.com/forcedotcom/sfdx-core/commit/2bae295a63cb28ee7e7ea31f8d4b8f165ccd6173)) ## [2.20.1](https://github.com/forcedotcom/sfdx-core/compare/v2.20.0...v2.20.1) (2021-02-24) - ### Bug Fixes -* await the call to authInfo.save ([b26ea70](https://github.com/forcedotcom/sfdx-core/commit/b26ea700793eb2a985f28ce7fc349164d5edaf89)) - - +- await the call to authInfo.save ([b26ea70](https://github.com/forcedotcom/sfdx-core/commit/b26ea700793eb2a985f28ce7fc349164d5edaf89)) # [2.20.0](https://github.com/forcedotcom/sfdx-core/compare/v2.19.1...v2.20.0) (2021-02-22) - ### Bug Fixes -* do not save access token files ([46d88b9](https://github.com/forcedotcom/sfdx-core/commit/46d88b90c11c7de392412ef64ded201a2145de9d)) - +- do not save access token files ([46d88b9](https://github.com/forcedotcom/sfdx-core/commit/46d88b90c11c7de392412ef64ded201a2145de9d)) ### Features -* cache api version on auth info ([cb21cf0](https://github.com/forcedotcom/sfdx-core/commit/cb21cf099a4ab6911e49b26488b51eb6988b2be7)) - - +- cache api version on auth info ([cb21cf0](https://github.com/forcedotcom/sfdx-core/commit/cb21cf099a4ab6911e49b26488b51eb6988b2be7)) ## [2.19.1](https://github.com/forcedotcom/sfdx-core/compare/v2.19.0...v2.19.1) (2021-02-19) - ### Bug Fixes -* meet more password requirements ([53025f0](https://github.com/forcedotcom/sfdx-core/commit/53025f00a5a52cb32ed8ac20178c409df5014b76)) - - +- meet more password requirements ([53025f0](https://github.com/forcedotcom/sfdx-core/commit/53025f00a5a52cb32ed8ac20178c409df5014b76)) # [2.19.0](https://github.com/forcedotcom/sfdx-core/compare/v2.18.6...v2.19.0) (2021-02-17) - ### Bug Fixes -* move env vars to myDomainResolver ([fcf1a4a](https://github.com/forcedotcom/sfdx-core/commit/fcf1a4a4e333e6ac9e8d6e91204d030031de3d1c)) -* revert dns polling timeout to 30 and frequency to 10 ([4ba7a63](https://github.com/forcedotcom/sfdx-core/commit/4ba7a63ad5019c33123773789af6c7c58e4c6eb3)) - +- move env vars to myDomainResolver ([fcf1a4a](https://github.com/forcedotcom/sfdx-core/commit/fcf1a4a4e333e6ac9e8d6e91204d030031de3d1c)) +- revert dns polling timeout to 30 and frequency to 10 ([4ba7a63](https://github.com/forcedotcom/sfdx-core/commit/4ba7a63ad5019c33123773789af6c7c58e4c6eb3)) ### Features -* add SFDX_DISABLE_DNS_CHECK ([2e2cb84](https://github.com/forcedotcom/sfdx-core/commit/2e2cb84f557ecb057358efa107c616d79dbc160b)) - - +- add SFDX_DISABLE_DNS_CHECK ([2e2cb84](https://github.com/forcedotcom/sfdx-core/commit/2e2cb84f557ecb057358efa107c616d79dbc160b)) ## [2.18.6](https://github.com/forcedotcom/sfdx-core/compare/v2.18.5...v2.18.6) (2021-02-17) - ### Bug Fixes -* pass decrypted client secret for oauth ([#374](https://github.com/forcedotcom/sfdx-core/issues/374)) ([63bf84e](https://github.com/forcedotcom/sfdx-core/commit/63bf84eaa962c151dc6a5ffcec3edcdf4bf91b05)) - - +- pass decrypted client secret for oauth ([#374](https://github.com/forcedotcom/sfdx-core/issues/374)) ([63bf84e](https://github.com/forcedotcom/sfdx-core/commit/63bf84eaa962c151dc6a5ffcec3edcdf4bf91b05)) ## [2.18.5](https://github.com/forcedotcom/sfdx-core/compare/v2.18.4...v2.18.5) (2021-02-11) - ### Bug Fixes -* filter allowedProperties on getConfigInfo ([cbb91e1](https://github.com/forcedotcom/sfdx-core/commit/cbb91e1604f7c7c8b192b8d6ca2c64bdd4fb05b2)) -* no throw on unknown config value ([49618db](https://github.com/forcedotcom/sfdx-core/commit/49618db01cd180fd1267092d36754d83a6514182)) - - +- filter allowedProperties on getConfigInfo ([cbb91e1](https://github.com/forcedotcom/sfdx-core/commit/cbb91e1604f7c7c8b192b8d6ca2c64bdd4fb05b2)) +- no throw on unknown config value ([49618db](https://github.com/forcedotcom/sfdx-core/commit/49618db01cd180fd1267092d36754d83a6514182)) ## [2.18.4](https://github.com/forcedotcom/sfdx-core/compare/v2.18.3...v2.18.4) (2021-02-10) - ### Bug Fixes -* isresolvable mock ([6a7e8b1](https://github.com/forcedotcom/sfdx-core/commit/6a7e8b153a42135792a3df58b809981706492e83)) - - +- isresolvable mock ([6a7e8b1](https://github.com/forcedotcom/sfdx-core/commit/6a7e8b153a42135792a3df58b809981706492e83)) ## [2.18.3](https://github.com/forcedotcom/sfdx-core/compare/v2.18.2...v2.18.3) (2021-02-05) - ### Bug Fixes -* update password jsdoc for v51 + return type ([390ed8d](https://github.com/forcedotcom/sfdx-core/commit/390ed8d0f15ee3915e35ccea5505890b10f16c81)) - - +- update password jsdoc for v51 + return type ([390ed8d](https://github.com/forcedotcom/sfdx-core/commit/390ed8d0f15ee3915e35ccea5505890b10f16c81)) ## [2.18.2](https://github.com/forcedotcom/sfdx-core/compare/v2.18.1...v2.18.2) (2021-02-04) - ### Bug Fixes -* fixed maxQueryLimit validation ([6431065](https://github.com/forcedotcom/sfdx-core/commit/6431065a0da6a615ef19594f69c069a19885f3e5)) -* fixed test descriptions ([1455204](https://github.com/forcedotcom/sfdx-core/commit/145520456c48c59003b1397ef7bcdf7a047ac083)) -* improved validation, error message, add test ([63e6c4d](https://github.com/forcedotcom/sfdx-core/commit/63e6c4d5814aa324d41b87a7ec275c16a085ef78)) -* maxQueryLimit must be > 0 ([a3d9156](https://github.com/forcedotcom/sfdx-core/commit/a3d91561f7510901dc02e42e80bb943bf3008a62)) - - +- fixed maxQueryLimit validation ([6431065](https://github.com/forcedotcom/sfdx-core/commit/6431065a0da6a615ef19594f69c069a19885f3e5)) +- fixed test descriptions ([1455204](https://github.com/forcedotcom/sfdx-core/commit/145520456c48c59003b1397ef7bcdf7a047ac083)) +- improved validation, error message, add test ([63e6c4d](https://github.com/forcedotcom/sfdx-core/commit/63e6c4d5814aa324d41b87a7ec275c16a085ef78)) +- maxQueryLimit must be > 0 ([a3d9156](https://github.com/forcedotcom/sfdx-core/commit/a3d91561f7510901dc02e42e80bb943bf3008a62)) ## [2.18.1](https://github.com/forcedotcom/sfdx-core/compare/v2.18.0...v2.18.1) (2021-02-04) - ### Bug Fixes -* add space option to write json ([51d01aa](https://github.com/forcedotcom/sfdx-core/commit/51d01aae7f7b2fc7fe0cf10ec9cffd170e0574ca)) - - +- add space option to write json ([51d01aa](https://github.com/forcedotcom/sfdx-core/commit/51d01aae7f7b2fc7fe0cf10ec9cffd170e0574ca)) # [2.18.0](https://github.com/forcedotcom/sfdx-core/compare/v2.17.0...v2.18.0) (2021-02-01) - ### Bug Fixes -* audience for loginUrls without my in the domain ([2bca84c](https://github.com/forcedotcom/sfdx-core/commit/2bca84c0b66d59b536ffa61f051e43b43c4c23dd)) -* audiences handle uppercased CS instances ([0d6d3ea](https://github.com/forcedotcom/sfdx-core/commit/0d6d3ea14601c1008f16e7d23af2802ef8e3ff65)) -* audiences use instanceURL ([64590cc](https://github.com/forcedotcom/sfdx-core/commit/64590cc4f9f30a37dbf4d17a6cf8db53ba0bdd09)) -* support enhanced domains ([a89ce21](https://github.com/forcedotcom/sfdx-core/commit/a89ce21c24ddbdd4cfad0772490f16768e5a0e3c)) - +- audience for loginUrls without my in the domain ([2bca84c](https://github.com/forcedotcom/sfdx-core/commit/2bca84c0b66d59b536ffa61f051e43b43c4c23dd)) +- audiences handle uppercased CS instances ([0d6d3ea](https://github.com/forcedotcom/sfdx-core/commit/0d6d3ea14601c1008f16e7d23af2802ef8e3ff65)) +- audiences use instanceURL ([64590cc](https://github.com/forcedotcom/sfdx-core/commit/64590cc4f9f30a37dbf4d17a6cf8db53ba0bdd09)) +- support enhanced domains ([a89ce21](https://github.com/forcedotcom/sfdx-core/commit/a89ce21c24ddbdd4cfad0772490f16768e5a0e3c)) ### Features -* falcon usa support w/o createdOrgInstance ([ec15d37](https://github.com/forcedotcom/sfdx-core/commit/ec15d37cb2500e41e787c432579e87ec7ed126d4)) -* more falcon domain support, url case insensitivity ([f72b85d](https://github.com/forcedotcom/sfdx-core/commit/f72b85d3e8a875306654bc7eb5b692218f242518)) -* more jwt audience domains ([03751ea](https://github.com/forcedotcom/sfdx-core/commit/03751ea884eacb59eecaadd139a8a09035cd08d0)) - - +- falcon usa support w/o createdOrgInstance ([ec15d37](https://github.com/forcedotcom/sfdx-core/commit/ec15d37cb2500e41e787c432579e87ec7ed126d4)) +- more falcon domain support, url case insensitivity ([f72b85d](https://github.com/forcedotcom/sfdx-core/commit/f72b85d3e8a875306654bc7eb5b692218f242518)) +- more jwt audience domains ([03751ea](https://github.com/forcedotcom/sfdx-core/commit/03751ea884eacb59eecaadd139a8a09035cd08d0)) # [2.17.0](https://github.com/forcedotcom/sfdx-core/compare/v2.16.6...v2.17.0) (2021-01-29) - ### Bug Fixes -* at least 3 ([109da8a](https://github.com/forcedotcom/sfdx-core/commit/109da8a5b335678c4967bd2aef92069e1f1bd955)) - +- at least 3 ([109da8a](https://github.com/forcedotcom/sfdx-core/commit/109da8a5b335678c4967bd2aef92069e1f1bd955)) ### Features -* adjustable DNS timeout ([9db7b66](https://github.com/forcedotcom/sfdx-core/commit/9db7b66bf8f3fb284ab98c0fbd0906c6195eabc6)) - - +- adjustable DNS timeout ([9db7b66](https://github.com/forcedotcom/sfdx-core/commit/9db7b66bf8f3fb284ab98c0fbd0906c6195eabc6)) ## [2.16.6](https://github.com/forcedotcom/sfdx-core/compare/v2.16.5...v2.16.6) (2021-01-29) - ### Bug Fixes -* add internal mil environment ([27e33ae](https://github.com/forcedotcom/sfdx-core/commit/27e33ae0a99ebc2c63364a67348174ab56468290)) -* additional "internal" host ([af15447](https://github.com/forcedotcom/sfdx-core/commit/af15447166e85124326134a4f8d51b9fd05381ea)) -* internal, local, and new stm.force domains ([b93f26d](https://github.com/forcedotcom/sfdx-core/commit/b93f26d2a2e255a0ef3089cde1d20445aa12e802)) -* myDomainResolver shouldn't check localhost ([c07984e](https://github.com/forcedotcom/sfdx-core/commit/c07984e507d98be59ca15da97621b92bd2e73497)) - - +- add internal mil environment ([27e33ae](https://github.com/forcedotcom/sfdx-core/commit/27e33ae0a99ebc2c63364a67348174ab56468290)) +- additional "internal" host ([af15447](https://github.com/forcedotcom/sfdx-core/commit/af15447166e85124326134a4f8d51b9fd05381ea)) +- internal, local, and new stm.force domains ([b93f26d](https://github.com/forcedotcom/sfdx-core/commit/b93f26d2a2e255a0ef3089cde1d20445aa12e802)) +- myDomainResolver shouldn't check localhost ([c07984e](https://github.com/forcedotcom/sfdx-core/commit/c07984e507d98be59ca15da97621b92bd2e73497)) ## [2.16.5](https://github.com/forcedotcom/sfdx-core/compare/v2.16.4...v2.16.5) (2021-01-29) - ### Bug Fixes -* send oauth error to browser ([5fd027a](https://github.com/forcedotcom/sfdx-core/commit/5fd027a2ee8c12b21621f7478763175f499a1517)) - - +- send oauth error to browser ([5fd027a](https://github.com/forcedotcom/sfdx-core/commit/5fd027a2ee8c12b21621f7478763175f499a1517)) ## [2.16.4](https://github.com/forcedotcom/sfdx-core/compare/v2.16.3...v2.16.4) (2021-01-27) - ### Bug Fixes -* remove mobile domains ([ae413db](https://github.com/forcedotcom/sfdx-core/commit/ae413db35916ecd480524d1994664729c0685f2f)) - - +- remove mobile domains ([ae413db](https://github.com/forcedotcom/sfdx-core/commit/ae413db35916ecd480524d1994664729c0685f2f)) ## [2.16.3](https://github.com/forcedotcom/sfdx-core/compare/v2.16.2...v2.16.3) (2021-01-21) - - ## [2.16.2](https://github.com/forcedotcom/sfdx-core/compare/v2.16.1...v2.16.2) (2021-01-21) - ### Bug Fixes -* better error messaging and Steve feedback ([20c8977](https://github.com/forcedotcom/sfdx-core/commit/20c897739d077a15945701843fac9c2c3457dff4)) -* better error name ([43cac98](https://github.com/forcedotcom/sfdx-core/commit/43cac980bba0bf276a28cd7d90b4bc3656cacd3b)) -* error name as a constant ([92ced7e](https://github.com/forcedotcom/sfdx-core/commit/92ced7e7de418c4dc36af6d12be930adcf801706)) -* export name for testing ([fda9ce0](https://github.com/forcedotcom/sfdx-core/commit/fda9ce0a802917cbcf496dc03450182f3ec5f79a)) -* line spacing ([89e4dc7](https://github.com/forcedotcom/sfdx-core/commit/89e4dc7d46e7b3b553329c7eb125caa75015dce1)) -* log versions as string ([d82fe3e](https://github.com/forcedotcom/sfdx-core/commit/d82fe3e8a41c177bd905ee3278332db375dc9761)) -* prevent DNS ENOTFOUND from hitting stdout ([1bc473f](https://github.com/forcedotcom/sfdx-core/commit/1bc473fc36ff70edbb1145b1c2f3ae6e0a4331ee)) - - +- better error messaging and Steve feedback ([20c8977](https://github.com/forcedotcom/sfdx-core/commit/20c897739d077a15945701843fac9c2c3457dff4)) +- better error name ([43cac98](https://github.com/forcedotcom/sfdx-core/commit/43cac980bba0bf276a28cd7d90b4bc3656cacd3b)) +- error name as a constant ([92ced7e](https://github.com/forcedotcom/sfdx-core/commit/92ced7e7de418c4dc36af6d12be930adcf801706)) +- export name for testing ([fda9ce0](https://github.com/forcedotcom/sfdx-core/commit/fda9ce0a802917cbcf496dc03450182f3ec5f79a)) +- line spacing ([89e4dc7](https://github.com/forcedotcom/sfdx-core/commit/89e4dc7d46e7b3b553329c7eb125caa75015dce1)) +- log versions as string ([d82fe3e](https://github.com/forcedotcom/sfdx-core/commit/d82fe3e8a41c177bd905ee3278332db375dc9761)) +- prevent DNS ENOTFOUND from hitting stdout ([1bc473f](https://github.com/forcedotcom/sfdx-core/commit/1bc473fc36ff70edbb1145b1c2f3ae6e0a4331ee)) ## [2.16.1](https://github.com/forcedotcom/sfdx-core/compare/v2.16.0...v2.16.1) (2021-01-20) - - # [2.16.0](https://github.com/forcedotcom/sfdx-core/compare/v2.15.5...v2.16.0) (2021-01-12) - ### Bug Fixes -* bumped npm release to v4 ([1ad0a98](https://github.com/forcedotcom/sfdx-core/commit/1ad0a984fd75e5e0cba20a907f542014b919095f)) -* dry-run fixed orb ([b3eb476](https://github.com/forcedotcom/sfdx-core/commit/b3eb4764b63869907d653d63e47f4e092df75481)) -* per peter feedback ([e0c366a](https://github.com/forcedotcom/sfdx-core/commit/e0c366ad6d7b7affb746aa8ba4869685f8563b5d)) -* remove another redundant condition ([021ff2d](https://github.com/forcedotcom/sfdx-core/commit/021ff2d08292148e50cf1ba8eccc54c92ed12328)) -* revert dry-run fix ([b415aca](https://github.com/forcedotcom/sfdx-core/commit/b415aca58e005093760cd8873e67d69ce70e1935)) -* updated yarn.lock ([7caaed5](https://github.com/forcedotcom/sfdx-core/commit/7caaed58d4f18bb6be675b690b1b9fc17c16d207)) - +- bumped npm release to v4 ([1ad0a98](https://github.com/forcedotcom/sfdx-core/commit/1ad0a984fd75e5e0cba20a907f542014b919095f)) +- dry-run fixed orb ([b3eb476](https://github.com/forcedotcom/sfdx-core/commit/b3eb4764b63869907d653d63e47f4e092df75481)) +- per peter feedback ([e0c366a](https://github.com/forcedotcom/sfdx-core/commit/e0c366ad6d7b7affb746aa8ba4869685f8563b5d)) +- remove another redundant condition ([021ff2d](https://github.com/forcedotcom/sfdx-core/commit/021ff2d08292148e50cf1ba8eccc54c92ed12328)) +- revert dry-run fix ([b415aca](https://github.com/forcedotcom/sfdx-core/commit/b415aca58e005093760cd8873e67d69ce70e1935)) +- updated yarn.lock ([7caaed5](https://github.com/forcedotcom/sfdx-core/commit/7caaed58d4f18bb6be675b690b1b9fc17c16d207)) ### Features -* singleRecordQuery ([ea72d9f](https://github.com/forcedotcom/sfdx-core/commit/ea72d9f3e31aff8dbcf1f15fd7539f75cafc4ffc)) - - +- singleRecordQuery ([ea72d9f](https://github.com/forcedotcom/sfdx-core/commit/ea72d9f3e31aff8dbcf1f15fd7539f75cafc4ffc)) ## [2.15.5](https://github.com/forcedotcom/sfdx-core/compare/v2.15.4...v2.15.5) (2021-01-07) - ### Bug Fixes -* accessToken works as username ([6f0ec24](https://github.com/forcedotcom/sfdx-core/commit/6f0ec24d0b220f4ba6f3460392c2ae6fc3b4d998)) -* get username from accessToken ([18dd97d](https://github.com/forcedotcom/sfdx-core/commit/18dd97dad14639d66a19cfde0b33497864fa3594)) -* test > match ([56815e8](https://github.com/forcedotcom/sfdx-core/commit/56815e85cbaf6fd0b7253c83af08d62ba6b1f685)) - - +- accessToken works as username ([6f0ec24](https://github.com/forcedotcom/sfdx-core/commit/6f0ec24d0b220f4ba6f3460392c2ae6fc3b4d998)) +- get username from accessToken ([18dd97d](https://github.com/forcedotcom/sfdx-core/commit/18dd97dad14639d66a19cfde0b33497864fa3594)) +- test > match ([56815e8](https://github.com/forcedotcom/sfdx-core/commit/56815e85cbaf6fd0b7253c83af08d62ba6b1f685)) ## [2.15.4](https://github.com/forcedotcom/sfdx-core/compare/v2.15.3...v2.15.4) (2020-12-09) - ### Bug Fixes -* **windows:** throw error when file is not accessible ([3c5e5f8](https://github.com/forcedotcom/sfdx-core/commit/3c5e5f83ead8fe5f8e9cfc9623a3d4296e42458f)) - - +- **windows:** throw error when file is not accessible ([3c5e5f8](https://github.com/forcedotcom/sfdx-core/commit/3c5e5f83ead8fe5f8e9cfc9623a3d4296e42458f)) ## [2.15.3](https://github.com/forcedotcom/sfdx-core/compare/v2.15.2...v2.15.3) (2020-12-02) - ### Bug Fixes -* added docs around MyDomainResolver constructor method ([68d8e52](https://github.com/forcedotcom/sfdx-core/commit/68d8e520353dae10cda4b04153ec7cc753cbc02a)) -* single package entry is defaulted to default package ([badff89](https://github.com/forcedotcom/sfdx-core/commit/badff89be92c492d990dc91ce79ff94eb88a7117)) - - +- added docs around MyDomainResolver constructor method ([68d8e52](https://github.com/forcedotcom/sfdx-core/commit/68d8e520353dae10cda4b04153ec7cc753cbc02a)) +- single package entry is defaulted to default package ([badff89](https://github.com/forcedotcom/sfdx-core/commit/badff89be92c492d990dc91ce79ff94eb88a7117)) ## [2.15.2](https://github.com/forcedotcom/sfdx-core/compare/v2.15.1...v2.15.2) (2020-11-11) - ### Bug Fixes -* config aggregator show changes to local and global config ([e3b3a55](https://github.com/forcedotcom/sfdx-core/commit/e3b3a55b7ea5e3a728ea021c8eb6a24555b63dc4)) -* localConfig typings now correctly show it might not exist ([3cb7716](https://github.com/forcedotcom/sfdx-core/commit/3cb7716fff790aac2357cd28dd28e11e81513e4f)) -* updated various logic and QOL on User and PermissionSetAssignment ([1bab28f](https://github.com/forcedotcom/sfdx-core/commit/1bab28fc799cba944aa01aa5d330e5524e267b63)) - - +- config aggregator show changes to local and global config ([e3b3a55](https://github.com/forcedotcom/sfdx-core/commit/e3b3a55b7ea5e3a728ea021c8eb6a24555b63dc4)) +- localConfig typings now correctly show it might not exist ([3cb7716](https://github.com/forcedotcom/sfdx-core/commit/3cb7716fff790aac2357cd28dd28e11e81513e4f)) +- updated various logic and QOL on User and PermissionSetAssignment ([1bab28f](https://github.com/forcedotcom/sfdx-core/commit/1bab28fc799cba944aa01aa5d330e5524e267b63)) ## [2.15.1](https://github.com/forcedotcom/sfdx-core/compare/v2.15.0...v2.15.1) (2020-11-02) - ### Bug Fixes -* move @types/mkdirp to dependencies ([e8e5cf7](https://github.com/forcedotcom/sfdx-core/commit/e8e5cf753c9d3ca56ae9f55e90b41d6168b49d0b)) - - +- move @types/mkdirp to dependencies ([e8e5cf7](https://github.com/forcedotcom/sfdx-core/commit/e8e5cf753c9d3ca56ae9f55e90b41d6168b49d0b)) # [2.15.0](https://github.com/forcedotcom/sfdx-core/compare/v2.14.0...v2.15.0) (2020-10-30) - ### Features -* allow adding property metas to allowedProperties on config ([2a264d3](https://github.com/forcedotcom/sfdx-core/commit/2a264d3ca3002c4c90c771beaa2036a06d331697)) - - +- allow adding property metas to allowedProperties on config ([2a264d3](https://github.com/forcedotcom/sfdx-core/commit/2a264d3ca3002c4c90c771beaa2036a06d331697)) # [2.14.0](https://github.com/forcedotcom/sfdx-core/compare/v2.13.0...v2.14.0) (2020-10-22) - ### Features -* add decrypt option to getFields ([ccd32e2](https://github.com/forcedotcom/sfdx-core/commit/ccd32e20aa613554153c75bab59373225cea2382)) - - +- add decrypt option to getFields ([ccd32e2](https://github.com/forcedotcom/sfdx-core/commit/ccd32e20aa613554153c75bab59373225cea2382)) # [2.13.0](https://github.com/forcedotcom/sfdx-core/compare/v2.12.3...v2.13.0) (2020-10-13) - ### Bug Fixes -* add falcon sandboxes ([558dd72](https://github.com/forcedotcom/sfdx-core/commit/558dd720d1988ad2d80fa9227b277e56c284e09a)) -* mock package json instead of fs ([8cba4d1](https://github.com/forcedotcom/sfdx-core/commit/8cba4d1e04a7c8fbe98e9cc646f663f404330394)) -* resolve sfdx project path before checking cache ([265e523](https://github.com/forcedotcom/sfdx-core/commit/265e52350a69028f6a81aafb2e9779f455a29c31)) - +- add falcon sandboxes ([558dd72](https://github.com/forcedotcom/sfdx-core/commit/558dd720d1988ad2d80fa9227b277e56c284e09a)) +- mock package json instead of fs ([8cba4d1](https://github.com/forcedotcom/sfdx-core/commit/8cba4d1e04a7c8fbe98e9cc646f663f404330394)) +- resolve sfdx project path before checking cache ([265e523](https://github.com/forcedotcom/sfdx-core/commit/265e52350a69028f6a81aafb2e9779f455a29c31)) ### Features -* add DeviceOauthService ([3e72962](https://github.com/forcedotcom/sfdx-core/commit/3e72962fd3a192b7dc6ff2ce7123ef7312185694)) -* add WebOauthServer for web based auth flow ([25cea05](https://github.com/forcedotcom/sfdx-core/commit/25cea057200fcb5861d6862f877832a1ad93fd79)) - - +- add DeviceOauthService ([3e72962](https://github.com/forcedotcom/sfdx-core/commit/3e72962fd3a192b7dc6ff2ce7123ef7312185694)) +- add WebOauthServer for web based auth flow ([25cea05](https://github.com/forcedotcom/sfdx-core/commit/25cea057200fcb5861d6862f877832a1ad93fd79)) ## [2.12.3](https://github.com/forcedotcom/sfdx-core/compare/v2.12.2...v2.12.3) (2020-10-01) - ### Bug Fixes -* lifecycle should be a singleton across core versions ([66a450b](https://github.com/forcedotcom/sfdx-core/commit/66a450b0a0030d85c61645eb8c782289e4938e4a)) -* stub should call resolver at runtime ([9002cbf](https://github.com/forcedotcom/sfdx-core/commit/9002cbf8f02da9422dd547a3ea989d174749726b)) - - +- lifecycle should be a singleton across core versions ([66a450b](https://github.com/forcedotcom/sfdx-core/commit/66a450b0a0030d85c61645eb8c782289e4938e4a)) +- stub should call resolver at runtime ([9002cbf](https://github.com/forcedotcom/sfdx-core/commit/9002cbf8f02da9422dd547a3ea989d174749726b)) ## [2.12.2](https://github.com/forcedotcom/sfdx-core/compare/v2.12.1...v2.12.2) (2020-09-28) - ### Bug Fixes -* fixed mocking error ([f5cfe52](https://github.com/forcedotcom/sfdx-core/commit/f5cfe52605e54ab8250e155e17077bc03b0cd6ec)) - - +- fixed mocking error ([f5cfe52](https://github.com/forcedotcom/sfdx-core/commit/f5cfe52605e54ab8250e155e17077bc03b0cd6ec)) ## [2.12.1](https://github.com/forcedotcom/sfdx-core/compare/v2.12.0...v2.12.1) (2020-09-18) - ### Bug Fixes -* missed line in merge ([9f73ba5](https://github.com/forcedotcom/sfdx-core/commit/9f73ba52c6cf3330b3a3f4560920e35296151bd5)) - - +- missed line in merge ([9f73ba5](https://github.com/forcedotcom/sfdx-core/commit/9f73ba52c6cf3330b3a3f4560920e35296151bd5)) # [2.12.0](https://github.com/forcedotcom/sfdx-core/compare/v2.11.0...v2.12.0) (2020-09-14) - ### Bug Fixes -* convert core from tslint -> eslint ([d4791c8](https://github.com/forcedotcom/sfdx-core/commit/d4791c8db200a18973d2164971395998693b3d03)) -* query for username during refresh token flow ([f640070](https://github.com/forcedotcom/sfdx-core/commit/f640070feef25c0589cbcad8868152a564be028c)) -* some changes regressed toolbelt ([#299](https://github.com/forcedotcom/sfdx-core/issues/299)) ([2c571a7](https://github.com/forcedotcom/sfdx-core/commit/2c571a729c4d62fc2da4427aa28ebfc769c92b97)) - +- convert core from tslint -> eslint ([d4791c8](https://github.com/forcedotcom/sfdx-core/commit/d4791c8db200a18973d2164971395998693b3d03)) +- query for username during refresh token flow ([f640070](https://github.com/forcedotcom/sfdx-core/commit/f640070feef25c0589cbcad8868152a564be028c)) +- some changes regressed toolbelt ([#299](https://github.com/forcedotcom/sfdx-core/issues/299)) ([2c571a7](https://github.com/forcedotcom/sfdx-core/commit/2c571a729c4d62fc2da4427aa28ebfc769c92b97)) ### Features -* add a lot of sync method, add package directory information to the project ([#284](https://github.com/forcedotcom/sfdx-core/issues/284)) ([b973901](https://github.com/forcedotcom/sfdx-core/commit/b973901d69855debecc553452a6664dc482cc3c5)) -* add scope options ([#289](https://github.com/forcedotcom/sfdx-core/issues/289)) ([6bc23ec](https://github.com/forcedotcom/sfdx-core/commit/6bc23ecbb0f744e8575ac21b90a59bf540a79156)) -* support plugin-auth ([a1f6eca](https://github.com/forcedotcom/sfdx-core/commit/a1f6eca37d26cb869014e1cd7eafcc3eb5b5e830)) - - +- add a lot of sync method, add package directory information to the project ([#284](https://github.com/forcedotcom/sfdx-core/issues/284)) ([b973901](https://github.com/forcedotcom/sfdx-core/commit/b973901d69855debecc553452a6664dc482cc3c5)) +- add scope options ([#289](https://github.com/forcedotcom/sfdx-core/issues/289)) ([6bc23ec](https://github.com/forcedotcom/sfdx-core/commit/6bc23ecbb0f744e8575ac21b90a59bf540a79156)) +- support plugin-auth ([a1f6eca](https://github.com/forcedotcom/sfdx-core/commit/a1f6eca37d26cb869014e1cd7eafcc3eb5b5e830)) # [2.11.0](https://github.com/forcedotcom/sfdx-core/compare/v2.10.0...v2.11.0) (2020-08-27) - ### Bug Fixes -* examples/package.json & examples/yarn.lock to reduce vulnerabilities ([d062ccc](https://github.com/forcedotcom/sfdx-core/commit/d062cccdd96d16f45dafd41425827299a26ed766)) -* wrap logfmt message with double quotes ([#280](https://github.com/forcedotcom/sfdx-core/issues/280)) ([3ef407b](https://github.com/forcedotcom/sfdx-core/commit/3ef407b667cdd65dc2bbd8259924e0b8b7ecb284)) - +- examples/package.json & examples/yarn.lock to reduce vulnerabilities ([d062ccc](https://github.com/forcedotcom/sfdx-core/commit/d062cccdd96d16f45dafd41425827299a26ed766)) +- wrap logfmt message with double quotes ([#280](https://github.com/forcedotcom/sfdx-core/issues/280)) ([3ef407b](https://github.com/forcedotcom/sfdx-core/commit/3ef407b667cdd65dc2bbd8259924e0b8b7ecb284)) ### Features -* support array of messages when using getMessage ([ac7407a](https://github.com/forcedotcom/sfdx-core/commit/ac7407ad899fba3825082ba23f53b66101b699de)) -* support logfmt style formatting ([#273](https://github.com/forcedotcom/sfdx-core/issues/273)) ([2767cbf](https://github.com/forcedotcom/sfdx-core/commit/2767cbfe4ec356915140260dfb780ec3b39ccb84)) - - +- support array of messages when using getMessage ([ac7407a](https://github.com/forcedotcom/sfdx-core/commit/ac7407ad899fba3825082ba23f53b66101b699de)) +- support logfmt style formatting ([#273](https://github.com/forcedotcom/sfdx-core/issues/273)) ([2767cbf](https://github.com/forcedotcom/sfdx-core/commit/2767cbfe4ec356915140260dfb780ec3b39ccb84)) # [2.10.0](https://github.com/forcedotcom/sfdx-core/compare/v2.9.4...v2.10.0) (2020-08-10) - ### Features -* support logfmt style formatting ([#273](https://github.com/forcedotcom/sfdx-core/issues/273)) ([#274](https://github.com/forcedotcom/sfdx-core/issues/274)) ([93b156c](https://github.com/forcedotcom/sfdx-core/commit/93b156c6e82ee8029bd4c8ec714b75c89e0f531f)) - - +- support logfmt style formatting ([#273](https://github.com/forcedotcom/sfdx-core/issues/273)) ([#274](https://github.com/forcedotcom/sfdx-core/issues/274)) ([93b156c](https://github.com/forcedotcom/sfdx-core/commit/93b156c6e82ee8029bd4c8ec714b75c89e0f531f)) ## [2.9.4](https://github.com/forcedotcom/sfdx-core/compare/v2.9.3...v2.9.4) (2020-08-07) - ### Bug Fixes -* updated messaging ([7f9ab06](https://github.com/forcedotcom/sfdx-core/commit/7f9ab06ecbde1ac082f027f35f07002efb8dc7cf)) -* fix edge case, updated messaging ([a8f9a54](https://github.com/forcedotcom/sfdx-core/commit/a8f9a547893918b2a3f6a23e9bcfa99e13b28974)) - - +- updated messaging ([7f9ab06](https://github.com/forcedotcom/sfdx-core/commit/7f9ab06ecbde1ac082f027f35f07002efb8dc7cf)) +- fix edge case, updated messaging ([a8f9a54](https://github.com/forcedotcom/sfdx-core/commit/a8f9a547893918b2a3f6a23e9bcfa99e13b28974)) ## [2.9.3](https://github.com/forcedotcom/sfdx-core/compare/v2.9.2...v2.9.3) (2020-08-06) - ### Bug Fixes -* changed to be greater than, not greater than or equal to ([7f1a12d](https://github.com/forcedotcom/sfdx-core/commit/7f1a12d7a7d7aa460de5bb32a368f52c11219a4e)) - - +- changed to be greater than, not greater than or equal to ([7f1a12d](https://github.com/forcedotcom/sfdx-core/commit/7f1a12d7a7d7aa460de5bb32a368f52c11219a4e)) ## [2.9.2](https://github.com/forcedotcom/sfdx-core/compare/v2.9.1...v2.9.2) (2020-08-06) - ### Bug Fixes -* maxQueryLimit config, return full jsforce result, fix build issue ([6c11196](https://github.com/forcedotcom/sfdx-core/commit/6c11196a48e19bca8d43fd994fa864bf3cb72cfa)) -* removed promise.reject ([d28d649](https://github.com/forcedotcom/sfdx-core/commit/d28d649f60ca1362380b4e5e408376561d6a64ed)) -* updated autoFetchQuery method ([4d018f6](https://github.com/forcedotcom/sfdx-core/commit/4d018f6d2c8e4d6b19179563f11db2ff1f9b5f3d)) - - +- maxQueryLimit config, return full jsforce result, fix build issue ([6c11196](https://github.com/forcedotcom/sfdx-core/commit/6c11196a48e19bca8d43fd994fa864bf3cb72cfa)) +- removed promise.reject ([d28d649](https://github.com/forcedotcom/sfdx-core/commit/d28d649f60ca1362380b4e5e408376561d6a64ed)) +- updated autoFetchQuery method ([4d018f6](https://github.com/forcedotcom/sfdx-core/commit/4d018f6d2c8e4d6b19179563f11db2ff1f9b5f3d)) ## [2.9.1](https://github.com/forcedotcom/sfdx-core/compare/v2.9.0...v2.9.1) (2020-08-04) - ### Bug Fixes -* remove encrypted from ISV_URL ([d2c89fe](https://github.com/forcedotcom/sfdx-core/commit/d2c89fed3602f0f9e06a3cefa605268914d69d6e)), closes [#262](https://github.com/forcedotcom/sfdx-core/issues/262) - - +- remove encrypted from ISV_URL ([d2c89fe](https://github.com/forcedotcom/sfdx-core/commit/d2c89fed3602f0f9e06a3cefa605268914d69d6e)), closes [#262](https://github.com/forcedotcom/sfdx-core/issues/262) # [2.9.0](https://github.com/forcedotcom/sfdx-core/compare/v2.8.0...v2.9.0) (2020-07-29) - ### Features -* overwriting configStore unset ([6095dd6](https://github.com/forcedotcom/sfdx-core/commit/6095dd69ab4ed5e4324e5a46d8ec5bed74bb538a)) - - +- overwriting configStore unset ([6095dd6](https://github.com/forcedotcom/sfdx-core/commit/6095dd69ab4ed5e4324e5a46d8ec5bed74bb538a)) # [2.8.0](https://github.com/forcedotcom/sfdx-core/compare/v2.7.0...v2.8.0) (2020-07-27) - ### Features -* changed data to be more flexible type ([50414f9](https://github.com/forcedotcom/sfdx-core/commit/50414f936569993b5bdf96c90bf251bbd6083b10)) - - +- changed data to be more flexible type ([50414f9](https://github.com/forcedotcom/sfdx-core/commit/50414f936569993b5bdf96c90bf251bbd6083b10)) # [2.7.0](https://github.com/forcedotcom/sfdx-core/compare/v2.6.0...v2.7.0) (2020-07-01) - ### Features -* adds areFilesEqual / actOn / getContentHash from toolbelt to core ([807dc72](https://github.com/forcedotcom/sfdx-core/commit/807dc729f414cda335fcba737580b53fc6ceddc1)) - - +- adds areFilesEqual / actOn / getContentHash from toolbelt to core ([807dc72](https://github.com/forcedotcom/sfdx-core/commit/807dc729f414cda335fcba737580b53fc6ceddc1)) # [2.6.0](https://github.com/forcedotcom/sfdx-core/compare/v2.5.1...v2.6.0) (2020-06-23) - ### Bug Fixes -* added line breaks for readability ([0f8b857](https://github.com/forcedotcom/sfdx-core/commit/0f8b8576d6401ed88b424e60e2f9302003d9ea90)) -* fixed a capitalization that caused CircleCI to fail ([db803a7](https://github.com/forcedotcom/sfdx-core/commit/db803a7fc83ead6fccf84e1791ba668cd25d013e)) -* updated comments and async for loop ([fa3b580](https://github.com/forcedotcom/sfdx-core/commit/fa3b580d82b3bb389a4d1b7edf9340080d392f50)) - +- added line breaks for readability ([0f8b857](https://github.com/forcedotcom/sfdx-core/commit/0f8b8576d6401ed88b424e60e2f9302003d9ea90)) +- fixed a capitalization that caused CircleCI to fail ([db803a7](https://github.com/forcedotcom/sfdx-core/commit/db803a7fc83ead6fccf84e1791ba668cd25d013e)) +- updated comments and async for loop ([fa3b580](https://github.com/forcedotcom/sfdx-core/commit/fa3b580d82b3bb389a4d1b7edf9340080d392f50)) ### Features -* added lifecycleEvents.ts from toolbelt: an event listener/emitter ([099478c](https://github.com/forcedotcom/sfdx-core/commit/099478cf087c024d965bba16bb6341df64ce7edb)) - - +- added lifecycleEvents.ts from toolbelt: an event listener/emitter ([099478c](https://github.com/forcedotcom/sfdx-core/commit/099478cf087c024d965bba16bb6341df64ce7edb)) ## [2.5.1](https://github.com/forcedotcom/sfdx-core/compare/v2.5.0...v2.5.1) (2020-06-11) - ### Bug Fixes -* fix child logger unit test ([93da343](https://github.com/forcedotcom/sfdx-core/commit/93da3432e83e4db0f2642b54f618521ea53bc414)) -* log uncaught exception in root logger only ([7a80662](https://github.com/forcedotcom/sfdx-core/commit/7a806622e1007d363f317f90a392328f6b6d40e7)) -* mock audience url for unit test ([963b696](https://github.com/forcedotcom/sfdx-core/commit/963b6960e971adaafd43c31581ffc07686fc8378)) - - +- fix child logger unit test ([93da343](https://github.com/forcedotcom/sfdx-core/commit/93da3432e83e4db0f2642b54f618521ea53bc414)) +- log uncaught exception in root logger only ([7a80662](https://github.com/forcedotcom/sfdx-core/commit/7a806622e1007d363f317f90a392328f6b6d40e7)) +- mock audience url for unit test ([963b696](https://github.com/forcedotcom/sfdx-core/commit/963b6960e971adaafd43c31581ffc07686fc8378)) # [2.5.0](https://github.com/forcedotcom/sfdx-core/compare/v2.4.1...v2.5.0) (2020-06-08) - ### Bug Fixes -* update mkdirp for updated dep ([e2b471b](https://github.com/forcedotcom/sfdx-core/commit/e2b471b120edd1b55bca50d71a2fe8d995ef8bbd)) - +- update mkdirp for updated dep ([e2b471b](https://github.com/forcedotcom/sfdx-core/commit/e2b471b120edd1b55bca50d71a2fe8d995ef8bbd)) ### Features -* add fs.fileExists ([0c5d0a7](https://github.com/forcedotcom/sfdx-core/commit/0c5d0a75867094f5b05d9d356f23c94c38d6213e)) - - +- add fs.fileExists ([0c5d0a7](https://github.com/forcedotcom/sfdx-core/commit/0c5d0a75867094f5b05d9d356f23c94c38d6213e)) ## [2.4.1](https://github.com/forcedotcom/sfdx-core/compare/v2.4.0...v2.4.1) (2020-05-05) - ### Bug Fixes -* don't ship with ts-sinon ([b4005fb](https://github.com/forcedotcom/sfdx-core/commit/b4005fb27b3f85be1297b9cfec0bc7e0de91979d)) -* fixed test spy ([c1f4ba4](https://github.com/forcedotcom/sfdx-core/commit/c1f4ba42ba94a03c5e3e77e793558cfea947f78e)) -* path.resolve jwt key file path ([86e6957](https://github.com/forcedotcom/sfdx-core/commit/86e695757a68dca1ea659e801ead59e57e6632b9)) - - +- don't ship with ts-sinon ([b4005fb](https://github.com/forcedotcom/sfdx-core/commit/b4005fb27b3f85be1297b9cfec0bc7e0de91979d)) +- fixed test spy ([c1f4ba4](https://github.com/forcedotcom/sfdx-core/commit/c1f4ba42ba94a03c5e3e77e793558cfea947f78e)) +- path.resolve jwt key file path ([86e6957](https://github.com/forcedotcom/sfdx-core/commit/86e695757a68dca1ea659e801ead59e57e6632b9)) # [2.4.0](https://github.com/forcedotcom/sfdx-core/compare/v2.3.1...v2.4.0) (2020-04-23) - ### Features -* create auth info with sfdx auth url ([68dbfad](https://github.com/forcedotcom/sfdx-core/commit/68dbfad817202813555b5438c498b24bfdb5aa0f)) - - +- create auth info with sfdx auth url ([68dbfad](https://github.com/forcedotcom/sfdx-core/commit/68dbfad817202813555b5438c498b24bfdb5aa0f)) ## [2.3.1](https://github.com/forcedotcom/sfdx-core/compare/v2.3.0...v2.3.1) (2020-04-13) - ### Bug Fixes -* use new @salesfore/bunyan library, run tests in node 10 & 12 ([#211](https://github.com/forcedotcom/sfdx-core/issues/211)) ([249850d](https://github.com/forcedotcom/sfdx-core/commit/249850dfbf5da4199709e9573944a4da72d0581d)) - - +- use new @salesfore/bunyan library, run tests in node 10 & 12 ([#211](https://github.com/forcedotcom/sfdx-core/issues/211)) ([249850d](https://github.com/forcedotcom/sfdx-core/commit/249850dfbf5da4199709e9573944a4da72d0581d)) # [2.3.0](https://github.com/forcedotcom/sfdx-core/compare/v2.2.0...v2.3.0) (2020-03-20) - ### Features -* allow stubbing on single tests ([37cef1b](https://github.com/forcedotcom/sfdx-core/commit/37cef1bbf8f4d1c4909f13c1fac7757f1430e40b)) - - +- allow stubbing on single tests ([37cef1b](https://github.com/forcedotcom/sfdx-core/commit/37cef1bbf8f4d1c4909f13c1fac7757f1430e40b)) # [2.2.0](https://github.com/forcedotcom/sfdx-core/compare/v2.1.6...v2.2.0) (2020-02-11) - ### Features -* create authinfo with a parent authinfo ([9b21226](https://github.com/forcedotcom/sfdx-core/commit/9b212264bafe458c95ae22fce11298c706d23393)), closes [#202](https://github.com/forcedotcom/sfdx-core/issues/202) - - +- create authinfo with a parent authinfo ([9b21226](https://github.com/forcedotcom/sfdx-core/commit/9b212264bafe458c95ae22fce11298c706d23393)), closes [#202](https://github.com/forcedotcom/sfdx-core/issues/202) ## [2.1.6](https://github.com/forcedotcom/sfdx-core/compare/v2.1.5...v2.1.6) (2020-01-13) - ### Bug Fixes -* add config var for telemetry opt out ([f79ace3](https://github.com/forcedotcom/sfdx-core/commit/f79ace34462f586feb296b94ee369e1f7922341d)) - - +- add config var for telemetry opt out ([f79ace3](https://github.com/forcedotcom/sfdx-core/commit/f79ace34462f586feb296b94ee369e1f7922341d)) ## [2.1.5](https://github.com/forcedotcom/sfdx-core/compare/v2.1.4...v2.1.5) (2019-11-15) - ### Bug Fixes -* rogue import causing compile issue ([d0b5e5c](https://github.com/forcedotcom/sfdx-core/commit/d0b5e5c13dc497ef0ba98d460e91514ea0400d7a)) - - +- rogue import causing compile issue ([d0b5e5c](https://github.com/forcedotcom/sfdx-core/commit/d0b5e5c13dc497ef0ba98d460e91514ea0400d7a)) ## [2.1.4](https://github.com/forcedotcom/sfdx-core/compare/v2.1.3...v2.1.4) (2019-11-04) - ### Bug Fixes -* contrib ([7e91751](https://github.com/forcedotcom/sfdx-core/commit/7e91751e1dcb1d3ca18d083262ae675503a7614b)) - - +- contrib ([7e91751](https://github.com/forcedotcom/sfdx-core/commit/7e91751e1dcb1d3ca18d083262ae675503a7614b)) ## [2.1.3](https://github.com/forcedotcom/sfdx-core/compare/v2.1.2...v2.1.3) (2019-10-09) - ### Bug Fixes -* make sure when stream processor throws an error we disconnect the streaming client ([6dc8de9](https://github.com/forcedotcom/sfdx-core/commit/6dc8de9cfbf7aebfadf50233d914c05cba6eda9a)) - - +- make sure when stream processor throws an error we disconnect the streaming client ([6dc8de9](https://github.com/forcedotcom/sfdx-core/commit/6dc8de9cfbf7aebfadf50233d914c05cba6eda9a)) ## [2.1.2](https://github.com/forcedotcom/sfdx-core/compare/v2.1.1...v2.1.2) (2019-08-29) - ### Bug Fixes -* add debug logger that accepts a function ([117dee4](https://github.com/forcedotcom/sfdx-core/commit/117dee474600ea8202f460afefb2b54d272516a7)) -* deleting and org auth file never worked ([a6a77c6](https://github.com/forcedotcom/sfdx-core/commit/a6a77c674b4c6111d0a213f537eebdd2f4099808)) -* review feedback ([7c1f630](https://github.com/forcedotcom/sfdx-core/commit/7c1f630cc936b6f49b261fa8304b07dbd8a0527b)) - - +- add debug logger that accepts a function ([117dee4](https://github.com/forcedotcom/sfdx-core/commit/117dee474600ea8202f460afefb2b54d272516a7)) +- deleting and org auth file never worked ([a6a77c6](https://github.com/forcedotcom/sfdx-core/commit/a6a77c674b4c6111d0a213f537eebdd2f4099808)) +- review feedback ([7c1f630](https://github.com/forcedotcom/sfdx-core/commit/7c1f630cc936b6f49b261fa8304b07dbd8a0527b)) ## [2.1.1](https://github.com/forcedotcom/sfdx-core/compare/v2.1.0...v2.1.1) (2019-07-17) - ### Bug Fixes -* yarn.lock ([70e75a2](https://github.com/forcedotcom/sfdx-core/commit/70e75a219aff454a4aefb26482e450e684fd527a)) - - +- yarn.lock ([70e75a2](https://github.com/forcedotcom/sfdx-core/commit/70e75a219aff454a4aefb26482e450e684fd527a)) # [2.1.0](https://github.com/forcedotcom/sfdx-core/compare/v2.0.1...v2.1.0) (2019-07-16) - ### Bug Fixes -* update secureBuffer cipherName ([b55fcde](https://github.com/forcedotcom/sfdx-core/commit/b55fcde0baac74e2450b0eec8121d397d5760628)) -* update secureBuffer cipherName ([8e66a0c](https://github.com/forcedotcom/sfdx-core/commit/8e66a0c86daa5debd080a6de82a24c38645bd409)) -* use empty string for client secret when client secret is undefined ([9513551](https://github.com/forcedotcom/sfdx-core/commit/951355110b2a4aa0c97e93b764f59052be2b5356)) - +- update secureBuffer cipherName ([b55fcde](https://github.com/forcedotcom/sfdx-core/commit/b55fcde0baac74e2450b0eec8121d397d5760628)) +- update secureBuffer cipherName ([8e66a0c](https://github.com/forcedotcom/sfdx-core/commit/8e66a0c86daa5debd080a6de82a24c38645bd409)) +- use empty string for client secret when client secret is undefined ([9513551](https://github.com/forcedotcom/sfdx-core/commit/951355110b2a4aa0c97e93b764f59052be2b5356)) ### Features -* add config file for sandbox ([db2026e](https://github.com/forcedotcom/sfdx-core/commit/db2026e4530971877a702938843cb9e338cca84b)) -* do not throw error on org.remove if sandbox config doesn't exist ([3912993](https://github.com/forcedotcom/sfdx-core/commit/391299358c4789cf5c2c24048617d3de8df7ee6d)) - - +- add config file for sandbox ([db2026e](https://github.com/forcedotcom/sfdx-core/commit/db2026e4530971877a702938843cb9e338cca84b)) +- do not throw error on org.remove if sandbox config doesn't exist ([3912993](https://github.com/forcedotcom/sfdx-core/commit/391299358c4789cf5c2c24048617d3de8df7ee6d)) ## [2.0.1](https://github.com/forcedotcom/sfdx-core/compare/v2.0.0...v2.0.1) (2019-07-02) - ### Bug Fixes -* update secureBuffer cipherName ([1e8037b](https://github.com/forcedotcom/sfdx-core/commit/1e8037b3ed51141d67510e68ddcefb41ea288168)) -* update secureBuffer cipherName ([874d5b6](https://github.com/forcedotcom/sfdx-core/commit/874d5b69ccec6f720cddfea90d3a6d3b1a62a454)) -* use empty string for client secret when client secret is undefined ([0d22a56](https://github.com/forcedotcom/sfdx-core/commit/0d22a56f3a3060712065cc0a5d6be14f43955f48)) - - +- update secureBuffer cipherName ([1e8037b](https://github.com/forcedotcom/sfdx-core/commit/1e8037b3ed51141d67510e68ddcefb41ea288168)) +- update secureBuffer cipherName ([874d5b6](https://github.com/forcedotcom/sfdx-core/commit/874d5b69ccec6f720cddfea90d3a6d3b1a62a454)) +- use empty string for client secret when client secret is undefined ([0d22a56](https://github.com/forcedotcom/sfdx-core/commit/0d22a56f3a3060712065cc0a5d6be14f43955f48)) # [2.0.0](https://github.com/forcedotcom/sfdx-core/compare/v1.3.3...v2.0.0) (2019-06-17) - ### Bug Fixes -* 🐛 prevent auth files from being accidentally overwritten ([06d96fc](https://github.com/forcedotcom/sfdx-core/commit/06d96fcd6fc052960b4d991e88b0da8751e48209)), closes [PR#114](https://github.com/PR/issues/114) -* add clientId to jwt fields ([8a7c040](https://github.com/forcedotcom/sfdx-core/commit/8a7c04049038b76c2b40a86619d848624ce74c74)) -* force version bump to test ci-docs on release ([ecb6a66](https://github.com/forcedotcom/sfdx-core/commit/ecb6a663c266539c5de5b15c54ca603c0c57cea2)) - +- 🐛 prevent auth files from being accidentally overwritten ([06d96fc](https://github.com/forcedotcom/sfdx-core/commit/06d96fcd6fc052960b4d991e88b0da8751e48209)), closes [PR#114](https://github.com/PR/issues/114) +- add clientId to jwt fields ([8a7c040](https://github.com/forcedotcom/sfdx-core/commit/8a7c04049038b76c2b40a86619d848624ce74c74)) +- force version bump to test ci-docs on release ([ecb6a66](https://github.com/forcedotcom/sfdx-core/commit/ecb6a663c266539c5de5b15c54ca603c0c57cea2)) ### BREAKING CHANGES -* 🧨 some commands that call getCoreConnection with auth options and a -username will now throw an error. - - +- 🧨 some commands that call getCoreConnection with auth options and a + username will now throw an error. ## [1.3.3](https://github.com/forcedotcom/sfdx-core/compare/v1.3.2...v1.3.3) (2019-04-04) - ### Bug Fixes -* allow aliases with dots ([e8b17af](https://github.com/forcedotcom/sfdx-core/commit/e8b17af8b06a8137844f834c62d18d773638be36)) -* allow packageAliases in sfdx-project.json ([8d7b1fe](https://github.com/forcedotcom/sfdx-core/commit/8d7b1fe4cb8e61beb726f19241543c3887e062af)) -* hide sensitive values from being logged ([8505f04](https://github.com/forcedotcom/sfdx-core/commit/8505f04e80a561a94be52a99ba5fa75b1131b190)) -* move generating the secretfile path to the catch block ([2b9e57d](https://github.com/forcedotcom/sfdx-core/commit/2b9e57d36722a1e5d629639527cf5c1a54b1c720)) -* potential missing key.json file on windows ([f94f127](https://github.com/forcedotcom/sfdx-core/commit/f94f12762b423a1cb23aaa7920ae910cebb29669)) -* properly invoke callbacks ([f03838c](https://github.com/forcedotcom/sfdx-core/commit/f03838ce54cf2987762f7ed9ef31734d50e68e95)) - - +- allow aliases with dots ([e8b17af](https://github.com/forcedotcom/sfdx-core/commit/e8b17af8b06a8137844f834c62d18d773638be36)) +- allow packageAliases in sfdx-project.json ([8d7b1fe](https://github.com/forcedotcom/sfdx-core/commit/8d7b1fe4cb8e61beb726f19241543c3887e062af)) +- hide sensitive values from being logged ([8505f04](https://github.com/forcedotcom/sfdx-core/commit/8505f04e80a561a94be52a99ba5fa75b1131b190)) +- move generating the secretfile path to the catch block ([2b9e57d](https://github.com/forcedotcom/sfdx-core/commit/2b9e57d36722a1e5d629639527cf5c1a54b1c720)) +- potential missing key.json file on windows ([f94f127](https://github.com/forcedotcom/sfdx-core/commit/f94f12762b423a1cb23aaa7920ae910cebb29669)) +- properly invoke callbacks ([f03838c](https://github.com/forcedotcom/sfdx-core/commit/f03838ce54cf2987762f7ed9ef31734d50e68e95)) ## [1.3.2](https://github.com/forcedotcom/sfdx-core/compare/v1.3.1...v1.3.2) (2019-03-25) - ### Bug Fixes -* revert of throwing auth error ([f6ebe12](https://github.com/forcedotcom/sfdx-core/commit/f6ebe12907e04337169ef6473ae0f8a29ace231c)) - - +- revert of throwing auth error ([f6ebe12](https://github.com/forcedotcom/sfdx-core/commit/f6ebe12907e04337169ef6473ae0f8a29ace231c)) ## [1.3.1](https://github.com/forcedotcom/sfdx-core/compare/v1.3.0...v1.3.1) (2019-03-25) - ### Bug Fixes -* prevent auth files from being inadvertently overwritten ([45195c1](https://github.com/forcedotcom/sfdx-core/commit/45195c1b8232c243746ee2582e67a811c74a9e2e)) -* update test and don't throw when auth file not found ([75af396](https://github.com/forcedotcom/sfdx-core/commit/75af396c253b80c668f1c76a29462677b6b9d950)) - - +- prevent auth files from being inadvertently overwritten ([45195c1](https://github.com/forcedotcom/sfdx-core/commit/45195c1b8232c243746ee2582e67a811c74a9e2e)) +- update test and don't throw when auth file not found ([75af396](https://github.com/forcedotcom/sfdx-core/commit/75af396c253b80c668f1c76a29462677b6b9d950)) # [1.3.0](https://github.com/forcedotcom/sfdx-core/compare/v1.2.3...v1.3.0) (2019-03-19) - ### Features -* support wrapping a string ([2445003](https://github.com/forcedotcom/sfdx-core/commit/24450037619c39c361647af4415665499dc518a2)) - - +- support wrapping a string ([2445003](https://github.com/forcedotcom/sfdx-core/commit/24450037619c39c361647af4415665499dc518a2)) ## [1.2.3](https://github.com/forcedotcom/sfdx-core/compare/v1.2.2...v1.2.3) (2019-03-18) - ### Bug Fixes -* @W-5907580@ respect code if it exist ([5263fe2](https://github.com/forcedotcom/sfdx-core/commit/5263fe2ee8045e1162492d00ac90de6cb62283e5)) -* do not let name and code get out-of-date is name is set ([3e5914e](https://github.com/forcedotcom/sfdx-core/commit/3e5914ef7e11d3309df1520abba037e649be88f2)) -* security update and patch to allow colons in filepaths for windows ([a385b40](https://github.com/forcedotcom/sfdx-core/commit/a385b403e11508006fa18abed51ba250e7aa0520)) -* use name by default for code ([c5283d3](https://github.com/forcedotcom/sfdx-core/commit/c5283d374b67c667d3deab5f7f941c8f5d789f62)) - - +- @W-5907580@ respect code if it exist ([5263fe2](https://github.com/forcedotcom/sfdx-core/commit/5263fe2ee8045e1162492d00ac90de6cb62283e5)) +- do not let name and code get out-of-date is name is set ([3e5914e](https://github.com/forcedotcom/sfdx-core/commit/3e5914ef7e11d3309df1520abba037e649be88f2)) +- security update and patch to allow colons in filepaths for windows ([a385b40](https://github.com/forcedotcom/sfdx-core/commit/a385b403e11508006fa18abed51ba250e7aa0520)) +- use name by default for code ([c5283d3](https://github.com/forcedotcom/sfdx-core/commit/c5283d374b67c667d3deab5f7f941c8f5d789f62)) ## [1.2.2](https://github.com/forcedotcom/sfdx-core/compare/v1.2.1...v1.2.2) (2019-02-11) - ### Bug Fixes -* use default options off the constructor ([368a5f1](https://github.com/forcedotcom/sfdx-core/commit/368a5f160206559529eafae2d71d47aad6186549)) - - +- use default options off the constructor ([368a5f1](https://github.com/forcedotcom/sfdx-core/commit/368a5f160206559529eafae2d71d47aad6186549)) ## [1.2.1](https://github.com/forcedotcom/sfdx-core/compare/v1.2.0...v1.2.1) (2019-01-31) - ### Bug Fixes -* update docs ([789816e](https://github.com/forcedotcom/sfdx-core/commit/789816e7b734864471c943ca503ea6c1bd9d668f)) - - +- update docs ([789816e](https://github.com/forcedotcom/sfdx-core/commit/789816e7b734864471c943ca503ea6c1bd9d668f)) # [1.2.0](https://github.com/forcedotcom/sfdx-core/compare/v1.1.2...v1.2.0) (2019-01-30) - ### Bug Fixes -* do not query server if cached ([d7ccf99](https://github.com/forcedotcom/sfdx-core/commit/d7ccf99aaf84c432da96046d63bd387945a10c21)) -* update to allow stored connected app info ([66ea057](https://github.com/forcedotcom/sfdx-core/commit/66ea05727ca4f6e4a979ee3045fdd96a9c9f8a1e)) - +- do not query server if cached ([d7ccf99](https://github.com/forcedotcom/sfdx-core/commit/d7ccf99aaf84c432da96046d63bd387945a10c21)) +- update to allow stored connected app info ([66ea057](https://github.com/forcedotcom/sfdx-core/commit/66ea05727ca4f6e4a979ee3045fdd96a9c9f8a1e)) ### Features -* determine if a org is a dev hub ([586d7ba](https://github.com/forcedotcom/sfdx-core/commit/586d7bac67636b40c040a7944e8ccaaae9f85621)) - - +- determine if a org is a dev hub ([586d7ba](https://github.com/forcedotcom/sfdx-core/commit/586d7bac67636b40c040a7944e8ccaaae9f85621)) ## [1.1.2](https://github.com/forcedotcom/sfdx-core/compare/v1.1.1...v1.1.2) (2018-12-21) - ### Bug Fixes -* update contrib doc to trigger build ([28c6945](https://github.com/forcedotcom/sfdx-core/commit/28c694506f813f2e38f8cb3789d618833e042f6e)) - - +- update contrib doc to trigger build ([28c6945](https://github.com/forcedotcom/sfdx-core/commit/28c694506f813f2e38f8cb3789d618833e042f6e)) ## [1.1.1](https://github.com/forcedotcom/sfdx-core/compare/v1.1.0...v1.1.1) (2018-12-19) - ### Bug Fixes -* bump kit, ts-types, and ts-sinon versions ([1f088b4](https://github.com/forcedotcom/sfdx-core/commit/1f088b4332ee7e00d1481fcf152a9177b5c20f29)) -* downgrade jsforce to match sfdx toolbelt ([5fba254](https://github.com/forcedotcom/sfdx-core/commit/5fba254c75f0412b2407a5a14f6d66e592159169)) -* fix jsforce types reference ([407e3df](https://github.com/forcedotcom/sfdx-core/commit/407e3dfff4356eba17da3f7a1ffee1f39b0e7776)) -* migrate from /docs to gh-pages branch ([7d36139](https://github.com/forcedotcom/sfdx-core/commit/7d36139542ef731d460f1dcf39495e951c4b794b)) - - +- bump kit, ts-types, and ts-sinon versions ([1f088b4](https://github.com/forcedotcom/sfdx-core/commit/1f088b4332ee7e00d1481fcf152a9177b5c20f29)) +- downgrade jsforce to match sfdx toolbelt ([5fba254](https://github.com/forcedotcom/sfdx-core/commit/5fba254c75f0412b2407a5a14f6d66e592159169)) +- fix jsforce types reference ([407e3df](https://github.com/forcedotcom/sfdx-core/commit/407e3dfff4356eba17da3f7a1ffee1f39b0e7776)) +- migrate from /docs to gh-pages branch ([7d36139](https://github.com/forcedotcom/sfdx-core/commit/7d36139542ef731d460f1dcf39495e951c4b794b)) # [1.1.0](https://github.com/forcedotcom/sfdx-core/compare/v1.0.3...v1.1.0) (2018-12-14) - ### Bug Fixes -* add retreive to keychain config ([#29](https://github.com/forcedotcom/sfdx-core/issues/29)) ([219b1ce](https://github.com/forcedotcom/sfdx-core/commit/219b1cec58fb3233ae9b55ceeef66c4a596b978e)) -* conflict merge ([8686cf8](https://github.com/forcedotcom/sfdx-core/commit/8686cf84570058dfa4282b37d2b0d48e16c07ef4)) -* doc update ([7ad690e](https://github.com/forcedotcom/sfdx-core/commit/7ad690e38e39a8d57f70ee58e7d86f3550cef004)) -* doc updates ([3c34908](https://github.com/forcedotcom/sfdx-core/commit/3c34908f0932fe0ccb48ac90e0332be1cf9832e7)) -* docs updates ([cecd438](https://github.com/forcedotcom/sfdx-core/commit/cecd438df2bf499e7e76c9598d4a84ca6c15138d)) -* docs updates ([2a01945](https://github.com/forcedotcom/sfdx-core/commit/2a019450c54b15eb57c00e3a9df531f799801a7f)) -* ensure AuthInfoConfig can throw when config file not found ([f11b84a](https://github.com/forcedotcom/sfdx-core/commit/f11b84a498e73dbd72fca5c48439cf4785962cda)) -* lower code coverage ([73eabad](https://github.com/forcedotcom/sfdx-core/commit/73eabad4e0c04197be7c927bf1f4ff2aa3e49ea1)) -* make user use async creatable ([895da90](https://github.com/forcedotcom/sfdx-core/commit/895da903f57f0babff7ca93eabffe9bd66117fab)) -* move call to super.init after dependency ([f52341e](https://github.com/forcedotcom/sfdx-core/commit/f52341e9018422d511abb34aab5b889606f2ba4e)) -* move throwOnNotFound option to ConfigFile ([924352a](https://github.com/forcedotcom/sfdx-core/commit/924352af134e16a2dc242d48eb00c99f6ca6898a)) -* move ts-sinon to reg dep ([47a6e6a](https://github.com/forcedotcom/sfdx-core/commit/47a6e6a3c069d4539e65226823860890936e874c)) -* remove reference to yarnpkg ([5ba0887](https://github.com/forcedotcom/sfdx-core/commit/5ba08872b6a52830e8aee38d6a761374eb3ad7d6)) -* resolve alias before creating AuthInfo ([4234197](https://github.com/forcedotcom/sfdx-core/commit/4234197065cd936d86f756e5256ea76d4c3dfb4a)) -* typedoc updates ([2552fec](https://github.com/forcedotcom/sfdx-core/commit/2552feca49fdc12689adf7471c6a4f95e281425d)) -* update docs for config ([3fcdc52](https://github.com/forcedotcom/sfdx-core/commit/3fcdc52cb41d644b1eec043bed3f3eee9f68c42b)) -* update package.json ([69ee399](https://github.com/forcedotcom/sfdx-core/commit/69ee39925d72f1e7181eda6227104ea168a823e3)) -* update package.json ([650021d](https://github.com/forcedotcom/sfdx-core/commit/650021d99ef005fab6b64c824a652d95638f44b2)) -* update package.json ([83bce69](https://github.com/forcedotcom/sfdx-core/commit/83bce694ddd60be629916c9808f63deaaeaa3460)) -* update package.json ([9cc515a](https://github.com/forcedotcom/sfdx-core/commit/9cc515a7d8b203eccf1c91d9830a389b6446c739)) -* update package.json version ([871f211](https://github.com/forcedotcom/sfdx-core/commit/871f211253ce8d25046f1392610cdb054d332ccd)) -* update to latest docs ([e250e2f](https://github.com/forcedotcom/sfdx-core/commit/e250e2f440b6f4751278a76f8c3fcc38ad651967)) - - -### Features - -* consistent enum naming ([#26](https://github.com/forcedotcom/sfdx-core/issues/26)) ([ab3bc7e](https://github.com/forcedotcom/sfdx-core/commit/ab3bc7e3c37da4bf86f23b6824c8715ba780a0a6)) -* replace time with kit's duration ([#24](https://github.com/forcedotcom/sfdx-core/issues/24)) ([a3b519f](https://github.com/forcedotcom/sfdx-core/commit/a3b519f83b190d61475353525483b14c54d09020)) -* update jsforce typings ([374b8fc](https://github.com/forcedotcom/sfdx-core/commit/374b8fcf7d5f24465843f3d98e448a0663a8a89f)) - - +- add retreive to keychain config ([#29](https://github.com/forcedotcom/sfdx-core/issues/29)) ([219b1ce](https://github.com/forcedotcom/sfdx-core/commit/219b1cec58fb3233ae9b55ceeef66c4a596b978e)) +- conflict merge ([8686cf8](https://github.com/forcedotcom/sfdx-core/commit/8686cf84570058dfa4282b37d2b0d48e16c07ef4)) +- doc update ([7ad690e](https://github.com/forcedotcom/sfdx-core/commit/7ad690e38e39a8d57f70ee58e7d86f3550cef004)) +- doc updates ([3c34908](https://github.com/forcedotcom/sfdx-core/commit/3c34908f0932fe0ccb48ac90e0332be1cf9832e7)) +- docs updates ([cecd438](https://github.com/forcedotcom/sfdx-core/commit/cecd438df2bf499e7e76c9598d4a84ca6c15138d)) +- docs updates ([2a01945](https://github.com/forcedotcom/sfdx-core/commit/2a019450c54b15eb57c00e3a9df531f799801a7f)) +- ensure AuthInfoConfig can throw when config file not found ([f11b84a](https://github.com/forcedotcom/sfdx-core/commit/f11b84a498e73dbd72fca5c48439cf4785962cda)) +- lower code coverage ([73eabad](https://github.com/forcedotcom/sfdx-core/commit/73eabad4e0c04197be7c927bf1f4ff2aa3e49ea1)) +- make user use async creatable ([895da90](https://github.com/forcedotcom/sfdx-core/commit/895da903f57f0babff7ca93eabffe9bd66117fab)) +- move call to super.init after dependency ([f52341e](https://github.com/forcedotcom/sfdx-core/commit/f52341e9018422d511abb34aab5b889606f2ba4e)) +- move throwOnNotFound option to ConfigFile ([924352a](https://github.com/forcedotcom/sfdx-core/commit/924352af134e16a2dc242d48eb00c99f6ca6898a)) +- move ts-sinon to reg dep ([47a6e6a](https://github.com/forcedotcom/sfdx-core/commit/47a6e6a3c069d4539e65226823860890936e874c)) +- remove reference to yarnpkg ([5ba0887](https://github.com/forcedotcom/sfdx-core/commit/5ba08872b6a52830e8aee38d6a761374eb3ad7d6)) +- resolve alias before creating AuthInfo ([4234197](https://github.com/forcedotcom/sfdx-core/commit/4234197065cd936d86f756e5256ea76d4c3dfb4a)) +- typedoc updates ([2552fec](https://github.com/forcedotcom/sfdx-core/commit/2552feca49fdc12689adf7471c6a4f95e281425d)) +- update docs for config ([3fcdc52](https://github.com/forcedotcom/sfdx-core/commit/3fcdc52cb41d644b1eec043bed3f3eee9f68c42b)) +- update package.json ([69ee399](https://github.com/forcedotcom/sfdx-core/commit/69ee39925d72f1e7181eda6227104ea168a823e3)) +- update package.json ([650021d](https://github.com/forcedotcom/sfdx-core/commit/650021d99ef005fab6b64c824a652d95638f44b2)) +- update package.json ([83bce69](https://github.com/forcedotcom/sfdx-core/commit/83bce694ddd60be629916c9808f63deaaeaa3460)) +- update package.json ([9cc515a](https://github.com/forcedotcom/sfdx-core/commit/9cc515a7d8b203eccf1c91d9830a389b6446c739)) +- update package.json version ([871f211](https://github.com/forcedotcom/sfdx-core/commit/871f211253ce8d25046f1392610cdb054d332ccd)) +- update to latest docs ([e250e2f](https://github.com/forcedotcom/sfdx-core/commit/e250e2f440b6f4751278a76f8c3fcc38ad651967)) + +### Features + +- consistent enum naming ([#26](https://github.com/forcedotcom/sfdx-core/issues/26)) ([ab3bc7e](https://github.com/forcedotcom/sfdx-core/commit/ab3bc7e3c37da4bf86f23b6824c8715ba780a0a6)) +- replace time with kit's duration ([#24](https://github.com/forcedotcom/sfdx-core/issues/24)) ([a3b519f](https://github.com/forcedotcom/sfdx-core/commit/a3b519f83b190d61475353525483b14c54d09020)) +- update jsforce typings ([374b8fc](https://github.com/forcedotcom/sfdx-core/commit/374b8fcf7d5f24465843f3d98e448a0663a8a89f)) ## [0.24.3](https://github.com/forcedotcom/sfdx-core/compare/v0.25.0...v0.24.3) (2018-11-15) - ### Bug Fixes -* remove npm install from core ([832eaeb](https://github.com/forcedotcom/sfdx-core/commit/832eaeb73855dc65eb0acf91d13869e042d53166)) - - +- remove npm install from core ([832eaeb](https://github.com/forcedotcom/sfdx-core/commit/832eaeb73855dc65eb0acf91d13869e042d53166)) # [0.25.0](https://github.com/forcedotcom/sfdx-core/compare/v0.24.2...v0.25.0) (2018-11-15) - ### Features -* build ([c03e0bc](https://github.com/forcedotcom/sfdx-core/commit/c03e0bc866e255ed8a1bb37dd28557cd2e5487d1)) - - +- build ([c03e0bc](https://github.com/forcedotcom/sfdx-core/commit/c03e0bc866e255ed8a1bb37dd28557cd2e5487d1)) ## [0.24.2](https://github.com/forcedotcom/sfdx-core/compare/v0.24.1...v0.24.2) (2018-11-15) - ### Features -* update build ([4e6426e](https://github.com/forcedotcom/sfdx-core/commit/4e6426e74dd221503b0b8b63629149397568a8fd)) - - +- update build ([4e6426e](https://github.com/forcedotcom/sfdx-core/commit/4e6426e74dd221503b0b8b63629149397568a8fd)) ## [0.24.1](https://github.com/forcedotcom/sfdx-core/compare/v0.21.4...v0.24.1) (2018-11-15) - ### Bug Fixes -* adopt ts-types fix of AnyJson values ([#20](https://github.com/forcedotcom/sfdx-core/issues/20)) ([c7d1433](https://github.com/forcedotcom/sfdx-core/commit/c7d14336020995c7f195b813a2d0822b5cb2f444)) -* support sfdx-faye ([#21](https://github.com/forcedotcom/sfdx-core/issues/21)) ([115683c](https://github.com/forcedotcom/sfdx-core/commit/115683ca1457929b0b94520c0e1b3b372c02bf75)) - +- adopt ts-types fix of AnyJson values ([#20](https://github.com/forcedotcom/sfdx-core/issues/20)) ([c7d1433](https://github.com/forcedotcom/sfdx-core/commit/c7d14336020995c7f195b813a2d0822b5cb2f444)) +- support sfdx-faye ([#21](https://github.com/forcedotcom/sfdx-core/issues/21)) ([115683c](https://github.com/forcedotcom/sfdx-core/commit/115683ca1457929b0b94520c0e1b3b372c02bf75)) ### Features -* new build ([8cf0c39](https://github.com/forcedotcom/sfdx-core/commit/8cf0c39a486f00229ff9a7878e98415f4d8e85ca)) - +- new build ([8cf0c39](https://github.com/forcedotcom/sfdx-core/commit/8cf0c39a486f00229ff9a7878e98415f4d8e85ca)) ### Reverts -* Revert "Revert "build: try oclif semantic/release"" ([a514b9a](https://github.com/forcedotcom/sfdx-core/commit/a514b9ab7e66d2aaaf767d01d02470b35bc5d60b)) -* Revert "build: try oclif semantic/release" ([840da22](https://github.com/forcedotcom/sfdx-core/commit/840da22c64a57cf2ca8f729c65c4a9aab34127cd)) - - +- Revert "Revert "build: try oclif semantic/release"" ([a514b9a](https://github.com/forcedotcom/sfdx-core/commit/a514b9ab7e66d2aaaf767d01d02470b35bc5d60b)) +- Revert "build: try oclif semantic/release" ([840da22](https://github.com/forcedotcom/sfdx-core/commit/840da22c64a57cf2ca8f729c65c4a9aab34127cd)) ## [0.21.4](https://github.com/forcedotcom/sfdx-core/compare/v0.21.3...v0.21.4) (2018-11-08) - ### Bug Fixes -* make public ([ac497a3](https://github.com/forcedotcom/sfdx-core/commit/ac497a3a50a7f7dea93d4182d29c2b4508888642)) - - +- make public ([ac497a3](https://github.com/forcedotcom/sfdx-core/commit/ac497a3a50a7f7dea93d4182d29c2b4508888642)) ## [0.21.3](https://github.com/forcedotcom/sfdx-core/compare/v0.21.2...v0.21.3) (2018-11-08) - ### Bug Fixes -* actual ts-types and kit versions ([ca03b33](https://github.com/forcedotcom/sfdx-core/commit/ca03b3321702362a061b8d46b59c30fec8818bd1)) -* typing correction in kit ([2191040](https://github.com/forcedotcom/sfdx-core/commit/2191040a11b749efa6d732accc6988fa691b52f7)) -* update has impl ([429c4e9](https://github.com/forcedotcom/sfdx-core/commit/429c4e934bd3f6942b5791259d31e48f6bb7ead2)) -* updates for ts-types and kit api changes ([c7c599d](https://github.com/forcedotcom/sfdx-core/commit/c7c599d8af5aa2d1dfee55b58778ddfd1dc0174f)) -* use latest versions of ts-types and kit ([0d73ad6](https://github.com/forcedotcom/sfdx-core/commit/0d73ad62247f9051e640f6d5cd06b61a63330029)) - - +- actual ts-types and kit versions ([ca03b33](https://github.com/forcedotcom/sfdx-core/commit/ca03b3321702362a061b8d46b59c30fec8818bd1)) +- typing correction in kit ([2191040](https://github.com/forcedotcom/sfdx-core/commit/2191040a11b749efa6d732accc6988fa691b52f7)) +- update has impl ([429c4e9](https://github.com/forcedotcom/sfdx-core/commit/429c4e934bd3f6942b5791259d31e48f6bb7ead2)) +- updates for ts-types and kit api changes ([c7c599d](https://github.com/forcedotcom/sfdx-core/commit/c7c599d8af5aa2d1dfee55b58778ddfd1dc0174f)) +- use latest versions of ts-types and kit ([0d73ad6](https://github.com/forcedotcom/sfdx-core/commit/0d73ad62247f9051e640f6d5cd06b61a63330029)) ## [0.21.2](https://github.com/forcedotcom/sfdx-core/compare/v0.23.1...v0.21.2) (2018-10-24) - ### Bug Fixes -* disable semantic release until approved ([e443d17](https://github.com/forcedotcom/sfdx-core/commit/e443d17a04451b81ed83d0bdbb2ed3cae956c803)) -* fix build config ([b286261](https://github.com/forcedotcom/sfdx-core/commit/b28626110273ab387d1c570b0500d1a7232533e6)) - - +- disable semantic release until approved ([e443d17](https://github.com/forcedotcom/sfdx-core/commit/e443d17a04451b81ed83d0bdbb2ed3cae956c803)) +- fix build config ([b286261](https://github.com/forcedotcom/sfdx-core/commit/b28626110273ab387d1c570b0500d1a7232533e6)) ## [0.23.1](https://github.com/forcedotcom/sfdx-core/compare/v0.22.0...v0.23.1) (2018-10-05) - - # [0.22.0](https://github.com/forcedotcom/sfdx-core/compare/v0.21.1...v0.22.0) (2018-09-25) - - ## [0.21.1](https://github.com/forcedotcom/sfdx-core/compare/v0.21.0...v0.21.1) (2018-09-18) - - # [0.21.0](https://github.com/forcedotcom/sfdx-core/compare/v0.20.0...v0.21.0) (2018-09-14) - - # [0.20.0](https://github.com/forcedotcom/sfdx-core/compare/v0.19.0...v0.20.0) (2018-08-30) - - # [0.19.0](https://github.com/forcedotcom/sfdx-core/compare/v0.18.2...v0.19.0) (2018-08-21) - - ## [0.18.2](https://github.com/forcedotcom/sfdx-core/compare/v0.18.1...v0.18.2) (2018-07-16) - - ## [0.18.1](https://github.com/forcedotcom/sfdx-core/compare/v0.17.6...v0.18.1) (2018-07-12) - - ## [0.17.6](https://github.com/forcedotcom/sfdx-core/compare/v0.17.5...v0.17.6) (2018-07-11) - - ## [0.17.5](https://github.com/forcedotcom/sfdx-core/compare/v0.17.4...v0.17.5) (2018-07-06) - - ## [0.17.4](https://github.com/forcedotcom/sfdx-core/compare/v0.17.3...v0.17.4) (2018-06-29) - - ## [0.17.3](https://github.com/forcedotcom/sfdx-core/compare/v0.17.2...v0.17.3) (2018-06-29) - - ## [0.17.2](https://github.com/forcedotcom/sfdx-core/compare/v0.17.1...v0.17.2) (2018-06-16) - - ## [0.17.1](https://github.com/forcedotcom/sfdx-core/compare/v0.16.17...v0.17.1) (2018-06-16) - - ## [0.16.17](https://github.com/forcedotcom/sfdx-core/compare/v0.16.16...v0.16.17) (2018-06-13) - - ## [0.16.16](https://github.com/forcedotcom/sfdx-core/compare/v0.16.15...v0.16.16) (2018-06-04) - - ## [0.16.15](https://github.com/forcedotcom/sfdx-core/compare/v0.16.14...v0.16.15) (2018-05-29) - - ## [0.16.14](https://github.com/forcedotcom/sfdx-core/compare/v0.16.13...v0.16.14) (2018-05-22) - - ## [0.16.13](https://github.com/forcedotcom/sfdx-core/compare/v0.16.12...v0.16.13) (2018-04-20) - - ## [0.16.12](https://github.com/forcedotcom/sfdx-core/compare/v0.16.11...v0.16.12) (2018-04-06) - - ## [0.16.11](https://github.com/forcedotcom/sfdx-core/compare/v0.16.10...v0.16.11) (2018-04-06) - - ## [0.16.10](https://github.com/forcedotcom/sfdx-core/compare/v0.16.9...v0.16.10) (2018-03-22) - - ## [0.16.9](https://github.com/forcedotcom/sfdx-core/compare/v0.16.8...v0.16.9) (2018-03-21) - - ## [0.16.8](https://github.com/forcedotcom/sfdx-core/compare/v0.16.7...v0.16.8) (2018-03-20) - - ## [0.16.7](https://github.com/forcedotcom/sfdx-core/compare/v0.16.6...v0.16.7) (2018-03-20) - - ## [0.16.6](https://github.com/forcedotcom/sfdx-core/compare/v0.16.5...v0.16.6) (2018-03-16) - - ## [0.16.5](https://github.com/forcedotcom/sfdx-core/compare/v0.16.4...v0.16.5) (2018-03-15) - - ## [0.16.4](https://github.com/forcedotcom/sfdx-core/compare/v0.16.3...v0.16.4) (2018-03-14) - - ## [0.16.3](https://github.com/forcedotcom/sfdx-core/compare/v0.16.2...v0.16.3) (2018-03-14) - - ## [0.16.2](https://github.com/forcedotcom/sfdx-core/compare/v0.16.1...v0.16.2) (2018-03-10) - - ## [0.16.1](https://github.com/forcedotcom/sfdx-core/compare/v0.16.0...v0.16.1) (2018-03-06) - - # [0.16.0](https://github.com/forcedotcom/sfdx-core/compare/v0.15.0...v0.16.0) (2018-03-06) - - # [0.15.0](https://github.com/forcedotcom/sfdx-core/compare/v0.14.0...v0.15.0) (2018-03-06) - - # [0.14.0](https://github.com/forcedotcom/sfdx-core/compare/v0.13.0...v0.14.0) (2018-03-06) - - # [0.13.0](https://github.com/forcedotcom/sfdx-core/compare/v0.12.0...v0.13.0) (2018-03-06) - - # [0.12.0](https://github.com/forcedotcom/sfdx-core/compare/v0.11.0...v0.12.0) (2018-03-05) - - # [0.11.0](https://github.com/forcedotcom/sfdx-core/compare/v0.10.0...v0.11.0) (2018-03-05) - - # [0.10.0](https://github.com/forcedotcom/sfdx-core/compare/v0.9.0...v0.10.0) (2018-03-01) - - # [0.9.0](https://github.com/forcedotcom/sfdx-core/compare/v0.8.0...v0.9.0) (2018-02-27) - - # [0.8.0](https://github.com/forcedotcom/sfdx-core/compare/v0.7.0...v0.8.0) (2018-02-27) - - ## [0.5.3](https://github.com/forcedotcom/sfdx-core/compare/v0.5.2...v0.5.3) (2018-02-26) - - ## [0.5.2](https://github.com/forcedotcom/sfdx-core/compare/v0.6.0...v0.5.2) (2018-02-26) - - ## [0.5.1](https://github.com/forcedotcom/sfdx-core/compare/v0.5.0...v0.5.1) (2018-02-26) - - # [0.7.0](https://github.com/forcedotcom/sfdx-core/compare/v0.5.3...v0.7.0) (2018-02-27) - - # [0.6.0](https://github.com/forcedotcom/sfdx-core/compare/v0.5.1...v0.6.0) (2018-02-26) - - ## [0.5.3](https://github.com/forcedotcom/sfdx-core/compare/v0.5.2...v0.5.3) (2018-02-26) - - ## [0.5.2](https://github.com/forcedotcom/sfdx-core/compare/v0.6.0...v0.5.2) (2018-02-26) - - ## [0.5.1](https://github.com/forcedotcom/sfdx-core/compare/v0.5.0...v0.5.1) (2018-02-26) - - # [0.6.0](https://github.com/forcedotcom/sfdx-core/compare/v0.5.1...v0.6.0) (2018-02-26) - - ## [0.5.1](https://github.com/forcedotcom/sfdx-core/compare/v0.5.0...v0.5.1) (2018-02-26) - - # [0.5.0](https://github.com/forcedotcom/sfdx-core/compare/v0.4.0...v0.5.0) (2018-02-23) - - # [0.4.0](https://github.com/forcedotcom/sfdx-core/compare/v0.3.0...v0.4.0) (2018-02-22) - - # [0.3.0](https://github.com/forcedotcom/sfdx-core/compare/v0.2.0...v0.3.0) (2018-02-22) - - # [0.2.0](https://github.com/forcedotcom/sfdx-core/compare/v0.1.0...v0.2.0) (2018-02-20) - - # [0.1.0](https://github.com/forcedotcom/sfdx-core/compare/v0.0.4...v0.1.0) (2018-02-13) - - ## [0.0.4](https://github.com/forcedotcom/sfdx-core/compare/v0.0.3...v0.0.4) (2017-12-05) - - ## [0.0.3](https://github.com/forcedotcom/sfdx-core/compare/v0.0.2...v0.0.3) (2017-12-05) - - ## [0.0.2](https://github.com/forcedotcom/sfdx-core/compare/v0.0.1...v0.0.2) (2017-12-05) - - ## 0.0.1 (2017-12-05) - - - diff --git a/CODEOWNERS b/CODEOWNERS index 522fa4a0f7..4d71d6d782 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1,2 +1,5 @@ -# Comment line immediately above ownership line is reserved for related gus information. Please be careful while editing. -#ECCN:Open Source +# Techical writers will be added as reviewers on markdown changes. +*.md @forcedotcom/cli-docs + +# Comment line immediately above ownership line is reserved for related other information. Please be careful while editing. +#ECCN:Open Source 5D002 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 326c116636..41f825a591 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,7 +1,7 @@ ## Contributing 1. The [DEVELOPING](DEVELOPING.md) doc has details on how to set up your environment. -1. Familiarize yourself with the codebase by reading the [docs](docs), which you can generate locally by running `yarn docs`. +1. Familiarize yourself with the codebase by reading the [docs](https://forcedotcom.github.io/sfdx-core), which you can generate locally by running `yarn docs`. 1. Create a new issue before starting your project so that we can keep track of what you are trying to add/fix. That way, we can also offer suggestions or let you know if there is already an effort in progress. diff --git a/DEVELOPING.md b/DEVELOPING.md index a50e16227a..9add3998b8 100644 --- a/DEVELOPING.md +++ b/DEVELOPING.md @@ -37,7 +37,7 @@ This tests the typescript using ts-node. ### `yarn docs` -This generates documentation into [docs](docs). +This generates documentation into [docs](https://forcedotcom.github.io/sfdx-core/). ### `yarn lint` diff --git a/EXPORTED.md b/EXPORTED.md deleted file mode 100644 index 67391c4bfa..0000000000 --- a/EXPORTED.md +++ /dev/null @@ -1,50 +0,0 @@ -# Salesforce DX Core Library - -This library provides client-side management of Salesforce DX projects, org authentication, connections to Salesforce APIs, and various other utilities. These libraries are used by and follow patterns of the [Salesforce CLI](https://developer.salesforce.com/tools/sfdxcli). - -Requires [Node.js](https://nodejs.org) v8.4 or greater and [TypeScript](http://www.typescriptlang.org/) target `es2017`. - -## [AuthInfo]{@link AuthInfo} - -Create, read, update, and delete authentication information for an org. - -## [Connection]{@link Connection} - -Create an instance of an API connection to a Salesforce org. - -## {@link Org} - -Create a representation of an org based on an already authenticated alias, username, or default. The representation has a [connection]{@link Connection} and other useful methods for interacting with an org and its users. - -## [StreamingClient]{@link StreamingClient} - -Create an instance of a streaming API connection to a Salesforce org for a particular streaming channel. - -## {@link ConfigFile} - -Represents a config file at either a local or global path. The config file extends the {@link ConfigStore} which provides map-like functions to interact with config values. The following classes are config files. - -- {@link Aliases} -- {@link OrgUsersConfig} -- {@link Config} -- {@link SfProjectJson} - -## {@link ConfigAggregator} - -Aggregates local, global, and environment config values using {@link Config} and environment variables. - -## {@link SfProject} - -Represents a Salesforce DX project, defined by the file `sfdx-project.json`. - -## {@link Logger} - -All logging in `sfdx-core` is accomplished through this logging class. Anyone can also use the logger to log their own log lines to the `sfdx.log` file or to any other log file or stream by utilizing the log level flags and envars set by the CLI or framework. - -## [SfError]{@link SfError} - -An error class that is always thrown from `sfdx-core`, providing useful formatting and contextual data. - -## [Messages]{@link Messages} - -Manage user messages that are accessible by all plugins and consumers of `sfdx-core`. diff --git a/LICENSE.txt b/LICENSE.txt index f2cee7bb61..6cfd873423 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,4 +1,4 @@ -Copyright (c) 2023, Salesforce.com, Inc. +Copyright (c) 2024, Salesforce.com, Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: diff --git a/MIGRATING_V2-V3.md b/MIGRATING_V2-V3.md index 36636a7901..0ce6810267 100644 --- a/MIGRATING_V2-V3.md +++ b/MIGRATING_V2-V3.md @@ -84,7 +84,7 @@ await stateAggregator.aliases.write(); | `SfdxPropertyKeys.MAX_QUERY_LIMIT` | `OrgConfigProperties.ORG_MAX_QUERY_LIMIT` | | `SfdxPropertyKeys.REST_DEPLOY` | REMOVED | -- `ConifgAggregator` will not work with any of the deprecated keys. **We strongly suggest that you move to the new keys as part of the migration process.** +- `ConfigAggregator` will not work with any of the deprecated keys. **We strongly suggest that you move to the new keys as part of the migration process.** - If you absolutely cannot migrate to the new config keys, then you can use `SfdxConfigAggregator` in the meantime. ### Why diff --git a/MIGRATING_V3-V4.md b/MIGRATING_V3-V4.md new file mode 100644 index 0000000000..2980615bb8 --- /dev/null +++ b/MIGRATING_V3-V4.md @@ -0,0 +1,41 @@ +# Migrating `@salesforce/core` from v3 to v4 + +v4 remove node14 support and removes many previously deprecated features + +## Messages + +Use `Messages.loadMessages` instead of `Messages.load`. You don't have to specify the messages individually, and the [eslint rules](https://github.com/salesforcecli/eslint-plugin-sf-plugin) check your messages more effectively. + +`Messages.createErrorButPreserveName` is removed. + +## SfdxConfigAggregator + +Recent versions of v3 has `SfdxConfigAggregator` exactly matching `ConfigAggregator`. Use `ConfigAggregator`. + +## SfdxError + +Was a copy of `SfError`, now removed. Use `SfError`. + +## SfdxProject and SfdxProjectJson + +Both of these were empty wrappers around `SfProject` and `SfProjectJson`. Use those instead. + +## Connection.deployRecentValidation + +Since this was moved to jsforce2, the sfdx-core implementation was an empty wrapper. Use jsforce's ConnectionDeployRecentValidation instead. + +## StateAggregator.aliases (aliasAccessor) + +There are some deprecated methods (set, unset). They still exist, but you should use the newer async equivalent. They not only set/unset the value in memory, but immediately write to the filesystem. + +`write` on aliases is now deprecated and a no-op. + +AliasAccessor no longer inherits from the entire configFile family of classes, so those methods are no longer available. + +This new version introduces file locks so parallel operations that write to Aliases should not cross-save each other. + +## sfdc + +These were independent functions on an object. Import the individual functions you need instead. + +Ex: `sfdc.trimTo15()` should be `trimTo15()` diff --git a/MIGRATING_V4-V5.md b/MIGRATING_V4-V5.md new file mode 100644 index 0000000000..ab00d48131 --- /dev/null +++ b/MIGRATING_V4-V5.md @@ -0,0 +1,64 @@ +# Migrating `@salesforce/core` from v4 to v5 + +v5 contains breaking changes to the Logger class + +Prior to v5, the Logger class wrapped a fork of Bunyan. v5 uses [Pino](https://getpino.io/) + +You could create the Logger and then make modifications to it (adding streams, changing it to in-memory). + +The v5 implementation is much simpler. Once you've created it, you cannot modify the logging destination. + +This commit contains the breaking changes: https://github.com/forcedotcom/sfdx-core/commit/c52a29bd4162bc14ebaf690876db6589d21929fe + +Most of the methods for manipulating streams, filter or changing the settings of an existing Logger are gone. The only change you can make to an existing Logger is to change the level or to add an additional field to all the outputs. + +## MemoryLogging + +instead of creating a Logger and then calling `useMemoryLogging` you can now pass the option `useMemoryLogger` when creating the Logger + +## Output format + +JSON is your only option. LogFmt no longer exists + +## Debug + +`enableDEBUG` is gone. The logger will use DEBUG and prettified output when `DEBUG=*` etc are in the environment. + +## Log file destinations + +Previously, logger went to sf.log and then rotated to sf.log.0, sf.log.1, etc. + +The new Logger will write to dated files like `sf-2023-06-29.log` so that no rotation is necessary. + +## Log file cleanup + +When a new logger is instantiated, there's a chance that it kicks off a cleanup process on existing logs. By default, they'll be around 7 days. If you don't use the CLI much, it might take extra time before the log files are cleaned up (but they'd be much smaller in that case) + +## Notes + +the new `getRawLogger` is similar to the previous `getBunyanLogger. It'll return the underlying Pino instance. + +This is an improvement in that it has TypeScript types for the pino methods. Example usage + +```ts +// Logger (class) which contains the root pino logger. Will be created if one doesn't exist +// child (class) which contains a pino child logger +// return the pino logger from child class +const childLogger = Logger.childFromRoot('myRootChild', { tag: 'whatever' }).getRawLogger(); +// same result, but async +const childLogger = await Logger.child('myRootChild', { tag: 'whatever' }).getRawLogger(); + +childLogger.debug('foo'); +``` + +This skips all that Class instantiation and hierarchy (get the pino instance from the root Logger class and create a child logger off of that) + +```ts +// Logger (class) which contains the root pino logger. Will be created if one doesn't exist +// pino child logger created from the root Logger (class) pino instance +const childLogger = Logger.getRoot().getRawLogger().child({ tag: 'whatever', name: `myRootChild` }); +// same result, but async +const childLogger = (await Logger.root()).getRawLogger().child({ tag: 'whatever', name: `myRootChild` }); + +childLogger.debug('foo'); +``` diff --git a/MIGRATING_V5-V6.md b/MIGRATING_V5-V6.md new file mode 100644 index 0000000000..afcec25d78 --- /dev/null +++ b/MIGRATING_V5-V6.md @@ -0,0 +1,30 @@ +# Migrating `@salesforce/core` from v5 to v6 + +v5 contains breaking changes to the classes that extend from ConfigStore/ConfigFile. We'll call these the "config stack" as a shorthand + +We've had a series of bugs where files controlled by the config stack could lose data or become corrupted when multiple processes try to write them concurrently. + +V6 introducing a file locking mechanism previously only available on the `alias` file and a process of resolving conflicts based on timestamps. + +But that comes with breaking changes to reduce the risk of "getting around" the safeties. + +## Breaking changes related to the Config Stack + +- AuthInfo.getFields now returns a read-only object. Use AuthInfo.update to change values in the fields. +- `setContents` method is no longer available in the ConfigFile stack. Use `update` to merge in multiple props, or `set/unset` on a single prop. +- `write` and `writeSync` method no longer accepts a param. Use other methods (`set`, `unset`, `update) to make modifications, then call write()/writeSync() to do the write. +- the use of lodash-style `get`/`set`/`unset`/`unsetAll` (ex: `set('foo.bar.baz[0]', 3)`) no longer works. +- `awaitEach` is removed +- You can no longer override the `setMethod` and `getMethod` when extending classes built on ConfigFile. Technically you could override get/set, but DON'T! +- Everything related to tokens/tokenConfig is gone + +## Unrelated changes that we did because it's a major version + +- node18+ only, compiles to es2022 +- move `uniqid`` to a shared function, outside of testSetup + +## Previously deprecated items that are now removed + +- removed sfdc.isInternalUrl. Use new SfdcUrl(url).isInternalUrl() +- removed sfdc.findUppercaseKeys. There is no replacement. +- removed SchemaPrinter. There is no replacement. diff --git a/MIGRATING_V6-V7.md b/MIGRATING_V6-V7.md new file mode 100644 index 0000000000..5ba4604211 --- /dev/null +++ b/MIGRATING_V6-V7.md @@ -0,0 +1,79 @@ +# Migrating `@salesforce/core` from v6 to v7 + +v7 replaces `jsforce` with the new `@jsforce/jsforce-node`. It's a much smaller library. See https://github.com/jsforce/jsforce/issues/1374. + +If you use `@salesforce/core` AND jsforce together, you should switch to using `@jsforce/jsforce-node`. + +If you use another library that is using jsforce modules or types, be sure to update to a version of that library which uses `@jsforce/jsforce-node` + +## Interfaces=>Type + +We're going to standardize on Types instead of interfaces. They're almost identical except where they aren't. You probably won't notice. + +## Breaking changes to AliasAccessor + +Alias accessor had previously deprecated methods that are removed by this PR. + +- `set` +- `unset` +- `unsetAll` +- `write` (has been a no-op since v6) + +If you use these, typically via StateAggregator, update your code to use `setAndSave` or `unsetAndSave` + +## SfError + +SfError previously had a `cause` that conflicted with the more recent ES2022 native Error.cause + +SfError has some new convenience methods. SfError.create (pass in props instead of setting 5 via params and others via instance methods). +SfError.wrap and the `cause` prop of SfError.create are now typed as `unknown` for convenience (throw the `unknown` from a catch block without having to worry about types!). +SfError.data is now constrained to be AnyJson (some sort of JSON/primitive or collection of that). + +## Top-level exports + +v7 exports more top-level modules. If you had previously imported via `@salesforce/core/lib/foo` you may be able to import them from the top-level. See the package.json for what's available now. + +everything that was previously available via `import ____ from '@salesforce/core'` is still available the same way. + +``` +"./messages": { + "types": "./lib/messages.d.ts", + "require": "./lib/messages.js", + "import": "./lib/messages.js" + }, + "./logger": { + "types": "./lib/logger.d.ts", + "require": "./lib/logger.js", + "import": "./lib/logger.js" + }, + "./project": { + "types": "./lib/project.d.ts", + "require": "./lib/project.js", + "import": "./lib/project.js" + }, + "./sfError": { + "types": "./lib/sfError.d.ts", + "require": "./lib/sfError.js", + "import": "./lib/sfError.js" + }, + "./stateAggregator": { + "types": "./lib/stateAggregator/stateAggregator.d.ts", + "require": "./lib/stateAggregator/stateAggregator.js", + "import": "./lib/stateAggregator/stateAggregator.js" + }, + "./configAggregator": { + "types": "./lib/config/configAggregator.d.ts", + "require": "./lib/config/configAggregator.js", + "import": "./lib/config/configAggregator.js" + }, + "./lifecycle": { + "types": "./lib/lifecycleEvents.d.ts", + "require": "./lib/lifecycleEvents.js", + "import": "./lib/lifecycleEvents.js" + }, + "./envVars": { + "types": "./lib/config/envVars.d.ts", + "require.js": "./lib/config/envVars.js", + "import": "./lib/config/envVars.js" + }, +``` diff --git a/README.md b/README.md index 633b904a17..4989db6d02 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,10 @@ [![NPM](https://img.shields.io/npm/v/@salesforce/core.svg)](https://www.npmjs.com/package/@salesforce/core) -[![CircleCI](https://circleci.com/gh/forcedotcom/sfdx-core.svg?style=svg&circle-token=2377ca31221869e9d13448313620486da80e595f)](https://circleci.com/gh/forcedotcom/sfdx-core) - [Description](#description) - [Usage](#usage) - [Contributing](#contributing) - [Using TestSetup](#using-testsetup) - - [Mocking Authorizations](#mocking-authorizations) - - [Mocking Config Files](#mocking-config-files) - - [Using the Built-in Sinon Sandboxes](#using-the-built-in-sinon-sandboxes) - - [Testing Expected Failures](#testing-expected-failures) - - [Testing Log Lines](#testing-log-lines) +- [Message Transformer](#message-transformer) # Description @@ -21,202 +16,66 @@ See the [API documentation](https://forcedotcom.github.io/sfdx-core/). ## Contributing -If you are interested in contributing, please take a look at the [CONTRIBUTING](CONTRIBUTING.md) guide. +If you're interested in contributing, take a look at the [CONTRIBUTING](CONTRIBUTING.md) guide. -# Using TestSetup - -The Salesforce DX Core Library provides a unit testing utility to help with mocking and sand-boxing core components. This feature allows unit tests to execute without needing to make API calls to salesforce.com. - -## Mocking Authorizations +## Issues -Here you can mock authorization for a Salesforce scratch org. - -```typescript -import { strictEqual } from 'assert'; -import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; -import { AuthInfo } from '@salesforce/core'; - -describe('Mocking Auth data', () => { - const $$ = new TestContext(); - it('example', async () => { - const testData = new MockTestOrgData(); - await $$.stubAuths(testData); - const auth = await AuthInfo.create({ username: testData.username }); - strictEqual(auth.getUsername(), testData.username); - }); -}); -``` +Report all issues to the [issues only repository](https://github.com/forcedotcom/cli/issues). -After having a valid AuthInfo object you can then create fake connections to a Salesforce.com scratch org. This allows for writing tests that can validate result responses for SOQL queries and REST endpoints. - -```typescript -import { AuthInfo, Connection, SfError } from '@salesforce/core'; -import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; -import { AnyJson, ensureJsonMap, JsonMap } from '@salesforce/ts-types'; -import { ensureString } from '@salesforce/ts-types'; -import { deepStrictEqual } from 'assert'; -import { QueryResult } from 'jsforce'; - -describe('Mocking a force server call', () => { - const $$ = new TestContext(); - it('example', async () => { - const records: AnyJson = { records: ['123456', '234567'] }; - const testData = new MockTestOrgData(); - await $$.stubAuths(testData); - $$.fakeConnectionRequest = (request: AnyJson): Promise => { - const _request = ensureJsonMap(request); - if (request && ensureString(_request.url).includes('Account')) { - return Promise.resolve(records); - } else { - return Promise.reject(new SfError(`Unexpected request: ${_request.url}`)); - } - }; - const connection = await Connection.create({ - authInfo: await AuthInfo.create({ username: testData.username }), - }); - const result = await connection.query('select Id From Account'); - deepStrictEqual(result, records); - }); -}); -``` +# Using TestSetup -## Mocking Config Files - -You can mock the contents of various config files - -```typescript -import { strictEqual } from 'assert'; -import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; -import { StateAggregator, OrgConfigProperties } from '@salesforce/core'; - -describe('Mocking Aliases', () => { - const $$ = new TestContext(); - it('example', async () => { - const testData = new MockTestOrgData(); - await $$.stubAliases({ myAlias: testData.username }); - const alias = (await StateAggregator.getInstance()).aliases.get(testData.username); - strictEqual(alias, 'myAlais'); - }); -}); - -describe('Mocking Config', () => { - it('example', async () => { - const testData = new MockTestOrgData(); - await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); - const { value } = (await ConfigAggregator.create()).getInfo(OrgConfigProperties.TARGET_ORG); - strictEqual(value, testData.username); - }); -}); - -describe('Mocking Arbitrary Config Files', () => { - it('example', async () => { - // MyConfigFile must extend the ConfigFile class in order for this to work properly. - $$.setConfigStubContents('MyConfigFile', { contents: { foo: 'bar' } }); - }); -}); -``` +The Salesforce DX Core Library provides a unit testing utility to help with mocking and sand-boxing core components. This feature allows unit tests to execute without needing to make API calls to salesforce.com. -## Using the Built-in Sinon Sandboxes +See the [Test Setup documentation](TEST_SETUP.md). -sfdx-core uses Sinon as its underlying mocking system. If you're unfamiliar with Sinon and its sandboxing concept you can find more information here: -https://sinonjs.org/ -Sinon `stub`s and `spy`s must be cleaned up after test invocations. To ease the use of Sinon with sfdx core we've exposed our sandbox in TestSetup. After adding your own `stub`s and/or `spy`s they will automatically be cleaned up after each test using mocha's afterEach method. +## Message Transformer -```typescript -import { strictEqual } from 'assert'; +The Messages class, by default, loads message text during run time. It's optimized to do this only per file. -import { TestContext } from '@salesforce/core/lib/testSetup'; -import * as os from 'os'; +If you're using @salesforce/core or other code that uses its Messages class in a bundler (webpack, esbuild, etc) it may struggle with these runtime references. -describe('Using the built in Sinon sandbox.', () => { - const $$ = new TestContext(); - it('example', async () => { - const unsupportedOS = 'LEO'; - $$.SANDBOX.stub(os, 'platform').returns(unsupportedOS); - strictEqual(os.platform(), unsupportedOS); - }); -}); -``` +src/messageTransformer will "inline" the messages into the js files during TS compile using `https://github.com/nonara/ts-patch`. -## Testing Expected Failures +In your plugin or library, -It's important to have negative tests that ensure proper error handling. With `shouldThrow` it's easy to test for expected async rejections. +`yarn add --dev ts-patch` -```typescript -import { SfError } from '@salesforce/core'; -import { shouldThrow } from '@salesforce/core/lib/testSetup'; -import { strictEqual } from 'assert'; +> tsconfig.json -class TestObject { - public static async method() { - throw new SfError('Error', 'ExpectedError'); - } +```json +{ + ... + "plugins": [{ "transform": "@salesforce/core/lib/messageTransformer", "import": "messageTransformer" }] } - -describe('Testing for expected errors', () => { - it('example', async () => { - try { - await shouldThrow(TestObject.method()); - } catch (e) { - strictEqual(e.name, 'ExpectedError'); - } - }); -}); ``` -You can also use `shouldThrowSync` for syncrhonous functions you expect to fail - -```typescript -import { SfError } from '@salesforce/core'; -import { shouldThrowSync } from '@salesforce/core/lib/testSetup'; -import { strictEqual } from 'assert'; - -class TestObject { - public static method() { - throw new SfError('Error', 'ExpectedError'); +> .sfdevrc.json, which gets merged into package.json + +```json +"wireit": { + "compile": { + "command": "tspc -p . --pretty --incremental", + "files": [ + "src/**/*.ts", + "tsconfig.json", + "messages" + ], + "output": [ + "lib/**", + "*.tsbuildinfo" + ], + "clean": "if-file-deleted" + } } -} -describe('Testing for expected errors', () => { - it('example', async () => { - try { - shouldThrowSync(() => TestObject.method()); - } catch (e) { - strictEqual(e.name, 'ExpectedError'); - } - }); -}); ``` -## Testing Log Lines - -It's also useful to check expected values and content from log lines. TestSetup configures the sfdx-core logger to use an in memory LogLine storage structure. These can be easily accessed from tests. +## Performance Testing -```typescript -import { Logger, LogLine } from '@salesforce/core'; -import { TestContext } from '@salesforce/core/lib/testSetup'; -import { strictEqual } from 'assert'; +There are some benchmark.js checks to get a baseline for Logger performance. +https://forcedotcom.github.io/sfdx-core/perf-Linux +https://forcedotcom.github.io/sfdx-core/perf-Windows -const TEST_STRING = 'foo was here'; +You can add more test cases in test/perf/logger/main.js -class TestObject { - constructor(private logger: Logger) { - this.logger = logger.child('TestObject'); - } - - public method() { - this.logger.error(TEST_STRING); - } -} - -describe('Testing log lines', () => { - const $$ = new TestContext(); - it('example', async () => { - const obj = new TestObject($$.TEST_LOGGER); - obj.method(); - const records = $$.TEST_LOGGER.getBufferedRecords(); - strictEqual(records.length, 1); - strictEqual(records[0].msg, TEST_STRING); - }); -}); -``` +If you add tests for new parts of sfdx-core outside of Logger, add new test Suites and create new jobs in the GHA `perf.yml` diff --git a/TEST_SETUP.md b/TEST_SETUP.md new file mode 100644 index 0000000000..a351ab84de --- /dev/null +++ b/TEST_SETUP.md @@ -0,0 +1,223 @@ +# Using TestSetup + +> **Note** +> Explore test examples in the [examples directory](./examples) + +The Salesforce DX Core Library provides a unit testing utility to help with mocking and sand-boxing core components. This feature allows unit tests to execute without needing to make API calls to salesforce.com. + +- [Mocking Authorizations](#mocking-authorizations) +- [Mocking Config Files](#mocking-config-files) +- [Using the Built-in Sinon Sandboxes](#using-the-built-in-sinon-sandboxes) +- [Testing Expected Failures](#testing-expected-failures) +- [Testing Log Lines](#testing-log-lines) + +## Mocking Authorizations + +This code shows how to mock authorization for a Salesforce scratch org. + +```typescript +import { strictEqual } from 'assert'; +import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; +import { AuthInfo } from '@salesforce/core'; + +describe('Mocking Auth data', () => { + const $$ = new TestContext(); + it('example', async () => { + const testData = new MockTestOrgData(); + await $$.stubAuths(testData); + const auth = await AuthInfo.create({ username: testData.username }); + strictEqual(auth.getUsername(), testData.username); + }); +}); +``` + +After having a valid AuthInfo object, you can then create fake connections to a Salesforce.com scratch org. You can then write tests that can validate result responses for SOQL queries and REST endpoints. + +```typescript +import { AuthInfo, Connection, SfError } from '@salesforce/core'; +import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; +import { AnyJson, ensureJsonMap, JsonMap } from '@salesforce/ts-types'; +import { ensureString } from '@salesforce/ts-types'; +import { deepStrictEqual } from 'assert'; +import { QueryResult } from '@jsforce/jsforce-node'; + +describe('Mocking a force server call', () => { + const $$ = new TestContext(); + it('example', async () => { + const records: AnyJson = { records: ['123456', '234567'] }; + const testData = new MockTestOrgData(); + await $$.stubAuths(testData); + $$.fakeConnectionRequest = (request: AnyJson): Promise => { + const _request = ensureJsonMap(request); + if (request && ensureString(_request.url).includes('Account')) { + return Promise.resolve(records); + } else { + return Promise.reject(new SfError(`Unexpected request: ${_request.url}`)); + } + }; + const connection = await Connection.create({ + authInfo: await AuthInfo.create({ username: testData.username }), + }); + const result = await connection.query('select Id From Account'); + deepStrictEqual(result, records); + }); +}); +``` + +## Mocking Config Files + +You can mock the contents of various config files. + +```typescript +import { strictEqual } from 'assert'; +import { MockTestOrgData, TestContext } from '@salesforce/core/lib/testSetup'; +import { StateAggregator, OrgConfigProperties } from '@salesforce/core'; + +describe('Mocking Aliases', () => { + const $$ = new TestContext(); + it('example', async () => { + const testData = new MockTestOrgData(); + await $$.stubAliases({ myAlias: testData.username }); + const alias = (await StateAggregator.getInstance()).aliases.get(testData.username); + strictEqual(alias, 'myAlias'); + }); +}); + +describe('Mocking Config', () => { + it('example', async () => { + const testData = new MockTestOrgData(); + await $$.stubConfig({ [OrgConfigProperties.TARGET_ORG]: testData.username }); + const { value } = (await ConfigAggregator.create()).getInfo(OrgConfigProperties.TARGET_ORG); + strictEqual(value, testData.username); + }); +}); + +describe('Mocking a project config file', () => { + it('stubs the project config file', async () => { + $$.setConfigStubContents('SfProjectJson', { + contents: { + packageDirectories: [ + { + path: 'force-app', + default: true, + }, + ], + sourceApiVersion: '57.0', + }, + }); + }); +}); + +describe('Mocking Arbitrary Config Files', () => { + it('example', async () => { + // MyConfigFile must extend the ConfigFile class in order for this to work properly. + // Examples include: DeployCache, DeployPipelineCache, ScratchOrgCache + $$.setConfigStubContents('MyConfigFile', { contents: { foo: 'bar' } }); + }); +}); +``` + +## Using the Built-in Sinon Sandboxes + +sfdx-core uses Sinon as its underlying mocking system. Find more information about Sinon and its sandboxing concept [here](https://sinonjs.org/). + +Sinon `stub`s and `spy`s must be cleaned up after test invocations. To ease the use of Sinon with sfdx-core, we've exposed our sandbox in `TestSetup`. After adding your own `stub`s or `spy`s, they'll automatically be cleaned up after each test using mocha's `afterEach` method. + +```typescript +import { strictEqual } from 'assert'; + +import { TestContext } from '@salesforce/core/lib/testSetup'; +import * as os from 'os'; + +describe('Using the built in Sinon sandbox.', () => { + const $$ = new TestContext(); + it('example', async () => { + const unsupportedOS = 'LEO'; + $$.SANDBOX.stub(os, 'platform').returns(unsupportedOS); + strictEqual(os.platform(), unsupportedOS); + }); +}); +``` + +## Testing Expected Failures + +It's important to have negative tests that ensure proper error handling. With `shouldThrow` it's easy to test for expected async rejections. + +```typescript +import { SfError } from '@salesforce/core'; +import { shouldThrow } from '@salesforce/core/lib/testSetup'; +import { strictEqual } from 'assert'; + +class TestObject { + public static async method() { + throw new SfError('Error', 'ExpectedError'); + } +} + +describe('Testing for expected errors', () => { + it('example', async () => { + try { + await shouldThrow(TestObject.method()); + } catch (e) { + strictEqual(e.name, 'ExpectedError'); + } + }); +}); +``` + +You can also use `shouldThrowSync` for syncrhonous functions you expect to fail. + +```typescript +import { SfError } from '@salesforce/core'; +import { shouldThrowSync } from '@salesforce/core/lib/testSetup'; +import { strictEqual } from 'assert'; + +class TestObject { + public static method() { + throw new SfError('Error', 'ExpectedError'); + } +} + +describe('Testing for expected errors', () => { + it('example', async () => { + try { + shouldThrowSync(() => TestObject.method()); + } catch (e) { + strictEqual(e.name, 'ExpectedError'); + } + }); +}); +``` + +## Testing Log Lines + +It's also useful to check expected values and content from log lines. TestSetup configures the sfdx-core logger to use an in memory LogLine storage structure. These can be easily accessed from tests. + +```typescript +import { Logger, LogLine } from '@salesforce/core'; +import { TestContext } from '@salesforce/core/lib/testSetup'; +import { strictEqual } from 'assert'; + +const TEST_STRING = 'foo was here'; + +class TestObject { + constructor(private logger: Logger) { + this.logger = logger.child('TestObject'); + } + + public method() { + this.logger.error(TEST_STRING); + } +} + +describe('Testing log lines', () => { + const $$ = new TestContext(); + it('example', async () => { + const obj = new TestObject($$.TEST_LOGGER); + obj.method(); + const records = $$.TEST_LOGGER.getBufferedRecords(); + strictEqual(records.length, 1); + strictEqual(records[0].msg, TEST_STRING); + }); +}); +``` diff --git a/examples/examples/apiExplorer/apiExplorer.ts b/examples/examples/apiExplorer/apiExplorer.ts index ca5ad75018..7d4aa42a7c 100755 --- a/examples/examples/apiExplorer/apiExplorer.ts +++ b/examples/examples/apiExplorer/apiExplorer.ts @@ -39,7 +39,8 @@ export async function run() { // Only change the options if they are urls const opts = Object.values(response); - if ((opts[0] as string).match(/^\//)) { + const first = opts[0]; + if (typeof first === 'string' && first.match(/^\//)) { options = opts; } } catch (err) { diff --git a/examples/package.json b/examples/package.json index 0ba9f14a3a..a2a2de42ed 100644 --- a/examples/package.json +++ b/examples/package.json @@ -15,7 +15,7 @@ "Salesforce CLI" ], "dependencies": { - "@salesforce/core": "^3", + "@salesforce/core": "^6", "chalk": "^4", "inquirer": "^8", "lodash": "^4.17.21", diff --git a/examples/test/tsconfig.json b/examples/test/tsconfig.json index 4adbc47a4b..41450389c3 100644 --- a/examples/test/tsconfig.json +++ b/examples/test/tsconfig.json @@ -4,6 +4,7 @@ "compilerOptions": { "noEmit": true, "skipLibCheck": true, - "resolveJsonModule": true + "resolveJsonModule": true, + "esModuleInterop": true } } diff --git a/examples/yarn.lock b/examples/yarn.lock index 6f6f4449e5..0b0ad55a7c 100644 --- a/examples/yarn.lock +++ b/examples/yarn.lock @@ -42,61 +42,47 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@salesforce/bunyan@^2.0.0": - version "2.0.0" - resolved "https://registry.npmjs.org/@salesforce/bunyan/-/bunyan-2.0.0.tgz#8dbe377f2cf7d35348a23260416fee15adba5f97" - integrity sha512-5hq+HWQSeymuygl3i9ehlQo3XWrlBE+A+QzmpDaoK37op4u9M+SBUbXfOW0IABOQCg+JmfQPocSMV74hRoqU9w== - dependencies: - dayjs "^1.8.16" - dayjs-plugin-utc "^0.1.2" - optionalDependencies: - dtrace-provider "~0.6" - mv "~2" - safe-json-stringify "~1" - -"@salesforce/core@^3": - version "3.20.2" - resolved "https://registry.npmjs.org/@salesforce/core/-/core-3.20.2.tgz#709ddb06f4d4494fd6d70e4535c9d9a6f2ab4c40" - integrity sha512-kxWH8IrQhHSsD2zF6plcq9lqsL5Dx2g48T3s7JI+jrFSz9XcRRZvWoeun+JoKhixqu54QBMZxow/PJXpnJZyrg== - dependencies: - "@salesforce/bunyan" "^2.0.0" - "@salesforce/kit" "^1.5.41" - "@salesforce/schemas" "^1.1.0" - "@salesforce/ts-types" "^1.5.20" - "@types/graceful-fs" "^4.1.5" - "@types/mkdirp" "^1.0.2" - "@types/semver" "^7.3.9" - ajv "^8.11.0" - archiver "^5.3.0" +"@salesforce/core@^6": + version "6.5.3" + resolved "https://registry.yarnpkg.com/@salesforce/core/-/core-6.5.3.tgz#b1ceef7947b9046ab23e78e73851115fec86f4f9" + integrity sha512-L4I2LrGyuXbNDCkoQdrMQ2sR/nhNIgRMLgpYNpOARZFIWKUsnjgBLVpUui+knCzjrQsOMoSwev+W0vp17iT76w== + dependencies: + "@salesforce/kit" "^3.0.15" + "@salesforce/schemas" "^1.6.1" + "@salesforce/ts-types" "^2.0.9" + "@types/semver" "^7.5.6" + ajv "^8.12.0" change-case "^4.1.2" - debug "^3.2.7" faye "^1.4.0" form-data "^4.0.0" - graceful-fs "^4.2.9" js2xmlparser "^4.0.1" - jsforce "2.0.0-beta.10" - jsonwebtoken "8.5.1" - mkdirp "1.0.4" - ts-retry-promise "^0.6.0" + jsforce "^2.0.0-beta.29" + jsonwebtoken "9.0.2" + jszip "3.10.1" + pino "^8.18.0" + pino-abstract-transport "^1.1.0" + pino-pretty "^10.3.1" + proper-lockfile "^4.1.2" + semver "^7.5.4" + ts-retry-promise "^0.7.1" "@salesforce/dev-config@^3": version "3.0.1" resolved "https://registry.npmjs.org/@salesforce/dev-config/-/dev-config-3.0.1.tgz#631a952abfd69e7cdb0fb312ba4b1656ae632b90" integrity sha512-hkH8g7/bQZvtOfKTb3AmTPo1KopUli31legtb84nF9Y6mKj27TRzWUvIRuaRRd86ma19C7lPA4ycUjydX4QCcQ== -"@salesforce/kit@^1.5.41": - version "1.5.42" - resolved "https://registry.npmjs.org/@salesforce/kit/-/kit-1.5.42.tgz#2c9f5fe9908723a70b65181526c5199e6bb943c5" - integrity sha512-40QiPR+bg3iOC2lqCKwVO0iPw29lHCS5KzUZFiTOeu8HDu5SCgDhGc1d1Bj8KK/ZYDrAcNTZ8ObrlQFnme3fdQ== +"@salesforce/kit@^3.0.15": + version "3.0.15" + resolved "https://registry.yarnpkg.com/@salesforce/kit/-/kit-3.0.15.tgz#713df3f5767f874c70a2e731c7cb5ba677989559" + integrity sha512-XkA8jsuLvVnyP460dAbU3pBFP2IkmmmsVxMQVifcKKbNWaIBbZBzAfj+vdaQfnvZyflLhsrFT3q2xkb0vHouPg== dependencies: - "@salesforce/ts-types" "^1.5.20" - shx "^0.3.3" - tslib "^2.2.0" + "@salesforce/ts-types" "^2.0.9" + tslib "^2.6.2" -"@salesforce/schemas@^1.1.0": - version "1.1.1" - resolved "https://registry.npmjs.org/@salesforce/schemas/-/schemas-1.1.1.tgz#937ec759c71d2d6e2a0ffc77894e83f9afca0cfd" - integrity sha512-iL8ZurImU5af+HmsMlzEpMVAJMwfxAYRaD++Q9cJQtKRwph/v7CWDMrT0f+mXY9/EB1xnARAsE0Pmne3VLaJrQ== +"@salesforce/schemas@^1.6.1": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@salesforce/schemas/-/schemas-1.6.1.tgz#7d1c071e1e509ca9d2d8a6e48ac7447dd67a534d" + integrity sha512-eVy947ZMxCJReKJdgfddUIsBIbPTa/i8RwQGwxq4/ss38H5sLOAeSTaun9V7HpJ1hkpDznWKfgzYvjsst9K6ig== "@salesforce/ts-sinon@^1": version "1.3.21" @@ -114,6 +100,13 @@ dependencies: tslib "^2.2.0" +"@salesforce/ts-types@^2.0.9": + version "2.0.9" + resolved "https://registry.yarnpkg.com/@salesforce/ts-types/-/ts-types-2.0.9.tgz#66bff7b41720065d6b01631b6f6a3ccca02857c5" + integrity sha512-boUD9jw5vQpTCPCCmK/NFTWjSuuW+lsaxOynkyNXLW+zxOc4GDjhtKc4j0vWZJQvolpafbyS8ZLFHZJvs12gYA== + dependencies: + tslib "^2.6.2" + "@sinonjs/commons@^1", "@sinonjs/commons@^1.3.0", "@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.8.3": version "1.8.3" resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" @@ -186,13 +179,6 @@ resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== -"@types/graceful-fs@^4.1.5": - version "4.1.5" - resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" - integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== - dependencies: - "@types/node" "*" - "@types/inquirer@^8.2.1": version "8.2.1" resolved "https://registry.npmjs.org/@types/inquirer/-/inquirer-8.2.1.tgz#28a139be3105a1175e205537e8ac10830e38dbf4" @@ -206,13 +192,6 @@ resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz#05301a4d5e62963227eaafe0ce04dd77c54ea5c2" integrity sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q== -"@types/mkdirp@^1.0.2": - version "1.0.2" - resolved "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-1.0.2.tgz#8d0bad7aa793abe551860be1f7ae7f3198c16666" - integrity sha512-o0K1tSO0Dx5X6xlU5F1D6625FawhC3dU3iqr25lluNv/+/QIVH8RLNEiVokgIZo+mz+87w/3Mkg/VvQS+J51fQ== - dependencies: - "@types/node" "*" - "@types/mocha@^9.1.1": version "9.1.1" resolved "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz#e7c4f1001eefa4b8afbd1eee27a237fee3bf29c4" @@ -228,10 +207,10 @@ resolved "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== -"@types/semver@^7.3.9": - version "7.3.9" - resolved "https://registry.npmjs.org/@types/semver/-/semver-7.3.9.tgz#152c6c20a7688c30b967ec1841d31ace569863fc" - integrity sha512-L/TMpyURfBkf+o/526Zb6kd/tchUP3iBDEPjqjb+U2MAJhVRxxrmr2fwpe08E7QsV7YLcpq0tUaQ9O9x97ZIxQ== +"@types/semver@^7.5.6": + version "7.5.7" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.7.tgz#326f5fdda70d13580777bcaa1bc6fa772a5aef0e" + integrity sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg== "@types/through@*": version "0.0.30" @@ -269,10 +248,10 @@ agent-base@6: dependencies: debug "4" -ajv@^8.11.0: - version "8.11.0" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" - integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== +ajv@^8.12.0: + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -311,35 +290,6 @@ anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -archiver-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz#e8a460e94b693c3e3da182a098ca6285ba9249e2" - integrity sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw== - dependencies: - glob "^7.1.4" - graceful-fs "^4.2.0" - lazystream "^1.0.0" - lodash.defaults "^4.2.0" - lodash.difference "^4.5.0" - lodash.flatten "^4.4.0" - lodash.isplainobject "^4.0.6" - lodash.union "^4.6.0" - normalize-path "^3.0.0" - readable-stream "^2.0.0" - -archiver@^5.3.0: - version "5.3.1" - resolved "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz#21e92811d6f09ecfce649fbefefe8c79e57cbbb6" - integrity sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w== - dependencies: - archiver-utils "^2.1.0" - async "^3.2.3" - buffer-crc32 "^0.2.1" - readable-stream "^3.6.0" - readdir-glob "^1.0.0" - tar-stream "^2.2.0" - zip-stream "^4.1.0" - arg@^4.1.0: version "4.1.3" resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" @@ -365,16 +315,16 @@ assertion-error@^1.1.0: resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== -async@^3.2.3: - version "3.2.4" - resolved "https://registry.npmjs.org/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" - integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== - asynckit@^0.4.0: version "0.4.0" resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== +atomic-sleep@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" + integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -395,7 +345,7 @@ binary-extensions@^2.0.0: resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -bl@^4.0.3, bl@^4.1.0: +bl@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== @@ -431,11 +381,6 @@ browser-stdout@1.3.1: resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== -buffer-crc32@^0.2.1, buffer-crc32@^0.2.13: - version "0.2.13" - resolved "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== - buffer-equal-constant-time@1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" @@ -449,6 +394,14 @@ buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + camel-case@^4.1.2: version "4.1.2" resolved "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" @@ -578,6 +531,11 @@ color-name@~1.1.4: resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +colorette@^2.0.7: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -590,16 +548,6 @@ commander@^4.0.1: resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== -compress-commons@^4.1.0: - version "4.1.1" - resolved "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz#df2a09a7ed17447642bad10a85cc9a19e5c42a7d" - integrity sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ== - dependencies: - buffer-crc32 "^0.2.13" - crc32-stream "^4.0.2" - normalize-path "^3.0.0" - readable-stream "^3.6.0" - concat-map@0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -629,19 +577,6 @@ core-util-is@~1.0.0: resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== -crc-32@^1.2.0: - version "1.2.2" - resolved "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" - integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== - -crc32-stream@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz#c922ad22b38395abe9d3870f02fa8134ed709007" - integrity sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w== - dependencies: - crc-32 "^1.2.0" - readable-stream "^3.4.0" - create-require@^1.1.0: version "1.1.1" resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" @@ -664,15 +599,10 @@ csv-stringify@^5.3.4: resolved "https://registry.npmjs.org/csv-stringify/-/csv-stringify-5.6.5.tgz#c6d74badda4b49a79bf4e72f91cce1e33b94de00" integrity sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A== -dayjs-plugin-utc@^0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/dayjs-plugin-utc/-/dayjs-plugin-utc-0.1.2.tgz#48e552407024143922d6499a40f6c765f8c93d03" - integrity sha512-ExERH5o3oo6jFOdkvMP3gytTCQ9Ksi5PtylclJWghr7k7m3o2U5QrwtdiJkOxLOH4ghr0EKhpqGefzGz1VvVJg== - -dayjs@^1.8.16: - version "1.11.3" - resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.3.tgz#4754eb694a624057b9ad2224b67b15d552589258" - integrity sha512-xxwlswWOlGhzgQ4TKzASQkUhqERI3egRNqgV4ScR8wlANA/A9tZ7miXa44vTTKEq5l7vWoL5G57bG3zA+Kow0A== +dateformat@^4.6.3: + version "4.6.3" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-4.6.3.tgz#556fa6497e5217fedb78821424f8a1c22fa3f4b5" + integrity sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA== debug@4, debug@4.3.4: version "4.3.4" @@ -681,13 +611,6 @@ debug@4, debug@4.3.4: dependencies: ms "2.1.2" -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - decamelize@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" @@ -740,13 +663,6 @@ dot-case@^3.0.4: no-case "^3.0.4" tslib "^2.0.3" -dtrace-provider@~0.6: - version "0.6.0" - resolved "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.6.0.tgz#0b078d5517937d873101452d9146737557b75e51" - integrity sha512-yqNrDWYWOR3wumcWPhlIGIKRSFMbDEwilGi+xYeaY4wW82cZrWsqGE+jsVnouxMqt/kCVsNmy/XDXLrm/J6SJg== - dependencies: - nan "^2.0.8" - ecdsa-sig-formatter@1.0.11: version "1.0.11" resolved "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" @@ -759,9 +675,9 @@ emoji-regex@^8.0.0: resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -end-of-stream@^1.4.1: +end-of-stream@^1.1.0: version "1.4.4" - resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" @@ -786,6 +702,11 @@ event-target-shim@^5.0.0: resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== +events@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + external-editor@^3.0.3: version "3.1.0" resolved "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" @@ -795,11 +716,26 @@ external-editor@^3.0.3: iconv-lite "^0.4.24" tmp "^0.0.33" +fast-copy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/fast-copy/-/fast-copy-3.0.1.tgz#9e89ef498b8c04c1cd76b33b8e14271658a732aa" + integrity sha512-Knr7NOtK3HWRYGtHoJrjkaWepqT8thIVGAwt0p0aUs1zqkAzXZV4vo9fFNwyb5fcqK1GKYFYxldQdIDVKhUAfA== + fast-deep-equal@^3.1.1: version "3.1.3" resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== +fast-redact@^3.1.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.3.0.tgz#7c83ce3a7be4898241a46560d51de10f653f7634" + integrity sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ== + +fast-safe-stringify@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + faye-websocket@>=0.9.1: version "0.11.4" resolved "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" @@ -855,11 +791,6 @@ form-data@^4.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" @@ -879,20 +810,15 @@ fsevents@~2.3.2: resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== get-func-name@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" - integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== + version "2.0.2" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" + integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== glob-parent@~5.1.2: version "5.1.2" @@ -913,34 +839,16 @@ glob@7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^6.0.1: - version "6.0.4" - resolved "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" - integrity sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A== - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.0.0, glob@^7.1.4: - version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.9: +graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.10" resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== +graceful-fs@^4.2.4: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -951,13 +859,6 @@ has-flag@^4.0.0: resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - he@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" @@ -971,6 +872,11 @@ header-case@^2.0.4: capital-case "^1.0.4" tslib "^2.0.3" +help-me@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/help-me/-/help-me-5.0.0.tgz#b1ebe63b967b74060027c2ac61f9be12d354a6f6" + integrity sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg== + http-parser-js@>=0.5.1: version "0.5.6" resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz#2e02406ab2df8af8a7abfba62e0da01c62b95afd" @@ -991,11 +897,16 @@ iconv-lite@^0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -ieee754@^1.1.13: +ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" - resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== +immediate@~3.0.5: + version "3.0.6" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -1049,11 +960,6 @@ inquirer@^8: through "^2.3.6" wrap-ansi "^7.0.0" -interpret@^1.0.0: - version "1.4.0" - resolved "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== - is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -1061,13 +967,6 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-core-module@^2.8.1: - version "2.9.0" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" - integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== - dependencies: - has "^1.0.3" - is-docker@^2.0.0: version "2.2.1" resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" @@ -1127,6 +1026,11 @@ isarray@~1.0.0: resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== +joycon@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" + integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw== + js-yaml@4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" @@ -1141,10 +1045,10 @@ js2xmlparser@^4.0.1: dependencies: xmlcreate "^2.0.4" -jsforce@2.0.0-beta.10: - version "2.0.0-beta.10" - resolved "https://registry.npmjs.org/jsforce/-/jsforce-2.0.0-beta.10.tgz#c33fee5dd01c96d121235cffb8fee1458a35423e" - integrity sha512-AFigJHQocj8t36Eu+9XffoKoC2FO4/uMDMg08TfTXgvIp53lzvnQJoQrhEnwnKReof4tO2d+7j+d1QyiOa2yGg== +jsforce@^2.0.0-beta.29: + version "2.0.0-beta.29" + resolved "https://registry.yarnpkg.com/jsforce/-/jsforce-2.0.0-beta.29.tgz#0b59b026eb0b90dfb199a53656af32a4c8acc48f" + integrity sha512-Fq7xjOYOikyozZZDQNTfzsAdhcO0rUXwtavsjM+cCYUFiCMVOJJavgco303zOsJk3v8sdAYnGgHyKckLIhnyAg== dependencies: "@babel/runtime" "^7.12.5" "@babel/runtime-corejs3" "^7.12.5" @@ -1165,7 +1069,7 @@ jsforce@2.0.0-beta.10: open "^7.0.0" regenerator-runtime "^0.13.3" strip-ansi "^6.0.0" - xml2js "^0.4.22" + xml2js "^0.5.0" json-schema-traverse@^1.0.0: version "1.0.0" @@ -1179,10 +1083,10 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" -jsonwebtoken@8.5.1: - version "8.5.1" - resolved "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" - integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== +jsonwebtoken@9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz#65ff91f4abef1784697d40952bb1998c504caaf3" + integrity sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ== dependencies: jws "^3.2.2" lodash.includes "^4.3.0" @@ -1193,7 +1097,17 @@ jsonwebtoken@8.5.1: lodash.isstring "^4.0.1" lodash.once "^4.0.0" ms "^2.1.1" - semver "^5.6.0" + semver "^7.5.4" + +jszip@3.10.1: + version "3.10.1" + resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2" + integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== + dependencies: + lie "~3.3.0" + pako "~1.0.2" + readable-stream "~2.3.6" + setimmediate "^1.0.5" just-extend@^4.0.2: version "4.2.1" @@ -1217,12 +1131,12 @@ jws@^3.2.2: jwa "^1.4.1" safe-buffer "^5.0.1" -lazystream@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz#494c831062f1f9408251ec44db1cba29242a2638" - integrity sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw== +lie@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" + integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== dependencies: - readable-stream "^2.0.5" + immediate "~3.0.5" locate-path@^6.0.0: version "6.0.0" @@ -1231,21 +1145,6 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lodash.defaults@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" - integrity sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ== - -lodash.difference@^4.5.0: - version "4.5.0" - resolved "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c" - integrity sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA== - -lodash.flatten@^4.4.0: - version "4.4.0" - resolved "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" - integrity sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g== - lodash.get@^4.4.2: version "4.4.2" resolved "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" @@ -1286,11 +1185,6 @@ lodash.once@^4.0.0: resolved "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== -lodash.union@^4.6.0: - version "4.6.0" - resolved "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" - integrity sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw== - lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21: version "4.17.21" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" @@ -1330,6 +1224,13 @@ lower-case@^2.0.2: dependencies: tslib "^2.0.3" +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + make-error@^1.1.1: version "1.3.6" resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" @@ -1352,13 +1253,6 @@ mimic-fn@^2.1.0: resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -"minimatch@2 || 3", minimatch@^3.0.4, minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - minimatch@5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" @@ -1366,23 +1260,18 @@ minimatch@5.0.1: dependencies: brace-expansion "^2.0.1" -minimist@^1.2.3, minimist@^1.2.6: +minimatch@^3.0.4: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.6: version "1.2.6" resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== -mkdirp@1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -mkdirp@~0.5.1: - version "0.5.6" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - mocha@^10: version "10.0.0" resolved "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz#205447d8993ec755335c4b13deba3d3a13c4def9" @@ -1434,30 +1323,11 @@ mute-stream@0.0.8: resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== -mv@~2: - version "2.1.1" - resolved "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz#ae6ce0d6f6d5e0a4f7d893798d03c1ea9559b6a2" - integrity sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg== - dependencies: - mkdirp "~0.5.1" - ncp "~2.0.0" - rimraf "~2.4.0" - -nan@^2.0.8: - version "2.16.0" - resolved "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz#664f43e45460fb98faf00edca0bb0d7b8dce7916" - integrity sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA== - nanoid@3.3.3: version "3.3.3" resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== -ncp@~2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" - integrity sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA== - nise@^1.3.3: version "1.5.3" resolved "https://registry.npmjs.org/nise/-/nise-1.5.3.tgz#9d2cfe37d44f57317766c6e9408a359c5d3ac1f7" @@ -1500,7 +1370,12 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -once@^1.3.0, once@^1.4.0: +on-exit-leak-free@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz#fed195c9ebddb7d9e4c3842f93f281ac8dadd3b8" + integrity sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== @@ -1556,6 +1431,11 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" +pako@~1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + param-case@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" @@ -1590,11 +1470,6 @@ path-is-absolute@^1.0.0: resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - path-to-regexp@^1.7.0: version "1.8.0" resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" @@ -1612,21 +1487,108 @@ picomatch@^2.0.4, picomatch@^2.2.1: resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +pino-abstract-transport@^1.0.0, pino-abstract-transport@^1.1.0, pino-abstract-transport@v1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-1.1.0.tgz#083d98f966262164504afb989bccd05f665937a8" + integrity sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA== + dependencies: + readable-stream "^4.0.0" + split2 "^4.0.0" + +pino-pretty@^10.3.1: + version "10.3.1" + resolved "https://registry.yarnpkg.com/pino-pretty/-/pino-pretty-10.3.1.tgz#e3285a5265211ac6c7cd5988f9e65bf3371a0ca9" + integrity sha512-az8JbIYeN/1iLj2t0jR9DV48/LQ3RC6hZPpapKPkb84Q+yTidMCpgWxIT3N0flnBDilyBQ1luWNpOeJptjdp/g== + dependencies: + colorette "^2.0.7" + dateformat "^4.6.3" + fast-copy "^3.0.0" + fast-safe-stringify "^2.1.1" + help-me "^5.0.0" + joycon "^3.1.1" + minimist "^1.2.6" + on-exit-leak-free "^2.1.0" + pino-abstract-transport "^1.0.0" + pump "^3.0.0" + readable-stream "^4.0.0" + secure-json-parse "^2.4.0" + sonic-boom "^3.0.0" + strip-json-comments "^3.1.1" + +pino-std-serializers@^6.0.0: + version "6.2.2" + resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz#d9a9b5f2b9a402486a5fc4db0a737570a860aab3" + integrity sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA== + +pino@^8.18.0: + version "8.18.0" + resolved "https://registry.yarnpkg.com/pino/-/pino-8.18.0.tgz#f2bfbb4e827ed2049ee1e88372268efdcd1505f6" + integrity sha512-Mz/gKiRyuXu4HnpHgi1YWdHQCoWMufapzooisvFn78zl4dZciAxS+YeRkUxXl1ee/SzU80YCz1zpECCh4oC6Aw== + dependencies: + atomic-sleep "^1.0.0" + fast-redact "^3.1.1" + on-exit-leak-free "^2.1.0" + pino-abstract-transport v1.1.0 + pino-std-serializers "^6.0.0" + process-warning "^3.0.0" + quick-format-unescaped "^4.0.3" + real-require "^0.2.0" + safe-stable-stringify "^2.3.1" + sonic-boom "^3.7.0" + thread-stream "^2.0.0" + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== +process-warning@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-3.0.0.tgz#96e5b88884187a1dce6f5c3166d611132058710b" + integrity sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + +proper-lockfile@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/proper-lockfile/-/proper-lockfile-4.1.2.tgz#c8b9de2af6b2f1601067f98e01ac66baa223141f" + integrity sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA== + dependencies: + graceful-fs "^4.2.4" + retry "^0.12.0" + signal-exit "^3.0.2" + psl@^1.1.33: version "1.8.0" resolved "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +quick-format-unescaped@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" + integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== + randombytes@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -1634,20 +1596,7 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" -readable-stream@^2.0.0, readable-stream@^2.0.5: - version "2.3.7" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: +readable-stream@^3.4.0: version "3.6.0" resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -1656,12 +1605,29 @@ readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" -readdir-glob@^1.0.0: - version "1.1.1" - resolved "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.1.tgz#f0e10bb7bf7bfa7e0add8baffdc54c3f7dbee6c4" - integrity sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA== +readable-stream@^4.0.0: + version "4.5.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.5.2.tgz#9e7fc4c45099baeed934bff6eb97ba6cf2729e09" + integrity sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g== dependencies: - minimatch "^3.0.4" + abort-controller "^3.0.0" + buffer "^6.0.3" + events "^3.3.0" + process "^0.11.10" + string_decoder "^1.3.0" + +readable-stream@~2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" readdirp@~3.6.0: version "3.6.0" @@ -1670,12 +1636,10 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== - dependencies: - resolve "^1.1.6" +real-require@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/real-require/-/real-require-0.2.0.tgz#209632dea1810be2ae063a6ac084fee7e33fba78" + integrity sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg== regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4: version "0.13.9" @@ -1692,14 +1656,10 @@ require-from-string@^2.0.2: resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== -resolve@^1.1.6: - version "1.22.0" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" - integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== - dependencies: - is-core-module "^2.8.1" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== restore-cursor@^3.1.0: version "3.1.0" @@ -1709,12 +1669,10 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" -rimraf@~2.4.0: - version "2.4.5" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz#ee710ce5d93a8fdb856fb5ea8ff0e2d75934b2da" - integrity sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ== - dependencies: - glob "^6.0.1" +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== run-async@^2.4.0: version "2.4.1" @@ -1745,10 +1703,10 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-json-stringify@~1: - version "1.2.0" - resolved "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz#356e44bc98f1f93ce45df14bcd7c01cda86e0afd" - integrity sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg== +safe-stable-stringify@^2.3.1: + version "2.4.3" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" + integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== "safer-buffer@>= 2.1.2 < 3": version "2.1.2" @@ -1765,10 +1723,17 @@ sax@>=0.6.0: resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -semver@^5.6.0: - version "5.7.1" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== +secure-json-parse@^2.4.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/secure-json-parse/-/secure-json-parse-2.7.0.tgz#5a5f9cd6ae47df23dba3151edd06855d47e09862" + integrity sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw== + +semver@^7.5.4: + version "7.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== + dependencies: + lru-cache "^6.0.0" sentence-case@^3.0.4: version "3.0.4" @@ -1791,22 +1756,10 @@ serialize-javascript@6.0.0: dependencies: randombytes "^2.1.0" -shelljs@^0.8.5: - version "0.8.5" - resolved "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" - integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - -shx@^0.3.3: - version "0.3.4" - resolved "https://registry.npmjs.org/shx/-/shx-0.3.4.tgz#74289230b4b663979167f94e1935901406e40f02" - integrity sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g== - dependencies: - minimist "^1.2.3" - shelljs "^0.8.5" +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== signal-exit@^3.0.2: version "3.0.7" @@ -1846,6 +1799,18 @@ snake-case@^3.0.4: dot-case "^3.0.4" tslib "^2.0.3" +sonic-boom@^3.0.0, sonic-boom@^3.7.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-3.8.0.tgz#e442c5c23165df897d77c3c14ef3ca40dec66a66" + integrity sha512-ybz6OYOUjoQQCQ/i4LU8kaToD8ACtYP+Cj5qd2AO36bwbdewxWJ3ArmJ2cr6AvxlL2o0PqnCcPGUgkILbfkaCA== + dependencies: + atomic-sleep "^1.0.0" + +split2@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" + integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== + string-width@^4.1.0, string-width@^4.2.0: version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -1855,7 +1820,7 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string_decoder@^1.1.1: +string_decoder@^1.1.1, string_decoder@^1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== @@ -1876,9 +1841,9 @@ strip-ansi@^6, strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-json-comments@3.1.1: +strip-json-comments@3.1.1, strip-json-comments@^3.1.1: version "3.1.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== supports-color@8.1.1: @@ -1902,21 +1867,12 @@ supports-color@^7.1.0, supports-color@^7.2.0: dependencies: has-flag "^4.0.0" -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -tar-stream@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" - integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== +thread-stream@^2.0.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/thread-stream/-/thread-stream-2.4.1.tgz#6d588b14f0546e59d3f306614f044bc01ce43351" + integrity sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg== dependencies: - bl "^4.0.3" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" + real-require "^0.2.0" through@^2.3.6: version "2.3.8" @@ -1938,13 +1894,14 @@ to-regex-range@^5.0.1: is-number "^7.0.0" tough-cookie@*: - version "4.0.0" - resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" - integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== + version "4.1.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" + integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== dependencies: psl "^1.1.33" punycode "^2.1.1" - universalify "^0.1.2" + universalify "^0.2.0" + url-parse "^1.5.3" tr46@~0.0.3: version "0.0.3" @@ -1970,10 +1927,10 @@ ts-node@^10: v8-compile-cache-lib "^3.0.1" yn "3.1.1" -ts-retry-promise@^0.6.0: - version "0.6.1" - resolved "https://registry.npmjs.org/ts-retry-promise/-/ts-retry-promise-0.6.1.tgz#cade4d8c72ee177b9f0b9ec3ab21770752996543" - integrity sha512-6L9PAWahkRtZ4mG48wz3Mxk7LfW1eZKEPsCteIa5fbDE1G2kFk4ThHXbynKlIZLg0RdenDBDw6CLME5liOrBSQ== +ts-retry-promise@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/ts-retry-promise/-/ts-retry-promise-0.7.1.tgz#176d6eee6415f07b6c7c286d3657355e284a6906" + integrity sha512-NhHOCZ2AQORvH42hOPO5UZxShlcuiRtm7P2jIq2L2RY3PBxw2mLnUsEdHrIslVBFya1v5aZmrR55lWkzo13LrQ== tslib@^1.9.0: version "1.14.1" @@ -1985,6 +1942,11 @@ tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0: resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== +tslib@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + tunnel-agent@*: version "0.6.0" resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -2007,11 +1969,16 @@ typescript@^4: resolved "https://registry.npmjs.org/typescript/-/typescript-4.7.3.tgz#8364b502d5257b540f9de4c40be84c98e23a129d" integrity sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA== -universalify@^0.1.0, universalify@^0.1.2: +universalify@^0.1.0: version "0.1.2" resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + upper-case-first@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz#992c3273f882abd19d1e02894cc147117f844324" @@ -2033,6 +2000,14 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -2096,10 +2071,10 @@ wrappy@1: resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -xml2js@^0.4.22: - version "0.4.23" - resolved "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" - integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== +xml2js@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.5.0.tgz#d9440631fbb2ed800203fad106f2724f62c493b7" + integrity sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA== dependencies: sax ">=0.6.0" xmlbuilder "~11.0.0" @@ -2119,6 +2094,11 @@ y18n@^5.0.5: resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + yargs-parser@20.2.4: version "20.2.4" resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" @@ -2161,12 +2141,3 @@ yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -zip-stream@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz#51dd326571544e36aa3f756430b313576dc8fc79" - integrity sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A== - dependencies: - archiver-utils "^2.1.0" - compress-commons "^4.1.0" - readable-stream "^3.6.0" diff --git a/messageTransformer/messageTransformer.ts b/messageTransformer/messageTransformer.ts deleted file mode 100644 index e99fdeb654..0000000000 --- a/messageTransformer/messageTransformer.ts +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (c) 2023, 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 no-console */ -/* eslint-disable complexity */ - -import * as ts from 'typescript'; -import { Messages, StoredMessageMap } from '../src/messages'; - -/** - * - * @experimental - * transforms `messages` references from dynamic run-time to static compile-time values - */ -const transformer = (program: ts.Program, pluginOptions: {}) => { - Messages.importMessagesDirectory(process.cwd()); - const transformerFactory: ts.TransformerFactory = (context) => { - return (sourceFile) => { - // if there are no messages, no transformation is needed - if ( - !sourceFile.statements.some((i) => ts.isImportDeclaration(i) && i.importClause?.getText().includes('Messages')) - ) { - return sourceFile; - } - - const visitor = (node: ts.Node): ts.VisitResult => { - if (ts.isExpressionStatement(node) && node.getText().includes('importMessagesDirectory')) { - // importMessagesDirectory now happens at compile, not in runtime - // returning undefined removes the node - return undefined; - } - if ( - // transform a runtime load call into hardcoded messages values - // const foo = Messages.load|loadMessages('pluginName', 'messagesFile' ...) => - // const foo = new Messages('pluginName', 'messagesFile', new Map([['key', 'value']])) - ts.isCallExpression(node) && - ts.isPropertyAccessExpression(node.expression) && - node.expression.expression.getText() === 'Messages' && - node.expression.name.getText().includes('load') - ) { - // we always want the first two arguments, which are the plugin name and the messages file name - const arrayMembers = node.arguments.slice(0, 2); - const arrayMembersText = arrayMembers.map(getTextWithoutQuotes); - - // Messages doesn't care whether you call messages.load or loadMessages, it loads the whole file - const messagesInstance = Messages.loadMessages(arrayMembersText[0], arrayMembersText[1]); - return context.factory.createNewExpression(node.expression.expression, undefined, [ - arrayMembers[0], - arrayMembers[1], - context.factory.createNewExpression(context.factory.createIdentifier('Map'), undefined, [ - messageMapToHardcodedMap(messagesInstance.messages), - ]), - ]); - } - // it might be a node that contains one of the things we're interested in, so keep digging - return ts.visitEachChild(node, visitor, context); - }; - return ts.visitNode(sourceFile, visitor); - }; - }; - return transformerFactory; -}; - -export default transformer; - -const getTextWithoutQuotes = (node: ts.Node): string => node.getText().replace(/'/g, ''); - -/** turn a loaded message map into */ -const messageMapToHardcodedMap = (messages: StoredMessageMap): ts.ArrayLiteralExpression => { - return ts.factory.createArrayLiteralExpression( - Array.from(messages).map(([key, value]) => { - // case 1: string - if (typeof value === 'string') { - return ts.factory.createArrayLiteralExpression([ - ts.factory.createStringLiteral(key), - ts.factory.createStringLiteral(value), - ]); - } else if (Array.isArray(value)) { - // case 2: string[] - return ts.factory.createArrayLiteralExpression([ - ts.factory.createStringLiteral(key), - ts.factory.createArrayLiteralExpression(value.map((v) => ts.factory.createStringLiteral(v))), - ]); - } else { - // turn the object into a map and recurse! - return messageMapToHardcodedMap(new Map(Object.entries(value))); - } - }) - ); -}; diff --git a/messages/auth.md b/messages/auth.md index 6076e125aa..6e866202b8 100644 --- a/messages/auth.md +++ b/messages/auth.md @@ -24,14 +24,26 @@ Invalid request method: %s Invalid request uri: %s +# error.HttpApi + +HTTP response contains html content. Check that the org exists and can be reached. + # pollingTimeout The device authorization request timed out. After executing force:auth:device:login, you must approve access to the device within 10 minutes. This can happen if the URL wasn’t copied into the browser, login was not attempted, or the 2FA process was not completed within 10 minutes. Request authorization again. # serverErrorHTMLResponse -

%s


This is most likely not an error with the Salesforce CLI. Please ensure all information is accurate and try again. +
%s

This is most likely not an error with the Salesforce CLI. Please ensure all information is accurate and try again.
# missingAuthCode No authentication code found on login response. + +# serverSuccessHTMLResponse + +
You've successfully logged in. You can now close this browser tab or window.
+ +# serverSfdcImage + +PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIxLjEuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHZpZXdCb3g9IjAgMCAyNjIgMTg0IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyNjIgMTg0OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3Qwe2ZpbGw6IzAwQTFFMDt9Cgkuc3Qxe2ZpbGw6I0ZGRkZGRjt9Cjwvc3R5bGU+Cjx0aXRsZT5sb2dvLXNhbGVzZm9yY2U8L3RpdGxlPgo8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KPGcgaWQ9IlRlc3QtQiI+Cgk8ZyBpZD0iTW9iaWxlLU5hdi0tLVRlc3QtQi1feDI4XzBfeDI5XyI+CgkJPGcgaWQ9Ikdyb3VwIj4KCQkJPGcgaWQ9ImxvZ28tc2FsZXNmb3JjZSI+CgkJCQk8cGF0aCBpZD0iRmlsbC0xIiBjbGFzcz0ic3QwIiBkPSJNMTA5LjIsMjAuOWM4LjQtOC43LDIwLjEtMTQuMiwzMy0xNC4yYzE3LjIsMCwzMi4xLDkuNiw0MC4xLDIzLjhjNi45LTMuMSwxNC42LTQuOCwyMi43LTQuOAoJCQkJCWMzMSwwLDU2LDI1LjMsNTYsNTYuNXMtMjUuMSw1Ni41LTU2LDU2LjVjLTMuOCwwLTcuNS0wLjQtMTEtMS4xYy03LDEyLjUtMjAuNCwyMS0zNS44LDIxYy02LjQsMC0xMi41LTEuNS0xNy45LTQuMQoJCQkJCWMtNy4xLDE2LjctMjMuNywyOC41LTQzLDI4LjVjLTIwLjEsMC0zNy4zLTEyLjctNDMuOS0zMC42Yy0yLjksMC42LTUuOSwwLjktOC45LDAuOWMtMjQsMC00My40LTE5LjYtNDMuNC00My45CgkJCQkJYzAtMTYuMiw4LjctMzAuNCwyMS43LTM4Yy0yLjctNi4xLTQuMi0xMi45LTQuMi0yMC4xQzE4LjUsMjMuNiw0MS4yLDEsNjksMUM4NS40LDEsMTAwLDguOCwxMDkuMiwyMC45Ii8+CgkJCQk8cGF0aCBpZD0iQ29tYmluZWQtU2hhcGUiIGNsYXNzPSJzdDEiIGQ9Ik0zOC43LDk1LjRsMS4xLTIuOWMwLjItMC41LDAuNS0wLjMsMC43LTAuMmMwLjMsMC4yLDAuNSwwLjMsMC45LDAuNmMzLjEsMiw2LDIsNi45LDIKCQkJCQljMi4zLDAsMy44LTEuMiwzLjgtMi45di0wLjFjMC0xLjgtMi4yLTIuNS00LjgtMy4zbC0wLjYtMC4yYy0zLjUtMS03LjMtMi41LTcuMy02Ljl2LTAuMWMwLTQuMiwzLjQtNy4yLDguMy03LjJsMC41LDAKCQkJCQljMi45LDAsNS42LDAuOCw3LjYsMi4xYzAuMiwwLjEsMC40LDAuMywwLjMsMC42Yy0wLjEsMC4zLTEsMi42LTEuMSwyLjljLTAuMiwwLjUtMC43LDAuMi0wLjcsMC4yYy0xLjgtMS00LjUtMS43LTYuOC0xLjcKCQkJCQljLTIuMSwwLTMuNCwxLjEtMy40LDIuNnYwLjFjMCwxLjcsMi4zLDIuNSw0LjksMy4zbDAuNSwwLjFjMy41LDEuMSw3LjIsMi42LDcuMiw2Ljl2MC4xYzAsNC42LTMuMyw3LjQtOC42LDcuNAoJCQkJCWMtMi42LDAtNS4xLTAuNC03LjgtMS44Yy0wLjUtMC4zLTEtMC41LTEuNS0wLjlDMzguNyw5NS45LDM4LjUsOTUuOCwzOC43LDk1LjR6IE0xMTYuNyw5NS40bDEuMS0yLjljMC4yLTAuNSwwLjYtMC4zLDAuNy0wLjIKCQkJCQljMC4zLDAuMiwwLjUsMC4zLDAuOSwwLjZjMy4xLDIsNiwyLDYuOSwyYzIuMywwLDMuOC0xLjIsMy44LTIuOXYtMC4xYzAtMS44LTIuMi0yLjUtNC44LTMuM2wtMC42LTAuMmMtMy41LTEtNy4zLTIuNS03LjMtNi45CgkJCQkJdi0wLjFjMC00LjIsMy40LTcuMiw4LjMtNy4ybDAuNSwwYzIuOSwwLDUuNiwwLjgsNy42LDIuMWMwLjIsMC4xLDAuNCwwLjMsMC4zLDAuNmMtMC4xLDAuMy0xLDIuNi0xLjEsMi45CgkJCQkJYy0wLjIsMC41LTAuNywwLjItMC43LDAuMmMtMS44LTEtNC41LTEuNy02LjgtMS43Yy0yLjEsMC0zLjQsMS4xLTMuNCwyLjZ2MC4xYzAsMS43LDIuMywyLjUsNC45LDMuM2wwLjUsMC4xCgkJCQkJYzMuNSwxLjEsNy4yLDIuNiw3LjIsNi45djAuMWMwLDQuNi0zLjMsNy40LTguNiw3LjRjLTIuNiwwLTUuMS0wLjQtNy44LTEuOGMtMC41LTAuMy0xLTAuNS0xLjUtMC45CgkJCQkJQzExNi44LDk1LjksMTE2LjYsOTUuOCwxMTYuNyw5NS40eiBNMTc0LjUsODEuN2MwLjQsMS41LDAuNywzLjEsMC43LDQuOHMtMC4yLDMuMy0wLjcsNC44Yy0wLjQsMS41LTEuMSwyLjgtMiwzLjkKCQkJCQljLTAuOSwxLjEtMi4xLDItMy40LDIuNmMtMS40LDAuNi0zLDAuOS00LjgsMC45Yy0xLjgsMC0zLjQtMC4zLTQuOC0wLjljLTEuNC0wLjYtMi41LTEuNS0zLjQtMi42Yy0wLjktMS4xLTEuNi0yLjQtMi0zLjkKCQkJCQljLTAuNC0xLjUtMC43LTMuMS0wLjctNC44YzAtMS43LDAuMi0zLjMsMC43LTQuOGMwLjQtMS41LDEuMS0yLjgsMi0zLjljMC45LTEuMSwyLjEtMiwzLjQtMi42YzEuNC0wLjYsMy0xLDQuOC0xCgkJCQkJYzEuOCwwLDMuNCwwLjMsNC44LDFjMS40LDAuNiwyLjUsMS41LDMuNCwyLjZDMTczLjQsNzguOSwxNzQuMSw4MC4yLDE3NC41LDgxLjd6IE0xNzAsODYuNGMwLTIuNi0wLjUtNC42LTEuNC02CgkJCQkJYy0wLjktMS40LTIuNC0yLjEtNC4zLTIuMWMtMiwwLTMuNCwwLjctNC4zLDIuMWMtMC45LDEuNC0xLjQsMy40LTEuNCw2YzAsMi42LDAuNSw0LjYsMS40LDYuMWMwLjksMS40LDIuMywyLjEsNC4zLDIuMQoJCQkJCWMyLDAsMy40LTAuNyw0LjMtMi4xQzE2OS42LDkxLjEsMTcwLDg5LDE3MCw4Ni40eiBNMjExLjEsOTMuOWwxLjEsM2MwLjEsMC40LTAuMiwwLjUtMC4yLDAuNWMtMS43LDAuNy00LDEuMS02LjMsMS4xCgkJCQkJYy0zLjksMC02LjgtMS4xLTguOC0zLjNjLTItMi4yLTMtNS4yLTMtOC45YzAtMS43LDAuMi0zLjMsMC43LTQuOGMwLjUtMS41LDEuMi0yLjgsMi4yLTMuOWMxLTEuMSwyLjItMiwzLjYtMi42CgkJCQkJYzEuNC0wLjYsMy4xLTEsNS0xYzEuMywwLDIuNCwwLjEsMy4zLDAuMmMxLDAuMiwyLjQsMC41LDMsMC44YzAuMSwwLDAuNCwwLjIsMC4zLDAuNWMtMC40LDEuMi0wLjcsMi0xLjEsMwoJCQkJCWMtMC4yLDAuNS0wLjUsMC4zLTAuNSwwLjNjLTEuNS0wLjUtMi45LTAuNy00LjctMC43Yy0yLjIsMC0zLjksMC43LTQuOSwyLjJjLTEuMSwxLjQtMS43LDMuMy0xLjcsNS45YzAsMi44LDAuNyw0LjgsMS45LDYuMQoJCQkJCWMxLjIsMS4zLDIuOSwxLjksNS4xLDEuOWMwLjksMCwxLjctMC4xLDIuNC0wLjJjMC43LTAuMSwxLjQtMC4zLDIuMS0wLjZDMjEwLjUsOTMuNiwyMTAuOSw5My41LDIxMS4xLDkzLjl6IE0yMzMuOCw4MC44CgkJCQkJYzEsMy40LDAuNSw2LjMsMC40LDYuNWMwLDAuNC0wLjQsMC40LTAuNCwwLjRsLTE1LjEsMGMwLjEsMi4zLDAuNiwzLjksMS44LDVjMS4xLDEuMSwyLjgsMS44LDUuMiwxLjhjMy42LDAsNS4xLTAuNyw2LjItMS4xCgkJCQkJYzAsMCwwLjQtMC4xLDAuNiwwLjNsMSwyLjhjMC4yLDAuNSwwLDAuNi0wLjEsMC43Yy0wLjksMC41LTMuMiwxLjUtNy42LDEuNWMtMi4xLDAtNC0wLjMtNS41LTAuOWMtMS41LTAuNi0yLjgtMS40LTMuOC0yLjUKCQkJCQljLTEtMS4xLTEuNy0yLjQtMi4yLTMuOGMtMC41LTEuNS0wLjctMy4xLTAuNy00LjhjMC0xLjcsMC4yLTMuMywwLjctNC44YzAuNC0xLjUsMS4xLTIuOCwyLTMuOWMwLjktMS4xLDIuMS0yLDMuNS0yLjYKCQkJCQljMS40LTAuNywzLjEtMSw1LTFjMS42LDAsMy4xLDAuMyw0LjMsMC45YzAuOSwwLjQsMS45LDEuMSwyLjksMi4yQzIzMi41LDc3LjksMjMzLjQsNzkuNCwyMzMuOCw4MC44eiBNMjE4LjgsODRoMTAuNwoJCQkJCWMtMC4xLTEuNC0wLjQtMi42LTEtMy42Yy0wLjktMS40LTIuMi0yLjItNC4yLTIuMmMtMiwwLTMuNCwwLjgtNC4zLDIuMkMyMTkuNCw4MS4zLDIxOS4xLDgyLjUsMjE4LjgsODR6IE0xMTMuMSw4MC44CgkJCQkJYzEsMy40LDAuNSw2LjMsMC41LDYuNWMwLDAuNC0wLjQsMC40LTAuNCwwLjRsLTE1LjEsMGMwLjEsMi4zLDAuNiwzLjksMS44LDVjMS4xLDEuMSwyLjgsMS44LDUuMiwxLjhjMy42LDAsNS4xLTAuNyw2LjItMS4xCgkJCQkJYzAsMCwwLjQtMC4xLDAuNiwwLjNsMSwyLjhjMC4yLDAuNSwwLDAuNi0wLjEsMC43Yy0wLjksMC41LTMuMiwxLjUtNy42LDEuNWMtMi4xLDAtNC0wLjMtNS41LTAuOWMtMS41LTAuNi0yLjgtMS40LTMuOC0yLjUKCQkJCQljLTEtMS4xLTEuNy0yLjQtMi4yLTMuOGMtMC41LTEuNS0wLjctMy4xLTAuNy00LjhjMC0xLjcsMC4yLTMuMywwLjctNC44YzAuNC0xLjUsMS4xLTIuOCwyLTMuOWMwLjktMS4xLDIuMS0yLDMuNS0yLjYKCQkJCQljMS40LTAuNywzLjEtMSw1LTFjMS42LDAsMy4xLDAuMyw0LjMsMC45YzAuOSwwLjQsMS45LDEuMSwyLjksMi4yQzExMS44LDc3LjksMTEyLjgsNzkuNCwxMTMuMSw4MC44eiBNOTguMSw4NGgxMC44CgkJCQkJYy0wLjEtMS40LTAuNC0yLjYtMS0zLjZjLTAuOS0xLjQtMi4yLTIuMi00LjItMi4yYy0yLDAtMy40LDAuOC00LjMsMi4yQzk4LjcsODEuMyw5OC40LDgyLjUsOTguMSw4NHogTTcxLjYsODMuMgoJCQkJCWMwLDAsMS4yLDAuMSwyLjUsMC4zdi0wLjZjMC0yLTAuNC0zLTEuMi0zLjZjLTAuOC0wLjYtMi4xLTEtMy43LTFjMCwwLTMuNywwLTYuNiwxLjVjLTAuMSwwLjEtMC4yLDAuMS0wLjIsMC4xCgkJCQkJcy0wLjQsMC4xLTAuNS0wLjJsLTEuMS0yLjljLTAuMi0wLjQsMC4xLTAuNiwwLjEtMC42YzEuNC0xLjEsNC42LTEuNyw0LjYtMS43YzEuMS0wLjIsMi45LTAuNCw0LTAuNGMzLDAsNS4zLDAuNyw2LjksMi4xCgkJCQkJYzEuNiwxLjQsMi40LDMuNiwyLjQsNi43bDAsMTMuOGMwLDAsMCwwLjQtMC4zLDAuNWMwLDAtMC42LDAuMi0xLjEsMC4zYy0wLjUsMC4xLTIuMywwLjUtMy44LDAuN2MtMS41LDAuMy0zLDAuNC00LjYsMC40CgkJCQkJYy0xLjUsMC0yLjgtMC4xLTQtMC40Yy0xLjItMC4zLTIuMi0wLjctMy4xLTEuM2MtMC44LTAuNi0xLjUtMS40LTItMi40Yy0wLjUtMC45LTAuNy0yLjEtMC43LTMuNGMwLTEuMywwLjMtMi41LDAuOC0zLjUKCQkJCQljMC41LTEsMS4zLTEuOCwyLjItMi41YzAuOS0wLjcsMi0xLjEsMy4xLTEuNWMxLjItMC4zLDIuNC0wLjUsMy43LTAuNUM3MC4yLDgzLjIsNzEsODMuMiw3MS42LDgzLjJ6IE02NS42LDkzLjgKCQkJCQljMCwwLDEuNCwxLjEsNC40LDAuOWMyLjItMC4xLDQuMS0wLjUsNC4xLTAuNXYtNi45YzAsMC0xLjktMC4zLTQuMS0wLjNjLTMuMSwwLTQuNCwxLjEtNC40LDEuMWMtMC45LDAuNi0xLjMsMS42LTEuMywyLjkKCQkJCQljMCwwLjgsMC4yLDEuNSwwLjUsMkM2NC45LDkzLjIsNjUsOTMuNCw2NS42LDkzLjh6IE0xOTMuMSw3NS41Yy0wLjEsMC40LTAuOSwyLjUtMS4xLDMuMmMtMC4xLDAuMy0wLjMsMC40LTAuNiwwLjQKCQkJCQljMCwwLTAuOS0wLjItMS43LTAuMmMtMC41LDAtMS4zLDAuMS0yLDAuM2MtMC43LDAuMi0xLjMsMC42LTEuOSwxLjFjLTAuNiwwLjUtMSwxLjMtMS4zLDIuMmMtMC4zLDAuOS0wLjUsMi40LTAuNSw0djExLjIKCQkJCQljMCwwLjMtMC4yLDAuNS0wLjUsMC41aC00Yy0wLjMsMC0wLjUtMC4yLTAuNS0wLjVWNzUuMmMwLTAuMywwLjItMC41LDAuNC0wLjVoMy45YzAuMywwLDAuNCwwLjIsMC40LDAuNVY3NwoJCQkJCWMwLjYtMC44LDEuNi0xLjUsMi41LTEuOWMwLjktMC40LDItMC43LDMuOS0wLjZjMSwwLjEsMi4zLDAuMywyLjUsMC40QzE5Myw3NSwxOTMuMiw3NS4xLDE5My4xLDc1LjV6IE0xNTYsNjUuMQoJCQkJCWMwLjEsMCwwLjQsMC4yLDAuMywwLjVsLTEuMiwzLjJjLTAuMSwwLjItMC4yLDAuNC0wLjcsMC4yYy0wLjEsMC0wLjMtMC4xLTAuOC0wLjJjLTAuMy0wLjEtMC44LTAuMS0xLjItMC4xCgkJCQkJYy0wLjYsMC0xLjEsMC4xLTEuNiwwLjJjLTAuNSwwLjEtMC45LDAuNC0xLjMsMC44Yy0wLjQsMC40LTAuOCwwLjktMS4xLDEuNmMtMC42LDEuNi0wLjgsMy4zLTAuOCwzLjRoNC44CgkJCQkJYzAuNCwwLDAuNSwwLjIsMC41LDAuNWwtMC42LDMuMWMtMC4xLDAuNS0wLjUsMC40LTAuNSwwLjRoLTVMMTQzLjYsOThjLTAuNCwyLTAuOCwzLjctMS4zLDUuMWMtMC41LDEuNC0xLjEsMi40LTIsMy40CgkJCQkJYy0wLjgsMC45LTEuNywxLjYtMi44LDEuOWMtMSwwLjQtMi4zLDAuNi0zLjcsMC42Yy0wLjcsMC0xLjQsMC0yLjItMC4yYy0wLjYtMC4xLTAuOS0wLjItMS40LTAuNGMtMC4yLTAuMS0wLjMtMC4zLTAuMi0wLjYKCQkJCQljMC4xLTAuMywxLTIuNywxLjEtMy4xYzAuMi0wLjQsMC41LTAuMiwwLjUtMC4yYzAuMywwLjEsMC41LDAuMiwwLjgsMC4zYzAuNCwwLjEsMC44LDAuMSwxLjIsMC4xYzAuNywwLDEuMy0wLjEsMS44LTAuMwoJCQkJCWMwLjYtMC4yLDEtMC42LDEuNC0xLjFjMC40LTAuNSwwLjctMS4yLDEuMS0yLjFjMC4zLTAuOSwwLjYtMi4yLDAuOS0zLjdsMy40LTE4LjloLTMuM2MtMC40LDAtMC41LTAuMi0wLjUtMC41bDAuNi0zLjEKCQkJCQljMC4xLTAuNSwwLjUtMC40LDAuNS0wLjRoMy40bDAuMi0xYzAuNS0zLDEuNS01LjMsMy02LjhjMS41LTEuNSwzLjctMi4zLDYuNC0yLjNjMC44LDAsMS41LDAuMSwyLjEsMC4yCgkJCQkJQzE1NSw2NC44LDE1NS41LDY0LjksMTU2LDY1LjF6IE04OC42LDk3LjZjMCwwLjMtMC4yLDAuNS0wLjQsMC41aC00Yy0wLjMsMC0wLjQtMC4yLTAuNC0wLjVWNjUuNWMwLTAuMiwwLjItMC41LDAuNC0wLjVoNAoJCQkJCWMwLjMsMCwwLjQsMC4yLDAuNCwwLjVWOTcuNnoiLz4KCQkJPC9nPgoJCTwvZz4KCTwvZz4KPC9nPgo8L3N2Zz4K diff --git a/messages/config.md b/messages/config.md index 1fe9b6a29f..7039fea6f8 100644 --- a/messages/config.md +++ b/messages/config.md @@ -151,6 +151,10 @@ A valid repository URL or directory for the custom org metadata templates. A valid repository URL or directory for the custom org metadata templates. +# org-capitalize-record-types + +Whether record types are capitalized on scratch org creation. + # invalidId The given id %s is not a valid 15 or 18 character Salesforce ID. diff --git a/messages/connection.md b/messages/connection.md index d926ec0f3a..8b5c0fe7b8 100644 --- a/messages/connection.md +++ b/messages/connection.md @@ -8,10 +8,10 @@ The org cannot be found # domainNotFoundError.actions -- Verify that the org still exists', -- If your org is newly created, wait a minute and run your command again', -- If you deployed or updated the org's My Domain, logout from the CLI and authenticate again", -- If you are running in a CI environment with a DNS that blocks external IPs, try setting SFDX_DISABLE_DNS_CHECK=true' +- Verify that the org still exists, +- If your org is newly created, wait a minute and run your command again, +- If you deployed or updated the org's My Domain, logout from the CLI and authenticate again, +- If you are running in a CI environment with a DNS that blocks external IPs, try setting SFDX_DISABLE_DNS_CHECK=true # noInstanceUrlError diff --git a/messages/encryption.md b/messages/encryption.md index e35967262f..5bfce3ddbc 100644 --- a/messages/encryption.md +++ b/messages/encryption.md @@ -83,3 +83,16 @@ Command failed with response: # macKeychainOutOfSync We’ve encountered an error with the Mac keychain being out of sync with your `sfdx` credentials. To fix the problem, sync your credentials by authenticating into your org again using the auth commands. + +# v1CryptoWithV2KeyWarning + +The SF_CRYPTO_V2 environment variable was set to "false" but a v2 crypto key was detected. v1 crypto can only be used with a v1 key. Unset the SF_CRYPTO_V2 environment variable. + +# v2CryptoWithV1KeyWarning + +SF_CRYPTO_V2 was set to "true" but a v1 crypto key was detected. v2 crypto can only be used with a v2 key. To generate a v2 key: + +1. Logout of all orgs: `sf org logout --all` +2. Delete the sfdx keychain entry (account: local, service: sfdx). If `SF_USE_GENERIC_UNIX_KEYCHAIN=true` env var is set, you can delete the `key.json` file. +3. Set `SF_CRYPTO_V2=true` env var. +4. Re-Authenticate with your orgs using the CLI org login commands. diff --git a/messages/envVars.md b/messages/envVars.md index 8ecd92a5d6..f46ea1c39a 100644 --- a/messages/envVars.md +++ b/messages/envVars.md @@ -301,3 +301,17 @@ Boolean indicating that the installer is running # sfEnv Describes if sf is in "demo" mode + +# deprecatedEnv + +Deprecated environment variable: %s. Please use %s instead. + +# deprecatedEnvDisagreement + +Deprecated environment variable: %s. Please use %s instead. + +Your environment has both variables populated, and with different values. The value from %s will be used. + +# sfCapitalizeRecordTypes + +Whether record types are capitalized on scratch org creation. diff --git a/messages/org.md b/messages/org.md index d4dddcc81e..aa3ce88217 100644 --- a/messages/org.md +++ b/messages/org.md @@ -34,6 +34,10 @@ We can't find a SandboxProcess for the sandbox %s. The sandbox org creation failed with a result of %s. +# sandboxInfoRefreshFailed + +The sandbox org refresh failed with a result of %s. + # missingAuthUsername The sandbox %s does not have an authorized username. diff --git a/messages/scratchOrgErrorCodes.md b/messages/scratchOrgErrorCodes.md index d620916392..39e01810cb 100644 --- a/messages/scratchOrgErrorCodes.md +++ b/messages/scratchOrgErrorCodes.md @@ -20,7 +20,7 @@ The scratch org is not ready yet (Status = %s). # action.StillInProgress -Wait for a few minutes, and then try the <%= config.bin %> <%= command.id %> command again +Wait for a few minutes, and then try the command again # NoScratchOrgInfoError diff --git a/messages/scratchOrgSettingsGenerator.md b/messages/scratchOrgSettingsGenerator.md new file mode 100644 index 0000000000..3b2eb5da79 --- /dev/null +++ b/messages/scratchOrgSettingsGenerator.md @@ -0,0 +1,4 @@ +# noCapitalizeRecordTypeConfigVar + +Record types defined in the scratch org definition file will stop being capitalized by default in a future release. +Set the `org-capitalize-record-types` config var to `true` to enforce capitalization. diff --git a/package.json b/package.json index 1c06eee25c..ca9d4eaa65 100644 --- a/package.json +++ b/package.json @@ -1,26 +1,42 @@ { "name": "@salesforce/core", - "version": "3.34.1", + "version": "7.3.12", "description": "Core libraries to interact with SFDX projects, orgs, and APIs.", - "main": "lib/exported", - "types": "lib/exported.d.ts", + "main": "lib/index", + "types": "lib/index.d.ts", "license": "BSD-3-Clause", + "engines": { + "node": ">=18.0.0" + }, + "exports": { + ".": "./lib/index.js", + "./config": "./lib/config/config.js", + "./configAggregator": "./lib/config/configAggregator.js", + "./envVars": "./lib/config/envVars.js", + "./lifecycle": "./lib/lifecycleEvents.js", + "./logger": "./lib/logger/logger.js", + "./messages": "./lib/messages.js", + "./messageTransformer": "./lib/messageTransformer.js", + "./project": "./lib/sfProject.js", + "./sfError": "./lib/sfError.js", + "./stateAggregator": "./lib/stateAggregator/stateAggregator.js", + "./testSetup": "./lib/testSetup.js" + }, "scripts": { "build": "wireit", - "ci-docs": "yarn sf-ci-docs", "clean": "sf-clean", "clean-all": "sf-clean all", "compile": "wireit", "docs": "sf-docs", "format": "wireit", + "link-check": "wireit", "lint": "wireit", "lint-fix": "yarn sf-lint --fix", - "postcompile": "tsc -p typedocExamples", "prepack": "sf-prepack", "prepare": "sf-install", "test": "wireit", - "test:compile": "wireit", - "test:only": "wireit" + "test:only": "wireit", + "test:perf": "ts-node test/perf/logger/main.test.ts" }, "keywords": [ "force", @@ -36,61 +52,39 @@ "messageTransformer/messageTransformer.ts" ], "dependencies": { - "@salesforce/bunyan": "^2.0.0", - "@salesforce/kit": "^1.9.2", - "@salesforce/schemas": "^1.5.0", - "@salesforce/ts-types": "^1.7.2", - "@types/graceful-fs": "^4.1.6", - "@types/semver": "^7.3.13", - "ajv": "^8.12.0", - "archiver": "^5.3.0", + "@jsforce/jsforce-node": "^3.2.0", + "@salesforce/kit": "^3.1.2", + "@salesforce/schemas": "^1.9.0", + "@salesforce/ts-types": "^2.0.9", + "ajv": "^8.15.0", "change-case": "^4.1.2", - "debug": "^3.2.7", + "fast-levenshtein": "^3.0.0", "faye": "^1.4.0", "form-data": "^4.0.0", - "graceful-fs": "^4.2.9", "js2xmlparser": "^4.0.1", - "jsforce": "^2.0.0-beta.19", - "jsonwebtoken": "9.0.0", - "ts-retry-promise": "^0.7.0" + "jsonwebtoken": "9.0.2", + "jszip": "3.10.1", + "pino": "^8.21.0", + "pino-abstract-transport": "^1.2.0", + "pino-pretty": "^10.3.1", + "proper-lockfile": "^4.1.2", + "semver": "^7.6.2", + "ts-retry-promise": "^0.8.1" }, "devDependencies": { - "@salesforce/dev-config": "^3.0.1", - "@salesforce/dev-scripts": "^4.0.0-beta.7", - "@salesforce/prettier-config": "^0.0.2", - "@salesforce/ts-sinon": "^1.4.6", - "@types/archiver": "^5.3.1", - "@types/chai-string": "^1.4.2", - "@types/debug": "0.0.31", - "@types/jsen": "0.0.21", - "@types/jsonwebtoken": "9.0.1", - "@types/lodash": "^4.14.191", - "@types/shelljs": "0.8.11", - "@typescript-eslint/eslint-plugin": "^5.54.1", - "@typescript-eslint/parser": "^5.54.1", - "chai": "^4.3.7", + "@salesforce/dev-scripts": "^8.5.0", + "@salesforce/ts-sinon": "^1.4.19", + "@types/benchmark": "^2.1.5", + "@types/chai-string": "^1.4.5", + "@types/fast-levenshtein": "^0.0.4", + "@types/jsonwebtoken": "9.0.6", + "@types/proper-lockfile": "^4.1.4", + "@types/semver": "^7.5.8", + "benchmark": "^2.1.4", "chai-string": "^1.5.0", - "commitizen": "^3.1.2", - "eslint": "^8.35.0", - "eslint-config-prettier": "^8.7.0", - "eslint-config-salesforce": "^1.1.1", - "eslint-config-salesforce-license": "^0.2.0", - "eslint-config-salesforce-typescript": "^1.1.1", - "eslint-plugin-header": "^3.1.1", - "eslint-plugin-import": "^2.27.5", - "eslint-plugin-jsdoc": "^39.9.1", - "husky": "^7.0.4", - "lodash": "^4.17.21", - "mocha": "^9.1.3", - "nyc": "^15.1.0", - "prettier": "^2.8.4", - "pretty-quick": "^3.1.3", - "shelljs": "0.8.5", - "sinon": "^14.0.2", - "ts-node": "^10.4.0", - "ttypescript": "^1.5.15", - "typescript": "^4.9.5", - "wireit": "^0.9.3" + "ts-node": "^10.9.2", + "ts-patch": "^3.2.0", + "typescript": "^5.4.5" }, "repository": { "type": "git", @@ -107,7 +101,7 @@ ] }, "compile": { - "command": "ttsc -p . --pretty --incremental", + "command": "tspc -p . --pretty --incremental", "files": [ "src/**/*.ts", "tsconfig.json", @@ -121,15 +115,24 @@ "clean": "if-file-deleted" }, "format": { - "command": "prettier --write \"+(src|test|schemas)/**/*.+(ts|js|json)|command-snapshot.json\"" + "command": "prettier --write \"+(src|test|schemas)/**/*.+(ts|js|json)|command-snapshot.json\"", + "files": [ + "src/**/*.ts", + "test/**/*.ts", + "schemas/**/*.json", + "command-snapshot.json", + ".prettier*" + ], + "output": [] }, "lint": { - "command": "eslint --color --cache --cache-location .eslintcache", + "command": "eslint src test --color --cache --cache-location .eslintcache", "files": [ "src/**/*.ts", "test/**/*.ts", - ".eslintignore", - ".eslintrc.js" + "messages/**", + "**/.eslint*", + "**/tsconfig.json" ], "output": [] }, @@ -137,26 +140,44 @@ "command": "tsc -p \"./test\" --pretty", "files": [ "test/**/*.ts", - "tsconfig.json", - "test/tsconfig.json" + "**/tsconfig.json" ], "output": [] }, "test:only": { "command": "nyc mocha \"test/**/*Test.ts\"", + "env": { + "FORCE_COLOR": "2" + }, "files": [ "test/**/*.ts", "src/**/*.ts", - "tsconfig.json", - "test/tsconfig.json" + "**/tsconfig.json", + ".mocha*", + "!*.nut.ts", + ".nycrc" ], "output": [] }, "test": { "dependencies": [ "test:only", - "test:compile" + "test:compile", + "link-check" ] + }, + "link-check": { + "command": "node -e \"process.exit(process.env.CI ? 0 : 1)\" || linkinator \"./*.md\" --skip \"examples/README.md|CHANGELOG.md|node_modules|test/|confluence.internal.salesforce.com|my.salesforce.com|%s\" --markdown --retry --directory-listing --verbosity error", + "files": [ + "./*.md", + "./examples/**/*.md", + "./messages/**/*.md", + "./!(CHANGELOG).md" + ], + "output": [] + }, + "compile-typedoc": { + "command": "tsc -p typedocExamples" } } -} \ No newline at end of file +} diff --git a/scripts/build.js b/scripts/build.js new file mode 100644 index 0000000000..423bcc1c36 --- /dev/null +++ b/scripts/build.js @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2023, 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 + */ +const { build } = require('esbuild'); +const esbuildPluginPino = require('esbuild-plugin-pino'); +const esbuildPluginTsc = require('esbuild-plugin-tsc'); +const { Generator } = require('npm-dts'); +const fs = require('fs'); +const CONSTANTS = require('./constants.json'); +const outputFolder = CONSTANTS.outputFilesFolder; +const tmpOutputFolder = CONSTANTS.outputFilesTmpFolder; + +new Generator({ + output: `${tmpOutputFolder}/index.d.ts`, +}).generate(); + +const sharedConfig = { + entryPoints: [`${outputFolder}/index.js`], + bundle: true, + // minify: true, + plugins: [ + esbuildPluginPino({ transports: ['pino-pretty'] }), + esbuildPluginTsc({ + tsconfigPath: './tsconfig.json', + }), + ], +}; + +(async () => { + const result = await build({ + ...sharedConfig, + // external: ['src/logger/transformStream.ts'], + platform: 'node', // for CJS + outdir: tmpOutputFolder, + }); + const filePath = `${tmpOutputFolder}/index.js`; + let bundledEntryPoint = fs.readFileSync(filePath, 'utf8'); + + const searchString = /\$\{process\.cwd\(\)\}\$\{require\("path"\)\.sep\}tmp-lib/g; + const replacementString = `\${__dirname}\${require("path").sep}`; + + bundledEntryPoint = bundledEntryPoint.replace(searchString, replacementString); + fs.writeFileSync(filePath, bundledEntryPoint, 'utf8'); + + await build({ + entryPoints: [`${outputFolder}/logger/transformStream.js`], + bundle: true, + minify: true, + outdir: tmpOutputFolder, + platform: 'node', // for CJS + plugins: [ + // esbuildPluginPino({ transports: ['pino-pretty'] }), + ], + }); +})(); diff --git a/scripts/constants.json b/scripts/constants.json new file mode 100644 index 0000000000..c67212e7ee --- /dev/null +++ b/scripts/constants.json @@ -0,0 +1,4 @@ +{ + "outputFilesTmpFolder": "tmp-lib", + "outputFilesFolder": "lib" +} diff --git a/scripts/postBundlingUpdate.js b/scripts/postBundlingUpdate.js new file mode 100644 index 0000000000..70e6ab78fa --- /dev/null +++ b/scripts/postBundlingUpdate.js @@ -0,0 +1,37 @@ +const fs = require('fs'); +const path = require('path'); + +// Path to the directories +const CONSTANTS = require('./constants.json'); +const outputDir = `./${CONSTANTS.outputFilesFolder}`; +const tmpOutputDir = `./${CONSTANTS.outputFilesTmpFolder}`; + +// Function to rename a directory +function renameBundledFolder() { + if (fs.existsSync(tmpOutputDir)) { + fs.rename(tmpOutputDir, outputDir, (err) => { + if (err) { + return console.error(`Error renaming folder: ${err}`); + } + console.log(`Folder renamed from ${tmpOutputDir} to ${outputDir}`); + }); + } else { + console.error(`${tmpOutputDir} does not exist, cannot rename.`); + } +} + +// delete the original compiled files +function deleteOriginalLib() { + if (fs.existsSync(outputDir)) { + fs.rm(outputDir, { recursive: true, force: true }, (err) => { + if (err) { + return console.error(`Error deleting folder: ${err}`); + } + console.log(`${outputDir} is deleted.`); + renameBundledFolder(); + }); + } +} + +// Start the process +deleteOriginalLib(); diff --git a/scripts/tsconfig.json b/scripts/tsconfig.json new file mode 100644 index 0000000000..c45ba33096 --- /dev/null +++ b/scripts/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "@salesforce/dev-config/tsconfig-strict", + "compilerOptions": { + "outDir": "../lib", + "resolveJsonModule": true, + "esModuleInterop": true, + "rootDir": "../src", + "plugins": [{ "transform": "../src/messageTransformer.ts" }] + }, + "include": ["../src/**/*.ts"] +} diff --git a/scripts/updateForBundling.js b/scripts/updateForBundling.js new file mode 100644 index 0000000000..f5015d2dea --- /dev/null +++ b/scripts/updateForBundling.js @@ -0,0 +1,114 @@ +const fs = require('fs'); +const path = require('path'); + +// Function to update package.json +function updatePackageJson() { + const packagePath = './package.json'; + + fs.readFile(packagePath, 'utf8', (err, data) => { + if (err) { + console.error(`Error reading package.json: ${err}`); + return; + } + + try { + const packageJson = JSON.parse(data); + + // Update package name if necessary + if (packageJson.name && packageJson.name === '@salesforce/core') { + packageJson.name = '@salesforce/core-bundle'; + } + + // Remove 'prepack' and 'prepare' scripts + if (packageJson.scripts) { + delete packageJson.scripts.prepack; + delete packageJson.scripts.prepare; + } + + // Remove 'exports' + if (packageJson.exports) { + delete packageJson.exports; + } + + fs.writeFile(packagePath, JSON.stringify(packageJson, null, 2), 'utf8', (writeErr) => { + if (writeErr) { + console.error(`Error writing to package.json: ${writeErr}`); + } else { + console.log('package.json updated successfully.'); + } + }); + } catch (parseErr) { + console.error(`Error parsing JSON in package.json: ${parseErr}`); + } + }); +} + +// Function to update logger.ts +function updateLoggerTs() { + const loggerPath = './src/logger/logger.ts'; + + fs.readFile(loggerPath, 'utf8', (err, data) => { + if (err) { + console.error(`Error reading logger.ts: ${err}`); + return; + } + + let updatedData = data.replace( + "target: path.join('..', '..', 'lib', 'logger', 'transformStream')", + "target: './transformStream'" + ); + + fs.writeFile(loggerPath, updatedData, 'utf8', (writeErr) => { + if (writeErr) { + console.error(`Error writing to logger.ts: ${writeErr}`); + } else { + console.log('Logger.ts updated successfully.'); + } + }); + }); +} + +function updateLoadMessagesParam() { + const dirs = ['./src', './test']; + function replaceTextInFile(filePath) { + const data = fs.readFileSync(filePath, 'utf8'); + const result = data.replace( + /Messages\.loadMessages\('@salesforce\/core'/g, + "Messages.loadMessages('@salesforce/core-bundle'" + ); + fs.writeFileSync(filePath, result, 'utf8'); + } + function traverseDirectory(directory) { + fs.readdirSync(directory).forEach((file) => { + const fullPath = path.join(directory, file); + if (fs.lstatSync(fullPath).isDirectory()) { + traverseDirectory(fullPath); + } else if (path.extname(fullPath) === '.ts') { + replaceTextInFile(fullPath); + } + }); + } + dirs.forEach((dir) => { + traverseDirectory(dir); + }); +} + +function addTestSetupToIndex() { + const indexPath = './src/index.ts'; + const testSetupExport = "export * from './testSetup';\n"; + fs.readFile(indexPath, 'utf8', (err, data) => { + fs.appendFile(indexPath, testSetupExport, 'utf8', (err) => { + if (err) { + console.error(`Error appending to file: ${err}`); + } else { + console.log('Content successfully added to the file.'); + } + }); + }); +} + +// Run the update functions +updatePackageJson(); +updateLoggerTs(); +updateLoadMessagesParam(); +addTestSetupToIndex(); diff --git a/src/config/aliasesConfig.ts b/src/config/aliasesConfig.ts deleted file mode 100644 index ad655fc64c..0000000000 --- a/src/config/aliasesConfig.ts +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (c) 2022, 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 { ConfigGroup } from './configGroup'; -import { ConfigContents, ConfigValue } from './configStore'; - -/** - * Different groups of aliases. Currently only support orgs. - */ -export enum AliasGroup { - ORGS = 'orgs', -} - -export class AliasesConfig extends ConfigGroup { - public static getDefaultOptions(): ConfigGroup.Options { - return { ...ConfigGroup.getOptions(AliasGroup.ORGS, 'alias.json'), isGlobal: true, isState: true }; - } - - // eslint-disable-next-line class-methods-use-this - protected setMethod(contents: ConfigContents, key: string, value?: ConfigValue): void { - contents[key] = value; - } -} diff --git a/src/config/authInfoConfig.ts b/src/config/authInfoConfig.ts index 9ce5abcde4..f901f6e32c 100644 --- a/src/config/authInfoConfig.ts +++ b/src/config/authInfoConfig.ts @@ -5,7 +5,7 @@ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause */ -import { AuthFields } from '../org'; +import { AuthFields } from '../org/authInfo'; import { ConfigFile } from './configFile'; /** diff --git a/src/config/config.ts b/src/config/config.ts index f4f8cf1387..dc8cac9442 100644 --- a/src/config/config.ts +++ b/src/config/config.ts @@ -5,18 +5,20 @@ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause */ -import { dirname as pathDirname, join as pathJoin } from 'path'; -import * as fs from 'fs'; -import { keyBy, parseJsonMap, set } from '@salesforce/kit'; -import { Dictionary, ensure, isString, JsonPrimitive, Nullable } from '@salesforce/ts-types'; +import { dirname as pathDirname, join as pathJoin } from 'node:path'; +import * as fs from 'node:fs'; +import { keyBy, parseJsonMap } from '@salesforce/kit'; +import { Dictionary, ensure, isString, Nullable } from '@salesforce/ts-types'; import { Global } from '../global'; -import { Logger } from '../logger'; +import { Logger } from '../logger/logger'; import { Messages } from '../messages'; import { validateApiVersion } from '../util/sfdc'; import { SfdcUrl } from '../util/sfdcUrl'; import { ORG_CONFIG_ALLOWED_PROPERTIES, OrgConfigProperties } from '../org/orgConfigProperties'; +import { Lifecycle } from '../lifecycleEvents'; import { ConfigFile } from './configFile'; -import { ConfigContents, ConfigValue } from './configStore'; +import { ConfigContents, ConfigValue, Key } from './configStackTypes'; +import { LWWState, stateFromContents } from './lwwMap'; Messages.importMessagesDirectory(__dirname); const messages = Messages.loadMessages('@salesforce/core', 'config'); @@ -27,7 +29,7 @@ const CONFIG_FILE_NAME = 'config.json'; /** * Interface for meta information about config properties */ -export interface ConfigPropertyMeta { +export type ConfigPropertyMeta = { /** * The config property name. */ @@ -63,12 +65,12 @@ export interface ConfigPropertyMeta { * Is only used if deprecated is set to true. */ newKey?: string; -} +}; /** * Config property input validation */ -export interface ConfigPropertyMetaInput { +export type ConfigPropertyMetaInput = { /** * Tests if the input value is valid and returns true if the input data is valid. * @@ -80,7 +82,7 @@ export interface ConfigPropertyMetaInput { * The message to return in the error if the validation fails. */ failedMessage: string | ((value: ConfigValue) => string); -} +}; export enum SfConfigProperties { /** @@ -94,7 +96,7 @@ export const SF_ALLOWED_PROPERTIES = [ key: SfConfigProperties.DISABLE_TELEMETRY, description: messages.getMessage(SfConfigProperties.DISABLE_TELEMETRY), input: { - validator: (value: ConfigValue): boolean => value == null || ['true', 'false'].includes(value.toString()), + validator: (value: ConfigValue): boolean => value == null || isBooleanOrBooleanString(value), failedMessage: messages.getMessage('invalidBooleanConfigValue'), }, }, @@ -246,7 +248,7 @@ export const SFDX_ALLOWED_PROPERTIES = [ deprecated: true, description: messages.getMessage(SfdxPropertyKeys.DISABLE_TELEMETRY), input: { - validator: (value: ConfigValue): boolean => value == null || ['true', 'false'].includes(value.toString()), + validator: (value: ConfigValue): boolean => value == null || isBooleanOrBooleanString(value), failedMessage: messages.getMessage('invalidBooleanConfigValue'), }, }, @@ -263,7 +265,7 @@ export const SFDX_ALLOWED_PROPERTIES = [ newKey: 'org-metadata-rest-deploy', deprecated: true, input: { - validator: (value: ConfigValue): boolean => value != null && ['true', 'false'].includes(value.toString()), + validator: (value: ConfigValue): boolean => value != null && isBooleanOrBooleanString(value), failedMessage: messages.getMessage('invalidBooleanConfigValue'), }, }, @@ -286,7 +288,10 @@ export const SFDX_ALLOWED_PROPERTIES = [ // Generic global config properties. Specific properties can be loaded like orgConfigProperties.ts. export const SfProperty: { [index: string]: ConfigPropertyMeta } = {}; -export type ConfigProperties = { [index: string]: JsonPrimitive }; +/* A very loose type to account for the possibility of plugins adding properties via configMeta. + * The class itself is doing runtime validation to check property keys and values. + */ +export type ConfigProperties = ConfigContents; /** * The files where sfdx config values are stored for projects and the global space. @@ -308,28 +313,24 @@ export class Config extends ConfigFile { ...ORG_CONFIG_ALLOWED_PROPERTIES, ]; - private sfdxConfig: SfdxConfig; + private sfdxPath?: string; public constructor(options?: ConfigFile.Options) { - super( - Object.assign( - { - isGlobal: false, - }, - options ?? {}, - { - // Don't let consumers of config override this. If they really really want to, - // they can extend this class. - isState: true, - filename: Config.getFileName(), - stateFolder: Global.SF_STATE_FOLDER, - } - ) - ); + super({ + ...{ isGlobal: false }, + ...(options ?? {}), + // Don't let consumers of config override this. If they really really want to, + // they can extend this class. + isState: true, + filename: Config.getFileName(), + stateFolder: Global.SF_STATE_FOLDER, + }); // Resolve the config path on creation. this.getPath(); - this.sfdxConfig = new SfdxConfig(this.options, this); + if (Global.SFDX_INTEROPERABILITY) { + this.sfdxPath = buildSfdxPath(this.options); + } } /** @@ -377,31 +378,33 @@ export class Config extends ConfigFile { * @param propertyName The name of the property to set. * @param value The property value. */ - public static async update(isGlobal: boolean, propertyName: string, value?: ConfigValue): Promise { + public static async update>( + isGlobal: boolean, + propertyName: K, + value?: ConfigProperties[K] + ): Promise { const config = await Config.create({ isGlobal }); - const content = await config.read(); + await config.read(); if (value == null) { - delete content[propertyName]; + config.unset(propertyName); } else { - set(content, propertyName, value); + config.set(propertyName, value); } - - return config.write(content); + return config.write(); } /** * Clear all the configured properties both local and global. */ public static async clear(): Promise { - const globalConfig = await Config.create({ isGlobal: true }); - globalConfig.clear(); - await globalConfig.write(); + const [globalConfig, localConfig] = await Promise.all([Config.create({ isGlobal: true }), Config.create()]); - const localConfig = await Config.create(); + globalConfig.clear(); localConfig.clear(); - await localConfig.write(); + + await Promise.all([globalConfig.write(), localConfig.write()]); } public static getPropertyConfigMeta(propertyName: string): Nullable { @@ -422,10 +425,12 @@ export class Config extends ConfigFile { */ public async read(force = true): Promise { try { - const config = await super.read(false, force); - // Merge .sfdx/sfdx-config.json and .sf/config.json - const merged = this.sfdxConfig.merge(config); - this.setContents(merged); + await super.read(false, force); + if (Global.SFDX_INTEROPERABILITY) { + // will exist if Global.SFDX_INTEROPERABILITY is enabled + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + this.contents.merge(stateFromSfdxFileSync(this.sfdxPath!, this)); + } await this.cryptProperties(false); return this.getContents(); } finally { @@ -434,10 +439,13 @@ export class Config extends ConfigFile { } public readSync(force = true): ConfigProperties { - const config = super.readSync(false, force); - // Merge .sfdx/sfdx-config.json and .sf/config.json - const merged = this.sfdxConfig.merge(config); - this.setContents(merged); + super.readSync(false, force); + if (Global.SFDX_INTEROPERABILITY) { + // will exist if Global.SFDX_INTEROPERABILITY is enabled + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + this.contents.merge(stateFromSfdxFileSync(this.sfdxPath!, this)); + } + return this.getContents(); } @@ -446,16 +454,17 @@ export class Config extends ConfigFile { * * @param newContents The new Config value to persist. */ - public async write(newContents?: ConfigProperties): Promise { - if (newContents != null) { - this.setContents(newContents); - } - + public async write(): Promise { await this.cryptProperties(true); + // super.write will merge the contents if the target file had newer properties await super.write(); - if (Global.SFDX_INTEROPERABILITY) await this.sfdxConfig.write(); + if (Global.SFDX_INTEROPERABILITY) { + // will exist if Global.SFDX_INTEROPERABILITY is enabled + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + await writeToSfdx(this.sfdxPath!, this.getContents()); + } await this.cryptProperties(false); return this.getContents(); @@ -483,17 +492,19 @@ export class Config extends ConfigFile { * @param key The property to set. * @param value The value of the property. */ - public set(key: string, value: JsonPrimitive): ConfigProperties { + public set>(key: K, value: ConfigProperties[K]): ConfigProperties { const property = Config.allowedProperties.find((allowedProp) => allowedProp.key === key); if (!property) { throw messages.createError('unknownConfigKey', [key]); } if (property.deprecated && property.newKey) { - throw messages.createError('deprecatedConfigKey', [key, property.newKey]); + // you're trying to set a deprecated key, but we'll set the new key instead + void Lifecycle.getInstance().emitWarning(messages.getMessage('deprecatedConfigKey', [key, property.newKey])); + return this.set(property.newKey, value); } - if (property.input) { + if (value !== undefined && property.input) { if (property.input?.validator(value)) { super.set(property.key, value); } else { @@ -526,7 +537,10 @@ export class Config extends ConfigFile { } if (property.deprecated && property.newKey) { - throw messages.createError('deprecatedConfigKey', [key, property.newKey]); + // you're trying to set a deprecated key, so we'll ALSO unset the new key + void Lifecycle.getInstance().emitWarning(messages.getMessage('deprecatedConfigKey', [key, property.newKey])); + super.unset(property.key); + return this.unset(property.newKey); } return super.unset(property.key); @@ -544,6 +558,10 @@ export class Config extends ConfigFile { const prop = Config.propertyConfigMap()[propertyName]; if (!prop) { + const newEquivalent = Config.allowedProperties.find((p) => p.newKey); + if (newEquivalent) { + return this.getPropertyConfig(newEquivalent.key); + } throw messages.createError('unknownConfigKey', [propertyName]); } return prop; @@ -579,97 +597,71 @@ export class Config extends ConfigFile { } } -export class SfdxConfig { - private sfdxPath: string; - public constructor(private options: ConfigFile.Options = {}, private config: Config) { - this.sfdxPath = this.getSfdxPath(); - } - - /** - * If Global.SFDX_INTEROPERABILITY is enabled, merge the sfdx config into the sf config - */ - public merge(config: ConfigProperties): ConfigProperties | undefined { - if (!Global.SFDX_INTEROPERABILITY) return config; - const sfdxConfig = this.readSync(); - - const sfdxPropKeys = Object.values(SfdxPropertyKeys) as string[]; - - // Get a list of config keys that are NOT provided by SfdxPropertyKeys - const nonSfdxPropKeys = Config.getAllowedProperties() - .filter((p) => !sfdxPropKeys.includes(p.key)) - .map((p) => p.key); - - // Remove any config from .sf that isn't also in .sfdx - // This handles the scenario where a config has been deleted - // from .sfdx and we want to mirror that change in .sf - for (const key of nonSfdxPropKeys) { - if (!sfdxConfig[key]) delete config[key]; - } - - return Object.assign(config, sfdxConfig); - } +/** + * convert from "new" to "old" config names + * - For example, `target-org` will be renamed to `defaultusername`. + */ +const translateToSfdx = (sfContents: ConfigProperties): ConfigProperties => + Object.fromEntries( + Object.entries(sfContents).map(([key, value]) => { + const propConfig = Config.getAllowedProperties().find((c) => c.newKey === key) ?? ({} as ConfigPropertyMeta); + return propConfig.deprecated && propConfig.newKey ? [propConfig.key, value] : [key, value]; + }) + ); - public async write(config = this.config.toObject()): Promise { - try { - const translated = this.translate(config as ConfigProperties, 'toOld'); - const sfdxPath = this.getSfdxPath(); - await fs.promises.mkdir(pathDirname(sfdxPath), { recursive: true }); - await fs.promises.writeFile(sfdxPath, JSON.stringify(translated, null, 2)); - } catch (error) { - /* Do nothing */ - } - } +/** + * convert from "old" to "new" config names + * - For example, `defaultusername` will be renamed to `target-org` + */ +const translateToSf = (sfdxContents: ConfigProperties, SfConfig: Config): ConfigProperties => + Object.fromEntries( + Object.entries(sfdxContents).map(([key, value]) => { + const propConfig = SfConfig.getPropertyConfig(key); + return propConfig.deprecated && propConfig.newKey ? [propConfig.newKey, value] : [key, value]; + }) + ); + +/** given the ConfigFile options, calculate the full path where the config file goes */ +const buildSfdxPath = (options: ConfigFile.Options): string => { + // Don't let users store config files in homedir without being in the state folder. + const configRootFolder = options.rootFolder ?? ConfigFile.resolveRootFolderSync(!!options.isGlobal); + const rootWithState = + options.isGlobal === true || options.isState === true + ? pathJoin(configRootFolder, Global.SFDX_STATE_FOLDER) + : configRootFolder; + + return pathJoin(rootWithState, SFDX_CONFIG_FILE_NAME); +}; - private readSync(): ConfigProperties { - try { - const contents = parseJsonMap(fs.readFileSync(this.getSfdxPath(), 'utf8')); - return this.translate(contents, 'toNew'); - } catch (error) { - /* Do nothing */ - return {}; - } +/** + * writes (in an unsafe way) the configuration file to the sfdx file location. + * Make sure you call ConfigFile.write and getContents so that the contents passed here are not cross-saving something + */ +const writeToSfdx = async (path: string, contents: ConfigProperties): Promise => { + try { + const translated = translateToSfdx(contents); + await fs.promises.mkdir(pathDirname(path), { recursive: true }); + await fs.promises.writeFile(path, JSON.stringify(translated, null, 2)); + } catch (e) { + const logger = Logger.childFromRoot('core:config:writeToSfdx'); + logger.debug(`Error writing to sfdx config file at ${path}: ${e instanceof Error ? e.message : ''}`); } - - private getSfdxPath(): string { - if (!this.sfdxPath) { - const stateFolder = Global.SFDX_STATE_FOLDER; - const fileName = SFDX_CONFIG_FILE_NAME; - - // Don't let users store config files in homedir without being in the state folder. - let configRootFolder = this.options.rootFolder - ? this.options.rootFolder - : ConfigFile.resolveRootFolderSync(!!this.options.isGlobal); - - if (this.options.isGlobal === true || this.options.isState === true) { - configRootFolder = pathJoin(configRootFolder, stateFolder); - } - - this.sfdxPath = pathJoin(configRootFolder, fileName); - } - return this.sfdxPath; +}; + +/** turn the sfdx config file into a LWWState based on its contents and its timestamp */ +const stateFromSfdxFileSync = (path: string, config: Config): LWWState => { + try { + const fileContents = fs.readFileSync(path, 'utf8'); + const mtimeNs = fs.statSync(path, { bigint: true }).mtimeNs; + const translatedContents = translateToSf(parseJsonMap(fileContents, path), config); + // get the file timestamp + return stateFromContents(translatedContents, mtimeNs); + } catch (e) { + const logger = Logger.childFromRoot('core:config:stateFromSfdxFileSync'); + logger.debug(`Error reading state from sfdx config file at ${path}: ${e instanceof Error ? e.message : ''}`); + return {}; } +}; - /** - * If toNew is specified: migrate all deprecated configs with a newKey to the newKey. - * - For example, defaultusername will be renamed to target-org. - * - * If toOld is specified: migrate all deprecated configs back to their original key. - * - For example, target-org will be renamed to defaultusername. - */ - private translate(contents: ConfigProperties, direction: 'toNew' | 'toOld'): ConfigProperties { - const translated = {} as ConfigProperties; - for (const [key, value] of Object.entries(contents)) { - const propConfig = - direction === 'toNew' - ? this.config.getPropertyConfig(key) - : Config.getAllowedProperties().find((c) => c.newKey === key) ?? ({} as ConfigPropertyMeta); - if (propConfig.deprecated && propConfig.newKey) { - const normalizedKey = direction === 'toNew' ? propConfig.newKey : propConfig.key; - translated[normalizedKey] = value; - } else { - translated[key] = value; - } - } - return translated; - } -} +const isBooleanOrBooleanString = (value: unknown): boolean => + (typeof value === 'string' && ['true', 'false'].includes(value)) || typeof value === 'boolean'; diff --git a/src/config/configAggregator.ts b/src/config/configAggregator.ts index 3fdffdf8d2..d8976ca942 100644 --- a/src/config/configAggregator.ts +++ b/src/config/configAggregator.ts @@ -8,8 +8,9 @@ import { AsyncOptionalCreatable, merge, sortBy } from '@salesforce/kit'; import { AnyJson, Dictionary, isArray, isJsonMap, JsonMap, Optional } from '@salesforce/ts-types'; import { Messages } from '../messages'; +import { Lifecycle } from '../lifecycleEvents'; import { EnvVars } from './envVars'; -import { Config, ConfigPropertyMeta, SfdxPropertyKeys, SFDX_ALLOWED_PROPERTIES } from './config'; +import { Config, ConfigPropertyMeta } from './config'; Messages.importMessagesDirectory(__dirname); const messages = Messages.loadMessages('@salesforce/core', 'config'); @@ -17,7 +18,7 @@ const messages = Messages.loadMessages('@salesforce/core', 'config'); /** * Information about a config property. */ -export interface ConfigInfo { +export type ConfigInfo = { /** * key The config key. */ @@ -56,7 +57,7 @@ export interface ConfigInfo { * True if the config property is deprecated. */ deprecated?: boolean; -} +}; /** * Aggregate global and local project config files, as well as environment variables for @@ -79,8 +80,8 @@ export class ConfigAggregator extends AsyncOptionalCreatable = {}; /** @@ -165,13 +166,22 @@ export class ConfigAggregator extends AsyncOptionalCreatable(key: string): Optional { - if (this.getAllowedProperties().some((element) => key === element.key)) { + const match = this.getAllowedProperties().find((element) => key === element.key); + if (match?.deprecated && match.newKey) { + void Lifecycle.getInstance().emitWarning(messages.getMessage('deprecatedConfigKey', [key, match.newKey])); + const newKeyMatch = this.getAllowedProperties().find((element) => match.newKey === element.key); + if (newKeyMatch) { + return (this.getConfig()[newKeyMatch.key] as T) ?? (this.getConfig()[match.key] as T); + } + } + if (this.getAllowedProperties().some((element) => key === element.key || key === element.newKey)) { return this.getConfig()[key] as T; } else { throw messages.createError('unknownConfigKey', [key]); @@ -180,6 +190,7 @@ export class ConfigAggregator extends AsyncOptionalCreatable key === element.key); if (match) { + if (match.deprecated && match.newKey) { + void Lifecycle.getInstance().emitWarning(messages.getMessage('deprecatedConfigKey', [key, match.newKey])); + const newKeyMatch = this.getAllowedProperties().find((element) => key === element.newKey); + if (newKeyMatch) { + return newKeyMatch ?? match; + } + } return match; - } else { - throw messages.createError('unknownConfigKey', [key]); } + const matchFromNewKey = this.getAllowedProperties().find((element) => key === element.newKey); + if (matchFromNewKey) { + return matchFromNewKey; + } + throw messages.createError('unknownConfigKey', [key]); } /** * Get a resolved config property. + * If a property is deprecated, it will try to use the the new key, if there is a config there. * * @param key The key of the property. * @param throwOnDeprecation True, if you want an error throw when reading a deprecated config @@ -203,15 +225,18 @@ export class ConfigAggregator extends AsyncOptionalCreatable location === ConfigAggregator.Location.LOCAL, isGlobal: () => location === ConfigAggregator.Location.GLOBAL, isEnvVar: () => location === ConfigAggregator.Location.ENVIRONMENT, @@ -230,6 +255,7 @@ export class ConfigAggregator extends AsyncOptionalCreatable { + // envs populate old and new automatically if (this.envVars[key] != null) { return ConfigAggregator.Location.ENVIRONMENT; } @@ -256,6 +282,7 @@ export class ConfigAggregator extends AsyncOptionalCreatable { + // TODO: make EnvVars always prefer the "new" regardless of CLI if (this.envVars[key] != null) { return `$${EnvVars.propertyToEnvName(key)}`; } @@ -280,7 +307,7 @@ export class ConfigAggregator extends AsyncOptionalCreatable this.getAllowedProperties().some((element) => key === element.key)) + .filter((key) => this.getAllowedProperties().some((element) => key === element.key || key === element.newKey)) .map((key) => this.getInfo(key)) .filter((info): info is ConfigInfo => !!info); return sortBy(infos, 'key'); @@ -307,6 +334,19 @@ export class ConfigAggregator extends AsyncOptionalCreatable { + const hasLocalWrites = this.localConfig + ?.getKeysByValue(key) + .map((k) => this.localConfig?.unset(k)) + .some(Boolean); + if (hasLocalWrites) await this.localConfig?.write(); + const hasGlobalWrites = this.globalConfig + ?.getKeysByValue(key) + .map((k) => this.globalConfig?.unset(k)) + .some(Boolean); + if (hasGlobalWrites) await this.globalConfig?.write(); + } + /** * Get the config properties that are environment variables. */ @@ -385,8 +425,7 @@ export class ConfigAggregator extends AsyncOptionalCreatable merge(acc, el), json); - return reduced; + return configs.filter(isJsonMap).reduce((acc: JsonMap, el: AnyJson) => merge(acc, el), json); } } @@ -415,84 +454,3 @@ export namespace ConfigAggregator { customConfigMeta?: ConfigPropertyMeta[]; }; } - -/** - * A ConfigAggregator that will work with deprecated config vars (e.g. defaultusername, apiVersion). - * We do NOT recommend using this class unless you absolutely have to. - * - * @deprecated - */ -export class SfdxConfigAggregator extends ConfigAggregator { - protected static instance: AsyncOptionalCreatable; - protected static encrypted = true; - - public static async create>( - this: new (options?: ConfigAggregator.Options) => T, - options: ConfigAggregator.Options = {} - ): Promise { - const customConfigMeta = options.customConfigMeta ?? []; - // org-metadata-rest-deploy has been moved to plugin-deploy-retrieve but we need to have a placeholder - // for it here since sfdx needs to know how to set the deprecated restDeploy config var. - const restDeploy = SFDX_ALLOWED_PROPERTIES.find((p) => p.key === SfdxPropertyKeys.REST_DEPLOY); - const orgRestDeploy = Object.assign({}, restDeploy, { key: 'org-metadata-rest-deploy', deprecated: false }); - options.customConfigMeta = [...customConfigMeta, orgRestDeploy]; - - let config = SfdxConfigAggregator.instance as SfdxConfigAggregator; - if (!config) { - config = SfdxConfigAggregator.instance = new this(options) as unknown as SfdxConfigAggregator; - await config.init(); - } - if (SfdxConfigAggregator.encrypted) { - await config.loadProperties(); - } - - if (options?.customConfigMeta) { - Config.addAllowedProperties(options.customConfigMeta); - } - return SfdxConfigAggregator.instance as T; - } - - public getPropertyMeta(key: string): ConfigPropertyMeta { - const match = this.getAllowedProperties().find((element) => key === element.key); - if (match?.deprecated && match?.newKey) { - return this.getPropertyMeta(match.newKey); - } else if (match) { - return match; - } else { - throw messages.createError('unknownConfigKey', [key]); - } - } - - public getPropertyValue(key: string): Optional { - return super.getPropertyValue(this.translate(key)); - } - - public getInfo(key: string): ConfigInfo { - const info = super.getInfo(this.translate(key)); - info.key = this.translate(info.key, 'toOld'); - return info; - } - - public getLocation(key: string): Optional { - return super.getLocation(this.translate(key)); - } - - public getPath(key: string): Optional { - return super.getPath(this.translate(key)); - } - - public getConfigInfo(): ConfigInfo[] { - return super.getConfigInfo().map((c) => { - c.key = this.translate(c.key, 'toOld'); - return c; - }); - } - - private translate(key: string, direction: 'toNew' | 'toOld' = 'toNew'): string { - const propConfig = - direction === 'toNew' - ? this.getPropertyMeta(key) - : Config.getAllowedProperties().find((c) => c.newKey === key) ?? ({} as ConfigPropertyMeta); - return propConfig.key || key; - } -} diff --git a/src/config/configFile.ts b/src/config/configFile.ts index 52d588a7fb..32c1302bbf 100644 --- a/src/config/configFile.ts +++ b/src/config/configFile.ts @@ -5,17 +5,19 @@ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause */ -import * as fs from 'fs'; -import { constants as fsConstants, Stats as fsStats } from 'fs'; -import { homedir as osHomedir } from 'os'; -import { dirname as pathDirname, join as pathJoin } from 'path'; -import { isPlainObject } from '@salesforce/ts-types'; +import * as fs from 'node:fs'; +import { constants as fsConstants, Stats as fsStats } from 'node:fs'; +import { homedir as osHomedir } from 'node:os'; +import { join as pathJoin } from 'node:path'; import { parseJsonMap } from '@salesforce/kit'; import { Global } from '../global'; -import { Logger } from '../logger'; +import { Logger } from '../logger/logger'; import { SfError } from '../sfError'; import { resolveProjectPath, resolveProjectPathSync } from '../util/internal'; -import { BaseConfigStore, ConfigContents } from './configStore'; +import { lockInit, lockInitSync } from '../util/fileLocking'; +import { BaseConfigStore } from './configStore'; +import { ConfigContents } from './configStackTypes'; +import { stateFromContents } from './lwwMap'; /** * Represents a json config file used to manage settings and state. Global config @@ -160,23 +162,30 @@ export class ConfigFile< // Only need to read config files once. They are kept up to date // internally and updated persistently via write(). if (!this.hasRead || force) { - this.logger.info(`Reading config file: ${this.getPath()}`); - const obj = parseJsonMap(await fs.promises.readFile(this.getPath(), 'utf8')); - this.setContentsFromObject(obj); + this.logger.debug( + `Reading config file: ${this.getPath()} because ${ + !this.hasRead ? 'hasRead is false' : 'force parameter is true' + }` + ); + + const obj = parseJsonMap

(await fs.promises.readFile(this.getPath(), 'utf8'), this.getPath()); + this.setContentsFromFileContents(obj, (await fs.promises.stat(this.getPath(), { bigint: true })).mtimeNs); } + // Necessarily set this even when an error happens to avoid infinite re-reading. + // To attempt another read, pass `force=true`. + this.hasRead = true; return this.getContents(); } catch (err) { + this.hasRead = true; if ((err as SfError).code === 'ENOENT') { if (!throwOnNotFound) { - this.setContents(); + this.setContentsFromFileContents({} as P); return this.getContents(); } } - throw err; - } finally { // Necessarily set this even when an error happens to avoid infinite re-reading. // To attempt another read, pass `force=true`. - this.hasRead = true; + throw err; } } @@ -194,15 +203,19 @@ export class ConfigFile< // Only need to read config files once. They are kept up to date // internally and updated persistently via write(). if (!this.hasRead || force) { - this.logger.info(`Reading config file: ${this.getPath()}`); - const obj = parseJsonMap(fs.readFileSync(this.getPath(), 'utf8')); - this.setContentsFromObject(obj); + this.logger.debug(`Reading config file: ${this.getPath()}`); + const obj = parseJsonMap

(fs.readFileSync(this.getPath(), 'utf8')); + this.setContentsFromFileContents(obj, fs.statSync(this.getPath(), { bigint: true }).mtimeNs); } + // Necessarily set this even when an error happens to avoid infinite re-reading. + // To attempt another read, pass `force=true`. + this.hasRead = true; return this.getContents(); } catch (err) { + this.hasRead = true; if ((err as SfError).code === 'ENOENT') { if (!throwOnNotFound) { - this.setContents(); + this.setContentsFromFileContents({} as P); return this.getContents(); } } @@ -220,19 +233,19 @@ export class ConfigFile< * * @param newContents The new contents of the file. */ - public async write(newContents?: P): Promise

{ - if (newContents) { - this.setContents(newContents); - } + public async write(): Promise

{ + const lockResponse = await lockInit(this.getPath()); + // lock the file. Returns an unlock function to call when done. try { - await fs.promises.mkdir(pathDirname(this.getPath()), { recursive: true }); + const fileTimestamp = (await fs.promises.stat(this.getPath(), { bigint: true })).mtimeNs; + const fileContents = parseJsonMap

(await fs.promises.readFile(this.getPath(), 'utf8'), this.getPath()); + this.logAndMergeContents(fileTimestamp, fileContents); } catch (err) { - throw SfError.wrap(err as Error); + this.handleWriteError(err); } - - this.logger.info(`Writing to config file: ${this.getPath()}`); - await fs.promises.writeFile(this.getPath(), JSON.stringify(this.toObject(), null, 2)); + // write the merged LWWMap to file + await lockResponse.writeAndUnlock(JSON.stringify(this.getContents(), null, 2)); return this.getContents(); } @@ -243,19 +256,19 @@ export class ConfigFile< * * @param newContents The new contents of the file. */ - public writeSync(newContents?: P): P { - if (isPlainObject(newContents)) { - this.setContents(newContents); - } - + public writeSync(): P { + const lockResponse = lockInitSync(this.getPath()); try { - fs.mkdirSync(pathDirname(this.getPath()), { recursive: true }); + // get the file modstamp. Do this after the lock acquisition in case the file is being written to. + const fileTimestamp = fs.statSync(this.getPath(), { bigint: true }).mtimeNs; + const fileContents = parseJsonMap

(fs.readFileSync(this.getPath(), 'utf8'), this.getPath()); + this.logAndMergeContents(fileTimestamp, fileContents); } catch (err) { - throw SfError.wrap(err as Error); + this.handleWriteError(err); } - this.logger.info(`Writing to config file: ${this.getPath()}`); - fs.writeFileSync(this.getPath(), JSON.stringify(this.toObject(), null, 2)); + // write the merged LWWMap to file + lockResponse.writeAndUnlock(JSON.stringify(this.getContents(), null, 2)); return this.getContents(); } @@ -366,13 +379,34 @@ export class ConfigFile< // Read the file, which also sets the path and throws any errors around project paths. await this.read(this.options.throwOnNotFound); } + + // method exists to share code between write() and writeSync() + private logAndMergeContents(fileTimestamp: bigint, fileContents: P): void { + this.logger.debug(`Existing file contents on filesystem (timestamp: ${fileTimestamp.toString()}`, fileContents); + this.logger.debug('Contents in configFile in-memory', this.getContents()); + + // read the file contents into a LWWMap using the modstamp + const stateFromFile = stateFromContents

(fileContents, fileTimestamp); + // merge the new contents into the in-memory LWWMap + this.contents.merge(stateFromFile); + this.logger.debug('Result from merge', this.getContents()); + } + + // shared error handling for both write() and writeSync() + private handleWriteError(err: unknown): void { + if (err instanceof Error && err.message.includes('ENOENT')) { + this.logger.debug(`No file found at ${this.getPath()}. Write will create it.`); + } else { + throw err; + } + } } export namespace ConfigFile { /** * The interface for Config options. */ - export interface Options extends BaseConfigStore.Options { + export type Options = { /** * The root folder where the config file is stored. */ @@ -401,5 +435,5 @@ export namespace ConfigFile { * Indicates if init should throw if the corresponding config file is not found. */ throwOnNotFound?: boolean; - } + } & BaseConfigStore.Options; } diff --git a/src/config/configGroup.ts b/src/config/configGroup.ts deleted file mode 100644 index 6f153eb6a3..0000000000 --- a/src/config/configGroup.ts +++ /dev/null @@ -1,252 +0,0 @@ -/* - * 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 { definiteEntriesOf, definiteValuesOf, Dictionary, getJsonMap, JsonMap, Optional } from '@salesforce/ts-types'; -import { SfError } from '../sfError'; -import { ConfigFile } from './configFile'; -import { ConfigContents, ConfigEntry, ConfigValue } from './configStore'; - -/** - * A config file that stores config values in groups. e.g. to store different config - * values for different commands, without having manually manipulate the config. - * - * **Note:** All config methods are overwritten to use the {@link ConfigGroup.setDefaultGroup}. - * - * ``` - * class MyPluginConfig extends ConfigGroup { - * public static getFileName(): string { - * return 'myPluginConfigFilename.json'; - * } - * } - * const myConfig = await MyPluginConfig.create(ConfigGroup.getOptions('all')); - * myConfig.setDefaultGroup('myCommand'); // Can be set in your command's init. - * myConfig.set('mykey', 'myvalue'); // Sets 'myKey' for the 'myCommand' group. - * myConfig.setInGroup('myKey', 'myvalue', 'all'); // Manually set in another group. - * await myConfig.write(); - * ``` - */ -export class ConfigGroup extends ConfigFile { - protected defaultGroup = 'default'; - /** - * Get ConfigGroup specific options, such as the default group. - * - * @param defaultGroup The default group to use when creating the config. - * @param filename The filename of the config file. Uses the static {@link getFileName} by default. - */ - public static getOptions(defaultGroup: string, filename?: string): ConfigGroup.Options { - const options: ConfigFile.Options = ConfigFile.getDefaultOptions(true, filename); - const configGroupOptions: ConfigGroup.Options = { defaultGroup }; - Object.assign(configGroupOptions, options); - return configGroupOptions; - } - - /** - * Sets the default group for all {@link BaseConfigStore} methods to use. - * **Throws** *{@link SfError}{ name: 'MissingGroupName' }* The group parameter is null or undefined. - * - * @param group The group. - */ - public setDefaultGroup(group: string): void { - if (!group) { - throw new SfError('null or undefined group', 'MissingGroupName'); - } - - this.defaultGroup = group; - } - - /** - * Set a group of entries in a bulk save. Returns The new properties that were saved. - * - * @param newEntries An object representing the aliases to set. - * @param group The group the property belongs to. - */ - public async updateValues(newEntries: Dictionary, group?: string): Promise> { - // Make sure the contents are loaded - await this.read(); - Object.entries(newEntries).forEach(([key, val]) => this.setInGroup(key, val, group ?? this.defaultGroup)); - await this.write(); - return newEntries; - } - - /** - * Set a value on a group. Returns the promise resolved when the value is set. - * - * @param key The key. - * @param value The value. - * @param group The group. - */ - public async updateValue(key: string, value: ConfigValue, group?: string): Promise { - // Make sure the content is loaded - await this.read(); - this.setInGroup(key, value, group ?? this.defaultGroup); - // Then save it - await this.write(); - } - - /** - * Gets an array of key value pairs. - */ - public entries(): ConfigEntry[] { - const group = this.getGroup(); - if (group) { - return definiteEntriesOf(group); - } - return []; - } - - /** - * Returns a specified element from ConfigGroup. Returns the associated value. - * - * @param key The key. - */ - public get(key: string): Optional { - return this.getInGroup(key); - } - - /** - * Returns a boolean if an element with the specified key exists in the default group. - * - * @param {string} key The key. - */ - public has(key: string): boolean { - const group = this.getGroup(); - return !!group && super.has(this.defaultGroup) && !!group[key]; - } - - /** - * Returns an array of the keys from the default group. - */ - public keys(): string[] { - return Object.keys(this.getGroup(this.defaultGroup) ?? {}); - } - - /** - * Returns an array of the values from the default group. - */ - public values(): ConfigValue[] { - return definiteValuesOf(this.getGroup(this.defaultGroup) ?? {}); - } - - /** - * Add or updates an element with the specified key in the default group. - * - * @param key The key. - * @param value The value. - */ - public set(key: string, value: ConfigValue): ConfigContents { - return this.setInGroup(key, value, this.defaultGroup); - } - - /** - * Removes an element with the specified key from the default group. Returns `true` if the item was deleted. - * - * @param key The key. - */ - public unset(key: string): boolean { - const groupContents = this.getGroup(this.defaultGroup); - if (groupContents) { - delete groupContents[key]; - return true; - } - return false; - } - - /** - * Remove all key value pairs from the default group. - */ - public clear(): void { - delete this.getContents()[this.defaultGroup]; - } - - /** - * Get all config contents for a group. - * - * @param {string} [group = 'default'] The group. - */ - public getGroup(group = this.defaultGroup): Optional { - return getJsonMap(this.getContents(), group) ?? undefined; - } - - /** - * Returns the value associated to the key and group, or undefined if there is none. - * - * @param key The key. - * @param group The group. Defaults to the default group. - */ - public getInGroup(key: string, group?: string): Optional { - const groupContents = this.getGroup(group); - if (groupContents) { - return groupContents[key]; - } - } - - /** - * Convert the config object to a json object. - */ - public toObject(): JsonMap { - return this.getContents(); - } - - /** - * Convert an object to a {@link ConfigContents} and set it as the config contents. - * - * @param {object} obj The object. - */ - // eslint-disable-next-line @typescript-eslint/ban-types - public setContentsFromObject(obj: U): void { - const contents = new Map(Object.entries(obj)); - Array.from(contents.entries()).forEach(([groupKey, groupContents]) => { - if (groupContents) { - Object.entries(groupContents).forEach(([contentKey, contentValue]) => { - // eslint-disable-next-line @typescript-eslint/no-unsafe-argument - this.setInGroup(contentKey, contentValue, groupKey); - }); - } - }); - } - - /** - * Sets the value for the key and group in the config object. - * - * @param key The key. - * @param value The value. - * @param group The group. Uses the default group if not specified. - */ - public setInGroup(key: string, value?: ConfigValue, group?: string): ConfigContents { - group = group ?? this.defaultGroup; - - if (!super.has(group)) { - super.set(group, {}); - } - const content = this.getGroup(group) ?? {}; - this.setMethod(content, key, value); - - return content; - } - - /** - * Initialize the asynchronous dependencies. - */ - public async init(): Promise { - await super.init(); - if (this.options.defaultGroup) { - this.setDefaultGroup(this.options.defaultGroup); - } - } -} - -export namespace ConfigGroup { - /** - * Options when creating the config file. - */ - export interface Options extends ConfigFile.Options { - /** - * The default group for properties to go into. - */ - defaultGroup?: string; - } -} diff --git a/src/config/configStackTypes.ts b/src/config/configStackTypes.ts new file mode 100644 index 0000000000..420c76f29d --- /dev/null +++ b/src/config/configStackTypes.ts @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2023, 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 { Dictionary, AnyJson } from '@salesforce/ts-types'; + +export type Key

= Extract; +/** + * The allowed types stored in a config store. + */ + +export type ConfigValue = AnyJson; +/** + * The type of entries in a config store defined by the key and value type of {@link ConfigContents}. + */ + +export type ConfigEntry = [string, ConfigValue]; +/** + * The type of content a config stores. + */ + +export type ConfigContents = Dictionary; diff --git a/src/config/configStore.ts b/src/config/configStore.ts index 52b4eb348a..cdd5ede982 100644 --- a/src/config/configStore.ts +++ b/src/config/configStore.ts @@ -5,46 +5,24 @@ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause */ -import { AsyncOptionalCreatable, cloneJson, set } from '@salesforce/kit'; -import { isPlainObject } from '@salesforce/ts-types'; -import { - AnyJson, - definiteEntriesOf, - definiteValuesOf, - Dictionary, - get, - isJsonMap, - isString, - JsonMap, - Optional, -} from '@salesforce/ts-types'; +import { AsyncOptionalCreatable } from '@salesforce/kit'; +import { entriesOf, isPlainObject } from '@salesforce/ts-types'; +import { definiteEntriesOf, definiteValuesOf, isJsonMap, isString, JsonMap, Optional } from '@salesforce/ts-types'; import { Crypto } from '../crypto/crypto'; import { SfError } from '../sfError'; - -/** - * The allowed types stored in a config store. - */ -export type ConfigValue = AnyJson; - -/** - * The type of entries in a config store defined by the key and value type of {@link ConfigContents}. - */ -export type ConfigEntry = [string, ConfigValue]; - -/** - * The type of content a config stores. - */ -export type ConfigContents = Dictionary; - -export type Key

= Extract; +import { nowBigInt } from '../util/time'; +import { LWWMap, stateFromContents } from './lwwMap'; +import { ConfigContents, ConfigEntry, ConfigValue, Key } from './configStackTypes'; /** * An interface for a config object with a persistent store. */ -export interface ConfigStore

{ +export type ConfigStore

= { // Map manipulation methods entries(): ConfigEntry[]; + // NEXT_RELEASE: update types to specify return can be P[K] | undefined get>(key: K, decrypt: boolean): P[K]; + // NEXT_RELEASE: update types to specify return can be T | undefined get(key: string, decrypt: boolean): T; getKeysByValue(value: ConfigValue): Array>; has(key: string): boolean; @@ -59,12 +37,10 @@ export interface ConfigStore

{ values(): ConfigValue[]; forEach(actionFn: (key: string, value: ConfigValue) => void): void; - awaitEach(actionFn: (key: string, value: ConfigValue) => Promise): Promise; // Content methods getContents(): P; - setContents(contents?: P): void; -} +}; /** * An abstract class that implements all the config management functions but @@ -85,7 +61,7 @@ export abstract class BaseConfigStore< protected crypto?: Crypto; // Initialized in setContents - private contents!: P; + protected contents = new LWWMap

(); private statics = this.constructor as typeof BaseConfigStore; /** @@ -104,30 +80,34 @@ export abstract class BaseConfigStore< * Returns an array of {@link ConfigEntry} for each element in the config. */ public entries(): ConfigEntry[] { - return definiteEntriesOf(this.contents); + return definiteEntriesOf(this.contents.value ?? {}); } /** * Returns the value associated to the key, or undefined if there is none. * - * @param key The key. Supports query key like `a.b[0]`. + * @param key The key (object property) * @param decrypt If it is an encrypted key, decrypt the value. * If the value is an object, a clone will be returned. */ + // NEXT_RELEASE: update types to specify return can be | undefined public get>(key: K, decrypt?: boolean): P[K]; + // NEXT_RELEASE: update types to specify return can be | undefined + // NEXT_RELEASE: consider getting rid of ConfigValue and letting it just use the Key<> approach public get(key: string, decrypt?: boolean): V; + // NEXT_RELEASE: update types to specify return can be | undefined public get>(key: K | string, decrypt = false): P[K] | ConfigValue { - const k = key as string; - let value = this.getMethod(this.contents, k); + const rawValue = this.contents.get(key as K); if (this.hasEncryption() && decrypt) { - if (isJsonMap(value)) { - value = this.recursiveDecrypt(cloneJson(value), k); - } else if (this.isCryptoKey(k)) { - value = this.decrypt(value); + if (isJsonMap(rawValue)) { + return this.recursiveDecrypt(structuredClone(rawValue), key); + } else if (this.isCryptoKey(key)) { + return this.decrypt(rawValue) as P[K] | ConfigValue; } } - return value as P[K]; + // NEXT_RELEASE: update types to specify return can be | undefined + return rawValue as P[K] | ConfigValue; } /** @@ -144,70 +124,68 @@ export abstract class BaseConfigStore< /** * Returns a boolean asserting whether a value has been associated to the key in the config object or not. * - * @param key The key. Supports query key like `a.b[0]`. */ public has(key: string): boolean { - return !!this.getMethod(this.contents, key); + return this.contents.has(key) ?? false; } /** * Returns an array that contains the keys for each element in the config object. */ public keys(): Array> { - return Object.keys(this.contents) as Array>; + return Object.keys(this.contents.value ?? {}) as Array>; } /** * Sets the value for the key in the config object. This will override the existing value. * To do a partial update, use {@link BaseConfigStore.update}. * - * @param key The key. Supports query key like `a.b[0]`. + * @param key The key. * @param value The value. */ - public set>(key: K, value: P[K]): void; - public set(key: string, value: V): void; - public set>(key: K | string, value: P[K] | ConfigValue): void { + public set>(key: K, value: P[K]): void { + let resolvedValue = value; if (this.hasEncryption()) { - if (isJsonMap(value)) { - value = this.recursiveEncrypt(value, key as string) as P[K]; + if (isJsonMap(resolvedValue)) { + resolvedValue = this.recursiveEncrypt(resolvedValue, key as string) as P[K]; } else if (this.isCryptoKey(key as string)) { - value = this.encrypt(value) as P[K]; + resolvedValue = this.encrypt(resolvedValue) as P[K]; } } - this.setMethod(this.contents, key as string, value); + // set(key, undefined) means unset + if (resolvedValue === undefined) { + this.unset(key); + } else { + this.contents.set(key, resolvedValue); + } } /** * Updates the value for the key in the config object. If the value is an object, it * will be merged with the existing object. * - * @param key The key. Supports query key like `a.b[0]`. + * @param key The key. * @param value The value. */ - public update>(key: K, value: Partial): void; - public update(key: string, value: Partial): void; - public update>(key: K | string, value: Partial | Partial): void { + public update>(key: K, value: Partial): void { const existingValue = this.get(key, true); if (isPlainObject(existingValue) && isPlainObject(value)) { - value = Object.assign({}, existingValue, value); + const mergedValue = Object.assign({}, existingValue, value); + this.set(key, mergedValue as P[K]); + } else { + this.set(key, value as P[K]); } - this.set(key, value); } /** * Returns `true` if an element in the config object existed and has been removed, or `false` if the element does not * exist. {@link BaseConfigStore.has} will return false afterwards. * - * @param key The key. Supports query key like `a.b[0]`. + * @param key The key */ - public unset(key: string): boolean { + public unset>(key: K): boolean { if (this.has(key)) { - if (this.contents[key]) { - delete this.contents[key]; - } else { - // It is a query key, so just set it to undefined - this.setMethod(this.contents, key, undefined); - } + this.contents.delete(key); return true; } return false; @@ -217,24 +195,24 @@ export abstract class BaseConfigStore< * Returns `true` if all elements in the config object existed and have been removed, or `false` if all the elements * do not exist (some may have been removed). {@link BaseConfigStore.has(key)} will return false afterwards. * - * @param keys The keys. Supports query keys like `a.b[0]`. + * @param keys The keys */ - public unsetAll(keys: string[]): boolean { - return keys.reduce((val: boolean, key) => val && this.unset(key), true); + public unsetAll(keys: Array>): boolean { + return keys.map((key) => this.unset(key)).every(Boolean); } /** * Removes all key/value pairs from the config object. */ public clear(): void { - this.contents = {} as P; + this.keys().map((key) => this.unset(key)); } /** * Returns an array that contains the values for each element in the config object. */ public values(): ConfigValue[] { - return definiteValuesOf(this.contents); + return definiteValuesOf(this.contents.value ?? {}); } /** @@ -247,26 +225,11 @@ export abstract class BaseConfigStore< * @param decrypt: decrypt all data in the config. A clone of the data will be returned. * */ - public getContents(decrypt = false): P { - if (!this.contents) { - this.setContents(); - } + public getContents(decrypt = false): Readonly

{ if (this.hasEncryption() && decrypt) { - return this.recursiveDecrypt(cloneJson(this.contents)) as P; - } - return this.contents; - } - - /** - * Sets the entire config contents. - * - * @param contents The contents. - */ - public setContents(contents: P = {} as P): void { - if (this.hasEncryption()) { - contents = this.recursiveEncrypt(contents); + return this.recursiveDecrypt(structuredClone(this.contents?.value ?? {})) as P; } - this.contents = contents; + return this.contents?.value ?? ({} as P); } /** @@ -275,26 +238,7 @@ export abstract class BaseConfigStore< * @param {function} actionFn The function `(key: string, value: ConfigValue) => void` to be called for each element. */ public forEach(actionFn: (key: string, value: ConfigValue) => void): void { - const entries = this.entries(); - for (const entry of entries) { - actionFn(entry[0], entry[1]); - } - } - - /** - * Asynchronously invokes `actionFn` once for each key-value pair present in the config object. - * - * @param {function} actionFn The function `(key: string, value: ConfigValue) => Promise` to be called for - * each element. - * @returns {Promise} - */ - public async awaitEach(actionFn: (key: string, value: ConfigValue) => Promise): Promise { - const entries = this.entries(); - for (const entry of entries) { - // prevent ConfigFile collision bug - // eslint-disable-next-line no-await-in-loop - await actionFn(entry[0], entry[1]); - } + this.entries().map((entry) => actionFn(entry[0], entry[1])); } /** @@ -302,7 +246,7 @@ export abstract class BaseConfigStore< * Same as calling {@link ConfigStore.getContents} */ public toObject(): JsonMap { - return this.contents; + return this.contents.value ?? {}; } /** @@ -310,15 +254,37 @@ export abstract class BaseConfigStore< * * @param obj The object. */ - public setContentsFromObject(obj: U): void { - this.contents = (this.hasEncryption() ? this.recursiveEncrypt(obj) : {}) as P; - Object.entries(obj).forEach(([key, value]) => { - this.setMethod(this.contents, key, value); + public setContentsFromObject(obj: P): void { + const objForWrite = this.hasEncryption() ? this.recursiveEncrypt(obj) : obj; + entriesOf(objForWrite).map(([key, value]) => { + this.set(key, value); + }); + } + + /** + * Keep ConfigFile concurrency-friendly. + * Avoid using this unless you're reading the file for the first time + * and guaranteed to no be cross-saving existing contents + * */ + protected setContentsFromFileContents(contents: P, timestamp?: bigint): void { + const state = stateFromContents(contents, timestamp ?? nowBigInt()); + this.contents = new LWWMap

(state); + } + + /** + * Sets the entire config contents. + * + * @param contents The contents. + */ + protected setContents(contents: P = {} as P): void { + const maybeEncryptedContents = this.hasEncryption() ? this.recursiveEncrypt(contents) : contents; + entriesOf(maybeEncryptedContents).map(([key, value]) => { + this.contents.set(key, value); }); } protected getEncryptedKeys(): Array { - return [...(this.options?.encryptedKeys ?? []), ...(this.statics?.encryptedKeys || [])]; + return [...(this.options?.encryptedKeys ?? []), ...(this.statics?.encryptedKeys ?? [])]; } /** @@ -330,21 +296,6 @@ export abstract class BaseConfigStore< return this.getEncryptedKeys().length > 0; } - // Allows extended classes the ability to override the set method. i.e. maybe they want - // nested object set from kit. - // eslint-disable-next-line class-methods-use-this - protected setMethod(contents: ConfigContents, key: string, value?: ConfigValue): void { - set(contents, key, value); - } - - // Allows extended classes the ability to override the get method. i.e. maybe they want - // nested object get from ts-types. - // NOTE: Key must stay string to be reliably overwritten. - // eslint-disable-next-line class-methods-use-this - protected getMethod(contents: ConfigContents, key: string): Optional { - return get(contents, key) as ConfigValue; - } - // eslint-disable-next-line class-methods-use-this protected initialContents(): P { return {} as P; @@ -411,18 +362,18 @@ export abstract class BaseConfigStore< if (!this.crypto) throw new SfError('crypto is not initialized', 'CryptoNotInitializedError'); if (!isString(value)) throw new SfError( - `can only encrypt strings but found: ${typeof value} : ${value.toString()}`, + `can only encrypt strings but found: ${typeof value} : ${JSON.stringify(value)}`, 'InvalidCryptoValueError' ); return this.crypto.isEncrypted(value) ? value : this.crypto.encrypt(value); } - protected decrypt(value: unknown): Optional { + protected decrypt(value: unknown): string | undefined { if (!value) return; if (!this.crypto) throw new SfError('crypto is not initialized', 'CryptoNotInitializedError'); if (!isString(value)) throw new SfError( - `can only encrypt strings but found: ${typeof value} : ${value.toString()}`, + `can only encrypt strings but found: ${typeof value} : ${JSON.stringify(value)}`, 'InvalidCryptoValueError' ); return this.crypto.isEncrypted(value) ? this.crypto.decrypt(value) : value; @@ -468,6 +419,8 @@ export abstract class BaseConfigStore< this.recursiveCrypto(method, [...keyPaths, key, newKey], value); } } else if (this.isCryptoKey(key)) { + // I think this side effect is intentional + // eslint-disable-next-line no-param-reassign data[key] = method(value); } } @@ -480,7 +433,7 @@ export namespace BaseConfigStore { /** * Options for the config store. */ - export interface Options { + export type Options = { /** * Keys to encrypt. * @@ -490,5 +443,5 @@ export namespace BaseConfigStore { * defining a new class. */ encryptedKeys?: Array; - } + }; } diff --git a/src/config/envVars.ts b/src/config/envVars.ts index ca5b5dd3b7..56c2c1cae7 100644 --- a/src/config/envVars.ts +++ b/src/config/envVars.ts @@ -4,15 +4,16 @@ * 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 { join as pathJoin } from 'path'; +import { join as pathJoin } from 'node:path'; import { Dictionary, Nullable } from '@salesforce/ts-types'; import { camelCase, snakeCase } from 'change-case'; import { Env } from '@salesforce/kit'; import { Messages } from '../messages'; -import { Global } from '../global'; +import { Lifecycle } from '../lifecycleEvents'; Messages.importMessagesDirectory(pathJoin(__dirname)); const messages = Messages.loadMessages('@salesforce/core', 'envVars'); + export enum EnvironmentVariable { 'FORCE_OPEN_URL' = 'FORCE_OPEN_URL', 'FORCE_SHOW_SPINNER' = 'FORCE_SHOW_SPINNER', @@ -24,7 +25,6 @@ export enum EnvironmentVariable { 'SFDX_ACCESS_TOKEN' = 'SFDX_ACCESS_TOKEN', 'SFDX_API_VERSION' = 'SFDX_API_VERSION', 'SFDX_AUDIENCE_URL' = 'SFDX_AUDIENCE_URL', - 'SFDX_CODE_COVERAGE_REQUIREMENT' = 'SFDX_CODE_COVERAGE_REQUIREMENT', 'SFDX_CONTENT_TYPE' = 'SFDX_CONTENT_TYPE', 'SFDX_DEFAULTDEVHUBUSERNAME' = 'SFDX_DEFAULTDEVHUBUSERNAME', 'SFDX_DEFAULTUSERNAME' = 'SFDX_DEFAULTUSERNAME', @@ -61,7 +61,6 @@ export enum EnvironmentVariable { 'SF_ACCESS_TOKEN' = 'SF_ACCESS_TOKEN', 'SF_ORG_API_VERSION' = 'SF_ORG_API_VERSION', 'SF_AUDIENCE_URL' = 'SF_AUDIENCE_URL', - 'SF_CODE_COVERAGE_REQUIREMENT' = 'SF_CODE_COVERAGE_REQUIREMENT', 'SF_CONTENT_TYPE' = 'SF_CONTENT_TYPE', 'SF_DISABLE_AUTOUPDATE' = 'SF_DISABLE_AUTOUPDATE', 'SF_AUTOUPDATE_DISABLE' = 'SF_AUTOUPDATE_DISABLE', @@ -90,9 +89,11 @@ export enum EnvironmentVariable { 'SF_UPDATE_INSTRUCTIONS' = 'SF_UPDATE_INSTRUCTIONS', 'SF_INSTALLER' = 'SF_INSTALLER', 'SF_ENV' = 'SF_ENV', + 'SF_CAPITALIZE_RECORD_TYPES' = 'SF_CAPITALIZE_RECORD_TYPES', } type EnvMetaData = { description: string; + /** the env has been renamed. synonymOf points to the new env */ synonymOf: Nullable; }; @@ -145,10 +146,6 @@ export const SUPPORTED_ENV_VARS: EnvType = { description: getMessage(EnvironmentVariable.SFDX_AUDIENCE_URL), synonymOf: EnvironmentVariable.SF_AUDIENCE_URL, }, - [EnvironmentVariable.SFDX_CODE_COVERAGE_REQUIREMENT]: { - description: getMessage(EnvironmentVariable.SFDX_CODE_COVERAGE_REQUIREMENT), - synonymOf: EnvironmentVariable.SF_CODE_COVERAGE_REQUIREMENT, - }, [EnvironmentVariable.SFDX_CONTENT_TYPE]: { description: getMessage(EnvironmentVariable.SFDX_CONTENT_TYPE), synonymOf: EnvironmentVariable.SF_CONTENT_TYPE, @@ -241,7 +238,8 @@ export const SUPPORTED_ENV_VARS: EnvType = { }, [EnvironmentVariable.SFDX_REST_DEPLOY]: { description: getMessage(EnvironmentVariable.SFDX_REST_DEPLOY), - synonymOf: null, + // this is not an "official" env var, but it supports the env=>config naming convention for the config that lives in plugin-deploy-retrieve + synonymOf: 'SF_ORG_METADATA_REST_DEPLOY', }, [EnvironmentVariable.SFDX_SOURCE_MEMBER_POLLING_TIMEOUT]: { description: getMessage(EnvironmentVariable.SFDX_SOURCE_MEMBER_POLLING_TIMEOUT), @@ -277,11 +275,11 @@ export const SUPPORTED_ENV_VARS: EnvType = { }, [EnvironmentVariable.SF_TARGET_ORG]: { description: getMessage(EnvironmentVariable.SF_TARGET_ORG), - synonymOf: EnvironmentVariable.SFDX_DEFAULTUSERNAME, + synonymOf: null, }, [EnvironmentVariable.SF_TARGET_DEV_HUB]: { description: getMessage(EnvironmentVariable.SF_TARGET_DEV_HUB), - synonymOf: EnvironmentVariable.SFDX_DEFAULTDEVHUBUSERNAME, + synonymOf: null, }, // sf vars [EnvironmentVariable.SF_ACCESS_TOKEN]: { @@ -290,16 +288,12 @@ export const SUPPORTED_ENV_VARS: EnvType = { }, [EnvironmentVariable.SF_ORG_API_VERSION]: { description: getMessage(EnvironmentVariable.SF_ORG_API_VERSION), - synonymOf: EnvironmentVariable.SFDX_API_VERSION, + synonymOf: null, }, [EnvironmentVariable.SF_AUDIENCE_URL]: { description: getMessage(EnvironmentVariable.SF_AUDIENCE_URL), synonymOf: null, }, - [EnvironmentVariable.SF_CODE_COVERAGE_REQUIREMENT]: { - description: getMessage(EnvironmentVariable.SF_CODE_COVERAGE_REQUIREMENT), - synonymOf: null, - }, [EnvironmentVariable.SF_CONTENT_TYPE]: { description: getMessage(EnvironmentVariable.SF_CONTENT_TYPE), synonymOf: null, @@ -342,7 +336,7 @@ export const SUPPORTED_ENV_VARS: EnvType = { }, [EnvironmentVariable.SF_DISABLE_LOG_FILE]: { description: getMessage(EnvironmentVariable.SF_DISABLE_LOG_FILE), - synonymOf: EnvironmentVariable.SFDX_DISABLE_LOG_FILE, + synonymOf: null, }, [EnvironmentVariable.SF_LOG_LEVEL]: { description: getMessage(EnvironmentVariable.SF_LOG_LEVEL), @@ -358,7 +352,7 @@ export const SUPPORTED_ENV_VARS: EnvType = { }, [EnvironmentVariable.SF_ORG_MAX_QUERY_LIMIT]: { description: getMessage(EnvironmentVariable.SF_ORG_MAX_QUERY_LIMIT), - synonymOf: EnvironmentVariable.SFDX_MAX_QUERY_LIMIT, + synonymOf: null, }, [EnvironmentVariable.SF_MDAPI_TEMP_DIR]: { description: getMessage(EnvironmentVariable.SF_MDAPI_TEMP_DIR), @@ -414,6 +408,10 @@ export const SUPPORTED_ENV_VARS: EnvType = { description: getMessage(EnvironmentVariable.SF_ENV), synonymOf: null, }, + [EnvironmentVariable.SF_CAPITALIZE_RECORD_TYPES]: { + description: getMessage(EnvironmentVariable.SF_CAPITALIZE_RECORD_TYPES), + synonymOf: null, + }, }; export class EnvVars extends Env { @@ -427,48 +425,52 @@ export class EnvVars extends Env { } private static defaultPrefix(): string { - if (process.argv[0].startsWith('sfdx')) return 'SFDX_'; - if (process.argv[0].startsWith('sf')) return 'SF_'; - return 'SFDX_'; + return 'SF_'; } public getPropertyFromEnv(property: string, prefix = EnvVars.defaultPrefix()): Nullable { const envName = EnvVars.propertyToEnvName(property, prefix); - const synonym = SUPPORTED_ENV_VARS[envName as EnvironmentVariable]?.synonymOf; - return this.get(envName) ?? this.get(synonym as string); + return this.get(envName); } public asDictionary(): Dictionary { - return this.entries().reduce>((accumulator, [key, value]) => { - accumulator[key] = value; - return accumulator; - }, {}); + return Object.fromEntries(this.entries()); } - public asMap(): Map { - return this.entries().reduce((accumulator, [key, value]) => { - accumulator.set(key, value); - return accumulator; - }, new Map()); + public asMap(): Map { + return new Map(this.entries()); } private resolve(): void { + // iterate everything in the real environment + const corrections = new Map(); + this.entries().forEach(([key, value]) => { - if (SUPPORTED_ENV_VARS[key as EnvironmentVariable]) { - // cross populate value to synonym if synonym exists - if (SUPPORTED_ENV_VARS[key as EnvironmentVariable].synonymOf) { - const synonym = SUPPORTED_ENV_VARS[key as EnvironmentVariable].synonymOf; - // set synonym only if it is in the map and running in interoperability mode - if (synonym && Global.SFDX_INTEROPERABILITY) { - this.setString(synonym, value); + if (SUPPORTED_ENV_VARS[key as EnvironmentVariable]?.synonymOf) { + // we are looking at an "old" key that has a new name + // if the new key has a value set, use that for the old key, too + const newEnvName = SUPPORTED_ENV_VARS[key as EnvironmentVariable].synonymOf; + if (newEnvName) { + const valueOfNewName = this.getString(newEnvName); + if (!valueOfNewName) { + void Lifecycle.getInstance().emitWarning(messages.getMessage('deprecatedEnv', [key, newEnvName])); + corrections.set(newEnvName, value); + } else if (valueOfNewName !== value) { + void Lifecycle.getInstance().emitWarning( + messages.getMessage('deprecatedEnvDisagreement', [key, newEnvName, newEnvName]) + ); + corrections.set(key, valueOfNewName ?? value); } } } }); + corrections.forEach((v, k) => { + this.setString(k, v); + }); } private get(envName: string): T { - return this.asDictionary()[envName] as T; + return this.asMap().get(envName) as T; } } diff --git a/src/config/lwwMap.ts b/src/config/lwwMap.ts new file mode 100644 index 0000000000..953ad9ba87 --- /dev/null +++ b/src/config/lwwMap.ts @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2023, 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 { entriesOf } from '@salesforce/ts-types'; +import { nowBigInt } from '../util/time'; +import { LWWRegister } from './lwwRegister'; +import { ConfigContents, Key } from './configStackTypes'; + +export const SYMBOL_FOR_DELETED = 'UNIQUE_IDENTIFIER_FOR_DELETED' as const; + +export type LWWState

= { + [Property in keyof P]: LWWRegister['state']; +}; + +/** + * @param contents object aligning with ConfigContents + * @param timestamp a bigInt that sets the timestamp. Defaults to the current time + * construct a LWWState from an object + * @param keysToCheckForDeletion if a key is in this array, AND not in the contents, it will be marked as deleted + * */ +export const stateFromContents =

(contents: P, timestamp?: bigint): LWWState

=> + Object.fromEntries( + entriesOf(contents).map( + ([key, value]): [keyof P, LWWRegister['state']] => [ + key, + new LWWRegister({ timestamp: timestamp ?? nowBigInt(), value }), + ] + ) + // I'd love to get rid of this ASsertion but don't know how. + ) as LWWState

; + +export class LWWMap

{ + /** map of key to LWWRegister. Used for managing conflicts */ + #data = new Map>(); + + public constructor(state?: LWWState

) { + // create a new register for each key in the initial state + for (const [key, register] of entriesOf(state ?? {})) { + this.#data.set(key, new LWWRegister(register)); + } + } + + public get value(): P { + return Object.fromEntries( + Array.from(this.#data.entries()) + .filter(([, register]) => register.value !== SYMBOL_FOR_DELETED) + .map(([key, register]) => [key, register.value]) + ) as P; + } + + public get state(): LWWState

{ + return Object.fromEntries( + Array.from(this.#data.entries()).map(([key, register]) => [key, register.state]) + ) as LWWState

; + } + + // Merge top-level properties of the incoming state with the current state. + // The value with the latest timestamp wins. + public merge(state: LWWState

): LWWState

{ + // properties that are in the incoming state but not the current state might have been deleted. + // recursively merge each key's register with the incoming state for that key + for (const [key, remote] of entriesOf(state)) { + const local = this.#data.get(key); + // if the register already exists, merge it with the incoming state + if (local) local.merge(remote); + // otherwise, instantiate a new `LWWRegister` with the incoming state + else this.#data.set(key, new LWWRegister(remote)); + } + return this.state; + } + + public set>(key: K, value: P[K]): void { + // get the register at the given key + const register = this.#data.get(key); + + // if the register already exists, set the value + if (register) register.set(value); + // otherwise, instantiate a new `LWWRegister` with the value + else this.#data.set(key, new LWWRegister({ timestamp: nowBigInt(), value })); + } + + public get>(key: K): P[K] | undefined { + // map loses the typing + const value = this.#data.get(key)?.value; + if (value === SYMBOL_FOR_DELETED) return undefined; + return value as P[K]; + } + + public delete>(key: K): void { + this.#data.set( + key, + new LWWRegister({ + timestamp: nowBigInt(), + value: SYMBOL_FOR_DELETED, + }) + ); + } + + public has(key: string): boolean { + // if a register doesn't exist or its value is null, the map doesn't contain the key + return this.#data.has(key) && this.#data.get(key)?.value !== SYMBOL_FOR_DELETED; + } +} diff --git a/src/config/lwwRegister.ts b/src/config/lwwRegister.ts new file mode 100644 index 0000000000..9e63ee97c9 --- /dev/null +++ b/src/config/lwwRegister.ts @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2023, 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 { nowBigInt } from '../util/time'; + +type LWWRegisterState = { timestamp: bigint; value: T }; + +/** a CRDT implementation. Uses timestamps to resolve conflicts when updating the value (last write wins) + * mostly based on https://jakelazaroff.com/words/an-interactive-intro-to-crdts/ + * + * @param T the type of the value stored in the register + */ +export class LWWRegister { + public constructor(public state: LWWRegisterState) {} + + public get value(): T { + return this.state.value; + } + + public get timestamp(): bigint { + return this.state.timestamp; + } + + public set(value: T): void { + this.state = { timestamp: nowBigInt(), value }; + } + + public merge(incoming: LWWRegisterState): LWWRegisterState { + // only update if the incoming timestamp is greater than the local timestamp + if (incoming.timestamp > this.state.timestamp) { + this.state = incoming; + } + return this.state; + } +} diff --git a/src/config/orgUsersConfig.ts b/src/config/orgUsersConfig.ts index 089688af65..0bd261088c 100644 --- a/src/config/orgUsersConfig.ts +++ b/src/config/orgUsersConfig.ts @@ -8,10 +8,13 @@ import { Global } from '../global'; import { ConfigFile } from './configFile'; +type UserConfig = { + usernames: string[]; +}; /** * A config file that stores usernames for an org. */ -export class OrgUsersConfig extends ConfigFile { +export class OrgUsersConfig extends ConfigFile { /** * Constructor. * **Do not directly construct instances of this class -- use {@link OrgUsersConfig.create} instead.** @@ -43,10 +46,10 @@ export namespace OrgUsersConfig { /** * The config file options. */ - export interface Options extends ConfigFile.Options { + export type Options = { /** * The org id associated with this user. */ orgId: string; - } + } & ConfigFile.Options; } diff --git a/src/config/sandboxOrgConfig.ts b/src/config/sandboxOrgConfig.ts index 31f99327c5..7456b0248c 100644 --- a/src/config/sandboxOrgConfig.ts +++ b/src/config/sandboxOrgConfig.ts @@ -42,12 +42,12 @@ export namespace SandboxOrgConfig { /** * The config file options. */ - export interface Options extends ConfigFile.Options { + export type Options = { /** * The org id associated with this sandbox. */ orgId: string; - } + } & ConfigFile.Options; export enum Fields { /** diff --git a/src/config/sandboxProcessCache.ts b/src/config/sandboxProcessCache.ts index 9a36d28ffa..075113ed2d 100644 --- a/src/config/sandboxProcessCache.ts +++ b/src/config/sandboxProcessCache.ts @@ -5,14 +5,15 @@ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause */ import { Duration } from '@salesforce/kit'; -import { SandboxProcessObject, SandboxRequest } from '../org'; +import { SandboxProcessObject, SandboxRequest } from '../org/org'; import { Global } from '../global'; import { TTLConfig } from './ttlConfig'; export type SandboxRequestCacheEntry = { alias?: string; - setDefault: boolean; + setDefault?: boolean; prodOrgUsername: string; + action: 'Create' | 'Refresh'; // Sandbox create and refresh requests can be cached sandboxProcessObject: Partial; sandboxRequest: Partial; tracksSource?: boolean; diff --git a/src/config/tokensConfig.ts b/src/config/tokensConfig.ts deleted file mode 100644 index 05ea646732..0000000000 --- a/src/config/tokensConfig.ts +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2022, 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 class-methods-use-this */ - -import { Optional } from '@salesforce/ts-types'; -import { SfTokens } from '../stateAggregator'; -import { ConfigFile } from './configFile'; -import { ConfigContents, ConfigValue } from './configStore'; - -export class TokensConfig extends ConfigFile { - protected static encryptedKeys = [/token/i, /password/i, /secret/i]; - public static getDefaultOptions(): ConfigFile.Options { - return { - isGlobal: true, - isState: true, - filename: 'tokens.json', - }; - } - - protected getMethod(contents: ConfigContents, key: string): Optional { - return contents[key]; - } - - protected setMethod(contents: ConfigContents, key: string, value?: ConfigValue): void { - contents[key] = value; - } -} diff --git a/src/config/ttlConfig.ts b/src/config/ttlConfig.ts index afc2874b96..ebe1e31e0c 100644 --- a/src/config/ttlConfig.ts +++ b/src/config/ttlConfig.ts @@ -46,7 +46,11 @@ export class TTLConfig extends C protected async init(): Promise { const contents = await this.read(this.options.throwOnNotFound); const date = new Date().getTime(); - this.setContents(Object.fromEntries(Object.entries(contents).filter(([, value]) => !this.isExpired(date, value)))); + + // delete all the expired entries + Object.entries(contents) + .filter(([, value]) => this.isExpired(date, value)) + .map(([key]) => this.unset(key)); } // eslint-disable-next-line class-methods-use-this diff --git a/src/crypto/crypto.ts b/src/crypto/crypto.ts index 6ed30bbe48..7a745f0254 100644 --- a/src/crypto/crypto.ts +++ b/src/crypto/crypto.ts @@ -6,21 +6,34 @@ */ /* eslint-disable @typescript-eslint/ban-types */ -import * as crypto from 'crypto'; -import * as os from 'os'; -import { join as pathJoin } from 'path'; -import { ensure, Nullable, Optional } from '@salesforce/ts-types'; +import * as crypto from 'node:crypto'; +import * as os from 'node:os'; +import { join as pathJoin } from 'node:path'; +import { ensure, isString, Nullable, Optional } from '@salesforce/ts-types'; import { AsyncOptionalCreatable, env } from '@salesforce/kit'; -import { Logger } from '../logger'; +import { Logger } from '../logger/logger'; +import { Lifecycle } from '../lifecycleEvents'; import { Messages } from '../messages'; import { Cache } from '../util/cache'; import { Global } from '../global'; +import { SfError } from '../sfError'; import { retrieveKeychain } from './keyChain'; import { KeyChain } from './keyChainImpl'; import { SecureBuffer } from './secureBuffer'; const TAG_DELIMITER = ':'; -const BYTE_COUNT_FOR_IV = 6; +const IV_BYTES = { + v1: 6, + v2: 12, +}; +const ENCODING = { + v1: 'utf8', + v2: 'hex', +} as const; +const KEY_SIZE = { + v1: 16, + v2: 32, +}; const ALGO = 'aes-256-gcm'; const AUTH_TAG_LENGTH = 32; @@ -29,17 +42,85 @@ const ENCRYPTED_CHARS = /[a-f0-9]/; const KEY_NAME = 'sfdx'; const ACCOUNT = 'local'; +let cryptoLogger: Logger; +const getCryptoLogger = (): Logger => { + cryptoLogger ??= Logger.childFromRoot('crypto'); + return cryptoLogger; +}; + +type CryptoV2Value = 'true' | 'false' | undefined; +const getCryptoV2EnvVar = (): CryptoV2Value => { + let sfCryptoV2 = process.env.SF_CRYPTO_V2?.toLowerCase(); + if (sfCryptoV2 !== undefined) { + getCryptoLogger().debug(`SF_CRYPTO_V2=${sfCryptoV2}`); + + // normalize all values that aren't "true" to be "false" + if (sfCryptoV2 !== 'true') { + sfCryptoV2 = 'false'; + } + } + return sfCryptoV2 as CryptoV2Value; +}; + +type CryptoEncoding = 'utf8' | 'hex'; +type CryptoVersion = keyof typeof IV_BYTES; +let cryptoVersion: CryptoVersion | undefined; +const getCryptoVersion = (): CryptoVersion => { + if (!cryptoVersion) { + // This only happens when generating a new key, so use the env var + // and (for now) default to 'v1'. + cryptoVersion = getCryptoV2EnvVar() === 'true' ? 'v2' : 'v1'; + } + return cryptoVersion; +}; + +// Detect the crypto version based on the password (key) length. +// This happens once per process. +const detectCryptoVersion = (pwd?: string): void => { + if (!cryptoVersion) { + // check the env var to see if it's set + const sfCryptoV2 = getCryptoV2EnvVar(); + + // Password length of 64 is v2 crypto and uses hex encoding. + // Password length of 32 is v1 crypto and uses utf8 encoding. + if (pwd?.length === KEY_SIZE.v2 * 2) { + cryptoVersion = 'v2'; + getCryptoLogger().debug('Using v2 crypto'); + if (sfCryptoV2 === 'false') { + getCryptoLogger().warn(messages.getMessage('v1CryptoWithV2KeyWarning')); + } + } else if (pwd?.length === KEY_SIZE.v1 * 2) { + cryptoVersion = 'v1'; + getCryptoLogger().debug('Using v1 crypto'); + if (sfCryptoV2 === 'true') { + getCryptoLogger().warn(messages.getMessage('v2CryptoWithV1KeyWarning')); + } + } else { + getCryptoLogger().debug("crypto key doesn't match v1 or v2. using SF_CRYPTO_V2."); + getCryptoVersion(); + } + + void Lifecycle.getInstance().emitTelemetry({ + eventName: 'crypto_version', + library: 'sfdx-core', + function: 'detectCryptoVersion', + cryptoVersion, // 'v1' or 'v2' + cryptoEnvVar: sfCryptoV2, // 'true' or 'false' or 'undefined' + }); + } +}; + Messages.importMessagesDirectory(pathJoin(__dirname)); const messages = Messages.loadMessages('@salesforce/core', 'encryption'); -interface CredType { +type CredType = { username: string; password: string; -} +}; -const makeSecureBuffer = (password: string | undefined): SecureBuffer => { +const makeSecureBuffer = (password: string, encoding: CryptoEncoding): SecureBuffer => { const newSb = new SecureBuffer(); - newSb.consume(Buffer.from(ensure(password), 'utf8')); + newSb.consume(Buffer.from(password, encoding)); return newSb; }; @@ -61,14 +142,22 @@ const keychainPromises = { return new Promise((resolve, reject): {} => _keychain.getPassword({ service, account }, (err: Nullable, password?: string) => { if (err) return reject(err); - Cache.set(cacheKey, makeSecureBuffer(password)); - return resolve({ username: account, password: ensure(password) }); + const pwd = ensure(password, 'Expected the keychain password to be set'); + detectCryptoVersion(pwd); + Cache.set(cacheKey, makeSecureBuffer(pwd, ENCODING[getCryptoVersion()])); + return resolve({ username: account, password: pwd }); }) ); } else { - const pw = sb.value((buffer) => buffer.toString('utf8')); - Cache.set(cacheKey, makeSecureBuffer(pw)); - return new Promise((resolve): void => resolve({ username: account, password: ensure(pw) })); + // If the password is cached, we know the crypto version and encoding because it was + // detected by the non-cache code path just above this. + const encoding = ENCODING[getCryptoVersion()]; + const pwd = ensure( + sb.value((buffer) => buffer.toString(encoding)), + 'Expected the keychain password to be set' + ); + Cache.set(cacheKey, makeSecureBuffer(pwd, encoding)); + return new Promise((resolve): void => resolve({ username: account, password: pwd })); } }, @@ -90,12 +179,12 @@ const keychainPromises = { }, }; -interface CryptoOptions { +type CryptoOptions = { keychain?: KeyChain; platform?: string; retryStatus?: string; noResetOnClose?: boolean; -} +}; /** * Class for managing encrypting and decrypting private auth information. @@ -119,6 +208,12 @@ export class Crypto extends AsyncOptionalCreatable { this.options = options ?? {}; } + // @ts-expect-error only for test access + // eslint-disable-next-line class-methods-use-this + private static unsetCryptoVersion(): void { + cryptoVersion = undefined; + } + /** * Encrypts text. Returns the encrypted string or undefined if no string was passed. * @@ -134,17 +229,12 @@ export class Crypto extends AsyncOptionalCreatable { throw messages.createError('keychainPasswordCreationError'); } - const iv = crypto.randomBytes(BYTE_COUNT_FOR_IV).toString('hex'); - - return this.key.value((buffer: Buffer): string => { - const cipher = crypto.createCipheriv(ALGO, buffer.toString('utf8'), iv); - - let encrypted = cipher.update(text, 'utf8', 'hex'); - encrypted += cipher.final('hex'); - - const tag = cipher.getAuthTag().toString('hex'); - return `${iv}${encrypted}${TAG_DELIMITER}${tag}`; - }); + // When everything is v2, we can remove the else + if (this.isV2Crypto()) { + return this.encryptV2(text); + } else { + return this.encryptV1(text); + } } /** @@ -164,29 +254,12 @@ export class Crypto extends AsyncOptionalCreatable { throw messages.createError('invalidEncryptedFormatError'); } - const tag = tokens[1]; - const iv = tokens[0].substring(0, BYTE_COUNT_FOR_IV * 2); - const secret = tokens[0].substring(BYTE_COUNT_FOR_IV * 2, tokens[0].length); - - return this.key.value((buffer: Buffer) => { - const decipher = crypto.createDecipheriv(ALGO, buffer.toString('utf8'), iv); - - let dec; - try { - decipher.setAuthTag(Buffer.from(tag, 'hex')); - dec = decipher.update(secret, 'hex', 'utf8'); - dec += decipher.final('utf8'); - } catch (err) { - const error = messages.createError('authDecryptError', [(err as Error).message], [], err as Error); - const useGenericUnixKeychain = - env.getBoolean('SFDX_USE_GENERIC_UNIX_KEYCHAIN') || env.getBoolean('USE_GENERIC_UNIX_KEYCHAIN'); - if (os.platform() === 'darwin' && !useGenericUnixKeychain) { - error.actions = [messages.getMessage('macKeychainOutOfSync')]; - } - throw error; - } - return dec; - }); + // When everything is v2, we can remove the else + if (this.isV2Crypto()) { + return this.decryptV2(tokens); + } else { + return this.decryptV1(tokens); + } } /** @@ -212,7 +285,7 @@ export class Crypto extends AsyncOptionalCreatable { const value = tokens[0]; return ( tag.length === AUTH_TAG_LENGTH && - value.length >= BYTE_COUNT_FOR_IV && + value.length >= IV_BYTES[getCryptoVersion()] && ENCRYPTED_CHARS.test(tag) && ENCRYPTED_CHARS.test(tokens[0]) ); @@ -227,41 +300,43 @@ export class Crypto extends AsyncOptionalCreatable { } } + // eslint-disable-next-line class-methods-use-this + public isV2Crypto(): boolean { + return getCryptoVersion() === 'v2'; + } + /** * Initialize async components. */ protected async init(): Promise { - const logger = await Logger.child('crypto'); - if (!this.options.platform) { this.options.platform = os.platform(); } - logger.debug(`retryStatus: ${this.options.retryStatus}`); - this.noResetOnClose = !!this.options.noResetOnClose; try { - this.key.consume( - Buffer.from( - (await keychainPromises.getPassword(await this.getKeyChain(this.options.platform), KEY_NAME, ACCOUNT)) - .password, - 'utf8' - ) - ); + const keyChain = await this.getKeyChain(this.options.platform); + const pwd = (await keychainPromises.getPassword(keyChain, KEY_NAME, ACCOUNT)).password; + // The above line ensures the crypto version is detected and set so we can rely on it now. + this.key.consume(Buffer.from(pwd, ENCODING[getCryptoVersion()])); } catch (err) { // No password found if ((err as Error).name === 'PasswordNotFoundError') { // If we already tried to create a new key then bail. if (this.options.retryStatus === 'KEY_SET') { - logger.debug('a key was set but the retry to get the password failed.'); + getCryptoLogger().debug('a key was set but the retry to get the password failed.'); throw err; } else { - logger.debug('password not found in keychain attempting to created one and re-init.'); + getCryptoLogger().debug( + `password not found in keychain. Creating new one (Crypto ${getCryptoVersion()}) and re-init.` + ); } - const key = crypto.randomBytes(Math.ceil(16)).toString('hex'); - // Create a new password in the KeyChain. + // 2/6/2024: This generates a new key using the crypto version based on the SF_CRYPTO_V2 env var. + // Sometime in the future we could hardcode this to be `KEY_SIZE.v2` so that it becomes the default. + const key = crypto.randomBytes(KEY_SIZE[getCryptoVersion()]).toString('hex'); + // Set the new password in the KeyChain. await keychainPromises.setPassword(ensure(this.options.keychain), KEY_NAME, ACCOUNT, key); return this.init(); @@ -271,6 +346,82 @@ export class Crypto extends AsyncOptionalCreatable { } } + private encryptV1(text: string): Optional { + const iv = crypto.randomBytes(IV_BYTES.v1).toString('hex'); + + return this.key.value((buffer: Buffer): string => { + const cipher = crypto.createCipheriv(ALGO, buffer.toString('utf8'), iv); + + let encrypted = cipher.update(text, 'utf8', 'hex'); + encrypted += cipher.final('hex'); + + const tag = cipher.getAuthTag().toString('hex'); + return `${iv}${encrypted}${TAG_DELIMITER}${tag}`; + }); + } + + private encryptV2(text: string): Optional { + const iv = crypto.randomBytes(IV_BYTES.v2); + + return this.key.value((buffer: Buffer): string => { + const cipher = crypto.createCipheriv(ALGO, buffer, iv); + const ivHex = iv.toString('hex'); + + let encrypted = cipher.update(text, 'utf8', 'hex'); + encrypted += cipher.final('hex'); + + const tag = cipher.getAuthTag().toString('hex'); + return `${ivHex}${encrypted}${TAG_DELIMITER}${tag}`; + }); + } + + private decryptV1(tokens: string[]): Optional { + const tag = tokens[1]; + const iv = tokens[0].substring(0, IV_BYTES.v1 * 2); + const secret = tokens[0].substring(IV_BYTES.v1 * 2, tokens[0].length); + + return this.key.value((buffer: Buffer) => { + const decipher = crypto.createDecipheriv(ALGO, buffer.toString('utf8'), iv); + + try { + decipher.setAuthTag(Buffer.from(tag, 'hex')); + return `${decipher.update(secret, 'hex', 'utf8')}${decipher.final('utf8')}`; + } catch (err) { + const error = messages.createError('authDecryptError', [(err as Error).message], [], err as Error); + const useGenericUnixKeychain = + env.getBoolean('SF_USE_GENERIC_UNIX_KEYCHAIN') || env.getBoolean('USE_GENERIC_UNIX_KEYCHAIN'); + if (os.platform() === 'darwin' && !useGenericUnixKeychain) { + error.actions = [messages.getMessage('macKeychainOutOfSync')]; + } + throw error; + } + }); + } + + private decryptV2(tokens: string[]): Optional { + const tag = tokens[1]; + const iv = tokens[0].substring(0, IV_BYTES.v2 * 2); + const secret = tokens[0].substring(IV_BYTES.v2 * 2, tokens[0].length); + + return this.key.value((buffer: Buffer) => { + const decipher = crypto.createDecipheriv(ALGO, buffer, Buffer.from(iv, 'hex')); + + try { + decipher.setAuthTag(Buffer.from(tag, 'hex')); + return `${decipher.update(secret, 'hex', 'utf8')}${decipher.final('utf8')}`; + } catch (_err: unknown) { + const err = (isString(_err) ? SfError.wrap(_err) : _err) as Error; + const error = messages.createError('authDecryptError', [err.message], [], err); + const useGenericUnixKeychain = + env.getBoolean('SF_USE_GENERIC_UNIX_KEYCHAIN') || env.getBoolean('USE_GENERIC_UNIX_KEYCHAIN'); + if (os.platform() === 'darwin' && !useGenericUnixKeychain) { + error.actions = [messages.getMessage('macKeychainOutOfSync')]; + } + throw error; + } + }); + } + private async getKeyChain(platform: string): Promise { if (!this.options.keychain) { this.options.keychain = await retrieveKeychain(platform); diff --git a/src/crypto/keyChain.ts b/src/crypto/keyChain.ts index 88945a131e..ffe8806c3d 100644 --- a/src/crypto/keyChain.ts +++ b/src/crypto/keyChain.ts @@ -6,7 +6,7 @@ */ import { env } from '@salesforce/kit'; -import { Logger } from '../logger'; +import { Logger } from '../logger/logger'; import { Messages } from '../messages'; import { KeyChain, keyChainImpl } from './keyChainImpl'; @@ -23,7 +23,7 @@ export const retrieveKeychain = async (platform: string): Promise => { const logger: Logger = await Logger.child('keyChain'); logger.debug(`platform: ${platform}`); - const useGenericUnixKeychainVar = env.getBoolean('SFDX_USE_GENERIC_UNIX_KEYCHAIN'); + const useGenericUnixKeychainVar = env.getBoolean('SF_USE_GENERIC_UNIX_KEYCHAIN'); const shouldUseGenericUnixKeychain = useGenericUnixKeychainVar && useGenericUnixKeychainVar; if (platform.startsWith('win')) { diff --git a/src/crypto/keyChainImpl.ts b/src/crypto/keyChainImpl.ts index ddcfe18315..7550893b70 100644 --- a/src/crypto/keyChainImpl.ts +++ b/src/crypto/keyChainImpl.ts @@ -5,12 +5,12 @@ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause */ -import * as childProcess from 'child_process'; -import * as nodeFs from 'fs'; -import * as fs from 'fs'; -import * as os from 'os'; -import { homedir } from 'os'; -import * as path from 'path'; +import * as childProcess from 'node:child_process'; +import * as nodeFs from 'node:fs'; +import * as fs from 'node:fs'; +import * as os from 'node:os'; +import { homedir } from 'node:os'; +import * as path from 'node:path'; import { asString, ensureString, Nullable } from '@salesforce/ts-types'; import { parseJsonMap } from '@salesforce/kit'; import { Global } from '../global'; @@ -46,7 +46,7 @@ const isExe = (mode: number, gid: number, uid: number): boolean => { return Boolean( mode & parseInt('0001', 8) || - (mode & parseInt('0010', 8) && process.getgid && gid === process.getgid()) || + Boolean(mode & parseInt('0010', 8) && process.getgid && gid === process.getgid()) || (mode & parseInt('0100', 8) && process.getuid && uid === process.getuid()) ); }; @@ -85,7 +85,7 @@ const _validateProgram = async ( /** * Basic keychain interface. */ -export interface PasswordStore { +export type PasswordStore = { /** * Gets a password * @@ -106,7 +106,7 @@ export interface PasswordStore { * @param fn function callback for password. */ setPassword(opts: ProgramOpts, fn: (error: Nullable, contents?: SecretContents) => void): Promise; -} +}; /** * @private @@ -247,13 +247,13 @@ export class KeychainAccess implements PasswordStore { } } -interface ProgramOpts { +type ProgramOpts = { account: string; service: string; password?: string; -} +}; -interface OsImpl { +type OsImpl = { getProgram(): string; getProgramOptions(opts: ProgramOpts): string[]; getCommandFunc( @@ -279,7 +279,7 @@ interface OsImpl { opts: ProgramOpts, fn: (err: Nullable) => void ): Promise; -} +}; /** * Linux implementation. diff --git a/src/crypto/secureBuffer.ts b/src/crypto/secureBuffer.ts index ec9cf0bd8f..6ef4a92ae5 100644 --- a/src/crypto/secureBuffer.ts +++ b/src/crypto/secureBuffer.ts @@ -5,7 +5,7 @@ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause */ -import * as crypto from 'crypto'; +import * as crypto from 'node:crypto'; import { ensure, Optional } from '@salesforce/ts-types'; const cipherName = 'aes-256-cbc'; diff --git a/src/deviceOauthService.ts b/src/deviceOauthService.ts index 815523a426..ab3b609a73 100644 --- a/src/deviceOauthService.ts +++ b/src/deviceOauthService.ts @@ -7,27 +7,28 @@ /* eslint-disable camelcase */ /* eslint-disable @typescript-eslint/ban-types */ -import Transport from 'jsforce/lib/transport'; -import { AsyncCreatable, Duration, parseJsonMap } from '@salesforce/kit'; -import { HttpRequest, OAuth2Config } from 'jsforce'; -import { ensureString, JsonMap, Nullable } from '@salesforce/ts-types'; -import * as FormData from 'form-data'; -import { Logger } from './logger'; -import { AuthInfo, DEFAULT_CONNECTED_APP_INFO, SFDX_HTTP_HEADERS } from './org'; +import Transport from '@jsforce/jsforce-node/lib/transport'; +import { AsyncCreatable, Duration, parseJsonMap, sleep } from '@salesforce/kit'; +import { HttpRequest, OAuth2Config } from '@jsforce/jsforce-node'; +import { ensureString, isString, JsonMap, Nullable } from '@salesforce/ts-types'; +import FormData from 'form-data'; +import { Logger } from './logger/logger'; +import { AuthInfo, DEFAULT_CONNECTED_APP_INFO } from './org/authInfo'; +import { SFDX_HTTP_HEADERS } from './org/connection'; import { SfError } from './sfError'; import { Messages } from './messages'; Messages.importMessagesDirectory(__dirname); const messages = Messages.loadMessages('@salesforce/core', 'auth'); -export interface DeviceCodeResponse extends JsonMap { +export type DeviceCodeResponse = { device_code: string; interval: number; user_code: string; verification_uri: string; -} +} & JsonMap; -export interface DeviceCodePollingResponse extends JsonMap { +export type DeviceCodePollingResponse = { access_token: string; refresh_token: string; signature: string; @@ -36,17 +37,25 @@ export interface DeviceCodePollingResponse extends JsonMap { id: string; token_type: string; issued_at: string; -} +} & JsonMap; -async function wait(ms = 1000): Promise { - return new Promise((resolve) => { - setTimeout(resolve, ms); - }); -} +type DeviceCodeAuthError = { + error: string; + error_description: string; + status: number; +} & SfError; async function makeRequest(options: HttpRequest): Promise { const rawResponse = await new Transport().httpRequest(options); + + if (rawResponse?.headers?.['content-type'] === 'text/html') { + const htmlResponseError = messages.createError('error.HttpApi'); + htmlResponseError.setData(rawResponse.body); + throw htmlResponseError; + } + const response = parseJsonMap(rawResponse.body); + if (response.error) { const errorDescription = typeof response.error_description === 'string' ? response.error_description : ''; const error = typeof response.error === 'string' ? response.error : 'Unknown'; @@ -174,21 +183,25 @@ export class DeviceOauthService extends AsyncCreatable { ); try { return await makeRequest(httpRequest); - } catch (e) { - /* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/restrict-template-expressions */ - const err: any = (e as SfError).data; - if (err.error && err.status === 400 && err.error === 'authorization_pending') { + } catch (e: unknown) { + if (e instanceof SfError && e.name === 'HttpApiError') { + throw e; + } + + const err = (e instanceof SfError ? e.data : SfError.wrap(isString(e) ? e : 'unknown').data) as + | DeviceCodeAuthError + | undefined; + if (err?.error && err?.status === 400 && err?.error === 'authorization_pending') { // do nothing because we're still waiting } else { - if (err.error && err.error_description) { + if (err?.error && err?.error_description) { this.logger.error(`Polling error: ${err.error}: ${err.error_description}`); } else { this.logger.error('Unknown Polling Error:'); - this.logger.error(err); + this.logger.error(err ?? e); } - throw err; + throw err ?? e; } - /* eslint-enable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/restrict-template-expressions */ } } @@ -211,7 +224,7 @@ export class DeviceOauthService extends AsyncCreatable { } else { this.logger.debug(`waiting ${interval} ms...`); // eslint-disable-next-line no-await-in-loop - await wait(interval); + await sleep(interval); this.pollingCount += 1; } } diff --git a/src/global.ts b/src/global.ts index efb04c61c0..40c0ded6c8 100644 --- a/src/global.ts +++ b/src/global.ts @@ -5,9 +5,9 @@ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause */ -import * as fs from 'fs'; -import * as os from 'os'; -import * as path from 'path'; +import * as fs from 'node:fs'; +import * as os from 'node:os'; +import * as path from 'node:path'; import { env } from '@salesforce/kit'; import { SfError } from './sfError'; @@ -75,13 +75,6 @@ export class Global { return path.join(os.homedir(), Global.SFDX_STATE_FOLDER); } - /** - * The full system path to the global log file. - */ - // member ordering conflicts with the TS use-before-declaration error - // eslint-disable-next-line @typescript-eslint/member-ordering - public static readonly LOG_FILE_PATH: string = path.join(Global.SF_DIR, 'sf.log'); - /** * Gets the current mode environment variable as a {@link Mode} instance. * @@ -90,7 +83,10 @@ export class Global { * ``` */ public static getEnvironmentMode(): Mode { - return Mode[env.getKeyOf('SFDX_ENV', Mode, Mode.PRODUCTION, (value) => value.toUpperCase())]; + const envValue = env.getString('SF_ENV') ?? env.getString('SFDX_ENV', Mode.PRODUCTION); + return envValue in Mode || envValue.toUpperCase() in Mode + ? Mode[envValue.toUpperCase() as keyof typeof Mode] + : Mode.PRODUCTION; } /** @@ -100,15 +96,15 @@ export class Global { * @param dirPath The directory path to be created within {@link Global.SFDX_DIR}. */ public static async createDir(dirPath?: string): Promise { - dirPath = dirPath ? path.join(Global.SFDX_DIR, dirPath) : Global.SFDX_DIR; + const resolvedPath = dirPath ? path.join(Global.SFDX_DIR, dirPath) : Global.SFDX_DIR; try { if (process.platform === 'win32') { - await fs.promises.mkdir(dirPath, { recursive: true }); + await fs.promises.mkdir(resolvedPath, { recursive: true }); } else { - await fs.promises.mkdir(dirPath, { recursive: true, mode: 0o700 }); + await fs.promises.mkdir(resolvedPath, { recursive: true, mode: 0o700 }); } } catch (error) { - throw new SfError(`Failed to create directory or set permissions for: ${dirPath}`); + throw new SfError(`Failed to create directory or set permissions for: ${resolvedPath}`); } } } diff --git a/src/exported.ts b/src/index.ts similarity index 77% rename from src/exported.ts rename to src/index.ts index c4ec4580e0..8943396936 100644 --- a/src/exported.ts +++ b/src/index.ts @@ -6,19 +6,19 @@ */ import { Messages } from './messages'; -Messages.importMessagesDirectory(__dirname); -export { OAuth2Config } from 'jsforce'; +Messages.importMessagesDirectory(__dirname); +export { OAuth2Config } from '@jsforce/jsforce-node'; export { ConfigFile } from './config/configFile'; export { TTLConfig } from './config/ttlConfig'; export { envVars, EnvironmentVariable, SUPPORTED_ENV_VARS, EnvVars } from './config/envVars'; -export { ConfigContents, ConfigEntry, ConfigStore, ConfigValue } from './config/configStore'; - -export { SfTokens, StateAggregator } from './stateAggregator'; +export { ConfigStore } from './config/configStore'; +export { ConfigEntry, ConfigContents, ConfigValue } from './config/configStackTypes'; +export { StateAggregator } from './stateAggregator/stateAggregator'; export { DeviceOauthService, DeviceCodeResponse, DeviceCodePollingResponse } from './deviceOauthService'; @@ -36,7 +36,7 @@ export { export { SandboxRequestCacheEntry, SandboxRequestCache } from './config/sandboxProcessCache'; -export { ConfigInfo, ConfigAggregator, SfdxConfigAggregator } from './config/configAggregator'; +export { ConfigInfo, ConfigAggregator } from './config/configAggregator'; export { AuthFields, AuthInfo, AuthSideEffects, OrgAuthorization } from './org/authInfo'; @@ -54,16 +54,7 @@ export { SfdcUrl } from './util/sfdcUrl'; export { getJwtAudienceUrl } from './util/getJwtAudienceUrl'; -export { - Fields, - FieldValue, - LoggerLevel, - LoggerLevelValue, - LogLine, - LoggerOptions, - LoggerStream, - Logger, -} from './logger'; +export { Fields, FieldValue, LoggerLevel, LoggerLevelValue, LogLine, LoggerOptions, Logger } from './logger/logger'; export { Messages, StructuredMessage } from './messages'; @@ -71,6 +62,7 @@ export { Org, SandboxProcessObject, StatusEvent, + SandboxInfo, SandboxEvents, SandboxUserAuthResponse, SandboxUserAuthRequest, @@ -79,25 +71,15 @@ export { OrgTypes, ResultEvent, ScratchOrgRequest, -} from './org'; +} from './org/org'; export { OrgConfigProperties, ORG_CONFIG_ALLOWED_PROPERTIES } from './org/orgConfigProperties'; -export { - PackageDir, - NamedPackageDir, - PackageDirDependency, - SfProject, - SfProjectJson, - SfdxProject, - SfdxProjectJson, -} from './sfProject'; - -export { SchemaPrinter } from './schema/printer'; +export { PackageDir, NamedPackageDir, PackageDirDependency, SfProject, SfProjectJson } from './sfProject'; export { SchemaValidator } from './schema/validator'; -export { SfError, SfdxError } from './sfError'; +export { SfError } from './sfError'; export { PollingClient } from './status/pollingClient'; @@ -108,7 +90,7 @@ export { MyDomainResolver } from './status/myDomainResolver'; export { DefaultUserFields, REQUIRED_FIELDS, User, UserFields } from './org/user'; export { PermissionSetAssignment, PermissionSetAssignmentFields } from './org/permissionSetAssignment'; - +export { lockInit } from './util/fileLocking'; export { ScratchOrgCreateOptions, ScratchOrgCreateResult, @@ -123,6 +105,7 @@ export { scratchOrgLifecycleStages, } from './org/scratchOrgLifecycleEvents'; export { ScratchOrgCache } from './org/scratchOrgCache'; +export { default as ScratchOrgSettingsGenerator } from './org/scratchOrgSettingsGenerator'; + // Utility sub-modules export * from './util/sfdc'; -export * from './util/sfdcUrl'; diff --git a/src/lifecycleEvents.ts b/src/lifecycleEvents.ts index 9ccf33f48c..3cc5431f15 100644 --- a/src/lifecycleEvents.ts +++ b/src/lifecycleEvents.ts @@ -6,16 +6,18 @@ */ import { AnyJson, Dictionary } from '@salesforce/ts-types'; -import * as Debug from 'debug'; import { compare } from 'semver'; // needed for TS to not put everything inside /lib/src // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore import * as pjson from '../package.json'; +import { Logger } from './logger/logger'; // Data of any type can be passed to the callback. Can be cast to any type that is given in emit(). // eslint-disable-next-line @typescript-eslint/no-explicit-any -type callback = (data: any) => Promise; +export type callback = (data: any) => Promise; +type ListenerMap = Map; +export type UniqueListenerMap = Map; declare const global: { salesforceCoreLifecycle?: Lifecycle; @@ -45,9 +47,12 @@ declare const global: { export class Lifecycle { public static readonly telemetryEventName = 'telemetry'; public static readonly warningEventName = 'warning'; - private debug = Debug(`sfdx:${this.constructor.name}`); + private logger?: Logger; - private constructor(private readonly listeners: Dictionary = {}) {} + private constructor( + private readonly listeners: Dictionary = {}, + private readonly uniqueListeners: UniqueListenerMap = new Map>() + ) {} /** * return the package.json version of the sfdx-core library. @@ -86,8 +91,11 @@ export class Lifecycle { ) { const oldInstance = global.salesforceCoreLifecycle; // use the newer version and transfer any listeners from the old version - // object spread keeps them from being references - global.salesforceCoreLifecycle = new Lifecycle({ ...oldInstance.listeners }); + // object spread and the clone fn keep them from being references + global.salesforceCoreLifecycle = new Lifecycle( + { ...oldInstance.listeners }, + cloneUniqueListeners(oldInstance.uniqueListeners) + ); // clean up any listeners on the old version Object.keys(oldInstance.listeners).map((eventName) => { oldInstance.removeAllListeners(eventName); @@ -111,6 +119,7 @@ export class Lifecycle { */ public removeAllListeners(eventName: string): void { this.listeners[eventName] = []; + this.uniqueListeners.delete(eventName); } /** @@ -119,7 +128,9 @@ export class Lifecycle { * @param eventName The name of the event to get listeners of */ public getListeners(eventName: string): callback[] { - const listeners = this.listeners[eventName]; + const listeners = this.listeners[eventName]?.concat( + Array.from((this.uniqueListeners.get(eventName) ?? []).values()) ?? [] + ); if (listeners) { return listeners; } else { @@ -150,11 +161,15 @@ export class Lifecycle { * * @param eventName The name of the event that is being listened for * @param cb The callback function to run when the event is emitted + * @param uniqueListenerIdentifier A unique identifier for the listener. If a listener with the same identifier is already registered, a new one will not be added */ - public on(eventName: string, cb: (data: T) => Promise): void { + public on(eventName: string, cb: (data: T) => Promise, uniqueListenerIdentifier?: string): void { const listeners = this.getListeners(eventName); if (listeners.length !== 0) { - this.debug( + if (!this.logger) { + this.logger = Logger.childFromRoot('Lifecycle'); + } + this.logger.debug( `${ listeners.length + 1 } lifecycle events with the name ${eventName} have now been registered. When this event is emitted all ${ @@ -162,8 +177,19 @@ export class Lifecycle { } listeners will fire.` ); } - listeners.push(cb); - this.listeners[eventName] = listeners; + + if (uniqueListenerIdentifier) { + if (!this.uniqueListeners.has(eventName)) { + // nobody is listening to the event yet + this.uniqueListeners.set(eventName, new Map([[uniqueListenerIdentifier, cb]])); + } else if (!this.uniqueListeners.get(eventName)?.has(uniqueListenerIdentifier)) { + // the unique listener identifier is not already registered + this.uniqueListeners.get(eventName)?.set(uniqueListenerIdentifier, cb); + } + } else { + listeners.push(cb); + this.listeners[eventName] = listeners; + } } /** @@ -196,7 +222,10 @@ export class Lifecycle { public async emit(eventName: string, data: T): Promise { const listeners = this.getListeners(eventName); if (listeners.length === 0 && eventName !== Lifecycle.warningEventName) { - this.debug( + if (!this.logger) { + this.logger = Logger.childFromRoot('Lifecycle'); + } + this.logger.debug( `A lifecycle event with the name ${eventName} does not exist. An event must be registered before it can be emitted.` ); } else { @@ -207,3 +236,7 @@ export class Lifecycle { } } } + +const cloneListeners: (listeners: ListenerMap) => ListenerMap = (listeners) => new Map(Array.from(listeners.entries())); +export const cloneUniqueListeners = (uniqueListeners: UniqueListenerMap): UniqueListenerMap => + new Map(Array.from(uniqueListeners.entries()).map(([key, value]) => [key, cloneListeners(value)])); diff --git a/src/logger.ts b/src/logger.ts deleted file mode 100644 index 6a524ecb78..0000000000 --- a/src/logger.ts +++ /dev/null @@ -1,943 +0,0 @@ -/* - * 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 { EventEmitter } from 'events'; -import * as os from 'os'; -import * as path from 'path'; -import { Writable } from 'stream'; -import * as fs from 'fs'; -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore -import * as Bunyan from '@salesforce/bunyan'; -import { Env, parseJson, parseJsonMap } from '@salesforce/kit'; -import { - Dictionary, - ensure, - ensureNumber, - isArray, - isFunction, - isKeyOf, - isObject, - isPlainObject, - isString, - Many, - Optional, -} from '@salesforce/ts-types'; -import * as Debug from 'debug'; -import { Global, Mode } from './global'; -import { SfError } from './sfError'; - -/* eslint-disable @typescript-eslint/no-unsafe-return */ -/* eslint-disable @typescript-eslint/no-unsafe-member-access */ -/* eslint-disable @typescript-eslint/no-unsafe-assignment */ -/* eslint-disable @typescript-eslint/no-unsafe-call */ -/* eslint-disable @typescript-eslint/explicit-function-return-type */ -/* eslint-disable @typescript-eslint/restrict-template-expressions */ - -/** - * A Bunyan `Serializer` function. - * - * @param input The input to be serialized. - * **See** {@link https://github.com/forcedotcom/node-bunyan#serializers|Bunyan Serializers API} - */ -export type Serializer = (input: unknown) => unknown; - -/** - * A collection of named `Serializer`s. - * - * **See** {@link https://github.com/forcedotcom/node-bunyan#serializers|Bunyan Serializers API} - */ -export interface Serializers { - [key: string]: Serializer; -} - -/** - * The common set of `Logger` options. - */ -export interface LoggerOptions { - /** - * The logger name. - */ - name: string; - - /** - * The logger format type. Current options include LogFmt or JSON (default). - */ - format?: LoggerFormat; - - /** - * The logger's serializers. - */ - serializers?: Serializers; - /** - * Whether or not to log source file, line, and function information. - */ - src?: boolean; - /** - * The desired log level. - */ - level?: LoggerLevelValue; - /** - * A stream to write to. - */ - stream?: Writable; - /** - * An array of streams to write to. - */ - streams?: LoggerStream[]; -} - -/** - * Standard `Logger` levels. - * - * **See** {@link https://github.com/forcedotcom/node-bunyan#levels|Bunyan Levels} - */ -export enum LoggerLevel { - TRACE = 10, - DEBUG = 20, - INFO = 30, - WARN = 40, - ERROR = 50, - FATAL = 60, -} - -/** - * `Logger` format types. - */ -export enum LoggerFormat { - JSON, - LOGFMT, -} - -/** - * A Bunyan stream configuration. - * - * @see {@link https://github.com/forcedotcom/node-bunyan#streams|Bunyan Streams} - */ -export interface LoggerStream { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - [key: string]: any; - /** - * The type of stream -- may be inferred from other properties. - */ - type?: string; - /** - * The desired log level for the stream. - */ - level?: LoggerLevelValue; - /** - * The stream to write to. Mutually exclusive with `path`. - */ - stream?: Writable; - /** - * The name of the stream. - */ - name?: string; - /** - * A log file path to write to. Mutually exclusive with `stream`. - */ - path?: string; -} - -/** - * Any numeric `Logger` level. - */ -export type LoggerLevelValue = LoggerLevel | number; - -/** - * A collection of named `FieldValue`s. - * - * **See** {@link https://github.com/forcedotcom/node-bunyan#log-record-fields|Bunyan Log Record Fields} - */ -export interface Fields { - [key: string]: FieldValue; -} - -/** - * All possible field value types. - */ -export type FieldValue = string | number | boolean; - -/** - * Log line interface - */ -export interface LogLine { - name: string; - hostname: string; - pid: string; - log: string; - level: number; - msg: string; - time: string; - v: number; -} - -/** - * A logging abstraction powered by {@link https://github.com/forcedotcom/node-bunyan|Bunyan} that provides both a default - * logger configuration that will log to `sfdx.log`, and a way to create custom loggers based on the same foundation. - * - * ``` - * // Gets the root sfdx logger - * const logger = await Logger.root(); - * - * // Creates a child logger of the root sfdx logger with custom fields applied - * const childLogger = await Logger.child('myRootChild', {tag: 'value'}); - * - * // Creates a custom logger unaffiliated with the root logger - * const myCustomLogger = new Logger('myCustomLogger'); - * - * // Creates a child of a custom logger unaffiliated with the root logger with custom fields applied - * const myCustomChildLogger = myCustomLogger.child('myCustomChild', {tag: 'value'}); - * ``` - * **See** https://github.com/forcedotcom/node-bunyan - * - * **See** https://developer.salesforce.com/docs/atlas.en-us.sfdx_setup.meta/sfdx_setup/sfdx_dev_cli_log_messages.htm - */ -export class Logger { - /** - * The name of the root sfdx `Logger`. - */ - public static readonly ROOT_NAME = 'sf'; - - /** - * The default `LoggerLevel` when constructing new `Logger` instances. - */ - public static readonly DEFAULT_LEVEL = LoggerLevel.WARN; - - /** - * A list of all lower case `LoggerLevel` names. - * - * **See** {@link LoggerLevel} - */ - public static readonly LEVEL_NAMES = Object.values(LoggerLevel) - .filter(isString) - .map((v: string) => v.toLowerCase()); - // Rollup all instance-specific process event listeners together to prevent global `MaxListenersExceededWarning`s. - private static readonly lifecycle = ((): EventEmitter => { - const events = new EventEmitter(); - events.setMaxListeners(0); // never warn on listener counts - process.on('uncaughtException', (err) => events.emit('uncaughtException', err)); - process.on('exit', () => events.emit('exit')); - return events; - })(); - - // The sfdx root logger singleton - private static rootLogger?: Logger; - - /** - * The default rotation period for logs. Example '1d' will rotate logs daily (at midnight). - * See 'period' docs here: https://github.com/forcedotcom/node-bunyan#stream-type-rotating-file - */ - - public readonly logRotationPeriod = new Env().getString('SF_LOG_ROTATION_PERIOD') ?? '1d'; - - /** - * The number of backup rotated log files to keep. - * Example: '3' will have the base sf.log file, and the past 3 (period) log files. - * See 'count' docs here: https://github.com/forcedotcom/node-bunyan#stream-type-rotating-file - */ - - public readonly logRotationCount = new Env().getNumber('SF_LOG_ROTATION_COUNT') ?? 2; - - /** - * Whether debug is enabled for this Logger. - */ - public debugEnabled = false; - - // The actual Bunyan logger - private bunyan: Bunyan; - - private readonly format: LoggerFormat; - - /** - * Constructs a new `Logger`. - * - * @param optionsOrName A set of `LoggerOptions` or name to use with the default options. - * - * **Throws** *{@link SfError}{ name: 'RedundantRootLoggerError' }* More than one attempt is made to construct the root - * `Logger`. - */ - public constructor(optionsOrName: LoggerOptions | string) { - let options: LoggerOptions; - if (typeof optionsOrName === 'string') { - options = { - name: optionsOrName, - level: Logger.DEFAULT_LEVEL, - serializers: Bunyan.stdSerializers, - }; - } else { - options = optionsOrName; - } - - if (Logger.rootLogger && options.name === Logger.ROOT_NAME) { - throw new SfError('Can not create another root logger.', 'RedundantRootLoggerError'); - } - - // Inspect format to know what logging format to use then delete from options to - // ensure it doesn't conflict with Bunyan. - this.format = options.format ?? LoggerFormat.JSON; - delete options.format; - - // If the log format is LOGFMT, we need to convert any stream(s) into a LOGFMT type stream. - if (this.format === LoggerFormat.LOGFMT && options.stream) { - const ls: LoggerStream = this.createLogFmtFormatterStream({ stream: options.stream }); - options.stream = ls.stream; - } - if (this.format === LoggerFormat.LOGFMT && options.streams) { - const logFmtConvertedStreams: LoggerStream[] = []; - options.streams.forEach((ls: LoggerStream) => { - logFmtConvertedStreams.push(this.createLogFmtFormatterStream(ls)); - }); - options.streams = logFmtConvertedStreams; - } - - this.bunyan = new Bunyan(options); - this.bunyan.name = options.name; - this.bunyan.filters = []; - - if (!options.streams && !options.stream) { - this.bunyan.streams = []; - } - - // all SFDX loggers must filter sensitive data - this.addFilter((...args) => filterSecrets(...args)); - - if (Global.getEnvironmentMode() !== Mode.TEST) { - Logger.lifecycle.on('uncaughtException', this.uncaughtExceptionHandler); - Logger.lifecycle.on('exit', this.exitHandler); - } - - this.trace(`Created '${this.getName()}' logger instance`); - } - - /** - * Gets the root logger with the default level, file stream, and DEBUG enabled. - */ - public static async root(): Promise { - if (this.rootLogger) { - return this.rootLogger; - } - const rootLogger = (this.rootLogger = new Logger(Logger.ROOT_NAME).setLevel()); - - // disable log file writing, if applicable - const disableLogFile = new Env().getString('SF_DISABLE_LOG_FILE'); - if (disableLogFile !== 'true' && Global.getEnvironmentMode() !== Mode.TEST) { - await rootLogger.addLogFileStream(Global.LOG_FILE_PATH); - } - - rootLogger.enableDEBUG(); - return rootLogger; - } - - /** - * Gets the root logger with the default level, file stream, and DEBUG enabled. - */ - public static getRoot(): Logger { - if (this.rootLogger) { - return this.rootLogger; - } - const rootLogger = (this.rootLogger = new Logger(Logger.ROOT_NAME).setLevel()); - - // disable log file writing, if applicable - if (process.env.SFDX_DISABLE_LOG_FILE !== 'true' && Global.getEnvironmentMode() !== Mode.TEST) { - rootLogger.addLogFileStreamSync(Global.LOG_FILE_PATH); - } - - rootLogger.enableDEBUG(); - return rootLogger; - } - - /** - * Destroys the root `Logger`. - * - * @ignore - */ - public static destroyRoot(): void { - if (this.rootLogger) { - this.rootLogger.close(); - this.rootLogger = undefined; - } - } - - /** - * Create a child of the root logger, inheriting this instance's configuration such as `level`, `streams`, etc. - * - * @param name The name of the child logger. - * @param fields Additional fields included in all log lines. - */ - public static async child(name: string, fields?: Fields): Promise { - return (await Logger.root()).child(name, fields); - } - - /** - * Create a child of the root logger, inheriting this instance's configuration such as `level`, `streams`, etc. - * - * @param name The name of the child logger. - * @param fields Additional fields included in all log lines. - */ - public static childFromRoot(name: string, fields?: Fields): Logger { - return Logger.getRoot().child(name, fields); - } - - /** - * Gets a numeric `LoggerLevel` value by string name. - * - * @param {string} levelName The level name to convert to a `LoggerLevel` enum value. - * - * **Throws** *{@link SfError}{ name: 'UnrecognizedLoggerLevelNameError' }* The level name was not case-insensitively recognized as a valid `LoggerLevel` value. - * @see {@Link LoggerLevel} - */ - public static getLevelByName(levelName: string): LoggerLevelValue { - levelName = levelName.toUpperCase(); - if (!isKeyOf(LoggerLevel, levelName)) { - throw new SfError(`Invalid log level "${levelName}".`, 'UnrecognizedLoggerLevelNameError'); - } - return LoggerLevel[levelName]; - } - - /** - * Adds a stream. - * - * @param stream The stream configuration to add. - * @param defaultLevel The default level of the stream. - */ - public addStream(stream: LoggerStream, defaultLevel?: LoggerLevelValue): void { - if (this.format === LoggerFormat.LOGFMT) { - stream = this.createLogFmtFormatterStream(stream); - } - this.bunyan.addStream(stream, defaultLevel); - } - - /** - * Adds a file stream to this logger. Resolved or rejected upon completion of the addition. - * - * @param logFile The path to the log file. If it doesn't exist it will be created. - */ - public async addLogFileStream(logFile: string): Promise { - try { - // Check if we have write access to the log file (i.e., we created it already) - await fs.promises.access(logFile, fs.constants.W_OK); - } catch (err1) { - try { - if (process.platform === 'win32') { - await fs.promises.mkdir(path.dirname(logFile), { recursive: true }); - } else { - await fs.promises.mkdir(path.dirname(logFile), { recursive: true, mode: 0o700 }); - } - } catch (err2) { - throw SfError.wrap(err2 as string | Error); - } - try { - await fs.promises.writeFile(logFile, '', { mode: '600' }); - } catch (err3) { - throw SfError.wrap(err3 as string | Error); - } - } - - // avoid multiple streams to same log file - if ( - !this.bunyan.streams.find( - // No bunyan typings - // eslint-disable-next-line @typescript-eslint/no-explicit-any - (stream: any) => stream.type === 'rotating-file' && stream.path === logFile - ) - ) { - this.addStream({ - type: 'rotating-file', - path: logFile, - period: this.logRotationPeriod, - count: this.logRotationCount, - level: this.bunyan.level(), - }); - } - } - - /** - * Adds a file stream to this logger. Resolved or rejected upon completion of the addition. - * - * @param logFile The path to the log file. If it doesn't exist it will be created. - */ - public addLogFileStreamSync(logFile: string): void { - try { - // Check if we have write access to the log file (i.e., we created it already) - fs.accessSync(logFile, fs.constants.W_OK); - } catch (err1) { - try { - if (process.platform === 'win32') { - fs.mkdirSync(path.dirname(logFile), { recursive: true }); - } else { - fs.mkdirSync(path.dirname(logFile), { recursive: true, mode: 0o700 }); - } - } catch (err2) { - throw SfError.wrap(err2 as Error); - } - try { - fs.writeFileSync(logFile, '', { mode: '600' }); - } catch (err3) { - throw SfError.wrap(err3 as string | Error); - } - } - - // avoid multiple streams to same log file - if ( - !this.bunyan.streams.find( - // No bunyan typings - // eslint-disable-next-line @typescript-eslint/no-explicit-any - (stream: any) => stream.type === 'rotating-file' && stream.path === logFile - ) - ) { - this.addStream({ - type: 'rotating-file', - path: logFile, - period: this.logRotationPeriod, - count: this.logRotationCount, - level: this.bunyan.level(), - }); - } - } - - /** - * Gets the name of this logger. - */ - public getName(): string { - return this.bunyan.name; - } - - /** - * Gets the current level of this logger. - */ - public getLevel(): LoggerLevelValue { - return this.bunyan.level(); - } - - /** - * Set the logging level of all streams for this logger. If a specific `level` is not provided, this method will - * attempt to read it from the environment variable `SFDX_LOG_LEVEL`, and if not found, - * {@link Logger.DEFAULT_LOG_LEVEL} will be used instead. For convenience `this` object is returned. - * - * @param {LoggerLevelValue} [level] The logger level. - * - * **Throws** *{@link SfError}{ name: 'UnrecognizedLoggerLevelNameError' }* A value of `level` read from `SFDX_LOG_LEVEL` - * was invalid. - * - * ``` - * // Sets the level from the environment or default value - * logger.setLevel() - * - * // Set the level from the INFO enum - * logger.setLevel(LoggerLevel.INFO) - * - * // Sets the level case-insensitively from a string value - * logger.setLevel(Logger.getLevelByName('info')) - * ``` - */ - public setLevel(level?: LoggerLevelValue): Logger { - if (level == null) { - const logLevelFromEnvVar = new Env().getString('SF_LOG_LEVEL'); - level = logLevelFromEnvVar ? Logger.getLevelByName(logLevelFromEnvVar) : Logger.DEFAULT_LEVEL; - } - this.bunyan.level(level); - return this; - } - - /** - * Gets the underlying Bunyan logger. - */ - // leave this typed as any to keep if from trying to export the type from the untyped bunyan module - // this prevents consumers from getting node_modules/@salesforce/core/lib/logger.d.ts:281:24 - error TS2304: Cannot find name 'Bunyan'. - // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-explicit-any - public getBunyanLogger(): any { - return this.bunyan; - } - - /** - * Compares the requested log level with the current log level. Returns true if - * the requested log level is greater than or equal to the current log level. - * - * @param level The requested log level to compare against the currently set log level. - */ - public shouldLog(level: LoggerLevelValue): boolean { - if (typeof level === 'string') { - level = Bunyan.levelFromName(level) as number; - } - return level >= this.getLevel(); - } - - /** - * Use in-memory logging for this logger instance instead of any parent streams. Useful for testing. - * For convenience this object is returned. - * - * **WARNING: This cannot be undone for this logger instance.** - */ - public useMemoryLogging(): Logger { - this.bunyan.streams = []; - this.bunyan.ringBuffer = new Bunyan.RingBuffer({ limit: 5000 }); - this.addStream({ - type: 'raw', - stream: this.bunyan.ringBuffer, - level: this.bunyan.level(), - }); - return this; - } - - /** - * Gets an array of log line objects. Each element is an object that corresponds to a log line. - */ - public getBufferedRecords(): LogLine[] { - if (this.bunyan.ringBuffer) { - return this.bunyan.ringBuffer.records; - } - return []; - } - - /** - * Reads a text blob of all the log lines contained in memory or the log file. - */ - public readLogContentsAsText(): string { - if (this.bunyan.ringBuffer) { - return this.getBufferedRecords().reduce((accum, line) => { - accum += JSON.stringify(line) + os.EOL; - return accum; - }, ''); - } else { - let content = ''; - // No bunyan typings - // eslint-disable-next-line @typescript-eslint/no-explicit-any - this.bunyan.streams.forEach(async (stream: any) => { - if (stream.type === 'file') { - // eslint-disable-next-line @typescript-eslint/no-unsafe-argument - content += await fs.promises.readFile(stream.path, 'utf8'); - } - }); - return content; - } - } - - /** - * Adds a filter to be applied to all logged messages. - * - * @param filter A function with signature `(...args: any[]) => any[]` that transforms log message arguments. - */ - public addFilter(filter: (...args: unknown[]) => unknown): void { - if (!this.bunyan.filters) { - this.bunyan.filters = []; - } - this.bunyan.filters.push(filter); - } - - /** - * Close the logger, including any streams, and remove all listeners. - * - * @param fn A function with signature `(stream: LoggerStream) => void` to call for each stream with the stream as an arg. - */ - public close(fn?: (stream: LoggerStream) => void): void { - if (this.bunyan.streams) { - try { - this.bunyan.streams.forEach((entry: LoggerStream) => { - if (fn) { - fn(entry); - } - // close file streams, flush buffer to disk - // eslint-disable-next-line @typescript-eslint/unbound-method - if (entry.type === 'file' && entry.stream && isFunction(entry.stream.end)) { - entry.stream.end(); - } - }); - } finally { - Logger.lifecycle.removeListener('uncaughtException', this.uncaughtExceptionHandler); - Logger.lifecycle.removeListener('exit', this.exitHandler); - } - } - } - - /** - * Create a child logger, typically to add a few log record fields. For convenience this object is returned. - * - * @param name The name of the child logger that is emitted w/ log line as `log:`. - * @param fields Additional fields included in all log lines for the child logger. - */ - public child(name: string, fields: Fields = {}): Logger { - if (!name) { - throw new SfError('LoggerNameRequired'); - } - fields.log = name; - - const child = new Logger(name); - // only support including additional fields on log line (no config) - child.bunyan = this.bunyan.child(fields, true); - child.bunyan.name = name; - child.bunyan.filters = this.bunyan.filters; - - this.trace(`Setup child '${name}' logger instance`); - - return child; - } - - /** - * Add a field to all log lines for this logger. For convenience `this` object is returned. - * - * @param name The name of the field to add. - * @param value The value of the field to be logged. - */ - public addField(name: string, value: FieldValue): Logger { - this.bunyan.fields[name] = value; - return this; - } - - /** - * Logs at `trace` level with filtering applied. For convenience `this` object is returned. - * - * @param args Any number of arguments to be logged. - */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - public trace(...args: any[]): Logger { - // eslint-disable-next-line @typescript-eslint/no-unsafe-argument - this.bunyan.trace(this.applyFilters(LoggerLevel.TRACE, ...args)); - return this; - } - - /** - * Logs at `debug` level with filtering applied. For convenience `this` object is returned. - * - * @param args Any number of arguments to be logged. - */ - public debug(...args: unknown[]): Logger { - this.bunyan.debug(this.applyFilters(LoggerLevel.DEBUG, ...args)); - return this; - } - - /** - * Logs at `debug` level with filtering applied. - * - * @param cb A callback that returns on array objects to be logged. - */ - public debugCallback(cb: () => unknown[] | string): void { - if (this.getLevel() === LoggerLevel.DEBUG || process.env.DEBUG) { - const result = cb(); - if (isArray(result)) { - this.bunyan.debug(this.applyFilters(LoggerLevel.DEBUG, ...result)); - } else { - this.bunyan.debug(this.applyFilters(LoggerLevel.DEBUG, ...[result])); - } - } - } - - /** - * Logs at `info` level with filtering applied. For convenience `this` object is returned. - * - * @param args Any number of arguments to be logged. - */ - public info(...args: unknown[]): Logger { - this.bunyan.info(this.applyFilters(LoggerLevel.INFO, ...args)); - return this; - } - - /** - * Logs at `warn` level with filtering applied. For convenience `this` object is returned. - * - * @param args Any number of arguments to be logged. - */ - public warn(...args: unknown[]): Logger { - this.bunyan.warn(this.applyFilters(LoggerLevel.WARN, ...args)); - return this; - } - - /** - * Logs at `error` level with filtering applied. For convenience `this` object is returned. - * - * @param args Any number of arguments to be logged. - */ - public error(...args: unknown[]): Logger { - this.bunyan.error(this.applyFilters(LoggerLevel.ERROR, ...args)); - return this; - } - - /** - * Logs at `fatal` level with filtering applied. For convenience `this` object is returned. - * - * @param args Any number of arguments to be logged. - */ - public fatal(...args: unknown[]): Logger { - // always show fatal to stderr - // eslint-disable-next-line no-console - console.error(...args); - this.bunyan.fatal(this.applyFilters(LoggerLevel.FATAL, ...args)); - return this; - } - - /** - * Enables logging to stdout when the DEBUG environment variable is used. It uses the logger - * name as the debug name, so you can do DEBUG= to filter the results to your logger. - */ - public enableDEBUG(): void { - // The debug library does this for you, but no point setting up the stream if it isn't there - if (process.env.DEBUG && !this.debugEnabled) { - const debuggers: Dictionary = {}; - - debuggers.core = Debug(`${this.getName()}:core`); - - this.addStream({ - name: 'debug', - stream: new Writable({ - write: (chunk, encoding, next) => { - try { - // eslint-disable-next-line @typescript-eslint/no-unsafe-argument - const json = parseJsonMap(chunk.toString()); - const logLevel = ensureNumber(json.level); - if (this.getLevel() <= logLevel) { - let debuggerName = 'core'; - if (isString(json.log)) { - debuggerName = json.log; - if (!debuggers[debuggerName]) { - debuggers[debuggerName] = Debug(`${this.getName()}:${debuggerName}`); - } - } - const level = LoggerLevel[logLevel]; - ensure(debuggers[debuggerName])(`${level} ${json.msg}`); - } - } catch (err) { - // do nothing - } - next(); - }, - }), - // Consume all levels - level: 0, - }); - this.debugEnabled = true; - } - } - - private applyFilters(logLevel: LoggerLevel, ...args: unknown[]): Optional> { - if (this.shouldLog(logLevel)) { - // No bunyan typings - // eslint-disable-next-line @typescript-eslint/no-explicit-any - this.bunyan.filters.forEach((filter: any) => (args = filter(...args))); - } - return args && args.length === 1 ? args[0] : args; - } - - private uncaughtExceptionHandler = (err: Error) => { - // W-7558552 - // Only log uncaught exceptions in root logger - if (this === Logger.rootLogger) { - // log the exception - // FIXME: good chance this won't be logged because - // process.exit was called before this is logged - // https://github.com/trentm/node-bunyan/issues/95 - this.fatal(err); - } - }; - - private exitHandler = () => { - this.close(); - }; - - // eslint-disable-next-line class-methods-use-this - private createLogFmtFormatterStream(loggerStream: LoggerStream): LoggerStream { - const logFmtWriteableStream = new Writable({ - write: (chunk, enc, cb) => { - try { - // eslint-disable-next-line @typescript-eslint/no-unsafe-argument - const parsedJSON = JSON.parse(chunk.toString()); - // eslint-disable-next-line @typescript-eslint/no-unsafe-argument - const keys = Object.keys(parsedJSON); - - let logEntry = ''; - keys.forEach((key) => { - let logMsg = `${parsedJSON[key]}`; - if (logMsg.trim().includes(' ')) { - logMsg = `"${logMsg}"`; - } - logEntry += `${key}=${logMsg} `; - }); - if (loggerStream.stream) { - loggerStream.stream.write(logEntry.trimRight() + '\n'); - } - } catch (error) { - if (loggerStream.stream) { - loggerStream.stream.write(chunk.toString()); - } - } - cb(null); - }, - }); - - return Object.assign({}, loggerStream, { stream: logFmtWriteableStream }); - } -} - -type FilteredKey = string | { name: string; regex: string }; - -// Ok to log clientid -const FILTERED_KEYS: FilteredKey[] = [ - 'sid', - 'Authorization', - // Any json attribute that contains the words "access" and "token" will have the attribute/value hidden - { name: 'access_token', regex: 'access[^\'"]*token' }, - // Any json attribute that contains the words "refresh" and "token" will have the attribute/value hidden - { name: 'refresh_token', regex: 'refresh[^\'"]*token' }, - 'clientsecret', - // Any json attribute that contains the words "sfdx", "auth", and "url" will have the attribute/value hidden - { name: 'sfdxauthurl', regex: 'sfdx[^\'"]*auth[^\'"]*url' }, -]; - -// SFDX code and plugins should never show tokens or connect app information in the logs -const filterSecrets = (...args: unknown[]): unknown => - args.map((arg) => { - if (isArray(arg)) { - return filterSecrets(...arg); - } - - if (arg) { - let mutableArg: string; - - // Normalize all objects into a string. This include errors. - if (arg instanceof Buffer) { - mutableArg = ''; - } else if (isObject(arg)) { - mutableArg = JSON.stringify(arg); - } else if (isString(arg)) { - mutableArg = arg; - } else { - mutableArg = ''; - } - - const HIDDEN = 'HIDDEN'; - - FILTERED_KEYS.forEach((key: FilteredKey) => { - let expElement = key; - let expName = key; - - // Filtered keys can be strings or objects containing regular expression components. - if (isPlainObject(key)) { - expElement = key.regex; - expName = key.name; - } - - const hiddenAttrMessage = `"<${expName} - ${HIDDEN}>"`; - - // Match all json attribute values case insensitive: ex. {" Access*^&(*()^* Token " : " 45143075913458901348905 \n\t" ...} - const regexTokens = new RegExp(`(['"][^'"]*${expElement}[^'"]*['"]\\s*:\\s*)['"][^'"]*['"]`, 'gi'); - - mutableArg = mutableArg.replace(regexTokens, `$1${hiddenAttrMessage}`); - - // Match all key value attribute case insensitive: ex. {" key\t" : ' access_token ' , " value " : " dsafgasr431 " ....} - const keyRegex = new RegExp( - `(['"]\\s*key\\s*['"]\\s*:)\\s*['"]\\s*${expElement}\\s*['"]\\s*.\\s*['"]\\s*value\\s*['"]\\s*:\\s*['"]\\s*[^'"]*['"]`, - 'gi' - ); - mutableArg = mutableArg.replace(keyRegex, `$1${hiddenAttrMessage}`); - }); - - mutableArg = mutableArg.replace(/(00D\w{12,15})![.\w]*/, `<${HIDDEN}>`); - - // return an object if an object was logged; otherwise return the filtered string. - return isObject(arg) ? parseJson(mutableArg) : mutableArg; - } else { - return arg; - } - }); diff --git a/src/logger/cleanup.ts b/src/logger/cleanup.ts new file mode 100644 index 0000000000..b9d0c2f395 --- /dev/null +++ b/src/logger/cleanup.ts @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2023, 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 fs from 'node:fs'; +import { join } from 'node:path'; +import { Global } from '../global'; +import { Logger } from './logger'; + +/** + * the odds of running are 1 in CLEAN_ODDS + * ex: CLEAN_ODDS=100 implies 1 in 100 + * ex: CLEAN_ODDS=1 implies 1 in 1 (run every time) + * */ +const CLEAN_ODDS = 100; +const MAX_FILE_AGE_DAYS = 7; +const MAX_FILE_AGE_MS = 1000 * 60 * 60 * 24 * MAX_FILE_AGE_DAYS; + +const shouldClean = Math.random() * CLEAN_ODDS > CLEAN_ODDS - 1; + +/** + * New logger (Summer 2023) changes how file rotation works. Each day, the logger writes to a new file + * To get old files cleaned up, this can be called when a new root logger is instantiated + * based on CLEAN_ODDS, it could exit OR delete some old log files + * + * to start this without waiting, use void cleanup() + * + * accepts params to override the default behavior (used to cleanup huge log file during perf tests) + */ +export const cleanup = async (maxMs = MAX_FILE_AGE_MS, force = false): Promise => { + if (shouldClean || force) { + try { + const filesToConsider = await fs.promises // get the files in that dir + .readdir(Global.SF_DIR); + + const filesToDelete = getOldLogFiles(filesToConsider, maxMs); + await Promise.all(filesToDelete.map((f) => fs.promises.unlink(join(Global.SF_DIR, f)))); + } catch (e) { + // we never, ever, ever throw since we're not awaiting this promise, so just log a warning + (await Logger.child('cleanup')).warn('Failed to cleanup old log files', e); + } + } +}; + +export const getOldLogFiles = (files: string[], maxMs = MAX_FILE_AGE_MS): string[] => + files + .filter((f) => f.endsWith('.log')) + // map of filename and the date sf-YYYY-MM-DD.log => YYYY-MM-DD + .map((f) => ({ file: f, date: f.match(/sf-(\d{4}-\d{2}-\d{2}).*\.log/)?.[1] })) + .filter(hasDate) + .map((f) => ({ file: f.file, date: new Date(f.date) })) + .filter((f) => f.date < new Date(Date.now() - maxMs)) + .map((f) => f.file); + +const hasDate = (f: unknown): f is { file: string; date: string } => + typeof f === 'object' && f !== null && 'date' in f && typeof f.date === 'string'; diff --git a/src/logger/filters.ts b/src/logger/filters.ts new file mode 100644 index 0000000000..d49fffc553 --- /dev/null +++ b/src/logger/filters.ts @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2023, 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 { isArray, isObject, isString } from '@salesforce/ts-types'; +import { accessTokenRegex, sfdxAuthUrlRegex } from '../util/sfdc'; +export const HIDDEN = 'HIDDEN'; + +type FilteredKeyDefinition = { name: string; regex?: string }; +type FilteredKeyForProcessing = FilteredKeyDefinition & { + hiddenAttrMessage: string; + regexTokens: RegExp; + keyRegex: RegExp; +}; + +type Replacer = (input: T) => T; + +// Match all json attribute values case insensitive: ex. {" Access*^&(*()^* Token " : " 45143075913458901348905 \n\t" ...} +const buildTokens = (expElement: string): RegExp => + new RegExp(`(['"][^'"]*${expElement}[^'"]*['"]\\s*:\\s*)['"][^'"]*['"]`, 'gi'); + +// Match all key value attribute case insensitive: ex. {" key\t" : ' access_token ' , " value " : " dsafgasr431 " ....} +const buildKeyRegex = (expElement: string): RegExp => + RegExp( + `(['"]\\s*key\\s*['"]\\s*:)\\s*['"]\\s*${expElement}\\s*['"]\\s*.\\s*['"]\\s*value\\s*['"]\\s*:\\s*['"]\\s*[^'"]*['"]`, + 'gi' + ); + +// This will redact values when the keys match certain patterns +const FILTERED_KEYS: FilteredKeyDefinition[] = [ + { name: 'sid' }, + { name: 'Authorization' }, + // Any json attribute that contains the words "refresh" and "token" will have the attribute/value hidden + { name: 'refresh_token', regex: 'refresh[^\'"]*token' }, + { name: 'clientsecret' }, + { name: 'authcode' }, +]; + +const FILTERED_KEYS_FOR_PROCESSING: FilteredKeyForProcessing[] = FILTERED_KEYS.map((key) => ({ + ...key, + regexTokens: buildTokens(key.regex ?? key.name), + hiddenAttrMessage: `"<${key.name} - ${HIDDEN}>"`, + keyRegex: buildKeyRegex(key.regex ?? key.name), +})); + +const compose = (...fns: Array>): Replacer => + fns.reduce((prevFn, nextFn) => (value: T) => prevFn(nextFn(value))); + +const replacementFunctions = FILTERED_KEYS_FOR_PROCESSING.flatMap( + (key): Array> => [ + // two functions to run across each key + (input: string): string => input.replace(key.regexTokens, `$1${key.hiddenAttrMessage}`), + (input: string): string => input.replace(key.keyRegex, `$1${key.hiddenAttrMessage}`), + ] +).concat([ + // plus any "generalized" functions that are matching contents regardless of keys + // use these for secrets with known patterns + (input: string): string => + input + .replace(new RegExp(accessTokenRegex, 'g'), '') + .replace(new RegExp(sfdxAuthUrlRegex, 'g'), ''), + // conditional replacement for clientId: leave the value if it's the PlatformCLI, otherwise redact it + (input: string): string => + input.replace(/(['"]client.*Id['"])\s*:\s*(['"][^'"]*['"])/gi, (all, key: string, value: string) => + value.includes('PlatformCLI') ? `${key}:${value}` : `${key}:""` + ), +]); + +const fullReplacementChain = compose(...replacementFunctions); +/** + * + * @param args you *probably are passing this an object, but it can handle any type + * @returns + */ +export const filterSecrets = (...args: unknown[]): unknown => + args.map((arg) => { + if (!arg) { + return arg; + } + if (isArray(arg)) { + return filterSecrets(...arg); + } + + // Normalize all objects into a string. This includes errors. + if (arg instanceof Buffer) { + return ''; + } + if (isObject(arg)) { + return JSON.parse(fullReplacementChain(JSON.stringify(arg))) as Record; + } + if (isString(arg)) { + return fullReplacementChain(arg); + } + return ''; + }); diff --git a/src/logger/logger.ts b/src/logger/logger.ts new file mode 100644 index 0000000000..8d79607051 --- /dev/null +++ b/src/logger/logger.ts @@ -0,0 +1,512 @@ +/* + * 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 * as os from 'node:os'; +import * as path from 'node:path'; + +import { Logger as PinoLogger, pino } from 'pino'; +import { Env } from '@salesforce/kit'; +import { isKeyOf, isString } from '@salesforce/ts-types'; +import { Global, Mode } from '../global'; +import { SfError } from '../sfError'; +import { unwrapArray } from '../util/unwrapArray'; +import { MemoryLogger } from './memoryLogger'; +import { cleanup } from './cleanup'; + +/** + * The common set of `Logger` options. + */ +export type LoggerOptions = { + /** + * The logger name. + */ + name: string; + + /** + * The desired log level. + */ + level?: LoggerLevelValue; + + /** + * Create a logger with the fields set + */ + fields?: Fields; + + /** log to memory instead of to a file. Intended for Unit Testing */ + useMemoryLogger?: boolean; +}; + +/** + * Standard `Logger` levels. + * + * **See** {@link https://getpino.io/#/docs/api?id=logger-level |Logger Levels} + */ +export enum LoggerLevel { + TRACE = 10, + DEBUG = 20, + INFO = 30, + WARN = 40, + ERROR = 50, + FATAL = 60, +} + +/** + * Any numeric `Logger` level. + */ +export type LoggerLevelValue = LoggerLevel | number; + +/** + * An object + */ +export type Fields = Record; + +/** + * All possible field value types. + */ +export type FieldValue = string | number | boolean | Fields; + +/** + * Log line interface + */ +export type LogLine = { + name: string; + hostname: string; + pid: string; + log: string; + level: number; + msg: string; + time: string; + v: number; +}; + +/** + * A logging abstraction powered by {@link https://github.com/pinojs/pino | Pino} that provides both a default + * logger configuration that will log to the default path, and a way to create custom loggers based on the same foundation. + * + * ``` + * // Gets the root sfdx logger + * const logger = await Logger.root(); + * + * // Creates a child logger of the root sfdx logger with custom fields applied + * const childLogger = await Logger.child('myRootChild', {tag: 'value'}); + * + * // Creates a custom logger unaffiliated with the root logger + * const myCustomLogger = new Logger('myCustomLogger'); + * + * // Creates a child of a custom logger unaffiliated with the root logger with custom fields applied + * const myCustomChildLogger = myCustomLogger.child('myCustomChild', {tag: 'value'}); + * + * // get a raw pino logger from the root instance of Logger + * // you can use these to avoid constructing another Logger wrapper class and to get better type support + * const logger = Logger.getRawRootLogger().child({name: 'foo', otherProp: 'bar'}); + * logger.info({some: 'stuff'}, 'a message'); + * + * + * // get a raw pino logger from the current instance + * const childLogger = await Logger.child('myRootChild', {tag: 'value'}); + * const logger = childLogger.getRawLogger(); + * ``` + * + * **See** https://developer.salesforce.com/docs/atlas.en-us.sfdx_setup.meta/sfdx_setup/sfdx_dev_cli_log_messages.htm + */ +export class Logger { + /** + * The name of the root sfdx `Logger`. + */ + public static readonly ROOT_NAME = 'sf'; + + /** + * The default `LoggerLevel` when constructing new `Logger` instances. + */ + public static readonly DEFAULT_LEVEL = LoggerLevel.WARN; + + /** + * A list of all lower case `LoggerLevel` names. + * + * **See** {@link LoggerLevel} + */ + public static readonly LEVEL_NAMES = Object.values(LoggerLevel) + .filter(isString) + .map((v: string) => v.toLowerCase()); + + // The sfdx root logger singleton + private static rootLogger?: Logger; + + private pinoLogger: PinoLogger; + + private memoryLogger?: MemoryLogger; + /** + * Constructs a new `Logger`. + * + * @param optionsOrName A set of `LoggerOptions` or name to use with the default options. + * + * **Throws** *{@link SfError}{ name: 'RedundantRootLoggerError' }* More than one attempt is made to construct the root + * `Logger`. + */ + public constructor(optionsOrName: LoggerOptions | string) { + const enabled = process.env.SFDX_DISABLE_LOG_FILE !== 'true' && process.env.SF_DISABLE_LOG_FILE !== 'true'; + + const options: LoggerOptions = + typeof optionsOrName === 'string' + ? { name: optionsOrName, level: Logger.DEFAULT_LEVEL, fields: {} } + : optionsOrName; + + if (Logger.rootLogger && options.name === Logger.ROOT_NAME) { + throw new SfError('Can not create another root logger.', 'RedundantRootLoggerError'); + } + + // if there is a rootLogger, use its Pino instance + if (Logger.rootLogger) { + this.pinoLogger = Logger.rootLogger.pinoLogger.child({ ...options.fields, name: options.name }); + this.memoryLogger = Logger.rootLogger.memoryLogger; // if the root was constructed with memory logging, keep that + this.pinoLogger.trace(`Created '${options.name}' child logger instance`); + } else { + const level = computeLevel(options.level); + const commonOptions = { + name: options.name ?? Logger.ROOT_NAME, + base: options.fields ?? {}, + level, + enabled, + }; + if (Boolean(options.useMemoryLogger) || Global.getEnvironmentMode() === Mode.TEST || !enabled) { + this.memoryLogger = new MemoryLogger(); + this.pinoLogger = pino(commonOptions, this.memoryLogger); + } else { + this.pinoLogger = pino({ + ...commonOptions, + transport: { + pipeline: [ + { + target: path.join('..', '..', 'lib', 'logger', 'transformStream'), + }, + getWriteStream(level), + ], + }, + }); + // when a new file logger root is instantiated, we check for old log files. + // but we don't want to wait for it + // and it's async and we can't wait from a ctor anyway + void cleanup(); + } + + Logger.rootLogger = this; + } + } + + /** + * + * Gets the root logger. It's a singleton + * See also getRawLogger if you don't need the root logger + */ + public static async root(): Promise { + return Promise.resolve(this.getRoot()); + } + + /** + * Gets the root logger. It's a singleton + */ + public static getRoot(): Logger { + if (this.rootLogger) { + return this.rootLogger; + } + const rootLogger = (this.rootLogger = new Logger(Logger.ROOT_NAME)); + return rootLogger; + } + + /** + * Destroys the root `Logger`. + * + * @ignore + */ + public static destroyRoot(): void { + if (this.rootLogger) { + this.rootLogger = undefined; + } + } + + /** + * Create a child of the root logger, inheriting this instance's configuration such as `level`, transports, etc. + * + * @param name The name of the child logger. + * @param fields Additional fields included in all log lines. + */ + public static async child(name: string, fields?: Fields): Promise { + return (await Logger.root()).child(name, fields); + } + + /** + * Create a child of the root logger, inheriting this instance's configuration such as `level`, transports, etc. + * + * @param name The name of the child logger. + * @param fields Additional fields included in all log lines. + */ + public static childFromRoot(name: string, fields?: Fields): Logger { + return Logger.getRoot().child(name, fields); + } + + /** + * Gets a numeric `LoggerLevel` value by string name. + * + * @param {string} levelName The level name to convert to a `LoggerLevel` enum value. + * + * **Throws** *{@link SfError}{ name: 'UnrecognizedLoggerLevelNameError' }* The level name was not case-insensitively recognized as a valid `LoggerLevel` value. + * @see {@Link LoggerLevel} + */ + public static getLevelByName(levelName: string): LoggerLevelValue { + const upperLevel = levelName.toUpperCase(); + if (!isKeyOf(LoggerLevel, upperLevel)) { + throw new SfError(`Invalid log level "${upperLevel}".`, 'UnrecognizedLoggerLevelNameError'); + } + return LoggerLevel[upperLevel]; + } + + /** get the bare (pino) logger instead of using the class hierarchy */ + public static getRawRootLogger(): PinoLogger { + return Logger.getRoot().pinoLogger; + } + + /** get the bare (pino) logger instead of using the class hierarchy */ + public getRawLogger(): PinoLogger { + return this.pinoLogger; + } + + /** + * Gets the name of this logger. + */ + public getName(): string { + return (this.pinoLogger.bindings().name as string) ?? ''; + } + + /** + * Gets the current level of this logger. + */ + public getLevel(): LoggerLevelValue { + return this.pinoLogger.levelVal; + } + + /** + * Set the logging level of all streams for this logger. If a specific `level` is not provided, this method will + * attempt to read it from the environment variable `SFDX_LOG_LEVEL`, and if not found, + * {@link Logger.DEFAULT_LOG_LEVEL} will be used instead. For convenience `this` object is returned. + * + * @param {LoggerLevelValue} [level] The logger level. + * + * **Throws** *{@link SfError}{ name: 'UnrecognizedLoggerLevelNameError' }* A value of `level` read from `SFDX_LOG_LEVEL` + * was invalid. + * + * ``` + * // Sets the level from the environment or default value + * logger.setLevel() + * + * // Set the level from the INFO enum + * logger.setLevel(LoggerLevel.INFO) + * + * // Sets the level case-insensitively from a string value + * logger.setLevel(Logger.getLevelByName('info')) + * ``` + */ + public setLevel(level?: LoggerLevelValue): Logger { + this.pinoLogger.level = + this.pinoLogger.levels.labels[level ?? getDefaultLevel()] ?? this.pinoLogger.levels.labels[Logger.DEFAULT_LEVEL]; + return this; + } + + /** + * Compares the requested log level with the current log level. Returns true if + * the requested log level is greater than or equal to the current log level. + * + * @param level The requested log level to compare against the currently set log level. + */ + public shouldLog(level: LoggerLevelValue): boolean { + return (typeof level === 'string' ? this.pinoLogger.levelVal : level) >= this.getLevel(); + } + + /** + * Gets an array of log line objects. Each element is an object that corresponds to a log line. + */ + public getBufferedRecords(): LogLine[] { + if (!this.memoryLogger) { + throw new Error('getBufferedRecords is only supported when useMemoryLogging is true'); + } + return (this.memoryLogger?.loggedData as unknown as LogLine[]) ?? []; + } + + /** + * Reads a text blob of all the log lines contained in memory or the log file. + */ + public readLogContentsAsText(): string { + if (this.memoryLogger) { + return this.memoryLogger?.loggedData.map((line) => JSON.stringify(line)).join(os.EOL); + } else { + this.pinoLogger.warn( + 'readLogContentsAsText is not supported for file streams, only used when useMemoryLogging is true' + ); + const content = ''; + return content; + } + } + + /** + * Create a child logger, typically to add a few log record fields. For convenience this object is returned. + * + * @param name The name of the child logger that is emitted w/ log line. Will be prefixed with the parent logger name and `:` + * @param fields Additional fields included in all log lines for the child logger. + */ + public child(name: string, fields: Fields = {}): Logger { + const fullName = `${this.getName()}:${name}`; + const child = new Logger({ name: fullName, fields }); + this.pinoLogger.trace(`Setup child '${fullName}' logger instance`); + + return child; + } + + /** + * Add a field to all log lines for this logger. For convenience `this` object is returned. + * + * @param name The name of the field to add. + * @param value The value of the field to be logged. + */ + public addField(name: string, value: FieldValue): Logger { + this.pinoLogger.setBindings({ ...this.pinoLogger.bindings(), [name]: value }); + return this; + } + + /** + * Logs at `trace` level with filtering applied. For convenience `this` object is returned. + * + * @param args Any number of arguments to be logged. + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + public trace(...args: any[]): Logger { + this.pinoLogger.trace(unwrapArray(args)); + return this; + } + + /** + * Logs at `debug` level with filtering applied. For convenience `this` object is returned. + * + * @param args Any number of arguments to be logged. + */ + public debug(...args: unknown[]): Logger { + this.pinoLogger.debug(unwrapArray(args)); + return this; + } + + /** + * Logs at `debug` level with filtering applied. + * + * @param cb A callback that returns on array objects to be logged. + */ + // eslint-disable-next-line class-methods-use-this, @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function + public debugCallback(cb: () => unknown[] | string): void {} + + /** + * Logs at `info` level with filtering applied. For convenience `this` object is returned. + * + * @param args Any number of arguments to be logged. + */ + public info(...args: unknown[]): Logger { + this.pinoLogger.info(unwrapArray(args)); + return this; + } + + /** + * Logs at `warn` level with filtering applied. For convenience `this` object is returned. + * + * @param args Any number of arguments to be logged. + */ + public warn(...args: unknown[]): Logger { + this.pinoLogger.warn(unwrapArray(args)); + return this; + } + + /** + * Logs at `error` level with filtering applied. For convenience `this` object is returned. + * + * @param args Any number of arguments to be logged. + */ + public error(...args: unknown[]): Logger { + this.pinoLogger.error(unwrapArray(args)); + return this; + } + + /** + * Logs at `fatal` level with filtering applied. For convenience `this` object is returned. + * + * @param args Any number of arguments to be logged. + */ + public fatal(...args: unknown[]): Logger { + // always show fatal to stderr + // IMPORTANT: + // Do not use console.error() here, if fatal() is called from the uncaughtException handler, it + // will be re-thrown and caught again by the uncaughtException handler, causing an infinite loop. + console.log(...args); // eslint-disable-line no-console + this.pinoLogger.fatal(unwrapArray(args)); + return this; + } +} + +/** return various streams that the logger could send data to, depending on the options and env */ +const getWriteStream = (level = 'warn'): pino.TransportSingleOptions => { + // used when debug mode, writes to stdout (colorized) + if (process.env.DEBUG) { + return { + target: 'pino-pretty', + options: { colorize: true }, + }; + } + + // default: we're writing to a rotating file + const rotator = new Map([ + ['1m', new Date().toISOString().split(':').slice(0, 2).join('-')], + ['1h', new Date().toISOString().split(':').slice(0, 1).join('-')], + ['1d', new Date().toISOString().split('T')[0]], + ]); + const logRotationPeriod = new Env().getString('SF_LOG_ROTATION_PERIOD') ?? '1d'; + + return { + // write to a rotating file + target: 'pino/file', + options: { + destination: path.join(Global.SF_DIR, `sf-${rotator.get(logRotationPeriod) ?? rotator.get('1d')}.log`), + mkdir: true, + level, + }, + }; +}; + +export const computeLevel = (optionsLevel?: number | string): string => { + const env = new Env(); + const envValue = isNaN(env.getNumber('SF_LOG_LEVEL') ?? NaN) + ? env.getString('SF_LOG_LEVEL') + : env.getNumber('SF_LOG_LEVEL'); + + if (typeof envValue !== 'undefined') { + return typeof envValue === 'string' ? envValue : numberToLevel(envValue); + } + return levelFromOption(optionsLevel); +}; + +const levelFromOption = (value?: string | number): string => { + switch (typeof value) { + case 'number': + return numberToLevel(value); + case 'string': + return value; + default: + return pino.levels.labels[Logger.DEFAULT_LEVEL]; + } +}; +// /** match a number to a pino level, or if a match isn't found, the next highest level */ +const numberToLevel = (level: number): string => + pino.levels.labels[level] ?? + Object.entries(pino.levels.labels).find(([value]) => Number(value) > level)?.[1] ?? + 'warn'; + +const getDefaultLevel = (): LoggerLevel => { + const logLevelFromEnvVar = new Env().getString('SF_LOG_LEVEL'); + return logLevelFromEnvVar ? Logger.getLevelByName(logLevelFromEnvVar) : Logger.DEFAULT_LEVEL; +}; diff --git a/src/logger/memoryLogger.ts b/src/logger/memoryLogger.ts new file mode 100644 index 0000000000..a88be2c61a --- /dev/null +++ b/src/logger/memoryLogger.ts @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2023, 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 { Writable } from 'node:stream'; +import { unwrapArray } from '../util/unwrapArray'; +import { filterSecrets } from './filters'; + +/** + * Used by test setup to keep UT from writing to disk. + */ +export class MemoryLogger extends Writable { + public loggedData: Array> = []; + + public constructor() { + super({ objectMode: true }); + } + + public _write(chunk: Record, encoding: string, callback: (err?: Error) => void): void { + const filteredChunk = unwrapArray(filterSecrets([chunk])); + this.loggedData.push( + typeof filteredChunk === 'string' + ? (JSON.parse(filteredChunk) as Record) + : (filteredChunk as Record) + ); + callback(); + } +} diff --git a/src/logger/transformStream.ts b/src/logger/transformStream.ts new file mode 100644 index 0000000000..e813204be4 --- /dev/null +++ b/src/logger/transformStream.ts @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2023, 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 { pipeline, Transform } from 'node:stream'; +import { unwrapArray } from '../util/unwrapArray'; +import { filterSecrets } from './filters'; + +// eslint-disable-next-line @typescript-eslint/no-var-requires, @typescript-eslint/no-unsafe-assignment +const build = require('pino-abstract-transport'); + +export default function (): Transform { + // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-call + return build( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (source: any): Transform => { + const myTransportStream = new Transform({ + objectMode: true, + transform(chunk: Record, enc, cb): void { + if (debugAllows(chunk)) { + // uses the original logger's filters. + const filteredChunk = unwrapArray(filterSecrets([chunk])); + const stringified = JSON.stringify(filteredChunk); + this.push(stringified.concat('\n')); + } + cb(); + }, + }); + // eslint-disable-next-line @typescript-eslint/no-empty-function + pipeline(source, myTransportStream, () => {}); + return myTransportStream; + }, + { + // This is needed to be able to pipeline transports. + enablePipelining: true, + } + ); +} + +/** if the DEBUG= is set, see if that matches the logger name. If not, we don't want to keep going */ +const debugAllows = (chunk: Record): boolean => { + if (!process.env.DEBUG || process.env.DEBUG === '*') return true; + if (typeof chunk.name !== 'string') return true; + // turn wildcard patterns into regexes + const regexFromDebug = new RegExp(process.env.DEBUG.replace(/\*/g, '.*')); + if (!regexFromDebug.test(chunk.name)) { + // console.log(`no match : ${chunk.name} for ${process.env.DEBUG}`); + return false; + } else { + // console.log(`match : ${chunk.name} for ${process.env.DEBUG}`); + return true; + } +}; diff --git a/src/messageTransformer.ts b/src/messageTransformer.ts new file mode 100644 index 0000000000..8095aa4e53 --- /dev/null +++ b/src/messageTransformer.ts @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2023, 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-next-line import/no-extraneous-dependencies +import ts from 'typescript'; +import { Messages, StoredMessageMap } from './messages'; + +/** + * + * @experimental + * transforms `messages` references from dynamic run-time to static compile-time values + */ +export const messageTransformer = (): ts.TransformerFactory => { + Messages.importMessagesDirectory(process.cwd()); + const transformerFactory: ts.TransformerFactory = (context) => (sourceFile) => { + if ( + // if there are no messages, no transformation is needed + !sourceFile.statements.some((i) => ts.isImportDeclaration(i) && i.importClause?.getText().includes('Messages')) || + // don't transform the transformer itself + sourceFile.fileName.includes('messageTransformer.ts') + ) { + return sourceFile; + } + + const visitor = (node: ts.Node): ts.VisitResult => { + if (ts.isExpressionStatement(node) && node.getText().includes('importMessagesDirectory')) { + // importMessagesDirectory now happens at compile, not in runtime + // returning undefined removes the node + return ts.factory.createEmptyStatement(); + } + if ( + // transform a runtime load call into hardcoded messages values + // const foo = Messages.load|loadMessages('pluginName', 'messagesFile' ...) => + // const foo = new Messages('pluginName', 'messagesFile', new Map([['key', 'value']])) + ts.isCallExpression(node) && + ts.isPropertyAccessExpression(node.expression) && + node.expression.expression.getText() === 'Messages' && + node.expression.name.getText().includes('load') + ) { + // we always want the first two arguments, which are the plugin name and the messages file name + const arrayMembers = node.arguments.slice(0, 2); + const arrayMembersText = arrayMembers.map(getTextWithoutQuotes); + + // Messages doesn't care whether you call messages.load or loadMessages, it loads the whole file + const messagesInstance = Messages.loadMessages(arrayMembersText[0], arrayMembersText[1]); + return context.factory.createNewExpression(node.expression.expression, undefined, [ + arrayMembers[0], + arrayMembers[1], + context.factory.createNewExpression(context.factory.createIdentifier('Map'), undefined, [ + messageMapToHardcodedMap(messagesInstance.messages), + ]), + ]); + } + // it might be a node that contains one of the things we're interested in, so keep digging + return ts.visitEachChild(node, visitor, context); + }; + return ts.visitNode(sourceFile, visitor, ts.isSourceFile); + }; + return transformerFactory; +}; + +export default messageTransformer; + +const getTextWithoutQuotes = (node: ts.Node): string => node.getText().replace(/'/g, ''); + +/** turn a loaded message map into */ +const messageMapToHardcodedMap = (messages: StoredMessageMap): ts.ArrayLiteralExpression => + ts.factory.createArrayLiteralExpression( + Array.from(messages).map(([key, value]) => { + // case 1: string + if (typeof value === 'string') { + return ts.factory.createArrayLiteralExpression([ + ts.factory.createStringLiteral(key), + ts.factory.createStringLiteral(value), + ]); + } else if (Array.isArray(value)) { + // case 2: string[] + return ts.factory.createArrayLiteralExpression([ + ts.factory.createStringLiteral(key), + ts.factory.createArrayLiteralExpression(value.map((v) => ts.factory.createStringLiteral(v))), + ]); + } else { + // turn the object into a map and recurse! + return messageMapToHardcodedMap(new Map(Object.entries(value))); + } + }) + ); diff --git a/src/messages.ts b/src/messages.ts index bfb35628a3..cf18a666e0 100644 --- a/src/messages.ts +++ b/src/messages.ts @@ -5,12 +5,13 @@ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause */ -import * as fs from 'fs'; -import * as os from 'os'; -import * as path from 'path'; -import * as util from 'util'; +import * as fs from 'node:fs'; +import * as os from 'node:os'; +import * as path from 'node:path'; +import * as util from 'node:util'; +import { fileURLToPath } from 'node:url'; import { AnyJson, asString, ensureJsonMap, ensureString, isJsonMap, isObject } from '@salesforce/ts-types'; -import { ensureArray, NamedError, upperFirst } from '@salesforce/kit'; +import { ensureArray, upperFirst } from '@salesforce/kit'; import { SfError } from './sfError'; export type Tokens = Array; @@ -172,6 +173,9 @@ const jsAndJsonLoader: FileParser = (filePath: string, fileContents: string): St * // Create loader functions for all files in the messages directory * Messages.importMessagesDirectory(__dirname); * + * // or, for ESM code + * Messages.importMessagesDirectoryFromMetaUrl(import.meta.url) + * * // Now you can use the messages from anywhere in your code or file. * // If using importMessageDirectory, the bundle name is the file name. * const messages: Messages = Messages.loadMessages(packageName, bundleName); @@ -300,6 +304,22 @@ export class Messages { } } + /** + * Support ESM plugins who can't use __dirname + * + * @param metaUrl pass in `import.meta.url` + * @param truncateToProjectPath Will look for the messages directory in the project root (where the package.json file is located). + * i.e., the module is typescript and the messages folder is in the top level of the module directory. + * @param packageName The npm package name. Figured out from the root directory's package.json. + */ + public static importMessagesDirectoryFromMetaUrl( + metaUrl: string, + truncateToProjectPath = true, + packageName?: string + ): void { + return Messages.importMessagesDirectory(path.dirname(fileURLToPath(metaUrl)), truncateToProjectPath, packageName); + } + /** * Import all json and js files in a messages directory. Use the file name as the bundle key when * {@link Messages.loadMessages} is called. By default, we're assuming the moduleDirectoryPart is a @@ -342,17 +362,7 @@ export class Messages { moduleMessagesDirPath = projectRoot; } - if (!packageName) { - const errMessage = `Invalid or missing package.json file at '${moduleMessagesDirPath}'. If not using a package.json, pass in a packageName.`; - try { - packageName = asString(ensureJsonMap(Messages.readFile(path.join(moduleMessagesDirPath, 'package.json'))).name); - if (!packageName) { - throw new NamedError('MissingPackageName', errMessage); - } - } catch (err) { - throw new NamedError('MissingPackageName', errMessage, err as Error); - } - } + const resolvedPackageName = packageName ?? resolvePackageName(moduleMessagesDirPath); moduleMessagesDirPath += `${path.sep}messages`; @@ -365,7 +375,7 @@ export class Messages { // When we support other locales, load them from /messages//.json // Change generateFileLoaderFunction to handle loading locales. } else if (stat.isFile()) { - this.importMessageFile(packageName, filePath); + this.importMessageFile(resolvedPackageName, filePath); } } } @@ -403,50 +413,7 @@ export class Messages { } // Don't use messages inside messages - throw new NamedError('MissingBundleError', `Missing bundle ${key} for locale ${Messages.getLocale()}.`); - } - - /** - * - * @deprecated Use {@link Messages.loadMessages} instead. - * @param packageName The name of the npm package. - * @param bundleName The name of the bundle to load. - * @param keys The message keys that will be used. - */ - public static load(packageName: string, bundleName: string, keys: [T, ...T[]]): Messages { - const key = getKey(packageName, bundleName); - let messages: Messages | undefined; - - if (this.isCached(packageName, bundleName)) { - messages = this.bundles.get(key); - } else if (this.loaders.has(key)) { - const loader = this.loaders.get(key); - if (loader) { - messages = loader(Messages.getLocale()); - this.bundles.set(key, messages); - messages = this.bundles.get(key); - } - } - - if (messages) { - // Type guard on key length, but do a runtime check. - if (!keys || keys.length === 0) { - throw new NamedError( - 'MissingKeysError', - 'Can not load messages without providing the message keys that will be used.' - ); - } - - // Get all messages to validate they are actually present - for (const messageKey of keys) { - messages.getMessage(messageKey); - } - - return messages; - } - - // Don't use messages inside messages - throw new NamedError('MissingBundleError', `Missing bundle ${key} for locale ${Messages.getLocale()}.`); + throw new SfError(`Missing bundle ${key} for locale ${Messages.getLocale()}.`, 'MissingBundleError'); } /** @@ -527,36 +494,6 @@ export class Messages { return new SfError(message, name, actions, exitCodeOrCause, cause); } - /** - * SfError wants error names to end with the suffix Error. Use this to create errors while preserving their existing name (for compatibility reasons). - * - * @deprecated Use `createError` instead unless you need to preserver the error name to avoid breaking changes. - * `error.name` will be the upper-cased key, remove prefixed `error.`. - * `error.actions` will be loaded using `${key}.actions` if available. - * - * @param key The key of the error message. - * @param tokens The error message tokens. - * @param actionTokens The action messages tokens. - * @param exitCodeOrCause The exit code which will be used by SfdxCommand or the underlying error that caused this error to be raised. - * @param cause The underlying error that caused this error to be raised. - */ - public createErrorButPreserveName( - key: T, - tokens: Tokens = [], - actionTokens: Tokens = [], - exitCodeOrCause?: number | Error, - cause?: Error - ): SfError { - const { message, name, actions } = this.formatMessageContents({ - type: 'error', - key, - tokens, - actionTokens, - preserveName: true, - }); - return new SfError(message, name, actions, exitCodeOrCause, cause); - } - /** * Convenience method to create warning using message labels. * @@ -617,7 +554,7 @@ export class Messages { // 'myMessage' -> `MyMessageWarning` // 'myMessageError' -> `MyMessageError` // 'warning.myMessage' -> `MyMessageWarning` - const name = `${upperFirst(key.replace(searchValue, ''))}${labelRegExp.exec(key) || preserveName ? '' : label}`; + const name = `${upperFirst(key.replace(searchValue, ''))}${labelRegExp.exec(key) ?? preserveName ? '' : label}`; const message = this.getMessage(key, tokens); let actions; try { @@ -644,9 +581,9 @@ export class Messages { const msg = map.get(key); if (!msg) { // Don't use messages inside messages - throw new NamedError( - 'MissingMessageError', - `Missing message ${this.bundleName}:${key} for locale ${Messages.getLocale()}.` + throw new SfError( + `Missing message ${this.bundleName}:${key} for locale ${Messages.getLocale()}.`, + 'MissingMessageError' ); } const messages = ensureArray(msg); @@ -656,3 +593,18 @@ export class Messages { }); } } + +const resolvePackageName = (moduleMessagesDirPath: string): string => { + const errMessage = `Invalid or missing package.json file at '${moduleMessagesDirPath}'. If not using a package.json, pass in a packageName.`; + try { + const resolvedPackageName = asString( + ensureJsonMap(Messages.readFile(path.join(moduleMessagesDirPath, 'package.json'))).name + ); + if (!resolvedPackageName) { + throw SfError.create({ message: errMessage, name: 'MissingPackageName' }); + } + return resolvedPackageName; + } catch (err) { + throw SfError.create({ message: errMessage, name: 'MissingPackageName', cause: err }); + } +}; diff --git a/src/org/authInfo.ts b/src/org/authInfo.ts index 8894ec2fab..b407e0169e 100644 --- a/src/org/authInfo.ts +++ b/src/org/authInfo.ts @@ -6,11 +6,12 @@ */ /* eslint-disable class-methods-use-this */ -import { randomBytes } from 'crypto'; -import { resolve as pathResolve } from 'path'; -import * as os from 'os'; -import * as fs from 'fs'; -import { AsyncOptionalCreatable, cloneJson, env, isEmpty, parseJson, parseJsonMap } from '@salesforce/kit'; +import { randomBytes } from 'node:crypto'; +import { resolve as pathResolve } from 'node:path'; +import * as os from 'node:os'; +import * as fs from 'node:fs'; +import { Record as RecordType } from '@jsforce/jsforce-node'; +import { AsyncOptionalCreatable, env, isEmpty, parseJson, parseJsonMap } from '@salesforce/kit'; import { AnyJson, asString, @@ -25,20 +26,22 @@ import { Nullable, Optional, } from '@salesforce/ts-types'; -import { JwtOAuth2, JwtOAuth2Config, OAuth2, TokenResponse } from 'jsforce'; -import Transport from 'jsforce/lib/transport'; +import { OAuth2Config, OAuth2, TokenResponse } from '@jsforce/jsforce-node'; +import Transport from '@jsforce/jsforce-node/lib/transport'; import * as jwt from 'jsonwebtoken'; import { Config } from '../config/config'; import { ConfigAggregator } from '../config/configAggregator'; -import { Logger } from '../logger'; +import { Logger } from '../logger/logger'; import { SfError } from '../sfError'; import { matchesAccessToken, trimTo15 } from '../util/sfdc'; -import { StateAggregator } from '../stateAggregator'; +import { StateAggregator } from '../stateAggregator/stateAggregator'; +import { filterSecrets } from '../logger/filters'; import { Messages } from '../messages'; import { getLoginAudienceCombos, SfdcUrl } from '../util/sfdcUrl'; +import { findSuggestion } from '../util/findSuggestion'; import { Connection, SFDX_HTTP_HEADERS } from './connection'; import { OrgConfigProperties } from './orgConfigProperties'; -import { Org } from './org'; +import { Org, SandboxFields } from './org'; Messages.importMessagesDirectory(__dirname); const messages = Messages.loadMessages('@salesforce/core', 'core'); @@ -98,11 +101,11 @@ export type OrgAuthorization = { /** * Options for access token flow. */ -export interface AccessTokenOptions { +export type AccessTokenOptions = { accessToken?: string; loginUrl?: string; instanceUrl?: string; -} +}; export type AuthSideEffects = { alias?: string; @@ -111,6 +114,14 @@ export type AuthSideEffects = { setTracksSource?: boolean; }; +export type JwtOAuth2Config = OAuth2Config & { + privateKey?: string; + privateKeyFile?: string; + authCode?: string; + refreshToken?: string; + username?: string; +}; + type UserInfo = AnyJson & { username: string; organizationId: string; @@ -234,7 +245,7 @@ export class AuthInfo extends AsyncOptionalCreatable { * @returns {string} */ public static getDefaultInstanceUrl(): string { - const configuredInstanceUrl = ConfigAggregator.getValue(OrgConfigProperties.ORG_INSTANCE_URL).value as string; + const configuredInstanceUrl = ConfigAggregator.getValue(OrgConfigProperties.ORG_INSTANCE_URL)?.value as string; return configuredInstanceUrl ?? SfdcUrl.PRODUCTION; } @@ -324,9 +335,8 @@ export class AuthInfo extends AsyncOptionalCreatable { * @param options The options to generate the URL. */ public static getAuthorizationUrl(options: JwtOAuth2Config & { scope?: string }, oauth2?: OAuth2): string { - // Always use a verifier for enhanced security - options.useVerifier = true; - const oauth2Verifier = oauth2 ?? new OAuth2(options); + // Unless explicitly turned off, use a code verifier for enhanced security + const oauth2Verifier = oauth2 ?? new OAuth2({ useVerifier: true, ...options }); // The state parameter allows the redirectUri callback listener to ignore request // that don't contain the state value. @@ -353,7 +363,7 @@ export class AuthInfo extends AsyncOptionalCreatable { sfdxAuthUrl: string ): Pick { const match = sfdxAuthUrl.match( - /^force:\/\/([a-zA-Z0-9._-]+):([a-zA-Z0-9._-]*):([a-zA-Z0-9._-]+={0,2})@([a-zA-Z0-9._-]+)/ + /^force:\/\/([a-zA-Z0-9._-]+={0,2}):([a-zA-Z0-9._-]*={0,2}):([a-zA-Z0-9._-]+={0,2})@([a-zA-Z0-9._-]+)/ ); if (!match) { @@ -373,7 +383,7 @@ export class AuthInfo extends AsyncOptionalCreatable { /** * Given a set of decrypted fields and an authInfo, determine if the org belongs to an available - * dev hub. + * dev hub, or if the org is a sandbox of another CLI authed production org. * * @param fields * @param orgAuthInfo @@ -384,21 +394,29 @@ export class AuthInfo extends AsyncOptionalCreatable { // authInfo before it is necessary. const logger = await Logger.child('Common', { tag: 'identifyPossibleScratchOrgs' }); - // return if we already know the hub org we know it is a devhub or prod-like or no orgId present - if (fields.isDevHub || fields.devHubUsername || !fields.orgId) return; + // return if we already know the hub org, we know it is a devhub or prod-like, or no orgId present + if (Boolean(fields.isDevHub) || Boolean(fields.devHubUsername) || !fields.orgId) return; - logger.debug('getting devHubs'); + logger.debug('getting devHubs and prod orgs to identify scratch orgs and sandboxes'); // TODO: return if url is not sandbox-like to avoid constantly asking about production orgs // TODO: someday we make this easier by asking the org if it is a scratch org const hubAuthInfos = await AuthInfo.getDevHubAuthInfos(); + // Get a list of org auths that are known not to be scratch orgs or sandboxes. + const possibleProdOrgs = await AuthInfo.listAllAuthorizations( + (orgAuth) => orgAuth && !orgAuth.isScratchOrg && !orgAuth.isSandbox + ); + logger.debug(`found ${hubAuthInfos.length} DevHubs`); - if (hubAuthInfos.length === 0) return; + logger.debug(`found ${possibleProdOrgs.length} possible prod orgs`); + if (hubAuthInfos.length === 0 && possibleProdOrgs.length === 0) { + return; + } // ask all those orgs if they know this orgId - await Promise.all( - hubAuthInfos.map(async (hubAuthInfo) => { + await Promise.all([ + ...hubAuthInfos.map(async (hubAuthInfo) => { try { const soi = await AuthInfo.queryScratchOrg(hubAuthInfo.username, fields.orgId as string); // if any return a result @@ -419,10 +437,17 @@ export class AuthInfo extends AsyncOptionalCreatable { logger.debug(`error updating auth file for ${orgAuthInfo.getUsername()}`, error); } } catch (error) { - logger.error(`Error connecting to devhub ${hubAuthInfo.username}`, error); + if (error instanceof Error && error.name === 'NoActiveScratchOrgFound') { + logger.error(`devhub ${hubAuthInfo.username} has no scratch orgs`, error); + } else { + logger.error(`Error connecting to devhub ${hubAuthInfo.username}`, error); + } } - }) - ); + }), + ...possibleProdOrgs.map(async (pOrgAuthInfo) => { + await AuthInfo.identifyPossibleSandbox(pOrgAuthInfo, fields, orgAuthInfo, logger); + }), + ]); } /** @@ -432,16 +457,83 @@ export class AuthInfo extends AsyncOptionalCreatable { return AuthInfo.listAllAuthorizations((possibleHub) => possibleHub?.isDevHub ?? false); } + private static async identifyPossibleSandbox( + possibleProdOrg: OrgAuthorization, + fields: AuthFields, + orgAuthInfo: AuthInfo, + logger: Logger + ): Promise { + if (!fields.orgId) { + return; + } + + try { + const prodOrg = await Org.create({ aliasOrUsername: possibleProdOrg.username }); + const sbxProcess = await prodOrg.querySandboxProcessByOrgId(fields.orgId); + if (!sbxProcess?.SandboxInfoId) { + return; + } + logger.debug(`${fields.orgId} is a sandbox of ${possibleProdOrg.username}`); + + try { + await orgAuthInfo.save({ + ...fields, + isScratch: false, + isSandbox: true, + }); + } catch (err) { + logger.debug(`error updating auth file for: ${orgAuthInfo.getUsername()}`, err); + throw err; // rethrow; don't want a sandbox config file with an invalid auth file + } + + try { + // set the sandbox config value + const sfSandbox: SandboxFields = { + sandboxUsername: fields.username, + sandboxOrgId: fields.orgId, + prodOrgUsername: possibleProdOrg.username, + sandboxName: sbxProcess.SandboxName, + sandboxProcessId: sbxProcess.Id, + sandboxInfoId: sbxProcess.SandboxInfoId, + timestamp: new Date().toISOString(), + }; + + const stateAggregator = await StateAggregator.getInstance(); + stateAggregator.sandboxes.set(fields.orgId, sfSandbox); + logger.debug(`writing sandbox auth file for: ${orgAuthInfo.getUsername()} with ID: ${fields.orgId}`); + await stateAggregator.sandboxes.write(fields.orgId); + } catch (e) { + logger.debug(`error writing sandbox auth file for: ${orgAuthInfo.getUsername()}`, e); + } + } catch (err) { + logger.debug(`${fields.orgId} is not a sandbox of ${possibleProdOrg.username}`); + } + } + + /** + * Checks active scratch orgs to match by the ScratchOrg field (the 15-char org id) + * if you pass an 18-char scratchOrgId, it will be trimmed to 15-char for query purposes + * Throws is no matching scratch org is found + */ private static async queryScratchOrg( devHubUsername: string | undefined, scratchOrgId: string ): Promise<{ Id: string; ExpirationDate: string }> { const devHubOrg = await Org.create({ aliasOrUsername: devHubUsername }); + const trimmedId = trimTo15(scratchOrgId); const conn = devHubOrg.getConnection(); - const data = await conn.singleRecordQuery<{ Id: string; ExpirationDate: string }>( - `select Id, ExpirationDate from ScratchOrgInfo where ScratchOrg = '${trimTo15(scratchOrgId)}'` + const data = await conn.query<{ Id: string; ExpirationDate: string; ScratchOrg: string }>( + `select Id, ExpirationDate, ScratchOrg from ScratchOrgInfo where ScratchOrg = '${trimmedId}' and Status = 'Active'` + ); + // where ScratchOrg='00DDE00000485Lg' will return a record for both 00DDE00000485Lg and 00DDE00000485LG. + // this is our way of enforcing case sensitivity on a 15-char Id (which is unfortunately how ScratchOrgInfo stores it) + const result = data.records.filter((r) => r.ScratchOrg === trimmedId)[0]; + if (result) return result; + + throw new SfError( + `DevHub ${devHubUsername} has no active scratch orgs that match ${trimmedId}`, + 'NoActiveScratchOrgFound' ); - return data; } /** @@ -520,8 +612,6 @@ export class AuthInfo extends AsyncOptionalCreatable { * Get the auth fields (decrypted) needed to make a connection. */ public getConnectionOptions(): ConnectionOptions { - let opts: ConnectionOptions; - const decryptedCopy = this.getFields(true); const { accessToken, instanceUrl, loginUrl } = decryptedCopy; @@ -529,36 +619,33 @@ export class AuthInfo extends AsyncOptionalCreatable { this.logger.info('Returning fields for a connection using access token.'); // Just auth with the accessToken - opts = { accessToken, instanceUrl, loginUrl }; - } else if (this.isJwt()) { + return { accessToken, instanceUrl, loginUrl }; + } + if (this.isJwt()) { this.logger.info('Returning fields for a connection using JWT config.'); - opts = { - accessToken, - instanceUrl, - refreshFn: this.refreshFn.bind(this), - }; - } else { - // @TODO: figure out loginUrl and redirectUri (probably get from config class) - // - // redirectUri: org.config.getOauthCallbackUrl() - // loginUrl: this.fields.instanceUrl || this.config.getAppConfig().sfdcLoginUrl - this.logger.info('Returning fields for a connection using OAuth config.'); - - // Decrypt a user provided client secret or use the default. - opts = { - oauth2: { - loginUrl: instanceUrl ?? SfdcUrl.PRODUCTION, - clientId: this.getClientId(), - redirectUri: this.getRedirectUri(), - }, + return { accessToken, instanceUrl, refreshFn: this.refreshFn.bind(this), }; } + // @TODO: figure out loginUrl and redirectUri (probably get from config class) + // + // redirectUri: org.config.getOauthCallbackUrl() + // loginUrl: this.fields.instanceUrl || this.config.getAppConfig().sfdcLoginUrl + this.logger.info('Returning fields for a connection using OAuth config.'); - // decrypt the fields - return opts; + // Decrypt a user provided client secret or use the default. + return { + oauth2: { + loginUrl: instanceUrl ?? SfdcUrl.PRODUCTION, + clientId: this.getClientId(), + redirectUri: this.getRedirectUri(), + }, + accessToken, + instanceUrl, + refreshFn: this.refreshFn.bind(this), + }; } public getClientId(): string { @@ -573,8 +660,10 @@ export class AuthInfo extends AsyncOptionalCreatable { * Get the authorization fields. * * @param decrypt Decrypt the fields. + * + * Returns a ReadOnly object of the fields. If you need to modify the fields, use AuthInfo.update() */ - public getFields(decrypt?: boolean): AuthFields { + public getFields(decrypt?: boolean): Readonly { return this.stateAggregator.orgs.get(this.username, decrypt) ?? {}; } @@ -622,7 +711,7 @@ export class AuthInfo extends AsyncOptionalCreatable { */ public async handleAliasAndDefaultSettings(sideEffects: AuthSideEffects): Promise { if ( - sideEffects.alias || + Boolean(sideEffects.alias) || sideEffects.setDefault || sideEffects.setDefaultDevHub || typeof sideEffects.setTracksSource === 'boolean' @@ -674,8 +763,7 @@ export class AuthInfo extends AsyncOptionalCreatable { * @param alias alias to set */ public async setAlias(alias: string): Promise { - this.stateAggregator.aliases.set(alias, this.getUsername()); - await this.stateAggregator.aliases.write(); + return this.stateAggregator.aliases.setAndSave(alias, this.getUsername()); } /** @@ -726,7 +814,19 @@ export class AuthInfo extends AsyncOptionalCreatable { } // If a username with NO oauth options, ensure authorization already exist. else if (username && !authOptions && !(await this.stateAggregator.orgs.exists(username))) { - throw messages.createError('namedOrgNotFound', [username]); + const likeName = findSuggestion(username, [ + ...(await this.stateAggregator.orgs.list()).map((f) => f.split('.json')[0]), + ...Object.keys(this.stateAggregator.aliases.getAll()), + ]); + + throw SfError.create({ + name: 'NamedOrgNotFoundError', + message: messages.getMessage('namedOrgNotFound', [username]), + actions: + likeName === '' + ? undefined + : [`It looks like you mistyped the username or alias. Did you mean "${likeName}"?`], + }); } else { await this.initAuthOptions(authOptions); } @@ -754,7 +854,7 @@ export class AuthInfo extends AsyncOptionalCreatable { let authConfig: AuthFields; if (options) { - options = cloneJson(options); + options = structuredClone(options); if (this.isTokenOptions(options)) { authConfig = options; @@ -804,6 +904,15 @@ export class AuthInfo extends AsyncOptionalCreatable { ensureString(authConfig.accessToken) ); + const namespacePrefix = await this.getNamespacePrefix( + ensureString(authConfig.instanceUrl), + ensureString(authConfig.accessToken) + ); + + if (namespacePrefix) { + authConfig.namespacePrefix = namespacePrefix; + } + if (authConfig.username) await this.stateAggregator.orgs.read(authConfig.username, false, false); // Update the auth fields WITH encryption @@ -938,29 +1047,32 @@ export class AuthInfo extends AsyncOptionalCreatable { } ); - const oauth2 = new JwtOAuth2({ loginUrl }); - // jsforce has it types as any - // eslint-disable-next-line @typescript-eslint/no-unsafe-argument - return ensureJsonMap(await oauth2.jwtAuthorize(jwtToken)); + const oauth2 = new OAuth2({ loginUrl }); + return ensureJsonMap( + await oauth2.requestToken({ + // eslint-disable-next-line camelcase + grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer', + assertion: jwtToken, + }) + ); } // Build OAuth config for a refresh token auth flow private async buildRefreshTokenConfig(options: JwtOAuth2Config): Promise { - // Ideally, this would be removed at some point in the distant future when all auth files - // now have the clientId stored in it. - if (!options.clientId) { - options.clientId = DEFAULT_CONNECTED_APP_INFO.clientId; - options.clientSecret = DEFAULT_CONNECTED_APP_INFO.clientSecret; - } - - if (!options.redirectUri) { - options.redirectUri = this.getRedirectUri(); - } + const fullOptions: JwtOAuth2Config = { + ...options, + redirectUri: options.redirectUri ?? this.getRedirectUri(), + // Ideally, this would be removed at some point in the distant future when all auth files + // now have the clientId stored in it. + ...(options.clientId + ? {} + : { clientId: DEFAULT_CONNECTED_APP_INFO.clientId, clientSecret: DEFAULT_CONNECTED_APP_INFO.clientSecret }), + }; - const oauth2 = new OAuth2(options); + const oauth2 = new OAuth2(fullOptions); let authFieldsBuilder: TokenResponse; try { - authFieldsBuilder = await oauth2.refreshToken(ensure(options.refreshToken)); + authFieldsBuilder = await oauth2.refreshToken(ensure(fullOptions.refreshToken)); } catch (err) { throw messages.createError('refreshTokenAuthError', [(err as Error).message]); } @@ -979,10 +1091,10 @@ export class AuthInfo extends AsyncOptionalCreatable { username, accessToken: authFieldsBuilder.access_token, instanceUrl: authFieldsBuilder.instance_url, - loginUrl: options.loginUrl ?? authFieldsBuilder.instance_url, - refreshToken: options.refreshToken, - clientId: options.clientId, - clientSecret: options.clientSecret, + loginUrl: fullOptions.loginUrl ?? authFieldsBuilder.instance_url, + refreshToken: fullOptions.refreshToken, + clientId: fullOptions.clientId, + clientSecret: fullOptions.clientSecret, }; } @@ -994,9 +1106,11 @@ export class AuthInfo extends AsyncOptionalCreatable { */ private async exchangeToken(options: JwtOAuth2Config, oauth2: OAuth2 = new OAuth2(options)): Promise { if (!oauth2.redirectUri) { + // eslint-disable-next-line no-param-reassign oauth2.redirectUri = this.getRedirectUri(); } if (!oauth2.clientId) { + // eslint-disable-next-line no-param-reassign oauth2.clientId = this.getClientId(); } @@ -1006,7 +1120,14 @@ export class AuthInfo extends AsyncOptionalCreatable { this.logger.info(`Exchanging auth code for access token using loginUrl: ${options.loginUrl}`); authFields = await oauth2.requestToken(ensure(options.authCode)); } catch (err) { - throw messages.createError('authCodeExchangeError', [(err as Error).message]); + const msg = err instanceof Error ? `${err.name}::${err.message}` : typeof err === 'string' ? err : 'UNKNOWN'; + const redacted = filterSecrets(options); + throw SfError.create({ + message: messages.getMessage('authCodeExchangeError', [msg]), + name: 'AuthCodeExchangeError', + ...(err instanceof Error ? { cause: err } : {}), + data: (isArray(redacted) ? redacted[0] : redacted) as JwtOAuth2Config, + }); } const { orgId } = parseIdUrl(authFields.id); @@ -1050,7 +1171,7 @@ export class AuthInfo extends AsyncOptionalCreatable { this.throwUserGetException(response); } else { const userInfoJson = parseJsonMap(response.body) as UserInfoResult; - const url = `${baseUrl.toString()}/services/data/${apiVersion}/sobjects/User/${userInfoJson.user_id}`; + const url = `${baseUrl.toString()}services/data/${apiVersion}/sobjects/User/${userInfoJson.user_id}`; this.logger.info(`Sending request for User SObject after successful auth code exchange to URL: ${url}`); response = await new Transport().httpRequest({ url, method: 'GET', headers }); if (response.statusCode >= 400) { @@ -1088,6 +1209,32 @@ export class AuthInfo extends AsyncOptionalCreatable { throw new SfError(errorMsg); } + private async getNamespacePrefix(instanceUrl: string, accessToken: string): Promise { + // Make a REST call for the Organization obj directly. Normally this is done via a connection + // but we don't want to create circular dependencies or lots of snowflakes + // within this file to support it. + const apiVersion = 'v51.0'; // hardcoding to v51.0 just for this call is okay. + const instance = ensure(instanceUrl); + const baseUrl = new SfdcUrl(instance); + const namespacePrefixOrgUrl = `${baseUrl.toString()}/services/data/${apiVersion}/query?q=Select%20Namespaceprefix%20FROM%20Organization`; + const headers = Object.assign({ Authorization: `Bearer ${accessToken}` }, SFDX_HTTP_HEADERS); + + try { + const res = await new Transport().httpRequest({ url: namespacePrefixOrgUrl, method: 'GET', headers }); + if (res.statusCode >= 400) { + return; + } + + const namespacePrefix = JSON.parse(res.body) as { + records: RecordType[]; + }; + + return ensureString(namespacePrefix.records[0]?.NamespacePrefix); + } catch (err) { + /* Doesn't have a namespace */ + return; + } + } /** * Returns `true` if the org is a Dev Hub. * @@ -1120,7 +1267,7 @@ export namespace AuthInfo { /** * Constructor options for AuthInfo. */ - export interface Options { + export type Options = { /** * Org signup username. */ @@ -1144,5 +1291,5 @@ export namespace AuthInfo { parentUsername?: string; isDevHub?: boolean; - } + }; } diff --git a/src/org/authRemover.ts b/src/org/authRemover.ts index f0f6440237..9d5c117679 100644 --- a/src/org/authRemover.ts +++ b/src/org/authRemover.ts @@ -8,11 +8,11 @@ import { AsyncOptionalCreatable } from '@salesforce/kit'; import { JsonMap } from '@salesforce/ts-types'; import { ConfigAggregator } from '../config/configAggregator'; -import { Logger } from '../logger'; +import { Logger } from '../logger/logger'; import { Messages } from '../messages'; -import { StateAggregator } from '../stateAggregator'; +import { StateAggregator } from '../stateAggregator/stateAggregator'; import { OrgConfigProperties } from './orgConfigProperties'; -import { AuthFields } from '.'; +import { AuthFields } from './authInfo'; Messages.importMessagesDirectory(__dirname); const messages = Messages.loadMessages('@salesforce/core', 'auth'); @@ -55,7 +55,6 @@ export class AuthRemover extends AsyncOptionalCreatable { this.logger.debug(`Removing authorization for user ${username}`); await this.unsetConfigValues(username); await this.unsetAliases(username); - await this.unsetTokens(username); await this.stateAggregator.orgs.remove(username); } @@ -183,18 +182,9 @@ export class AuthRemover extends AsyncOptionalCreatable { if (existingAliases.length === 0) return; this.logger.debug(`Found these aliases to remove: ${existingAliases.join(',')}`); - existingAliases.forEach((alias) => this.stateAggregator.aliases.unset(alias)); - await this.stateAggregator.aliases.write(); - } - - private async unsetTokens(username: string): Promise { - this.logger.debug(`Clearing tokens for username: ${username}`); - const tokens = this.stateAggregator.tokens.getAll(); - for (const [key, token] of Object.entries(tokens)) { - if (token.user === username) { - this.stateAggregator.tokens.unset(key); - } + for (const alias of existingAliases) { + // eslint-disable-next-line no-await-in-loop + await this.stateAggregator.aliases.unsetAndSave(alias); } - await this.stateAggregator.tokens.write(); } } diff --git a/src/org/connection.ts b/src/org/connection.ts index e365ccd930..d411a1b98d 100644 --- a/src/org/connection.ts +++ b/src/org/connection.ts @@ -7,10 +7,10 @@ /* eslint-disable @typescript-eslint/ban-ts-comment */ -import { URL } from 'url'; -import { AsyncResult, DeployOptions, DeployResultLocator } from 'jsforce/api/metadata'; +import { URL } from 'node:url'; +import { AsyncResult, DeployOptions, DeployResultLocator } from '@jsforce/jsforce-node/lib/api/metadata'; import { Duration, env, maxBy } from '@salesforce/kit'; -import { asString, ensure, isString, JsonCollection, JsonMap, Optional } from '@salesforce/ts-types'; +import { asString, ensure, isString, JsonMap, Optional } from '@salesforce/ts-types'; import { Connection as JSForceConnection, ConnectionConfig, @@ -20,12 +20,12 @@ import { QueryResult, Record, Schema, -} from 'jsforce'; -import { Tooling as JSForceTooling } from 'jsforce/lib/api/tooling'; -import { StreamPromise } from 'jsforce/lib/util/promise'; +} from '@jsforce/jsforce-node'; +import { Tooling as JSForceTooling } from '@jsforce/jsforce-node/lib/api/tooling'; +import { StreamPromise } from '@jsforce/jsforce-node/lib/util/promise'; import { MyDomainResolver } from '../status/myDomainResolver'; import { ConfigAggregator } from '../config/configAggregator'; -import { Logger } from '../logger'; +import { Logger } from '../logger/logger'; import { SfError } from '../sfError'; import { validateApiVersion } from '../util/sfdc'; import { Messages } from '../messages'; @@ -43,9 +43,10 @@ export const SFDX_HTTP_HEADERS = { }; export const DNS_ERROR_NAME = 'DomainNotFoundError'; -type recentValidationOptions = { id: string; rest?: boolean }; export type DeployOptionsWithRest = Partial & { rest?: boolean }; +// preserving interface since it extends a class +// eslint-disable-next-line @typescript-eslint/consistent-type-definitions export interface Tooling extends JSForceTooling { // eslint-disable-next-line @typescript-eslint/no-explicit-any _logger: any; @@ -112,34 +113,26 @@ export class Connection extends JSForceConnection this: new (options: Connection.Options) => Connection, options: Connection.Options ): Promise> { - const baseOptions: ConnectionConfig = { - version: options.connectionOptions?.version, + // Get connection options from auth info and create a new jsForce connection + const connectionOptions: ConnectionConfig = { + version: await getOptionsVersion(options), callOptions: { client: clientId, }, - }; - - if (!baseOptions.version) { - // Set the API version obtained from the config aggregator. - const configAggregator = options.configAggregator ?? (await ConfigAggregator.create()); - baseOptions.version = asString(configAggregator.getInfo('org-api-version').value); - } - - const providedOptions = options.authInfo.getConnectionOptions(); + ...options.authInfo.getConnectionOptions(), + // this assertion is questionable, but has existed before core7 + } as ConnectionConfig; - // Get connection options from auth info and create a new jsForce connection - options.connectionOptions = Object.assign(baseOptions, providedOptions) as ConnectionConfig; - - const conn = new this(options); + const conn = new this({ ...options, connectionOptions }); await conn.init(); try { // No version passed in or in the config, so load one. - if (!baseOptions.version) { + if (!connectionOptions.version) { await conn.useLatestApiVersion(); } else { conn.logger.debug( - `The org-api-version ${baseOptions.version} was found from ${ + `The org-api-version ${connectionOptions.version} was found from ${ options.connectionOptions?.version ? 'passed in options' : 'config' }` ); @@ -173,16 +166,15 @@ export class Connection extends JSForceConnection zipInput: Buffer, options: DeployOptionsWithRest ): Promise> { - const rest = options.rest; // neither API expects this option - delete options.rest; + const { rest, ...optionsWithoutRest } = options; if (rest) { this.logger.debug('deploy with REST'); await this.refreshAuth(); - return this.metadata.deployRest(zipInput, options); + return this.metadata.deployRest(zipInput, optionsWithoutRest); } else { this.logger.debug('deploy with SOAP'); - return this.metadata.deploy(zipInput, options); + return this.metadata.deploy(zipInput, optionsWithoutRest); } } @@ -203,7 +195,7 @@ export class Connection extends JSForceConnection ...SFDX_HTTP_HEADERS, ...lowercasedHeaders, }; - this.logger.debug(`request: ${JSON.stringify(httpRequest)}`); + this.logger.getRawLogger().debug(httpRequest, 'request'); return super.request(httpRequest, options); } @@ -216,19 +208,6 @@ export class Connection extends JSForceConnection return super._baseUrl(); } - /** - * Will deploy a recently validated deploy request - directly calling jsforce now that this is supported. - * WARNING: will always return a string from jsforce, the type is JsonCollection to support backwards compatibility - * - * @param options.id = the deploy ID that's been validated already from a previous checkOnly deploy request - * @param options.rest = a boolean whether or not to use the REST API - * @deprecated use {@link Connection.metadata#deployRecentValidation} instead - the jsforce implementation, instead of this wrapper - */ - public async deployRecentValidation(options: recentValidationOptions): Promise { - // REST returns an object with an id property, SOAP returns the id as a string directly. That is now handled - // in jsforce, so we have to cast a string as unknown as JsonCollection to support backwards compatibility. - return (await this.metadata.deployRecentValidation(options)) as unknown as JsonCollection; - } /** * Retrieves the highest api version that is supported by the target server instance. */ @@ -382,7 +361,7 @@ export class Connection extends JSForceConnection const config: ConfigAggregator = await ConfigAggregator.create(); // take the limit from the calling function, then the config, then default 10,000 const maxFetch: number = - ((config.getInfo(OrgConfigProperties.ORG_MAX_QUERY_LIMIT).value as number) || queryOptions.maxFetch) ?? 10000; + ((config.getInfo(OrgConfigProperties.ORG_MAX_QUERY_LIMIT).value as number) || queryOptions.maxFetch) ?? 10_000; const { tooling, ...queryOptionsWithoutTooling } = queryOptions; @@ -396,7 +375,7 @@ export class Connection extends JSForceConnection void Lifecycle.getInstance().emitWarning( `The query result is missing ${ query.totalSize - query.records.length - } records due to a ${maxFetch} record limit. Increase the number of records returned by setting the config value "maxQueryLimit" or the environment variable "SFDX_MAX_QUERY_LIMIT" to ${ + } records due to a ${maxFetch} record limit. Increase the number of records returned by setting the config value "maxQueryLimit" or the environment variable "SF_ORG_MAX_QUERY_LIMIT" to ${ query.totalSize } or greater than ${maxFetch}.` ); @@ -489,17 +468,17 @@ export const SingleRecordQueryErrors = { NoRecords: 'SingleRecordQuery_NoRecords', MultipleRecords: 'SingleRecordQuery_MultipleRecords', }; -export interface SingleRecordQueryOptions { +export type SingleRecordQueryOptions = { tooling?: boolean; returnChoicesOnMultiple?: boolean; choiceField?: string; // defaults to Name -} +}; export namespace Connection { /** * Connection Options. */ - export interface Options { + export type Options = { /** * AuthInfo instance. */ @@ -512,9 +491,18 @@ export namespace Connection { * Additional connection parameters. */ connectionOptions?: ConnectionConfig; - } + }; } +const getOptionsVersion = async (options: Connection.Options): Promise => { + if (options.connectionOptions) { + return options.connectionOptions.version; + } + // Set the API version obtained from the config aggregator. + const configAggregator = options.configAggregator ?? (await ConfigAggregator.create()); + return asString(configAggregator.getInfo('org-api-version').value); +}; + // jsforce does some interesting proxy loading on lib classes. // Setting this in the Connection.tooling getter will not work, it // must be set on the prototype. diff --git a/src/org/index.ts b/src/org/index.ts deleted file mode 100644 index 684f6b8d31..0000000000 --- a/src/org/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* - * 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 - */ - -export * from './authInfo'; -export * from './authRemover'; -export * from './connection'; -export * from './org'; -export * from './permissionSetAssignment'; -export * from './user'; diff --git a/src/org/org.ts b/src/org/org.ts index 5ceebcc5eb..115d662228 100644 --- a/src/org/org.ts +++ b/src/org/org.ts @@ -6,8 +6,8 @@ */ /* eslint-disable class-methods-use-this */ -import { join as pathJoin } from 'path'; -import * as fs from 'fs'; +import { join as pathJoin } from 'node:path'; +import * as fs from 'node:fs'; import { AsyncOptionalCreatable, Duration } from '@salesforce/kit'; import { AnyFunction, @@ -15,27 +15,25 @@ import { ensure, ensureJsonArray, ensureString, - isArray, isBoolean, isString, JsonArray, JsonMap, Nullable, - Optional, } from '@salesforce/ts-types'; -import { HttpRequest, SaveResult } from 'jsforce'; +import { HttpRequest, SaveResult } from '@jsforce/jsforce-node'; import { Config } from '../config/config'; import { ConfigAggregator } from '../config/configAggregator'; -import { ConfigContents } from '../config/configStore'; +import { ConfigContents } from '../config/configStackTypes'; import { OrgUsersConfig } from '../config/orgUsersConfig'; import { Global } from '../global'; import { Lifecycle } from '../lifecycleEvents'; -import { Logger } from '../logger'; +import { Logger } from '../logger/logger'; import { SfError } from '../sfError'; import { trimTo15 } from '../util/sfdc'; import { WebOAuthServer } from '../webOAuthServer'; import { Messages } from '../messages'; -import { StateAggregator } from '../stateAggregator'; +import { StateAggregator } from '../stateAggregator/stateAggregator'; import { PollingClient } from '../status/pollingClient'; import { StatusResult } from '../status/types'; import { Connection, SingleRecordQueryErrors } from './connection'; @@ -59,23 +57,23 @@ export enum OrgTypes { Sandbox = 'sandbox', } -export interface StatusEvent { +export type StatusEvent = { sandboxProcessObj: SandboxProcessObject; interval: number; remainingWait: number; waitingOnAuth: boolean; -} +}; -export interface ResultEvent { +export type ResultEvent = { sandboxProcessObj: SandboxProcessObject; sandboxRes: SandboxUserAuthResponse; -} +}; -export interface SandboxUserAuthRequest { +export type SandboxUserAuthRequest = { sandboxName: string; clientId: string; callbackUrl: string; -} +}; export enum SandboxEvents { EVENT_STATUS = 'status', @@ -83,14 +81,15 @@ export enum SandboxEvents { EVENT_RESULT = 'result', EVENT_AUTH = 'auth', EVENT_RESUME = 'resume', + EVENT_MULTIPLE_SBX_PROCESSES = 'multipleMatchingSbxProcesses', } -export interface SandboxUserAuthResponse { +export type SandboxUserAuthResponse = { authUserName: string; authCode: string; instanceUrl: string; loginUrl: string; -} +}; const resumableSandboxStatus = ['Activating', 'Pending', 'Pending Activation', 'Processing', 'Sampling', 'Completed']; @@ -112,6 +111,19 @@ export type SandboxProcessObject = { ApexClassId?: string; EndDate?: string; }; +const sandboxProcessFields = [ + 'Id', + 'Status', + 'SandboxName', + 'SandboxInfoId', + 'LicenseType', + 'CreatedDate', + 'CopyProgress', + 'SandboxOrganization', + 'SourceId', + 'Description', + 'EndDate', +]; export type SandboxRequest = { SandboxName: string; @@ -125,6 +137,27 @@ export type ResumeSandboxRequest = { SandboxProcessObjId?: string; }; +// https://developer.salesforce.com/docs/atlas.en-us.api_tooling.meta/api_tooling/tooling_api_objects_sandboxinfo.htm +export type SandboxInfo = { + Id: string; // 0GQB0000000TVobOAG + IsDeleted: boolean; + CreatedDate: string; // 2023-06-16T18:35:47.000+0000 + CreatedById: string; // 005B0000004TiUpIAK + LastModifiedDate: string; // 2023-09-27T20:50:26.000+0000 + LastModifiedById: string; // 005B0000004TiUpIAK + SandboxName: string; // must be 10 or less alphanumeric chars + LicenseType: 'DEVELOPER' | 'DEVELOPER PRO' | 'PARTIAL' | 'FULL'; + TemplateId?: string; // reference to PartitionLevelScheme + HistoryDays: -1 | 0 | 10 | 20 | 30 | 60 | 90 | 120 | 150 | 180; // full sandboxes only + CopyChatter: boolean; + AutoActivate: boolean; // only editable for an update/refresh + ApexClassId?: string; // apex class ID. Only editable on create. + Description?: string; + SourceId?: string; // SandboxInfoId as the source org used for a clone + // 'ActivationUserGroupId', // Support might be added back in API v61.0 (Summer '24) + CopyArchivedActivities?: boolean; // only for full sandboxes; depends if a license was purchased +}; + export type ScratchOrgRequest = Omit; export type SandboxFields = { @@ -134,6 +167,7 @@ export type SandboxFields = { sandboxUsername?: string; sandboxProcessId?: string; sandboxInfoId?: string; + timestamp?: string; }; /** @@ -167,7 +201,7 @@ export class Org extends AsyncOptionalCreatable { private configAggregator!: ConfigAggregator; // Initialized in create - private logger!: Logger; + private logger!: ReturnType; private connection!: Connection; private options: Org.Options; @@ -197,18 +231,16 @@ export class Org extends AsyncOptionalCreatable { interval: Duration.seconds(30), } ): Promise { - this.logger.debug(`CreateSandbox called with SandboxRequest: ${JSON.stringify(sandboxReq, undefined, 2)}`); + this.logger.debug(sandboxReq, 'CreateSandbox called with SandboxRequest'); const createResult = await this.connection.tooling.create('SandboxInfo', sandboxReq); - this.logger.debug(`Return from calling tooling.create: ${JSON.stringify(createResult, undefined, 2)}`); + this.logger.debug(createResult, 'Return from calling tooling.create'); if (Array.isArray(createResult) || !createResult.success) { throw messages.createError('sandboxInfoCreateFailed', [JSON.stringify(createResult)]); } const sandboxCreationProgress = await this.querySandboxProcessBySandboxInfoId(createResult.id); - this.logger.debug( - `Return from calling singleRecordQuery with tooling: ${JSON.stringify(sandboxCreationProgress, undefined, 2)}` - ); + this.logger.debug(sandboxCreationProgress, 'Return from calling singleRecordQuery with tooling'); const isAsync = !!options.async; @@ -219,11 +251,8 @@ export class Org extends AsyncOptionalCreatable { } const [wait, pollInterval] = this.validateWaitOptions(options); this.logger.debug( - `create - pollStatusAndAuth sandboxProcessObj ${JSON.stringify( - sandboxCreationProgress, - undefined, - 2 - )}, max wait time of ${wait.minutes} minutes` + sandboxCreationProgress, + `create - pollStatusAndAuth sandboxProcessObj, max wait time of ${wait.minutes} minutes` ); return this.pollStatusAndAuth({ sandboxProcessObj: sandboxCreationProgress, @@ -232,6 +261,62 @@ export class Org extends AsyncOptionalCreatable { }); } + /** + * Refresh (update) a sandbox from a production org. + * 'this' needs to be a production org with sandbox licenses available + * + * @param sandboxInfo SandboxInfo to update the sandbox with + * @param options Wait: The amount of time to wait before timing out, Interval: The time interval between polling + */ + public async refreshSandbox( + sandboxInfo: SandboxInfo, + options: { wait?: Duration; interval?: Duration; async?: boolean } = { + wait: Duration.minutes(6), + async: false, + interval: Duration.seconds(30), + } + ): Promise { + this.logger.debug(sandboxInfo, 'RefreshSandbox called with SandboxInfo'); + const refreshResult = await this.connection.tooling.update('SandboxInfo', sandboxInfo); + this.logger.debug(refreshResult, 'Return from calling tooling.update'); + + if (!refreshResult.success) { + throw messages.createError('sandboxInfoRefreshFailed', [JSON.stringify(refreshResult)]); + } + + const soql = `SELECT ${sandboxProcessFields.join(',')} FROM SandboxProcess WHERE SandboxName='${ + sandboxInfo.SandboxName + }' ORDER BY CreatedDate DESC`; + const sbxProcessObjects = (await this.connection.tooling.query(soql)).records.filter( + (item) => !item.Status.startsWith('Del') + ); + this.logger.debug(sbxProcessObjects, `SandboxProcesses for ${sandboxInfo.SandboxName}`); + + // throw if none found + if (sbxProcessObjects?.length === 0) { + throw new Error(`No SandboxProcesses found for: ${sandboxInfo.SandboxName}`); + } + const sandboxRefreshProgress = sbxProcessObjects[0]; + + const isAsync = !!options.async; + + if (isAsync) { + // The user didn't want us to poll, so simply return the status + await Lifecycle.getInstance().emit(SandboxEvents.EVENT_ASYNC_RESULT, sandboxRefreshProgress); + return sandboxRefreshProgress; + } + const [wait, pollInterval] = this.validateWaitOptions(options); + this.logger.debug( + sandboxRefreshProgress, + `refresh - pollStatusAndAuth sandboxProcessObj, max wait time of ${wait.minutes} minutes` + ); + return this.pollStatusAndAuth({ + sandboxProcessObj: sandboxRefreshProgress, + wait, + pollInterval, + }); + } + /** * * @param sandboxReq SandboxRequest options to create the sandbox with @@ -244,17 +329,17 @@ export class Org extends AsyncOptionalCreatable { sourceSandboxName: string, options: { wait?: Duration; interval?: Duration } ): Promise { - sandboxReq.SourceId = (await this.querySandboxProcessBySandboxName(sourceSandboxName)).SandboxInfoId; - this.logger.debug('Clone sandbox sourceId %s', sandboxReq.SourceId); - return this.createSandbox(sandboxReq, options); + const SourceId = (await this.querySandboxProcessBySandboxName(sourceSandboxName)).SandboxInfoId; + this.logger.debug(`Clone sandbox sourceId ${SourceId}`); + return this.createSandbox({ ...sandboxReq, SourceId }, options); } /** - * resume a sandbox creation from a production org - * 'this' needs to be a production org with sandbox licenses available + * Resume a sandbox create or refresh from a production org. + * `this` needs to be a production org with sandbox licenses available. * - * @param resumeSandboxRequest SandboxRequest options to create the sandbox with - * @param options Wait: The amount of time to wait (default: 30 minutes) before timing out, + * @param resumeSandboxRequest SandboxRequest options to create/refresh the sandbox with + * @param options Wait: The amount of time to wait (default: 0 minutes) before timing out, * Interval: The time interval (default: 30 seconds) between polling */ public async resumeSandbox( @@ -265,23 +350,39 @@ export class Org extends AsyncOptionalCreatable { interval: Duration.seconds(30), } ): Promise { - this.logger.debug( - `ResumeSandbox called with ResumeSandboxRequest: ${JSON.stringify(resumeSandboxRequest, undefined, 2)}` - ); + this.logger.debug(resumeSandboxRequest, 'ResumeSandbox called with ResumeSandboxRequest'); let sandboxCreationProgress: SandboxProcessObject; // seed the sandboxCreationProgress via the resumeSandboxRequest options - if (resumeSandboxRequest.SandboxName) { - sandboxCreationProgress = await this.querySandboxProcessBySandboxName(resumeSandboxRequest.SandboxName); - } else if (resumeSandboxRequest.SandboxProcessObjId) { + if (resumeSandboxRequest.SandboxProcessObjId) { sandboxCreationProgress = await this.querySandboxProcessById(resumeSandboxRequest.SandboxProcessObjId); + } else if (resumeSandboxRequest.SandboxName) { + try { + // There can be multiple sandbox processes returned when querying by name. Use the most recent + // process and fire a warning event with all processes. + sandboxCreationProgress = await this.querySandboxProcessBySandboxName(resumeSandboxRequest.SandboxName); + } catch (err) { + if (err instanceof SfError && err.name === 'SingleRecordQuery_MultipleRecords' && err.data) { + const sbxProcesses = err.data as SandboxProcessObject[]; + // 0 index will always be the most recently created process since the query sorts on created date desc. + sandboxCreationProgress = sbxProcesses[0]; + await Lifecycle.getInstance().emit(SandboxEvents.EVENT_MULTIPLE_SBX_PROCESSES, sbxProcesses); + } else { + throw err; + } + } } else { throw messages.createError('sandboxNotFound', [ resumeSandboxRequest.SandboxName ?? resumeSandboxRequest.SandboxProcessObjId, ]); } - this.logger.debug( - `Return from calling singleRecordQuery with tooling: ${JSON.stringify(sandboxCreationProgress, undefined, 2)}` - ); + this.logger.debug(sandboxCreationProgress, 'Return from calling singleRecordQuery with tooling'); + + if (!sandboxIsResumable(sandboxCreationProgress.Status)) { + throw messages.createError('sandboxNotResumable', [ + sandboxCreationProgress.SandboxName, + sandboxCreationProgress.Status, + ]); + } await Lifecycle.getInstance().emit(SandboxEvents.EVENT_RESUME, sandboxCreationProgress); @@ -294,7 +395,7 @@ export class Org extends AsyncOptionalCreatable { if (sandboxInfo) { await Lifecycle.getInstance().emit(SandboxEvents.EVENT_AUTH, sandboxInfo); try { - this.logger.debug(`sandbox signup complete with ${JSON.stringify(sandboxInfo, undefined, 2)}`); + this.logger.debug(sandboxInfo, 'sandbox signup complete'); await this.writeSandboxAuthFile(sandboxCreationProgress, sandboxInfo); return sandboxCreationProgress; } catch (err) { @@ -306,18 +407,9 @@ export class Org extends AsyncOptionalCreatable { throw messages.createError('sandboxCreateNotComplete'); } - if (!sandboxIsResumable(sandboxCreationProgress.Status)) { - throw messages.createError('sandboxNotResumable', [ - sandboxCreationProgress.SandboxName, - sandboxCreationProgress.Status, - ]); - } this.logger.debug( - `resume - pollStatusAndAuth sandboxProcessObj ${JSON.stringify( - sandboxCreationProgress, - undefined, - 2 - )}, max wait time of ${wait.minutes} minutes` + sandboxCreationProgress, + `resume - pollStatusAndAuth sandboxProcessObj, max wait time of ${wait.minutes} minutes` ); return this.pollStatusAndAuth({ sandboxProcessObj: sandboxCreationProgress, @@ -454,7 +546,7 @@ export class Org extends AsyncOptionalCreatable { /** * Returns the Org object or null if this org is not affiliated with a Dev Hub (according to the local config). */ - public async getDevHubOrg(): Promise> { + public async getDevHubOrg(): Promise { if (this.isDevHubOrg()) { return this; } else if (this.getField(Org.Fields.DEV_HUB_USERNAME)) { @@ -489,16 +581,17 @@ export class Org extends AsyncOptionalCreatable { * @param controllingOrg username or Org that 'this.devhub' or 'this.production' refers to. AKA a DevHub for a scratch org, or a Production Org for a sandbox */ public async deleteFrom(controllingOrg: string | Org): Promise { - if (typeof controllingOrg === 'string') { - controllingOrg = await Org.create({ - aggregator: this.configAggregator, - aliasOrUsername: controllingOrg, - }); - } + const resolvedOrg = + typeof controllingOrg === 'string' + ? await Org.create({ + aggregator: this.configAggregator, + aliasOrUsername: controllingOrg, + }) + : controllingOrg; if (await this.isSandbox()) { - await this.deleteSandbox(controllingOrg); + await this.deleteSandbox(resolvedOrg); } else { - await this.deleteScratchOrg(controllingOrg); + await this.deleteScratchOrg(resolvedOrg); } } @@ -506,6 +599,16 @@ export class Org extends AsyncOptionalCreatable { * Will delete 'this' instance remotely and any files locally */ public async delete(): Promise { + const username = ensureString(this.getUsername()); + + // unset any aliases referencing this org + const stateAgg = await StateAggregator.getInstance(); + const existingAliases = stateAgg.aliases.getAll(username); + await stateAgg.aliases.unsetValuesAndSave(existingAliases); + + // unset any configs referencing this org + await Promise.all([...existingAliases, username].flatMap((name) => this.configAggregator.unsetByValue(name))); + if (await this.isSandbox()) { await this.deleteSandbox(); } else { @@ -614,13 +717,12 @@ export class Org extends AsyncOptionalCreatable { * using {@link Org.retrieveOrganizationInformation}. */ public async determineIfScratch(): Promise { - let cache = this.getField(Org.Fields.IS_SCRATCH); - - if (!cache) { - await this.updateLocalInformation(); - cache = this.getField(Org.Fields.IS_SCRATCH); + const cache = this.getField(Org.Fields.IS_SCRATCH); + if (cache !== undefined) { + return cache; } - return cache as boolean; + const updated = await this.updateLocalInformation(); + return updated?.isScratch === true; } /** @@ -631,13 +733,12 @@ export class Org extends AsyncOptionalCreatable { * using {@link Org.retrieveOrganizationInformation}. */ public async determineIfSandbox(): Promise { - let cache = this.getField(Org.Fields.IS_SANDBOX); - - if (!cache) { - await this.updateLocalInformation(); - cache = this.getField(Org.Fields.IS_SANDBOX); + const cache = this.getField(Org.Fields.IS_SANDBOX); + if (cache !== undefined) { + return cache; } - return cache as boolean; + const updated = await this.updateLocalInformation(); + return updated?.isSandbox === true; } /** @@ -656,22 +757,35 @@ export class Org extends AsyncOptionalCreatable { * Some organization information is locally cached, such as if the org name or if it is a scratch org. * This method populates/updates the filesystem from information retrieved from the org. */ - public async updateLocalInformation(): Promise { + public async updateLocalInformation(): Promise< + | Pick< + AuthFields, + | Org.Fields.NAME + | Org.Fields.INSTANCE_NAME + | Org.Fields.NAMESPACE_PREFIX + | Org.Fields.IS_SANDBOX + | Org.Fields.IS_SCRATCH + | Org.Fields.TRIAL_EXPIRATION_DATE + > + | undefined + > { const username = this.getUsername(); if (username) { - const organization = await this.retrieveOrganizationInformation(); - const isScratch = organization.IsSandbox && Boolean(organization.TrialExpirationDate); - const isSandbox = organization.IsSandbox && !organization.TrialExpirationDate; - const stateAggregator = await StateAggregator.getInstance(); - stateAggregator.orgs.update(username, { + const [stateAggregator, organization] = await Promise.all([ + StateAggregator.getInstance(), + this.retrieveOrganizationInformation(), + ]); + const updateFields = { [Org.Fields.NAME]: organization.Name, [Org.Fields.INSTANCE_NAME]: organization.InstanceName, [Org.Fields.NAMESPACE_PREFIX]: organization.NamespacePrefix, - [Org.Fields.IS_SANDBOX]: isSandbox, - [Org.Fields.IS_SCRATCH]: isScratch, + [Org.Fields.IS_SANDBOX]: organization.IsSandbox && !organization.TrialExpirationDate, + [Org.Fields.IS_SCRATCH]: organization.IsSandbox && Boolean(organization.TrialExpirationDate), [Org.Fields.TRIAL_EXPIRATION_DATE]: organization.TrialExpirationDate, - }); + }; + stateAggregator.orgs.update(username, updateFields); await stateAggregator.orgs.write(username); + return updateFields; } } @@ -684,8 +798,8 @@ export class Org extends AsyncOptionalCreatable { url: this.getConnection().baseUrl(), method: 'GET', }; - const conn = this.getConnection(); - await conn.request(requestInfo); + + await this.getConnection().request(requestInfo); } /** @@ -697,15 +811,11 @@ export class Org extends AsyncOptionalCreatable { const thisUsername = ensure(this.getUsername()); const usernames: JsonArray = ensureJsonArray(contents.usernames ?? [thisUsername]); return Promise.all( - usernames.map((username) => { - if (username === thisUsername) { - return AuthInfo.create({ - username: this.getConnection().getUsername(), - }); - } else { - return AuthInfo.create({ username: ensureString(username) }); - } - }) + usernames.map((username) => + AuthInfo.create({ + username: username === thisUsername ? this.getConnection().getUsername() : ensureString(username), + }) + ) ); } @@ -741,7 +851,7 @@ export class Org extends AsyncOptionalCreatable { // needs config refactoring to improve const usernames = contents.usernames ?? []; - if (!isArray(usernames)) { + if (!Array.isArray(usernames)) { throw new SfError('Usernames is not an array', 'UnexpectedDataFormat'); } @@ -784,13 +894,13 @@ export class Org extends AsyncOptionalCreatable { this.logger.debug(`removing username ${authInfo.getFields().username}`); const orgConfig: OrgUsersConfig = await this.retrieveOrgUsersConfig(); - - const contents: ConfigContents = await orgConfig.read(); + const contents = await orgConfig.read(); const targetUser = authInfo.getFields().username; - const usernames = (contents.usernames ?? []) as string[]; - contents.usernames = usernames.filter((username) => username !== targetUser); + const usernames = (contents.usernames ?? []).filter((username) => username !== targetUser); + + orgConfig.set('usernames', usernames); await orgConfig.write(); return this; } @@ -827,7 +937,7 @@ export class Org extends AsyncOptionalCreatable { /** * Returns the admin username used to create the org. */ - public getUsername(): Optional { + public getUsername(): string | undefined { return this.getConnection().getUsername(); } @@ -862,11 +972,7 @@ export class Org extends AsyncOptionalCreatable { * Returns a map of requested fields. */ public getFields(keys: Org.Fields[]): JsonMap { - const json: JsonMap = {}; - return keys.reduce((map, key) => { - map[key] = this.getField(key); - return map; - }, json); + return Object.fromEntries(keys.map((key) => [key, this.getField(key)])); } /** @@ -907,7 +1013,6 @@ export class Org extends AsyncOptionalCreatable { * query SandboxProcess via sandbox name * * @param name SandboxName to query for - * @private */ public async querySandboxProcessBySandboxName(name: string): Promise { return this.querySandboxProcess(`SandboxName='${name}'`); @@ -917,7 +1022,6 @@ export class Org extends AsyncOptionalCreatable { * query SandboxProcess via SandboxInfoId * * @param id SandboxInfoId to query for - * @private */ public async querySandboxProcessBySandboxInfoId(id: string): Promise { return this.querySandboxProcess(`SandboxInfoId='${id}'`); @@ -927,18 +1031,27 @@ export class Org extends AsyncOptionalCreatable { * query SandboxProcess via Id * * @param id SandboxProcessId to query for - * @private */ public async querySandboxProcessById(id: string): Promise { return this.querySandboxProcess(`Id='${id}'`); } + /** + * query SandboxProcess via SandboxOrganization (sandbox Org ID) + * + * @param sandboxOrgId SandboxOrganization ID to query for + */ + public async querySandboxProcessByOrgId(sandboxOrgId: string): Promise { + // Must query with a 15 character Org ID + return this.querySandboxProcess(`SandboxOrganization='${trimTo15(sandboxOrgId)}'`); + } + /** * Initialize async components. */ protected async init(): Promise { const stateAggregator = await StateAggregator.getInstance(); - this.logger = await Logger.child('Org'); + this.logger = (await Logger.child('Org')).getRawLogger(); this.configAggregator = this.options.aggregator ? this.options.aggregator : await ConfigAggregator.create(); @@ -1007,11 +1120,7 @@ export class Org extends AsyncOptionalCreatable { } ): Promise { const [wait, pollInterval] = this.validateWaitOptions(options); - this.logger.debug( - `AuthWithRetries sandboxProcessObj ${JSON.stringify(sandboxProcessObj, undefined, 2)}, max wait time of ${ - wait.minutes - } minutes` - ); + this.logger.debug(sandboxProcessObj, `AuthWithRetries sandboxProcessObj, max wait time of ${wait.minutes} minutes`); return this.pollStatusAndAuth({ sandboxProcessObj, wait, @@ -1027,11 +1136,13 @@ export class Org extends AsyncOptionalCreatable { */ private async queryLatestSandboxProcessBySandboxName(sandboxNameIn: string): Promise { const { tooling } = this.getConnection(); - this.logger.debug('QueryLatestSandboxProcessBySandboxName called with SandboxName: %s ', sandboxNameIn); - const queryStr = `SELECT Id, Status, SandboxName, SandboxInfoId, LicenseType, CreatedDate, CopyProgress, SandboxOrganization, SourceId, Description, EndDate FROM SandboxProcess WHERE SandboxName='${sandboxNameIn}' AND Status != 'D' ORDER BY CreatedDate DESC LIMIT 1`; + this.logger.debug(`QueryLatestSandboxProcessBySandboxName called with SandboxName: ${sandboxNameIn}`); + const queryStr = `SELECT ${sandboxProcessFields.join( + ',' + )} FROM SandboxProcess WHERE SandboxName='${sandboxNameIn}' AND Status != 'D' ORDER BY CreatedDate DESC LIMIT 1`; const queryResult = await tooling.query(queryStr); - this.logger.debug('Return from calling queryToolingApi: %s ', queryResult); + this.logger.debug(queryResult, 'Return from calling queryToolingApi'); if (queryResult?.records?.length === 1) { return queryResult.records[0] as SandboxProcessObject; } else if (queryResult.records && queryResult.records.length > 1) { @@ -1065,16 +1176,19 @@ export class Org extends AsyncOptionalCreatable { */ private async deleteSandbox(prodOrg?: Org): Promise { const sandbox = await this.getSandboxConfig(this.getOrgId()); - prodOrg ??= await Org.create({ - aggregator: this.configAggregator, - aliasOrUsername: sandbox?.prodOrgUsername, - }); + const resolvedProdOrg = + prodOrg ?? + (await Org.create({ + aggregator: this.configAggregator, + aliasOrUsername: sandbox?.prodOrgUsername, + })); let sandboxInfoId: string | undefined = sandbox?.sandboxInfoId; if (!sandboxInfoId) { let result: { SandboxInfoId: string }; try { // grab sandboxName from config or try to calculate from the sandbox username - const sandboxName = sandbox?.sandboxName ?? (this.getUsername() ?? '').split(`${prodOrg.getUsername()}.`)[1]; + const sandboxName = + sandbox?.sandboxName ?? (this.getUsername() ?? '').split(`${resolvedProdOrg.getUsername()}.`)[1]; if (!sandboxName) { this.logger.debug('Sandbox name is not available'); // jump to query by orgId @@ -1082,7 +1196,7 @@ export class Org extends AsyncOptionalCreatable { } this.logger.debug(`attempting to locate sandbox with sandbox ${sandboxName}`); try { - result = await this.queryProduction(prodOrg, 'SandboxName', sandboxName); + result = await this.queryProduction(resolvedProdOrg, 'SandboxName', sandboxName); } catch (err) { this.logger.debug(`Failed to find sandbox with sandbox name: ${sandboxName}`); // jump to query by orgId @@ -1093,7 +1207,7 @@ export class Org extends AsyncOptionalCreatable { const trimmedId = trimTo15(this.getOrgId()); this.logger.debug(`defaulting to trimming id from ${this.getOrgId()} to ${trimmedId}`); try { - result = await this.queryProduction(prodOrg, 'SandboxOrganization', trimmedId); + result = await this.queryProduction(resolvedProdOrg, 'SandboxOrganization', trimmedId); sandboxInfoId = result.SandboxInfoId; } catch { // eating exceptions when trying to find sandbox process record by orgId @@ -1104,8 +1218,8 @@ export class Org extends AsyncOptionalCreatable { } if (sandboxInfoId) { - const deleteResult = await this.destroySandbox(prodOrg, sandboxInfoId); - this.logger.debug('Return from calling tooling.delete: ', deleteResult); + const deleteResult = await this.destroySandbox(resolvedProdOrg, sandboxInfoId); + this.logger.debug(deleteResult, 'Return from calling tooling.delete'); } // cleanup remaining artifacts await this.remove(); @@ -1119,25 +1233,26 @@ export class Org extends AsyncOptionalCreatable { */ private async deleteScratchOrg(devHub?: Org): Promise { // if we didn't get a devHub, we'll get it from the this org - devHub ??= await this.getDevHubOrg(); - if (!devHub) { + const resolvedDevHub = devHub ?? (await this.getDevHubOrg()); + if (!resolvedDevHub) { throw messages.createError('noDevHubFound'); } - if (devHub.getOrgId() === this.getOrgId()) { + if (resolvedDevHub.getOrgId() === this.getOrgId()) { // we're attempting to delete a DevHub throw messages.createError('deleteOrgHubError'); } try { - const devHubConn = devHub.getConnection(); + const devHubConn = resolvedDevHub.getConnection(); const username = this.getUsername(); + const activeScratchOrgRecordId = ( await devHubConn.singleRecordQuery<{ Id: string }>( `SELECT Id FROM ActiveScratchOrg WHERE SignupUsername='${username}'` ) ).Id; this.logger.trace(`found matching ActiveScratchOrg with SignupUsername: ${username}. Deleting...`); - await this.destroyScratchOrg(devHub, activeScratchOrgRecordId); + await this.destroyScratchOrg(resolvedDevHub, activeScratchOrgRecordId); await this.remove(); } catch (err) { this.logger.info(err instanceof Error ? err.message : err); @@ -1210,36 +1325,33 @@ export class Org extends AsyncOptionalCreatable { this.logger.debug(`Removing users associate with org: ${this.getOrgId()}`); const config = await this.retrieveOrgUsersConfig(); this.logger.debug(`using path for org users: ${config.getPath()}`); - const authInfos: AuthInfo[] = await this.readUserAuthFiles(); + + const usernames = (await this.readUserAuthFiles()).map((auth) => auth.getFields().username).filter(isString); await Promise.all( - authInfos - .map((auth) => auth.getFields().username) - .map(async (username) => { - const aliasKeys = (username && stateAggregator.aliases.getAll(username)) ?? []; - stateAggregator.aliases.unsetAll(username as string); - - const orgForUser = - username === this.getUsername() - ? this - : await Org.create({ - connection: await Connection.create({ authInfo: await AuthInfo.create({ username }) }), - }); - - const orgType = this.isDevHubOrg() ? OrgConfigProperties.TARGET_DEV_HUB : OrgConfigProperties.TARGET_ORG; - const configInfo = orgForUser.configAggregator.getInfo(orgType); - const needsConfigUpdate = - (configInfo.isGlobal() || configInfo.isLocal()) && - (configInfo.value === username || aliasKeys.includes(configInfo.value as string)); - - return [ - orgForUser.removeAuth(), - needsConfigUpdate ? Config.update(configInfo.isGlobal(), orgType, undefined) : undefined, - ].filter(Boolean); - }) + usernames.map(async (username) => { + const orgForUser = + username === this.getUsername() + ? this + : await Org.create({ + connection: await Connection.create({ authInfo: await AuthInfo.create({ username }) }), + }); + + const orgType = this.isDevHubOrg() ? OrgConfigProperties.TARGET_DEV_HUB : OrgConfigProperties.TARGET_ORG; + const configInfo = orgForUser.configAggregator.getInfo(orgType); + const needsConfigUpdate = + (configInfo.isGlobal() || configInfo.isLocal()) && + (configInfo.value === username || stateAggregator.aliases.get(configInfo.value as string) === username); + + return [ + orgForUser.removeAuth(), + needsConfigUpdate ? Config.update(configInfo.isGlobal(), orgType, undefined) : undefined, + ].filter(Boolean); + }) ); - await stateAggregator.aliases.write(); + // now that we're done with all the aliases, we can unset those + await stateAggregator.aliases.unsetValuesAndSave(usernames); } private async removeSandboxConfig(): Promise { @@ -1251,14 +1363,11 @@ export class Org extends AsyncOptionalCreatable { sandboxProcessObj: SandboxProcessObject, sandboxRes: SandboxUserAuthResponse ): Promise { - this.logger.debug( - `writeSandboxAuthFile sandboxProcessObj: ${JSON.stringify(sandboxProcessObj)}, sandboxRes: ${JSON.stringify( - sandboxRes - )}` - ); + this.logger.debug(sandboxProcessObj, 'writeSandboxAuthFile sandboxProcessObj'); + this.logger.debug(sandboxRes, 'writeSandboxAuthFile sandboxRes'); if (sandboxRes.authUserName) { const productionAuthFields = this.connection.getAuthInfoFields(); - this.logger.debug('Result from getAuthInfoFields: AuthFields', productionAuthFields); + this.logger.debug(productionAuthFields, 'Result from getAuthInfoFields: AuthFields'); // let's do headless auth via jwt (if we have privateKey) or web auth const oauth2Options: AuthFields & { @@ -1278,6 +1387,17 @@ export class Org extends AsyncOptionalCreatable { oauth2Options.clientId = productionAuthFields.clientId; } + // Before creating the AuthInfo, delete any existing auth files for the sandbox. + // This is common when refreshing sandboxes, and will cause AuthInfo to throw + // because it doesn't want to overwrite existing auth files. + const stateAggregator = await StateAggregator.getInstance(); + try { + await stateAggregator.orgs.read(sandboxRes.authUserName); + await stateAggregator.orgs.remove(sandboxRes.authUserName); + } catch (e) { + // ignore since this is only for deleting existing auth files. + } + const authInfo = await AuthInfo.create({ username: sandboxRes.authUserName, oauth2Options, @@ -1285,29 +1405,34 @@ export class Org extends AsyncOptionalCreatable { }); this.logger.debug( - 'Creating AuthInfo for sandbox', - sandboxRes.authUserName, - productionAuthFields.username, - oauth2Options + { + sandboxResAuthUsername: sandboxRes.authUserName, + productionAuthFieldsUsername: productionAuthFields.username, + ...oauth2Options, + }, + 'Creating AuthInfo for sandbox' ); - // save auth info for new sandbox - await authInfo.save(); + // save auth info for sandbox + await authInfo.save({ + isScratch: false, + isSandbox: true, + }); - const sandboxOrgId = authInfo.getFields().orgId as string; + const sandboxOrgId = authInfo.getFields().orgId; if (!sandboxOrgId) { throw messages.createError('AuthInfoOrgIdUndefined'); } // set the sandbox config value - const sfSandbox = { + const sfSandbox: SandboxFields = { sandboxUsername: sandboxRes.authUserName, sandboxOrgId, - prodOrgUsername: this.getUsername(), + prodOrgUsername: this.getUsername() as string, sandboxName: sandboxProcessObj.SandboxName, sandboxProcessId: sandboxProcessObj.Id, sandboxInfoId: sandboxProcessObj.SandboxInfoId, timestamp: new Date().toISOString(), - } as SandboxFields; + }; await this.setSandboxConfig(sandboxOrgId, sfSandbox); await (await StateAggregator.getInstance()).sandboxes.write(sandboxOrgId); @@ -1327,25 +1452,18 @@ export class Org extends AsyncOptionalCreatable { wait: Duration; pollInterval: Duration; }): Promise { - this.logger.debug( - 'PollStatusAndAuth called with SandboxProcessObject', - options.sandboxProcessObj, - options.wait.minutes, - options.pollInterval.seconds - ); + this.logger.debug(options, 'PollStatusAndAuth called with SandboxProcessObject'); let remainingWait = options.wait; let waitingOnAuth = false; const pollingClient = await PollingClient.create({ poll: async (): Promise => { - const sandboxProcessObj = await this.querySandboxProcessBySandboxInfoId( - options.sandboxProcessObj.SandboxInfoId - ); + const sandboxProcessObj = await this.querySandboxProcessById(options.sandboxProcessObj.Id); // check to see if sandbox can authenticate via sandboxAuth endpoint const sandboxInfo = await this.sandboxSignupComplete(sandboxProcessObj); if (sandboxInfo) { await Lifecycle.getInstance().emit(SandboxEvents.EVENT_AUTH, sandboxInfo); try { - this.logger.debug('sandbox signup complete with', sandboxInfo); + this.logger.debug(sandboxInfo, 'sandbox signup complete with'); await this.writeSandboxAuthFile(sandboxProcessObj, sandboxInfo); return { completed: true, payload: sandboxProcessObj }; } catch (err) { @@ -1382,10 +1500,21 @@ export class Org extends AsyncOptionalCreatable { * @private */ private async querySandboxProcess(where: string): Promise { - const queryStr = `SELECT Id, Status, SandboxName, SandboxInfoId, LicenseType, CreatedDate, CopyProgress, SandboxOrganization, SourceId, Description, EndDate FROM SandboxProcess WHERE ${where} AND Status != 'D'`; - return this.connection.singleRecordQuery(queryStr, { - tooling: true, - }); + const soql = `SELECT ${sandboxProcessFields.join( + ',' + )} FROM SandboxProcess WHERE ${where} ORDER BY CreatedDate DESC`; + const result = (await this.connection.tooling.query(soql)).records.filter( + (item) => !item.Status.startsWith('Del') + ); + if (result.length === 0) { + throw new SfError(`No record found for ${soql}`, SingleRecordQueryErrors.NoRecords); + } + if (result.length > 1) { + const err = new SfError('The query returned more than 1 record', SingleRecordQueryErrors.MultipleRecords); + err.data = result; + throw err; + } + return result[0]; } /** * determines if the sandbox has successfully been created @@ -1413,7 +1542,7 @@ export class Org extends AsyncOptionalCreatable { callbackUrl, }; - this.logger.debug('Calling sandboxAuth with SandboxUserAuthRequest', sandboxReq); + this.logger.debug(sandboxReq, 'Calling sandboxAuth with SandboxUserAuthRequest'); // eslint-disable-next-line no-underscore-dangle const url = `${this.connection.tooling._baseUrl()}/sandboxAuth`; @@ -1426,17 +1555,17 @@ export class Org extends AsyncOptionalCreatable { const result: SandboxUserAuthResponse = await this.connection.tooling.request(params); - this.logger.debug('Result of calling sandboxAuth', result); + this.logger.debug(result, 'Result of calling sandboxAuth'); return result; - } catch (err) { - const error = err as Error; + } catch (err: unknown) { + const error = err instanceof Error ? err : SfError.wrap(isString(err) ? err : 'unknown'); // There are cases where the endDate is set before the sandbox has actually completed. // In that case, the sandboxAuth call will throw a specific exception. if (error?.name === 'INVALID_STATUS') { - this.logger.debug('Error while authenticating the user', error?.toString()); + this.logger.debug('Error while authenticating the user:', error.message); } else { - // If it fails for any unexpected reason, just pass that through - throw SfError.wrap(error); + // If it fails for any unexpected reason, rethrow + throw error; } } } @@ -1478,12 +1607,12 @@ export namespace Org { /** * Constructor Options for and Org. */ - export interface Options { + export type Options = { aliasOrUsername?: string; connection?: Connection; aggregator?: ConfigAggregator; isDevHub?: boolean; - } + }; /** * Scratch Org status. @@ -1547,7 +1676,7 @@ export namespace Org { */ IS_SCRATCH = 'isScratch', /** - * Is the current org a dev hub org. e.g. Organization has IsSandbox == true and TrialExpirationDate == null. + * Is the current org a sandbox (not a scratch org on a non-prod instance), but an actual Sandbox org). e.g. Organization has IsSandbox == true and TrialExpirationDate == null. */ IS_SANDBOX = 'isSandbox', /** diff --git a/src/org/orgConfigProperties.ts b/src/org/orgConfigProperties.ts index 2d1eea7056..2c2a50f672 100644 --- a/src/org/orgConfigProperties.ts +++ b/src/org/orgConfigProperties.ts @@ -5,9 +5,9 @@ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause */ -import { join as pathJoin } from 'path'; +import { join as pathJoin } from 'node:path'; import { isString } from '@salesforce/ts-types'; -import { ConfigValue } from '../config/configStore'; +import { ConfigValue } from '../config/configStackTypes'; import { Messages } from '../messages'; import { SfdcUrl } from '../util/sfdcUrl'; import { validateApiVersion } from '../util/sfdc'; @@ -48,9 +48,17 @@ export enum OrgConfigProperties { * The url for the debugger configuration. */ ORG_ISV_DEBUGGER_URL = 'org-isv-debugger-url', + /** + * Capitalize record types when deploying scratch org settings + */ + ORG_CAPITALIZE_RECORD_TYPES = 'org-capitalize-record-types', } export const ORG_CONFIG_ALLOWED_PROPERTIES = [ + { + key: OrgConfigProperties.ORG_CAPITALIZE_RECORD_TYPES, + description: messages.getMessage(OrgConfigProperties.ORG_CAPITALIZE_RECORD_TYPES), + }, { key: OrgConfigProperties.ORG_CUSTOM_METADATA_TEMPLATES, description: messages.getMessage(OrgConfigProperties.ORG_CUSTOM_METADATA_TEMPLATES), diff --git a/src/org/permissionSetAssignment.ts b/src/org/permissionSetAssignment.ts index 1247a61cf9..794311c696 100644 --- a/src/org/permissionSetAssignment.ts +++ b/src/org/permissionSetAssignment.ts @@ -5,11 +5,11 @@ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause */ -import { EOL } from 'os'; +import { EOL } from 'node:os'; import { mapKeys, upperFirst } from '@salesforce/kit'; -import { hasArray, Optional } from '@salesforce/ts-types'; -import { QueryResult, Record } from 'jsforce'; -import { Logger } from '../logger'; +import type { Optional } from '@salesforce/ts-types'; +import type { QueryResult, Record } from '@jsforce/jsforce-node'; +import { Logger } from '../logger/logger'; import { Messages } from '../messages'; import { SfError } from '../sfError'; import { Org } from './org'; @@ -20,10 +20,10 @@ const messages = Messages.loadMessages('@salesforce/core', 'permissionSetAssignm /** * Map of fields name for a permission set assignment */ -export interface PermissionSetAssignmentFields { +export type PermissionSetAssignmentFields = { assigneeId: string; permissionSetId: string; -} +}; /** * A class for assigning a Salesforce User to one or more permission sets. @@ -94,19 +94,22 @@ export class PermissionSetAssignment { .sobject('PermissionSetAssignment') .create(mapKeys(assignment, (value: unknown, key: string) => upperFirst(key))); - if (hasArray(createResponse, 'errors') && createResponse.errors.length > 0) { - let message = messages.getMessage('errorsEncounteredCreatingAssignment'); - - const errors = createResponse.errors; - if (errors && errors.length > 0) { - message = `${message}:${EOL}`; - errors.forEach((_message) => { - message = `${message}${_message as string}${EOL}`; - }); - throw new SfError(message, 'errorsEncounteredCreatingAssignment'); - } else { + if (createResponse.success === false) { + if (!createResponse.errors?.length) { throw messages.createError('notSuccessfulButNoErrorsReported'); } + const message = [messages.getMessage('errorsEncounteredCreatingAssignment')] + .concat( + (createResponse.errors ?? []).map((error) => { + // note: the types for jsforce SaveError don't have "string[]" error, + // but there was a UT for that at https://github.com/forcedotcom/sfdx-core/blob/7412d103703cfe2df2211546fcf2e6d93a689bc0/test/unit/org/permissionSetAssignmentTest.ts#L146 + // which could either be hallucination or a real response we've seen, so I'm preserving that behavior. + if (typeof error === 'string') return error; + return error.fields ? `${error.message} on fields ${error.fields.join(',')}` : error.message; + }) + ) + .join(EOL); + throw new SfError(message, 'errorsEncounteredCreatingAssignment'); } else { return assignment; } diff --git a/src/org/scratchOrgCreate.ts b/src/org/scratchOrgCreate.ts index f2bae0b714..82f378e132 100644 --- a/src/org/scratchOrgCreate.ts +++ b/src/org/scratchOrgCreate.ts @@ -4,14 +4,14 @@ * 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 { Duration } from '@salesforce/kit'; +import { Duration, toBoolean } from '@salesforce/kit'; import { ensureString } from '@salesforce/ts-types'; import { Messages } from '../messages'; -import { Logger } from '../logger'; +import { Logger } from '../logger/logger'; import { ConfigAggregator } from '../config/configAggregator'; import { OrgConfigProperties } from '../org/orgConfigProperties'; import { SfProject } from '../sfProject'; -import { StateAggregator } from '../stateAggregator'; +import { StateAggregator } from '../stateAggregator/stateAggregator'; import { Org } from './org'; import { authorizeScratchOrg, @@ -34,14 +34,14 @@ const messages = Messages.loadMessages('@salesforce/core', 'scratchOrgCreate'); export const DEFAULT_STREAM_TIMEOUT_MINUTES = 6; -export interface ScratchOrgCreateResult { +export type ScratchOrgCreateResult = { username?: string; scratchOrgInfo?: ScratchOrgInfo; authInfo?: AuthInfo; authFields?: AuthFields; warnings: string[]; -} -export interface ScratchOrgCreateOptions { +}; +export type ScratchOrgCreateOptions = { /** the environment hub org */ hubOrg: Org; /** The connected app consumer key. */ @@ -80,7 +80,7 @@ export interface ScratchOrgCreateOptions { setDefault?: boolean; /** if false, do not use source tracking for this scratch org */ tracksSource?: boolean; -} +}; const validateDuration = (durationDays: number): void => { const min = 1; @@ -110,9 +110,12 @@ export const scratchOrgResume = async (jobId: string): Promise => { // a project isn't required for org:create } }; + +async function getCapitalizeRecordTypesConfig(): Promise { + const configAgg = await ConfigAggregator.create(); + const value = configAgg.getInfo('org-capitalize-record-types').value as string | undefined; + + if (value !== undefined) return toBoolean(value); + + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + return value as undefined; +} diff --git a/src/org/scratchOrgErrorCodes.ts b/src/org/scratchOrgErrorCodes.ts index 9406ca3ae1..35ff3f7c5b 100644 --- a/src/org/scratchOrgErrorCodes.ts +++ b/src/org/scratchOrgErrorCodes.ts @@ -8,7 +8,7 @@ import { Optional } from '@salesforce/ts-types'; import { Messages } from '../messages'; import { SfError } from '../sfError'; -import { Logger } from '../logger'; +import { Logger } from '../logger/logger'; import { ScratchOrgInfo } from './scratchOrgTypes'; import { ScratchOrgCache } from './scratchOrgCache'; import { emit } from './scratchOrgLifecycleEvents'; diff --git a/src/org/scratchOrgFeatureDeprecation.ts b/src/org/scratchOrgFeatureDeprecation.ts index fff30c7573..6e847ba774 100644 --- a/src/org/scratchOrgFeatureDeprecation.ts +++ b/src/org/scratchOrgFeatureDeprecation.ts @@ -36,11 +36,11 @@ const FEATURE_TYPES = { ], }; -interface FeatureTypes { +type FeatureTypes = { simpleFeatureMapping: { [key: string]: string[] }; quantifiedFeatureMapping: Record; deprecatedFeatures: string[]; -} +}; export class ScratchOrgFeatureDeprecation { private featureTypes: FeatureTypes; diff --git a/src/org/scratchOrgInfoApi.ts b/src/org/scratchOrgInfoApi.ts index 47ebb5fec5..7a297cb45d 100644 --- a/src/org/scratchOrgInfoApi.ts +++ b/src/org/scratchOrgInfoApi.ts @@ -5,11 +5,13 @@ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause */ -import { env, Duration, upperFirst } from '@salesforce/kit'; +import { env, Duration, upperFirst, omit } from '@salesforce/kit'; + import { AnyJson } from '@salesforce/ts-types'; -import { OAuth2Config, JwtOAuth2Config, SaveResult } from 'jsforce'; +import { OAuth2Config, SaveResult } from '@jsforce/jsforce-node'; import { retryDecorator, RetryError } from 'ts-retry-promise'; -import { Logger } from '../logger'; +import { JwtOAuth2Config } from '../org/authInfo'; +import { Logger } from '../logger/logger'; import { Messages } from '../messages'; import { SfError } from '../sfError'; import { SfdcUrl } from '../util/sfdcUrl'; @@ -24,6 +26,9 @@ import { checkScratchOrgInfoForErrors } from './scratchOrgErrorCodes'; import SettingsGenerator from './scratchOrgSettingsGenerator'; import { ScratchOrgInfo } from './scratchOrgTypes'; import { emit } from './scratchOrgLifecycleEvents'; + +// preserving because it extends a class +// eslint-disable-next-line @typescript-eslint/consistent-type-definitions export interface JsForceError extends Error { errorCode: string; fields: string[]; @@ -231,7 +236,11 @@ export const authorizeScratchOrg = async (options: { clientId: scratchOrgInfoComplete.ConnectedAppConsumerKey, createdOrgInstance: scratchOrgInfoComplete.SignupInstance, isDevHub: false, - snapshot: scratchOrgInfoComplete.Snapshot, + isScratch: true, + isSandbox: false, + // omit optional fields unless they are present + ...(scratchOrgInfoComplete.Namespace ? { namespacePrefix: scratchOrgInfoComplete.Namespace } : {}), + ...(scratchOrgInfoComplete.Snapshot ? { snapshot: scratchOrgInfoComplete.Snapshot } : {}), }); return authInfo; @@ -278,10 +287,6 @@ export const requestScratchOrgCreation = async ( if (!hubOrg.isDevHubOrg()) { throw messages.createError('hubOrgIsNotDevHub', [hubOrg.getUsername(), hubOrg.getOrgId()]); } - // If these were present, they were already used to initialize the scratchOrgSettingsGenerator. - // They shouldn't be submitted as part of the scratchOrgInfo. - delete scratchOrgRequest.settings; - delete scratchOrgRequest.objectSettings; // We do not allow you to specify the old and the new way of doing post create settings if (scratchOrgRequest.orgPreferences && settings.hasSettings()) { @@ -294,7 +299,13 @@ export const requestScratchOrgCreation = async ( throw new SfError(messages.getMessage('DeprecatedPrefFormat')); } - const scratchOrgInfo = mapKeys(scratchOrgRequest, upperFirst, true); + const scratchOrgInfo = mapKeys( + // If these were present, they were already used to initialize the scratchOrgSettingsGenerator. + // They shouldn't be submitted as part of the scratchOrgInfo. + omit(scratchOrgRequest, ['settings', 'objectSettings']), + upperFirst, + true + ); if (typeof scratchOrgInfo.Username === 'string') { scratchOrgInfo.Username = scratchOrgInfo.Username.toLowerCase(); diff --git a/src/org/scratchOrgInfoGenerator.ts b/src/org/scratchOrgInfoGenerator.ts index 0b03001fad..65e4b25dac 100644 --- a/src/org/scratchOrgInfoGenerator.ts +++ b/src/org/scratchOrgInfoGenerator.ts @@ -4,7 +4,7 @@ * 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 { promises as fs } from 'fs'; +import { promises as fs } from 'node:fs'; import { parseJson } from '@salesforce/kit'; import { ensureString } from '@salesforce/ts-types'; import { SfProjectJson } from '../sfProject'; @@ -32,15 +32,15 @@ type PartialScratchOrgInfo = Pick< | 'Username' >; -export interface ScratchOrgInfoPayload extends PartialScratchOrgInfo { +export type ScratchOrgInfoPayload = { orgName: string; package2AncestorIds: string; features: string | string[]; connectedAppConsumerKey: string; - namespace: string; + namespace?: string; connectedAppCallbackUrl: string; durationDays: number; -} +} & PartialScratchOrgInfo; const SNAPSHOT_UNSUPPORTED_OPTIONS = [ 'features', @@ -49,7 +49,6 @@ const SNAPSHOT_UNSUPPORTED_OPTIONS = [ 'sourceOrg', 'settingsPath', 'releaseVersion', - 'language', ]; // A validator function to ensure any options parameters entered by the user adhere @@ -216,26 +215,27 @@ export const generateScratchOrgInfo = async ({ } catch (e) { // project is not required } - scratchOrgInfoPayload.orgName = scratchOrgInfoPayload.orgName ?? 'Company'; - scratchOrgInfoPayload.package2AncestorIds = - !ignoreAncestorIds && sfProject?.hasPackages() - ? await getAncestorIds(scratchOrgInfoPayload, sfProject, hubOrg) - : ''; + const { namespace: originalNamespace, ...payload } = scratchOrgInfoPayload; - // Use the Hub org's client ID value, if one wasn't provided to us, or the default - if (!scratchOrgInfoPayload.connectedAppConsumerKey) { - scratchOrgInfoPayload.connectedAppConsumerKey = - hubOrg.getConnection().getAuthInfoFields().clientId ?? DEFAULT_CONNECTED_APP_INFO.clientId; - } - - if (!nonamespace && sfProject?.get('namespace')) { - scratchOrgInfoPayload.namespace = sfProject.get('namespace') as string; - } + const namespace = originalNamespace ?? sfProject?.get('namespace'); - // we already have the info, and want to get rid of configApi, so this doesn't use that - scratchOrgInfoPayload.connectedAppCallbackUrl = `http://localhost:${await WebOAuthServer.determineOauthPort()}/OauthRedirect`; - return scratchOrgInfoPayload; + return { + ...payload, + orgName: scratchOrgInfoPayload.orgName ?? 'Company', + // we already have the info, and want to get rid of configApi, so this doesn't use that + connectedAppCallbackUrl: `http://localhost:${await WebOAuthServer.determineOauthPort()}/OauthRedirect`, + ...(!nonamespace && namespace ? { namespace } : {}), + // Use the Hub org's client ID value, if one wasn't provided to us, or the default + connectedAppConsumerKey: + scratchOrgInfoPayload.connectedAppConsumerKey ?? + hubOrg.getConnection().getAuthInfoFields().clientId ?? + DEFAULT_CONNECTED_APP_INFO.clientId, + package2AncestorIds: + !ignoreAncestorIds && sfProject?.hasPackages() + ? await getAncestorIds(scratchOrgInfoPayload, sfProject, hubOrg) + : '', + }; }; /** diff --git a/src/org/scratchOrgLifecycleEvents.ts b/src/org/scratchOrgLifecycleEvents.ts index 32cbc6a29a..74f5ae969f 100644 --- a/src/org/scratchOrgLifecycleEvents.ts +++ b/src/org/scratchOrgLifecycleEvents.ts @@ -8,8 +8,6 @@ import { Lifecycle } from '../lifecycleEvents'; import { AuthFields } from './authInfo'; import { ScratchOrgInfo } from './scratchOrgTypes'; -const emitter = Lifecycle.getInstance(); - export const scratchOrgLifecycleEventName = 'scratchOrgLifecycleEvent'; export const scratchOrgLifecycleStages = [ 'prepare request', @@ -20,13 +18,13 @@ export const scratchOrgLifecycleStages = [ 'deploy settings', 'done', ] as const; -export interface ScratchOrgLifecycleEvent { - stage: typeof scratchOrgLifecycleStages[number]; +export type ScratchOrgLifecycleEvent = { + stage: (typeof scratchOrgLifecycleStages)[number]; scratchOrgInfo?: ScratchOrgInfo; -} +}; export const emit = async (event: ScratchOrgLifecycleEvent): Promise => - emitter.emit(scratchOrgLifecycleEventName, event); + Lifecycle.getInstance().emit(scratchOrgLifecycleEventName, event); const postOrgCreateHookFields = [ 'accessToken', @@ -41,13 +39,13 @@ const postOrgCreateHookFields = [ 'username', ] as const; -type PostOrgCreateHook = Pick; +type PostOrgCreateHook = Pick; -const isHookField = (key: string): key is typeof postOrgCreateHookFields[number] => - postOrgCreateHookFields.includes(key as typeof postOrgCreateHookFields[number]); +const isHookField = (key: string): key is (typeof postOrgCreateHookFields)[number] => + postOrgCreateHookFields.includes(key as (typeof postOrgCreateHookFields)[number]); export const emitPostOrgCreate = async (authFields: AuthFields): Promise => { - await emitter.emit( + await Lifecycle.getInstance().emit( 'postorgcreate', Object.fromEntries(Object.entries(authFields).filter(([key]) => isHookField(key))) as PostOrgCreateHook ); diff --git a/src/org/scratchOrgSettingsGenerator.ts b/src/org/scratchOrgSettingsGenerator.ts index 593ff02587..0aaeb3996f 100644 --- a/src/org/scratchOrgSettingsGenerator.ts +++ b/src/org/scratchOrgSettingsGenerator.ts @@ -5,20 +5,24 @@ * 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 path from 'node:path'; import { isEmpty, env, upperFirst, Duration } from '@salesforce/kit'; import { ensureObject, JsonMap } from '@salesforce/ts-types'; import * as js2xmlparser from 'js2xmlparser'; -import { Logger } from '../logger'; +import { Logger } from '../logger/logger'; import { SfError } from '../sfError'; import { StructuredWriter } from '../util/structuredWriter'; import { StatusResult } from '../status/types'; import { PollingClient } from '../status/pollingClient'; import { ZipWriter } from '../util/zipWriter'; import { DirectoryWriter } from '../util/directoryWriter'; +import { Lifecycle } from '../lifecycleEvents'; +import { Messages } from '../messages'; import { ScratchOrgInfo, ObjectSetting } from './scratchOrgTypes'; import { Org } from './org'; +Messages.importMessagesDirectory(__dirname); + export enum RequestStatus { Pending = 'Pending', InProgress = 'InProgress', @@ -28,21 +32,20 @@ export enum RequestStatus { Canceling = 'Canceling', Canceled = 'Canceled', } - const breakPolling = ['Succeeded', 'SucceededPartial', 'Failed', 'Canceled']; -export interface SettingType { +export type SettingType = { members: string[]; name: 'CustomObject' | 'RecordType' | 'BusinessProcess' | 'Settings'; -} +}; -export interface PackageFile { +export type PackageFile = { '@': { xmlns: string; }; types: SettingType[]; version: string; -} +}; export const createObjectFileContent = ({ allRecordTypes = [], @@ -82,13 +85,19 @@ export const createObjectFileContent = ({ return { ...output, ...{ version: apiVersion } }; }; -const calculateBusinessProcess = (objectName: string, defaultRecordType: string): Array => { +const calculateBusinessProcess = ( + objectName: string, + defaultRecordType: string, + capitalizeBusinessProcess: boolean +): Array => { let businessProcessName = null; let businessProcessPicklistVal = null; // These four objects require any record type to specify a "business process"-- // a restricted set of items from a standard picklist on the object. if (['Case', 'Lead', 'Opportunity', 'Solution'].includes(objectName)) { - businessProcessName = upperFirst(defaultRecordType) + 'Process'; + businessProcessName = capitalizeBusinessProcess + ? `${upperFirst(defaultRecordType)}Process` + : `${defaultRecordType}Process`; switch (objectName) { case 'Case': businessProcessPicklistVal = 'New'; @@ -110,7 +119,8 @@ export const createRecordTypeAndBusinessProcessFileContent = ( objectName: string, json: Record, allRecordTypes: string[], - allBusinessProcesses: string[] + allBusinessProcesses: string[], + capitalizeRecordTypes: boolean ): JsonMap => { let output = { '@': { @@ -126,15 +136,23 @@ export const createRecordTypeAndBusinessProcessFileContent = ( }; } - const defaultRecordType = json.defaultRecordType; + const defaultRecordType = capitalizeRecordTypes + ? upperFirst(json.defaultRecordType as string) + : json.defaultRecordType; + if (typeof defaultRecordType === 'string') { // We need to keep track of these globally for when we generate the package XML. - allRecordTypes.push(`${name}.${upperFirst(defaultRecordType)}`); - const [businessProcessName, businessProcessPicklistVal] = calculateBusinessProcess(name, defaultRecordType); + allRecordTypes.push(`${name}.${defaultRecordType}`); + const [businessProcessName, businessProcessPicklistVal] = calculateBusinessProcess( + name, + defaultRecordType, + capitalizeRecordTypes + ); + // Create the record type const recordTypes = { - fullName: upperFirst(defaultRecordType), - label: upperFirst(defaultRecordType), + fullName: defaultRecordType, + label: defaultRecordType, active: true, }; @@ -186,9 +204,22 @@ export default class SettingsGenerator { private allBusinessProcesses: string[] = []; private readonly shapeDirName: string; private readonly packageFilePath: string; - - public constructor(options?: { mdApiTmpDir?: string; shapeDirName?: string; asDirectory?: boolean }) { + private readonly capitalizeRecordTypes: boolean; + + public constructor(options?: { + mdApiTmpDir?: string; + shapeDirName?: string; + asDirectory?: boolean; + capitalizeRecordTypes?: boolean; + }) { this.logger = Logger.childFromRoot('SettingsGenerator'); + if (options?.capitalizeRecordTypes === undefined) { + const messages = Messages.loadMessages('@salesforce/core', 'scratchOrgSettingsGenerator'); + void Lifecycle.getInstance().emitWarning(messages.getMessage('noCapitalizeRecordTypeConfigVar')); + this.capitalizeRecordTypes = true; + } else { + this.capitalizeRecordTypes = options.capitalizeRecordTypes; + } // If SFDX_MDAPI_TEMP_DIR is set, copy settings to that dir for people to inspect. const mdApiTmpDir = options?.mdApiTmpDir ?? env.getString('SFDX_MDAPI_TEMP_DIR'); this.shapeDirName = options?.shapeDirName ?? `shape_${Date.now()}`; @@ -286,12 +317,17 @@ export default class SettingsGenerator { const client = await PollingClient.create(pollingOptions); const status = await client.subscribe(); - if (status !== RequestStatus.Succeeded) { + type FailureMessage = { + problemType: string; + fullName: string; + problem: string; + }; + if (status !== RequestStatus.Succeeded.toString()) { const componentFailures = ensureObject<{ - componentFailures: Record | Array>; + componentFailures: FailureMessage | FailureMessage[]; }>(result.details).componentFailures; const failures = (Array.isArray(componentFailures) ? componentFailures : [componentFailures]) - .map((failure) => failure.problem) + .map((failure) => `[${failure.problemType}] ${failure.fullName} : ${failure.problem} `) .join('\n'); const error = new SfError( `A scratch org was created with username ${username}, but the settings failed to deploy due to: \n${failures}`, @@ -339,7 +375,8 @@ export default class SettingsGenerator { item, value, allRecordTypes, - allbusinessProcesses + allbusinessProcesses, + this.capitalizeRecordTypes ); const xml = js2xmlparser.parse('CustomObject', fileContent); return this.writer.addToStore(xml, path.join(objectsDir, upperFirst(item) + '.object')); diff --git a/src/org/scratchOrgTypes.ts b/src/org/scratchOrgTypes.ts index 36a8fcc9f3..8b86dc1587 100644 --- a/src/org/scratchOrgTypes.ts +++ b/src/org/scratchOrgTypes.ts @@ -7,7 +7,7 @@ import { JsonMap } from '@salesforce/ts-types'; -export interface ScratchOrgInfo { +export type ScratchOrgInfo = { AdminEmail?: string; readonly CreatedDate?: string; ConnectedAppCallbackUrl?: string; @@ -42,9 +42,9 @@ export interface ScratchOrgInfo { enabled: string[]; disabled: string[]; }; -} +}; -export interface ObjectSetting extends JsonMap { +export type ObjectSetting = { sharingModel?: string; defaultRecordType?: string; -} +} & JsonMap; diff --git a/src/org/user.ts b/src/org/user.ts index d3d0ea8e11..6f8e7cb87f 100644 --- a/src/org/user.ts +++ b/src/org/user.ts @@ -5,12 +5,12 @@ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause */ -import { EOL } from 'os'; +import { EOL } from 'node:os'; import { AsyncCreatable, lowerFirst, mapKeys, omit, parseJsonMap, upperFirst } from '@salesforce/kit'; -import { asJsonArray, asNumber, ensureJsonMap, ensureString, isJsonMap, Many } from '@salesforce/ts-types'; -import type { HttpRequest, HttpResponse, QueryResult, Schema, SObjectUpdateRecord } from 'jsforce'; -import { HttpApi } from 'jsforce/lib/http-api'; -import { Logger } from '../logger'; +import { asJsonArray, asNumber, ensureJsonMap, ensureString, isJsonMap, isString, Many } from '@salesforce/ts-types'; +import type { HttpRequest, HttpResponse, QueryResult, Schema, SObjectUpdateRecord } from '@jsforce/jsforce-node'; +import { HttpApi } from '@jsforce/jsforce-node/lib/http-api'; +import { Logger } from '../logger/logger'; import { Messages } from '../messages'; import { SecureBuffer } from '../crypto/secureBuffer'; import { SfError } from '../sfError'; @@ -22,13 +22,13 @@ import { AuthFields, AuthInfo } from './authInfo'; const rand = (len: Many): number => Math.floor(Math.random() * len.length); -interface Complexity { +type Complexity = { [key: string]: boolean | undefined; LOWER?: boolean; UPPER?: boolean; NUMBERS?: boolean; SYMBOLS?: boolean; -} +}; const CHARACTERS: { [index: string]: string | string[] } = { LOWER: 'abcdefghijklmnopqrstuvwxyz', @@ -85,18 +85,10 @@ async function retrieveUserFields(logger: Logger, username: string): Promise = await connection.query(requiredFieldsFromAdminQuery); logger.debug('Successfully retrieved the admin user for this org.'); @@ -119,7 +111,7 @@ async function retrieveUserFields(logger: Logger, username: string): Promise { }); // Update the auth info object with created user id. - const newUserAuthFields: AuthFields = newUserAuthInfo.getFields(); - newUserAuthFields.userId = refreshTokenSecret.userId; + newUserAuthInfo.update({ userId: refreshTokenSecret.userId }); // Make sure we can connect and if so save the auth info. await this.describeUserAndSave(newUserAuthInfo); @@ -500,8 +491,8 @@ export class User extends AsyncCreatable { throw new SfError(message, 'UserCreateHttpError'); } - fields.id = ensureString(responseBody.id); - await this.updateRequiredUserFields(fields); + const fieldsWithId = { ...fields, id: ensureString(responseBody.id) }; + await this.updateRequiredUserFields(fieldsWithId); const buffer = new SecureBuffer(); const headers = ensureJsonMap(response.headers); @@ -509,7 +500,7 @@ export class User extends AsyncCreatable { buffer.consume(Buffer.from(autoApproveUser)); return { buffer, - userId: fields.id, + userId: fieldsWithId.id, }; } @@ -548,7 +539,21 @@ export namespace User { * Used to initialize default values for fields based on a templateUser user. This user will be part of the * Standard User profile. */ - export interface Options { + export type Options = { org: Org; - } + }; } + +const resolveUsernameFromAccessToken = + (logger: Logger) => + (conn: Connection) => + async (usernameOrAccessToken: string): Promise => { + if (matchesAccessToken(usernameOrAccessToken)) { + logger.debug('received an accessToken for the username. Converting...'); + const username = (await conn.identity()).username; + logger.debug(`accessToken converted to ${username}`); + return username; + } + logger.debug('not a accessToken'); + return usernameOrAccessToken; + }; diff --git a/src/schema/printer.ts b/src/schema/printer.ts deleted file mode 100644 index 52a5445a4f..0000000000 --- a/src/schema/printer.ts +++ /dev/null @@ -1,307 +0,0 @@ -/* - * 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 class-methods-use-this */ - -import { - asJsonArray, - asJsonMap, - asNumber, - asString, - isJsonMap, - JsonArray, - JsonMap, - Optional, -} from '@salesforce/ts-types'; -import { Logger } from '../logger'; -import { SfError } from '../sfError'; - -/** - * Renders schema properties. By default, this is simply an identity transform. Subclasses may provide more - * interesting decorations of each values, such as ANSI coloring. - * - * @deprecated - */ -export class SchemaPropertyRenderer { - /** - * Renders a name. - * - * @param name The name value to render. - */ - public renderName(name: string): string { - return name; - } - - /** - * Renders a title. - * - * @param title The title value to render. - */ - public renderTitle(title: string): string { - return title; - } - - /** - * Renders a description. - * - * @param description The description value to render. - */ - public renderDescription(description: string): string { - return description; - } - - /** - * Renders a type. - * - * @param propertyType The type value to render. - */ - public renderType(propertyType: string): string { - return propertyType; - } -} - -/** - * Prints a JSON schema in a human-friendly format. - * - * @deprecated - * - * ``` - * import chalk from 'chalk'; - * class MyPropertyRenderer extends SchemaPropertyRenderer { - * renderName(name) { return chalk.bold.blue(name); } - * } - * - * const printer = new SchemaPrinter(logger, schema, new MyPropertyRenderer()); - * printer.getLines().forEach(console.log); - * ``` - */ -export class SchemaPrinter { - private logger: Logger; - private lines: string[] = []; - - /** - * Constructs a new `SchemaPrinter`. - * - * @param logger The logger to use when emitting the printed schema. - * @param schema The schema to print. - * @param propertyRenderer The property renderer. - */ - public constructor( - logger: Logger, - private schema: JsonMap, - private propertyRenderer: SchemaPropertyRenderer = new SchemaPropertyRenderer() - ) { - this.logger = logger.child('SchemaPrinter'); - - if (!this.schema.properties && !this.schema.items) { - // No need to add to messages, since this should never happen. In fact, - // this will cause a test failure if there is a command that uses a schema - // with no properties defined. - throw new SfError('There is no purpose to print a schema with no properties or items'); - } - - const startLevel = 0; - const add = this.addFn(startLevel); - - // For object schemas, print out the "header" and first level properties differently - if (this.schema.properties) { - if (typeof this.schema.description === 'string') { - // Output the overall schema description before printing the properties - add(this.schema.description); - add(''); - } - - Object.keys(this.schema.properties).forEach((key) => { - const properties = asJsonMap(this.schema.properties); - if (!properties) { - return; - } - this.parseProperty(key, asJsonMap(properties[key]), startLevel); - add(''); - }); - } else { - this.parseProperty('schema', this.schema, startLevel); - } - } - - /** - * Gets a read-only array of ready-to-display lines. - */ - public getLines(): readonly string[] { - return this.lines; - } - - /** - * Gets a ready-to-display line by index. - * - * @param index The line index to get. - */ - public getLine(index: number): string { - return this.lines[index]; - } - - /** - * Prints the accumulated set of schema lines as info log lines to the logger. - */ - public print(): void { - this.lines.forEach((line) => this.logger.info(line)); - } - - private addFn(level: number): (line: string) => void { - const indent = ' '.repeat(level * 4); - return (line: string) => { - this.lines.push(`${indent}${line}`); - }; - } - - private parseProperty(name: string, rawProperty?: JsonMap, level = 0): void { - if (!rawProperty) { - return; - } - - const add = this.addFn(level); - const property = new SchemaProperty(this.logger, this.schema, name, rawProperty, this.propertyRenderer); - - add(property.renderHeader()); - - if (property.type === 'object' && property.properties) { - Object.keys(property.properties).forEach((key) => { - this.parseProperty(key, property.getProperty(key), level + 1); - }); - } - if (property.type === 'array') { - add(` ${property.renderArrayHeader()}`); - if (property.items && property.items.type === 'object' && property.items.properties) { - Object.keys(property.items.properties).forEach((key) => { - const items = asJsonMap(property.items); - if (!items) { - return; - } - const properties = asJsonMap(items.properties); - if (!properties) { - return; - } - this.parseProperty(key, asJsonMap(properties[key]), level + 2); - }); - } - } - if (property.required) { - add(`Required: ${property.required.join(', ')}`); - } - } -} - -class SchemaProperty { - public constructor( - private readonly logger: Logger, - private readonly schema: JsonMap, - private readonly name: string, - private rawProperty: JsonMap, - private propertyRenderer: SchemaPropertyRenderer - ) { - this.name = name; - - // Capture the referenced definition, if specified - if (typeof this.rawProperty.$ref === 'string') { - // Copy the referenced property while adding the original property's properties on top of that -- - // if they are defined here, they take precedence over referenced definition properties. - this.rawProperty = Object.assign({}, resolveRef(this.schema, this.rawProperty), rawProperty); - } - - const oneOfs = asJsonArray(this.rawProperty.oneOf); - if (oneOfs && !this.rawProperty.type) { - this.rawProperty.type = oneOfs.map((value) => (isJsonMap(value) ? value.type ?? value.$ref : value)).join('|'); - } - - // Handle items references - if (isJsonMap(this.items) && this.items && this.items.$ref) { - Object.assign(this.items, resolveRef(this.schema, this.items)); - } - } - - public get title(): Optional { - return asString(this.rawProperty.title); - } - - public get description(): Optional { - return asString(this.rawProperty.description); - } - - public get type(): Optional { - return asString(this.rawProperty.type); - } - - public get required(): Optional { - return asJsonArray(this.rawProperty.required); - } - - public get properties(): Optional { - return asJsonMap(this.rawProperty.properties); - } - - public get items(): Optional { - return asJsonMap(this.rawProperty.items); - } - - public get minItems(): Optional { - return asNumber(this.rawProperty.minItems); - } - - public getProperty(key: string): Optional { - const properties = this.getProperties(); - return asJsonMap(properties?.[key]); - } - - public getProperties(): Optional { - return asJsonMap(this.rawProperty.properties); - } - - public renderName(): string { - return this.propertyRenderer.renderName(this.name); - } - - public renderTitle(): string { - return this.propertyRenderer.renderTitle(this.title ?? ''); - } - - public renderDescription(): string { - return this.propertyRenderer.renderDescription(this.description ?? ''); - } - - public renderType(): string { - return this.propertyRenderer.renderType(this.type ?? ''); - } - - public renderHeader(): string { - return `${this.renderName()}(${this.renderType()}) - ${this.renderTitle()}: ${this.renderDescription()}`; - } - - public renderArrayHeader(): string { - if (!this.items) { - return ''; - } - const minItems = this.minItems ? ` - min ${this.minItems}` : ''; - const prop = new SchemaProperty(this.logger, this.schema, 'items', this.items, this.propertyRenderer); - return `items(${prop.renderType()}${minItems}) - ${prop.renderTitle()}: ${prop.renderDescription()}`; - } -} - -/** - * Get the referenced definition by following the reference path on the current schema. - * - * @param schema The source schema containing the property containing a `$ref` field. - * @param property The property that contains the `$ref` field. - */ -function resolveRef(schema: JsonMap, property: JsonMap): JsonMap | null { - const ref = property.$ref; - if (!ref || typeof ref !== 'string') { - return null; - } - return ref.split('/').reduce((prev, key) => { - const next = prev[key]; - return key === '#' ? schema : isJsonMap(next) ? next : {}; - }, property); -} diff --git a/src/schema/validator.ts b/src/schema/validator.ts index 114332d2a5..b249006c2c 100644 --- a/src/schema/validator.ts +++ b/src/schema/validator.ts @@ -5,12 +5,12 @@ * 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 fs from 'fs'; +import * as path from 'node:path'; +import * as fs from 'node:fs'; import Ajv, { DefinedError } from 'ajv'; import { AnyJson, JsonMap } from '@salesforce/ts-types'; import { getJsonValuesByName, parseJsonMap } from '@salesforce/kit'; -import { Logger } from '../logger'; +import { Logger } from '../logger/logger'; import { SfError } from '../sfError'; /** @@ -110,7 +110,7 @@ export class SchemaValidator { // AJV will modify the original json object. We need to make a clone of the // json to keep this backwards compatible with JSEN functionality - const jsonClone: T = JSON.parse(JSON.stringify(json)) as T; + const jsonClone = structuredClone(json); const valid = validate(jsonClone); diff --git a/src/sfError.ts b/src/sfError.ts index f870dbaad2..f8fd430dbe 100644 --- a/src/sfError.ts +++ b/src/sfError.ts @@ -5,8 +5,29 @@ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause */ -import { NamedError } from '@salesforce/kit'; -import { hasString, isString, JsonMap } from '@salesforce/ts-types'; +import { AnyJson, hasString, isString } from '@salesforce/ts-types'; + +export type SfErrorOptions = { + message: string; + exitCode?: number; + name?: string; + data?: T; + /** pass an Error. For convenience in catch blocks, code will check that it is, in fact, an Error */ + cause?: unknown; + context?: string; + actions?: string[]; +}; + +type ErrorDataProperties = AnyJson; + +type SfErrorToObjectResult = { + name: string; + message: string; + exitCode: number; + actions?: string[]; + context?: string; + data?: ErrorDataProperties; +}; /** * A generalized sfdx error which also contains an action. The action is used in the @@ -24,7 +45,8 @@ import { hasString, isString, JsonMap } from '@salesforce/ts-types'; * throw new SfError(message.getMessage('myError'), 'MyErrorName'); * ``` */ -export class SfError extends NamedError { +export class SfError extends Error { + public readonly name: string; /** * Action messages. Hints to the users regarding what can be done to fix related issues. */ @@ -41,7 +63,7 @@ export class SfError extends NamedError { public context?: string; // Additional data helpful for consumers of this error. E.g., API call result - public data?: unknown; + public data?: T; /** * Some errors support `error.code` instead of `error.name`. This keeps backwards compatability. @@ -59,14 +81,20 @@ export class SfError extends NamedError { */ public constructor( message: string, - name?: string, + name = 'SfError', actions?: string[], exitCodeOrCause?: number | Error, - cause?: Error + cause?: unknown ) { - cause = exitCodeOrCause instanceof Error ? exitCodeOrCause : cause; - super(name ?? 'SfError', message || name, cause); - this.actions = actions; + if (typeof cause !== 'undefined' && !(cause instanceof Error)) { + throw new TypeError(`The cause, if provided, must be an instance of Error. Received: ${typeof cause}`); + } + super(message); + this.name = name; + this.cause = exitCodeOrCause instanceof Error ? exitCodeOrCause : cause; + if (actions?.length) { + this.actions = actions; + } if (typeof exitCodeOrCause === 'number') { this.exitCode = exitCodeOrCause; } else { @@ -74,8 +102,7 @@ export class SfError extends NamedError { } } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - public get code(): string | undefined | any { + public get code(): string { return this.#code ?? this.name; } @@ -83,26 +110,49 @@ export class SfError extends NamedError { this.#code = code; } + /** like the constructor, but takes an typed object and let you also set context and data properties */ + public static create(inputs: SfErrorOptions): SfError { + const error = new SfError(inputs.message, inputs.name, inputs.actions, inputs.exitCode, inputs.cause); + if (inputs.data) { + error.data = inputs.data; + } + if (inputs.context) { + error.context = inputs.context; + } + return error; + } /** * Convert an Error to an SfError. * * @param err The error to convert. */ - public static wrap(err: Error | string): SfError { + public static wrap(err: unknown): SfError { if (isString(err)) { - return new SfError(err); + return new SfError(err); } if (err instanceof SfError) { - return err; + return err as SfError; } - const sfError = new SfError(err.message, err.name, undefined, err); + const sfError = + err instanceof Error + ? // a basic error with message and name. We make it the cause to preserve any other properties + SfError.create({ + message: err.message, + name: err.name, + cause: err, + }) + : // ok, something was throws that wasn't error or string. Convert it to an Error that preserves the information as the cause and wrap that. + SfError.wrap( + new Error(`SfError.wrap received type ${typeof err} but expects type Error or string`, { cause: err }) + ); // If the original error has a code, use that instead of name. if (hasString(err, 'code')) { sfError.code = err.code; } + return sfError; } @@ -121,7 +171,7 @@ export class SfError extends NamedError { * * @param data The payload data. */ - public setData(data: unknown): SfError { + public setData(data: T): SfError { this.data = data; return this; } @@ -129,28 +179,14 @@ export class SfError extends NamedError { /** * Convert an {@link SfError} state to an object. Returns a plain object representing the state of this error. */ - public toObject(): JsonMap { - const obj: JsonMap = { + public toObject(): SfErrorToObjectResult { + return { name: this.name, - message: this.message || this.name, + message: this.message ?? this.name, exitCode: this.exitCode, - actions: this.actions, + ...(this.actions?.length ? { actions: this.actions } : {}), + ...(this.context ? { context: this.context } : {}), + ...(this.data ? { data: this.data } : {}), }; - - if (this.context) { - obj.context = this.context; - } - - if (this.data) { - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment - obj.data = this.data as any; - } - - return obj; } } - -/** - * @deprecated use SfError instead - */ -export class SfdxError extends SfError {} diff --git a/src/sfProject.ts b/src/sfProject.ts index eef96e9213..ea02a09740 100644 --- a/src/sfProject.ts +++ b/src/sfProject.ts @@ -4,21 +4,21 @@ * 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 { basename, dirname, isAbsolute, normalize, resolve, sep } from 'path'; -import * as fs from 'fs'; +import { basename, dirname, isAbsolute, normalize, resolve, sep } from 'node:path'; +import * as fs from 'node:fs'; import { defaults, env } from '@salesforce/kit'; import { Dictionary, ensure, JsonMap, Nullable, Optional } from '@salesforce/ts-types'; import { SfdcUrl } from './util/sfdcUrl'; import { ConfigAggregator } from './config/configAggregator'; import { ConfigFile } from './config/configFile'; -import { ConfigContents } from './config/configStore'; +import { ConfigContents } from './config/configStackTypes'; import { SchemaValidator } from './schema/validator'; import { resolveProjectPath, resolveProjectPathSync, SFDX_PROJECT_JSON } from './util/internal'; import { SfError } from './sfError'; -import { findUpperCaseKeys } from './util/sfdc'; import { Messages } from './messages'; +import { findUpperCaseKeys } from './util/findUppercaseKeys'; Messages.importMessagesDirectory(__dirname); const messages = Messages.loadMessages('@salesforce/core', 'config'); @@ -39,14 +39,21 @@ export type PackageDir = { dependencies?: PackageDirDependency[]; includeProfileUserLicenses?: boolean; package?: string; + packageMetadataAccess?: { + permissionSets: string | string[]; + permissionSetLicenses: string | string[]; + }; path: string; postInstallScript?: string; postInstallUrl?: string; releaseNotesUrl?: string; + scopeProfiles?: boolean; uninstallScript?: string; versionDescription?: string; versionName?: string; versionNumber?: string; + unpackagedMetadata?: { path: string }; + seedMetadata?: { path: string }; }; export type NamedPackageDir = PackageDir & { @@ -88,7 +95,7 @@ export type ProjectJson = ConfigContents & { * * **See** [force:project:create](https://developer.salesforce.com/docs/atlas.en-us.sfdx_dev.meta/sfdx_dev/sfdx_dev_ws_create_new.htm) */ -export class SfProjectJson extends ConfigFile { +export class SfProjectJson extends ConfigFile { public static BLOCKLIST = ['packageAliases']; public static getFileName(): string { @@ -101,46 +108,31 @@ export class SfProjectJson extends ConfigFile { return options; } - public async read(): Promise { + public async read(): Promise { const contents = await super.read(); this.validateKeys(); return contents; } - public readSync(): ConfigContents { + public readSync(): ProjectJson { const contents = super.readSync(); this.validateKeys(); return contents; } - public async write(newContents?: ConfigContents): Promise { - if (newContents) { - this.setContents(newContents); - } + public async write(): Promise { this.validateKeys(); return super.write(); } - public writeSync(newContents?: ConfigContents): ConfigContents { - if (newContents) { - this.setContents(newContents); - } + public writeSync(): ProjectJson { this.validateKeys(); return super.writeSync(); } - public getContents(): ProjectJson { - return super.getContents() as ProjectJson; - } - // eslint-disable-next-line class-methods-use-this public getDefaultOptions(options?: ConfigFile.Options): ConfigFile.Options { - const defaultOptions: ConfigFile.Options = { - isState: false, - }; - - Object.assign(defaultOptions, options ?? {}); - return defaultOptions; + return { ...{ isState: false }, ...(options ?? {}) }; } /** @@ -334,13 +326,8 @@ export class SfProjectJson extends ConfigFile { if (!/^.{15,18}$/.test(id)) { throw messages.createError('invalidId', [id]); } - - const contents = this.getContents(); - if (!contents.packageAliases) { - contents.packageAliases = {}; - } - contents.packageAliases[alias] = id; - this.setContents(contents); + const newAliases = { ...(this.getContents().packageAliases ?? {}), [alias]: id }; + this.contents.set('packageAliases', newAliases); } /** @@ -369,12 +356,15 @@ export class SfProjectJson extends ConfigFile { dirIndex > -1 ? this.getContents().packageDirectories[dirIndex] : packageDir, packageDir ); - // update package dir entries - if (dirIndex > -1) { - this.getContents().packageDirectories[dirIndex] = packageDirEntry; - } else { - this.getContents().packageDirectories.push(packageDirEntry); - } + + const modifiedPackagesDirs = + dirIndex > -1 + ? // replace the matching entry with the new entry + this.getContents().packageDirectories.map((pd, i) => (i === dirIndex ? packageDir : pd)) + : // add the new entry to the end of the list + [...(this.getContents()?.packageDirectories ?? []), packageDirEntry]; + + this.set('packageDirectories', modifiedPackagesDirs); } // eslint-disable-next-line class-methods-use-this @@ -430,12 +420,8 @@ export class SfProject { * **Throws** *{@link SfError}{ name: 'InvalidProjectWorkspaceError' }* If the current folder is not located in a workspace. */ public static async resolve(path?: string): Promise { - path = await this.resolveProjectPath(path ?? process.cwd()); - if (!SfProject.instances.has(path)) { - const project = new SfProject(path); - SfProject.instances.set(path, project); - } - return ensure(SfProject.instances.get(path)); + const resolvedPath = await this.resolveProjectPath(path ?? process.cwd()); + return this.getMemoizedInstance(resolvedPath); } /** @@ -447,13 +433,8 @@ export class SfProject { */ public static getInstance(path?: string): SfProject { // Store instance based on the path of the actual project. - path = this.resolveProjectPathSync(path ?? process.cwd()); - - if (!SfProject.instances.has(path)) { - const project = new SfProject(path); - SfProject.instances.set(path, project); - } - return ensure(SfProject.instances.get(path)); + const resolvedPath = this.resolveProjectPathSync(path ?? process.cwd()); + return this.getMemoizedInstance(resolvedPath); } /** @@ -486,6 +467,16 @@ export class SfProject { return resolveProjectPathSync(dir); } + /** shared method for resolve and getInstance. + * Cannot be a module-level function because instances is private */ + private static getMemoizedInstance(path: string): SfProject { + if (!SfProject.instances.has(path)) { + const project = new SfProject(path); + SfProject.instances.set(path, project); + } + return ensure(SfProject.instances.get(path)); + } + /** * Returns the project path. */ @@ -771,13 +762,3 @@ export class SfProject { .map(([key]) => key); } } - -/** - * @deprecated use SfProject instead - */ -export class SfdxProject extends SfProject {} - -/** - * @deprecated use SfProjectJson instead - */ -export class SfdxProjectJson extends SfProjectJson {} diff --git a/src/stateAggregator/accessors/aliasAccessor.ts b/src/stateAggregator/accessors/aliasAccessor.ts index dacff1e2c9..b2a667fc1f 100644 --- a/src/stateAggregator/accessors/aliasAccessor.ts +++ b/src/stateAggregator/accessors/aliasAccessor.ts @@ -5,17 +5,29 @@ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause */ -import { AsyncOptionalCreatable } from '@salesforce/kit'; +import { join, dirname } from 'node:path'; +import { homedir } from 'node:os'; +import { readFile, writeFile, mkdir } from 'node:fs/promises'; +import { lock, unlock } from 'proper-lockfile'; + +import { AsyncOptionalCreatable, ensureArray } from '@salesforce/kit'; + import { Nullable } from '@salesforce/ts-types'; -import { AliasesConfig } from '../../config/aliasesConfig'; -import { AuthFields, ConfigContents } from '../../exported'; +import { Global } from '../../global'; +import { AuthFields } from '../../org/authInfo'; +import { ConfigContents } from '../../config/configStackTypes'; import { SfError } from '../../sfError'; -import { SfToken } from './tokenAccessor'; +import { lockRetryOptions } from '../../util/lockRetryOptions'; -export type Aliasable = string | (Partial & Partial); +export type Aliasable = string | Partial; +export const DEFAULT_GROUP = 'orgs'; +export const FILENAME = 'alias.json'; export class AliasAccessor extends AsyncOptionalCreatable { - private config!: AliasesConfig; + // set in init method + private fileLocation!: string; + /** orgs is the default group */ + private aliasStore!: Map; /** * Returns all the aliases for all the values @@ -30,14 +42,14 @@ export class AliasAccessor extends AsyncOptionalCreatable { public getAll(entity?: Aliasable): string[] | ConfigContents { // This will only return aliases under "orgs". This will need to be modified // if/when we want to support more aliases groups. - const all = (this.config.getGroup() ?? {}) as ConfigContents; + if (entity) { - const value = this.getNameOf(entity); - return Object.entries(all) - .filter((entry) => entry[1] === value) - .map((entry) => entry[0]); + const nameFromEntity = getNameOf(entity); + return Array.from(this.aliasStore.entries()) + .filter(([, value]) => nameFromEntity === value) + .map(([alias]) => alias); } else { - return all; + return Object.fromEntries(this.aliasStore.entries()); } } @@ -47,7 +59,7 @@ export class AliasAccessor extends AsyncOptionalCreatable { * @param entity the aliasable entity that you want to get the alias of */ public get(entity: Aliasable): Nullable { - return this.getAll(entity).find((alias) => alias) ?? null; + return this.getAll(entity)[0] ?? null; } /** @@ -56,7 +68,7 @@ export class AliasAccessor extends AsyncOptionalCreatable { * @param alias the alias that corresponds to a value */ public getValue(alias: string): Nullable { - return this.getAll()[alias] ?? null; + return this.aliasStore.get(alias) ?? null; } /** @@ -65,21 +77,7 @@ export class AliasAccessor extends AsyncOptionalCreatable { * @param alias the alias that corresponds to a username */ public getUsername(alias: string): Nullable { - return this.getAll()[alias] ?? null; - } - - /** - * If the provided string is an alias, it returns the corresponding value. - * If the provided string is not an alias, we assume that the provided string - * is the value and return it. - * - * This method is helpful when you don't know if the string you have is a value - * or an alias. - * - * @param valueOrAlias a string that might be a value or might be an alias - */ - public resolveValue(valueOrAlias: string): string { - return this.getValue(valueOrAlias) ?? valueOrAlias; + return this.aliasStore.get(alias) ?? null; } /** @@ -105,41 +103,45 @@ export class AliasAccessor extends AsyncOptionalCreatable { * * @param usernameOrAlias a string that might be a username or might be an alias */ - public resolveAlias(usernameOrAlias: string): Nullable { - if (this.has(usernameOrAlias)) return usernameOrAlias; - return Object.entries(this.getAll()).find(([, username]) => username === usernameOrAlias)?.[0]; + public resolveAlias(usernameOrAlias: string): string | undefined { + if (this.aliasStore.has(usernameOrAlias)) return usernameOrAlias; + return Array.from(this.aliasStore.entries()).find(([, value]) => value === usernameOrAlias)?.[0]; } /** - * Set an alias for the given aliasable entity + * Set an alias for the given aliasable entity. Writes to the file * * @param alias the alias you want to set * @param entity the aliasable entity that's being aliased */ - public set(alias: string, entity: Aliasable): void { - this.config.set(alias, this.getNameOf(entity)); + public async setAndSave(alias: string, entity: Aliasable): Promise { + // get a very fresh copy to merge with to avoid conflicts, then lock + await this.readFileToAliasStore(true); + this.aliasStore.set(alias, getNameOf(entity)); + return this.saveAliasStoreToFile(); } /** - * Unset the given alias. + * Unset the given alias(es). Writes to the file * */ - public unset(alias: string): void { - this.config.unset(alias); + public async unsetAndSave(alias: string): Promise { + await this.readFileToAliasStore(true); + this.aliasStore.delete(alias); + return this.saveAliasStoreToFile(); } /** - * Unsets all the aliases for the given entity. + * Unset all the aliases for the given array of entity. * * @param entity the aliasable entity for which you want to unset all aliases */ - public unsetAll(entity: Aliasable): void { - const aliases = this.getAll(entity); - aliases.forEach((alias) => this.unset(alias)); - } - - public async write(): Promise { - return this.config.write(); + public async unsetValuesAndSave(aliasees: Aliasable[]): Promise { + await this.readFileToAliasStore(true); + ensureArray(aliasees) + .flatMap((a) => this.getAll(a)) + .map((a) => this.aliasStore.delete(a)); + return this.saveAliasStoreToFile(); } /** @@ -148,23 +150,78 @@ export class AliasAccessor extends AsyncOptionalCreatable { * @param alias the alias you want to check */ public has(alias: string): boolean { - return this.config.has(alias); + return this.aliasStore.has(alias); } protected async init(): Promise { - this.config = await AliasesConfig.create(AliasesConfig.getDefaultOptions()); + this.fileLocation = getFileLocation(); + await this.readFileToAliasStore(); } /** - * Returns the username of given aliasable entity + * go to the fileSystem and read the file, storing a copy in the class's store + * if the file doesn't exist, create it empty */ - // eslint-disable-next-line class-methods-use-this - private getNameOf(entity: Aliasable): string { - if (typeof entity === 'string') return entity; - const aliaseeName = entity.username ?? entity.user; - if (!aliaseeName) { - throw new SfError(`Invalid aliasee, it must contain a user or username property: ${JSON.stringify(entity)}`); + private async readFileToAliasStore(useLock = false): Promise { + if (useLock) { + await lock(this.fileLocation, lockRetryOptions); + } + try { + this.aliasStore = fileContentsRawToAliasStore(await readFile(this.fileLocation, 'utf-8')); + } catch (e) { + if (e instanceof Error && 'code' in e && e.code === 'ENOENT') { + this.aliasStore = new Map(); + await mkdir(dirname(this.fileLocation), { recursive: true }); + await this.saveAliasStoreToFile(); + return; + } + if (useLock) return unlockIfLocked(this.fileLocation); + throw e; } - return aliaseeName; + } + + private async saveAliasStoreToFile(): Promise { + await writeFile(this.fileLocation, aliasStoreToRawFileContents(this.aliasStore)); + return unlockIfLocked(this.fileLocation); } } + +/** + * Returns the username of given aliasable entity + */ +const getNameOf = (entity: Aliasable): string => { + if (typeof entity === 'string') return entity; + const aliaseeName = entity.username; + if (!aliaseeName) { + throw new SfError(`Invalid aliasee, it must contain a user or username property: ${JSON.stringify(entity)}`); + } + return aliaseeName; +}; + +const fileContentsRawToAliasStore = (contents: string): Map => { + const fileContents = JSON.parse(contents) as { + [group: string]: { [alias: string]: string }; + [DEFAULT_GROUP]: { [alias: string]: string }; + }; + + // handle when alias file exists but is missing the org property + return new Map(Object.entries(fileContents[DEFAULT_GROUP] ?? {})); +}; + +const aliasStoreToRawFileContents = (aliasStore: Map): string => + JSON.stringify({ [DEFAULT_GROUP]: Object.fromEntries(Array.from(aliasStore.entries())) }); + +// exported for testSetup mocking +export const getFileLocation = (): string => join(homedir(), Global.SFDX_STATE_FOLDER, FILENAME); + +const unlockIfLocked = async (fileLocation: string): Promise => { + try { + await unlock(fileLocation); + } catch (e) { + // ignore the error. If it wasn't locked, that's what we wanted + if (errorIsNotAcquired(e)) return; + throw e; + } +}; + +const errorIsNotAcquired = (e: unknown): boolean => e instanceof Error && 'code' in e && e.code === 'ENOTACQUIRED'; diff --git a/src/stateAggregator/accessors/orgAccessor.ts b/src/stateAggregator/accessors/orgAccessor.ts index c1ae2d3cd7..d5293a809a 100644 --- a/src/stateAggregator/accessors/orgAccessor.ts +++ b/src/stateAggregator/accessors/orgAccessor.ts @@ -5,17 +5,18 @@ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause */ -import * as fs from 'fs'; -import * as path from 'path'; -import { Nullable } from '@salesforce/ts-types'; +import * as fs from 'node:fs'; +import * as path from 'node:path'; +import { Nullable, entriesOf } from '@salesforce/ts-types'; import { AsyncOptionalCreatable, isEmpty } from '@salesforce/kit'; import { AuthInfoConfig } from '../../config/authInfoConfig'; import { Global } from '../../global'; -import { AuthFields } from '../../org'; +import { AuthFields } from '../../org/authInfo'; import { ConfigFile } from '../../config/configFile'; -import { ConfigContents } from '../../config/configStore'; -import { Logger } from '../../logger'; +import { ConfigContents } from '../../config/configStackTypes'; +import { Logger } from '../../logger/logger'; import { Messages } from '../../messages'; +import { Lifecycle } from '../../lifecycleEvents'; function chunk(array: T[], chunkSize: number): T[][] { const final = []; @@ -25,6 +26,7 @@ function chunk(array: T[], chunkSize: number): T[][] { export abstract class BaseOrgAccessor extends AsyncOptionalCreatable { private configs: Map> = new Map(); + /** map of Org files by username */ private contents: Map = new Map(); private logger!: Logger; @@ -41,6 +43,9 @@ export abstract class BaseOrgAccessor { const username = this.parseUsername(f); - const config = await this.initAuthFile(username); - this.configs.set(username, config); + try { + const config = await this.initAuthFile(username); + this.configs.set(username, config); + } catch (e) { + await Lifecycle.getInstance().emitWarning(`The auth file for ${username} is invalid.`); + } }); // eslint-disable-next-line no-await-in-loop await Promise.all(promises); @@ -159,15 +168,12 @@ export abstract class BaseOrgAccessor config.set(key, value)); + if (!config.has('username')) { + config.set('username', username); + } } else { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - org.username ??= username; - this.contents.set(username, org); + this.contents.set(username, { ...org, username: org.username ?? username }); } } diff --git a/src/stateAggregator/accessors/sandboxAccessor.ts b/src/stateAggregator/accessors/sandboxAccessor.ts index 69f756433d..ecdd4c744c 100644 --- a/src/stateAggregator/accessors/sandboxAccessor.ts +++ b/src/stateAggregator/accessors/sandboxAccessor.ts @@ -7,7 +7,7 @@ /* eslint-disable class-methods-use-this */ import { SandboxOrgConfig } from '../../config/sandboxOrgConfig'; -import { SandboxFields } from '../../org'; +import { SandboxFields } from '../../org/org'; import { BaseOrgAccessor } from './orgAccessor'; export class SandboxAccessor extends BaseOrgAccessor { diff --git a/src/stateAggregator/accessors/tokenAccessor.ts b/src/stateAggregator/accessors/tokenAccessor.ts deleted file mode 100644 index 67068ed91d..0000000000 --- a/src/stateAggregator/accessors/tokenAccessor.ts +++ /dev/null @@ -1,98 +0,0 @@ -/* - * 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 { AsyncOptionalCreatable } from '@salesforce/kit'; -import { JsonMap, Optional } from '@salesforce/ts-types'; -import { TokensConfig } from '../../config/tokensConfig'; - -export type SfToken = { - token: string; - url: string; - user?: string; - timestamp: string; -} & JsonMap; - -export type SfTokens = { - [key: string]: SfToken; -}; - -export class TokenAccessor extends AsyncOptionalCreatable { - private config!: TokensConfig; - - /** - * Return all tokens. - * - * @param decrypt - * @returns {SfTokens} - */ - public getAll(decrypt = false): SfTokens { - return this.config.getContents(decrypt) || {}; - } - - /** - * Return a token for the provided name. - * - * @param name - * @param decrypt - * @returns {Optional} - */ - public get(name: string, decrypt = false): Optional { - return this.config.get(name, decrypt); - } - - /** - * Return true if a given name has a token associated with it. - * - * @param name - * @returns {boolean} - */ - public has(name: string): boolean { - return !!this.getAll()[name]; - } - - /** - * Set the token for the provided name. - * - * @param name - * @param token - */ - public set(name: string, token: Partial): void { - this.config.set(name, token); - } - - /** - * Update the token for the provided name. - * - * @param name - * @param token - */ - public update(name: string, token: Partial): void { - this.config.update(name, token); - } - - /** - * Unet the token for the provided name. - * - * @param name - */ - public unset(name: string): void { - this.config.unset(name); - } - - /** - * Write the contents to the token file. - * - * @returns {Promise} - */ - public async write(): Promise { - return this.config.write(); - } - - protected async init(): Promise { - this.config = await TokensConfig.create(); - } -} diff --git a/src/stateAggregator/index.ts b/src/stateAggregator/index.ts deleted file mode 100644 index 381b749a7b..0000000000 --- a/src/stateAggregator/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* - * 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 - */ - -export * from './accessors/orgAccessor'; -export * from './accessors/aliasAccessor'; -export * from './accessors/tokenAccessor'; -export * from './stateAggregator'; diff --git a/src/stateAggregator/stateAggregator.ts b/src/stateAggregator/stateAggregator.ts index 395bb08a57..3259b1f91b 100644 --- a/src/stateAggregator/stateAggregator.ts +++ b/src/stateAggregator/stateAggregator.ts @@ -10,13 +10,11 @@ import { Global } from '../global'; import { AliasAccessor } from './accessors/aliasAccessor'; import { OrgAccessor } from './accessors/orgAccessor'; import { SandboxAccessor } from './accessors/sandboxAccessor'; -import { TokenAccessor } from './accessors/tokenAccessor'; export class StateAggregator extends AsyncOptionalCreatable { private static instanceMap: Map = new Map(); public aliases!: AliasAccessor; public orgs!: OrgAccessor; public sandboxes!: SandboxAccessor; - public tokens!: TokenAccessor; /** * Reuse a StateAggregator if one was already created for the current global state directory @@ -44,6 +42,5 @@ export class StateAggregator extends AsyncOptionalCreatable { this.orgs = await OrgAccessor.create(); this.sandboxes = await SandboxAccessor.create(); this.aliases = await AliasAccessor.create(); - this.tokens = await TokenAccessor.create(); } } diff --git a/src/status/myDomainResolver.ts b/src/status/myDomainResolver.ts index 1f86e69074..1d927c1153 100644 --- a/src/status/myDomainResolver.ts +++ b/src/status/myDomainResolver.ts @@ -5,14 +5,14 @@ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause */ -import { lookup, resolveCname } from 'dns'; -import { URL } from 'url'; -import { promisify } from 'util'; +import { lookup, resolveCname } from 'node:dns'; +import { URL } from 'node:url'; +import { promisify } from 'node:util'; import { ensureString } from '@salesforce/ts-types'; import { AsyncOptionalCreatable, Duration, Env } from '@salesforce/kit'; -import { Logger } from '../logger'; +import { Logger } from '../logger/logger'; import { SfdcUrl } from '../util/sfdcUrl'; import { StatusResult } from './types'; import { PollingClient } from './pollingClient'; @@ -73,8 +73,9 @@ export class MyDomainResolver extends AsyncOptionalCreatable { - if (new Env().getBoolean('SFDX_DISABLE_DNS_CHECK', false)) { - this.logger.debug('SFDX_DISABLE_DNS_CHECK set to true. Skipping DNS check...'); + const env = new Env(); + if (env.getBoolean('SF_DISABLE_DNS_CHECK', env.getBoolean('SFDX_DISABLE_DNS_CHECK', false))) { + this.logger.debug('SF_DISABLE_DNS_CHECK set to true. Skipping DNS check...'); return this.options.url.host; } @@ -138,7 +139,7 @@ export namespace MyDomainResolver { /** * Options for the MyDomain DNS resolver. */ - export interface Options { + export type Options = { /** * The host to resolve. */ @@ -153,5 +154,5 @@ export namespace MyDomainResolver { * The retry timeout. */ frequency?: Duration; - } + }; } diff --git a/src/status/pollingClient.ts b/src/status/pollingClient.ts index f00d110bd4..45cdfce9f2 100644 --- a/src/status/pollingClient.ts +++ b/src/status/pollingClient.ts @@ -7,7 +7,7 @@ import { AsyncOptionalCreatable, Duration } from '@salesforce/kit'; import { AnyJson, ensure } from '@salesforce/ts-types'; import { retryDecorator, NotRetryableError } from 'ts-retry-promise'; -import { Logger } from '../logger'; +import { Logger } from '../logger/logger'; import { SfError } from '../sfError'; import { Lifecycle } from '../lifecycleEvents'; import { StatusResult } from './types'; @@ -103,7 +103,7 @@ export namespace PollingClient { /** * Options for the polling client. */ - export interface Options { + export type Options = { /** * Polling function. */ @@ -124,7 +124,7 @@ export namespace PollingClient { * ``` */ timeoutErrorName?: string; - } + }; /** * Default options set for polling. The default options specify a timeout of 3 minutes and polling frequency of 15 diff --git a/src/status/streamingClient.ts b/src/status/streamingClient.ts index ca5b2e7eb9..c1fcd54e55 100644 --- a/src/status/streamingClient.ts +++ b/src/status/streamingClient.ts @@ -7,11 +7,11 @@ /* eslint-disable @typescript-eslint/ban-ts-comment */ -import { resolve as resolveUrl } from 'url'; +import { resolve as resolveUrl } from 'node:url'; import { AsyncOptionalCreatable, Duration, Env, env, set } from '@salesforce/kit/lib'; import { AnyFunction, AnyJson, ensure, ensureString, JsonMap } from '@salesforce/ts-types/lib'; -import * as Faye from 'faye'; -import { Logger } from '../logger'; +import Faye from 'faye'; +import { Logger } from '../logger/logger'; import { Org } from '../org/org'; import { SfError } from '../sfError'; import { Messages } from '../messages'; @@ -25,7 +25,7 @@ const messages = Messages.loadMessages('@salesforce/core', 'streaming'); * Inner streaming client interface. This implements the Cometd behavior. * Also allows for mocking the functional behavior. */ -export interface StreamingClientIfc { +export type StreamingClientIfc = { /** * Returns a comet client implementation. * @@ -39,7 +39,7 @@ export interface StreamingClientIfc { * @param logLine A log message passed to the the assigned function. */ setLogger: (logLine: (message: string) => void) => void; -} +}; /** * Validation helper @@ -199,6 +199,7 @@ export class StreamingClient extends AsyncOptionalCreatable { if (message.channel === '/meta/subscribe') { if (!message.ext) { + // eslint-disable-next-line no-param-reassign message.ext = {}; } const replayFromMap: JsonMap = {}; @@ -215,7 +216,7 @@ export class StreamingClient extends AsyncOptionalCreatable { - let timeout: NodeJS.Timer; + let timeout: NodeJS.Timeout; return new Promise((resolve, reject) => { timeout = setTimeout(() => { @@ -243,7 +244,7 @@ export class StreamingClient extends AsyncOptionalCreatable Promise): Promise { - let timeout: NodeJS.Timer; + let timeout: NodeJS.Timeout; // This outer promise is to hold the streaming promise chain open until the streaming processor // says it's complete. @@ -323,7 +324,7 @@ export class StreamingClient extends AsyncOptionalCreatable = (...args: any[]) => T; -export interface StatusResult { +export type StatusResult = { /** * If the result of the streaming or polling client is expected to return a result */ @@ -21,20 +21,20 @@ export interface StatusResult { * the messaging exchanges with the endpoint. */ completed: boolean; -} +}; /** * The subscription object returned from the cometd subscribe object. */ -export interface CometSubscription { +export type CometSubscription = { callback(callback: () => void): void; errback(callback: (error: Error) => void): void; -} +}; /** * Types for defining extensions. */ -export interface StreamingExtension { +export type StreamingExtension = { /** * Extension for outgoing message. * @@ -49,7 +49,7 @@ export interface StreamingExtension { * @param callback The callback to invoke after the message is processed. */ incoming?: (message: JsonMap, callback: AnyFunction) => void; -} +}; /** * Function type for processing messages diff --git a/src/testSetup.ts b/src/testSetup.ts index c3556f25f4..b126782c6c 100644 --- a/src/testSetup.ts +++ b/src/testSetup.ts @@ -4,21 +4,20 @@ * 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 no-param-reassign */ // mutate ALL the THINGS! /* eslint-disable @typescript-eslint/ban-ts-comment */ /* eslint-disable class-methods-use-this */ /* eslint-disable @typescript-eslint/no-unsafe-assignment */ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ /* eslint-disable @typescript-eslint/no-unsafe-call */ +import * as fs from 'node:fs'; +import { EventEmitter } from 'node:events'; +import { tmpdir as osTmpdir } from 'node:os'; +import { basename, join as pathJoin, dirname } from 'node:path'; -import { randomBytes } from 'crypto'; -import { EventEmitter } from 'events'; -import { tmpdir as osTmpdir } from 'os'; -import { basename, join as pathJoin } from 'path'; -import * as util from 'util'; +// eslint-disable-next-line import/no-extraneous-dependencies import { SinonSandbox, SinonStatic, SinonStub } from 'sinon'; -import { once } from '@salesforce/kit'; -import { stubMethod } from '@salesforce/ts-sinon'; import { AnyFunction, AnyJson, @@ -33,26 +32,35 @@ import { } from '@salesforce/ts-types'; import { ConfigAggregator } from './config/configAggregator'; import { ConfigFile } from './config/configFile'; -import { ConfigContents } from './config/configStore'; +import { ConfigContents } from './config/configStackTypes'; import { Connection } from './org/connection'; import { Crypto } from './crypto/crypto'; -import { Logger } from './logger'; +import { Logger } from './logger/logger'; import { Messages } from './messages'; import { SfError } from './sfError'; import { SfProject, SfProjectJson } from './sfProject'; +import * as aliasAccessorEntireFile from './stateAggregator/accessors/aliasAccessor'; import { CometClient, CometSubscription, Message, StreamingExtension } from './status/streamingClient'; -import { OrgAccessor, StateAggregator } from './stateAggregator'; -import { AuthFields, Org, SandboxFields, User, UserFields } from './org'; +import { StateAggregator } from './stateAggregator/stateAggregator'; +import { OrgAccessor } from './stateAggregator/accessors/orgAccessor'; +import { Org, SandboxFields } from './org/org'; +import { AuthFields } from './org/authInfo'; +import { User, UserFields } from './org/user'; import { SandboxAccessor } from './stateAggregator/accessors/sandboxAccessor'; -import { AliasGroup } from './config/aliasesConfig'; import { Global } from './global'; +import { uniqid } from './util/uniqid'; + +// this was previously exported from the testSetup module +export { uniqid }; +// stuff previously imported via /lib/foo and used in unit tests +export { SecureBuffer } from './crypto/secureBuffer'; /** * Different parts of the system that are mocked out. They can be restored for * individual tests. Test's stubs should always go on the DEFAULT which is exposed * on the TestContext. */ -export interface SandboxTypes { +export type SandboxTypes = { DEFAULT: SinonSandbox; CRYPTO: SinonSandbox; CONFIG: SinonSandbox; @@ -60,12 +68,12 @@ export interface SandboxTypes { CONNECTION: SinonSandbox; FS: SinonSandbox; ORGS: SinonSandbox; -} +}; /** * Different hooks into {@link ConfigFile} used for testing instead of doing file IO. */ -export interface ConfigStub { +export type ConfigStub = { /** * readFn A function that controls all aspect of {@link ConfigFile.read}. For example, it won't set the contents * unless explicitly done. Only use this if you know what you are doing. Use retrieveContents @@ -88,11 +96,7 @@ export interface ConfigStub { * A function to conditionally read based on the config instance. The `this` value will be the config instance. */ retrieveContents?: () => Promise; - /** - * A function to conditionally set based on the config instance. The `this` value will be the config instance. - */ - updateContents?: () => Promise; -} +}; /** * Instantiate a @salesforce/core test context. @@ -122,11 +126,9 @@ export class TestContext { */ public configStubs: { [configName: string]: Optional; - AliasesConfig?: ConfigStub; AuthInfoConfig?: ConfigStub; Config?: ConfigStub; SfProjectJson?: ConfigStub; - TokensConfig?: ConfigStub; OrgUsersConfig?: ConfigStub; } = {}; /** @@ -136,7 +138,7 @@ export class TestContext { public constructor(options: { sinon?: SinonStatic; sandbox?: SinonSandbox; setup?: boolean } = {}) { const opts = { setup: true, ...options }; - const sinon = this.requireSinon(opts.sinon); + const sinon = requireSinon(opts.sinon); // Import all the messages files in the sfdx-core messages dir. Messages.importMessagesDirectory(pathJoin(__dirname)); // Create a global sinon sandbox and a test logger instance for use within tests. @@ -151,7 +153,7 @@ export class TestContext { ORGS: sinon.createSandbox(), }; - this.TEST_LOGGER = new Logger({ name: 'SFDX_Core_Test_Logger' }).useMemoryLogging(); + this.TEST_LOGGER = new Logger({ name: 'SFDX_Core_Test_Logger', useMemoryLogger: true }); if (opts.setup) { this.setup(); @@ -293,9 +295,12 @@ export class TestContext { ); const orgMap = new Map(entries); - stubMethod(this.SANDBOX, OrgAccessor.prototype, 'getAllFiles').resolves([...orgMap.keys()].map((o) => `${o}.json`)); + // @ts-expect-error because private method + this.SANDBOX.stub(OrgAccessor.prototype, 'getAllFiles').resolves([...orgMap.keys()].map((o) => `${o}.json`)); - stubMethod(this.SANDBOX, OrgAccessor.prototype, 'hasFile').callsFake((username: string) => orgMap.has(username)); + this.SANDBOX.stub(OrgAccessor.prototype, 'hasFile').callsFake((username: string) => + Promise.resolve(orgMap.has(username)) + ); const retrieveContents = async function (this: { path: string }): Promise { const username = basename(this.path.replace('.json', '')); @@ -340,9 +345,11 @@ export class TestContext { }) ); - stubMethod(this.SANDBOX, User.prototype, 'retrieve').callsFake( - (username): Promise => Promise.resolve(mockUsers.find((org) => org.username === username)) - ); + this.SANDBOX.stub(User.prototype, 'retrieve').callsFake((username): Promise => { + const user = mockUsers.find((org) => org.username === username); + if (!user) throw new SfError('User not found', 'UserNotFoundError'); + return Promise.resolve(user); + }); const retrieveContents = async function (this: { path: string }): Promise<{ usernames?: string[] }> { const orgId = basename(this.path.replace('.json', '')); @@ -361,7 +368,8 @@ export class TestContext { )) as Array<[string, SandboxFields]>; const sandboxMap = new Map(entries); - stubMethod(this.SANDBOX, SandboxAccessor.prototype, 'getAllFiles').resolves( + // @ts-expect-error because private method + this.SANDBOX.stub(SandboxAccessor.prototype, 'getAllFiles').resolves( [...sandboxMap.keys()].map((o) => `${o}.sandbox.json`) ); @@ -376,8 +384,11 @@ export class TestContext { /** * Stub the aliases in the global aliases config file. */ - public stubAliases(aliases: Record, group = AliasGroup.ORGS): void { - this.configStubs.AliasesConfig = { contents: { [group]: aliases } }; + public stubAliases(aliases: Record, group = aliasAccessorEntireFile.DEFAULT_GROUP): void { + // we don't really "stub" these since they don't use configFile. + // write the fileContents to location + fs.mkdirSync(dirname(getAliasFileLocation()), { recursive: true }); + fs.writeFileSync(getAliasFileLocation(), JSON.stringify({ [group]: aliases })); } /** @@ -390,13 +401,6 @@ export class TestContext { await ConfigAggregator.create(); } - /** - * Stub the tokens in the global token config file. - */ - public stubTokens(tokens: Record): void { - this.configStubs.TokensConfig = { contents: tokens }; - } - public restore(): void { restoreContext(this); } @@ -418,42 +422,20 @@ export class TestContext { this.restore(); }); } - - private requireSinon(sinon: Nullable): SinonStatic { - if (sinon) return sinon; - try { - sinon = require('sinon'); - } catch (e) { - throw new Error( - 'The package sinon was not found. Add it to your package.json and pass it in to new TestContext({sinon})' - ); - } - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - return sinon!; - } } -/** - * A function to generate a unique id and return it in the context of a template, if supplied. - * - * A template is a string that can contain `${%s}` to be replaced with a unique id. - * If the template contains the "%s" placeholder, it will be replaced with the unique id otherwise the id will be appended to the template. - * - * @param options an object with the following properties: - * - template: a template string. - * - length: the length of the unique id as presented in hexadecimal. - */ -export function uniqid(options?: { template?: string; length?: number }): string { - const uniqueString = randomBytes(Math.ceil((options?.length ?? 32) / 2.0)) - .toString('hex') - .slice(0, options?.length ?? 32); - if (!options?.template) { - return uniqueString; +const requireSinon = (sinon: Nullable): SinonStatic => { + if (sinon) return sinon; + try { + // eslint-disable-next-line @typescript-eslint/no-var-requires, import/no-extraneous-dependencies + const newSinon = require('sinon'); + return newSinon as SinonStatic; + } catch (e) { + throw new Error( + 'The package sinon was not found. Add it to your package.json and pass it in to new TestContext({sinon})' + ); } - return options.template.includes('%s') - ? util.format(options.template, uniqueString) - : `${options.template}${uniqueString}`; -} +}; function getTestLocalPath(uid: string): string { return pathJoin(osTmpdir(), uid, 'sfdx_core', 'local'); @@ -527,12 +509,11 @@ export const stubContext = (testContext: TestContext): Record // Turn off the interoperability feature so that we don't have to mock // the old .sfdx config files Global.SFDX_INTEROPERABILITY = false; - const stubs: Record = {}; // Most core files create a child logger so stub this to return our test logger. - stubMethod(testContext.SANDBOX, Logger, 'child').resolves(testContext.TEST_LOGGER); - stubMethod(testContext.SANDBOX, Logger, 'childFromRoot').returns(testContext.TEST_LOGGER); + testContext.SANDBOX.stub(Logger, 'child').resolves(testContext.TEST_LOGGER); + testContext.SANDBOX.stub(Logger, 'childFromRoot').returns(testContext.TEST_LOGGER); testContext.inProject(true); testContext.SANDBOXES.CONFIG.stub(ConfigFile, 'resolveRootFolder').callsFake((isGlobal: boolean) => testContext.rootPathRetriever(isGlobal, testContext.id) @@ -541,9 +522,11 @@ export const stubContext = (testContext: TestContext): Record testContext.rootPathRetrieverSync(isGlobal, testContext.id) ); - stubMethod(testContext.SANDBOXES.PROJECT, SfProjectJson.prototype, 'doesPackageExist').callsFake(() => true); + // @ts-expect-error using private method + testContext.SANDBOXES.PROJECT.stub(SfProjectJson.prototype, 'doesPackageExist').callsFake(() => true); const initStubForRead = (configFile: ConfigFile): ConfigStub => { + testContext.configStubs[configFile.constructor.name] ??= {}; const stub: ConfigStub = testContext.configStubs[configFile.constructor.name] ?? {}; // init calls read calls getPath which sets the path on the config file the first time. // Since read is now stubbed, make sure to call getPath to initialize it. @@ -556,7 +539,7 @@ export const stubContext = (testContext: TestContext): Record const readSync = function (this: ConfigFile, newContents?: JsonMap): JsonMap { const stub = initStubForRead(this); - this.setContentsFromObject(newContents ?? stub.contents ?? {}); + this.setContentsFromFileContents(newContents ?? stub.contents ?? {}); return this.getContents(); }; @@ -579,42 +562,31 @@ export const stubContext = (testContext: TestContext): Record // @ts-expect-error: muting exact type match for stub readSync stubs.configReadSync = testContext.SANDBOXES.CONFIG.stub(ConfigFile.prototype, 'readSync').callsFake(readSync); - const writeSync = function (this: ConfigFile, newContents?: ConfigContents): void { - if (!testContext.configStubs[this.constructor.name]) { - testContext.configStubs[this.constructor.name] = {}; - } - const stub = testContext.configStubs[this.constructor.name]; - if (!stub) return; + const writeSync = function (this: ConfigFile): void { + testContext.configStubs[this.constructor.name] ??= {}; + const stub = testContext.configStubs[this.constructor.name] ?? {}; - this.setContents(newContents ?? this.getContents()); stub.contents = this.toObject(); }; - const write = async function (this: ConfigFile, newContents?: ConfigContents): Promise { - if (!testContext.configStubs[this.constructor.name]) { - testContext.configStubs[this.constructor.name] = {}; - } - const stub = testContext.configStubs[this.constructor.name]; - if (!stub) return; + const write = async function (this: ConfigFile): Promise { + testContext.configStubs[this.constructor.name] ??= {}; + const stub = testContext.configStubs[this.constructor.name] ?? {}; if (stub.writeFn) { - return stub.writeFn.call(this, newContents); + return stub.writeFn.call(this); } - if (stub.updateContents) { - writeSync.call(this, await stub.updateContents.call(this)); - } else { - writeSync.call(this); - } + writeSync.call(this); }; - stubs.configWriteSync = stubMethod(testContext.SANDBOXES.CONFIG, ConfigFile.prototype, 'writeSync').callsFake( - writeSync - ); + stubs.configWriteSync = testContext.SANDBOXES.CONFIG.stub(ConfigFile.prototype, 'writeSync').callsFake(writeSync); - stubs.configWrite = stubMethod(testContext.SANDBOXES.CONFIG, ConfigFile.prototype, 'write').callsFake(write); + stubs.configWrite = testContext.SANDBOXES.CONFIG.stub(ConfigFile.prototype, 'write').callsFake(write); - stubMethod(testContext.SANDBOXES.CRYPTO, Crypto.prototype, 'getKeyChain').callsFake(() => + // @ts-expect-error: getKeyChain is private + testContext.SANDBOXES.CRYPTO.stub(Crypto.prototype, 'getKeyChain').callsFake(() => + // @ts-expect-error: not the full type Promise.resolve({ setPassword: () => Promise.resolve(), getPassword: (data: Record, cb: AnyFunction) => @@ -622,9 +594,10 @@ export const stubContext = (testContext: TestContext): Record }) ); - stubMethod(testContext.SANDBOXES.CONNECTION, Connection.prototype, 'isResolvable').resolves(true); + testContext.SANDBOXES.CONNECTION.stub(Connection.prototype, 'isResolvable').resolves(true); - stubMethod(testContext.SANDBOXES.CONNECTION, Connection.prototype, 'request').callsFake(function ( + // @ts-expect-error: just enough of an httpResponse for testing + testContext.SANDBOXES.CONNECTION.stub(Connection.prototype, 'request').callsFake(function ( this: Connection, request: string, options?: Dictionary @@ -635,21 +608,25 @@ export const stubContext = (testContext: TestContext): Record return testContext.fakeConnectionRequest.call(this, request, options as AnyJson); }); - stubs.configExists = stubMethod(testContext.SANDBOXES.ORGS, OrgAccessor.prototype, 'exists').callsFake( - async function (this: OrgAccessor, username: string): Promise { - // @ts-expect-error because private member - if ([...this.contents.keys()].includes(username)) return Promise.resolve(true); - else return Promise.resolve(false); - } - ); + testContext.SANDBOX.stub(aliasAccessorEntireFile, 'getFileLocation').returns(getAliasFileLocation()); - stubs.configRemove = stubMethod(testContext.SANDBOXES.ORGS, OrgAccessor.prototype, 'remove').callsFake( - async function (this: OrgAccessor, username: string): Promise { - // @ts-expect-error because private member - if ([...this.contents.keys()].includes(username)) return Promise.resolve(true); - else return Promise.resolve(false); - } - ); + stubs.configExists = testContext.SANDBOXES.ORGS.stub(OrgAccessor.prototype, 'exists').callsFake(async function ( + this: OrgAccessor, + username: string + ): Promise { + // @ts-expect-error because private member + if ([...this.contents.keys()].includes(username)) return Promise.resolve(true); + else return Promise.resolve(false); + }); + + stubs.configRemove = testContext.SANDBOXES.ORGS.stub(OrgAccessor.prototype, 'remove').callsFake(async function ( + this: OrgAccessor, + username: string + ): Promise { + // @ts-expect-error because private member + if ([...this.contents.keys()].includes(username)) return Promise.resolve(); + else return Promise.resolve(); + }); // Always start with the default and tests beforeEach or it methods can override it. testContext.fakeConnectionRequest = defaultFakeConnectionRequest; @@ -659,6 +636,8 @@ export const stubContext = (testContext: TestContext): Record return stubs; }; +const getAliasFileLocation = (): string => + pathJoin(osTmpdir(), Global.SFDX_STATE_FOLDER, aliasAccessorEntireFile.FILENAME); /** * Restore a @salesforce/core test context. This is automatically stubbed in the global beforeEach created by * `const $$ = testSetup()` but is useful if you don't want to have a global stub of @salesforce/core and you @@ -694,71 +673,6 @@ export const restoreContext = (testContext: TestContext): void => { delete ConfigAggregator.instance; }; -// eslint-disable-next-line no-underscore-dangle -const _testSetup = (sinon?: SinonStatic): TestContext => { - const testContext = instantiateContext(sinon); - - beforeEach(() => { - // Allow each test to have their own config aggregator - // @ts-ignore clear for testing. - delete ConfigAggregator.instance; - testContext.stubs = stubContext(testContext); - }); - - afterEach(() => { - restoreContext(testContext); - }); - - return testContext; -}; - -/** - * @deprecated Use TestContext instead. - * Using testSetup will create globals stubs that could lead to erratic test behavior. - * - * This example shows you how to use TestContext: - * @example - * ``` - * const $$ = new TestContext(); - * - * beforeEach(() => { - * $$.init(); - * }); - * - * afterEach(() => { - * $$.restore(); - * }); - * ``` - * - * Use to mock out different pieces of sfdx-core to make testing easier. This will mock out - * logging to a file, config file reading and writing, local and global path resolution, and - * *http request using connection (soon)*. - * - * **Note:** The testSetup should be outside of the describe. If you need to stub per test, use - * `TestContext`. - * ``` - * // In a mocha tests - * import testSetup from '@salesforce/core/lib/testSetup'; - * - * const $$ = testSetup(); - * - * describe(() => { - * it('test', () => { - * // Stub out your own method - * $$.SANDBOX.stub(MyClass.prototype, 'myMethod').returnsFake(() => {}); - * - * // Set the contents that is used when aliases are read. Same for all config files. - * $$.stubAliases({ 'myTestAlias': 'user@company.com' }); - * - * // Will use the contents set above. - * const username = (await StateAggregator.getInstance()).aliases.resolveUsername("myTestAlias"); - * expect(username).to.equal("user@company.com"); - * }); - * }); - * ``` - */ -export const testSetup = once(_testSetup); - /** * A pre-canned error for try/catch testing. * @@ -838,7 +752,7 @@ export enum StreamingMockSubscriptionCall { /** * Additional subscription options for the StreamingMock. */ -export interface StreamingMockCometSubscriptionOptions { +export type StreamingMockCometSubscriptionOptions = { /** * Target URL. */ @@ -859,7 +773,7 @@ export interface StreamingMockCometSubscriptionOptions { * A list of messages to playback for the client. One message per process tick. */ messagePlaylist?: Message[]; -} +}; /** * Simulates a comet subscription to a streaming channel. @@ -1026,6 +940,7 @@ export class MockTestOrgData { public isScratchOrg?: boolean; public isExpired?: boolean | 'unknown'; public password?: string; + public namespacePrefix?: string; public constructor(id: string = uniqid(), options?: { username: string }) { this.testId = id; @@ -1040,6 +955,7 @@ export class MockTestOrgData { this.accessToken = `${this.testId}/accessToken`; this.refreshToken = `${this.testId}/refreshToken`; this.redirectUri = 'http://localhost:1717/OauthRedirect'; + this.namespacePrefix = `acme_${this.testId}`; } /** @@ -1134,7 +1050,8 @@ export class MockTestOrgData { config.password = crypto.encrypt(this.password); } - return config as AuthFields; + // remove "undefined" properties that don't exist in actual files + return Object.fromEntries(Object.entries(config).filter(([, v]) => v !== undefined)) as AuthFields; } /** diff --git a/src/util/checkLightningDomain.ts b/src/util/checkLightningDomain.ts deleted file mode 100644 index d1116d5340..0000000000 --- a/src/util/checkLightningDomain.ts +++ /dev/null @@ -1,29 +0,0 @@ -/* - * 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 { URL } from 'url'; -import { Env, Duration } from '@salesforce/kit'; -import { MyDomainResolver } from '../status/myDomainResolver'; -import { isInternalUrl } from './sfdc'; - -export default async function checkLightningDomain(url: string): Promise { - const domain = `https://${/https?:\/\/([^.]*)/.exec(url)?.slice(1, 2).pop()}.lightning.force.com`; - const quantity = new Env().getNumber('SFDX_DOMAIN_RETRY', 240) ?? 0; - const timeout = new Duration(quantity, Duration.Unit.SECONDS); - - if (isInternalUrl(url) || timeout.seconds === 0) { - return true; - } - - const resolver = await MyDomainResolver.create({ - url: new URL(domain), - timeout, - frequency: new Duration(1, Duration.Unit.SECONDS), - }); - - await resolver.resolve(); - return true; -} diff --git a/src/util/directoryWriter.ts b/src/util/directoryWriter.ts index d9b0c68139..96ebed22bf 100644 --- a/src/util/directoryWriter.ts +++ b/src/util/directoryWriter.ts @@ -5,11 +5,11 @@ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause */ -import { Readable, pipeline as cbPipeline } from 'stream'; -import * as fs from 'fs'; -import * as os from 'os'; -import * as path from 'path'; -import { promisify } from 'util'; +import { Readable, pipeline as cbPipeline } from 'node:stream'; +import * as fs from 'node:fs'; +import * as os from 'node:os'; +import * as path from 'node:path'; +import { promisify } from 'node:util'; import { StructuredWriter } from './structuredWriter'; const pipeline = promisify(cbPipeline); diff --git a/src/util/fileLocking.ts b/src/util/fileLocking.ts new file mode 100644 index 0000000000..db955221b0 --- /dev/null +++ b/src/util/fileLocking.ts @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2023, 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 fs from 'node:fs'; +import { dirname } from 'node:path'; +import { lock, lockSync } from 'proper-lockfile'; +import { SfError } from '../sfError'; +import { Logger } from '../logger/logger'; +import { lockOptions, lockRetryOptions } from './lockRetryOptions'; + +type LockInitResponse = { writeAndUnlock: (data: string) => Promise; unlock: () => Promise }; +type LockInitSyncResponse = { writeAndUnlock: (data: string) => void; unlock: () => void }; + +/** + * + *This method exists as a separate function so it can be used by ConfigFile OR outside of ConfigFile. + * + * @param filePath where to save the file + * @returns 2 functions: + * - writeAndUnlock: a function that takes the data to write and writes it to the file, then unlocks the file whether write succeeded or not + * - unlock: a function that unlocks the file (in case you don't end up calling writeAndUnlock) + */ +export const lockInit = async (filePath: string): Promise => { + // make sure we can write to the directory + try { + await fs.promises.mkdir(dirname(filePath), { recursive: true }); + } catch (err) { + throw SfError.wrap(err as Error); + } + + const [unlock] = await Promise.all( + fs.existsSync(filePath) + ? // if the file exists, wait for it to be unlocked + [lock(filePath, lockRetryOptions)] + : // lock the entire directory to keep others from trying to create the file while we are + [ + lock(dirname(filePath), lockRetryOptions), + ( + await Logger.child('fileLocking.lockInit') + ).debug( + `No file found at ${filePath}. Write will create it. Locking the entire directory until file is written.` + ), + ] + ); + + return { + writeAndUnlock: async (data: string): Promise => { + const logger = await Logger.child('fileLocking.writeAndUnlock'); + logger.debug(`Writing to file: ${filePath}`); + try { + await fs.promises.writeFile(filePath, data); + } finally { + await unlock(); + } + }, + unlock, + }; +}; + +/** + * prefer async {@link lockInit}. + * See its documentation for details. + */ +export const lockInitSync = (filePath: string): LockInitSyncResponse => { + // make sure we can write to the directory + try { + fs.mkdirSync(dirname(filePath), { recursive: true }); + } catch (err) { + throw SfError.wrap(err as Error); + } + + const [unlock] = fs.existsSync(filePath) + ? // if the file exists, wait for it to be unlocked + [lockSync(filePath, lockOptions)] + : // lock the entire directory to keep others from trying to create the file while we are + [ + lockSync(dirname(filePath), lockOptions), + Logger.childFromRoot('fileLocking.lockInit').debug( + `No file found at ${filePath}. Write will create it. Locking the entire directory until file is written.` + ), + ]; + return { + writeAndUnlock: (data: string): void => { + const logger = Logger.childFromRoot('fileLocking.writeAndUnlock'); + logger.debug(`Writing to file: ${filePath}`); + try { + fs.writeFileSync(filePath, data); + } finally { + unlock(); + } + }, + unlock, + }; +}; diff --git a/src/util/findSuggestion.ts b/src/util/findSuggestion.ts new file mode 100644 index 0000000000..20cc3aa32a --- /dev/null +++ b/src/util/findSuggestion.ts @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2023, 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 Levenshtein from 'fast-levenshtein'; + +/** + * From the haystack, will find the closest value to the needle + * + * @param needle - what the user provided - find results similar to this + * @param haystack - possible results to search against + */ +export const findSuggestion = (needle: string, haystack: string[]): string => { + // we'll use this array to keep track of which piece of hay is the closest to the users entered value. + // keys closer to the index 0 will be a closer guess than keys indexed further from 0 + // an entry at 0 would be a direct match, an entry at 1 would be a single character off, etc. + const index: string[] = []; + haystack.map((hay) => { + index[Levenshtein.get(needle, hay)] = hay; + }); + + return index.find((item) => item !== undefined) ?? ''; +}; diff --git a/src/util/findUppercaseKeys.ts b/src/util/findUppercaseKeys.ts new file mode 100644 index 0000000000..3452647d56 --- /dev/null +++ b/src/util/findUppercaseKeys.ts @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2023, 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 { JsonMap, Optional, isJsonMap, asJsonMap, AnyJson } from '@salesforce/ts-types'; +import { findKey } from '@salesforce/kit'; + +export const findUpperCaseKeys = (data?: JsonMap, sectionBlocklist: string[] = []): Optional => { + let key: Optional; + findKey(data, (val: AnyJson, k: string) => { + if (/^[A-Z]/.test(k)) { + key = k; + } else if (isJsonMap(val)) { + if (sectionBlocklist.includes(k)) { + return key; + } + key = findUpperCaseKeys(asJsonMap(val)); + } + return key; + }); + return key; +}; diff --git a/src/util/getJwtAudienceUrl.ts b/src/util/getJwtAudienceUrl.ts index cd611ec890..b9fdf03559 100644 --- a/src/util/getJwtAudienceUrl.ts +++ b/src/util/getJwtAudienceUrl.ts @@ -5,7 +5,7 @@ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause */ -import { OAuth2Config } from 'jsforce'; +import { OAuth2Config } from '@jsforce/jsforce-node'; import { SfdcUrl } from './sfdcUrl'; export async function getJwtAudienceUrl(options: OAuth2Config & { createdOrgInstance?: string }): Promise { diff --git a/src/util/internal.ts b/src/util/internal.ts index ccbfff216e..1b2f538264 100644 --- a/src/util/internal.ts +++ b/src/util/internal.ts @@ -5,8 +5,8 @@ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause */ -import * as fs from 'fs'; -import { join, resolve } from 'path'; +import * as fs from 'node:fs'; +import { join, resolve } from 'node:path'; import { Optional } from '@salesforce/ts-types'; import { Messages } from '../messages'; import { SfError } from '../sfError'; diff --git a/src/util/jsonXmlTools.ts b/src/util/jsonXmlTools.ts deleted file mode 100644 index ba7c79cb63..0000000000 --- a/src/util/jsonXmlTools.ts +++ /dev/null @@ -1,54 +0,0 @@ -/* - * 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 { promises as fs } from 'fs'; -import * as jsToXml from 'js2xmlparser'; -import { JsonMap } from '@salesforce/ts-types'; -import { IOptions } from 'js2xmlparser/lib/options'; - -export interface JSONasXML { - json: JsonMap; - type: string; - options?: IOptions; -} - -export interface WriteJSONasXMLInputs extends JSONasXML { - path: string; -} - -export const standardOptions: IOptions = { - declaration: { - include: true, - encoding: 'UTF-8', - version: '1.0', - }, - format: { - doubleQuotes: true, - }, -}; - -export const writeJSONasXML = async ({ - path, - json, - type, - options = standardOptions, -}: WriteJSONasXMLInputs): Promise => { - const xml = jsToXml.parse(type, fixExistingDollarSign(json), options); - return fs.writeFile(path, xml); -}; - -export const JsonAsXml = ({ json, type, options = standardOptions }: JSONasXML): string => jsToXml.parse(type, fixExistingDollarSign(json), options); - -export const fixExistingDollarSign = (existing: WriteJSONasXMLInputs['json']): Record => { - const existingCopy = { ...existing } as Record; - if (existingCopy.$) { - const temp = existingCopy.$; - delete existingCopy.$; - existingCopy['@'] = temp; - } - return existingCopy; -}; diff --git a/src/util/lockRetryOptions.ts b/src/util/lockRetryOptions.ts new file mode 100644 index 0000000000..20e836c667 --- /dev/null +++ b/src/util/lockRetryOptions.ts @@ -0,0 +1,14 @@ +/* + * Copyright (c) 2023, 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 + */ + +// docs: https://github.com/moxystudio/node-proper-lockfile + +export const lockOptions = { stale: 10_000 }; +export const lockRetryOptions = { + ...lockOptions, + retries: { retries: 10, maxTimeout: 1000, factor: 2 }, +}; diff --git a/src/util/sfdc.ts b/src/util/sfdc.ts index 56a1797beb..bce49c1e9b 100644 --- a/src/util/sfdc.ts +++ b/src/util/sfdc.ts @@ -5,10 +5,6 @@ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause */ -import { findKey } from '@salesforce/kit'; -import { AnyJson, asJsonMap, isJsonMap, JsonMap, Optional } from '@salesforce/ts-types'; -import { SfdcUrl } from './sfdcUrl'; - /** * Converts an 18 character Salesforce ID to 15 characters. * @@ -22,7 +18,7 @@ export function trimTo15(id: string | undefined): string | undefined { return undefined; } if (id.length && id.length > 15) { - id = id.substring(0, 15); + return id.substring(0, 15); } return id; } @@ -41,13 +37,6 @@ export const validateApiVersion = (value: string): boolean => value == null || / */ export const validateEmail = (value: string): boolean => /^[^.][^@]*@[^.]+(\.[^.\s]+)+$/.test(value); -/** - * Tests whether a given url is an internal Salesforce domain - * - * @param url - */ -export const isInternalUrl = (url: string): boolean => new SfdcUrl(url).isInternalUrl(); - /** * Tests whether a Salesforce ID is in the correct format, a 15- or 18-character length string with only letters and numbers * @@ -64,43 +53,14 @@ export const validateSalesforceId = (value: string): boolean => export const validatePathDoesNotContainInvalidChars = (value: string): boolean => // eslint-disable-next-line no-useless-escape !/[\["\?<>\|\]]+/.test(value); -/** - * Returns the first key within the object that has an upper case first letter. - * - * @param data The object in which to check key casing. - * @param sectionBlocklist properties in the object to exclude from the search. e.g. a blocklist of `["a"]` and data of `{ "a": { "B" : "b"}}` would ignore `B` because it is in the object value under `a`. - */ -export const findUpperCaseKeys = (data?: JsonMap, sectionBlocklist: string[] = []): Optional => { - let key: Optional; - findKey(data, (val: AnyJson, k: string) => { - if (/^[A-Z]/.test(k)) { - key = k; - } else if (isJsonMap(val)) { - if (sectionBlocklist.includes(k)) { - return key; - } - key = findUpperCaseKeys(asJsonMap(val)); - } - return key; - }); - return key; -}; + +export const accessTokenRegex = /(00D\w{12,15})![.\w]*/; +export const sfdxAuthUrlRegex = + /force:\/\/([a-zA-Z0-9._-]+):([a-zA-Z0-9._-]*):([a-zA-Z0-9._-]+={0,2})@([a-zA-Z0-9._-]+)/; /** * Tests whether a given string is an access token * * @param value */ -export const matchesAccessToken = (value: string): boolean => /^(00D\w{12,15})![.\w]*$/.test(value); - -/** @deprecated import the individual functions instead of the whole object */ -export const sfdc = { - trimTo15, - validateApiVersion, - validateEmail, - isInternalUrl, - matchesAccessToken, - validateSalesforceId, - validatePathDoesNotContainInvalidChars, - findUpperCaseKeys, -}; +export const matchesAccessToken = (value: string): boolean => accessTokenRegex.test(value); diff --git a/src/util/sfdcUrl.ts b/src/util/sfdcUrl.ts index a0207aae26..0683c972b1 100644 --- a/src/util/sfdcUrl.ts +++ b/src/util/sfdcUrl.ts @@ -5,11 +5,11 @@ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause */ -import { URL } from 'url'; +import { URL } from 'node:url'; import { Env, Duration } from '@salesforce/kit'; import { ensureNumber, ensureArray } from '@salesforce/ts-types'; import { MyDomainResolver } from '../status/myDomainResolver'; -import { Logger } from '../logger'; +import { Logger } from '../logger/logger'; import { Lifecycle } from '../lifecycleEvents'; export function getLoginAudienceCombos(audienceUrl: string, loginUrl: string): Array<[string, string]> { @@ -83,7 +83,10 @@ export class SfdcUrl extends URL { return envVarVal; } - if ((createdOrgInstance && /^gs1/gi.test(createdOrgInstance)) || /(gs1.my.salesforce.com)/gi.test(this.origin)) { + if ( + Boolean(createdOrgInstance && /^gs1/gi.test(createdOrgInstance)) || + /(gs1.my.salesforce.com)/gi.test(this.origin) + ) { return 'https://gs1.salesforce.com'; } @@ -105,6 +108,7 @@ export class SfdcUrl extends URL { '.salesforceliveagent.com', '.secure.force.com', 'crmforce.mil', + '.sfcrmproducts.cn', ]; const allowlistOfSalesforceHosts: string[] = ['developer.salesforce.com', 'trailhead.salesforce.com']; @@ -159,6 +163,10 @@ export class SfdcUrl extends URL { if (this.origin.endsWith('.my-salesforce.com')) { return this.origin.replace('.my-salesforce.com', '.my-lightning.com'); } + // CN Specific domains for Alibaba Cloud + if (this.origin.endsWith('.my.sfcrmproducts.cn')) { + return this.origin.replace('.my.sfcrmproducts.cn', '.lightning.sfcrmapps.cn'); + } // all non-mil domains return `https://${ensureArray(/https?:\/\/([^.]*)/.exec(this.origin)) @@ -173,7 +181,7 @@ export class SfdcUrl extends URL { * @returns {Promise} The resolved ip address or never * @throws {@link SfError} If can't resolve DNS. */ - public async checkLightningDomain(): Promise { + public async checkLightningDomain(): Promise { const quantity = ensureNumber(new Env().getNumber('SFDX_DOMAIN_RETRY', 240)); const timeout = new Duration(quantity, Duration.Unit.SECONDS); @@ -209,34 +217,16 @@ export class SfdcUrl extends URL { return resolver.resolve(); } - /** - * Tests whether this url is a sandbox url - * - * @Deprecated - identification of a sandbox instance by URL alone is not deterministic - * @param createdOrgInstance The Salesforce instance the org was created on. e.g. `cs42` - * @returns {boolean} - */ - // TODO: how to get rid of this? - public isSandboxUrl(createdOrgInstance?: string): boolean { - return ( - (createdOrgInstance && /^cs|s$/gi.test(createdOrgInstance)) || - this.origin.endsWith('sandbox.my.salesforce.mil') || - /sandbox\.my\.salesforce\.com/gi.test(this.origin) || // enhanced domains >= 230 - /(cs[0-9]+(\.my|)\.salesforce\.com)/gi.test(this.origin) || // my domains on CS instance OR CS instance without my domain - /(cs[0-9]+\.force\.com)/gi.test(this.origin) || // sandboxes have cnames like cs123.force.com - /(\w+--\w+\.my\.salesforce\.com)/gi.test(this.origin) || // sandboxes myDomain like foo--bar.my.salesforce.com - /([a-z]{3}[0-9]+s\.sfdc-.+\.salesforce\.com)/gi.test(this.origin) || // falcon sandbox ex: usa2s.sfdc-whatever.salesforce.com - /([a-z]{3}[0-9]+s\.sfdc-.+\.force\.com)/gi.test(this.origin) || // falcon sandbox ex: usa2s.sfdc-whatever.force.com - this.hostname === 'test.salesforce.com' - ); - } - /** * Test whether this url represents a lightning domain * * @returns {boolean} true if this domain is a lightning domain */ public isLightningDomain(): boolean { - return this.origin.includes('.lightning.force.com') || this.origin.includes('.lightning.crmforce.mil'); + return ( + this.origin.includes('.lightning.force.com') || + this.origin.includes('.lightning.crmforce.mil') || + this.origin.includes('.lightning.sfcrmapps.cn') + ); } } diff --git a/src/util/structuredWriter.ts b/src/util/structuredWriter.ts index 119c095a48..281e7a6cf2 100644 --- a/src/util/structuredWriter.ts +++ b/src/util/structuredWriter.ts @@ -4,11 +4,11 @@ * 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 { Readable } from 'stream'; +import { Readable } from 'node:stream'; -export interface StructuredWriter { +export type StructuredWriter = { addToStore(contents: string | Readable | Buffer, path: string): Promise; finalize(): Promise; getDestinationPath(): string | undefined; get buffer(): Buffer; -} +}; diff --git a/src/util/time.ts b/src/util/time.ts new file mode 100644 index 0000000000..f61cea95ef --- /dev/null +++ b/src/util/time.ts @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2023, 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 { performance } from 'node:perf_hooks'; + +export const nowBigInt = (): bigint => BigInt((performance.now() + performance.timeOrigin) * 1_000_000); diff --git a/src/util/uniqid.ts b/src/util/uniqid.ts new file mode 100644 index 0000000000..f64fd759d5 --- /dev/null +++ b/src/util/uniqid.ts @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2023, 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 { randomBytes } from 'node:crypto'; +import * as util from 'node:util'; + +/** + * A function to generate a unique id and return it in the context of a template, if supplied. + * + * A template is a string that can contain `${%s}` to be replaced with a unique id. + * If the template contains the "%s" placeholder, it will be replaced with the unique id otherwise the id will be appended to the template. + * + * @param options an object with the following properties: + * - template: a template string. + * - length: the length of the unique id as presented in hexadecimal. + */ + +export function uniqid(options?: { template?: string; length?: number }): string { + const uniqueString = randomBytes(Math.ceil((options?.length ?? 32) / 2)) + .toString('hex') + .slice(0, options?.length ?? 32); + if (!options?.template) { + return uniqueString; + } + return options.template.includes('%s') + ? util.format(options.template, uniqueString) + : `${options.template}${uniqueString}`; +} diff --git a/src/util/unwrapArray.ts b/src/util/unwrapArray.ts new file mode 100644 index 0000000000..cb7be7f4c5 --- /dev/null +++ b/src/util/unwrapArray.ts @@ -0,0 +1,12 @@ +/* + * Copyright (c) 2023, 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 + */ +export const unwrapArray = (args: unknown): unknown => { + if (Array.isArray(args) && args.length === 1) { + return Array.isArray(args[0]) ? unwrapArray(args[0]) : args[0]; + } + return args; +}; diff --git a/src/util/zipWriter.ts b/src/util/zipWriter.ts index 3f5d6e3411..c953034584 100644 --- a/src/util/zipWriter.ts +++ b/src/util/zipWriter.ts @@ -5,68 +5,51 @@ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause */ -import { createWriteStream, createReadStream } from 'fs'; -import { pipeline as cbPipeline, Readable, Writable } from 'stream'; -import { promisify } from 'util'; -import { Archiver, create as createArchive } from 'archiver'; +import { Readable, Writable } from 'node:stream'; +import JSZip from 'jszip'; +import { Logger } from '../logger/logger'; +import { SfError } from '../sfError'; import { StructuredWriter } from './structuredWriter'; -const pipeline = promisify(cbPipeline); - export class ZipWriter extends Writable implements StructuredWriter { - // compression-/speed+ (0)<---(3)---------->(9) compression+/speed- - // 3 appears to be a decent balance of compression and speed. It felt like - // higher values = diminishing returns on compression and made conversion slower - private zip: Archiver = createArchive('zip', { zlib: { level: 3 } }); - private buffers: Buffer[] = []; + private zip = JSZip(); + private zipBuffer?: Buffer; + private logger: Logger; public constructor(private readonly rootDestination?: string) { super({ objectMode: true }); - void pipeline(this.zip, this.getOutputStream()); + const destination = rootDestination ? `for: ${rootDestination}` : 'in memory'; + this.logger = Logger.childFromRoot(this.constructor.name); + this.logger.debug(`generating zip ${destination}`); } public get buffer(): Buffer { - return Buffer.concat(this.buffers); + if (!this.zipBuffer) { + throw new SfError('Must finalize the ZipWriter before getting a buffer'); + } + return this.zipBuffer; } public async addToStore(contents: string | Readable | Buffer, path: string): Promise { - this.zip.append(contents, { name: path }); + // Ensure only posix paths are added to zip files + const posixPath = path.replace(/\\/g, '/'); + this.zip.file(posixPath, contents); return Promise.resolve(); } public async finalize(): Promise { - await this.zip.finalize(); - await this.getInputBuffer(); + // compression-/speed+ (0)<---(3)---------->(9) compression+/speed- + // 3 appears to be a decent balance of compression and speed. It felt like + // higher values = diminishing returns on compression and made conversion slower + this.zipBuffer = await this.zip.generateAsync({ + type: 'nodebuffer', + compression: 'DEFLATE', + compressionOptions: { level: 3 }, + }); + this.logger.debug('Generated zip complete'); } public getDestinationPath(): string | undefined { return this.rootDestination; } - - private getOutputStream(): Writable { - if (this.rootDestination) { - return createWriteStream(this.rootDestination); - } else { - const bufferWritable = new Writable(); - // eslint-disable-next-line no-underscore-dangle - bufferWritable._write = (chunk: Buffer, encoding: string, cb: () => void): void => { - this.buffers.push(chunk); - cb(); - }; - return bufferWritable; - } - } - - private async getInputBuffer(): Promise { - if (this.rootDestination) { - const inputStream = createReadStream(this.rootDestination); - return new Promise((resolve, reject) => { - inputStream.on('data', (chunk: Buffer) => { - this.buffers.push(chunk); - }); - inputStream.once('end', () => resolve()); - inputStream.once('error', (error: Error) => reject(error)); - }); - } - } } diff --git a/src/webOAuthServer.ts b/src/webOAuthServer.ts index 7a5c8178fb..b1c77a4c37 100644 --- a/src/webOAuthServer.ts +++ b/src/webOAuthServer.ts @@ -7,22 +7,27 @@ /* eslint-disable class-methods-use-this */ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ -import * as http from 'http'; -import { parse as parseQueryString } from 'querystring'; -import { parse as parseUrl } from 'url'; -import { Socket } from 'net'; -import { JwtOAuth2Config, OAuth2 } from 'jsforce'; +import * as http from 'node:http'; +import { parse as parseQueryString } from 'node:querystring'; +import { parse as parseUrl } from 'node:url'; +import { Socket } from 'node:net'; +import { EventEmitter } from 'node:events'; +import { OAuth2 } from '@jsforce/jsforce-node'; import { AsyncCreatable, Env, set, toNumber } from '@salesforce/kit'; import { asString, get, Nullable } from '@salesforce/ts-types'; -import { Logger } from './logger'; -import { AuthInfo, DEFAULT_CONNECTED_APP_INFO } from './org'; +import { Logger } from './logger/logger'; +import { AuthInfo, DEFAULT_CONNECTED_APP_INFO } from './org/authInfo'; import { SfError } from './sfError'; import { Messages } from './messages'; import { SfProjectJson } from './sfProject'; +import { JwtOAuth2Config } from './org/authInfo'; Messages.importMessagesDirectory(__dirname); const messages = Messages.loadMessages('@salesforce/core', 'auth'); +// Server ignores requests for site icons +const iconPaths = ['/favicon.ico', '/apple-touch-icon-precomposed.png']; + /** * Handles the creation of a web server for web based login flows. * @@ -46,6 +51,7 @@ export class WebOAuthServer extends AsyncCreatable { private webServer!: WebServer; private oauth2!: OAuth2; private oauthConfig: JwtOAuth2Config; + private oauthError = new Error('Oauth Error'); public constructor(options: WebOAuthServer.Options) { super(options); @@ -94,11 +100,12 @@ export class WebOAuthServer extends AsyncCreatable { oauth2: this.oauth2, }); await authInfo.save(); - this.webServer.doRedirect(303, authInfo.getOrgFrontDoorUrl(), response); + await this.webServer.handleSuccess(response); response.end(); resolve(authInfo); } catch (err) { - this.webServer.reportError(err as Error, response); + this.oauthError = err as Error; + await this.webServer.handleError(response); reject(err); } }) @@ -134,6 +141,8 @@ export class WebOAuthServer extends AsyncCreatable { if (!this.oauthConfig.clientId) this.oauthConfig.clientId = DEFAULT_CONNECTED_APP_INFO.clientId; if (!this.oauthConfig.loginUrl) this.oauthConfig.loginUrl = AuthInfo.getDefaultInstanceUrl(); if (!this.oauthConfig.redirectUri) this.oauthConfig.redirectUri = `http://localhost:${port}/OauthRedirect`; + // Unless explicitly turned off, use a code verifier as a best practice + if (this.oauthConfig.useVerifier !== false) this.oauthConfig.useVerifier = true; this.webServer = await WebServer.create({ port }); this.oauth2 = new OAuth2(this.oauthConfig); @@ -148,40 +157,61 @@ export class WebOAuthServer extends AsyncCreatable { private async executeOauthRequest(): Promise { return new Promise((resolve, reject) => { this.logger.debug('Starting web auth flow'); - // eslint-disable-next-line @typescript-eslint/no-misused-promises, @typescript-eslint/no-explicit-any, @typescript-eslint/require-await - this.webServer.server.on('request', async (request: any, response) => { - // eslint-disable-next-line @typescript-eslint/no-unsafe-argument - const url = parseUrl(request.url); - this.logger.debug(`processing request for uri: ${url.pathname as string}`); - if (request.method === 'GET') { - if (url.pathname?.startsWith('/OauthRedirect')) { - request.query = parseQueryString(url.query as string); - if (request.query.error) { - // eslint-disable-next-line @typescript-eslint/no-unsafe-argument - const err = new SfError(request.query.error_description ?? request.query.error, request.query.error); - this.webServer.reportError(err, response); - return reject(err); - } - this.logger.debug(`request.query.state: ${request.query.state as string}`); - try { - // eslint-disable-next-line @typescript-eslint/no-unsafe-argument - this.oauthConfig.authCode = asString(this.parseAuthCodeFromRequest(response, request)); - resolve(response); - } catch (err) { - reject(err); + // - async method when sync expected + // eslint-disable-next-line @typescript-eslint/no-misused-promises + this.webServer.server.on('request', async (request: WebOAuthServer.Request, response) => { + if (request.url) { + const url = parseUrl(request.url); + this.logger.debug(`processing request for uri: ${url.pathname}`); + if (request.method === 'GET') { + if (url.pathname?.startsWith('/OauthRedirect') && url.query) { + // eslint-disable-next-line no-param-reassign + request.query = parseQueryString(url.query) as { + code: string; + state: string; + error?: string | undefined; + error_description?: string; + }; + if (request.query.error) { + const errorName: string = + typeof request.query.error_description === 'string' + ? request.query.error_description + : request.query.error; + this.oauthError = new SfError(errorName, request.query.error); + await this.webServer.handleError(response); + return reject(this.oauthError); + } + this.logger.debug(`request.query.state: ${request.query.state}`); + try { + this.oauthConfig.authCode = asString(this.parseAuthCodeFromRequest(response, request)); + resolve(response); + } catch (err) { + reject(err); + } + } else if (url.pathname === '/OauthSuccess') { + this.webServer.reportSuccess(response); + } else if (url.pathname === '/OauthError') { + this.webServer.reportError(this.oauthError, response); + } else if (iconPaths.includes(url.pathname ?? '')) { + this.logger.debug(`Ignoring request for icon path: ${url.pathname}`); + } else { + this.webServer.sendError(404, 'Resource not found', response); + const errName = 'invalidRequestUri'; + const errMessage = messages.getMessage(errName, [url.pathname]); + reject(new SfError(errMessage, errName)); } + } else if ( + request.method === 'OPTIONS' && + request.headers['access-control-request-private-network'] === 'true' && + request.headers['access-control-request-method'] + ) { + this.webServer.handlePreflightRequest(response); } else { - this.webServer.sendError(404, 'Resource not found', response); - const errName = 'invalidRequestUri'; - const errMessage = messages.getMessage(errName, [url.pathname]); + this.webServer.sendError(405, 'Unsupported http methods', response); + const errName = 'invalidRequestMethod'; + const errMessage = messages.getMessage(errName, [request.method]); reject(new SfError(errMessage, errName)); } - } else { - this.webServer.sendError(405, 'Unsupported http methods', response); - const errName = 'invalidRequestMethod'; - // eslint-disable-next-line @typescript-eslint/no-unsafe-argument - const errMessage = messages.getMessage(errName, [request.method]); - reject(new SfError(errMessage, errName)); } }); }); @@ -197,7 +227,7 @@ export class WebOAuthServer extends AsyncCreatable { private parseAuthCodeFromRequest(response: http.ServerResponse, request: WebOAuthServer.Request): Nullable { if (!this.validateState(request)) { const error = new SfError('urlStateMismatch'); - this.webServer.sendError(400, `${error.message}\n`, response); + this.webServer.sendError(400, error.message, response); this.closeRequest(request); this.logger.warn('urlStateMismatchAttempt detected.'); if (!get(this.webServer.server, 'urlStateMismatchAttempt')) { @@ -216,6 +246,7 @@ export class WebOAuthServer extends AsyncCreatable { this.logger.debug(`oauthConfig.loginUrl: ${this.oauthConfig.loginUrl}`); this.logger.debug(`oauthConfig.clientId: ${this.oauthConfig.clientId}`); this.logger.debug(`oauthConfig.redirectUri: ${this.oauthConfig.redirectUri}`); + this.logger.debug(`oauthConfig.useVerifier: ${this.oauthConfig.useVerifier}`); return authCode; } return null; @@ -245,23 +276,26 @@ export class WebOAuthServer extends AsyncCreatable { } export namespace WebOAuthServer { - export interface Options { + export type Options = { oauthConfig: JwtOAuth2Config; - } + }; - export type Request = http.IncomingMessage & { query: { code: string; state: string } }; + export type Request = http.IncomingMessage & { + query: { code: string; state: string; error?: string; error_description?: string }; + }; } /** * Handles the actions specific to the http server */ export class WebServer extends AsyncCreatable { - public static DEFAULT_CLIENT_SOCKET_TIMEOUT = 20000; + public static DEFAULT_CLIENT_SOCKET_TIMEOUT = 20_000; public server!: http.Server; public port = WebOAuthServer.DEFAULT_PORT; public host = 'localhost'; private logger!: Logger; private sockets: Socket[] = []; + private redirectStatus = new EventEmitter(); public constructor(options: WebServer.Options) { super(options); @@ -312,12 +346,14 @@ export class WebServer extends AsyncCreatable { /** * sends a response error. * - * @param statusCode he statusCode for the response. + * @param status the statusCode for the response. * @param message the message for the http body. * @param response the response to write the error to. */ public sendError(status: number, message: string, response: http.ServerResponse): void { + // eslint-disable-next-line no-param-reassign response.statusMessage = message; + // eslint-disable-next-line no-param-reassign response.statusCode = status; response.end(); } @@ -325,11 +361,12 @@ export class WebServer extends AsyncCreatable { /** * sends a response redirect. * - * @param statusCode the statusCode for the response. + * @param status the statusCode for the response. * @param url the url to redirect to. * @param response the response to write the redirect to. */ public doRedirect(status: number, url: string, response: http.ServerResponse): void { + this.logger.debug(`Redirecting to ${url}`); response.setHeader('Content-Type', 'text/plain'); const body = `${status} - Redirecting to ${url}`; response.setHeader('Content-Length', Buffer.byteLength(body)); @@ -340,20 +377,76 @@ export class WebServer extends AsyncCreatable { /** * sends a response to the browser reporting an error. * - * @param error the error - * @param response the response to write the redirect to. + * @param error the oauth error + * @param response the HTTP response. */ public reportError(error: Error, response: http.ServerResponse): void { response.setHeader('Content-Type', 'text/html'); - const body = messages.getMessage('serverErrorHTMLResponse', [error.message]); - response.setHeader('Content-Length', Buffer.byteLength(body)); + const currentYear = new Date().getFullYear(); + const encodedImg = messages.getMessage('serverSfdcImage'); + const body = messages.getMessage('serverErrorHTMLResponse', [encodedImg, error.name, error.message, currentYear]); + response.setHeader('Content-Length', Buffer.byteLength(body, 'utf8')); + response.end(body); + if (error.stack) { + this.logger.debug(error.stack); + } + this.redirectStatus.emit('complete'); + } + + /** + * sends a response to the browser reporting the success. + * + * @param response the HTTP response. + */ + public reportSuccess(response: http.ServerResponse): void { + response.setHeader('Content-Type', 'text/html'); + const currentYear = new Date().getFullYear(); + const encodedImg = messages.getMessage('serverSfdcImage'); + const body = messages.getMessage('serverSuccessHTMLResponse', [encodedImg, currentYear]); + response.setHeader('Content-Length', Buffer.byteLength(body, 'utf8')); response.end(body); + this.redirectStatus.emit('complete'); + } + + /** + * Preflight request: + * + * https://developer.mozilla.org/en-US/docs/Glossary/Preflight_request + * https://www.w3.org/TR/2020/SPSD-cors-20200602/#resource-preflight-requests + */ + public handlePreflightRequest(response: http.ServerResponse): void { + // We don't validate the origin here because: + // 1. The default login URL (login.salesforce.com) will not match after a redirect or if user choose a custom domain in login. + // 2. There's no fixed list of auth URLs we could check against. + // eslint-disable-next-line no-param-reassign + response.statusCode = 204; // No Content response + response.setHeader('Access-Control-Allow-Methods', 'GET'); + response.setHeader('Access-Control-Request-Headers', 'GET'); + response.end(); + } + + public async handleSuccess(response: http.ServerResponse): Promise { + return this.handleRedirect(response, '/OauthSuccess'); + } + + public async handleError(response: http.ServerResponse): Promise { + return this.handleRedirect(response, '/OauthError'); } protected async init(): Promise { this.logger = await Logger.child(this.constructor.name); } + private async handleRedirect(response: http.ServerResponse, url: '/OauthSuccess' | '/OauthError'): Promise { + return new Promise((resolve) => { + this.redirectStatus.on('complete', () => { + this.logger.debug('Redirect complete'); + resolve(); + }); + this.doRedirect(303, url, response); + }); + } + /** * Make sure we can't open a socket on the localhost/host port. It's important because we don't want to send * auth tokens to a random strange port listener. We want to make sure we can startup our server first. @@ -407,8 +500,8 @@ export class WebServer extends AsyncCreatable { } namespace WebServer { - export interface Options { + export type Options = { port?: number; host?: string; - } + }; } diff --git a/test/.eslintrc.js b/test/.eslintrc.cjs similarity index 97% rename from test/.eslintrc.js rename to test/.eslintrc.cjs index f1c7d4ff18..43cb31b5c2 100644 --- a/test/.eslintrc.js +++ b/test/.eslintrc.cjs @@ -9,7 +9,7 @@ // See more at https://github.com/forcedotcom/sfdx-dev-packages/tree/master/packages/dev-scripts module.exports = { - extends: '../.eslintrc.js', + extends: '../.eslintrc.cjs', // Allow describe and it env: { mocha: true }, rules: { diff --git a/test/perf/logger/main.test.ts b/test/perf/logger/main.test.ts new file mode 100644 index 0000000000..11b1ad04a7 --- /dev/null +++ b/test/perf/logger/main.test.ts @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2023, 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 { Suite } from 'benchmark'; +import { Logger } from '../../../src'; +import { cleanup } from '../../../src/logger/cleanup'; + +const suite = new Suite(); + +const logger = new Logger('Benchmarks'); + +// add tests +suite + .add('Child logger creation', () => { + Logger.childFromRoot('benchmarkChild'); + }) + .add('Logging a string on root logger', () => { + logger.warn('this is a string'); + }) + .add('Logging an object on root logger', () => { + logger.warn({ foo: 1, bar: 2, baz: 3 }); + }) + .add('Logging an object with a message on root logger', () => { + logger.warn({ foo: 1, bar: 2, baz: 3 }, 'this is a message'); + }) + .add('Logging an object with a redacted prop on root logger', () => { + logger.warn({ foo: 1, bar: 2, accessToken: '00D' }); + }) + .add('Logging a nested 3-level object on root logger', () => { + logger.warn({ foo: 1, bar: 2, baz: { foo: 1, bar: 2, baz: { foo: 1, bar: 2, baz: 3 } } }); + }) + // add listeners + .on('cycle', (event: any) => { + // eslint-disable-next-line no-console, @typescript-eslint/no-unsafe-member-access + console.log(String(event.target)); + }) + .on('complete', async () => { + // will clear sf log files, since this generates a LOT of them! + await cleanup(0, true); + }) + .run({ async: true }); diff --git a/test/tsconfig.json b/test/tsconfig.json index 4cd4d8cb7c..d1a7d129dd 100644 --- a/test/tsconfig.json +++ b/test/tsconfig.json @@ -1,9 +1,14 @@ { "extends": "@salesforce/dev-config/tsconfig-test-strict", - "include": ["unit/**/*.ts"], + "include": ["unit/**/*.ts", "perf/**/*.ts"], "compilerOptions": { "noEmit": true, "skipLibCheck": true, - "resolveJsonModule": true + "resolveJsonModule": true, + "esModuleInterop": true, + "lib": ["ES2022"], + "module": "Node16", + "moduleResolution": "Node16", + "target": "ES2022" } } diff --git a/test/unit/config/configAggregatorTest.ts b/test/unit/config/configAggregatorTest.ts index da7d37e03a..3f5acb273e 100644 --- a/test/unit/config/configAggregatorTest.ts +++ b/test/unit/config/configAggregatorTest.ts @@ -6,22 +6,36 @@ */ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ /* eslint-disable @typescript-eslint/no-unsafe-call */ -import * as fs from 'fs'; -import { assert, expect } from 'chai'; -import { Config, ConfigProperties } from '../../../src/config/config'; -import { ConfigAggregator } from '../../../src/config/configAggregator'; +import fs from 'node:fs'; +import { assert, expect, config as chaiConfig } from 'chai'; +import { Config, ConfigProperties, SFDX_ALLOWED_PROPERTIES, SfdxPropertyKeys } from '../../../src/config/config'; +import { ConfigAggregator, ConfigInfo } from '../../../src/config/configAggregator'; import { ConfigFile } from '../../../src/config/configFile'; -import { OrgConfigProperties } from '../../../src/exported'; +import { Messages, OrgConfigProperties, Lifecycle, ORG_CONFIG_ALLOWED_PROPERTIES } from '../../../src'; import { TestContext } from '../../../src/testSetup'; -const testEnvVars = ['SF_TARGET_ORG', 'SFDX_MAX_QUERY_LIMIT']; +// if you add to this, make sure you use both the old and new name +const testEnvVars = ['SF_TARGET_ORG', 'SFDX_MAX_QUERY_LIMIT', 'SF_ORG_MAX_QUERY_LIMIT', 'SFDX_DEFAULTUSERNAME']; + +chaiConfig.truncateThreshold = 0; + +Messages.importMessagesDirectory(__dirname); +const messages = Messages.loadMessages('@salesforce/core', 'config'); +const envMessages = Messages.loadMessages('@salesforce/core', 'envVars'); + +const telemetryConfigFilter = (i: ConfigInfo) => i.key !== 'disable-telemetry'; describe('ConfigAggregator', () => { let id: string; + let warnStub: sinon.SinonStub; + const $$ = new TestContext(); + beforeEach(() => { // Testing config functionality, so restore global stubs. $$.SANDBOXES.CONFIG.restore(); + $$.SANDBOX.stub(Lifecycle, 'getInstance').returns(Lifecycle.prototype); + warnStub = $$.SANDBOX.stub(Lifecycle.prototype, 'emitWarning'); id = $$.uniqid(); $$.SANDBOX.stub(ConfigFile, 'resolveRootFolder').callsFake((isGlobal: boolean) => @@ -38,95 +52,11 @@ describe('ConfigAggregator', () => { } }); - describe('instantiation', () => { - it('creates local and global config', async () => { - const aggregator = await ConfigAggregator.create(); - expect(aggregator.getLocalConfig()).to.be.exist; - expect(aggregator.getGlobalConfig()).to.be.exist; - }); - - it('converts env vars', async () => { - process.env.SF_TARGET_ORG = 'test'; - const aggregator = await ConfigAggregator.create(); - expect(aggregator.getPropertyValue(OrgConfigProperties.TARGET_ORG)).to.equal('test'); - }); - - it('converts env var synonyms (sfdx -> sf)', async () => { - process.env.SFDX_MAX_QUERY_LIMIT = '5'; - const aggregator = await ConfigAggregator.create(); - expect(aggregator.getPropertyValue(OrgConfigProperties.ORG_MAX_QUERY_LIMIT)).to.equal('5'); - }); - - it('constructor creates local and global config', async () => { - const aggregator = await ConfigAggregator.create(); - expect(aggregator.getLocalConfig()).to.be.exist; - expect(aggregator.getGlobalConfig()).to.be.exist; - }); - - describe('with no workspace', () => { - it('does not have a local config', async () => { - try { - // Should not throw - await ConfigAggregator.create(); - } catch (err) { - assert.fail('expected an error to be thrown'); - } - }); - }); - }); - - it('static getter', async () => { - const expected = '49.0'; - $$.SANDBOX.stub(Config.prototype, 'readSync').returns({ 'org-api-version': expected }); - expect(ConfigAggregator.getValue(OrgConfigProperties.ORG_API_VERSION).value, expected); - }); - - it('reload decrypts config values', async () => { - // readSync doesn't decrypt values - $$.SANDBOX.stub(Config.prototype, 'readSync').callsFake(function () { - // @ts-expect-error this is any - this.setContents({ 'org-isv-debugger-sid': 'encrypted' }); - // @ts-expect-error this is any - // eslint-disable-next-line @typescript-eslint/no-unsafe-return - return this.getContents(); - }); - // read decrypts values - $$.SANDBOX.stub(Config.prototype, 'read').callsFake(async function () { - // @ts-expect-error this is any - this.setContents({ 'org-isv-debugger-sid': 'decrypted' }); - // @ts-expect-error this is any - // eslint-disable-next-line @typescript-eslint/no-unsafe-return - return this.getContents(); - }); - - // @ts-expect-error because private method - const aggregator = ConfigAggregator.getInstance(); - expect(aggregator.getInfo('org-isv-debugger-sid').value).to.equal('encrypted'); - await aggregator.reload(); - expect(aggregator.getInfo('org-isv-debugger-sid').value).to.equal('decrypted'); - }); - - describe('initialization', () => { + describe('locations', () => { beforeEach(() => { - $$.SANDBOX.stub(Config.prototype, 'read').callsFake(async function (this: Config) { - const config: ConfigProperties = this.isGlobal() ? { 'target-org': 2 } : { 'target-org': 1 }; - this.setContents(config); - return config; - }); - }); - it('local overrides global', async () => { - const aggregator = await ConfigAggregator.create(); - expect(aggregator.getPropertyValue(OrgConfigProperties.TARGET_ORG)).to.equal(1); - }); - - it('env overrides local and global', async () => { - process.env.SF_TARGET_ORG = 'test'; - const aggregator = await ConfigAggregator.create(); - expect(aggregator.getPropertyValue(OrgConfigProperties.TARGET_ORG)).to.equal('test'); + // @ts-expect-error there's a lot more properties we're not mocking + $$.SANDBOX.stub(fs.promises, 'stat').resolves({ mtimeNs: BigInt(new Date().valueOf() - 1000 * 60 * 5) }); }); - }); - - describe('locations', () => { it('local', async () => { // @ts-expect-error async function signature not quite same as expected $$.SANDBOX.stub(fs.promises, 'readFile').callsFake(async (path: string) => { @@ -182,7 +112,7 @@ describe('ConfigAggregator', () => { $$.SANDBOX.stub(fs, 'readFile').resolves({}); const aggregator = await ConfigAggregator.create(); - const info = aggregator.getConfigInfo()[0]; + const info = aggregator.getConfigInfo().filter(telemetryConfigFilter)[0]; expect(info.key).to.equal('target-org'); expect(info.value).to.equal('test'); expect(info.location).to.equal('Environment'); @@ -192,10 +122,212 @@ describe('ConfigAggregator', () => { $$.SANDBOX.stub(fs.promises, 'readFile').resolves('{ "invalid": "entry", "org-api-version": 49.0 }'); const aggregator = await ConfigAggregator.create(); - const info = aggregator.getConfigInfo()[0]; + const info = aggregator.getConfigInfo().filter(telemetryConfigFilter)[0]; expect(info.key).to.equal('org-api-version'); expect(info.value).to.equal(49.0); expect(info.location).to.equal('Local'); }); }); + + describe('initialization', () => { + beforeEach(() => { + $$.SANDBOX.stub(Config.prototype, 'read').callsFake(async function (this: Config) { + const config: ConfigProperties = this.isGlobal() ? { 'target-org': 2 } : { 'target-org': 1 }; + this.setContents(config); + return config; + }); + }); + it('local overrides global', async () => { + const aggregator = await ConfigAggregator.create(); + expect(aggregator.getPropertyValue(OrgConfigProperties.TARGET_ORG)).to.equal(1); + }); + + it('env overrides local and global', async () => { + process.env.SF_TARGET_ORG = 'test'; + const aggregator = await ConfigAggregator.create(); + expect(aggregator.getPropertyValue(OrgConfigProperties.TARGET_ORG)).to.equal('test'); + }); + }); + + describe('instantiation', () => { + it('creates local and global config', async () => { + const aggregator = await ConfigAggregator.create(); + expect(aggregator.getLocalConfig()).to.exist; + expect(aggregator.getGlobalConfig()).to.exist; + }); + + it('converts env vars', async () => { + process.env.SF_TARGET_ORG = 'test'; + const aggregator = await ConfigAggregator.create(); + expect(aggregator.getPropertyValue(OrgConfigProperties.TARGET_ORG)).to.equal('test'); + }); + + it('converts env var synonyms (sfdx -> sf)', async () => { + process.env.SFDX_MAX_QUERY_LIMIT = '5'; + const aggregator = await ConfigAggregator.create(); + expect(aggregator.getPropertyValue(OrgConfigProperties.ORG_MAX_QUERY_LIMIT)).to.equal('5'); + expect(warnStub.getCalls().flatMap((call) => call.args as string[])).to.deep.include( + envMessages.getMessage('deprecatedEnv', ['SFDX_MAX_QUERY_LIMIT', 'SF_ORG_MAX_QUERY_LIMIT']) + ); + }); + + it('converts env var synonyms (sf -> sfdx)', async () => { + process.env.SF_ORG_MAX_QUERY_LIMIT = '5'; + const aggregator = await ConfigAggregator.create(); + expect(aggregator.getPropertyValue(SfdxPropertyKeys.MAX_QUERY_LIMIT)).to.equal('5'); + expect(warnStub.getCalls().flatMap((call) => call.args as string[])).to.deep.include( + messages.getMessage('deprecatedConfigKey', [SfdxPropertyKeys.MAX_QUERY_LIMIT, 'org-max-query-limit']) + ); + }); + + it('both versions of an env and they match', async () => { + process.env.SF_ORG_MAX_QUERY_LIMIT = '5'; + process.env.SFDX_MAX_QUERY_LIMIT = '5'; + const aggregator = await ConfigAggregator.create(); + expect(aggregator.getPropertyValue(OrgConfigProperties.ORG_MAX_QUERY_LIMIT)).to.equal('5'); + expect(warnStub.callCount).to.equal(0); + }); + + it('when both versions of an envs are present, sf wins when asked for old name', async () => { + process.env.SF_ORG_MAX_QUERY_LIMIT = '5'; + process.env.SFDX_MAX_QUERY_LIMIT = '4'; + const aggregator = await ConfigAggregator.create(); + expect(aggregator.getPropertyValue(SfdxPropertyKeys.MAX_QUERY_LIMIT)).to.equal('5'); + expect(warnStub.getCalls().flatMap((call) => call.args as string[])).to.deep.include( + messages.getMessage('deprecatedConfigKey', [SfdxPropertyKeys.MAX_QUERY_LIMIT, 'org-max-query-limit']) + ); + expect(warnStub.getCalls().flatMap((call) => call.args as string[])).to.deep.include( + envMessages.getMessage('deprecatedEnvDisagreement', [ + 'SFDX_MAX_QUERY_LIMIT', + 'SF_ORG_MAX_QUERY_LIMIT', + 'SF_ORG_MAX_QUERY_LIMIT', + ]) + ); + }); + + it('when both versions of an envs are present, sf wins when asked for new name', async () => { + process.env.SF_ORG_MAX_QUERY_LIMIT = '5'; + process.env.SFDX_MAX_QUERY_LIMIT = '4'; + const aggregator = await ConfigAggregator.create(); + expect(aggregator.getPropertyValue(OrgConfigProperties.ORG_MAX_QUERY_LIMIT)).to.equal('5'); + expect(warnStub.getCalls().flatMap((call) => call.args as string[])).to.deep.include( + envMessages.getMessage('deprecatedEnvDisagreement', [ + 'SFDX_MAX_QUERY_LIMIT', + 'SF_ORG_MAX_QUERY_LIMIT', + 'SF_ORG_MAX_QUERY_LIMIT', + ]) + ); + expect(warnStub.callCount).to.equal(1); + }); + + it('constructor creates local and global config', async () => { + const aggregator = await ConfigAggregator.create(); + expect(aggregator.getLocalConfig()).to.exist; + expect(aggregator.getGlobalConfig()).to.exist; + }); + + describe('with no workspace', () => { + it('does not have a local config', async () => { + try { + // Should not throw + await ConfigAggregator.create(); + } catch (err) { + assert.fail('expected an error to be thrown'); + } + }); + }); + it('reload decrypts config values', async () => { + // readSync doesn't decrypt values + $$.SANDBOX.stub(Config.prototype, 'readSync').callsFake(function () { + // @ts-expect-error this is any + this.setContents({ 'org-isv-debugger-sid': 'encrypted' }); + // @ts-expect-error this is any + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return this.getContents(); + }); + // read decrypts values + $$.SANDBOX.stub(Config.prototype, 'read').callsFake(async function () { + // @ts-expect-error this is any + this.setContents({ 'org-isv-debugger-sid': 'decrypted' }); + // @ts-expect-error this is any + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return this.getContents(); + }); + + // @ts-expect-error because private method + const aggregator = ConfigAggregator.getInstance(); + expect(aggregator.getInfo('org-isv-debugger-sid').value).to.equal('encrypted'); + await aggregator.reload(); + expect(aggregator.getInfo('org-isv-debugger-sid').value).to.equal('decrypted'); + }); + }); + + describe('static getter', () => { + it('request by current key', async () => { + const expected = '47.0'; + $$.SANDBOX.stub(Config.prototype, 'readSync').returns({ 'org-api-version': expected }); + expect(ConfigAggregator.getValue(OrgConfigProperties.ORG_API_VERSION)?.value, expected); + }); + + it('request by current key matches value stored under old key', async () => { + const expected = '48.0'; + $$.SANDBOX.stub(Config.prototype, 'readSync').returns({ apiVersion: expected }); + expect(ConfigAggregator.getValue(OrgConfigProperties.ORG_API_VERSION)?.value, expected); + }); + + it('request by old key matches value stored under current key', async () => { + const expected = '49.0'; + $$.SANDBOX.stub(Config.prototype, 'readSync').returns({ 'org-api-version': expected }); + expect(ConfigAggregator.getValue(SfdxPropertyKeys.API_VERSION)?.value, expected); + }); + + it('request by old key matches new when both new and old are present', async () => { + const expected = '50.0'; + $$.SANDBOX.stub(Config.prototype, 'readSync').returns({ 'org-api-version': expected, apiVersion: '50.0' }); + expect(ConfigAggregator.getValue(SfdxPropertyKeys.API_VERSION)?.value, expected); + }); + + it('request by new key matches new when both new and old are present', async () => { + const expected = '51.0'; + $$.SANDBOX.stub(Config.prototype, 'readSync').returns({ 'org-api-version': expected, apiVersion: '50.0' }); + expect(ConfigAggregator.getValue(OrgConfigProperties.ORG_API_VERSION)?.value, expected); + }); + }); + + describe('getPropertyMeta', () => { + it('key is current, has matching meta', async () => { + const aggregator = await ConfigAggregator.create(); + expect(aggregator.getPropertyMeta(OrgConfigProperties.ORG_API_VERSION)).to.equal( + ORG_CONFIG_ALLOWED_PROPERTIES.find((meta) => meta.key === OrgConfigProperties.ORG_API_VERSION) + ); + expect(warnStub.callCount).to.equal(0); + }); + it('key is deprecated, has matching meta', async () => { + const aggregator = await ConfigAggregator.create(); + expect(aggregator.getPropertyMeta(SfdxPropertyKeys.INSTANCE_URL)).to.equal( + SFDX_ALLOWED_PROPERTIES.find((meta) => meta.key === SfdxPropertyKeys.INSTANCE_URL) + ); + expect(warnStub.callCount).to.equal(1); + }); + describe('old key is known, new key comes from outside sfdx-core, but has matching meta for old key', () => { + it('permanent generic example', async () => { + // this scenario happens for 'org-metadata-rest-deploy' because 'restDeploy' is still in core, and knows its new key, + // but that config lives in PDR + // we want to fall back to avoid "Error (1): Unknown config name: org-metadata-rest-deploy." + const aggregator = await ConfigAggregator.create(); + // simulate 'restDeploy` + const oldConfigMeta = { key: 'oldProp', deprecated: true, newKey: 'newProp', description: 'whatever' }; + aggregator.addAllowedProperties([oldConfigMeta]); + expect(aggregator.getPropertyMeta('newProp')).to.equal(oldConfigMeta); + expect(warnStub.callCount).to.equal(0); + }); + it('org-metadata-rest-deploy finds restDeploy', async () => { + const aggregator = await ConfigAggregator.create(); + expect(aggregator.getPropertyMeta('org-metadata-rest-deploy')).to.equal( + SFDX_ALLOWED_PROPERTIES.find((meta) => meta.key === SfdxPropertyKeys.REST_DEPLOY) + ); + expect(warnStub.callCount).to.equal(0); + }); + }); + }); }); diff --git a/test/unit/config/configFileConcurrency.test.ts b/test/unit/config/configFileConcurrency.test.ts new file mode 100644 index 0000000000..8314b8a879 --- /dev/null +++ b/test/unit/config/configFileConcurrency.test.ts @@ -0,0 +1,193 @@ +/* + * Copyright (c) 2023, 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 { join } from 'node:path'; +import { tmpdir } from 'node:os'; +import { rm } from 'node:fs/promises'; +import { expect } from 'chai'; +import { sleep } from '@salesforce/kit'; +import { ConfigFile } from '../../../src'; + +const FILENAME = 'concurrency.json'; +const sharedLocation = join('sfdx-core-ut', 'test', 'configFile'); + +class TestConfig extends ConfigFile { + public static getOptions( + filename: string, + isGlobal: boolean, + isState?: boolean, + filePath?: string + ): ConfigFile.Options { + return { + rootFolder: tmpdir(), + filename, + isGlobal, + isState, + filePath, + }; + } + + public static getFileName() { + return FILENAME; + } +} + +/* file and node - clock timestamps aren't precise enough to run in a UT. + * the goal of this and the `sleep` is to put a bit of space between operations + * to simulate real-world concurrency where it's unlikely to hit the same ms + */ +const SLEEP_FUDGE_MS = 5; + +describe('concurrency', () => { + beforeEach(async () => { + await rm(join(tmpdir(), '.sfdx', 'sfdx-core-ut'), { recursive: true, force: true }); + }); + afterEach(async () => { + await rm(join(tmpdir(), '.sfdx', 'sfdx-core-ut'), { recursive: true, force: true }); + }); + + it('merges in new props from file saved since a prop was set in memory', async () => { + const config1 = new TestConfig(TestConfig.getOptions(FILENAME, true, true, sharedLocation)); + config1.set('x', 0); + await sleep(SLEEP_FUDGE_MS); + const config2 = new TestConfig(TestConfig.getOptions(FILENAME, true, true, sharedLocation)); + config2.set('x', 1); + await config2.write(); + + const c1output = await config1.write(); + expect(c1output.x).to.equal(1); + }); + + it('newer props beat older files', async () => { + const config1 = new TestConfig(TestConfig.getOptions(FILENAME, true, true, sharedLocation)); + + const config2 = new TestConfig(TestConfig.getOptions(FILENAME, true, true, sharedLocation)); + config2.set('x', 1); + await config2.write(); + await sleep(SLEEP_FUDGE_MS); + + config1.set('x', 0); + await sleep(SLEEP_FUDGE_MS); + + const c1output = await config1.write(); + expect(c1output.x).to.equal(0); + }); + + it('"deleted" (missing) props in a file do not delete from contents"', async () => { + const config1 = new TestConfig(TestConfig.getOptions(FILENAME, true, true, sharedLocation)); + config1.set('x', 0); + await sleep(SLEEP_FUDGE_MS); + + const config2 = new TestConfig(TestConfig.getOptions(FILENAME, true, true, sharedLocation)); + config2.set('x', 1); + config2.unset('x'); + await sleep(SLEEP_FUDGE_MS); + + await config2.write(); + await sleep(SLEEP_FUDGE_MS); + + const c1output = await config1.write(); + expect(c1output.x).to.equal(0); + }); + + it('newer deleted props beat older files', async () => { + const config1 = new TestConfig(TestConfig.getOptions(FILENAME, true, true, sharedLocation)); + config1.set('x', 0); + await sleep(SLEEP_FUDGE_MS); + + const config2 = new TestConfig(TestConfig.getOptions(FILENAME, true, true, sharedLocation)); + config2.set('x', 1); + + await config2.write(); + await sleep(SLEEP_FUDGE_MS); + + config1.unset('x'); + + const c1output = await config1.write(); + expect(c1output.x).to.equal(undefined); + }); + + it('deleted in both memory and file', async () => { + const config1 = new TestConfig(TestConfig.getOptions(FILENAME, true, true, sharedLocation)); + config1.set('x', 0); + await sleep(SLEEP_FUDGE_MS); + + const config2 = new TestConfig(TestConfig.getOptions(FILENAME, true, true, sharedLocation)); + config2.set('x', 1); + + await config2.write(); + await sleep(SLEEP_FUDGE_MS); + + config2.unset('x'); + await config2.write(); + + await sleep(SLEEP_FUDGE_MS); + config1.unset('x'); + + const c1output = await config1.write(); + expect(c1output.x).to.equal(undefined); + }); + + it('parallel writes from different processes produce valid json when file exists', async () => { + const config1 = new TestConfig(TestConfig.getOptions(FILENAME, true, true, sharedLocation)); + await config1.write(); + const config2 = new TestConfig(TestConfig.getOptions(FILENAME, true, true, sharedLocation)); + const config3 = new TestConfig(TestConfig.getOptions(FILENAME, true, true, sharedLocation)); + const config4 = new TestConfig(TestConfig.getOptions(FILENAME, true, true, sharedLocation)); + + config1.set('x', 0); + await sleep(SLEEP_FUDGE_MS); + config2.set('x', 1); + config2.set('b', 2); + await sleep(SLEEP_FUDGE_MS); + config3.set('x', 2); + config3.set('c', 3); + await sleep(SLEEP_FUDGE_MS); + config4.set('x', 3); + await sleep(SLEEP_FUDGE_MS); + + // simulate non-deterministic parallel operations from different processes. We can't guarantee the order of files, + // so this might result in a set prop being deleted. + await Promise.all([config1.write(), config2.write(), config3.write(), config4.write()]); + await Promise.all([config1.read(), config2.read(), config3.read(), config4.read()]); + // timestamps on the files are treated as the stamp for all props, + // since we lose the CRDT prop - level timestamps when writing to json + expect(config1.get('x')).to.be.greaterThanOrEqual(0).and.lessThanOrEqual(3); + if (config1.has('b')) { + expect(config1.get('b')).to.equal(2); + } + if (config1.has('c')) { + expect(config1.get('c')).to.equal(3); + } + if (config2.has('b')) { + expect(config2.get('b')).to.equal(2); + } + if (config2.has('c')) { + expect(config2.get('c')).to.equal(3); + } + }); + + it('parallel writes, reverse order, with deletes', async () => { + const config1 = new TestConfig(TestConfig.getOptions('test', true, true, sharedLocation)); + const config2 = new TestConfig(TestConfig.getOptions('test', true, true, sharedLocation)); + const config3 = new TestConfig(TestConfig.getOptions('test', true, true, sharedLocation)); + const config4 = new TestConfig(TestConfig.getOptions('test', true, true, sharedLocation)); + + config1.set('x', 7); + await sleep(SLEEP_FUDGE_MS); + config2.set('x', 8); + await sleep(SLEEP_FUDGE_MS); + config3.set('x', 9); + await sleep(SLEEP_FUDGE_MS); + config4.unset('x'); + + await Promise.all([config4.write(), config3.write(), config2.write(), config1.write()]); + await Promise.all([config1.read(), config2.read(), config3.read(), config4.read()]); + if (config4.has('x')) { + expect(config4.get('x')).to.be.greaterThanOrEqual(7).and.lessThanOrEqual(9); + } + }); +}); diff --git a/test/unit/config/configFileTest.ts b/test/unit/config/configFileTest.ts index 5e806d58a5..84140262c8 100644 --- a/test/unit/config/configFileTest.ts +++ b/test/unit/config/configFileTest.ts @@ -7,13 +7,14 @@ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ /* eslint-disable @typescript-eslint/no-unsafe-call */ -import * as Path from 'path'; -import * as fs from 'fs'; +import Path from 'node:path'; +import fs from 'node:fs'; import { expect } from 'chai'; import { assert } from '@salesforce/ts-types'; +import lockfileLib from 'proper-lockfile'; import { ConfigFile } from '../../../src/config/configFile'; -import { SfError } from '../../../src/exported'; +import { SfError } from '../../../src'; import { shouldThrow, TestContext } from '../../../src/testSetup'; describe('Config', () => { @@ -205,196 +206,217 @@ describe('Config', () => { $$.SANDBOXES.CONFIG.restore(); }); it('uses passed in contents', async () => { - // const mkdirpStub = $$.SANDBOX.stub(mkdirp, 'native'); + $$.SANDBOX.stub(fs.promises, 'readFile').resolves('{}'); + // @ts-expect-error --> we're only mocking on prop of many + $$.SANDBOX.stub(fs.promises, 'stat').resolves({ mtimeNs: BigInt(Date.now() - 1000 * 60 * 5) }); + $$.SANDBOX.stub(fs.promises, 'mkdir').resolves(); + const lockStub = $$.SANDBOX.stub(lockfileLib, 'lock').resolves(() => Promise.resolve()); + const writeJson = $$.SANDBOX.stub(fs.promises, 'writeFile'); const config = await TestConfig.create({ isGlobal: true }); const expected = { test: 'test' }; - const actual = await config.write(expected); - expect(expected).to.equal(actual); - expect(expected).to.equal(config.getContents()); - // expect(mkdirpStub.called).to.be.true; + config.set('test', 'test'); + const actual = await config.write(); + expect(lockStub.callCount).to.equal(1); + expect(expected).to.deep.equal(actual); + expect(expected).to.deep.equal(config.getContents()); + // // expect(mkdirpStub.called).to.be.true; expect(writeJson.called).to.be.true; }); it('sync uses passed in contents', async () => { + $$.SANDBOX.stub(fs, 'readFileSync').returns('{}'); + // @ts-expect-error --> we're only mocking on prop of many + $$.SANDBOX.stub(fs, 'statSync').returns({ mtimeNs: BigInt(Date.now() - 1000 * 60 * 5) }); + const lockStub = $$.SANDBOX.stub(lockfileLib, 'lockSync').returns(() => undefined); + const mkdirpStub = $$.SANDBOX.stub(fs, 'mkdirSync'); const writeJson = $$.SANDBOX.stub(fs, 'writeFileSync'); const config = await TestConfig.create({ isGlobal: true }); const expected = { test: 'test' }; - const actual = config.writeSync(expected); - expect(expected).to.equal(actual); - expect(expected).to.equal(config.getContents()); + config.set('test', 'test'); + const actual = config.writeSync(); + expect(lockStub.callCount).to.equal(1); + expect(expected).to.deep.equal(actual); + expect(expected).to.deep.equal(config.getContents()); expect(mkdirpStub.called).to.be.true; expect(writeJson.called).to.be.true; }); }); - const testFileContentsString = '{"foo":"bar"}'; - const testFileContentsJson = { foo: 'bar' }; - - describe('read()', () => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - let readFileStub: any; - let config: TestConfig; - - beforeEach(async () => { - $$.SANDBOXES.CONFIG.restore(); - readFileStub = $$.SANDBOX.stub(fs.promises, 'readFile'); - }); - - it('caches file contents', async () => { - readFileStub.resolves(testFileContentsString); - // TestConfig.create() calls read() - config = await TestConfig.create(TestConfig.getOptions('test', false, true)); - expect(readFileStub.calledOnce).to.be.true; - - // @ts-expect-error -> hasRead is protected. Ignore for testing. - expect(config.hasRead).to.be.true; - expect(config.getContents()).to.deep.equal(testFileContentsJson); - - // Read again. Stub should still only be called once. - const contents2 = await config.read(false, false); - expect(readFileStub.calledOnce).to.be.true; - expect(contents2).to.deep.equal(testFileContentsJson); - }); - - it('sets contents as empty object when file does not exist', async () => { - const err = SfError.wrap(new Error()); - err.code = 'ENOENT'; - readFileStub.throws(err); - - config = await TestConfig.create(TestConfig.getOptions('test', false, true)); - expect(readFileStub.calledOnce).to.be.true; - - // @ts-expect-error -> hasRead is protected. Ignore for testing. - expect(config.hasRead).to.be.true; - expect(config.getContents()).to.deep.equal({}); - }); - it('throws when file does not exist and throwOnNotFound=true', async () => { - const err = new Error('not here'); - err.name = 'FileNotFound'; - (err as any).code = 'ENOENT'; - readFileStub.throws(SfError.wrap(err)); - - const configOptions = { - filename: 'test', - isGlobal: true, - throwOnNotFound: true, - }; - - try { - await shouldThrow(TestConfig.create(configOptions)); - } catch (e) { - expect(e).to.have.property('name', 'FileNotFound'); - } - }); - - it('sets hasRead=false by default', async () => { - const configOptions = TestConfig.getOptions('test', false, true); - const testConfig = new TestConfig(configOptions); - // @ts-expect-error -> hasRead is protected. Ignore for testing. - expect(testConfig.hasRead).to.be.false; - }); - - it('forces another read of the config file with force=true', async () => { - readFileStub.resolves(testFileContentsString); - // TestConfig.create() calls read() - config = await TestConfig.create(TestConfig.getOptions('test', false, true)); - expect(readFileStub.calledOnce).to.be.true; - - // @ts-expect-error -> hasRead is protected. Ignore for testing. - expect(config.hasRead).to.be.true; - expect(config.getContents()).to.deep.equal(testFileContentsJson); - - // Read again. Stub should now be called twice. - const contents2 = await config.read(false, true); - expect(readFileStub.calledTwice).to.be.true; - expect(contents2).to.deep.equal(testFileContentsJson); - }); - }); - - describe('readSync()', () => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - let readFileStub: any; - let config: TestConfig; - - beforeEach(async () => { - $$.SANDBOXES.CONFIG.restore(); - readFileStub = $$.SANDBOX.stub(fs, 'readFileSync'); - }); - - it('caches file contents', () => { - readFileStub.returns(testFileContentsString); - // TestConfig.create() calls read() - config = new TestConfig(TestConfig.getOptions('test', false, true)); - expect(readFileStub.calledOnce).to.be.false; - - // @ts-expect-error -> hasRead is protected. Ignore for testing. - expect(config.hasRead).to.be.false; - - config.readSync(false, false); - // @ts-expect-error -> hasRead is protected. Ignore for testing. - expect(config.hasRead).to.be.true; - expect(config.getContents()).to.deep.equal(testFileContentsJson); - - // Read again. Stub should still only be called once. - const contents2 = config.readSync(false, false); - expect(readFileStub.calledOnce).to.be.true; - expect(contents2).to.deep.equal(testFileContentsJson); - }); - - it('sets contents as empty object when file does not exist', () => { - const err = SfError.wrap(new Error()); - err.code = 'ENOENT'; - readFileStub.throws(err); - - config = new TestConfig(TestConfig.getOptions('test', false, true)); - config.readSync(); - expect(readFileStub.calledOnce).to.be.true; - - // @ts-expect-error -> hasRead is protected. Ignore for testing. - expect(config.hasRead).to.be.true; - expect(config.getContents()).to.deep.equal({}); - }); - - it('throws when file does not exist and throwOnNotFound=true on method call', () => { - const err = new Error('not here'); - err.name = 'FileNotFound'; - (err as any).code = 'ENOENT'; - readFileStub.throws(SfError.wrap(err)); - - const configOptions = { - filename: 'test', - isGlobal: true, - throwOnNotFound: false, - }; - - try { - // The above config doesn't matter because we don't read on creation and it is overridden in the read method. - new TestConfig(configOptions).readSync(true); - assert(false, 'should throw'); - } catch (e) { - expect(e).to.have.property('name', 'FileNotFound'); - } - }); - - it('forces another read of the config file with force=true', () => { - readFileStub.returns(testFileContentsString); - // TestConfig.create() calls read() - config = new TestConfig(TestConfig.getOptions('test', false, true)); - config.readSync(); - - // -> hasRead is protected. Ignore for testing. - // @ts-expect-error -> hasRead is protected. Ignore for testing. - expect(config.hasRead).to.be.true; - - // Read again. Stub should now be called twice. - const contents2 = config.readSync(false, true); - expect(readFileStub.calledTwice).to.be.true; - expect(contents2).to.deep.equal(testFileContentsJson); + describe('read', () => { + const testFileContentsString = '{"foo":"bar"}'; + const testFileContentsJson = { foo: 'bar' }; + + describe('read()', () => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let readFileStub: any; + let config: TestConfig; + + beforeEach(async () => { + $$.SANDBOXES.CONFIG.restore(); + readFileStub = $$.SANDBOX.stub(fs.promises, 'readFile'); + // @ts-expect-error --> we're only mocking on prop of many + $$.SANDBOX.stub(fs.promises, 'stat').resolves({ mtimeNs: BigInt(Date.now() - 1000 * 60 * 5) }); + }); + + it('caches file contents', async () => { + readFileStub.resolves(testFileContentsString); + // TestConfig.create() calls read() + config = await TestConfig.create(TestConfig.getOptions('test', false, true)); + expect(readFileStub.calledOnce).to.be.true; + + // @ts-expect-error -> hasRead is protected. Ignore for testing. + expect(config.hasRead).to.be.true; + expect(config.getContents()).to.deep.equal(testFileContentsJson); + + // Read again. Stub should still only be called once. + const contents2 = await config.read(false, false); + expect(readFileStub.calledOnce).to.be.true; + expect(contents2).to.deep.equal(testFileContentsJson); + }); + + it('sets contents as empty object when file does not exist', async () => { + const err = SfError.wrap(new Error()); + err.code = 'ENOENT'; + readFileStub.throws(err); + + config = await TestConfig.create(TestConfig.getOptions('test', false, true)); + expect(readFileStub.calledOnce).to.be.true; + + // @ts-expect-error -> hasRead is protected. Ignore for testing. + expect(config.hasRead).to.be.true; + expect(config.getContents()).to.deep.equal({}); + }); + + it('throws when file does not exist and throwOnNotFound=true', async () => { + const err = new Error('not here'); + err.name = 'FileNotFound'; + (err as any).code = 'ENOENT'; + readFileStub.throws(SfError.wrap(err)); + + const configOptions = { + filename: 'test', + isGlobal: true, + throwOnNotFound: true, + }; + + try { + await shouldThrow(TestConfig.create(configOptions)); + } catch (e) { + expect(e).to.have.property('name', 'FileNotFound'); + } + }); + + it('sets hasRead=false by default', async () => { + const configOptions = TestConfig.getOptions('test', false, true); + const testConfig = new TestConfig(configOptions); + // @ts-expect-error -> hasRead is protected. Ignore for testing. + expect(testConfig.hasRead).to.be.false; + }); + + it('forces another read of the config file with force=true', async () => { + readFileStub.resolves(testFileContentsString); + // TestConfig.create() calls read() + config = await TestConfig.create(TestConfig.getOptions('test', false, true)); + expect(readFileStub.calledOnce).to.be.true; + + // @ts-expect-error -> hasRead is protected. Ignore for testing. + expect(config.hasRead).to.be.true; + expect(config.getContents()).to.deep.equal(testFileContentsJson); + + // Read again. Stub should now be called twice. + const contents2 = await config.read(false, true); + expect(readFileStub.calledTwice).to.be.true; + expect(contents2).to.deep.equal(testFileContentsJson); + }); + }); + + describe('readSync()', () => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let readFileStub: any; + let config: TestConfig; + + beforeEach(async () => { + $$.SANDBOXES.CONFIG.restore(); + readFileStub = $$.SANDBOX.stub(fs, 'readFileSync'); + // @ts-expect-error --> we're only mocking on prop of many + $$.SANDBOX.stub(fs, 'statSync').returns({ mtimeNs: BigInt(Date.now() - 1000 * 60 * 5) }); + }); + + it('caches file contents', () => { + readFileStub.returns(testFileContentsString); + // TestConfig.create() calls read() + config = new TestConfig(TestConfig.getOptions('test', false, true)); + expect(readFileStub.calledOnce).to.be.false; + + // @ts-expect-error -> hasRead is protected. Ignore for testing. + expect(config.hasRead).to.be.false; + + config.readSync(false, false); + // @ts-expect-error -> hasRead is protected. Ignore for testing. + expect(config.hasRead).to.be.true; + expect(config.getContents()).to.deep.equal(testFileContentsJson); + + // Read again. Stub should still only be called once. + const contents2 = config.readSync(false, false); + expect(readFileStub.calledOnce).to.be.true; + expect(contents2).to.deep.equal(testFileContentsJson); + }); + + it('sets contents as empty object when file does not exist', () => { + const err = SfError.wrap(new Error()); + err.code = 'ENOENT'; + readFileStub.throws(err); + + config = new TestConfig(TestConfig.getOptions('test', false, true)); + config.readSync(); + expect(readFileStub.calledOnce).to.be.true; + + // @ts-expect-error -> hasRead is protected. Ignore for testing. + expect(config.hasRead).to.be.true; + expect(config.getContents()).to.deep.equal({}); + }); + + it('throws when file does not exist and throwOnNotFound=true on method call', () => { + const err = new Error('not here'); + err.name = 'FileNotFound'; + (err as any).code = 'ENOENT'; + readFileStub.throws(SfError.wrap(err)); + + const configOptions = { + filename: 'test', + isGlobal: true, + throwOnNotFound: false, + }; + + try { + // The above config doesn't matter because we don't read on creation and it is overridden in the read method. + new TestConfig(configOptions).readSync(true); + assert(false, 'should throw'); + } catch (e) { + expect(e).to.have.property('name', 'FileNotFound'); + } + }); + + it('forces another read of the config file with force=true', () => { + readFileStub.returns(testFileContentsString); + // TestConfig.create() calls read() + config = new TestConfig(TestConfig.getOptions('test', false, true)); + config.readSync(); + + // -> hasRead is protected. Ignore for testing. + // @ts-expect-error -> hasRead is protected. Ignore for testing. + expect(config.hasRead).to.be.true; + + // Read again. Stub should now be called twice. + const contents2 = config.readSync(false, true); + expect(readFileStub.calledTwice).to.be.true; + expect(contents2).to.deep.equal(testFileContentsJson); + }); }); }); }); diff --git a/test/unit/config/configStoreTest.ts b/test/unit/config/configStoreTest.ts index 4d92c23cba..83312d2a2b 100644 --- a/test/unit/config/configStoreTest.ts +++ b/test/unit/config/configStoreTest.ts @@ -4,10 +4,10 @@ * 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 { expect } from 'chai'; +import { expect, assert } from 'chai'; import { AuthInfoConfig } from '../../../src/config/authInfoConfig'; -import { BaseConfigStore, ConfigContents } from '../../../src/config/configStore'; -import { AuthFields } from '../../../src/org/authInfo'; +import { BaseConfigStore } from '../../../src/config/configStore'; +import { ConfigContents } from '../../../src/config/configStackTypes'; import { TestContext } from '../../../src/testSetup'; const specialKey = 'spe@cial.property'; @@ -48,17 +48,6 @@ describe('ConfigStore', () => { }); expect(st).to.equal('1a2b'); }); - it('await each value', async () => { - const config = await TestConfig.create(); - config.set('1', 'a'); - config.set('2', 'b'); - - let st = ''; - await config.awaitEach(async (key, val) => { - st += `${key}${val}`; - }); - expect(st).to.equal('1a2b'); - }); it('returns the object reference', async () => { const config = new TestConfig<{ '1': { a: string } }>(); @@ -67,7 +56,6 @@ describe('ConfigStore', () => { config.get('1').a = 'b'; expect(config.get('1').a).to.equal('b'); - expect(config.get('1.a')).to.equal('b'); }); it('updates the object reference', async () => { @@ -80,6 +68,11 @@ describe('ConfigStore', () => { expect(config.get('1').b).to.equal('c'); }); + it('undefined keys return undefined', async () => { + const config = new TestConfig<{ '1': { a: string } }>(); + expect(config.get('not-a-thing')).to.equal(undefined); + }); + describe('encryption', () => { beforeEach(() => { $$.SANDBOXES.CONFIG.restore(); @@ -88,14 +81,15 @@ describe('ConfigStore', () => { it('throws if crypto is not initialized', () => { const config = new CarConfig({}); - expect(() => config.set('owner.creditCardNumber', 'n/a')) + expect(() => config.update('owner', { creditCardNumber: 'n/a' })) .to.throw() .property('name', 'CryptoNotInitializedError'); }); it('throws if value is not strings', async () => { const config = await CarConfig.create(); - expect(() => config.set('owner.creditCardNumber', 12)) + // @ts-expect-error it should be a string, but testing what happens when it's not + expect(() => config.update('owner', { creditCardNumber: 12 })) .to.throw() .property('name', 'InvalidCryptoValueError'); }); @@ -113,7 +107,7 @@ describe('ConfigStore', () => { it('encrypts nested key', async () => { const expected = 'a29djf0kq3dj90d3q'; const config = await CarConfig.create(); - config.set('owner', { + config.update('owner', { name: 'Bob', creditCardNumber: expected, phone: '707-bob-cell', @@ -122,9 +116,9 @@ describe('ConfigStore', () => { }); const owner = config.get('owner'); // encrypted - expect(owner.creditCardNumber).to.not.equal(expected); + expect(owner?.creditCardNumber).to.not.equal(expected); // decrypted - expect(config.get('owner', true).creditCardNumber).to.equal(expected); + expect(config.get('owner', true)?.creditCardNumber).to.equal(expected); }); it('encrypts nested key using regexp', async () => { @@ -140,77 +134,25 @@ describe('ConfigStore', () => { }); const owner = config.get('owner'); // encrypted - expect(owner.superPassword).to.not.equal(expected); - // decrypted - expect(config.get('owner', true).superPassword).to.equal(expected); - }); - - it('encrypts nested query key using dot notation', async () => { - const expected = 'a29djf0kq3dj90d3q'; - const config = await CarConfig.create(); - config.set('owner.creditCardNumber', expected); - // encrypted - expect(config.get('owner.creditCardNumber')).to.not.equal(expected); - // decrypted - expect(config.get('owner.creditCardNumber', true)).to.equal(expected); - }); - - it('encrypts nested query key using accessor with single quotes', async () => { - const expected = 'a29djf0kq3dj90d3q'; - const config = await CarConfig.create(); - config.set('owner["creditCardNumber"]', expected); - // encrypted - expect(config.get("owner['creditCardNumber']")).to.not.equal(expected); - // decrypted - expect(config.get("owner['creditCardNumber']", true)).to.equal(expected); - }); - - it('encrypts nested query key using accessor with double quotes', async () => { - const expected = 'a29djf0kq3dj90d3q'; - const config = await CarConfig.create(); - config.set('owner["creditCardNumber"]', expected); - // encrypted - expect(config.get('owner["creditCardNumber"]')).to.not.equal(expected); - // decrypted - expect(config.get('owner["creditCardNumber"]', true)).to.equal(expected); - }); - - it('encrypts nested query special key using accessor with single quotes', async () => { - const expected = 'a29djf0kq3dj90d3q'; - const config = await CarConfig.create(); - const query = `owner['${specialKey}']`; - config.set(query, expected); - // encrypted - expect(config.get(query)).to.not.equal(expected); - // decrypted - expect(config.get(query, true)).to.equal(expected); - }); - - it('encrypts nested query special key using accessor with double quotes', async () => { - const expected = 'a29djf0kq3dj90d3q'; - const config = await CarConfig.create(); - const query = `owner["${specialKey}"]`; - config.set(query, expected); - // encrypted - expect(config.get(query)).to.not.equal(expected); + expect(owner?.superPassword).to.not.equal(expected); // decrypted - expect(config.get(query, true)).to.equal(expected); + expect(config.get('owner', true)?.superPassword).to.equal(expected); }); it('decrypt returns copies', async () => { const expected = 'a29djf0kq3dj90d3q'; const config = await CarConfig.create(); const owner = { name: 'Bob', creditCardNumber: expected }; - // I would love for this to throw an error, but the current typing doesn't quite work like get does. + // @ts-expect-error that's not a full owner, not all required props are set config.set('owner', owner); const decryptedOwner = config.get('owner', true); + assert(decryptedOwner); // Because we retrieved an decrypted object on a config with encryption, // it should return a clone so it doesn't accidentally save decrypted data. decryptedOwner.creditCardNumber = 'invalid'; - expect(config.get('owner').creditCardNumber).to.not.equal('invalid'); - expect(config.get('owner', true).creditCardNumber).to.equal(expected); - expect(config.get('owner.creditCardNumber', true)).to.equal(expected); + expect(config.get('owner')?.creditCardNumber).to.not.equal('invalid'); + expect(config.get('owner', true)?.creditCardNumber).to.equal(expected); }); // Ensures accessToken and refreshToken are both decrypted upon config.get() @@ -220,37 +162,40 @@ describe('ConfigStore', () => { const refreshToken = '5678'; const config = await AuthInfoConfig.create({}); const auth = { accessToken, refreshToken }; - config.set('auth', auth); + config.setContentsFromObject(auth); - expect(config.get('auth').accessToken).to.not.equal(accessToken); - expect(config.get('auth').refreshToken).to.not.equal(refreshToken); - expect(config.get('auth', true).accessToken).to.equal(accessToken); - expect(config.get('auth', true).refreshToken).to.equal(refreshToken); + expect(config.get('accessToken')).to.not.equal(accessToken); + expect(config.get('refreshToken')).to.not.equal(refreshToken); + expect(config.get('accessToken', true)).to.equal(accessToken); + expect(config.get('refreshToken', true)).to.equal(refreshToken); }); it('does not fail when saving an already encrypted object', async () => { const expected = 'a29djf0kq3dj90d3q'; const config = await CarConfig.create(); const owner = { name: 'Bob', creditCardNumber: expected }; + // @ts-expect-error incomplete owner config.set('owner', owner); - const encryptedCreditCardNumber = config.get('owner.creditCardNumber'); + const encryptedCreditCardNumber = config.get('owner')?.creditCardNumber; const contents = config.getContents(); contents.owner.name = 'Tim'; + // @ts-expect-error private method config.setContents(contents); - expect(config.get('owner.name')).to.equal(contents.owner.name); - expect(config.get('owner.creditCardNumber')).to.equal(encryptedCreditCardNumber); + expect(config.get('owner')?.name).to.equal(contents.owner.name); + expect(config.get('owner')?.creditCardNumber).to.equal(encryptedCreditCardNumber); }); it('updates encrypted object', async () => { const expected = 'a29djf0kq3dj90d3q'; const config = await CarConfig.create(); const owner = { name: 'Bob', creditCardNumber: 'old credit card number' }; + // @ts-expect-error incomplete owner config.set('owner', owner); config.update('owner', { creditCardNumber: expected }); - expect(config.get('owner.name')).to.equal(owner.name); - expect(config.get('owner.creditCardNumber', true)).to.equal(expected); + expect(config.get('owner')?.name).to.equal(owner.name); + expect(config.get('owner', true)?.creditCardNumber).to.equal(expected); }); }); }); diff --git a/test/unit/config/configTest.ts b/test/unit/config/configTest.ts index ea621713ea..4451422ad7 100644 --- a/test/unit/config/configTest.ts +++ b/test/unit/config/configTest.ts @@ -9,21 +9,20 @@ /* eslint-disable @typescript-eslint/no-unsafe-assignment */ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ -import * as fs from 'fs'; +import * as fs from 'node:fs'; import { stubMethod } from '@salesforce/ts-sinon'; -import { ensureString, JsonMap } from '@salesforce/ts-types'; +import { ensureString } from '@salesforce/ts-types'; import { expect } from 'chai'; +import * as lockfileLib from 'proper-lockfile'; import { Config, ConfigPropertyMeta } from '../../../src/config/config'; import { ConfigFile } from '../../../src/config/configFile'; -import { ConfigContents } from '../../../src/config/configStore'; -import { OrgConfigProperties } from '../../../src/exported'; +import { ConfigContents } from '../../../src/config/configStackTypes'; +import { OrgConfigProperties } from '../../../src'; import { shouldThrowSync, TestContext } from '../../../src/testSetup'; const configFileContentsString = '{"target-dev-hub": "configTest_devhub","target-org": "configTest_default"}'; const configFileContentsJson = { 'target-dev-hub': 'configTest_devhub', 'target-org': 'configTest_default' }; -const clone = (obj: JsonMap) => JSON.parse(JSON.stringify(obj)); - describe('Config', () => { const $$ = new TestContext(); @@ -74,7 +73,9 @@ describe('Config', () => { const config = await Config.create(Config.getDefaultOptions(true)); stubMethod($$.SANDBOX, fs.promises, 'readFile').withArgs(config.getPath()).resolves(configFileContentsString); - + stubMethod($$.SANDBOX, fs.promises, 'stat') + .withArgs(config.getPath()) + .resolves({ mtimeNs: BigInt(new Date().valueOf() - 1000 * 60 * 5) }); // Manipulate config.hasRead to force a read // @ts-expect-error -> hasRead is protected. Ignore for testing. config.hasRead = false; @@ -88,11 +89,15 @@ describe('Config', () => { }); describe('set', () => { - it('calls Config.write with updated file contents', async () => { + beforeEach(() => { + $$.SANDBOX.stub(lockfileLib, 'lock').resolves(() => Promise.resolve()); stubMethod($$.SANDBOX, fs.promises, 'readFile').resolves(configFileContentsString); + stubMethod($$.SANDBOX, fs.promises, 'stat').resolves({ mtimeNs: BigInt(new Date().valueOf() - 1000 * 60 * 5) }); + }); + it('calls Config.write with updated file contents', async () => { const writeStub = stubMethod($$.SANDBOX, fs.promises, 'writeFile'); - const expectedFileContents = clone(configFileContentsJson); + const expectedFileContents = structuredClone(configFileContentsJson); const newUsername = 'updated_val'; expectedFileContents['target-org'] = newUsername; @@ -102,13 +107,12 @@ describe('Config', () => { }); it('calls Config.write with deleted file contents', async () => { - const expectedFileContents = clone(configFileContentsJson); + const expectedFileContents = structuredClone(configFileContentsJson); const newUsername = 'updated_val'; expectedFileContents['target-org'] = newUsername; await Config.update(false, 'target-org', newUsername); - stubMethod($$.SANDBOX, fs.promises, 'readFile').resolves(configFileContentsString); const writeStub = stubMethod($$.SANDBOX, fs.promises, 'writeFile'); const targetDevhub = configFileContentsJson['target-dev-hub']; @@ -225,11 +229,13 @@ describe('Config', () => { describe('unset', () => { it('calls Config.write with updated file contents', async () => { + $$.SANDBOX.stub(lockfileLib, 'lock').resolves(() => Promise.resolve()); stubMethod($$.SANDBOX, fs.promises, 'readFile').resolves(configFileContentsString); + stubMethod($$.SANDBOX, fs.promises, 'stat').resolves({ mtimeNs: BigInt(new Date().valueOf() - 1000 * 60 * 5) }); const writeStub = stubMethod($$.SANDBOX, fs.promises, 'writeFile'); - const expectedFileContents = clone(configFileContentsJson); - delete expectedFileContents['target-org']; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { 'target-org': deleteThis, ...expectedFileContents } = structuredClone(configFileContentsJson); const config = await Config.create({ isGlobal: false }); config.unset('target-org'); @@ -273,7 +279,7 @@ describe('Config', () => { stubMethod($$.SANDBOX, ConfigFile.prototype, ConfigFile.prototype.read.name).callsFake(async function () { // @ts-expect-error -> this is any // eslint-disable-next-line @typescript-eslint/no-unsafe-call - this.setContentsFromObject({ unknown: 'unknown config key and value' }); + this.setContentsFromFileContents({ unknown: 'unknown config key and value' }); }); const config = await Config.create({ isGlobal: true }); diff --git a/test/unit/config/envVarsTest.ts b/test/unit/config/envVarsTest.ts index e4096f6d04..d65d1d39b6 100644 --- a/test/unit/config/envVarsTest.ts +++ b/test/unit/config/envVarsTest.ts @@ -7,14 +7,20 @@ import { expect } from 'chai'; import { describe } from 'mocha'; import { EnvVars } from '../../../src/config/envVars'; -import { Global } from '../../../src/global'; import { TestContext } from '../../../src/testSetup'; +import { Lifecycle } from '../../../src/lifecycleEvents'; +import { Messages } from '../../../src/messages'; + +Messages.importMessagesDirectory(__dirname); +const messages = Messages.loadMessages('@salesforce/core', 'envVars'); describe('envVars', () => { - const testEnvVars = ['foo', 'SFDX_ACCESS_TOKEN', 'SF_ACCESS_TOKEN', 'SF_SFDX_INTEROPERABILITY']; + const testEnvVars = ['foo', 'SFDX_ACCESS_TOKEN', 'SF_ACCESS_TOKEN']; + const $$ = new TestContext(); + let warnStub: sinon.SinonStub; beforeEach(() => { - Global.SFDX_INTEROPERABILITY = true; + warnStub = $$.SANDBOX.stub(Lifecycle.prototype, 'emitWarning'); }); afterEach(() => { @@ -27,39 +33,44 @@ describe('envVars', () => { process.env['foo'] = 'bar'; const envVars = new EnvVars(); expect(envVars.getString('foo')).to.equal('bar'); + expect(warnStub.callCount).to.equal(0); }); - it('should load well known env var', () => { - process.env['SFDX_ACCESS_TOKEN'] = 'some access token'; + it('should load well known env var (replaced)', () => { + process.env['SF_ACCESS_TOKEN'] = 'some access token'; const envVars = new EnvVars(); - expect(envVars.getString('SFDX_ACCESS_TOKEN')).to.equal('some access token'); + expect(envVars.getString('SF_ACCESS_TOKEN')).to.equal('some access token'); + expect(warnStub.callCount).to.equal(0); }); - it('should load well known env var and set synonym', () => { + it('should load well known env var (replaced)', () => { process.env['SFDX_ACCESS_TOKEN'] = 'some access token'; const envVars = new EnvVars(); expect(envVars.getString('SFDX_ACCESS_TOKEN')).to.equal('some access token'); - expect(envVars.getString('SF_ACCESS_TOKEN')).to.equal('some access token'); + expect(warnStub.getCalls().flatMap((c) => c.args)).to.deep.include( + messages.getMessage('deprecatedEnv', ['SFDX_ACCESS_TOKEN', 'SF_ACCESS_TOKEN']) + ); + expect(warnStub.callCount).to.equal(1); }); - it('should load well known env var and override existing synonym', () => { + it('should load well known env var and set synonym', () => { process.env['SFDX_ACCESS_TOKEN'] = 'some access token'; - process.env['SF_ACCESS_TOKEN'] = 'some other access token'; const envVars = new EnvVars(); expect(envVars.getString('SFDX_ACCESS_TOKEN')).to.equal('some access token'); expect(envVars.getString('SF_ACCESS_TOKEN')).to.equal('some access token'); + expect(warnStub.getCalls().flatMap((c) => c.args)).to.deep.include( + messages.getMessage('deprecatedEnv', ['SFDX_ACCESS_TOKEN', 'SF_ACCESS_TOKEN']) + ); }); -}); -describe('envVars - no interop', () => { - // TestContext disables interoperability - new TestContext(); - - it('should load well known env var not set synonym interoperability is disabled', () => { + it('should load well known env var and override existing synonym', () => { process.env['SFDX_ACCESS_TOKEN'] = 'some access token'; process.env['SF_ACCESS_TOKEN'] = 'some other access token'; const envVars = new EnvVars(); - expect(envVars.getString('SFDX_ACCESS_TOKEN')).to.equal('some access token'); + expect(envVars.getString('SFDX_ACCESS_TOKEN')).to.equal('some other access token'); expect(envVars.getString('SF_ACCESS_TOKEN')).to.equal('some other access token'); + expect(warnStub.getCalls().flatMap((c) => c.args)).to.deep.include( + messages.getMessage('deprecatedEnvDisagreement', ['SFDX_ACCESS_TOKEN', 'SF_ACCESS_TOKEN', 'SF_ACCESS_TOKEN']) + ); }); }); diff --git a/test/unit/config/lwwMapTest.ts b/test/unit/config/lwwMapTest.ts new file mode 100644 index 0000000000..cba9eb4d97 --- /dev/null +++ b/test/unit/config/lwwMapTest.ts @@ -0,0 +1,184 @@ +/* + * Copyright (c) 2023, 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 { expect, config } from 'chai'; +import { LWWMap, LWWState, SYMBOL_FOR_DELETED } from '../../../src/config/lwwMap'; +import { nowBigInt } from '../../../src/util/time'; + +config.truncateThreshold = 0; +// unit is ns. 1_000_000_000 ns = 1s +const TIMESTAMP_OFFSET = BigInt(1_000_000_000); + +describe('LWWMap', () => { + type TestType = { foo: string; baz: string; opt?: number; optNull?: null }; + let state: LWWState; + + describe('all properties are known', () => { + let lwwMap: LWWMap; + + beforeEach(() => { + state = { + foo: { value: 'bar', timestamp: nowBigInt() }, + baz: { value: 'qux', timestamp: nowBigInt() }, + }; + lwwMap = new LWWMap(state); + }); + + it('should initialize with the correct state', () => { + expect(lwwMap.state).to.deep.equal(state); + }); + + it('should get the correct value for the entire object', () => { + expect(lwwMap.value).to.deep.equal({ foo: 'bar', baz: 'qux' }); + }); + + it('has when it has', () => { + expect(lwwMap.has('foo')).to.be.true; + }); + + it('sets a new key', () => { + lwwMap.set('opt', 4); + expect(lwwMap.has('opt')).to.be.true; + }); + + it('get by key', () => { + expect(lwwMap.get('foo')).to.equal('bar'); + }); + + it('get missing by key', () => { + expect(lwwMap.get('opt')).to.equal(undefined); + }); + + it('has when it does not have', () => { + expect(lwwMap.has('nope')).to.be.false; + expect(lwwMap.state).to.deep.equal(state); + }); + + it('has is false for deleted', () => { + lwwMap.delete('foo'); + expect(lwwMap.has('foo')).to.be.false; + }); + + it('deletes a key that exists', () => { + lwwMap.delete('foo'); + expect(lwwMap.has('foo')).to.be.false; + expect(lwwMap.value).to.deep.equal({ baz: 'qux' }); + expect(lwwMap.state.baz).to.deep.equal(state.baz); + expect(lwwMap.state.foo.value).to.equal(SYMBOL_FOR_DELETED); + }); + + it('set and get an optional null', () => { + lwwMap.set('optNull', null); + expect(lwwMap.get('optNull')).to.be.null; + }); + + describe('merge', () => { + beforeEach(() => { + lwwMap = new LWWMap(state); + }); + it('all are updated', () => { + const remoteState = { + foo: { value: 'bar2', timestamp: nowBigInt() }, + baz: { value: 'qux2', timestamp: nowBigInt() }, + } satisfies LWWState; + lwwMap.merge(remoteState); + expect(lwwMap.state).to.deep.equal(remoteState); + expect(lwwMap.get('foo')).to.equal('bar2'); + }); + it('all are deleted', () => { + const remoteState = { + foo: { value: SYMBOL_FOR_DELETED, timestamp: nowBigInt() }, + baz: { value: SYMBOL_FOR_DELETED, timestamp: nowBigInt() }, + } satisfies LWWState; + lwwMap.merge(remoteState); + expect(lwwMap.state).to.deep.equal(remoteState); + expect(lwwMap.get('foo')).to.equal(undefined); + }); + it('none are updated', () => { + const remoteState = { + foo: { value: 'bar2', timestamp: nowBigInt() - TIMESTAMP_OFFSET }, + baz: { value: 'qux2', timestamp: nowBigInt() - TIMESTAMP_OFFSET }, + } satisfies LWWState; + lwwMap.merge(remoteState); + expect(lwwMap.state).to.deep.equal(state); + expect(lwwMap.get('foo')).to.equal('bar'); + }); + it('one is update, one is added, one is deleted', () => { + lwwMap.set('opt', 4); + const remoteState = { + foo: { value: 'bar2', timestamp: nowBigInt() }, + baz: { value: 'qux2', timestamp: nowBigInt() - TIMESTAMP_OFFSET }, + opt: { value: SYMBOL_FOR_DELETED, timestamp: nowBigInt() + TIMESTAMP_OFFSET }, + optNull: { value: null, timestamp: nowBigInt() }, + } satisfies LWWState; + lwwMap.merge(remoteState); + expect(lwwMap.get('foo')).to.equal('bar2'); + expect(lwwMap.get('baz')).to.equal('qux'); + expect(lwwMap.state.opt?.value).to.equal(SYMBOL_FOR_DELETED); + expect(lwwMap.get('opt')).to.be.undefined; + }); + }); + }); + + describe('open-ended objects', () => { + type OpenEndedType = TestType & { [key: string]: string }; + const initialState = { + foo: { value: 'bar', timestamp: nowBigInt() }, + baz: { value: 'qux', timestamp: nowBigInt() }, + } satisfies LWWState; + + it('set a new prop', () => { + const lwwMap = new LWWMap(initialState); + lwwMap.set('thing', 'whatever'); + expect(lwwMap.get('thing')).to.equal('whatever'); + expect(lwwMap.value).to.deep.equal({ foo: 'bar', baz: 'qux', thing: 'whatever' }); + expect(lwwMap.state.thing.value).to.equal('whatever'); + }); + + it('set and delete new prop', () => { + const lwwMap = new LWWMap(initialState); + lwwMap.set('thing', 'whatever'); + expect(lwwMap.get('thing')).to.equal('whatever'); + lwwMap.delete('thing'); + expect(lwwMap.get('thing')).to.be.undefined; + expect(lwwMap.value).to.deep.equal({ foo: 'bar', baz: 'qux' }); + expect(lwwMap.state.thing.value).to.equal(SYMBOL_FOR_DELETED); + }); + + it('delete a non-existent prop', () => { + const lwwMap = new LWWMap(initialState); + expect(lwwMap.get('gone')).to.be.undefined; + lwwMap.delete('gone'); + expect(lwwMap.get('gone')).to.be.undefined; + expect(lwwMap.value).to.deep.equal({ foo: 'bar', baz: 'qux' }); + expect(lwwMap.state.gone.value).to.equal(SYMBOL_FOR_DELETED); + }); + }); +}); + +describe('nested objects', () => { + type NestedOpenEndedObject = { foo: string; baz: string; opt?: number; optNull?: null; obj: Record }; + + let state: LWWState; + let lwwMap: LWWMap; + + beforeEach(() => { + state = { + foo: { value: 'bar', timestamp: nowBigInt() }, + baz: { value: 'qux', timestamp: nowBigInt() }, + obj: { value: { a: 1, b: 2, c: 3 }, timestamp: nowBigInt() }, + }; + lwwMap = new LWWMap(state); + }); + + it('should initialize with the correct state', () => { + expect(lwwMap.state).to.deep.equal(state); + }); + + it('should get the correct value for the entire object', () => { + expect(lwwMap.value).to.deep.equal({ foo: 'bar', baz: 'qux', obj: { a: 1, b: 2, c: 3 } }); + }); +}); diff --git a/test/unit/config/ttlConfigTest.ts b/test/unit/config/ttlConfigTest.ts index cd7f1eb82c..59bf3823e9 100644 --- a/test/unit/config/ttlConfigTest.ts +++ b/test/unit/config/ttlConfigTest.ts @@ -96,4 +96,31 @@ describe('TTLConfig', () => { expect(isExpired).to.be.false; }); }); + + describe('filters expired keys on init', () => { + it('should omit expired keys', async () => { + $$.setConfigStubContents('TestConfig', { + contents: { + old: { + value: 1, + timestamp: new Date().getTime() - Duration.days(7).milliseconds, + }, + current: { + value: 2, + timestamp: new Date().getTime(), + }, + future: { + value: 3, + timestamp: new Date().getTime() + Duration.days(7).milliseconds, + }, + }, + }); + + const config = await TestConfig.create(); + const keys = config.keys(); + expect(keys).to.include('current'); + expect(keys).to.include('future'); + expect(keys).to.not.include('old'); + }); + }); }); diff --git a/test/unit/crypto/cryptoKeyFailuresTest.ts b/test/unit/crypto/cryptoKeyFailuresTest.ts index e5d3c7b768..952865e413 100644 --- a/test/unit/crypto/cryptoKeyFailuresTest.ts +++ b/test/unit/crypto/cryptoKeyFailuresTest.ts @@ -6,9 +6,9 @@ */ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ -import * as childProcess from 'child_process'; -import * as _crypto from 'crypto'; -import * as os from 'os'; +import childProcess from 'node:child_process'; +import _crypto from 'node:crypto'; +import os from 'node:os'; import { AnyJson } from '@salesforce/ts-types'; import { assert, expect } from 'chai'; import { Crypto } from '../../../src/crypto/crypto'; @@ -39,14 +39,14 @@ if (os.platform() === 'darwin') { describe('CryptoKeyFailureTests', () => { const $$ = new TestContext(); - const OLD_GENERIC_VAL = process.env.SFDX_USE_GENERIC_UNIX_KEYCHAIN; + const OLD_GENERIC_VAL = process.env.SF_USE_GENERIC_UNIX_KEYCHAIN; before(() => { - process.env.SFDX_USE_GENERIC_UNIX_KEYCHAIN = 'false'; + process.env.SF_USE_GENERIC_UNIX_KEYCHAIN = 'false'; }); after(() => { - process.env.SFDX_USE_GENERIC_UNIX_KEYCHAIN = OLD_GENERIC_VAL ?? ''; + process.env.SF_USE_GENERIC_UNIX_KEYCHAIN = OLD_GENERIC_VAL ?? ''; Cache.enable(); }); diff --git a/test/unit/crypto/cryptoTest.ts b/test/unit/crypto/cryptoTest.ts index 81995aab64..34f87a966e 100644 --- a/test/unit/crypto/cryptoTest.ts +++ b/test/unit/crypto/cryptoTest.ts @@ -6,7 +6,7 @@ */ /* eslint-disable @typescript-eslint/ban-types */ -import * as os from 'os'; +import os from 'node:os'; import { stubMethod } from '@salesforce/ts-sinon'; import { expect } from 'chai'; import { Crypto } from '../../../src/crypto/crypto'; @@ -14,14 +14,32 @@ import { SfError } from '../../../src/sfError'; import { Messages } from '../../../src/messages'; import { TestContext, shouldThrowSync } from '../../../src/testSetup'; -const TEST_KEY = { +const TEST_KEY_V1 = { service: 'sfdx', account: 'local', key: '8e8fd1e6dc06a37bf420898dbc3ee35c', }; -describe('CryptoTest', function () { +const TEST_KEY_V2 = { + service: 'sfdx', + account: 'local', + key: 'f699321865468a386434e78b3a4a5cf3b151e09a4391741e06fdbe8272ac07c0', +}; + +const setCryptoVersionEnvVar = (envVarValue?: boolean) => { + if (envVarValue === true) { + process.env.SF_CRYPTO_V2 = 'true'; + } else if (envVarValue === false) { + process.env.SF_CRYPTO_V2 = 'false'; + } else { + delete process.env.SF_CRYPTO_V2; + } +}; + +describe('CryptoTests', function () { + // Save env var original state const disableEncryptionEnvVar = process.env.SFDX_DISABLE_ENCRYPTION; + const cryptoVersionEnvVar = process.env.SF_CRYPTO_V2; let crypto: Crypto; const $$ = new TestContext(); @@ -29,167 +47,220 @@ describe('CryptoTest', function () { beforeEach(() => { // Testing crypto functionality, so restore global stubs. $$.SANDBOXES.CRYPTO.restore(); - - stubMethod($$.SANDBOX, Crypto.prototype, 'getKeyChain').callsFake(() => - Promise.resolve({ - setPassword: () => Promise.resolve(), - getPassword: (data: unknown, cb: (arg1: undefined, arg2: string) => {}) => cb(undefined, TEST_KEY.key), - }) - ); }); afterEach(() => { crypto.close(); - process.env.SFDX_DISABLE_ENCRYPTION = disableEncryptionEnvVar ?? ''; }); - if (process.platform === 'darwin') { - this.timeout(3 * 60 * 1000); + after(() => { + // Reset env vars to original state + if (disableEncryptionEnvVar) { + process.env.SFDX_DISABLE_ENCRYPTION = disableEncryptionEnvVar; + } else { + delete process.env.SFDX_DISABLE_ENCRYPTION; + } + + if (cryptoVersionEnvVar) { + process.env.SF_CRYPTO_V2 = cryptoVersionEnvVar; + } else { + delete process.env.SF_CRYPTO_V2; + } + }); + + const runTests = ({ keyVersion, envVarValue }: { keyVersion: 'v1' | 'v2'; envVarValue?: boolean }) => { + if (process.platform === 'darwin') { + this.timeout(3 * 60 * 1000); - const text = 'Unencrypted text'; - let secret: string | undefined; + const text = 'Unencrypted text'; + let secret: string | undefined; - it('Should have encrypted the string.', async () => { - process.env.SFDX_DISABLE_ENCRYPTION = 'false'; + const key = keyVersion === 'v2' ? TEST_KEY_V2.key : TEST_KEY_V1.key; - crypto = new Crypto(); - // @ts-expect-error -> init is protected - await crypto.init(); - secret = crypto.encrypt(text); - expect(secret).to.not.equal(text); - }); + beforeEach(() => { + stubMethod($$.SANDBOX, Crypto.prototype, 'getKeyChain').callsFake(() => + Promise.resolve({ + setPassword: () => Promise.resolve(), + getPassword: (data: unknown, cb: (arg1: undefined, arg2: string) => {}) => cb(undefined, key), + }) + ); + // @ts-expect-error Using a private static method for testing + Crypto.unsetCryptoVersion(); + }); - it('Should have decrypted the string', async () => { - process.env.SFDX_DISABLE_ENCRYPTION = 'false'; + it('Should have encrypted the string.', async () => { + setCryptoVersionEnvVar(envVarValue); + process.env.SFDX_DISABLE_ENCRYPTION = 'false'; - crypto = new Crypto(); - // @ts-expect-error -> init is protected - await crypto.init(); - if (!secret) throw new Error('secret is undefined'); - const decrypted = crypto.decrypt(secret); - expect(decrypted).to.equal(text); - }); + crypto = new Crypto(); + // @ts-expect-error -> init is protected + await crypto.init(); + secret = crypto.encrypt(text); + expect(secret).to.not.equal(text); + }); - it('Should have encrypted the string even if SFDX_DISABLE_ENCRYPTION is true.', async () => { - process.env.SFDX_DISABLE_ENCRYPTION = 'true'; + it('Should have decrypted the string', async () => { + setCryptoVersionEnvVar(envVarValue); + process.env.SFDX_DISABLE_ENCRYPTION = 'false'; - crypto = new Crypto(); - // @ts-expect-error -> init is protected - await crypto.init(); - secret = crypto.encrypt(text); - expect(secret).to.not.equal(text); - }); + crypto = new Crypto(); + // @ts-expect-error -> init is protected + await crypto.init(); + if (!secret) throw new Error('secret is undefined'); + const decrypted = crypto.decrypt(secret); + expect(decrypted).to.equal(text); + }); - it('Should have encrypted the string because SFDX_DISABLE_ENCRYPTION is not defined.', async () => { - delete process.env.SFDX_DISABLE_ENCRYPTION; + it('Should have encrypted the string even if SFDX_DISABLE_ENCRYPTION is true.', async () => { + setCryptoVersionEnvVar(envVarValue); + process.env.SFDX_DISABLE_ENCRYPTION = 'true'; - crypto = new Crypto(); - // @ts-expect-error -> init is protected - await crypto.init(); - secret = crypto.encrypt(text); - expect(secret).to.not.equal(text); - }); - - it('Should have decrypted the string even if SFDX_DISABLE_ENCRYPTION is "true"', async () => { - process.env.SFDX_DISABLE_ENCRYPTION = 'true'; - - crypto = new Crypto(); - // @ts-expect-error -> init is protected - await crypto.init(); - const str = '123456'; - const encrypted = crypto.encrypt(str); - const decrypted = crypto.decrypt(encrypted); - expect(encrypted).to.not.equal(str); - expect(decrypted).to.equal(str); - }); - - it('InvalidEncryptedFormatError action', async () => { - process.env.SFDX_DISABLE_ENCRYPTION = 'false'; - - crypto = new Crypto(); - // @ts-expect-error -> init is protected - await crypto.init(); - expect(Crypto.prototype.decrypt.bind(crypto, 'foo')).to.throw(Error).and.have.property('actions'); - }); - - it('InvalidEncryptedFormatError name', async () => { - process.env.SFDX_DISABLE_ENCRYPTION = 'false'; - - crypto = new Crypto(); - // @ts-expect-error -> init is protected - await crypto.init(); - expect(Crypto.prototype.decrypt.bind(crypto, '')) - .to.throw(Error) - .and.have.property('name', 'InvalidEncryptedFormatError'); - }); - - it('Should return null if text is null.', async () => { - delete process.env.SFDX_DISABLE_ENCRYPTION; + crypto = new Crypto(); + // @ts-expect-error -> init is protected + await crypto.init(); + secret = crypto.encrypt(text); + expect(secret).to.not.equal(text); + }); - crypto = new Crypto(); - // @ts-expect-error -> init is protected - await crypto.init(); - // @ts-expect-error -> null cannot be assigned to string - secret = crypto.encrypt(null); - expect(secret).to.equal(undefined); - }); + it('Should have encrypted the string because SFDX_DISABLE_ENCRYPTION is not defined.', async () => { + setCryptoVersionEnvVar(envVarValue); + delete process.env.SFDX_DISABLE_ENCRYPTION; - it('Should return null if text is undefined.', async () => { - delete process.env.SFDX_DISABLE_ENCRYPTION; + crypto = new Crypto(); + // @ts-expect-error -> init is protected + await crypto.init(); + secret = crypto.encrypt(text); + expect(secret).to.not.equal(text); + }); - crypto = new Crypto(); - // @ts-expect-error: access protected method - await crypto.init(); - // @ts-expect-error: falsy value - secret = crypto.encrypt(undefined); - expect(secret).to.equal(undefined); - }); - - it('Decrypt should fail without env var, and add extra message', async () => { - const message = Messages.load('@salesforce/core', 'encryption', ['macKeychainOutOfSync']).getMessage( - 'macKeychainOutOfSync' - ); - const err = Error('Failed to decipher auth data. reason: Unsupported state or unable to authenticate data.'); - const sfdxErr = SfError.wrap(err); - sfdxErr.actions = []; - sfdxErr.actions[0] = message; - stubMethod($$.SANDBOX, os, 'platform').returns('darwin'); - crypto = new Crypto(); - // @ts-expect-error -> init is protected - await crypto.init(); - $$.SANDBOX.stub(crypto, 'decrypt').throws(sfdxErr); - expect(() => crypto.decrypt('abcdefghijklmnopqrstuvwxyz:123456789')).to.throw( - 'Failed to decipher auth data. reason: Unsupported state or unable to authenticate data.' - ); - try { - shouldThrowSync(() => crypto.decrypt('abcdefghijklmnopqrstuvwxyz:123456789')); - } catch (error) { - const sfError = error as SfError; - if (!sfError.actions) throw new Error('sfError.actions is undefined'); - expect(sfError.actions[0]).to.equal(message); - } - }); - - it('Decrypt should fail but not add extra message with env var', async () => { - process.env.SFDX_USE_GENERIC_UNIX_KEYCHAIN = 'false'; - const message: string = Messages.load('@salesforce/core', 'encryption', ['authDecryptError']).getMessage( - 'authDecryptError' - ); - const errorMessage: object = SfError.wrap(new Error(message)); - stubMethod($$.SANDBOX, os, 'platform').returns('darwin'); - stubMethod($$.SANDBOX, crypto, 'decrypt').callsFake(() => ({ - setAuthTag: () => { - throw errorMessage; - }, - update: () => {}, - final: () => {}, - })); - crypto = new Crypto(); - // @ts-expect-error -> init is protected - await crypto.init(); - // @ts-expect-error: secret is not a string - expect(() => crypto.decrypt(secret)).to.not.throw(message); - delete process.env.SFDX_USE_GENERIC_UNIX_KEYCHAIN; - }); - } + it('Should have decrypted the string even if SFDX_DISABLE_ENCRYPTION is "true"', async () => { + setCryptoVersionEnvVar(envVarValue); + process.env.SFDX_DISABLE_ENCRYPTION = 'true'; + + crypto = new Crypto(); + // @ts-expect-error -> init is protected + await crypto.init(); + const str = '123456'; + const encrypted = crypto.encrypt(str); + const decrypted = crypto.decrypt(encrypted); + expect(encrypted).to.not.equal(str); + expect(decrypted).to.equal(str); + }); + + it('InvalidEncryptedFormatError action', async () => { + setCryptoVersionEnvVar(envVarValue); + process.env.SFDX_DISABLE_ENCRYPTION = 'false'; + + crypto = new Crypto(); + // @ts-expect-error -> init is protected + await crypto.init(); + expect(Crypto.prototype.decrypt.bind(crypto, 'foo')).to.throw(Error).and.have.property('actions'); + }); + + it('InvalidEncryptedFormatError name', async () => { + setCryptoVersionEnvVar(envVarValue); + process.env.SFDX_DISABLE_ENCRYPTION = 'false'; + + crypto = new Crypto(); + // @ts-expect-error -> init is protected + await crypto.init(); + expect(Crypto.prototype.decrypt.bind(crypto, '')) + .to.throw(Error) + .and.have.property('name', 'InvalidEncryptedFormatError'); + }); + + it('Should return null if text is null.', async () => { + setCryptoVersionEnvVar(envVarValue); + delete process.env.SFDX_DISABLE_ENCRYPTION; + + crypto = new Crypto(); + // @ts-expect-error -> init is protected + await crypto.init(); + // @ts-expect-error -> null cannot be assigned to string + secret = crypto.encrypt(null); + expect(secret).to.equal(undefined); + }); + + it('Should return null if text is undefined.', async () => { + setCryptoVersionEnvVar(envVarValue); + delete process.env.SFDX_DISABLE_ENCRYPTION; + + crypto = new Crypto(); + // @ts-expect-error: access protected method + await crypto.init(); + // @ts-expect-error: falsy value + secret = crypto.encrypt(undefined); + expect(secret).to.equal(undefined); + }); + + it('Decrypt should fail without env var, and add extra message', async () => { + setCryptoVersionEnvVar(envVarValue); + const message = Messages.loadMessages('@salesforce/core', 'encryption').getMessage('macKeychainOutOfSync'); + const err = Error('Failed to decipher auth data. reason: Unsupported state or unable to authenticate data.'); + const sfdxErr = SfError.wrap(err); + sfdxErr.actions = []; + sfdxErr.actions[0] = message; + stubMethod($$.SANDBOX, os, 'platform').returns('darwin'); + crypto = new Crypto(); + // @ts-expect-error -> init is protected + await crypto.init(); + $$.SANDBOX.stub(crypto, 'decrypt').throws(sfdxErr); + expect(() => crypto.decrypt('abcdefghijklmnopqrstuvwxyz:123456789')).to.throw( + 'Failed to decipher auth data. reason: Unsupported state or unable to authenticate data.' + ); + try { + shouldThrowSync(() => crypto.decrypt('abcdefghijklmnopqrstuvwxyz:123456789')); + } catch (error) { + const sfError = error as SfError; + if (!sfError.actions) throw new Error('sfError.actions is undefined'); + expect(sfError.actions[0]).to.equal(message); + } + }); + + it('Decrypt should fail but not add extra message with env var', async () => { + setCryptoVersionEnvVar(envVarValue); + process.env.SF_USE_GENERIC_UNIX_KEYCHAIN = 'false'; + const message: string = Messages.loadMessages('@salesforce/core', 'encryption').getMessage('authDecryptError'); + const errorMessage: object = SfError.wrap(new Error(message)); + stubMethod($$.SANDBOX, os, 'platform').returns('darwin'); + stubMethod($$.SANDBOX, crypto, 'decrypt').callsFake(() => ({ + setAuthTag: () => { + throw errorMessage; + }, + update: () => {}, + final: () => {}, + })); + crypto = new Crypto(); + // @ts-expect-error -> init is protected + await crypto.init(); + // @ts-expect-error: secret is not a string + expect(() => crypto.decrypt(secret)).to.not.throw(message); + delete process.env.SF_USE_GENERIC_UNIX_KEYCHAIN; + }); + } + }; + + describe('crypto with v1 key, no env var, does v1 crypto', () => { + runTests({ keyVersion: 'v1' }); + }); + + describe('crypto with v1 key, SF_CRYPTO_V2=false, does v1 crypto', () => { + runTests({ keyVersion: 'v1', envVarValue: false }); + }); + + describe('crypto with v1 key, SF_CRYPTO_V2=true, does v1 crypto', () => { + runTests({ keyVersion: 'v1', envVarValue: true }); + }); + + describe('crypto with v2 key, no env var, does v2 crypto', () => { + runTests({ keyVersion: 'v2' }); + }); + + describe('crypto with v2 key, SF_CRYPTO_V2=true, does v2 crypto', () => { + runTests({ keyVersion: 'v2', envVarValue: true }); + }); + + describe('crypto with v2 key, SF_CRYPTO_V2=false, does v2 crypto', () => { + runTests({ keyVersion: 'v2', envVarValue: false }); + }); }); diff --git a/test/unit/crypto/keyChainImplTest.ts b/test/unit/crypto/keyChainImplTest.ts index c597dba2b7..5bf415039b 100644 --- a/test/unit/crypto/keyChainImplTest.ts +++ b/test/unit/crypto/keyChainImplTest.ts @@ -11,7 +11,7 @@ /* eslint-disable no-underscore-dangle */ /* eslint-disable @typescript-eslint/no-unsafe-assignment */ -import * as fs from 'fs'; +import fs from 'node:fs'; import { assert, expect } from 'chai'; import { KeychainAccess, keyChainImpl } from '../../../src/crypto/keyChainImpl'; import { shouldThrow, TestContext } from '../../../src/testSetup'; diff --git a/test/unit/crypto/keyChainTest.ts b/test/unit/crypto/keyChainTest.ts index c494fc1693..ce743232b9 100644 --- a/test/unit/crypto/keyChainTest.ts +++ b/test/unit/crypto/keyChainTest.ts @@ -5,11 +5,10 @@ * 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 fs from 'fs'; +import * as path from 'node:path'; +import * as fs from 'node:fs'; import { Nullable } from '@salesforce/ts-types'; import { expect } from 'chai'; -import * as _ from 'lodash'; import { retrieveKeychain } from '../../../src/crypto/keyChain'; import { GenericUnixKeychainAccess, @@ -20,23 +19,23 @@ import { TestContext } from '../../../src/testSetup'; describe('keyChain', () => { const $$ = new TestContext(); - const OLD_SFDX_GENERIC_VAL = process.env.SFDX_USE_GENERIC_UNIX_KEYCHAIN; + const OLD_SFDX_GENERIC_VAL = process.env.SF_USE_GENERIC_UNIX_KEYCHAIN; const OLD_GENERIC_VAL = process.env.USE_GENERIC_UNIX_KEYCHAIN; beforeEach(() => { // Testing crypto functionality, so restore global stubs. $$.SANDBOXES.CRYPTO.restore(); - process.env.SFDX_USE_GENERIC_UNIX_KEYCHAIN = 'false'; + process.env.SF_USE_GENERIC_UNIX_KEYCHAIN = 'false'; process.env.USE_GENERIC_UNIX_KEYCHAIN = 'false'; }); after(() => { - process.env.SFDX_USE_GENERIC_UNIX_KEYCHAIN = OLD_SFDX_GENERIC_VAL || ''; - process.env.USE_GENERIC_UNIX_KEYCHAIN = OLD_GENERIC_VAL || ''; + process.env.SF_USE_GENERIC_UNIX_KEYCHAIN = OLD_SFDX_GENERIC_VAL ?? ''; + process.env.USE_GENERIC_UNIX_KEYCHAIN = OLD_GENERIC_VAL ?? ''; }); - it('should return OSX keychain and lib secret', () => { + it('should return OSX keychain and lib secret', async () => { $$.SANDBOX.stub(keyChainImpl.linux, 'validateProgram').resolves(); const testArray = [ @@ -47,22 +46,30 @@ describe('keyChain', () => { }, ]; - const promiseArray = testArray.map((obj) => retrieveKeychain(obj.osName)); - - return Promise.all(promiseArray).then((_keychains) => { - _.forEach(_keychains, (_keychain: any) => { - expect(_keychain).to.have.property('osImpl'); - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call - const program = _keychain['osImpl'].getProgram(); - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call - const testArrayMeta = _.find(testArray, (elem: any) => program.includes(elem.validateString)); - expect(testArrayMeta == null).to.be.false; - }); + const keyChains = await Promise.all(testArray.map((obj) => retrieveKeychain(obj.osName))); + keyChains.map((kc) => { + expect(kc).to.have.property('osImpl'); + // @ts-expect-error osImpl is a private member + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call + const program = kc['osImpl'].getProgram(); + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call + const testArrayMeta = testArray.find((elem) => program.includes(elem.validateString)); + expect(testArrayMeta == null).to.be.false; }); + // return Promise.all(promiseArray).then((_keychains) => { + // _.forEach(_keychains, (_keychain: any) => { + // expect(_keychain).to.have.property('osImpl'); + // // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call + // const program = _keychain['osImpl'].getProgram(); + // // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call + // const testArrayMeta = _.find(testArray, (elem: any) => program.includes(elem.validateString)); + // expect(testArrayMeta == null).to.be.false; + // }); + // }); }); it('should return generic unix for OSX and Linux', async () => { - process.env.SFDX_USE_GENERIC_UNIX_KEYCHAIN = 'true'; + process.env.SF_USE_GENERIC_UNIX_KEYCHAIN = 'true'; const darwinKeychain = await retrieveKeychain('darwin'); const linuxKeychain = await retrieveKeychain('linux'); diff --git a/test/unit/crypto/secureStringTest.ts b/test/unit/crypto/secureStringTest.ts index e7548433ef..f0ed3e18e7 100644 --- a/test/unit/crypto/secureStringTest.ts +++ b/test/unit/crypto/secureStringTest.ts @@ -4,7 +4,7 @@ * 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 crypto from 'crypto'; +import crypto from 'node:crypto'; import { expect } from 'chai'; import { stub } from 'sinon'; import { SecureBuffer } from '../../../src/crypto/secureBuffer'; diff --git a/test/unit/deviceOauthServiceTest.ts b/test/unit/deviceOauthServiceTest.ts index bca1766a6c..957a2d4c92 100644 --- a/test/unit/deviceOauthServiceTest.ts +++ b/test/unit/deviceOauthServiceTest.ts @@ -7,12 +7,13 @@ /* eslint-disable camelcase */ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ -import { Transport } from 'jsforce/lib/transport'; +import { Transport } from '@jsforce/jsforce-node/lib/transport'; import { StubbedType, stubInterface, stubMethod } from '@salesforce/ts-sinon'; import { expect } from 'chai'; import { MockTestOrgData, TestContext } from '../../src/testSetup'; import { DeviceOauthService } from '../../src/deviceOauthService'; -import { AuthFields, AuthInfo, DEFAULT_CONNECTED_APP_INFO, SFDX_HTTP_HEADERS } from '../../src/org'; +import { AuthFields, AuthInfo, DEFAULT_CONNECTED_APP_INFO } from '../../src/org/authInfo'; +import { SFDX_HTTP_HEADERS } from '../../src/org/connection'; const deviceCodeResponse = { device_code: '1234', @@ -32,6 +33,8 @@ const devicePollingResponse = { issued_at: '1234', }; +const htmlResponse = 'Server down for maintenance'; + type UnknownError = { error: string; status: number; @@ -70,18 +73,40 @@ describe('DeviceOauthService', () => { describe('requestDeviceLogin', () => { it('should return the device code response', async () => { stubMethod($$.SANDBOX, Transport.prototype, 'httpRequest').returns( - Promise.resolve({ body: JSON.stringify(deviceCodeResponse) }) + Promise.resolve({ + body: JSON.stringify(deviceCodeResponse), + headers: { 'content-type': 'application/json;charset=UTF-8' }, + }) ); const service = await DeviceOauthService.create({}); const login = await service.requestDeviceLogin(); expect(login).to.deep.equal(deviceCodeResponse); }); + + it('should handle HTML response with proper error', async () => { + stubMethod($$.SANDBOX, Transport.prototype, 'httpRequest').returns( + Promise.resolve({ body: htmlResponse, headers: { 'content-type': 'text/html' } }) + ); + const service = await DeviceOauthService.create({}); + try { + await service.requestDeviceLogin(); + expect(true).to.be.false; + } catch (err) { + expect(err).to.have.property('name', 'HttpApiError'); + expect(err) + .to.have.property('message') + .and.contain('HTTP response contains html content. Check that the org exists and can be reached.'); + } + }); }); describe('awaitDeviceApproval', () => { it('should return the device polling response', async () => { stubMethod($$.SANDBOX, Transport.prototype, 'httpRequest').returns( - Promise.resolve({ body: JSON.stringify(devicePollingResponse) }) + Promise.resolve({ + body: JSON.stringify(devicePollingResponse), + headers: { 'content-type': 'application/json;charset=UTF-8' }, + }) ); const service = await DeviceOauthService.create({}); const approval = await service.awaitDeviceApproval(deviceCodeResponse); @@ -95,10 +120,16 @@ describe('DeviceOauthService', () => { Promise.resolve({ statusCode: 400, body: JSON.stringify({ error: 'authorization_pending' }), + headers: { 'content-type': 'application/json;charset=UTF-8' }, }) ) .onSecondCall() - .returns(Promise.resolve({ body: JSON.stringify(devicePollingResponse) })); + .returns( + Promise.resolve({ + body: JSON.stringify(devicePollingResponse), + headers: { 'content-type': 'application/json;charset=UTF-8' }, + }) + ); const shouldContinuePollingStub = stubMethod($$.SANDBOX, DeviceOauthService.prototype, 'shouldContinuePolling') .onFirstCall() .returns(true) @@ -118,6 +149,7 @@ describe('DeviceOauthService', () => { service.pollingCount = DeviceOauthService.POLLING_COUNT_MAX + 1; try { await service.awaitDeviceApproval(deviceCodeResponse); + expect(true).to.be.false; } catch (err) { expect((err as Error).name).to.equal('PollingTimeoutError'); } @@ -131,6 +163,7 @@ describe('DeviceOauthService', () => { const service = await DeviceOauthService.create({}); try { await service.awaitDeviceApproval(deviceCodeResponse); + expect(true).to.be.false; } catch (err) { // @ts-expect-error: because private member expect(service.pollingCount).to.equal(0); @@ -145,10 +178,12 @@ describe('DeviceOauthService', () => { error: 'Invalid grant type', error_description: 'Invalid grant type', }), + headers: { 'content-type': 'application/json;charset=UTF-8' }, })); const service = await DeviceOauthService.create({}); try { await service.awaitDeviceApproval(deviceCodeResponse); + expect(true).to.be.false; } catch (err) { // @ts-expect-error: because private member expect(service.pollingCount).to.equal(0); diff --git a/test/unit/globalTest.ts b/test/unit/globalTest.ts index cae4620e48..5ccbf88b54 100644 --- a/test/unit/globalTest.ts +++ b/test/unit/globalTest.ts @@ -5,17 +5,28 @@ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause */ import { expect } from 'chai'; +import { isString } from '@salesforce/ts-types'; import { Global, Mode } from '../../src/global'; describe('Global', () => { describe('environmentMode', () => { - const sfdxEnv = process.env.SFDX_ENV; + const originalEnv = { SFDX_ENV: process.env.SFDX_ENV, SF_ENV: process.env.SF_ENV }; + const cleanEnv = () => Object.keys(originalEnv).map((key) => delete process.env[key]); + + beforeEach(() => { + cleanEnv(); + }); after(() => { - process.env.SFDX_ENV = sfdxEnv; + cleanEnv(); + Object.entries(originalEnv) + .filter(([, value]) => isString(value)) + .map(([key, value]) => { + process.env[key] = value; + }); }); - it('uses SFDX_ENV mode', () => { + it('uses SFDX_ENV mode alone', () => { process.env.SFDX_ENV = 'development'; expect(Global.getEnvironmentMode() === Mode.DEVELOPMENT).to.be.true; expect(Global.getEnvironmentMode() === Mode.PRODUCTION).to.be.false; @@ -23,8 +34,64 @@ describe('Global', () => { expect(Global.getEnvironmentMode() === Mode.TEST).to.be.false; }); + it('uses SF_ENV mode alone', () => { + process.env.SF_ENV = 'development'; + expect(Global.getEnvironmentMode() === Mode.DEVELOPMENT).to.be.true; + expect(Global.getEnvironmentMode() === Mode.PRODUCTION).to.be.false; + expect(Global.getEnvironmentMode() === Mode.DEMO).to.be.false; + expect(Global.getEnvironmentMode() === Mode.TEST).to.be.false; + }); + + it('prefers SF_ENV mode', () => { + process.env.SF_ENV = 'test'; + process.env.SFDX_ENV = 'development'; + expect(Global.getEnvironmentMode() === Mode.DEVELOPMENT).to.be.false; + expect(Global.getEnvironmentMode() === Mode.PRODUCTION).to.be.false; + expect(Global.getEnvironmentMode() === Mode.DEMO).to.be.false; + expect(Global.getEnvironmentMode() === Mode.TEST).to.be.true; + }); + + it('finds uppercase', () => { + process.env.SF_ENV = 'TEST'; + expect(Global.getEnvironmentMode() === Mode.DEVELOPMENT).to.be.false; + expect(Global.getEnvironmentMode() === Mode.PRODUCTION).to.be.false; + expect(Global.getEnvironmentMode() === Mode.DEMO).to.be.false; + expect(Global.getEnvironmentMode() === Mode.TEST).to.be.true; + }); + + it('finds lowercase', () => { + process.env.SF_ENV = 'demo'; + expect(Global.getEnvironmentMode() === Mode.DEVELOPMENT).to.be.false; + expect(Global.getEnvironmentMode() === Mode.PRODUCTION).to.be.false; + expect(Global.getEnvironmentMode() === Mode.DEMO).to.be.true; + expect(Global.getEnvironmentMode() === Mode.TEST).to.be.false; + }); + + it('finds mixed case', () => { + process.env.SF_ENV = 'dEvelOpment'; + expect(Global.getEnvironmentMode() === Mode.DEVELOPMENT).to.be.true; + expect(Global.getEnvironmentMode() === Mode.PRODUCTION).to.be.false; + expect(Global.getEnvironmentMode() === Mode.DEMO).to.be.false; + expect(Global.getEnvironmentMode() === Mode.TEST).to.be.false; + }); + it('is production by default', () => { - delete process.env.SFDX_ENV; + expect(Global.getEnvironmentMode() === Mode.DEVELOPMENT).to.be.false; + expect(Global.getEnvironmentMode() === Mode.PRODUCTION).to.be.true; + expect(Global.getEnvironmentMode() === Mode.DEMO).to.be.false; + expect(Global.getEnvironmentMode() === Mode.TEST).to.be.false; + }); + + it('defaults to production when invalid values are specified (SFDX)', () => { + process.env.SFDX_ENV = 'notARealMode'; + expect(Global.getEnvironmentMode() === Mode.DEVELOPMENT).to.be.false; + expect(Global.getEnvironmentMode() === Mode.PRODUCTION).to.be.true; + expect(Global.getEnvironmentMode() === Mode.DEMO).to.be.false; + expect(Global.getEnvironmentMode() === Mode.TEST).to.be.false; + }); + + it('defaults to production when invalid values are specified (SF)', () => { + process.env.SF_ENV = 'notARealMode'; expect(Global.getEnvironmentMode() === Mode.DEVELOPMENT).to.be.false; expect(Global.getEnvironmentMode() === Mode.PRODUCTION).to.be.true; expect(Global.getEnvironmentMode() === Mode.DEMO).to.be.false; diff --git a/test/unit/helpers.ts b/test/unit/helpers.ts index 9e27d8520e..d81963acd9 100644 --- a/test/unit/helpers.ts +++ b/test/unit/helpers.ts @@ -5,7 +5,9 @@ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause */ import { isString } from '@salesforce/ts-types'; - +import { expect } from 'chai'; +import { omit } from '@salesforce/kit'; +import { AuthFields } from '../../src'; /** * A test implementation of NodeJS.ErrnoException for mocking fs errors. */ @@ -24,10 +26,16 @@ export class ErrnoException extends Error implements NodeJS.ErrnoException { ) { if (isString(messageOrOptions)) { super(messageOrOptions); + Object.assign(this, options ?? {}); } else { super(); - options = messageOrOptions; + Object.assign(this, messageOrOptions ?? {}); } - Object.assign(this, options || {}); } } + +export const expectPartialDeepMatch = ( + actual: AuthFields, + expected: AuthFields, + ignore = ['refreshToken', 'accessToken'] +): Chai.Assertion => expect(omit(actual, ignore)).to.deep.equal(omit(expected, ignore)); diff --git a/test/unit/lifecycleEventsTest.ts b/test/unit/lifecycleEventsTest.ts index 4a1ca09d6f..07e08edb91 100644 --- a/test/unit/lifecycleEventsTest.ts +++ b/test/unit/lifecycleEventsTest.ts @@ -9,8 +9,9 @@ import { Duration, sleep } from '@salesforce/kit/lib/duration'; import { spyMethod } from '@salesforce/ts-sinon'; import * as chai from 'chai'; -import { Lifecycle } from '../../src/lifecycleEvents'; +import { Lifecycle, callback, cloneUniqueListeners } from '../../src/lifecycleEvents'; import { TestContext } from '../../src/testSetup'; +import { Logger } from '../../src/logger/logger'; describe('lifecycleEvents', () => { const $$ = new TestContext(); @@ -26,7 +27,7 @@ describe('lifecycleEvents', () => { const fake = new Foo(); beforeEach(() => { - loggerSpy = spyMethod($$.SANDBOX, Lifecycle.getInstance(), 'debug'); + loggerSpy = spyMethod($$.SANDBOX, Logger.prototype, 'debug'); fakeSpy = spyMethod($$.SANDBOX, fake, 'bar'); }); @@ -69,6 +70,45 @@ describe('lifecycleEvents', () => { Lifecycle.getInstance().removeAllListeners('telemetry'); }); + it("uniqueListeners adds listeners only when they don't already exist", async () => { + Lifecycle.getInstance().on( + 'test1', + async (result) => { + // @ts-expect-error: called is a sinon spy property + fake.bar('test1', result); + }, + 'id000' + ); + chai.expect(Lifecycle.getInstance().getListeners('test1').length).to.equal(1); + Lifecycle.getInstance().on( + 'test1', + async (result) => { + // @ts-expect-error: called is a sinon spy property + fake.bar('test1', result); + }, + 'id001' + ); + // both of these should be ignored + chai.expect(Lifecycle.getInstance().getListeners('test1').length).to.equal(2); + Lifecycle.getInstance().on( + 'test1', + async (result) => { + // @ts-expect-error: called is a sinon spy property + fake.bar('test1', result); + }, + 'id000' + ); + chai.expect(Lifecycle.getInstance().getListeners('test1').length).to.equal(2); + Lifecycle.getInstance().on( + 'test1', + async (result) => { + // @ts-expect-error: called is a sinon spy property + fake.bar('test1', result); + }, + 'id001' + ); + Lifecycle.getInstance().removeAllListeners('test1'); + }); it('successful event registration and emitting causes the callback to be called', async () => { Lifecycle.getInstance().on('test1', async (result) => { // @ts-expect-error: called is a sinon spy property @@ -131,13 +171,24 @@ describe('lifecycleEvents', () => { // @ts-expect-error: called is a sinon spy property fake.bar('test5', result); }); + Lifecycle.getInstance().on( + 'test5', + async (result) => { + // @ts-expect-error: called is a sinon spy property + fake.bar('test5', result); + }, + 'id000' + ); await Lifecycle.getInstance().emit('test5', 'Success'); - chai.expect(fakeSpy.callCount).to.be.equal(1); + chai.expect(fakeSpy.callCount).to.be.equal(2); chai.expect(fakeSpy.args[0][1]).to.be.equal('Success'); - + chai.expect(fakeSpy.args[1][1]).to.be.equal('Success'); + loggerSpy.resetHistory(); + fakeSpy.resetHistory(); Lifecycle.getInstance().removeAllListeners('test5'); await Lifecycle.getInstance().emit('test5', 'Failure: Listener Removed'); - chai.expect(fakeSpy.callCount).to.be.equal(1); + chai.expect(fakeSpy.callCount).to.be.equal(0); + chai.expect(loggerSpy.callCount).to.be.equal(1); chai .expect(loggerSpy.args[0][0]) @@ -146,7 +197,7 @@ describe('lifecycleEvents', () => { ); }); - it('getListeners works', async () => { + it('getListeners works, including uniqueListeners', async () => { const x = async (result: Record) => { // eslint-disable-next-line @typescript-eslint/no-unsafe-argument fake.bar('test6', result); @@ -159,6 +210,36 @@ describe('lifecycleEvents', () => { Lifecycle.getInstance().removeAllListeners('test6'); }); + it('getListeners works (unique Listeners)', async () => { + const x = async (result: Record) => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument + fake.bar('test6', result); + }; + Lifecycle.getInstance().on('test6', x, 'id000'); + + chai.expect(Lifecycle.getInstance().getListeners('test6')).to.have.lengthOf(1); + chai.expect(Lifecycle.getInstance().getListeners('test6')[0]).to.deep.equal(x); + + chai.expect(Lifecycle.getInstance().getListeners('undefinedKey').length).to.be.equal(0); + Lifecycle.getInstance().removeAllListeners('test6'); + }); + + it('getListeners works (mixed unique and non-unique)', async () => { + const x = async (result: Record) => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument + fake.bar('test6', result); + }; + Lifecycle.getInstance().on('test6', x); + Lifecycle.getInstance().on('test6', x, 'id000'); + + chai.expect(Lifecycle.getInstance().getListeners('test6')).to.have.lengthOf(2); + chai.expect(Lifecycle.getInstance().getListeners('test6')[0]).to.deep.equal(x); + chai.expect(Lifecycle.getInstance().getListeners('test6')[1]).to.deep.equal(x); + + chai.expect(Lifecycle.getInstance().getListeners('undefinedKey').length).to.be.equal(0); + Lifecycle.getInstance().removeAllListeners('test6'); + }); + it('will use a newer version and transfer the listeners', () => { // the original const lifecycle = Lifecycle.getInstance(); @@ -176,3 +257,29 @@ describe('lifecycleEvents', () => { lifecycle2.removeAllListeners('test7'); }); }); + +describe('listener map cloning', () => { + const cb = (): Promise => Promise.resolve(); + it('clones map, breaking event name reference', () => { + const map1 = new Map>(); + map1.set('evt', new Map([['uniqueId', cb]])); + + const map2 = cloneUniqueListeners(map1); + chai.expect(map2).to.deep.equal(map1); + map1.delete('evt'); + chai.expect(map1.has('evt')).to.be.false; + chai.expect(map2.has('evt')).to.be.true; + }); + it('clones map, breaking uniqueId reference', () => { + const map1 = new Map>(); + map1.set('evt', new Map([['uniqueId', cb]])); + + const map2 = cloneUniqueListeners(map1); + chai.expect(map2).to.deep.equal(map1); + map2.get('evt')?.set('uniqueId2', cb); + chai.expect(map1.has('evt')).to.be.true; + chai.expect(map2.has('evt')).to.be.true; + chai.expect(map1.get('evt')?.has('uniqueId2')).to.be.false; + chai.expect(map2.get('evt')?.has('uniqueId2')).to.be.true; + }); +}); diff --git a/test/unit/logger/cleanupTest.ts b/test/unit/logger/cleanupTest.ts new file mode 100644 index 0000000000..cce40460e2 --- /dev/null +++ b/test/unit/logger/cleanupTest.ts @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2023, 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 { expect } from 'chai'; +import { getOldLogFiles } from '../../../src/logger/cleanup'; + +describe('cleanup', () => { + describe('not deleted', () => { + it('non log files', () => { + expect(getOldLogFiles(['foo.txt', 'sf-2021-08-10.not-a-log'])).to.deep.equal([]); + }); + it('files from bunyan logger', () => { + const files = ['sf.log', 'sf.log.1', 'sf.log.2']; + expect(getOldLogFiles(files)).to.deep.equal([]); + }); + it('very recent files', () => { + const files = [`sf-${new Date().toISOString().slice(0, 10)}.log`]; + expect(getOldLogFiles(files)).to.deep.equal([]); + }); + it('6 days old files', () => { + const files = [`sf-${new Date(Date.now() - 1000 * 60 * 60 * 24 * 6).toISOString().slice(0, 10)}.log`]; + expect(getOldLogFiles(files)).to.deep.equal([]); + }); + it('100 days old files when maxMS is higher', () => { + const files = [`sf-${new Date(Date.now() - 1000 * 60 * 60 * 24 * 100).toISOString().slice(0, 10)}.log`]; + expect(getOldLogFiles(files, 1000 * 60 * 60 * 24 * 200)).to.deep.equal([]); + }); + }); + describe('deleted', () => { + it('will delete an old daily file', () => { + const files = ['sf-2021-08-10.log']; + expect(getOldLogFiles(files)).to.deep.equal(files); + }); + it('will delete an old hourly file', () => { + const files = ['sf-2021-08-10T18.log']; + expect(getOldLogFiles(files)).to.deep.equal(files); + }); + it('8 day old files', () => { + const files = [`sf-${new Date(Date.now() - 1000 * 60 * 60 * 24 * 8).toISOString().slice(0, 10)}.log`]; + expect(getOldLogFiles(files)).to.deep.equal(files); + }); + it('1 day old files when maxMs = 0', () => { + const files = [`sf-${new Date(Date.now() - 1000 * 60 * 60 * 24 * 1).toISOString().slice(0, 10)}.log`]; + expect(getOldLogFiles(files, 0)).to.deep.equal(files); + }); + }); +}); diff --git a/test/unit/logger/filterTest.ts b/test/unit/logger/filterTest.ts new file mode 100644 index 0000000000..26f3ce8a5e --- /dev/null +++ b/test/unit/logger/filterTest.ts @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2023, 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 { assert, expect, config } from 'chai'; +import { filterSecrets, HIDDEN } from '../../../src/logger/filters'; +import { unwrapArray } from '../../../src/util/unwrapArray'; + +config.truncateThreshold = 0; + +describe('filters', () => { + const sid = '00D55000000M2qA!AQ0AQHg3LnYDOyobmH07'; + const simpleString = `sid=${sid}`; + const stringWithObject = ` The rain in Spain: ${JSON.stringify({ + // eslint-disable-next-line camelcase + access_token: sid, + })}`; + + it(`filters ${simpleString} correctly`, () => { + const result = getUnwrapped(simpleString); + expect(result).to.not.contain(sid); + expect(result).to.contain('REDACTED ACCESS TOKEN'); + }); + + it(`filters ${stringWithObject} correctly`, () => { + const result = getUnwrapped(stringWithObject); + expect(result).to.not.contain(sid); + expect(result).to.contain('REDACTED ACCESS TOKEN'); + }); + + it('filters regular object correctly', () => { + const result = getUnwrapped({ accessToken: `${sid}`, refreshToken: `${sid}` }); + assert(result); + const bigString = JSON.stringify(result); + expect(bigString).to.not.contain(sid); + expect(bigString).to.contain('REDACTED ACCESS TOKEN'); + expect(bigString).to.contain('refresh_token - HIDDEN'); + }); + + it('filters key/value object correctly', () => { + const result = getUnwrapped({ key: 'Access Token', value: `${sid}` }); + assert(result); + const bigString = JSON.stringify(result); + expect(bigString).to.not.contain(sid); + expect(bigString).to.contain('REDACTED ACCESS TOKEN'); + }); + + it('filters auth code correctly', () => { + const result = getUnwrapped({ authCode: 'authcode value' }); + assert(result); + const bigString = JSON.stringify(result); + expect(bigString).to.not.contain('authCode value'); + expect(bigString).to.contain('authcode - HIDDEN'); + }); + + describe('client id', () => { + it('filters clientId correctly', () => { + const result = getUnwrapped({ clientId: 'clientIdValue' }); + assert(result); + const bigString = JSON.stringify(result); + expect(bigString).to.not.contain('clientIdValue'); + expect(bigString).to.contain('REDACTED CLIENT ID'); + }); + + it('filters clientId correctly (case insensitive)', () => { + const result = getUnwrapped({ ClientId: 'clientIdValue' }); + assert(result); + const bigString = JSON.stringify(result); + expect(bigString).to.not.contain('clientIdValue'); + expect(bigString).to.contain('REDACTED CLIENT ID'); + }); + + it('filters clientId correctly (separator)', () => { + // eslint-disable-next-line camelcase + const result = getUnwrapped({ Client_Id: 'clientIdValue' }); + assert(result); + const bigString = JSON.stringify(result); + expect(bigString).to.not.contain('clientIdValue'); + expect(bigString).to.contain('REDACTED CLIENT ID'); + }); + }); + + it('filters array correctly', () => { + const result = getUnwrapped([ + { key: 'ACCESS token ', value: `${sid}` }, + { key: 'refresh TOKEN', value: `${sid}` }, + { key: 'Sfdx Auth Url', value: `${sid}` }, + ]); + assert(result); + assert(Array.isArray(result)); + const bigString = JSON.stringify(result); + + expect(bigString).to.not.contain(sid); + expect(bigString).to.contain('REDACTED ACCESS TOKEN'); + expect(bigString).to.contain('refresh_token - HIDDEN'); + }); + + it('filters another array correctly', () => { + const result = getUnwrapped([ + { key: ' AcCESS 78token', value: ` ${sid} ` }, + { key: ' refresh _TOKEn ', value: ` ${sid} ` }, + { key: ' SfdX__AuthUrl ', value: ` ${sid} ` }, + ]); + assert(result); + assert(Array.isArray(result)); + const bigString = JSON.stringify(result); + expect(bigString).to.not.contain(sid); + expect(bigString).to.contain(HIDDEN); + expect(bigString).to.contain('refresh_token - HIDDEN'); + }); + + describe('does not filter innocent stuff', () => { + it('basic string', () => { + const result = getUnwrapped('some string'); + expect(result).to.equal('some string'); + }); + it('basic object', () => { + const input = { foo: 'bar' }; + const result = getUnwrapped(input); + expect(result).to.deep.equal(input); + }); + it('basic array', () => { + const input = ['foo', 'bar']; + const result = getUnwrapped(input); + expect(result).to.deep.equal(input); + }); + it('object with one bad prop', () => { + const input = { foo: 'bar', accessToken: `${sid}` }; + const result = getUnwrapped(input); + expect(result).to.have.property('foo', 'bar'); + expect(result).to.have.property('accessToken').contains('REDACTED ACCESS TOKEN'); + }); + describe('clientId', () => { + it('default connected app', () => { + const input = { clientId: 'PlatformCLI' }; + const result = getUnwrapped(input); + expect(result).to.deep.equal(input); + }); + it('default connected app (case insensitive)', () => { + const input = { ClientID: 'PlatformCLI' }; + const result = getUnwrapped(input); + expect(result).to.deep.equal(input); + }); + it('default connected app (case insensitive)', () => { + // eslint-disable-next-line camelcase + const input = { client_id: 'PlatformCLI' }; + const result = getUnwrapped(input); + expect(result).to.deep.equal(input); + }); + }); + }); +}); + +const getUnwrapped = (input: unknown): unknown => unwrapArray(filterSecrets(input)); diff --git a/test/unit/loggerTest.ts b/test/unit/loggerTest.ts index aa5b5afc8d..cfac7013cd 100644 --- a/test/unit/loggerTest.ts +++ b/test/unit/loggerTest.ts @@ -8,25 +8,31 @@ /* eslint-disable @typescript-eslint/no-unsafe-call */ /* eslint-disable @typescript-eslint/no-unsafe-return */ -import * as fs from 'fs'; -import { isBoolean, isNumber, isString } from '@salesforce/ts-types'; -import { expect } from 'chai'; -import * as debug from 'debug'; -import * as _ from 'lodash'; -import { Logger, LoggerFormat, LoggerLevel, LoggerStream } from '../../src/logger'; +import { expect, config as chaiConfig } from 'chai'; +import { isString } from '@salesforce/ts-types'; +import { Logger, LoggerLevel, computeLevel } from '../../src/logger/logger'; import { shouldThrowSync, TestContext } from '../../src/testSetup'; // NOTE: These tests still use 'await' which is how it use to work and were left to make // sure we didn't regress the way they were used. +chaiConfig.truncateThreshold = 0; describe('Logger', () => { const $$ = new TestContext(); - const sfdxEnv = process.env.SFDX_ENV; - const logRotationPeriodBackup = process.env.SF_LOG_ROTATION_PERIOD; - const logRotationCountBackup = process.env.SF_LOG_ROTATION_COUNT; - - beforeEach(async () => { + const originalEnv = { + SFDX_ENV: process.env.SFDX_ENV, + SF_ENV: process.env.SF_ENV, + SF_LOG_LEVEL: process.env.SF_LOG_LEVEL, + SF_DISABLE_LOG_FILE: process.env.SF_DISABLE_LOG_FILE, + SF_LOG_ROTATION_PERIOD: process.env.SF_LOG_ROTATION_PERIOD, + SF_LOG_ROTATION_COUNT: process.env.SF_LOG_ROTATION_COUNT, + }; + + const cleanEnv = () => Object.keys(originalEnv).map((key) => delete process.env[key]); + beforeEach(() => { + cleanEnv(); process.env.SFDX_ENV = 'test'; + process.env.SF_ENV = 'test'; // Must restore the globally stubbed Logger.child method here. Stubbed in testSetup. // @ts-expect-error: called is a sinon spy property @@ -35,24 +41,86 @@ describe('Logger', () => { afterEach(() => { Logger.destroyRoot(); - if (sfdxEnv) process.env.SFDX_ENV = sfdxEnv; - if (logRotationPeriodBackup) process.env.SF_LOG_ROTATION_PERIOD = logRotationPeriodBackup; - if (logRotationCountBackup) process.env.SF_LOG_ROTATION_COUNT = logRotationCountBackup; + }); + + after(() => { + cleanEnv(); + Object.entries(originalEnv) + .filter(([, value]) => isString(value)) + .map(([key, value]) => { + process.env[key] = value; + }); }); describe('constructor', () => { it('should construct a new named logger', async () => { - const logger1 = new Logger('testLogger'); + const logger1 = new Logger({ name: 'testLogger', useMemoryLogger: true }); expect(logger1).to.be.instanceof(Logger); expect(logger1.getName()).to.equal('testLogger'); const logger2 = await Logger.root(); expect(logger2).to.not.equal(logger1); }); + + describe('DISABLE_LOG_FILE', () => { + before(() => { + process.env.SF_DISABLE_LOG_FILE = 'true'; + }); + + it('should construct a new named logger', async () => { + const logger1 = new Logger({ name: 'testLogger-noop' }); + expect(logger1).to.be.instanceof(Logger); + // @ts-expect-error testing a private property + expect(logger1.memoryLogger).to.be.ok; + expect(logger1.getName()).to.equal('testLogger-noop'); + }); + }); }); describe('levels', () => { + describe('level computation', () => { + it('should use a matching a level name when passed in', () => { + expect(computeLevel('error')).to.equal('error'); + }); + it('number passed in matching a level number', () => { + expect(computeLevel(30)).to.equal('info'); + }); + it('number passed in not matching a level number', () => { + expect(computeLevel(28)).to.equal('info'); + expect(computeLevel(1)).to.equal('trace'); + }); + it('should use default level when nothing passed in and no env', () => { + expect(computeLevel()).to.equal('warn'); + }); + it('env var set to a level name', () => { + process.env.SF_LOG_LEVEL = 'warn'; + expect(computeLevel()).to.equal('warn'); + }); + it('env var set to a level number matching a level number', () => { + process.env.SF_LOG_LEVEL = '30'; + expect(computeLevel()).to.equal('info'); + }); + it('env var set to a level number not matching a level number', () => { + process.env.SF_LOG_LEVEL = '28'; + expect(computeLevel()).to.equal('info'); + process.env.SF_LOG_LEVEL = '1'; + expect(computeLevel()).to.equal('trace'); + }); + it('env var set to an invalid level name', () => { + process.env.SF_LOG_LEVEL = 'goat'; + expect(computeLevel()).to.equal('goat'); + }); + it('should use the env var when env var and value passed in', () => { + process.env.SF_LOG_LEVEL = 'debug'; + expect(computeLevel('error')).to.equal('debug'); + }); + it('should use the env var when env var and value passed in', () => { + process.env.SF_LOG_LEVEL = '30'; + expect(computeLevel('error')).to.equal('info'); + }); + }); + it('should set the log level using a number', () => { - const logger = new Logger('testLogger'); + const logger = new Logger({ name: 'testLogger', useMemoryLogger: true }); logger.setLevel(LoggerLevel.ERROR); expect(logger.getLevel()).to.equal(LoggerLevel.ERROR); logger.setLevel(); @@ -60,7 +128,7 @@ describe('Logger', () => { }); it('should set the log level using a string', () => { - const logger = new Logger('testLogger'); + const logger = new Logger({ name: 'testLogger', useMemoryLogger: true }); logger.setLevel(Logger.getLevelByName('ERROR')); expect(logger.getLevel()).to.equal(LoggerLevel.ERROR); logger.setLevel(Logger.getLevelByName('warn')); @@ -85,7 +153,7 @@ describe('Logger', () => { describe('shouldLog', () => { it('returns correct boolean', () => { - const logger = new Logger('test'); + const logger = new Logger({ name: 'test', useMemoryLogger: true }); logger.setLevel(); expect(logger.shouldLog(LoggerLevel.ERROR)).to.be.true; expect(logger.shouldLog(LoggerLevel.WARN)).to.be.true; @@ -94,69 +162,14 @@ describe('Logger', () => { expect(logger.shouldLog(LoggerLevel.INFO)).to.be.true; expect(logger.shouldLog(LoggerLevel.DEBUG)).to.be.true; expect(logger.shouldLog(LoggerLevel.TRACE)).to.be.false; - logger.setLevel(7); - expect(logger.shouldLog(LoggerLevel.TRACE)).to.be.true; - }); - }); - - describe('addLogFileStream', () => { - const testLogFile = 'some/dir/mylogfile.json'; - let utilAccessStub: sinon.SinonStub; - let utilWriteFileStub: sinon.SinonStub; - - beforeEach(() => { - utilAccessStub = $$.SANDBOX.stub(fs.promises, 'access'); - utilWriteFileStub = $$.SANDBOX.stub(fs.promises, 'writeFile'); - }); - - it('should not create a new log file if it exists already', async () => { - utilAccessStub.resolves({}); - const logger = new Logger('test'); - const addStreamStub = $$.SANDBOX.stub(logger, 'addStream'); - await logger.addLogFileStream(testLogFile); - expect(utilAccessStub.firstCall.args[0]).to.equal(testLogFile); - expect(utilWriteFileStub.called).to.be.false; - const addStreamArgs = addStreamStub.firstCall.args[0]; - expect(addStreamArgs).to.have.property('type', 'rotating-file'); - expect(addStreamArgs).to.have.property('path', testLogFile); - expect(addStreamArgs).to.have.property('level', logger.getLevel()); - }); - - it('should allow log rotation count and period overrides', async () => { - process.env.SF_LOG_ROTATION_PERIOD = '1w'; - process.env.SF_LOG_ROTATION_COUNT = '3'; - - utilAccessStub.returns(Promise.resolve({})); - const logger = new Logger('testing-env-vars'); - const addStreamStub = $$.SANDBOX.stub(logger, 'addStream'); - await logger.addLogFileStream(testLogFile); - - const addStreamArgs = addStreamStub.firstCall.args[0]; - expect(addStreamArgs).to.have.property('period', '1w'); - expect(addStreamArgs).to.have.property('count', 3); - }); - - it('should create a new log file and all directories if nonexistent', async () => { - utilAccessStub.throws(); - const logger = new Logger('testLogger'); - const addStreamStub = $$.SANDBOX.stub(logger, 'addStream'); - await logger.addLogFileStream(testLogFile); - expect(utilAccessStub.firstCall.args[0]).to.equal(testLogFile); - expect(utilWriteFileStub.firstCall.args[0]).to.equal(testLogFile); - expect(utilWriteFileStub.firstCall.args[1]).to.equal(''); - expect(utilWriteFileStub.firstCall.args[2]).to.have.property('mode', '600'); - expect(addStreamStub.called).to.be.true; }); }); describe('root', () => { it('should construct the root SF logger', async () => { - $$.SANDBOX.spy(Logger.prototype, 'addFilter'); const defaultLogger = await Logger.root(); expect(defaultLogger).to.be.instanceof(Logger); expect(defaultLogger.getName()).to.equal('sf'); - // @ts-expect-error: called is a sinon spy property - expect(defaultLogger.addFilter['called'], 'new Logger() should have called addFilter()').to.be.true; const logger = await Logger.root(); expect(logger).to.equal(defaultLogger); }); @@ -168,27 +181,12 @@ describe('Logger', () => { }); it('should create the root logger if not already created', async () => { - $$.SANDBOX.stub(Logger.prototype, 'addLogFileStream'); $$.SANDBOX.spy(Logger, 'root'); const rootLogger = await Logger.root(); expect(rootLogger.getName()).to.equal('sf'); expect(await Logger.root()).to.equal(rootLogger); // @ts-expect-error: called is a sinon spy property expect(Logger.root['called']).to.be.true; - // @ts-expect-error: called is a sinon spy property - expect(rootLogger.addLogFileStream['called']).to.be.false; - }); - - it('should log uncaught exception in root logger', async () => { - process.env.SFDX_ENV = 'dev'; - - const rootLogger = await Logger.root(); - $$.SANDBOX.stub(rootLogger, 'fatal'); - - // @ts-expect-error to access private property `lifecycle` for testing uncaughtException - Logger.lifecycle.emit('uncaughtException', 'testException'); - // @ts-expect-error: called is a sinon spy property - expect(rootLogger.fatal['called']).to.be.true; }); }); @@ -197,101 +195,13 @@ describe('Logger', () => { const childLoggerName = 'myChildLogger'; const childLogger = await Logger.child(childLoggerName); expect(childLogger).to.be.instanceof(Logger); - expect(childLogger.getName()).to.equal(childLoggerName); - }); - - it('should not log uncaught exception in child logger', async () => { - process.env.SFDX_ENV = 'dev'; - - const childLoggerName = 'myChildLogger'; - const childLogger = await Logger.child(childLoggerName); - $$.SANDBOX.stub(childLogger, 'fatal'); - - // @ts-expect-error to access private property `lifecycle` for testing uncaughtException - Logger.lifecycle.emit('uncaughtException', 'testException'); - // @ts-expect-error: called is a sinon spy property - expect(childLogger.fatal['called']).to.be.false; - }); - }); - - describe('debugCallback', () => { - it('should log', async () => { - const logger = (await Logger.child('testLogger')).useMemoryLogging(); - logger.setLevel(LoggerLevel.DEBUG); - const FOO = 'foo'; - const BAR = 'bar'; - const spy = $$.SANDBOX.spy(() => [FOO, BAR]); - logger.debugCallback(spy); - expect(spy.callCount).to.be.equal(1); - expect(logger.readLogContentsAsText()).to.include(FOO).and.to.include(BAR); - }); - - it("shouldn't log", async () => { - const logger = (await Logger.child('testLogger')).useMemoryLogging(); - const fooSpy = $$.SANDBOX.spy(() => 'FOO'); - const cbSpy = $$.SANDBOX.spy(() => `${fooSpy()}`); - logger.debugCallback(cbSpy); - expect(fooSpy.callCount).to.be.equal(0); - expect(cbSpy.callCount).to.be.equal(0); - }); - }); - - describe('filters', () => { - const sid = '00D55000000M2qA!AQ0AQHg3LnYDOyobmH07'; - const simpleString = `sid=${sid}`; - const stringWithObject = ` The rain in Spain: ${JSON.stringify({ - // eslint-disable-next-line camelcase - access_token: sid, - })}`; - const obj1 = { accessToken: `${sid}`, refreshToken: `${sid}` }; - const obj2 = { key: 'Access Token', value: `${sid}` }; - const arr1 = [ - { key: 'ACCESS token ', value: `${sid}` }, - { key: 'refresh TOKEN', value: `${sid}` }, - { key: 'Sfdx Auth Url', value: `${sid}` }, - ]; - const arr2 = [ - { key: ' AcCESS 78token', value: ` ${sid} ` }, - { key: ' refresh _TOKEn ', value: ` ${sid} ` }, - { key: ' SfdX__AuthUrl ', value: ` ${sid} ` }, - ]; - const testLogEntries = [simpleString, stringWithObject, obj1, obj2, arr1, arr2]; - - async function runTest(logLevel: [string, number]) { - const logger = (await Logger.child('testLogger')).useMemoryLogging().setLevel(0); - - // Log at the provided log level for each test entry - // @ts-expect-error suppress any type - testLogEntries.forEach((entry) => logger[logLevel[0]](entry)); - - const logData = logger.readLogContentsAsText(); - expect(logData, `Logs should NOT contain '${sid}'`).to.not.contain(sid); - const logRecords = logger.getBufferedRecords(); - expect(logRecords[0], `expected to log at level: ${logLevel[0]}`).to.have.property('level', logLevel[1]); - } - - it('should apply for log level: trace', () => runTest(['trace', 10])); - - it('should apply for log level: debug', () => runTest(['debug', 20])); - - it('should apply for log level: info', () => runTest(['info', 30])); - - it('should apply for log level: warn', () => runTest(['warn', 40])); - - it('should apply for log level: error', () => runTest(['error', 50])); - - it('should apply for log level: fatal', async () => { - // logger.fatal() necessarily writes to stderr so stub it here - $$.SANDBOX.stub(process.stderr, 'write'); - await runTest(['fatal', 60]); - // @ts-expect-error: called is a sinon spy property - expect(process.stderr.write['called']).to.be.true; + expect(childLogger.getName()).to.equal(`${Logger.ROOT_NAME}:${childLoggerName}`); }); }); describe('addField', () => { it('should add a field to the log record', async () => { - const logger = (await Logger.child('testLogger')).useMemoryLogging(); + const logger = await Logger.child('testLogger'); logger.addField('newField1', 'stringVal'); logger.addField('newField2', 9); logger.addField('newField3', true); @@ -305,145 +215,4 @@ describe('Logger', () => { expect(logRecords[0]).to.have.property('newField3', true); }); }); - - describe('serializers', () => { - it('should run properly after filters are applied', async () => { - const logger = (await Logger.child('testSerializersLogger')).useMemoryLogging(); - - // A test serializer - logger.getBunyanLogger().serializers.config = (obj: Record) => - _.reduce( - obj, - (acc, val, key) => { - if (isString(val) || isNumber(val) || isBoolean(val)) { - // @ts-expect-error string cannot index value - acc[key] = val; - } - return acc; - }, - {} - ); - - logger.warn({ config: { foo: { bar: 1 }, sid: 'secret' } }); - const logRecords = logger.getBufferedRecords(); - - // If the serializer was applied it should not log the 'foo' entry - const msgOnError = 'Expected the config serializer to remove the "foo" entry from the log record '; - expect(logRecords[0], msgOnError).to.have.deep.property('config', { - sid: '

Ocean Drive 101
\n 123456789\n Anita\n Anny\n \n \n Honda\n Civic\n 2016\n \n \n'; -const DOLLARSIGN_OBJECT = { - $: 'value', -}; - -describe('jsonXmlTools', () => { - const $$ = new TestContext(); - - let fsWriteFileStub: SinonStub; - beforeEach(() => { - fsWriteFileStub = stubMethod($$.SANDBOX, fs, 'writeFile').callsFake((fsPath, xml) => { - expect(fsPath).to.be.a('string').and.to.have.length.greaterThan(0).and.to.be.equal(XML_PATH); - expect(xml).to.be.a('string').and.to.have.length.greaterThan(0); - return Promise.resolve(); - }); - }); - - afterEach(() => { - $$.SANDBOX.restore(); - }); - - it('writes json as xml', async () => { - const result = await writeJSONasXML({ - path: XML_PATH, - type: 'RecordType', - json: TEST_JSON, - }); - expect(fsWriteFileStub.callCount).to.be.equal(1); - expect(fsWriteFileStub.firstCall.args[1]).to.equal(TEST_XML); - // undefined means write operation succeeded https://nodejs.org/api/fs.html#fs_fspromises_writefile_file_data_options - expect(result).to.be.undefined; - }); - - it('fails to write json as xml but fails', async () => { - fsWriteFileStub.restore(); - fsWriteFileStub = stubMethod($$.SANDBOX, fs, 'writeFile').rejects(); - try { - // create() calls read() which calls schemaValidate() - await shouldThrow( - writeJSONasXML({ - path: XML_PATH, - type: 'RecordType', - json: TEST_JSON, - }) - ); - } catch (e) { - const error = e as Error; - expect(error.name).to.equal('Error'); - expect(error.message).to.equal('Error'); - } - }); -}); - -describe('fixExistingDollarSign', () => { - it('fixes existing dollar sing key in object', () => { - const result = fixExistingDollarSign(DOLLARSIGN_OBJECT); - expect(result).to.deep.equal({ - '@': 'value', - }); - }); -}); diff --git a/test/unit/util/mapKeysTest.ts b/test/unit/util/mapKeysTest.ts index b652a8bc1a..0ba31323df 100644 --- a/test/unit/util/mapKeysTest.ts +++ b/test/unit/util/mapKeysTest.ts @@ -12,7 +12,7 @@ import mapKeys from '../../../src/util/mapKeys'; const SHALLOW_LOWECASE_OBJECT = { name: 'Anna', address: 'Ocean Drive 101', - phone: 123456789, + phone: 123_456_789, alias: ['Anita', 'Anny'], cars: { primary: { @@ -26,7 +26,7 @@ const SHALLOW_LOWECASE_OBJECT = { const SHALLOW_UPPERECASE_OBJECT = { Name: 'Anna', Address: 'Ocean Drive 101', - Phone: 123456789, + Phone: 123_456_789, Alias: ['Anita', 'Anny'], Cars: { primary: { @@ -40,7 +40,7 @@ const SHALLOW_UPPERECASE_OBJECT = { const NESTED_LOWECASE_OBJECT = { name: 'Anna', address: 'Ocean Drive 101', - phone: 123456789, + phone: 123_456_789, pets: { oliver: { family: 'feline', @@ -98,7 +98,7 @@ const NESTED_LOWECASE_OBJECT = { const NESTED_UPPERECASE_OBJECT = { Name: 'Anna', Address: 'Ocean Drive 101', - Phone: 123456789, + Phone: 123_456_789, Pets: { Oliver: { Family: 'feline', diff --git a/test/unit/util/sfdcTest.ts b/test/unit/util/sfdcTest.ts index 3b7d8e5fa7..205049032a 100644 --- a/test/unit/util/sfdcTest.ts +++ b/test/unit/util/sfdcTest.ts @@ -6,9 +6,7 @@ */ import { expect } from 'chai'; import { - findUpperCaseKeys, matchesAccessToken, - sfdc, trimTo15, validateApiVersion, validateEmail, @@ -19,8 +17,8 @@ import { describe('util/sfdc', () => { describe('trimTo15', () => { it('should trim an 18 character id to 15 characters', () => { - const id = sfdc.trimTo15('ABCDEFGHIJKLMNOPQR'); - const trimmed = sfdc.trimTo15(id); + const id = trimTo15('ABCDEFGHIJKLMNOPQR'); + const trimmed = trimTo15(id); expect(trimmed.length).to.eq(15); expect(trimmed.endsWith('O')).to.be.true; }); @@ -42,149 +40,70 @@ describe('util/sfdc', () => { describe('validateApiVersion', () => { it('should return true for "42.0"', () => { - expect(sfdc.validateApiVersion('42.0')).to.be.true; expect(validateApiVersion('42.0')).to.be.true; }); it('should return false for "42"', () => { - expect(sfdc.validateApiVersion('42')).to.be.false; expect(validateApiVersion('42')).to.be.false; }); it('should return false for 42.0', () => { const num = 42.0; - expect(sfdc.validateApiVersion(num as never)).to.be.false; expect(validateApiVersion(num as never)).to.be.false; }); }); describe('validateEmail', () => { it('should return true for "me@my.org"', () => { - expect(sfdc.validateEmail('me@my.org')).to.be.true; expect(validateEmail('me@my.org')).to.be.true; }); it('should return false for "me@my."', () => { - expect(sfdc.validateEmail('me@my.')).to.be.false; expect(validateEmail('me@my.')).to.be.false; }); it('should return false for "@my.com"', () => { - expect(sfdc.validateEmail('@my')).to.be.false; expect(validateEmail('@my')).to.be.false; }); }); describe('validateSalesforceId', () => { it('should return true for "00DB0000003uuuuuuu"', () => { - expect(sfdc.validateSalesforceId('00DB0000003uuuuuuu')).to.be.true; expect(validateSalesforceId('00DB0000003uuuuuuu')).to.be.true; }); it('should return false for "00D"', () => { - expect(sfdc.validateSalesforceId('00D')).to.be.false; expect(validateSalesforceId('00D')).to.be.false; }); it('should return false for "00D***11100000K"', () => { - expect(sfdc.validateSalesforceId('00D***11100000K')).to.be.false; expect(validateSalesforceId('00D***11100000K')).to.be.false; }); }); describe('validatePathDoesNotContainInvalidChars', () => { it('should return true for "/this/is/my/path"', () => { - expect(sfdc.validatePathDoesNotContainInvalidChars('/this/is/my/path')).to.be.true; expect(validatePathDoesNotContainInvalidChars('/this/is/my/path')).to.be.true; }); it('should return false for "this/is/path??"', () => { - expect(sfdc.validatePathDoesNotContainInvalidChars('this/is/path??')).to.be.false; expect(validatePathDoesNotContainInvalidChars('this/is/path??')).to.be.false; }); it('should return false for "[this/is/path]"', () => { - expect(sfdc.validatePathDoesNotContainInvalidChars('[this/is/path]')).to.be.false; expect(validatePathDoesNotContainInvalidChars('[this/is/path]')).to.be.false; }); it('should return false for "/my/path > err.log"', () => { - expect(sfdc.validatePathDoesNotContainInvalidChars('/my/path > err.log')).to.be.false; expect(validatePathDoesNotContainInvalidChars('/my/path > err.log')).to.be.false; }); it('should return true for "c:\\myfile"', () => { - expect(sfdc.validatePathDoesNotContainInvalidChars('c:\\myfile')).to.be.true; expect(validatePathDoesNotContainInvalidChars('c:\\myfile')).to.be.true; }); }); - describe('findUpperCaseKeys', () => { - it('should return the first upper case key', () => { - const testObj = { - lowercase: true, - UpperCase: false, - nested: { camelCase: true }, - }; - expect(sfdc.findUpperCaseKeys(testObj)).to.equal('UpperCase'); - expect(findUpperCaseKeys(testObj)).to.equal('UpperCase'); - }); - - it('should return the first nested upper case key', () => { - const testObj = { - lowercase: true, - uppercase: false, - nested: { NestedUpperCase: true }, - }; - expect(sfdc.findUpperCaseKeys(testObj)).to.equal('NestedUpperCase'); - expect(findUpperCaseKeys(testObj)).to.equal('NestedUpperCase'); - }); - - it('should return undefined when no upper case key is found', () => { - const testObj = { - lowercase: true, - uppercase: false, - nested: { camelCase: true }, - }; - expect(sfdc.findUpperCaseKeys(testObj)).to.be.undefined; - expect(findUpperCaseKeys(testObj)).to.be.undefined; - }); - - it('should return the first nested upper case key unless blocklisted', () => { - const testObj = { - lowercase: true, - uppercase: false, - nested: { NestedUpperCase: true }, - }; - expect(sfdc.findUpperCaseKeys(testObj, ['nested'])).to.equal(undefined); - expect(findUpperCaseKeys(testObj, ['nested'])).to.equal(undefined); - }); - - it('handles keys starting with numbers', () => { - const testObj = { - '1abc': true, - Abc: false, - nested: { '2abc': true }, - }; - expect(sfdc.findUpperCaseKeys(testObj)).to.equal('Abc'); - expect(findUpperCaseKeys(testObj)).to.equal('Abc'); - }); - it('handles keys starting with numbers', () => { - const testObj = { - '1abc': true, - nested: { '2abc': true, Upper: false }, - }; - expect(sfdc.findUpperCaseKeys(testObj)).to.equal('Upper'); - expect(findUpperCaseKeys(testObj)).to.equal('Upper'); - }); - }); - describe('matchesAccessToken', () => { it('should return true for a valid access token', () => { - expect( - sfdc.matchesAccessToken( - '00D0t000000HkBf!AQ8AQAuHh7lXOFdOA202PMQuGflRrtUkVIfSNK1BrWLlJTJuvypx3r8dLONoJdniYKap1nsTlbxRbbGDqT6r2Rze_Ii5no2y' - ) - ).to.equal(true); expect( matchesAccessToken( '00D0t000000HkBf!AQ8AQAuHh7lXOFdOA202PMQuGflRrtUkVIfSNK1BrWLlJTJuvypx3r8dLONoJdniYKap1nsTlbxRbbGDqT6r2Rze_Ii5no2y' @@ -192,7 +111,6 @@ describe('util/sfdc', () => { ).to.equal(true); }); it('should return false for an invalid access token', () => { - expect(sfdc.matchesAccessToken('iamjustaregularusername@example.com')).to.equal(false); expect(matchesAccessToken('iamjustaregularusername@example.com')).to.equal(false); }); }); diff --git a/test/unit/util/sfdcUrlTest.ts b/test/unit/util/sfdcUrlTest.ts index 4cc79c7993..71013783e8 100644 --- a/test/unit/util/sfdcUrlTest.ts +++ b/test/unit/util/sfdcUrlTest.ts @@ -27,13 +27,13 @@ describe('util/sfdcUrl', () => { describe('toLightningdomain', () => { describe('official test cases from domains team', () => { - describe('SFDC (non-propagated)', () => { + it('SFDC (non-propagated)', () => { expect(new SfdcUrl('https://na44.salesforce.com').toLightningDomain()).to.equal( 'https://na44.lightning.force.com' ); }); - describe('SFDC/DB/CLOUDFORCE (legacy instanceless domains) ', () => { + it('SFDC/DB/CLOUDFORCE (legacy instanceless domains) ', () => { expect(new SfdcUrl('https://org62.my.salesforce.com').toLightningDomain()).to.equal( 'https://org62.lightning.force.com' ); @@ -53,7 +53,7 @@ describe('util/sfdcUrl', () => { 'https://org62--sbox1.lightning.force.com' ); }); - describe('alternative domains with weird hyphen pattern', () => { + it('alternative domains with weird hyphen pattern', () => { expect(new SfdcUrl('https://org62.my-salesforce.com').toLightningDomain()).to.equal( 'https://org62.my-lightning.com' ); @@ -61,7 +61,7 @@ describe('util/sfdcUrl', () => { 'https://sbox1.org62.sandbox.my-lightning.com' ); }); - describe('mil', () => { + it('mil', () => { expect(new SfdcUrl('https://org62.my.salesforce.mil').toLightningDomain()).to.equal( 'https://org62.lightning.crmforce.mil' ); @@ -69,7 +69,7 @@ describe('util/sfdcUrl', () => { 'https://org62--sbox1.sandbox.lightning.crmforce.mil' ); }); - describe('enhanced domains', () => { + it('enhanced domains', () => { expect(new SfdcUrl('https://org62.my.salesforce.com').toLightningDomain()).to.equal( 'https://org62.lightning.force.com' ); @@ -122,6 +122,18 @@ describe('util/sfdcUrl', () => { ); }); }); + describe('cnEdition', () => { + it('prod', () => { + expect(new SfdcUrl('https://foo.my.sfcrmproducts.cn').toLightningDomain()).to.equal( + 'https://foo.lightning.sfcrmapps.cn' + ); + }); + it('sbox', () => { + expect(new SfdcUrl('https://foo--sbox1.sandbox.my.sfcrmproducts.cn').toLightningDomain()).to.equal( + 'https://foo--sbox1.sandbox.lightning.sfcrmapps.cn' + ); + }); + }); }); describe('isSalesforceDomain', () => { @@ -139,6 +151,16 @@ describe('util/sfdcUrl', () => { const url = new SfdcUrl('https://developer.salesforce.com'); expect(url.isSalesforceDomain()).to.be.true; }); + + it('cnEdition', () => { + const url = new SfdcUrl('https://foo.my.sfcrmproducts.cn'); + expect(url.isSalesforceDomain()).to.be.true; + }); + + it('cnEdition with .com returns value', () => { + const url = new SfdcUrl('https://foo.my.sfcrmproducts.com'); + expect(url.isSalesforceDomain()).to.be.false; + }); }); describe('internal domains', () => { @@ -309,6 +331,19 @@ describe('util/sfdcUrl', () => { const isLightningDomain = url.isLightningDomain(); expect(isLightningDomain).to.be.false; }); + + it('mil', () => { + expect(new SfdcUrl('https://foo.lightning.crmforce.mil').isLightningDomain()).to.be.true; + }); + it('mil but not lightning', () => { + expect(new SfdcUrl('https://foo.my.salesforce.mil').isLightningDomain()).to.be.false; + }); + it('cnEdition', () => { + expect(new SfdcUrl('https://foo.lightning.sfcrmapps.cn').isLightningDomain()).to.be.true; + }); + it('cnEdition but not lightning', () => { + expect(new SfdcUrl('https://foo.my.sfcrmproducts.cn').isLightningDomain()).to.be.false; + }); }); describe('Salesforce standard urls', () => { @@ -321,28 +356,6 @@ describe('util/sfdcUrl', () => { }); }); - describe('isSandboxUrl', () => { - it('regular sandboxes with -- in domain but not the word "sandbox" ', () => { - const url = new SfdcUrl('https://some--thing.my.salesforce.com'); - expect(url.isSandboxUrl()).to.be.true; - }); - it('false for "normal" myDomains', () => { - const url = new SfdcUrl('https://something.my.salesforce.com'); - expect(url.isSandboxUrl()).to.be.false; - }); - it('.mil sandboxes with trailing slash', () => { - const url = new SfdcUrl('https://domain--sboxname.sandbox.my.salesforce.mil/'); - expect(url.isSandboxUrl()).to.be.true; - }); - it('.mil sandboxes without trailing slash', () => { - const url = new SfdcUrl('https://domain--sboxname.sandbox.my.salesforce.mil'); - expect(url.isSandboxUrl()).to.be.true; - }); - it('cs123', () => { - const url = new SfdcUrl('https://cs123.force.com'); - expect(url.isSandboxUrl()).to.be.true; - }); - }); describe('getLoginAudienceCombos', () => { it('should return 11 combos when login and audience URLs are not test/prod and are different', () => { const combos = getLoginAudienceCombos('https://foo.bar.baz', 'https://foo.bar.bat'); diff --git a/test/unit/util/unwrapArrayTest.ts b/test/unit/util/unwrapArrayTest.ts new file mode 100644 index 0000000000..70fd7e58f7 --- /dev/null +++ b/test/unit/util/unwrapArrayTest.ts @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2023, 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 { expect } from 'chai'; +import { unwrapArray } from '../../../src/util/unwrapArray'; + +describe('unwrapArray', () => { + it('empty array', () => { + expect(unwrapArray([])).to.deep.equal([]); + }); + it('single object in array', () => { + expect(unwrapArray([{ foo: 'bar' }])).to.deep.equal({ foo: 'bar' }); + }); + it('single string in array', () => { + expect(unwrapArray(['foo'])).to.equal('foo'); + }); + it('2 strings in an array', () => { + expect(unwrapArray(['foo', 'bar'])).to.deep.equal(['foo', 'bar']); + }); + it('2 objects in array', () => { + expect(unwrapArray([{ foo: 'bar' }, { bar: 'foo' }])).to.deep.equal([{ foo: 'bar' }, { bar: 'foo' }]); + }); + it('nested array with single object at the botom', () => { + expect(unwrapArray([[{ foo: 'bar' }]])).to.deep.equal({ foo: 'bar' }); + }); + it('nested arrays with two strings at the bottom', () => { + expect(unwrapArray([['foo', 'bar']])).to.deep.equal(['foo', 'bar']); + }); +}); diff --git a/test/unit/util/zipWriterTest.ts b/test/unit/util/zipWriterTest.ts index 50319f24f5..4ca060a9ae 100644 --- a/test/unit/util/zipWriterTest.ts +++ b/test/unit/util/zipWriterTest.ts @@ -4,195 +4,79 @@ * 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 * as fs from 'fs'; -import * as path from 'path'; -import * as stream from 'stream'; +import * as os from 'node:os'; +import * as fs from 'node:fs'; +import * as path from 'node:path'; import { expect } from 'chai'; import * as sinon from 'sinon'; -import * as ZipArchiver from 'archiver'; +import JSZip from 'jszip'; import { ZipWriter } from '../../../src/util/zipWriter'; -import { shouldThrow } from '../../../src/testSetup'; - -class WritableFileStream extends fs.WriteStream {} -class ReadableFileStream extends fs.ReadStream {} describe('ZipWriter', () => { - const sandbox: sinon.SinonSandbox = sinon.createSandbox(); - const appendStub = sandbox - .stub() - .callsFake( - ( - source: string | stream.Readable | Buffer, - data?: ZipArchiver.EntryData | ZipArchiver.ZipEntryData | undefined - ) => { - expect(source).to.be.a('string').and.to.have.length.greaterThan(0); - expect(data).to.be.a('object').and.to.have.property('name'); - } - ); - const createMock = { - append: appendStub, - } as unknown as ZipArchiver.Archiver; - - beforeEach(() => { - sandbox.stub(ZipArchiver, 'create').returns(createMock); - }); + const sandbox = sinon.createSandbox(); + const contents = 'my-contents'; + const filePath = path.join('path', 'to', 'my-file.xml'); afterEach(() => { sandbox.restore(); }); - it('addToStore', async () => { - const contents = 'my-contents'; - const filename = 'path/to/my-file.xml'; + it('addToStore() should add posix file path and content', async () => { + const jsZipFileStub = sandbox.stub(JSZip.prototype, 'file'); + const posixFilePath = 'path/to/my-file.xml'; const zipWriter = new ZipWriter(); - await zipWriter.addToStore(contents, filename); - expect(appendStub.callCount).to.equal(1); - expect(appendStub.firstCall.args[0]).to.equal(contents); - expect(appendStub.firstCall.args[1]).to.deep.equal({ - name: filename, - }); - }); -}); - -describe('ZipWriter write to buffer', () => { - const sandbox: sinon.SinonSandbox = sinon.createSandbox(); - beforeEach(() => { - const zip = ZipArchiver.create('json'); - sandbox.stub(ZipArchiver, 'create').returns(zip); - }); - - afterEach(() => { - sandbox.restore(); + await zipWriter.addToStore(contents, filePath); + expect(jsZipFileStub.callCount).to.equal(1); + expect(jsZipFileStub.firstCall.args[0]).to.equal(posixFilePath); + expect(jsZipFileStub.firstCall.args[1]).to.equal(contents); + expect(zipWriter.getDestinationPath()).to.be.undefined; }); - it('addToZip and finalize and write to buffer', async () => { - const contents = 'my-contents'; - const filename = 'path/to/my-file.xml'; + it('finalize() should generate a zipBuffer with expected compression level', async () => { + const buf = Buffer.from('hi'); + const jsZipGenerateAsyncStub = sandbox.stub(JSZip.prototype, 'generateAsync').resolves(buf); const zipWriter = new ZipWriter(); - await zipWriter.addToStore(contents, filename); await zipWriter.finalize(); - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call - const result = JSON.parse(zipWriter.buffer.toString()).pop(); - expect(result) - .to.be.a('object') - .and.to.have.keys([ - 'name', - 'type', - 'date', - 'mode', - 'prefix', - 'sourcePath', - 'stats', - 'sourceType', - 'crc32', - 'size', - ]); - // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access - expect(result.name).to.be.equal(filename); - }); -}); - -describe('ZipWriter write to file and throws', () => { - const sandbox: sinon.SinonSandbox = sinon.createSandbox(); - const rootDestination = path.join(os.tmpdir(), 'my-zip.zip'); - const bufferString = 'DEADBEEF'; - // const rootDestination = path.join('/Users', 'bmaggi', 'tmp', 'my-zip.zip'); - let writeStreamStub: sinon.SinonStubbedInstance; - let readStreamStub: sinon.SinonStubbedInstance; - let createWriteStreamStub: sinon.SinonStub; - let createReadStreamStub: sinon.SinonStub; - beforeEach(() => { - writeStreamStub = sinon.createStubInstance(WritableFileStream); - readStreamStub = sinon.createStubInstance(ReadableFileStream); - createWriteStreamStub = sandbox.stub(fs, 'createWriteStream').withArgs(rootDestination).returns(writeStreamStub); - createReadStreamStub = sandbox.stub(fs, 'createReadStream').withArgs(rootDestination).returns(readStreamStub); - // @ts-expect-error - fake function signature not quite complete - readStreamStub.on.callsFake((event: string, listener: (...args: any[]) => void): ReadableFileStream => { - if (event === 'data') { - setImmediate(() => listener(Buffer.from(bufferString, 'utf8'))); - } - return readStreamStub; + expect(zipWriter.buffer).to.equal(buf); + expect(jsZipGenerateAsyncStub.firstCall.args[0]).to.deep.equal({ + type: 'nodebuffer', + compression: 'DEFLATE', + compressionOptions: { level: 3 }, }); - // @ts-expect-error - fake function signature not quite complete - readStreamStub.once.callsFake((event: string, listener: (...args: any[]) => void): ReadableFileStream => { - if (event === 'end') { - setImmediate(() => listener()); - } - return readStreamStub; - }); - const createMock = { - append: sinon.spy(), - finalize: sinon.stub().resolves(), - } as unknown as ZipArchiver.Archiver; - sandbox.stub(ZipArchiver, 'create').returns(createMock); - }); - - afterEach(() => { - sandbox.restore(); }); - it('addToZip and finalize and write to buffer', async () => { - const contents = 'my-contents'; - const filename = 'my-file.xml'; - const zipWriter = new ZipWriter(rootDestination); - await zipWriter.addToStore(contents, filename); - await zipWriter.finalize(); - expect(createWriteStreamStub.firstCall.firstArg).to.equal(rootDestination); - expect(createReadStreamStub.firstCall.firstArg).to.equal(rootDestination); + it('should throw when buffer() is called before finalize()', async () => { + try { + new ZipWriter().buffer; + expect(false, 'Expected an error to be thrown'); + } catch (e) { + expect(e).to.be.instanceOf(Error); + expect((e as Error).message).to.equal('Must finalize the ZipWriter before getting a buffer'); + } }); -}); -describe('ZipWriter write to file', () => { - const sandbox: sinon.SinonSandbox = sinon.createSandbox(); - const rootDestination = path.join(os.tmpdir(), 'my-zip.zip'); - const bufferString = 'DEADBEEF'; - let writeStreamStub: sinon.SinonStubbedInstance; - let readStreamStub: sinon.SinonStubbedInstance; - let createWriteStreamStub: sinon.SinonStub; - let createReadStreamStub: sinon.SinonStub; - beforeEach(() => { - writeStreamStub = sinon.createStubInstance(WritableFileStream); - readStreamStub = sinon.createStubInstance(ReadableFileStream); - createWriteStreamStub = sandbox.stub(fs, 'createWriteStream').withArgs(rootDestination).returns(writeStreamStub); - createReadStreamStub = sandbox.stub(fs, 'createReadStream').withArgs(rootDestination).returns(readStreamStub); - // @ts-expect-error - fake function signature not quite complete - readStreamStub.on.callsFake((event: string, listener: (...args: any[]) => void): ReadableFileStream => { - if (event === 'data') { - setImmediate(() => listener(Buffer.from(bufferString, 'utf8'))); - } - return readStreamStub; - }); - // @ts-expect-error - fake function signature not quite complete - readStreamStub.once.callsFake((event: string, listener: (...args: any[]) => void): ReadableFileStream => { - if (event === 'error') { - setImmediate(() => listener(new Error('FileReadError'))); - } - return readStreamStub; - }); - const createMock = { - append: sinon.spy(), - finalize: sinon.stub().resolves(), - } as unknown as ZipArchiver.Archiver; - sandbox.stub(ZipArchiver, 'create').returns(createMock); - }); + // NOTE: This is a "NUT style" test versus a unit test since it does some file system operations + it('should generate a valid zip file', async () => { + const buf = Buffer.from('hi'); + const rootDestination = path.join(os.tmpdir(), 'zipWriterTest'); + if (fs.existsSync(rootDestination)) { + fs.rmSync(rootDestination, { recursive: true, force: true }); + } + const zipFilePath = path.join(rootDestination, 'myZip.zip'); + try { + fs.mkdirSync(rootDestination, { recursive: true }); + const fileToBeZippedPath = path.join(rootDestination, 'foo.txt'); - afterEach(() => { - sandbox.restore(); - }); + const zipWriter = new ZipWriter(rootDestination); + await zipWriter.addToStore(buf, fileToBeZippedPath); + await zipWriter.finalize(); + fs.writeFileSync(zipFilePath, zipWriter.buffer); - it('addToZip and finalize and write to buffer and throws', async () => { - const contents = 'my-contents'; - const filename = 'my-file.xml'; - const zipWriter = new ZipWriter(rootDestination); - // eslint-disable-next-line @typescript-eslint/await-thenable - await zipWriter.addToStore(contents, filename); - try { - await shouldThrow(zipWriter.finalize()); - } catch (error) { - expect(error).to.exist; + expect(zipWriter.getDestinationPath()).to.equal(rootDestination); + expect(fs.existsSync(zipFilePath)).to.be.true; + expect(fs.statSync(zipFilePath).size).to.be.greaterThan(0); + } finally { + fs.rmSync(rootDestination, { recursive: true, force: true }); } - expect(createWriteStreamStub.firstCall.firstArg).to.equal(rootDestination); - expect(createReadStreamStub.firstCall.firstArg).to.equal(rootDestination); }); }); diff --git a/test/unit/webOauthServerTest.ts b/test/unit/webOauthServerTest.ts index a153e466db..1ba9008d9a 100644 --- a/test/unit/webOauthServerTest.ts +++ b/test/unit/webOauthServerTest.ts @@ -6,11 +6,11 @@ */ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ -import * as http from 'http'; +import * as http from 'node:http'; import { expect } from 'chai'; import { assert } from '@salesforce/ts-types'; -import { StubbedType, stubInterface, stubMethod } from '@salesforce/ts-sinon'; +import { StubbedType, spyMethod, stubInterface, stubMethod } from '@salesforce/ts-sinon'; import { Env } from '@salesforce/kit'; import { MockTestOrgData, TestContext } from '../../src/testSetup'; import { SfProjectJson } from '../../src/sfProject'; @@ -19,6 +19,8 @@ import { AuthFields, AuthInfo } from '../../src/org/authInfo'; describe('WebOauthServer', () => { const $$ = new TestContext(); + const authCode = 'abc123456'; + describe('determineOauthPort', () => { it('should return configured oauth port if it exists', async () => { $$.SANDBOX.stub(SfProjectJson.prototype, 'get').withArgs('oauthLocalPort').returns(8080); @@ -33,17 +35,29 @@ describe('WebOauthServer', () => { }); describe('getAuthorizationUrl', () => { - it('should return authorization url', async () => { + it('should return authorization url with expected (default) params', async () => { const oauthServer = await WebOAuthServer.create({ oauthConfig: {} }); const authUrl = oauthServer.getAuthorizationUrl(); expect(authUrl).to.not.be.undefined; expect(authUrl).to.include('client_id=PlatformCLI'); + expect(authUrl).to.include('code_challenge='); + expect(authUrl).to.include('state='); + expect(authUrl).to.include('response_type=code'); + }); + + it('should return authorization url with no code_challenge', async () => { + const oauthServer = await WebOAuthServer.create({ oauthConfig: { useVerifier: false } }); + const authUrl = oauthServer.getAuthorizationUrl(); + expect(authUrl).to.not.be.undefined; + expect(authUrl).to.include('client_id=PlatformCLI'); + expect(authUrl).to.not.include('code_challenge='); + expect(authUrl).to.include('state='); + expect(authUrl).to.include('response_type=code'); }); }); describe('authorizeAndSave', () => { const testData = new MockTestOrgData(); - const frontDoorUrl = 'https://www.frontdoor.com'; let authFields: AuthFields; let authInfoStub: StubbedType; let serverResponseStub: StubbedType; @@ -54,36 +68,162 @@ describe('WebOauthServer', () => { authFields = await testData.getConfig(); authInfoStub = stubInterface($$.SANDBOX, { getFields: () => authFields, - getOrgFrontDoorUrl: () => frontDoorUrl, }); serverResponseStub = stubInterface($$.SANDBOX, {}); - stubMethod($$.SANDBOX, WebOAuthServer.prototype, 'executeOauthRequest').callsFake(async () => serverResponseStub); authStub = stubMethod($$.SANDBOX, AuthInfo, 'create').callsFake(async () => authInfoStub); - redirectStub = stubMethod($$.SANDBOX, WebServer.prototype, 'doRedirect').callsFake(async () => {}); }); it('should save new AuthInfo', async () => { + redirectStub = stubMethod($$.SANDBOX, WebServer.prototype, 'doRedirect').callsFake(async () => {}); + stubMethod($$.SANDBOX, WebOAuthServer.prototype, 'executeOauthRequest').callsFake(async () => serverResponseStub); const oauthServer = await WebOAuthServer.create({ oauthConfig: {} }); await oauthServer.start(); + // @ts-expect-error because private member + const handleSuccessStub = stubMethod($$.SANDBOX, oauthServer.webServer, 'handleSuccess').resolves(); const authInfo = await oauthServer.authorizeAndSave(); expect(authInfoStub.save.callCount).to.equal(1); + expect(authStub.callCount).to.equal(1); + const authCreateOptions = authStub.firstCall.args[0] as AuthInfo.Options; + expect(authCreateOptions).have.property('oauth2Options'); + expect(authCreateOptions).have.property('oauth2'); + expect(authCreateOptions.oauth2Options).to.have.property('useVerifier', true); + expect(authCreateOptions.oauth2Options).to.have.property('clientId', 'PlatformCLI'); + expect(authCreateOptions.oauth2).to.have.property('codeVerifier'); + expect(authCreateOptions.oauth2?.codeVerifier).to.have.length.greaterThan(1); + expect(authCreateOptions.oauth2).to.have.property('clientId', 'PlatformCLI'); expect(authInfo.getFields()).to.deep.equal(authFields); + expect(handleSuccessStub.calledOnce).to.be.true; }); - it('should redirect to front door url', async () => { + it('should save new AuthInfo without codeVerifier', async () => { + redirectStub = stubMethod($$.SANDBOX, WebServer.prototype, 'doRedirect').callsFake(async () => {}); + stubMethod($$.SANDBOX, WebOAuthServer.prototype, 'executeOauthRequest').callsFake(async () => serverResponseStub); + const oauthServer = await WebOAuthServer.create({ oauthConfig: { useVerifier: false } }); + await oauthServer.start(); + // @ts-expect-error because private member + const handleSuccessStub = stubMethod($$.SANDBOX, oauthServer.webServer, 'handleSuccess').resolves(); + const authInfo = await oauthServer.authorizeAndSave(); + expect(authInfoStub.save.callCount).to.equal(1); + expect(authStub.callCount).to.equal(1); + const authCreateOptions = authStub.firstCall.args[0] as AuthInfo.Options; + expect(authCreateOptions).have.property('oauth2Options'); + expect(authCreateOptions).have.property('oauth2'); + expect(authCreateOptions.oauth2Options).to.have.property('useVerifier', false); + expect(authCreateOptions.oauth2Options).to.have.property('clientId', 'PlatformCLI'); + expect(authCreateOptions.oauth2).to.have.property('codeVerifier'); + expect(authCreateOptions.oauth2?.codeVerifier).to.be.undefined; + expect(authCreateOptions.oauth2).to.have.property('clientId', 'PlatformCLI'); + expect(authInfo.getFields()).to.deep.equal(authFields); + expect(handleSuccessStub.calledOnce).to.be.true; + }); + + it('should redirect and handle /OauthSuccess on success', async () => { const oauthServer = await WebOAuthServer.create({ oauthConfig: {} }); + const validateStateStub = stubMethod($$.SANDBOX, oauthServer, 'validateState').returns(true); await oauthServer.start(); - await oauthServer.authorizeAndSave(); + + // @ts-expect-error because private member + const webServer = oauthServer.webServer; + const reportSuccessSpy = spyMethod($$.SANDBOX, webServer, 'reportSuccess'); + + const origOn = webServer.server.on; + let requestListener: http.RequestListener; + stubMethod($$.SANDBOX, webServer.server, 'on').callsFake((event, callback) => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-return,@typescript-eslint/no-unsafe-argument + if (event !== 'request') return origOn.call(webServer.server, event, callback); + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + requestListener = callback; + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + callback( + { + method: 'GET', + url: `http://localhost:1717/OauthRedirect?code=${authCode}&state=972475373f51`, + query: { code: authCode }, + }, + { + setHeader: () => {}, + writeHead: () => {}, + end: () => {}, + } + ); + }); + + // stub the redirect to ensure proper redirect handling and the web server is closed. + redirectStub = stubMethod($$.SANDBOX, webServer, 'doRedirect').callsFake(async (status, url, response) => { + expect(status).to.equal(303); + expect(url).to.equal('/OauthSuccess'); + expect(response).to.be.ok; + // eslint-disable-next-line @typescript-eslint/await-thenable + await requestListener( + // @ts-expect-error + { method: 'GET', url: `http://localhost:1717${url}` }, + { + setHeader: () => {}, + writeHead: () => {}, + end: () => {}, + } + ); + }); + + const authInfo = await oauthServer.authorizeAndSave(); + expect(authInfo.getFields()).to.deep.equal(authFields); expect(redirectStub.callCount).to.equal(1); - expect(redirectStub.args).to.deep.equal([[303, frontDoorUrl, serverResponseStub]]); + expect(validateStateStub.callCount).to.equal(1); + expect(reportSuccessSpy.callCount).to.equal(1); }); - it('should report error', async () => { - const reportErrorStub = stubMethod($$.SANDBOX, WebServer.prototype, 'reportError').callsFake(async () => {}); - authStub.rejects(new Error('BAD ERROR')); + it('should redirect and handle /OauthError on error', async () => { const oauthServer = await WebOAuthServer.create({ oauthConfig: {} }); + const validateStateStub = stubMethod($$.SANDBOX, oauthServer, 'validateState').returns(true); await oauthServer.start(); + + // @ts-expect-error because private member + const webServer = oauthServer.webServer; + const reportErrorSpy = spyMethod($$.SANDBOX, webServer, 'reportError'); + + const authError = new Error('BAD ERROR'); + authStub.rejects(authError); + + const origOn = webServer.server.on; + let requestListener: http.RequestListener; + stubMethod($$.SANDBOX, webServer.server, 'on').callsFake((event, callback) => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-return,@typescript-eslint/no-unsafe-argument + if (event !== 'request') return origOn.call(webServer.server, event, callback); + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + requestListener = callback; + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + callback( + { + method: 'GET', + url: `http://localhost:1717/OauthRedirect?code=${authCode}&state=972475373f51`, + query: { code: authCode }, + }, + { + setHeader: () => {}, + writeHead: () => {}, + end: () => {}, + } + ); + }); + + // stub the redirect to ensure proper redirect handling and the web server is closed. + redirectStub = stubMethod($$.SANDBOX, webServer, 'doRedirect').callsFake(async (status, url, response) => { + expect(status).to.equal(303); + expect(url).to.equal('/OauthError'); + expect(response).to.be.ok; + // eslint-disable-next-line @typescript-eslint/await-thenable + await requestListener( + // @ts-expect-error + { method: 'GET', url: `http://localhost:1717${url}` }, + { + setHeader: () => {}, + writeHead: () => {}, + end: () => {}, + } + ); + }); + try { await oauthServer.authorizeAndSave(); assert(false, 'authorizeAndSave should fail'); @@ -91,7 +231,77 @@ describe('WebOauthServer', () => { expect((e as Error).message, 'BAD ERROR'); } expect(authStub.callCount).to.equal(1); - expect(reportErrorStub.args[0][0].message).to.equal('BAD ERROR'); + expect(redirectStub.callCount).to.equal(1); + expect(validateStateStub.callCount).to.equal(1); + expect(reportErrorSpy.callCount).to.equal(1); + expect(reportErrorSpy.args[0][0]).to.equal(authError); + }); + + it('should ignore requests for favicon and continue', async () => { + const oauthServer = await WebOAuthServer.create({ oauthConfig: {} }); + const validateStateStub = stubMethod($$.SANDBOX, oauthServer, 'validateState').returns(true); + await oauthServer.start(); + + // @ts-expect-error because private member + const webServer = oauthServer.webServer; + const reportSuccessSpy = spyMethod($$.SANDBOX, webServer, 'reportSuccess'); + + const origOn = webServer.server.on; + let requestListener: http.RequestListener; + stubMethod($$.SANDBOX, webServer.server, 'on').callsFake((event, callback) => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-return,@typescript-eslint/no-unsafe-argument + if (event !== 'request') return origOn.call(webServer.server, event, callback); + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + requestListener = callback; + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + callback( + { + method: 'GET', + url: 'http://localhost:1717/favicon.ico', + }, + { + setHeader: () => {}, + writeHead: () => {}, + end: () => {}, + } + ); + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + callback( + { + method: 'GET', + url: `http://localhost:1717/OauthRedirect?code=${authCode}&state=972475373f51`, + query: { code: authCode }, + }, + { + setHeader: () => {}, + writeHead: () => {}, + end: () => {}, + } + ); + }); + + // stub the redirect to ensure proper redirect handling and the web server is closed. + redirectStub = stubMethod($$.SANDBOX, webServer, 'doRedirect').callsFake(async (status, url, response) => { + expect(status).to.equal(303); + expect(url).to.equal('/OauthSuccess'); + expect(response).to.be.ok; + // eslint-disable-next-line @typescript-eslint/await-thenable + await requestListener( + // @ts-expect-error + { method: 'GET', url: `http://localhost:1717${url}` }, + { + setHeader: () => {}, + writeHead: () => {}, + end: () => {}, + } + ); + }); + + const authInfo = await oauthServer.authorizeAndSave(); + expect(authInfo.getFields()).to.deep.equal(authFields); + expect(redirectStub.callCount).to.equal(1); + expect(validateStateStub.callCount).to.equal(1); + expect(reportSuccessSpy.callCount).to.equal(1); }); }); @@ -104,9 +314,12 @@ describe('WebOauthServer', () => { const endSpy = $$.SANDBOX.spy(); const origOn = webServer.server.on; + let requestListener: http.RequestListener; stubMethod($$.SANDBOX, webServer.server, 'on').callsFake((event, callback) => { // eslint-disable-next-line @typescript-eslint/no-unsafe-return,@typescript-eslint/no-unsafe-argument if (event !== 'request') return origOn.call(webServer.server, event, callback); + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + requestListener = callback; // eslint-disable-next-line @typescript-eslint/no-unsafe-call callback( { @@ -115,6 +328,24 @@ describe('WebOauthServer', () => { }, { setHeader: () => {}, + writeHead: () => {}, + end: endSpy, + } + ); + }); + + // stub the redirect to ensure proper redirect handling and the web server is closed. + stubMethod($$.SANDBOX, webServer, 'doRedirect').callsFake(async (status, url, response) => { + expect(status).to.equal(303); + expect(url).to.equal('/OauthError'); + expect(response).to.be.ok; + // eslint-disable-next-line @typescript-eslint/await-thenable + await requestListener( + // @ts-expect-error + { method: 'GET', url: `http://localhost:1717${url}` }, + { + setHeader: () => {}, + writeHead: () => {}, end: endSpy, } ); @@ -130,7 +361,6 @@ describe('WebOauthServer', () => { }); describe('parseAuthCodeFromRequest', () => { - const authCode = 'abc123456'; let serverResponseStub: StubbedType; let serverRequestStub: StubbedType; diff --git a/tsconfig.json b/tsconfig.json index 1f2d165533..6bd25876fa 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,8 +3,13 @@ "compilerOptions": { "outDir": "./lib", "resolveJsonModule": true, + "lib": ["ES2022"], + "module": "Node16", + "moduleResolution": "Node16", + "target": "ES2022", "rootDir": "./src", - "plugins": [{ "transform": "./messageTransformer/messageTransformer.ts" }] + "plugins": [{ "transform": "./src/messageTransformer.ts" }], + "esModuleInterop": true }, "include": ["./src/**/*.ts"] } diff --git a/typedocExamples/orgExamples.ts b/typedocExamples/orgExamples.ts index 2879f5f6ad..1e7f911af2 100644 --- a/typedocExamples/orgExamples.ts +++ b/typedocExamples/orgExamples.ts @@ -1,6 +1,6 @@ import { AuthInfo } from '../src/org/authInfo'; import { Connection } from '../src/org/connection'; -import { Org } from '../src/org'; +import { Org } from '../src/org/org'; // tslint:disable export const orgExamples = { diff --git a/typedocExamples/status/streamingClientExamples.ts b/typedocExamples/status/streamingClientExamples.ts index 72efabc54c..8f65b6b67d 100644 --- a/typedocExamples/status/streamingClientExamples.ts +++ b/typedocExamples/status/streamingClientExamples.ts @@ -1,8 +1,8 @@ import { ensureJsonMap, ensureString, JsonCollection, JsonMap } from '@salesforce/ts-types'; -import { Org } from '../../src/org'; +import { Org } from '../../src/org/org'; import { StreamingClient, StatusResult } from '../../src/status/streamingClient'; -import { HttpRequest } from 'jsforce'; +import { HttpRequest } from '@jsforce/jsforce-node'; export const streamingClientExamples = { classDoc: async () => { diff --git a/typedocExamples/tsconfig.json b/typedocExamples/tsconfig.json index 17060ec47d..c7fee8df61 100644 --- a/typedocExamples/tsconfig.json +++ b/typedocExamples/tsconfig.json @@ -4,6 +4,11 @@ "compilerOptions": { "noEmit": true, "skipLibCheck": true, - "resolveJsonModule": true + "resolveJsonModule": true, + "esModuleInterop": true, + "lib": ["ES2022"], + "module": "Node16", + "moduleResolution": "Node16", + "target": "ES2022" } } diff --git a/typedocExamples/userExamples.ts b/typedocExamples/userExamples.ts index dc6545d938..05c6cb2c7e 100644 --- a/typedocExamples/userExamples.ts +++ b/typedocExamples/userExamples.ts @@ -1,5 +1,5 @@ import { DefaultUserFields, User, UserFields } from '../src/org/user'; -import { Org } from '../src/org'; +import { Org } from '../src/org/org'; import { Connection } from '../src/org/connection'; import { AuthInfo } from '../src/org/authInfo'; diff --git a/yarn.lock b/yarn.lock index a4bd0d9e7e..a1abffe63e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,286 +2,277 @@ # yarn lockfile v1 -"@ampproject/remapping@^2.1.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== +"@ampproject/remapping@^2.2.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== dependencies: - "@jridgewell/gen-mapping" "^0.1.0" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.6.tgz#ab88da19344445c3d8889af2216606d3329f3ef2" + integrity sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA== dependencies: - "@babel/highlight" "^7.18.6" + "@babel/highlight" "^7.24.6" + picocolors "^1.0.0" -"@babel/compat-data@^7.18.6": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.8.tgz#2483f565faca607b8535590e84e7de323f27764d" - integrity sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ== +"@babel/compat-data@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.6.tgz#b3600217688cabb26e25f8e467019e66d71b7ae2" + integrity sha512-aC2DGhBq5eEdyXWqrDInSqQjO0k8xtPRf5YylULqx8MCd6jBtzqfta/3ETMRpuKIc5hyswfO80ObyA1MvkCcUQ== "@babel/core@^7.7.5": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.6.tgz#54a107a3c298aee3fe5e1947a6464b9b6faca03d" - integrity sha512-cQbWBpxcbbs/IUredIPkHiAGULLV8iwgNRMFzvbhEXISp4f3rUUXE5+TIw6KwUWUR3DwyI6gmBRnmAtYaWehwQ== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.18.6" - "@babel/helper-compilation-targets" "^7.18.6" - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helpers" "^7.18.6" - "@babel/parser" "^7.18.6" - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.6" - "@babel/types" "^7.18.6" - convert-source-map "^1.7.0" + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.6.tgz#8650e0e4b03589ebe886c4e4a60398db0a7ec787" + integrity sha512-qAHSfAdVyFmIvl0VHELib8xar7ONuSHrE2hLnsaWkYNTI68dmi1x8GYDhJjMI/e7XWal9QBlZkwbOnkcw7Z8gQ== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.24.6" + "@babel/generator" "^7.24.6" + "@babel/helper-compilation-targets" "^7.24.6" + "@babel/helper-module-transforms" "^7.24.6" + "@babel/helpers" "^7.24.6" + "@babel/parser" "^7.24.6" + "@babel/template" "^7.24.6" + "@babel/traverse" "^7.24.6" + "@babel/types" "^7.24.6" + convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.2.1" - semver "^6.3.0" + json5 "^2.2.3" + semver "^6.3.1" -"@babel/generator@^7.18.6", "@babel/generator@^7.18.7": - version "7.18.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.7.tgz#2aa78da3c05aadfc82dbac16c99552fc802284bd" - integrity sha512-shck+7VLlY72a2w9c3zYWuE1pwOKEiQHV7GTUbSnhyl5eu3i04t30tBY82ZRWrDfo3gkakCFtevExnxbkf2a3A== +"@babel/generator@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.6.tgz#dfac82a228582a9d30c959fe50ad28951d4737a7" + integrity sha512-S7m4eNa6YAPJRHmKsLHIDJhNAGNKoWNiWefz1MBbpnt8g9lvMDl1hir4P9bo/57bQEmuwEhnRU/AMWsD0G/Fbg== dependencies: - "@babel/types" "^7.18.7" - "@jridgewell/gen-mapping" "^0.3.2" + "@babel/types" "^7.24.6" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" -"@babel/helper-compilation-targets@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.6.tgz#18d35bfb9f83b1293c22c55b3d576c1315b6ed96" - integrity sha512-vFjbfhNCzqdeAtZflUFrG5YIFqGTqsctrtkZ1D/NB0mDW9TwW3GmmUepYY4G9wCET5rY5ugz4OGTcLd614IzQg== - dependencies: - "@babel/compat-data" "^7.18.6" - "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.20.2" - semver "^6.3.0" - -"@babel/helper-environment-visitor@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz#b7eee2b5b9d70602e59d1a6cad7dd24de7ca6cd7" - integrity sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q== - -"@babel/helper-function-name@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.18.6.tgz#8334fecb0afba66e6d87a7e8c6bb7fed79926b83" - integrity sha512-0mWMxV1aC97dhjCah5U5Ua7668r5ZmSC2DLfH2EZnf9c3/dHZKiFa5pRLMH5tjSl471tY6496ZWk/kjNONBxhw== - dependencies: - "@babel/template" "^7.18.6" - "@babel/types" "^7.18.6" - -"@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" - integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-module-imports@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-module-transforms@^7.18.6": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.8.tgz#4f8408afead0188cfa48672f9d0e5787b61778c8" - integrity sha512-che3jvZwIcZxrwh63VfnFTUzcAM9v/lznYkkRxIBGMPt1SudOKHAEec0SIRCfiuIzTcF7VGj/CaTT6gY4eWxvA== - dependencies: - "@babel/helper-environment-visitor" "^7.18.6" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.18.6" - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.8" - "@babel/types" "^7.18.8" - -"@babel/helper-simple-access@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea" - integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-validator-identifier@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" - integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== - -"@babel/helper-validator-option@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" - integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== - -"@babel/helpers@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.6.tgz#4c966140eaa1fcaa3d5a8c09d7db61077d4debfd" - integrity sha512-vzSiiqbQOghPngUYt/zWGvK3LAsPhz55vc9XNN0xAl2gV4ieShI2OQli5duxWHD+72PZPTKAcfcZDE1Cwc5zsQ== - dependencies: - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.6" - "@babel/types" "^7.18.6" - -"@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" +"@babel/helper-compilation-targets@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.6.tgz#4a51d681f7680043d38e212715e2a7b1ad29cb51" + integrity sha512-VZQ57UsDGlX/5fFA7GkVPplZhHsVc+vuErWgdOiysI9Ksnw0Pbbd6pnPiR/mmJyKHgyIW0c7KT32gmhiF+cirg== + dependencies: + "@babel/compat-data" "^7.24.6" + "@babel/helper-validator-option" "^7.24.6" + browserslist "^4.22.2" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-environment-visitor@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.6.tgz#ac7ad5517821641550f6698dd5468f8cef78620d" + integrity sha512-Y50Cg3k0LKLMjxdPjIl40SdJgMB85iXn27Vk/qbHZCFx/o5XO3PSnpi675h1KEmmDb6OFArfd5SCQEQ5Q4H88g== + +"@babel/helper-function-name@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.24.6.tgz#cebdd063386fdb95d511d84b117e51fc68fec0c8" + integrity sha512-xpeLqeeRkbxhnYimfr2PC+iA0Q7ljX/d1eZ9/inYbmfG2jpl8Lu3DyXvpOAnrS5kxkfOWJjioIMQsaMBXFI05w== + dependencies: + "@babel/template" "^7.24.6" + "@babel/types" "^7.24.6" + +"@babel/helper-hoist-variables@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.6.tgz#8a7ece8c26756826b6ffcdd0e3cf65de275af7f9" + integrity sha512-SF/EMrC3OD7dSta1bLJIlrsVxwtd0UpjRJqLno6125epQMJ/kyFmpTT4pbvPbdQHzCHg+biQ7Syo8lnDtbR+uA== + dependencies: + "@babel/types" "^7.24.6" + +"@babel/helper-module-imports@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.6.tgz#65e54ffceed6a268dc4ce11f0433b82cfff57852" + integrity sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g== + dependencies: + "@babel/types" "^7.24.6" + +"@babel/helper-module-transforms@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.6.tgz#22346ed9df44ce84dee850d7433c5b73fab1fe4e" + integrity sha512-Y/YMPm83mV2HJTbX1Qh2sjgjqcacvOlhbzdCCsSlblOKjSYmQqEbO6rUniWQyRo9ncyfjT8hnUjlG06RXDEmcA== + dependencies: + "@babel/helper-environment-visitor" "^7.24.6" + "@babel/helper-module-imports" "^7.24.6" + "@babel/helper-simple-access" "^7.24.6" + "@babel/helper-split-export-declaration" "^7.24.6" + "@babel/helper-validator-identifier" "^7.24.6" + +"@babel/helper-simple-access@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.6.tgz#1d6e04d468bba4fc963b4906f6dac6286cfedff1" + integrity sha512-nZzcMMD4ZhmB35MOOzQuiGO5RzL6tJbsT37Zx8M5L/i9KSrukGXWTjLe1knIbb/RmxoJE9GON9soq0c0VEMM5g== + dependencies: + "@babel/types" "^7.24.6" + +"@babel/helper-split-export-declaration@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.6.tgz#e830068f7ba8861c53b7421c284da30ae656d7a3" + integrity sha512-CvLSkwXGWnYlF9+J3iZUvwgAxKiYzK3BWuo+mLzD/MDGOZDj7Gq8+hqaOkMxmJwmlv0iu86uH5fdADd9Hxkymw== + dependencies: + "@babel/types" "^7.24.6" + +"@babel/helper-string-parser@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.6.tgz#28583c28b15f2a3339cfafafeaad42f9a0e828df" + integrity sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q== + +"@babel/helper-validator-identifier@^7.22.20", "@babel/helper-validator-identifier@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.6.tgz#08bb6612b11bdec78f3feed3db196da682454a5e" + integrity sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw== + +"@babel/helper-validator-option@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.6.tgz#59d8e81c40b7d9109ab7e74457393442177f460a" + integrity sha512-Jktc8KkF3zIkePb48QO+IapbXlSapOW9S+ogZZkcO6bABgYAxtZcjZ/O005111YLf+j4M84uEgwYoidDkXbCkQ== + +"@babel/helpers@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.6.tgz#cd124245299e494bd4e00edda0e4ea3545c2c176" + integrity sha512-V2PI+NqnyFu1i0GyTd/O/cTpxzQCYioSkUIRmgo7gFEHKKCg5w46+r/A6WeUR1+P3TeQ49dspGPNd/E3n9AnnA== + dependencies: + "@babel/template" "^7.24.6" + "@babel/types" "^7.24.6" + +"@babel/highlight@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.6.tgz#6d610c1ebd2c6e061cade0153bf69b0590b7b3df" + integrity sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ== + dependencies: + "@babel/helper-validator-identifier" "^7.24.6" + chalk "^2.4.2" js-tokens "^4.0.0" + picocolors "^1.0.0" -"@babel/parser@^7.18.6", "@babel/parser@^7.18.8": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.8.tgz#822146080ac9c62dac0823bb3489622e0bc1cbdf" - integrity sha512-RSKRfYX20dyH+elbJK2uqAkVyucL+xXzhqlMD5/ZXx+dAAwpyB7HsvnHe/ZUGOF+xLr5Wx9/JoXVTj6BQE2/oA== - -"@babel/runtime-corejs3@^7.12.5": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.19.1.tgz#f0cbbe7edda7c4109cd253bb1dee99aba4594ad9" - integrity sha512-j2vJGnkopRzH+ykJ8h68wrHnEUmtK//E723jjixiAl/PPf6FhqY/vYRcMVlNydRKQjQsTsYEjpx+DZMIvnGk/g== - dependencies: - core-js-pure "^3.25.1" - regenerator-runtime "^0.13.4" - -"@babel/runtime@^7.12.5": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.19.0.tgz#22b11c037b094d27a8a2504ea4dcff00f50e2259" - integrity sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/template@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.6.tgz#1283f4993e00b929d6e2d3c72fdc9168a2977a31" - integrity sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.18.6" - "@babel/types" "^7.18.6" - -"@babel/traverse@^7.18.6", "@babel/traverse@^7.18.8": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.8.tgz#f095e62ab46abf1da35e5a2011f43aee72d8d5b0" - integrity sha512-UNg/AcSySJYR/+mIcJQDCv00T+AqRO7j/ZEJLzpaYtgM48rMg5MnkJgyNqkzo88+p4tfRvZJCEiwwfG6h4jkRg== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.18.7" - "@babel/helper-environment-visitor" "^7.18.6" - "@babel/helper-function-name" "^7.18.6" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.18.8" - "@babel/types" "^7.18.8" - debug "^4.1.0" +"@babel/parser@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.6.tgz#5e030f440c3c6c78d195528c3b688b101a365328" + integrity sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q== + +"@babel/template@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.6.tgz#048c347b2787a6072b24c723664c8d02b67a44f9" + integrity sha512-3vgazJlLwNXi9jhrR1ef8qiB65L1RK90+lEQwv4OxveHnqC3BfmnHdgySwRLzf6akhlOYenT+b7AfWq+a//AHw== + dependencies: + "@babel/code-frame" "^7.24.6" + "@babel/parser" "^7.24.6" + "@babel/types" "^7.24.6" + +"@babel/traverse@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.6.tgz#0941ec50cdeaeacad0911eb67ae227a4f8424edc" + integrity sha512-OsNjaJwT9Zn8ozxcfoBc+RaHdj3gFmCmYoQLUII1o6ZrUwku0BMg80FoOTPx+Gi6XhcQxAYE4xyjPTo4SxEQqw== + dependencies: + "@babel/code-frame" "^7.24.6" + "@babel/generator" "^7.24.6" + "@babel/helper-environment-visitor" "^7.24.6" + "@babel/helper-function-name" "^7.24.6" + "@babel/helper-hoist-variables" "^7.24.6" + "@babel/helper-split-export-declaration" "^7.24.6" + "@babel/parser" "^7.24.6" + "@babel/types" "^7.24.6" + debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.18.6", "@babel/types@^7.18.7", "@babel/types@^7.18.8": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.8.tgz#c5af199951bf41ba4a6a9a6d0d8ad722b30cd42f" - integrity sha512-qwpdsmraq0aJ3osLJRApsc2ouSJCdnMeZwB0DhbtHAtRpZNZCdlbRnHIgcRKzdE1g0iOGg644fzjOBcdOz9cPw== +"@babel/types@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.6.tgz#ba4e1f59870c10dc2fa95a274ac4feec23b21912" + integrity sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ== dependencies: - "@babel/helper-validator-identifier" "^7.18.6" + "@babel/helper-string-parser" "^7.24.6" + "@babel/helper-validator-identifier" "^7.24.6" to-fast-properties "^2.0.0" "@commitlint/cli@^17.1.2": - version "17.4.2" - resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-17.4.2.tgz#8600c83abb7e84191fd59528fc14f436496fb00b" - integrity sha512-0rPGJ2O1owhpxMIXL9YJ2CgPkdrFLKZElIZHXDN8L8+qWK1DGH7Q7IelBT1pchXTYTuDlqkOTdh//aTvT3bSUA== - dependencies: - "@commitlint/format" "^17.4.0" - "@commitlint/lint" "^17.4.2" - "@commitlint/load" "^17.4.2" - "@commitlint/read" "^17.4.2" - "@commitlint/types" "^17.4.0" + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-17.8.1.tgz#10492114a022c91dcfb1d84dac773abb3db76d33" + integrity sha512-ay+WbzQesE0Rv4EQKfNbSMiJJ12KdKTDzIt0tcK4k11FdsWmtwP0Kp1NWMOUswfIWo6Eb7p7Ln721Nx9FLNBjg== + dependencies: + "@commitlint/format" "^17.8.1" + "@commitlint/lint" "^17.8.1" + "@commitlint/load" "^17.8.1" + "@commitlint/read" "^17.8.1" + "@commitlint/types" "^17.8.1" execa "^5.0.0" lodash.isfunction "^3.0.9" resolve-from "5.0.0" resolve-global "1.0.0" yargs "^17.0.0" -"@commitlint/config-conventional@^17.1.0": - version "17.4.2" - resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-17.4.2.tgz#671f7febfcfef90ec11b122a659c6be25e11c19e" - integrity sha512-JVo1moSj5eDMoql159q8zKCU8lkOhQ+b23Vl3LVVrS6PXDLQIELnJ34ChQmFVbBdSSRNAbbXnRDhosFU+wnuHw== +"@commitlint/config-conventional@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-17.8.1.tgz#e5bcf0cfec8da7ac50bc04dc92e0a4ea74964ce0" + integrity sha512-NxCOHx1kgneig3VLauWJcDWS40DVjg7nKOpBEEK9E5fjJpQqLCilcnKkIIjdBH98kEO1q3NpE5NSrZ2kl/QGJg== dependencies: - conventional-changelog-conventionalcommits "^5.0.0" + conventional-changelog-conventionalcommits "^6.1.0" -"@commitlint/config-validator@^17.4.0": - version "17.4.0" - resolved "https://registry.yarnpkg.com/@commitlint/config-validator/-/config-validator-17.4.0.tgz#2cb229672a22476cf1f21bedbfcd788e5da5b54f" - integrity sha512-Sa/+8KNpDXz4zT4bVbz2fpFjvgkPO6u2V2fP4TKgt6FjmOw2z3eEX859vtfeaTav/ukBw0/0jr+5ZTZp9zCBhA== +"@commitlint/config-validator@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/config-validator/-/config-validator-17.8.1.tgz#5cc93b6b49d5524c9cc345a60e5bf74bcca2b7f9" + integrity sha512-UUgUC+sNiiMwkyiuIFR7JG2cfd9t/7MV8VB4TZ+q02ZFkHoduUS4tJGsCBWvBOGD9Btev6IecPMvlWUfJorkEA== dependencies: - "@commitlint/types" "^17.4.0" + "@commitlint/types" "^17.8.1" ajv "^8.11.0" -"@commitlint/ensure@^17.4.0": - version "17.4.0" - resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-17.4.0.tgz#3de65768bfccb9956ec3a0ecd8a415421bf315e5" - integrity sha512-7oAxt25je0jeQ/E0O/M8L3ADb1Cvweu/5lc/kYF8g/kXatI0wxGE5La52onnAUAWeWlsuvBNar15WcrmDmr5Mw== +"@commitlint/ensure@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-17.8.1.tgz#59183557844999dbb6aab6d03629a3d104d01a8d" + integrity sha512-xjafwKxid8s1K23NFpL8JNo6JnY/ysetKo8kegVM7c8vs+kWLP8VrQq+NbhgVlmCojhEDbzQKp4eRXSjVOGsow== dependencies: - "@commitlint/types" "^17.4.0" + "@commitlint/types" "^17.8.1" lodash.camelcase "^4.3.0" lodash.kebabcase "^4.1.1" lodash.snakecase "^4.1.1" lodash.startcase "^4.4.0" lodash.upperfirst "^4.3.1" -"@commitlint/execute-rule@^17.4.0": - version "17.4.0" - resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-17.4.0.tgz#4518e77958893d0a5835babe65bf87e2638f6939" - integrity sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA== +"@commitlint/execute-rule@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-17.8.1.tgz#504ed69eb61044eeb84fdfd10cc18f0dab14f34c" + integrity sha512-JHVupQeSdNI6xzA9SqMF+p/JjrHTcrJdI02PwesQIDCIGUrv04hicJgCcws5nzaoZbROapPs0s6zeVHoxpMwFQ== -"@commitlint/format@^17.4.0": - version "17.4.0" - resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-17.4.0.tgz#1c80cf3a6274ff9b3d3c0dd150a97882d557aa0f" - integrity sha512-Z2bWAU5+f1YZh9W76c84J8iLIWIvvm+mzqogTz0Nsc1x6EHW0Z2gI38g5HAjB0r0I3ZjR15IDEJKhsxyblcyhA== +"@commitlint/format@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-17.8.1.tgz#6108bb6b4408e711006680649927e1b559bdc5f8" + integrity sha512-f3oMTyZ84M9ht7fb93wbCKmWxO5/kKSbwuYvS867duVomoOsgrgljkGGIztmT/srZnaiGbaK8+Wf8Ik2tSr5eg== dependencies: - "@commitlint/types" "^17.4.0" + "@commitlint/types" "^17.8.1" chalk "^4.1.0" -"@commitlint/is-ignored@^17.4.2": - version "17.4.2" - resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-17.4.2.tgz#2d40a34e071c3e595e485fafe8460457a7b7af9d" - integrity sha512-1b2Y2qJ6n7bHG9K6h8S4lBGUl6kc7mMhJN9gy1SQfUZqe92ToDjUTtgNWb6LbzR1X8Cq4SEus4VU8Z/riEa94Q== - dependencies: - "@commitlint/types" "^17.4.0" - semver "7.3.8" - -"@commitlint/lint@^17.4.2": - version "17.4.2" - resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-17.4.2.tgz#1277cb4d5395e9d6c39cbc351984bac9dcc6b7cd" - integrity sha512-HcymabrdBhsDMNzIv146+ZPNBPBK5gMNsVH+el2lCagnYgCi/4ixrHooeVyS64Fgce2K26+MC7OQ4vVH8wQWVw== - dependencies: - "@commitlint/is-ignored" "^17.4.2" - "@commitlint/parse" "^17.4.2" - "@commitlint/rules" "^17.4.2" - "@commitlint/types" "^17.4.0" - -"@commitlint/load@^17.4.2": - version "17.4.2" - resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-17.4.2.tgz#551875c3e1dce6dc0375dc9c8ad551de8ba35de4" - integrity sha512-Si++F85rJ9t4hw6JcOw1i2h0fdpdFQt0YKwjuK4bk9KhFjyFkRxvR3SB2dPaMs+EwWlDrDBGL+ygip1QD6gmPw== - dependencies: - "@commitlint/config-validator" "^17.4.0" - "@commitlint/execute-rule" "^17.4.0" - "@commitlint/resolve-extends" "^17.4.0" - "@commitlint/types" "^17.4.0" - "@types/node" "*" +"@commitlint/is-ignored@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-17.8.1.tgz#cf25bcd8409c79684b63f8bdeb35df48edda244e" + integrity sha512-UshMi4Ltb4ZlNn4F7WtSEugFDZmctzFpmbqvpyxD3la510J+PLcnyhf9chs7EryaRFJMdAKwsEKfNK0jL/QM4g== + dependencies: + "@commitlint/types" "^17.8.1" + semver "7.5.4" + +"@commitlint/lint@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-17.8.1.tgz#bfc21215f6b18d41d4d43e2aa3cb79a5d7726cd8" + integrity sha512-aQUlwIR1/VMv2D4GXSk7PfL5hIaFSfy6hSHV94O8Y27T5q+DlDEgd/cZ4KmVI+MWKzFfCTiTuWqjfRSfdRllCA== + dependencies: + "@commitlint/is-ignored" "^17.8.1" + "@commitlint/parse" "^17.8.1" + "@commitlint/rules" "^17.8.1" + "@commitlint/types" "^17.8.1" + +"@commitlint/load@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-17.8.1.tgz#fa061e7bfa53281eb03ca8517ca26d66a189030c" + integrity sha512-iF4CL7KDFstP1kpVUkT8K2Wl17h2yx9VaR1ztTc8vzByWWcbO/WaKwxsnCOqow9tVAlzPfo1ywk9m2oJ9ucMqA== + dependencies: + "@commitlint/config-validator" "^17.8.1" + "@commitlint/execute-rule" "^17.8.1" + "@commitlint/resolve-extends" "^17.8.1" + "@commitlint/types" "^17.8.1" + "@types/node" "20.5.1" chalk "^4.1.0" cosmiconfig "^8.0.0" cosmiconfig-typescript-loader "^4.0.0" @@ -290,72 +281,72 @@ lodash.uniq "^4.5.0" resolve-from "^5.0.0" ts-node "^10.8.1" - typescript "^4.6.4" + typescript "^4.6.4 || ^5.2.2" -"@commitlint/message@^17.4.2": - version "17.4.2" - resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-17.4.2.tgz#f4753a79701ad6db6db21f69076e34de6580e22c" - integrity sha512-3XMNbzB+3bhKA1hSAWPCQA3lNxR4zaeQAQcHj0Hx5sVdO6ryXtgUBGGv+1ZCLMgAPRixuc6en+iNAzZ4NzAa8Q== +"@commitlint/message@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-17.8.1.tgz#a5cd226c419be20ee03c3d237db6ac37b95958b3" + integrity sha512-6bYL1GUQsD6bLhTH3QQty8pVFoETfFQlMn2Nzmz3AOLqRVfNNtXBaSY0dhZ0dM6A2MEq4+2d7L/2LP8TjqGRkA== -"@commitlint/parse@^17.4.2": - version "17.4.2" - resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-17.4.2.tgz#b0f8a257a1f93387a497408b0b4cadba60ee3359" - integrity sha512-DK4EwqhxfXpyCA+UH8TBRIAXAfmmX4q9QRBz/2h9F9sI91yt6mltTrL6TKURMcjUVmgaB80wgS9QybNIyVBIJA== +"@commitlint/parse@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-17.8.1.tgz#6e00b8f50ebd63562d25dcf4230da2c9f984e626" + integrity sha512-/wLUickTo0rNpQgWwLPavTm7WbwkZoBy3X8PpkUmlSmQJyWQTj0m6bDjiykMaDt41qcUbfeFfaCvXfiR4EGnfw== dependencies: - "@commitlint/types" "^17.4.0" - conventional-changelog-angular "^5.0.11" - conventional-commits-parser "^3.2.2" + "@commitlint/types" "^17.8.1" + conventional-changelog-angular "^6.0.0" + conventional-commits-parser "^4.0.0" -"@commitlint/read@^17.4.2": - version "17.4.2" - resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-17.4.2.tgz#4880a05271fb44cefa54d365a17d5753496a6de0" - integrity sha512-hasYOdbhEg+W4hi0InmXHxtD/1favB4WdwyFxs1eOy/DvMw6+2IZBmATgGOlqhahsypk4kChhxjAFJAZ2F+JBg== +"@commitlint/read@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-17.8.1.tgz#b3f28777607c756078356cc133368b0e8c08092f" + integrity sha512-Fd55Oaz9irzBESPCdMd8vWWgxsW3OWR99wOntBDHgf9h7Y6OOHjWEdS9Xzen1GFndqgyoaFplQS5y7KZe0kO2w== dependencies: - "@commitlint/top-level" "^17.4.0" - "@commitlint/types" "^17.4.0" + "@commitlint/top-level" "^17.8.1" + "@commitlint/types" "^17.8.1" fs-extra "^11.0.0" - git-raw-commits "^2.0.0" + git-raw-commits "^2.0.11" minimist "^1.2.6" -"@commitlint/resolve-extends@^17.4.0": - version "17.4.0" - resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-17.4.0.tgz#9023da6c70c4ebd173b4b0995fe29f27051da2d3" - integrity sha512-3JsmwkrCzoK8sO22AzLBvNEvC1Pmdn/65RKXzEtQMy6oYMl0Snrq97a5bQQEFETF0VsvbtUuKttLqqgn99OXRQ== +"@commitlint/resolve-extends@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-17.8.1.tgz#9af01432bf2fd9ce3dd5a00d266cce14e4c977e7" + integrity sha512-W/ryRoQ0TSVXqJrx5SGkaYuAaE/BUontL1j1HsKckvM6e5ZaG0M9126zcwL6peKSuIetJi7E87PRQF8O86EW0Q== dependencies: - "@commitlint/config-validator" "^17.4.0" - "@commitlint/types" "^17.4.0" + "@commitlint/config-validator" "^17.8.1" + "@commitlint/types" "^17.8.1" import-fresh "^3.0.0" lodash.mergewith "^4.6.2" resolve-from "^5.0.0" resolve-global "^1.0.0" -"@commitlint/rules@^17.4.2": - version "17.4.2" - resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-17.4.2.tgz#cdf203bc82af979cb319210ef9215cb1de216a9b" - integrity sha512-OGrPsMb9Fx3/bZ64/EzJehY9YDSGWzp81Pj+zJiY+r/NSgJI3nUYdlS37jykNIugzazdEXfMtQ10kmA+Kx2pZQ== +"@commitlint/rules@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-17.8.1.tgz#da49cab1b7ebaf90d108de9f58f684dc4ccb65a0" + integrity sha512-2b7OdVbN7MTAt9U0vKOYKCDsOvESVXxQmrvuVUZ0rGFMCrCPJWWP1GJ7f0lAypbDAhaGb8zqtdOr47192LBrIA== dependencies: - "@commitlint/ensure" "^17.4.0" - "@commitlint/message" "^17.4.2" - "@commitlint/to-lines" "^17.4.0" - "@commitlint/types" "^17.4.0" + "@commitlint/ensure" "^17.8.1" + "@commitlint/message" "^17.8.1" + "@commitlint/to-lines" "^17.8.1" + "@commitlint/types" "^17.8.1" execa "^5.0.0" -"@commitlint/to-lines@^17.4.0": - version "17.4.0" - resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-17.4.0.tgz#9bd02e911e7d4eab3fb4a50376c4c6d331e10d8d" - integrity sha512-LcIy/6ZZolsfwDUWfN1mJ+co09soSuNASfKEU5sCmgFCvX5iHwRYLiIuoqXzOVDYOy7E7IcHilr/KS0e5T+0Hg== +"@commitlint/to-lines@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-17.8.1.tgz#a5c4a7cf7dff3dbdd69289fc0eb19b66f3cfe017" + integrity sha512-LE0jb8CuR/mj6xJyrIk8VLz03OEzXFgLdivBytoooKO5xLt5yalc8Ma5guTWobw998sbR3ogDd+2jed03CFmJA== -"@commitlint/top-level@^17.4.0": - version "17.4.0" - resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-17.4.0.tgz#540cac8290044cf846fbdd99f5cc51e8ac5f27d6" - integrity sha512-/1loE/g+dTTQgHnjoCy0AexKAEFyHsR2zRB4NWrZ6lZSMIxAhBJnmCqwao7b4H8888PsfoTBCLBYIw8vGnej8g== +"@commitlint/top-level@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-17.8.1.tgz#206d37d6782f33c9572e44fbe3758392fdeea7bc" + integrity sha512-l6+Z6rrNf5p333SHfEte6r+WkOxGlWK4bLuZKbtf/2TXRN+qhrvn1XE63VhD8Oe9oIHQ7F7W1nG2k/TJFhx2yA== dependencies: find-up "^5.0.0" -"@commitlint/types@^17.4.0": - version "17.4.0" - resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-17.4.0.tgz#c7c2b97b959f6175c164632bf26208ce417b3f31" - integrity sha512-2NjAnq5IcxY9kXtUeO2Ac0aPpvkuOmwbH/BxIm36XXK5LtWFObWJWjXOA+kcaABMrthjWu6la+FUpyYFMHRvbA== +"@commitlint/types@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-17.8.1.tgz#883a0ad35c5206d5fef7bc6ce1bbe648118af44e" + integrity sha512-PXDQXkAmiMEG162Bqdh9ChML/GJZo6vU+7F03ALKDK8zYc6SuAr47LjG7hGYRqUOz+WK0dU7bQ0xzuqFMdxzeQ== dependencies: chalk "^4.1.0" @@ -366,32 +357,35 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@es-joy/jsdoccomment@0.9.0-alpha.1": - version "0.9.0-alpha.1" - resolved "https://registry.yarnpkg.com/@es-joy/jsdoccomment/-/jsdoccomment-0.9.0-alpha.1.tgz#f48bd162e185ec7f9f222273a282d10e52fe52f7" - integrity sha512-Clxxc0PwpISoYYBibA+1L2qFJ7gvFVhI2Hos87S06K+Q0cXdOhZQJNKWuaQGPAeHjZEuUB/YoWOfwjuF2wirqA== +"@es-joy/jsdoccomment@~0.41.0": + version "0.41.0" + resolved "https://registry.yarnpkg.com/@es-joy/jsdoccomment/-/jsdoccomment-0.41.0.tgz#4a2f7db42209c0425c71a1476ef1bdb6dcd836f6" + integrity sha512-aKUhyn1QI5Ksbqcr3fFJj16p99QdjUxXAEuFst1Z47DRyoiMwivIH9MV/ARcJOCXVjPfjITciej8ZD2O/6qUmw== dependencies: - comment-parser "1.1.6-beta.0" - esquery "^1.4.0" - jsdoc-type-pratt-parser "1.0.4" + comment-parser "1.4.1" + esquery "^1.5.0" + jsdoc-type-pratt-parser "~4.0.0" -"@es-joy/jsdoccomment@~0.36.1": - version "0.36.1" - resolved "https://registry.yarnpkg.com/@es-joy/jsdoccomment/-/jsdoccomment-0.36.1.tgz#c37db40da36e4b848da5fd427a74bae3b004a30f" - integrity sha512-922xqFsTpHs6D0BUiG4toiyPOMc8/jafnWKxz1KWgS4XzKPy2qXf1Pe6UFuNSCQqt6tOuhAWXBNuuyUhJmw9Vg== +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== dependencies: - comment-parser "1.3.1" - esquery "^1.4.0" - jsdoc-type-pratt-parser "~3.1.0" + eslint-visitor-keys "^3.3.0" -"@eslint/eslintrc@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.0.tgz#943309d8697c52fc82c076e90c1c74fbbe69dbff" - integrity sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A== +"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== dependencies: ajv "^6.12.4" debug "^4.3.2" - espree "^9.4.0" + espree "^9.6.0" globals "^13.19.0" ignore "^5.2.0" import-fresh "^3.2.1" @@ -399,18 +393,18 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.35.0": - version "8.35.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.35.0.tgz#b7569632b0b788a0ca0e438235154e45d42813a7" - integrity sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw== +"@eslint/js@8.57.0": + version "8.57.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" + integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== -"@humanwhocodes/config-array@^0.11.8": - version "0.11.8" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9" - integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== +"@humanwhocodes/config-array@^0.11.14": + version "0.11.14" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== dependencies: - "@humanwhocodes/object-schema" "^1.2.1" - debug "^4.1.1" + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" minimatch "^3.0.5" "@humanwhocodes/module-importer@^1.0.1": @@ -418,10 +412,22 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" @@ -439,37 +445,29 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== - dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== dependencies: - "@jridgewell/set-array" "^1.0.1" + "@jridgewell/set-array" "^1.2.1" "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/trace-mapping" "^0.3.24" -"@jridgewell/resolve-uri@^3.0.3": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== +"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== -"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== "@jridgewell/trace-mapping@0.3.9": version "0.3.9" @@ -479,13 +477,33 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jridgewell/trace-mapping@^0.3.9": - version "0.3.14" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed" - integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ== +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@jsforce/jsforce-node@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@jsforce/jsforce-node/-/jsforce-node-3.2.0.tgz#4b104613fc9bb74e0e38d2c00936ea2b228ba73a" + integrity sha512-3GjWNgWs0HFajVhIhwvBPb0B45o500wTBNEBYxy8XjeeRra+qw8A9xUrfVU7TAGev8kXuKhjJwaTiSzThpEnew== + dependencies: + "@sindresorhus/is" "^4" + "@types/node" "^18.15.3" + abort-controller "^3.0.0" + base64url "^3.0.1" + csv-parse "^5.5.2" + csv-stringify "^6.4.4" + faye "^1.4.0" + form-data "^4.0.0" + fs-extra "^8.1.0" + https-proxy-agent "^5.0.0" + multistream "^3.1.0" + node-fetch "^2.6.1" + strip-ansi "^6.0.0" + xml2js "^0.6.2" "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -508,227 +526,91 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@oclif/command@^1.8.14", "@oclif/command@^1.8.15": - version "1.8.16" - resolved "https://registry.yarnpkg.com/@oclif/command/-/command-1.8.16.tgz#bea46f81b2061b47e1cda318a0b923e62ca4cc0c" - integrity sha512-rmVKYEsKzurfRU0xJz+iHelbi1LGlihIWZ7Qvmb/CBz1EkhL7nOkW4SVXmG2dA5Ce0si2gr88i6q4eBOMRNJ1w== - dependencies: - "@oclif/config" "^1.18.2" - "@oclif/errors" "^1.3.5" - "@oclif/help" "^1.0.1" - "@oclif/parser" "^3.8.6" - debug "^4.1.1" - semver "^7.3.2" - -"@oclif/config@1.18.2": - version "1.18.2" - resolved "https://registry.yarnpkg.com/@oclif/config/-/config-1.18.2.tgz#5bfe74a9ba6a8ca3dceb314a81bd9ce2e15ebbfe" - integrity sha512-cE3qfHWv8hGRCP31j7fIS7BfCflm/BNZ2HNqHexH+fDrdF2f1D5S8VmXWLC77ffv3oDvWyvE9AZeR0RfmHCCaA== - dependencies: - "@oclif/errors" "^1.3.3" - "@oclif/parser" "^3.8.0" - debug "^4.1.1" - globby "^11.0.1" - is-wsl "^2.1.1" - tslib "^2.0.0" - -"@oclif/config@^1.18.2": - version "1.18.3" - resolved "https://registry.yarnpkg.com/@oclif/config/-/config-1.18.3.tgz#ddfc144fdab66b1658c2f1b3478fa7fbfd317e79" - integrity sha512-sBpko86IrTscc39EvHUhL+c++81BVTsIZ3ETu/vG+cCdi0N6vb2DoahR67A9FI2CGnxRRHjnTfa3m6LulwNATA== - dependencies: - "@oclif/errors" "^1.3.5" - "@oclif/parser" "^3.8.0" - debug "^4.1.1" - globby "^11.0.1" - is-wsl "^2.1.1" - tslib "^2.3.1" - -"@oclif/dev-cli@^1": - version "1.26.10" - resolved "https://registry.yarnpkg.com/@oclif/dev-cli/-/dev-cli-1.26.10.tgz#d8df3a79009b68552f5e7f249d1d19ca52278382" - integrity sha512-dJ+II9rVXckzFvG+82PbfphMTnoqiHvsuAAbcHrLdZWPBnFAiDKhNYE0iHnA/knAC4VGXhogsrAJ3ERT5d5r2g== - dependencies: - "@oclif/command" "^1.8.15" - "@oclif/config" "^1.18.2" - "@oclif/errors" "^1.3.5" - "@oclif/plugin-help" "3.2.18" - cli-ux "5.6.7" - debug "^4.1.1" - find-yarn-workspace-root "^2.0.0" - fs-extra "^8.1" - github-slugger "^1.2.1" - lodash "^4.17.11" - normalize-package-data "^3.0.0" - qqjs "^0.3.10" - tslib "^2.0.3" - -"@oclif/errors@1.3.5", "@oclif/errors@^1.3.3", "@oclif/errors@^1.3.5": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@oclif/errors/-/errors-1.3.5.tgz#a1e9694dbeccab10fe2fe15acb7113991bed636c" - integrity sha512-OivucXPH/eLLlOT7FkCMoZXiaVYf8I/w1eTAM1+gKzfhALwWTusxEx7wBmW0uzvkSg/9ovWLycPaBgJbM3LOCQ== - dependencies: - clean-stack "^3.0.0" - fs-extra "^8.1" - indent-string "^4.0.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -"@oclif/help@^1.0.0", "@oclif/help@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@oclif/help/-/help-1.0.1.tgz#fd96a3dd9fb2314479e6c8584c91b63754a7dff5" - integrity sha512-8rsl4RHL5+vBUAKBL6PFI3mj58hjPCp2VYyXD4TAa7IMStikFfOH2gtWmqLzIlxAED2EpD0dfYwo9JJxYsH7Aw== - dependencies: - "@oclif/config" "1.18.2" - "@oclif/errors" "1.3.5" - chalk "^4.1.2" - indent-string "^4.0.0" - lodash "^4.17.21" - string-width "^4.2.0" - strip-ansi "^6.0.0" - widest-line "^3.1.0" - wrap-ansi "^6.2.0" - -"@oclif/linewrap@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@oclif/linewrap/-/linewrap-1.0.0.tgz#aedcb64b479d4db7be24196384897b5000901d91" - integrity sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw== - -"@oclif/parser@^3.8.0", "@oclif/parser@^3.8.6": - version "3.8.7" - resolved "https://registry.yarnpkg.com/@oclif/parser/-/parser-3.8.7.tgz#236d48db05d0b00157d3b42d31f9dac7550d2a7c" - integrity sha512-b11xBmIUK+LuuwVGJpFs4LwQN2xj2cBWj2c4z1FtiXGrJ85h9xV6q+k136Hw0tGg1jQoRXuvuBnqQ7es7vO9/Q== - dependencies: - "@oclif/errors" "^1.3.5" - "@oclif/linewrap" "^1.0.0" - chalk "^4.1.0" - tslib "^2.3.1" - -"@oclif/plugin-help@3.2.18": - version "3.2.18" - resolved "https://registry.yarnpkg.com/@oclif/plugin-help/-/plugin-help-3.2.18.tgz#f2bf6ba86719c174fc0e4c2149f73b46006bfdbd" - integrity sha512-5n5Pkz4L0duknIvFwx2Ko9Xda3miT6RZP8bgaaK3Q/9fzVBrhi4bOM0u05/OThI6V+3NsSdxYS2o1NLcXToWDg== - dependencies: - "@oclif/command" "^1.8.14" - "@oclif/config" "1.18.2" - "@oclif/errors" "1.3.5" - "@oclif/help" "^1.0.0" - chalk "^4.1.2" - indent-string "^4.0.0" - lodash "^4.17.21" - string-width "^4.2.0" - strip-ansi "^6.0.0" - widest-line "^3.1.0" - wrap-ansi "^6.2.0" - -"@oclif/screen@^1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@oclif/screen/-/screen-1.0.4.tgz#b740f68609dfae8aa71c3a6cab15d816407ba493" - integrity sha512-60CHpq+eqnTxLZQ4PGHYNwUX572hgpMHGPtTWMjdTMsAvlm69lZV/4ly6O3sAYkomo4NggGcomrDpBe34rxUqw== +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== -"@salesforce/bunyan@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@salesforce/bunyan/-/bunyan-2.0.0.tgz#8dbe377f2cf7d35348a23260416fee15adba5f97" - integrity sha512-5hq+HWQSeymuygl3i9ehlQo3XWrlBE+A+QzmpDaoK37op4u9M+SBUbXfOW0IABOQCg+JmfQPocSMV74hRoqU9w== - dependencies: - dayjs "^1.8.16" - dayjs-plugin-utc "^0.1.2" - optionalDependencies: - dtrace-provider "~0.6" - mv "~2" - safe-json-stringify "~1" - -"@salesforce/dev-config@^3.0.0", "@salesforce/dev-config@^3.0.1": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@salesforce/dev-config/-/dev-config-3.1.0.tgz#8eb5b35860ff60d1c1dc3fd9329b01a28475d5b9" - integrity sha512-cPph7ibj3DeSzWDFLcLtxOh5fmUlDUY2Ezq43n0V6auVP+l8orxRHjCExHS86SB3QKVgXkC8yYhryXiS8KF7Zw== +"@salesforce/dev-config@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@salesforce/dev-config/-/dev-config-4.1.0.tgz#e529576466d074e7a5f1441236510fef123da01e" + integrity sha512-2iDDepiIwjXHS5IVY7pwv8jMo4xWosJ7p/UTj+lllpB/gnJiYLhjJPE4Z3FCGFKyvfg5jGaimCd8Ca6bLGsCQA== -"@salesforce/dev-scripts@^4.0.0-beta.7": - version "4.0.0-beta.7" - resolved "https://registry.yarnpkg.com/@salesforce/dev-scripts/-/dev-scripts-4.0.0-beta.7.tgz#b704b8a4618694b14492fe95009028f6f7be933e" - integrity sha512-8P62xeXQz40xym/9+dT/F0KQIRJCGGS6n0VcXBSmupO3hInGXZA7mdM/W7BQHbDr59xk5TmB3PscmGew8Buj6g== +"@salesforce/dev-scripts@^8.5.0": + version "8.5.0" + resolved "https://registry.yarnpkg.com/@salesforce/dev-scripts/-/dev-scripts-8.5.0.tgz#b0b44ca595450328c6186968528d9c0ef06cd27e" + integrity sha512-vR+CB5VoQrNAqNTcu5GZ/l4I4Rxd5HkIj/qTxEzP1EYnIlgjrbcsQgaunSnTrttIEy/BD8epd6UWAT8yAItufg== dependencies: "@commitlint/cli" "^17.1.2" - "@commitlint/config-conventional" "^17.1.0" - "@oclif/dev-cli" "^1" - "@salesforce/dev-config" "^3.0.0" - "@salesforce/prettier-config" "^0.0.2" - "@types/chai" "^4.2.11" - "@types/mocha" "^9.0.0" - "@types/node" "^15.6.1" - "@types/sinon" "10.0.11" - chai "^4.2.0" + "@commitlint/config-conventional" "^17.8.1" + "@salesforce/dev-config" "^4.1.0" + "@salesforce/prettier-config" "^0.0.3" + "@types/chai" "^4.3.14" + "@types/mocha" "^10.0.6" + "@types/node" "^18.19.28" + "@types/sinon" "^10.0.20" + chai "^4.3.10" chalk "^4.0.0" - cosmiconfig "^7.0.0" - eslint "^8.32.0" - eslint-config-prettier "^8.5.0" - eslint-config-salesforce "^1.1.0" - eslint-config-salesforce-license "^0.1.6" - eslint-config-salesforce-typescript "^1.1.1" - eslint-plugin-header "^3.0.0" - eslint-plugin-import "2.26.0" - eslint-plugin-jsdoc "^35.1.2" - eslint-plugin-prefer-arrow "^1.2.1" + cosmiconfig "^8.3.6" + eslint-config-salesforce-typescript "^3.3.0" husky "^7.0.4" - mocha "^9.1.3" + linkinator "^6.0.4" + mocha "^10.4.0" nyc "^15.1.0" - prettier "^2.7.1" - pretty-quick "^3.1.0" - shelljs "~0.8.4" + prettier "^2.8.8" + pretty-quick "^3.3.1" + shelljs "^0.8.5" sinon "10.0.0" - source-map-support "~0.5.19" - ts-node "^10.0.0" - typedoc "0.23.16" + source-map-support "^0.5.21" + ts-node "^10.9.2" + typedoc "^0.25.12" typedoc-plugin-missing-exports "0.23.0" - typescript "^4.1.3" - wireit "^0.9.3" + typescript "^5.4.3" + wireit "^0.14.4" -"@salesforce/kit@^1.9.2": - version "1.9.2" - resolved "https://registry.yarnpkg.com/@salesforce/kit/-/kit-1.9.2.tgz#d232f135428363cdfe2649cb99a94bc2eb0a12fd" - integrity sha512-kjZvjFNP6njhAiEa/ErdLXSDWZKafHYJyKCKz1wnSFmDM8TOpKHCCVw5cQo87ZQr8OqxqwUDIAlSBLyMzKi4Lg== +"@salesforce/kit@^3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@salesforce/kit/-/kit-3.1.2.tgz#270741c54c70969df19ef17f8979b4ef1fa664b2" + integrity sha512-si+ddvZDgx9q5czxAANuK5xhz3pv+KGspQy1wyia/7HDPKadA0QZkLTzUnO1Ju4Mux32CNHEb2y9lw9jj+eVTA== dependencies: - "@salesforce/ts-types" "^1.7.3" - shx "^0.3.3" - tslib "^2.5.0" + "@salesforce/ts-types" "^2.0.9" + tslib "^2.6.2" -"@salesforce/prettier-config@^0.0.2": - version "0.0.2" - resolved "https://registry.yarnpkg.com/@salesforce/prettier-config/-/prettier-config-0.0.2.tgz#ded39bf7cb75238edc9db6dd093649111350f8bc" - integrity sha512-KExM355BLbxCW6siGBV7oUOotXvvVp0tAWERgzUkM2FcMb9fWrjwXDrIHc8V0UdDlA3UXtFltDWgN+Yqi+BA/g== +"@salesforce/prettier-config@^0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@salesforce/prettier-config/-/prettier-config-0.0.3.tgz#ba648d4886bb38adabe073dbea0b3a91b3753bb0" + integrity sha512-hYOhoPTCSYMDYn+U1rlEk16PoBeAJPkrdg4/UtAzupM1mRRJOwEPMG1d7U8DxJFKuXW3DMEYWr2MwAIBDaHmFg== -"@salesforce/schemas@^1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@salesforce/schemas/-/schemas-1.5.0.tgz#8bfe2cb5d7cb29d3394b3b9cfb71bb527009c82c" - integrity sha512-EKFBURBuON7cj8XZCW+ybeSRRw7wUP1XUXZVHzFgx8KiYmSeGiRHBYbDjQOsQMho2uOLsTozMPEt2ehYnji0YA== +"@salesforce/schemas@^1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@salesforce/schemas/-/schemas-1.9.0.tgz#ba477a112653a20b4edcf989c61c57bdff9aa3ca" + integrity sha512-LiN37zG5ODT6z70sL1fxF7BQwtCX9JOWofSU8iliSNIM+WDEeinnoFtVqPInRSNt8I0RiJxIKCrqstsmQRBNvA== -"@salesforce/ts-sinon@^1.4.6": - version "1.4.6" - resolved "https://registry.yarnpkg.com/@salesforce/ts-sinon/-/ts-sinon-1.4.6.tgz#50ac8f091ae546bcc5b1a2b0937f566e3f9683c6" - integrity sha512-yWed+QzGU3UOSX9ytg09ELWA7Oc5BAK4MVYv8Ap9uUbkg6tylETF7nzuMkvP49TaZcKC7zOG6MBebKNVZqUjPw== +"@salesforce/ts-sinon@^1.4.19": + version "1.4.19" + resolved "https://registry.yarnpkg.com/@salesforce/ts-sinon/-/ts-sinon-1.4.19.tgz#64157b6c8cf4a3c637867e2ddd90c2d058c334f7" + integrity sha512-vopxKrI6QD0OCtPlge1eGGHFWLkoDee7KaB/dpGeRwioeNfCVJ8ikELN0hv0zq9Ys6gUYWYcdpxzTP1upslCJA== dependencies: - "@salesforce/ts-types" "^1.7.3" + "@salesforce/ts-types" "^2.0.9" sinon "^5.1.1" - tslib "^2.5.0" + tslib "^2.6.1" -"@salesforce/ts-types@^1.7.2", "@salesforce/ts-types@^1.7.3": - version "1.7.3" - resolved "https://registry.yarnpkg.com/@salesforce/ts-types/-/ts-types-1.7.3.tgz#89b79ff0aaa55fea9f2de0afa8e515be3e17d0d8" - integrity sha512-jpmekGqZ7tpHRJwf1rF0yBJ/IMC5mOrryNi4HZkKuNQn8RF97WpynmL8Om04mLTCESvCiif3y7NWfIcxtID2Gw== +"@salesforce/ts-types@^2.0.9": + version "2.0.9" + resolved "https://registry.yarnpkg.com/@salesforce/ts-types/-/ts-types-2.0.9.tgz#66bff7b41720065d6b01631b6f6a3ccca02857c5" + integrity sha512-boUD9jw5vQpTCPCCmK/NFTWjSuuW+lsaxOynkyNXLW+zxOc4GDjhtKc4j0vWZJQvolpafbyS8ZLFHZJvs12gYA== dependencies: - tslib "^2.5.0" + tslib "^2.6.2" -"@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" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" - integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== - dependencies: - type-detect "4.0.8" +"@sindresorhus/is@^4": + version "4.6.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" + integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== -"@sinonjs/commons@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" - integrity sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== +"@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.6" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9" + integrity sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ== dependencies: type-detect "4.0.8" @@ -739,20 +621,6 @@ dependencies: "@sinonjs/commons" "^1.7.0" -"@sinonjs/fake-timers@^7.0.4": - version "7.1.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz#2524eae70c4910edccf99b2f4e6efc5894aff7b5" - integrity sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg== - dependencies: - "@sinonjs/commons" "^1.7.0" - -"@sinonjs/fake-timers@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" - integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== - dependencies: - "@sinonjs/commons" "^1.7.0" - "@sinonjs/formatio@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-2.0.0.tgz#84db7e9eb5531df18a8c5e0bfb6e449e55e654b2" @@ -786,24 +654,15 @@ lodash.get "^4.4.2" type-detect "^4.0.8" -"@sinonjs/samsam@^7.0.1": - version "7.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-7.0.1.tgz#5b5fa31c554636f78308439d220986b9523fc51f" - integrity sha512-zsAk2Jkiq89mhZovB2LLOdTCxJF4hqqTToGP0ASWlhp4I1hqOjcfmZGafXntCN7MDC6yySH0mFHrYtHceOeLmw== - dependencies: - "@sinonjs/commons" "^2.0.0" - lodash.get "^4.4.2" - type-detect "^4.0.8" - "@sinonjs/text-encoding@^0.7.1": - version "0.7.1" - resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" - integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== + version "0.7.2" + resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz#5981a8db18b56ba38ef0efb7d995b12aa7b51918" + integrity sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ== "@tsconfig/node10@^1.0.7": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" - integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" + integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== "@tsconfig/node12@^1.0.7": version "1.0.11" @@ -816,231 +675,204 @@ integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== "@tsconfig/node16@^1.0.2": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" - integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== -"@types/archiver@^5.3.1": - version "5.3.1" - resolved "https://registry.yarnpkg.com/@types/archiver/-/archiver-5.3.1.tgz#02991e940a03dd1a32678fead4b4ca03d0e387ca" - integrity sha512-wKYZaSXaDvTZuInAWjCeGG7BEAgTWG2zZW0/f7IYFcoHB2X2d9lkVFnrOlXl3W6NrvO6Ml3FLLu8Uksyymcpnw== - dependencies: - "@types/glob" "*" +"@types/benchmark@^2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@types/benchmark/-/benchmark-2.1.5.tgz#940c1850c18fdfdaee3fd6ed29cd92ae0d445b45" + integrity sha512-cKio2eFB3v7qmKcvIHLUMw/dIx/8bhWPuzpzRT4unCPRTD8VdA9Zb0afxpcxOqR4PixRS7yT42FqGS8BYL8g1w== -"@types/chai-string@^1.4.2": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@types/chai-string/-/chai-string-1.4.2.tgz#0f116504a666b6c6a3c42becf86634316c9a19ac" - integrity sha512-ld/1hV5qcPRGuwlPdvRfvM3Ka/iofOk2pH4VkasK4b1JJP1LjNmWWn0LsISf6RRzyhVOvs93rb9tM09e+UuF8Q== +"@types/chai-string@^1.4.5": + version "1.4.5" + resolved "https://registry.yarnpkg.com/@types/chai-string/-/chai-string-1.4.5.tgz#988ff37526386e9c354219b163d7ecf81bab8d2d" + integrity sha512-IecXRMSnpUvRnTztdpSdjcmcW7EdNme65bfDCQMi7XrSEPGmyDYYTEfc5fcactWDA6ioSm8o7NUqg9QxjBCCEw== dependencies: "@types/chai" "*" -"@types/chai@*", "@types/chai@^4.2.11": - version "4.3.1" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.1.tgz#e2c6e73e0bdeb2521d00756d099218e9f5d90a04" - integrity sha512-/zPMqDkzSZ8t3VtxOa4KPq7uzzW978M9Tvh+j7GHKuo6k6GTLxPJ4J5gE5cjfJ26pnXst0N5Hax8Sr0T2Mi9zQ== +"@types/chai@*", "@types/chai@^4.3.14": + version "4.3.16" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.16.tgz#b1572967f0b8b60bf3f87fe1d854a5604ea70c82" + integrity sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ== -"@types/debug@0.0.31": - version "0.0.31" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-0.0.31.tgz#bac8d8aab6a823e91deb7f79083b2a35fa638f33" - integrity sha512-LS1MCPaQKqspg7FvexuhmDbWUhE2yIJ+4AgVIyObfc06/UKZ8REgxGNjZc82wPLWmbeOm7S+gSsLgo75TanG4A== +"@types/fast-levenshtein@^0.0.4": + version "0.0.4" + resolved "https://registry.yarnpkg.com/@types/fast-levenshtein/-/fast-levenshtein-0.0.4.tgz#a16ff6607189edf08ac631e54b5774b0faf12d87" + integrity sha512-tkDveuitddQCxut1Db8eEFfMahTjOumTJGPHmT9E7KUH+DkVq9WTpVvlfenf3S+uCBeu8j5FP2xik/KfxOEjeA== -"@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== - dependencies: - "@types/minimatch" "*" - "@types/node" "*" - -"@types/graceful-fs@^4.1.6": - version "4.1.6" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" - integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== - dependencies: - "@types/node" "*" - -"@types/jsen@0.0.21": - version "0.0.21" - resolved "https://registry.yarnpkg.com/@types/jsen/-/jsen-0.0.21.tgz#5241c11d22342743387ca7dde721e88efe7d0a27" - integrity sha512-NVmkiChwbwiWWiaNCkjMViu0g4+cOJYp1OTatqSd8BjUP8a1Yp6z1ZIu7P0o1qSlM95e541PwKQGbf8+dVi2Wg== - -"@types/json-schema@^7.0.9": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== +"@types/json-schema@^7.0.12": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== -"@types/jsonwebtoken@9.0.1": - version "9.0.1" - resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz#29b1369c4774200d6d6f63135bf3d1ba3ef997a4" - integrity sha512-c5ltxazpWabia/4UzhIoaDcIza4KViOQhdbjRlfcIGVnsE3c3brkz9Z+F/EeJIECOQP7W7US2hNE930cWWkPiw== +"@types/jsonwebtoken@9.0.6": + version "9.0.6" + resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-9.0.6.tgz#d1af3544d99ad992fb6681bbe60676e06b032bd3" + integrity sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw== dependencies: "@types/node" "*" -"@types/lodash@^4.14.191": - version "4.14.191" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.191.tgz#09511e7f7cba275acd8b419ddac8da9a6a79e2fa" - integrity sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ== - -"@types/minimatch@*", "@types/minimatch@^3.0.3": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" - integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== - "@types/minimist@^1.2.0": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" - integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== + version "1.2.5" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e" + integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== -"@types/mocha@^9.0.0": - version "9.1.1" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.1.tgz#e7c4f1001eefa4b8afbd1eee27a237fee3bf29c4" - integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw== +"@types/mocha@^10.0.6": + version "10.0.6" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.6.tgz#818551d39113081048bdddbef96701b4e8bb9d1b" + integrity sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg== "@types/node@*": - version "18.0.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.3.tgz#463fc47f13ec0688a33aec75d078a0541a447199" - integrity sha512-HzNRZtp4eepNitP+BD6k2L6DROIDG4Q0fm4x+dwfsr6LGmROENnok75VGw40628xf+iR24WeMFcHuuBDUAzzsQ== + version "20.12.13" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.13.tgz#90ed3b8a4e52dd3c5dc5a42dde5b85b74ad8ed88" + integrity sha512-gBGeanV41c1L171rR7wjbMiEpEI/l5XFQdLLfhr/REwpgDy/4U8y89+i8kRiLzDyZdOkXh+cRaTetUnCYutoXA== + dependencies: + undici-types "~5.26.4" -"@types/node@^12.19.9": - version "12.20.55" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" - integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== +"@types/node@20.5.1": + version "20.5.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.1.tgz#178d58ee7e4834152b0e8b4d30cbfab578b9bb30" + integrity sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg== -"@types/node@^15.6.1": - version "15.14.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-15.14.9.tgz#bc43c990c3c9be7281868bbc7b8fdd6e2b57adfa" - integrity sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A== +"@types/node@^18.15.3", "@types/node@^18.19.28": + version "18.19.33" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.33.tgz#98cd286a1b8a5e11aa06623210240bcc28e95c48" + integrity sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A== + dependencies: + undici-types "~5.26.4" "@types/normalize-package-data@^2.4.0": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" - integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== + version "2.4.4" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" + integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== -"@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== +"@types/proper-lockfile@^4.1.4": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@types/proper-lockfile/-/proper-lockfile-4.1.4.tgz#cd9fab92bdb04730c1ada542c356f03620f84008" + integrity sha512-uo2ABllncSqg9F1D4nugVl9v93RmjxF6LJzQLMLDdPaXCUIDPeOJ21Gbqi43xNKzBi/WQ0Q0dICqufzQbMjipQ== + dependencies: + "@types/retry" "*" -"@types/semver@^7.3.12", "@types/semver@^7.3.13": - version "7.3.13" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" - integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== +"@types/retry@*": + version "0.12.5" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.5.tgz#f090ff4bd8d2e5b940ff270ab39fd5ca1834a07e" + integrity sha512-3xSjTp3v03X/lSQLkczaN9UIEwJMoMCA1+Nb5HfbJEQWogdeQIyVtTvxPXDQjZ5zws8rFQfVfRdz03ARihPJgw== -"@types/shelljs@0.8.11": - 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/semver@^7.5.0", "@types/semver@^7.5.8": + version "7.5.8" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== -"@types/sinon@10.0.11": - version "10.0.11" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.11.tgz#8245827b05d3fc57a6601bd35aee1f7ad330fc42" - integrity sha512-dmZsHlBsKUtBpHriNjlK0ndlvEh8dcb9uV9Afsbt89QIyydpC7NcR+nWlAhASfy3GHnxTl4FX/aKE7XZUt/B4g== +"@types/sinon@^10.0.20": + version "10.0.20" + resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.20.tgz#f1585debf4c0d99f9938f4111e5479fb74865146" + integrity sha512-2APKKruFNCAZgx3daAyACGzWuJ028VVCUDk6o2rw/Z4PXT0ogwdV4KUegW0MwVs0Zu59auPXbbuBJHF12Sx1Eg== dependencies: "@types/sinonjs__fake-timers" "*" "@types/sinonjs__fake-timers@*": - version "8.1.2" - resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz#bf2e02a3dbd4aecaf95942ecd99b7402e03fad5e" - integrity sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA== - -"@typescript-eslint/eslint-plugin@^5.54.1": - version "5.54.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.1.tgz#0c5091289ce28372e38ab8d28e861d2dbe1ab29e" - integrity sha512-a2RQAkosH3d3ZIV08s3DcL/mcGc2M/UC528VkPULFxR9VnVPT8pBu0IyBAJJmVsCmhVfwQX1v6q+QGnmSe1bew== - dependencies: - "@typescript-eslint/scope-manager" "5.54.1" - "@typescript-eslint/type-utils" "5.54.1" - "@typescript-eslint/utils" "5.54.1" + version "8.1.5" + resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.5.tgz#5fd3592ff10c1e9695d377020c033116cc2889f2" + integrity sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ== + +"@typescript-eslint/eslint-plugin@^6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz#30830c1ca81fd5f3c2714e524c4303e0194f9cd3" + integrity sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA== + dependencies: + "@eslint-community/regexpp" "^4.5.1" + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/type-utils" "6.21.0" + "@typescript-eslint/utils" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" debug "^4.3.4" - grapheme-splitter "^1.0.4" - ignore "^5.2.0" - natural-compare-lite "^1.4.0" - regexpp "^3.2.0" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/parser@^5.54.1": - version "5.54.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.54.1.tgz#05761d7f777ef1c37c971d3af6631715099b084c" - integrity sha512-8zaIXJp/nG9Ff9vQNh7TI+C3nA6q6iIsGJ4B4L6MhZ7mHnTMR4YP5vp2xydmFXIy8rpyIVbNAG44871LMt6ujg== - dependencies: - "@typescript-eslint/scope-manager" "5.54.1" - "@typescript-eslint/types" "5.54.1" - "@typescript-eslint/typescript-estree" "5.54.1" + graphemer "^1.4.0" + ignore "^5.2.4" + natural-compare "^1.4.0" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/parser@^6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b" + integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== + dependencies: + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.54.1": - version "5.54.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.54.1.tgz#6d864b4915741c608a58ce9912edf5a02bb58735" - integrity sha512-zWKuGliXxvuxyM71UA/EcPxaviw39dB2504LqAmFDjmkpO8qNLHcmzlh6pbHs1h/7YQ9bnsO8CCcYCSA8sykUg== +"@typescript-eslint/scope-manager@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz#ea8a9bfc8f1504a6ac5d59a6df308d3a0630a2b1" + integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== dependencies: - "@typescript-eslint/types" "5.54.1" - "@typescript-eslint/visitor-keys" "5.54.1" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" -"@typescript-eslint/type-utils@5.54.1": - version "5.54.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.54.1.tgz#4825918ec27e55da8bb99cd07ec2a8e5f50ab748" - integrity sha512-WREHsTz0GqVYLIbzIZYbmUUr95DKEKIXZNH57W3s+4bVnuF1TKe2jH8ZNH8rO1CeMY3U4j4UQeqPNkHMiGem3g== +"@typescript-eslint/type-utils@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz#6473281cfed4dacabe8004e8521cee0bd9d4c01e" + integrity sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag== dependencies: - "@typescript-eslint/typescript-estree" "5.54.1" - "@typescript-eslint/utils" "5.54.1" + "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/utils" "6.21.0" debug "^4.3.4" - tsutils "^3.21.0" + ts-api-utils "^1.0.1" -"@typescript-eslint/types@5.54.1": - version "5.54.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.54.1.tgz#29fbac29a716d0f08c62fe5de70c9b6735de215c" - integrity sha512-G9+1vVazrfAfbtmCapJX8jRo2E4MDXxgm/IMOF4oGh3kq7XuK3JRkOg6y2Qu1VsTRmWETyTkWt1wxy7X7/yLkw== +"@typescript-eslint/types@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" + integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== -"@typescript-eslint/typescript-estree@5.54.1": - version "5.54.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.1.tgz#df7b6ae05fd8fef724a87afa7e2f57fa4a599be1" - integrity sha512-bjK5t+S6ffHnVwA0qRPTZrxKSaFYocwFIkZx5k7pvWfsB1I57pO/0M0Skatzzw1sCkjJ83AfGTL0oFIFiDX3bg== +"@typescript-eslint/typescript-estree@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz#c47ae7901db3b8bddc3ecd73daff2d0895688c46" + integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== dependencies: - "@typescript-eslint/types" "5.54.1" - "@typescript-eslint/visitor-keys" "5.54.1" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/utils@5.54.1": - version "5.54.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.54.1.tgz#7a3ee47409285387b9d4609ea7e1020d1797ec34" - integrity sha512-IY5dyQM8XD1zfDe5X8jegX6r2EVU5o/WJnLu/znLPWCBF7KNGC+adacXnt5jEYS9JixDcoccI6CvE4RCjHMzCQ== - dependencies: - "@types/json-schema" "^7.0.9" - "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.54.1" - "@typescript-eslint/types" "5.54.1" - "@typescript-eslint/typescript-estree" "5.54.1" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" - semver "^7.3.7" - -"@typescript-eslint/visitor-keys@5.54.1": - version "5.54.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.1.tgz#d7a8a0f7181d6ac748f4d47b2306e0513b98bf8b" - integrity sha512-q8iSoHTgwCfgcRJ2l2x+xCbu8nBlRAlsQ33k24Adj8eoVBE0f8dUeI+bAa8F84Mv05UGbAx57g2zrRsYIooqQg== - dependencies: - "@typescript-eslint/types" "5.54.1" - eslint-visitor-keys "^3.3.0" - -"@ungap/promise-all-settled@1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" - integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== + minimatch "9.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/utils@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.21.0.tgz#4714e7a6b39e773c1c8e97ec587f520840cd8134" + integrity sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" + semver "^7.5.4" + +"@typescript-eslint/visitor-keys@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz#87a99d077aa507e20e238b11d56cc26ade45fe47" + integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== + dependencies: + "@typescript-eslint/types" "6.21.0" + eslint-visitor-keys "^3.4.1" + +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== -JSONStream@^1.0.4: +JSONStream@^1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== @@ -1061,14 +893,14 @@ acorn-jsx@^5.3.2: integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^8.1.1: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + version "8.3.2" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" + integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== -acorn@^8.4.1, acorn@^8.8.0: - version "8.8.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" - integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== +acorn@^8.4.1, acorn@^8.9.0: + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== agent-base@6: version "6.0.2" @@ -1077,6 +909,13 @@ agent-base@6: dependencies: debug "4" +agent-base@^7.0.2: + version "7.1.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.1.tgz#bdbded7dfb096b751a2a087eeeb9664725b2e317" + integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA== + dependencies: + debug "^4.3.4" + aggregate-error@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" @@ -1085,7 +924,7 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -ajv@^6.10.0, ajv@^6.12.4: +ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -1095,43 +934,36 @@ ajv@^6.10.0, ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.11.0, ajv@^8.12.0: - version "8.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== +ajv@^8.11.0, ajv@^8.15.0: + version "8.15.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.15.0.tgz#d918c661e3e820bbbc65a320e182ee56a1aa978a" + integrity sha512-15BTtQUOsSrmHCy+B4VnAiJAJxJ8IFgu6fcjFQF3jQYZ78nLSQthlFg4ehp+NLIyfvFgOlxNsjKIEhydtFPVHQ== dependencies: - fast-deep-equal "^3.1.1" + fast-deep-equal "^3.1.3" + fast-uri "^2.3.0" json-schema-traverse "^1.0.0" require-from-string "^2.0.2" - uri-js "^4.2.2" ansi-colors@4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== -ansi-escapes@^3.0.0, ansi-escapes@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== - -ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-regex@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" - integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== - ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-sequence-parser@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz#e0aa1cdcbc8f8bb0b5bca625aac41f5f056973cf" + integrity sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg== + ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -1139,22 +971,22 @@ ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.0.0, ansi-styles@^4.1.0, ansi-styles@^4.2.0: +ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" -ansicolors@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" - integrity sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg== +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" @@ -1166,40 +998,16 @@ append-transform@^2.0.0: dependencies: default-require-extensions "^3.0.0" -archiver-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-2.1.0.tgz#e8a460e94b693c3e3da182a098ca6285ba9249e2" - integrity sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw== - dependencies: - glob "^7.1.4" - graceful-fs "^4.2.0" - lazystream "^1.0.0" - lodash.defaults "^4.2.0" - lodash.difference "^4.5.0" - lodash.flatten "^4.4.0" - lodash.isplainobject "^4.0.6" - lodash.union "^4.6.0" - normalize-path "^3.0.0" - readable-stream "^2.0.0" - -archiver@^5.3.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/archiver/-/archiver-5.3.1.tgz#21e92811d6f09ecfce649fbefefe8c79e57cbbb6" - integrity sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w== - dependencies: - archiver-utils "^2.1.0" - async "^3.2.3" - buffer-crc32 "^0.2.1" - readable-stream "^3.6.0" - readdir-glob "^1.0.0" - tar-stream "^2.2.0" - zip-stream "^4.1.0" - archy@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" integrity sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw== +are-docs-informative@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/are-docs-informative/-/are-docs-informative-0.0.2.tgz#387f0e93f5d45280373d387a59d34c96db321963" + integrity sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig== + arg@^4.1.0: version "4.1.3" resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" @@ -1217,25 +1025,13 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== - -array-differ@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" - integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg== +array-buffer-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== + dependencies: + call-bind "^1.0.5" + is-array-buffer "^3.0.4" array-from@^2.1.1: version "2.1.1" @@ -1247,15 +1043,16 @@ array-ify@^1.0.0: resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== -array-includes@^3.1.4, array-includes@^3.1.6: - version "3.1.6" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" - integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== +array-includes@^3.1.7: + version "3.1.8" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" + integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.3" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" is-string "^1.0.7" array-union@^2.1.0: @@ -1263,41 +1060,57 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== +array.prototype.findlastindex@^1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" + integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" -array.prototype.flat@^1.2.5, array.prototype.flat@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" - integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== +array.prototype.flat@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" -array.prototype.flatmap@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" - integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== +array.prototype.flatmap@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" +arraybuffer.prototype.slice@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" + integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.2.1" + get-intrinsic "^1.2.3" + is-array-buffer "^3.0.4" + is-shared-array-buffer "^1.0.2" + arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== -arrify@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" - integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== - asap@*: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" @@ -1308,30 +1121,22 @@ assertion-error@^1.1.0: resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== - -async@^3.2.3: - version "3.2.4" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" - integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== - asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== +atomic-sleep@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" + integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" balanced-match@^1.0.0: version "1.0.2" @@ -1348,32 +1153,18 @@ base64url@^3.0.1: resolved "https://registry.yarnpkg.com/base64url/-/base64url-3.0.1.tgz#6399d572e2bc3f90a9a8b22d5dbb0a32d33f788d" integrity sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A== -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== +benchmark@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/benchmark/-/benchmark-2.1.4.tgz#09f3de31c916425d498cc2ee565a0ebf3c2a5629" + integrity sha512-l9MlfN4M1K/H2fbhfMy3B7vJd6AGKJVQn2h6Sg/Yx+KckoUA7ewS5Vv6TjSq18ooE1kS9hhAlQRH3AkXIh/aOQ== dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" + lodash "^4.17.4" + platform "^1.3.3" binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -bl@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== brace-expansion@^1.1.7: version "1.1.11" @@ -1390,48 +1181,27 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== +braces@^3.0.2, braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - fill-range "^7.0.1" + fill-range "^7.1.1" browser-stdout@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== -browserslist@^4.20.2: - version "4.21.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.1.tgz#c9b9b0a54c7607e8dc3e01a0d311727188011a00" - integrity sha512-Nq8MFCSrnJXSc88yliwlzQe3qNe3VntIjhsArW9IJOEPSHNx23FalwApUVbzAWABLhYJJ7y8AynWI/XM8OdfjQ== +browserslist@^4.22.2, browserslist@^4.23.0: + version "4.23.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" + integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== dependencies: - caniuse-lite "^1.0.30001359" - electron-to-chromium "^1.4.172" - node-releases "^2.0.5" - update-browserslist-db "^1.0.4" - -buffer-crc32@^0.2.1, buffer-crc32@^0.2.13: - version "0.2.13" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + caniuse-lite "^1.0.30001587" + electron-to-chromium "^1.4.668" + node-releases "^2.0.14" + update-browserslist-db "^1.0.13" buffer-equal-constant-time@1.0.1: version "1.0.1" @@ -1443,33 +1213,18 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== dependencies: base64-js "^1.3.1" - ieee754 "^1.1.13" + ieee754 "^1.2.1" -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -cachedir@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.1.0.tgz#b448c32b44cd9c0cd6ce4c419fa5b3c112c02191" - integrity sha512-xGBpPqoBvn3unBW7oxgb8aJn42K0m9m1/wyjmazah10Fq7bROGG3kRAE6OIyr3U3PIJUqGuebhCEdMk9OKJG0A== +builtin-modules@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" + integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== caching-transform@^4.0.0: version "4.0.0" @@ -1481,13 +1236,16 @@ caching-transform@^4.0.0: package-hash "^4.0.0" write-file-atomic "^3.0.0" -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== +call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" callsites@^3.0.0: version "3.1.0" @@ -1521,10 +1279,10 @@ camelcase@^6.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001359: - version "1.0.30001365" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001365.tgz#72c2c3863b1a545cfd3d9953535bd2ee17568158" - integrity sha512-VDQZ8OtpuIPMBA4YYvZXECtXbddMCUFJk1qu8Mqxfm/SZJNSr1cy4IuLCOL7RJ/YASrvJcYg1Zh+UEUQ5m6z8Q== +caniuse-lite@^1.0.30001587: + version "1.0.30001625" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001625.tgz#ead1b155ea691d6a87938754d3cb119c24465b03" + integrity sha512-4KE9N2gcRH+HQhpeiRZXd+1niLB/XNLAhSy4z7fI8EzcbcPoAqjNInxVHTiTwWfTIV4w096XG8OtCOCQQKPv3w== capital-case@^1.0.4: version "1.0.4" @@ -1535,33 +1293,25 @@ capital-case@^1.0.4: tslib "^2.0.3" upper-case-first "^2.0.2" -cardinal@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-2.1.1.tgz#7cc1055d822d212954d07b085dea251cc7bc5505" - integrity sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw== - dependencies: - ansicolors "~0.3.2" - redeyed "~2.1.0" - chai-string@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/chai-string/-/chai-string-1.5.0.tgz#0bdb2d8a5f1dbe90bc78ec493c1c1c180dd4d3d2" integrity sha512-sydDC3S3pNAQMYwJrs6dQX0oBQ6KfIPuOZ78n7rocW0eJJlsHPh2t3kwW7xfwYA/1Bf6/arGtSUo16rxR2JFlw== -chai@^4.2.0, chai@^4.3.7: - version "4.3.7" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.7.tgz#ec63f6df01829088e8bf55fca839bcd464a8ec51" - integrity sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A== +chai@^4.3.10: + version "4.4.1" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.4.1.tgz#3603fa6eba35425b0f2ac91a009fe924106e50d1" + integrity sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g== dependencies: assertion-error "^1.1.0" - check-error "^1.0.2" - deep-eql "^4.1.2" - get-func-name "^2.0.0" - loupe "^2.3.1" + check-error "^1.0.3" + deep-eql "^4.1.3" + get-func-name "^2.0.2" + loupe "^2.3.6" pathval "^1.1.1" - type-detect "^4.0.5" + type-detect "^4.0.8" -chalk@^2.0.0, chalk@^2.4.1: +chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -1570,14 +1320,6 @@ chalk@^2.0.0, chalk@^2.4.1: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" @@ -1586,6 +1328,11 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^5.0.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== + change-case@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/change-case/-/change-case-4.1.2.tgz#fedfc5f136045e2398c0410ee441f95704641e12" @@ -1604,17 +1351,14 @@ change-case@^4.1.2: snake-case "^3.0.4" tslib "^2.0.3" -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - -check-error@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== +check-error@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" + integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== + dependencies: + get-func-name "^2.0.2" -chokidar@3.5.3, chokidar@^3.5.3: +chokidar@3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -1629,96 +1373,38 @@ chokidar@3.5.3, chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" -chownr@^1.1.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== +chokidar@^3.5.3: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +ci-info@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.0.0.tgz#65466f8b280fc019b9f50a5388115d17a63a44f2" + integrity sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg== -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== +clean-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clean-regexp/-/clean-regexp-1.0.0.tgz#8df7c7aae51fd36874e8f8d05b9180bc11a3fed7" + integrity sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw== dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" + escape-string-regexp "^1.0.5" clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== -clean-stack@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-3.0.1.tgz#155bf0b2221bf5f4fba89528d24c5953f17fe3a8" - integrity sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg== - dependencies: - escape-string-regexp "4.0.0" - -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw== - dependencies: - restore-cursor "^2.0.0" - -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-progress@^3.4.0: - version "3.11.2" - resolved "https://registry.yarnpkg.com/cli-progress/-/cli-progress-3.11.2.tgz#f8c89bd157e74f3f2c43bcfb3505670b4d48fc77" - integrity sha512-lCPoS6ncgX4+rJu5bS3F/iCz17kZ9MPZ6dpuTtI0KXKABkhyXIdYB3Inby1OpaGti3YlI3EeEkM9AuWpelJrVA== - dependencies: - string-width "^4.2.3" - -cli-ux@5.6.7: - version "5.6.7" - resolved "https://registry.yarnpkg.com/cli-ux/-/cli-ux-5.6.7.tgz#32ef9e6cb2b457be834280cc799028a11c8235a8" - integrity sha512-dsKAurMNyFDnO6X1TiiRNiVbL90XReLKcvIq4H777NMqXGBxBws23ag8ubCJE97vVZEgWG2eSUhsyLf63Jv8+g== - dependencies: - "@oclif/command" "^1.8.15" - "@oclif/errors" "^1.3.5" - "@oclif/linewrap" "^1.0.0" - "@oclif/screen" "^1.0.4" - ansi-escapes "^4.3.0" - ansi-styles "^4.2.0" - cardinal "^2.1.1" - chalk "^4.1.0" - clean-stack "^3.0.0" - cli-progress "^3.4.0" - extract-stack "^2.0.0" - fs-extra "^8.1" - hyperlinker "^1.0.0" - indent-string "^4.0.0" - is-wsl "^2.2.0" - js-yaml "^3.13.1" - lodash "^4.17.21" - natural-orderby "^2.0.1" - object-treeify "^1.1.4" - password-prompt "^1.1.2" - semver "^7.3.2" - string-width "^4.2.0" - strip-ansi "^6.0.0" - supports-color "^8.1.0" - supports-hyperlinks "^2.1.0" - tslib "^2.0.0" - -cli-width@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" - integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== - -cli-width@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" - integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== - cliui@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" @@ -1737,13 +1423,14 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" color-convert@^1.9.0: version "1.9.3" @@ -1769,6 +1456,11 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +colorette@^2.0.7: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -1776,41 +1468,10 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" -commander@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" - integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== - -comment-parser@1.1.6-beta.0: - version "1.1.6-beta.0" - resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-1.1.6-beta.0.tgz#57e503b18d0a5bd008632dcc54b1f95c2fffe8f6" - integrity sha512-q3cA8TSMyqW7wcPSYWzbO/rMahnXgzs4SLG/UIWXdEsnXTFPZkEkWAdNgPiHig2OzxgpPLOh4WwsmClDxndwHw== - -comment-parser@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-1.3.1.tgz#3d7ea3adaf9345594aedee6563f422348f165c1b" - integrity sha512-B52sN2VNghyq5ofvUsqZjmk6YkihBX5vMSChmSK9v4ShjKf3Vk5Xcmgpw4o+iIgtrnM/u5FiMpz9VKb8lpBveA== - -commitizen@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/commitizen/-/commitizen-3.1.2.tgz#29ddd8b39396923e9058a0e4840cbeef144290be" - integrity sha512-eD0uTUsogu8ksFjFFYq75LLfXeLXsCIa27TPfOqvBI+tCx1Pp5QfKqC9oC+qTpSz3nTn9/+7TL5mE/wurB22JQ== - dependencies: - cachedir "2.1.0" - cz-conventional-changelog "2.1.0" - dedent "0.7.0" - detect-indent "^5.0.0" - find-node-modules "2.0.0" - find-root "1.1.0" - fs-extra "^7.0.0" - glob "7.1.3" - inquirer "6.2.0" - is-utf8 "^0.2.1" - lodash "4.17.14" - minimist "1.2.0" - shelljs "0.7.6" - strip-bom "3.0.0" - strip-json-comments "2.0.1" +comment-parser@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-1.4.1.tgz#bdafead37961ac079be11eb7ec65c4d021eaf9cc" + integrity sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg== commondir@^1.0.1: version "1.0.1" @@ -1825,21 +1486,6 @@ compare-func@^2.0.0: array-ify "^1.0.0" dot-prop "^5.1.0" -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -compress-commons@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-4.1.1.tgz#df2a09a7ed17447642bad10a85cc9a19e5c42a7d" - integrity sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ== - dependencies: - buffer-crc32 "^0.2.13" - crc32-stream "^4.0.2" - normalize-path "^3.0.0" - readable-stream "^3.6.0" - concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -1854,66 +1500,46 @@ constant-case@^3.0.4: tslib "^2.0.3" upper-case "^2.0.2" -content-type@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - -conventional-changelog-angular@^5.0.11: - version "5.0.13" - resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz#896885d63b914a70d4934b59d2fe7bde1832b28c" - integrity sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA== +conventional-changelog-angular@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-6.0.0.tgz#a9a9494c28b7165889144fd5b91573c4aa9ca541" + integrity sha512-6qLgrBF4gueoC7AFVHu51nHL9pF9FRjXrH+ceVf7WmAfH3gs+gEYOkvxhjMPjZu57I4AGUGoNTY8V7Hrgf1uqg== dependencies: compare-func "^2.0.0" - q "^1.5.1" -conventional-changelog-conventionalcommits@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-5.0.0.tgz#41bdce54eb65a848a4a3ffdca93e92fa22b64a86" - integrity sha512-lCDbA+ZqVFQGUj7h9QBKoIpLhl8iihkO0nCTyRNzuXtcd7ubODpYB04IFy31JloiJgG0Uovu8ot8oxRzn7Nwtw== +conventional-changelog-conventionalcommits@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-6.1.0.tgz#3bad05f4eea64e423d3d90fc50c17d2c8cf17652" + integrity sha512-3cS3GEtR78zTfMzk0AizXKKIdN4OvSh7ibNz6/DPbhWWQu7LqE/8+/GqSodV+sywUR2gpJAdP/1JFf4XtN7Zpw== dependencies: compare-func "^2.0.0" - lodash "^4.17.15" - q "^1.5.1" - -conventional-commit-types@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/conventional-commit-types/-/conventional-commit-types-2.3.0.tgz#bc3c8ebba0a9e4b3ecc548f1d0674e251ab8be22" - integrity sha512-6iB39PrcGYdz0n3z31kj6/Km6mK9hm9oMRhwcLnKxE7WNoeRKZbTAobliKrbYZ5jqyCvtcVEfjCiaEzhL3AVmQ== -conventional-commits-parser@^3.2.2: - version "3.2.4" - resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz#a7d3b77758a202a9b2293d2112a8d8052c740972" - integrity sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q== +conventional-commits-parser@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-4.0.0.tgz#02ae1178a381304839bce7cea9da5f1b549ae505" + integrity sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg== dependencies: - JSONStream "^1.0.4" + JSONStream "^1.3.5" is-text-path "^1.0.1" - lodash "^4.17.15" - meow "^8.0.0" - split2 "^3.0.0" - through2 "^4.0.0" + meow "^8.1.2" + split2 "^3.2.2" convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== -core-js-pure@^3.25.1: - version "3.25.5" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.25.5.tgz#79716ba54240c6aa9ceba6eee08cf79471ba184d" - integrity sha512-oml3M22pHM+igfWHDfdLVq2ShWmjM2V4L+dQEBs0DWVIqEm9WHCwGAlZ6BmyBQGy5sFrJmcx+856D9lVKyGWYg== +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== -core-js@^3.6.4: - version "3.25.5" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.25.5.tgz#e86f651a2ca8a0237a5f064c2fe56cef89646e27" - integrity sha512-nbm6eZSjm+ZuBQxCUPQKQCoUEfFOXjUZ8dTTyikyKaWrTYmAVbykQfwsKE5dBK88u3QCkCrzsx/PPlKfhsvgpw== +core-js-compat@^3.34.0: + version "3.37.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.37.1.tgz#c844310c7852f4bdf49b8d339730b97e17ff09ee" + integrity sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg== + dependencies: + browserslist "^4.23.0" core-util-is@~1.0.0: version "1.0.3" @@ -1921,60 +1547,25 @@ core-util-is@~1.0.0: integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== cosmiconfig-typescript-loader@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.1.1.tgz#38dd3578344038dae40fdf09792bc2e9df529f78" - integrity sha512-9DHpa379Gp0o0Zefii35fcmuuin6q92FnLDffzdZ0l9tVd3nEobG3O+MZ06+kuBvFTSVScvNb/oHA13Nd4iipg== - -cosmiconfig@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" - integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.10.0" + version "4.4.0" + resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.4.0.tgz#f3feae459ea090f131df5474ce4b1222912319f9" + integrity sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw== -cosmiconfig@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.0.0.tgz#e9feae014eab580f858f8a0288f38997a7bebe97" - integrity sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ== +cosmiconfig@^8.0.0, cosmiconfig@^8.3.6: + version "8.3.6" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== dependencies: - import-fresh "^3.2.1" + import-fresh "^3.3.0" js-yaml "^4.1.0" - parse-json "^5.0.0" + parse-json "^5.2.0" path-type "^4.0.0" -crc-32@^1.2.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" - integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== - -crc32-stream@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-4.0.2.tgz#c922ad22b38395abe9d3870f02fa8134ed709007" - integrity sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w== - dependencies: - 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" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -1991,63 +1582,60 @@ csprng@*: dependencies: sequin "*" -csv-parse@^4.8.2: - version "4.16.3" - resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-4.16.3.tgz#7ca624d517212ebc520a36873c3478fa66efbaf7" - integrity sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg== +csv-parse@^5.5.2: + version "5.5.6" + resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-5.5.6.tgz#0d726d58a60416361358eec291a9f93abe0b6b1a" + integrity sha512-uNpm30m/AGSkLxxy7d9yRXpJQFrZzVWLFBkS+6ngPcZkw/5k3L/jjFuj7tVnEpRn+QgmiXr21nDlhCiUK4ij2A== -csv-stringify@^5.3.4: - version "5.6.5" - resolved "https://registry.yarnpkg.com/csv-stringify/-/csv-stringify-5.6.5.tgz#c6d74badda4b49a79bf4e72f91cce1e33b94de00" - integrity sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A== - -cz-conventional-changelog@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cz-conventional-changelog/-/cz-conventional-changelog-2.1.0.tgz#2f4bc7390e3244e4df293e6ba351e4c740a7c764" - integrity sha512-TMjkSrvju5fPQV+Ho8TIioAgXkly8h3vJ/txiczJrlUaLpgMGA6ssnwquLMWzNZZyCsJK5r4kPgwdohC4UAGmQ== - dependencies: - conventional-commit-types "^2.0.0" - lodash.map "^4.5.1" - longest "^1.0.1" - right-pad "^1.0.1" - word-wrap "^1.0.3" +csv-stringify@^6.4.4: + version "6.5.0" + resolved "https://registry.yarnpkg.com/csv-stringify/-/csv-stringify-6.5.0.tgz#7b1491893c917e018a97de9bf9604e23b88647c2" + integrity sha512-edlXFVKcUx7r8Vx5zQucsuMg4wb/xT6qyz+Sr1vnLrdXqlLD1+UKyWNyZ9zn6mUW1ewmGxrpVwAcChGF0HQ/2Q== dargs@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== -dayjs-plugin-utc@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/dayjs-plugin-utc/-/dayjs-plugin-utc-0.1.2.tgz#48e552407024143922d6499a40f6c765f8c93d03" - integrity sha512-ExERH5o3oo6jFOdkvMP3gytTCQ9Ksi5PtylclJWghr7k7m3o2U5QrwtdiJkOxLOH4ghr0EKhpqGefzGz1VvVJg== +data-view-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" + integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" -dayjs@^1.8.16: - version "1.11.5" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.5.tgz#00e8cc627f231f9499c19b38af49f56dc0ac5e93" - integrity sha512-CAdX5Q3YW3Gclyo5Vpqkgpj8fSdLQcRuzfX6mC6Phy0nfJ0eGYOeS7m4mt2plDWLAtA4TqTakvbboHvUxfe4iA== +data-view-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" + integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-data-view "^1.0.1" -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: +data-view-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" + integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +dateformat@^4.6.3: + version "4.6.3" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-4.6.3.tgz#556fa6497e5217fedb78821424f8a1c22fa3f4b5" + integrity sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA== + +debug@4, debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -debug@4.3.3: - version "4.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" - integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== - dependencies: - ms "2.1.2" - -debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" @@ -2056,9 +1644,9 @@ debug@^3.2.7: ms "^2.1.1" decamelize-keys@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" - integrity sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg== + version "1.1.1" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" + integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== dependencies: decamelize "^1.1.0" map-obj "^1.0.0" @@ -2073,17 +1661,7 @@ decamelize@^4.0.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== -decode-uri-component@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" - integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== - -dedent@0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== - -deep-eql@^4.1.2: +deep-eql@^4.1.3: version "4.1.3" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== @@ -2096,62 +1674,35 @@ deep-is@^0.1.3: integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== default-require-extensions@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-3.0.0.tgz#e03f93aac9b2b6443fc52e5e4a37b3ad9ad8df96" - integrity sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg== + version "3.0.1" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-3.0.1.tgz#bfae00feeaeada68c2ae256c62540f60b80625bd" + integrity sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw== dependencies: strip-bom "^4.0.0" -define-properties@^1.1.3, define-properties@^1.1.4: +define-data-property@^1.0.1, define-data-property@^1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" - integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== - dependencies: - is-descriptor "^1.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== +define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -detect-file@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" - integrity sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q== - -detect-indent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" - integrity sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g== - -detect-indent@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" - integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== - diff@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" @@ -2167,11 +1718,6 @@ diff@^4.0.1, diff@^4.0.2: resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== -diff@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" - integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== - dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -2193,6 +1739,36 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + +domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +domutils@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" + integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + dot-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" @@ -2208,12 +1784,10 @@ dot-prop@^5.1.0: dependencies: is-obj "^2.0.0" -dtrace-provider@~0.6: - version "0.6.0" - resolved "https://registry.yarnpkg.com/dtrace-provider/-/dtrace-provider-0.6.0.tgz#0b078d5517937d873101452d9146737557b75e51" - integrity sha512-yqNrDWYWOR3wumcWPhlIGIKRSFMbDEwilGi+xYeaY4wW82cZrWsqGE+jsVnouxMqt/kCVsNmy/XDXLrm/J6SJg== - dependencies: - nan "^2.0.8" +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== ecdsa-sig-formatter@1.0.11: version "1.0.11" @@ -2222,23 +1796,33 @@ ecdsa-sig-formatter@1.0.11: dependencies: safe-buffer "^5.0.1" -electron-to-chromium@^1.4.172: - version "1.4.186" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.186.tgz#a811bba15f0868d3f4164b0f4ede8adc8773831b" - integrity sha512-YoVeFrGd/7ROjz4R9uPoND1K/hSRC/xADy9639ZmIZeJSaBnKdYx3I6LMPsY7CXLpK7JFgKQVzeZ/dk2br6Eaw== +electron-to-chromium@^1.4.668: + version "1.4.784" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.784.tgz#729a80154cee6ee9cb8bc3948af83431ab5cb394" + integrity sha512-9CZwh+sDrhDAeOEFh8s3PqwduzTyYIeYwZolc1b9ENAUt3ePu7R1sJSCWr/820ISssRxCJUyHI9Wb7j+0Uo1AA== emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -end-of-stream@^1.1.0, end-of-stream@^1.4.1: +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +end-of-stream@^1.1.0: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" +entities@^4.2.0, entities@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -2246,60 +1830,92 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.19.0, es-abstract@^1.20.4: - version "1.21.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.1.tgz#e6105a099967c08377830a0c9cb589d570dd86c6" - integrity sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-set-tostringtag "^2.0.1" +es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2: + version "1.23.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" + integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== + dependencies: + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + data-view-buffer "^1.0.1" + data-view-byte-length "^1.0.1" + data-view-byte-offset "^1.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.0.3" es-to-primitive "^1.2.1" - function-bind "^1.1.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.1.3" - get-symbol-description "^1.0.0" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" globalthis "^1.0.3" gopd "^1.0.1" - has "^1.0.3" - has-property-descriptors "^1.0.0" - has-proto "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" has-symbols "^1.0.3" - internal-slot "^1.0.4" - is-array-buffer "^3.0.1" + hasown "^2.0.2" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" is-callable "^1.2.7" - is-negative-zero "^2.0.2" + is-data-view "^1.0.1" + is-negative-zero "^2.0.3" is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" + is-shared-array-buffer "^1.0.3" is-string "^1.0.7" - is-typed-array "^1.1.10" + is-typed-array "^1.1.13" is-weakref "^1.0.2" - object-inspect "^1.12.2" + object-inspect "^1.13.1" object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.4.3" - safe-regex-test "^1.0.0" - string.prototype.trimend "^1.0.6" - string.prototype.trimstart "^1.0.6" - typed-array-length "^1.0.4" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.2" + safe-array-concat "^1.1.2" + safe-regex-test "^1.0.3" + string.prototype.trim "^1.2.9" + string.prototype.trimend "^1.0.8" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.6" unbox-primitive "^1.0.2" - which-typed-array "^1.1.9" + which-typed-array "^1.1.15" -es-set-tostringtag@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" - integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== dependencies: - get-intrinsic "^1.1.3" - has "^1.0.3" - has-tostringtag "^1.0.0" + get-intrinsic "^1.2.4" -es-shim-unscopables@^1.0.0: +es-errors@^1.2.1, es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-object-atoms@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" - integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== dependencies: - has "^1.0.3" + es-errors "^1.3.0" + +es-set-tostringtag@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" + integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== + dependencies: + get-intrinsic "^1.2.4" + has-tostringtag "^1.0.2" + hasown "^2.0.1" + +es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== + dependencies: + hasown "^2.0.0" es-to-primitive@^1.2.1: version "1.2.1" @@ -2315,10 +1931,15 @@ es6-error@^4.0.1: resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== +escalade@^3.1.1, escalade@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== + +escape-html@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: version "4.0.0" @@ -2330,178 +1951,153 @@ escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== -eslint-config-prettier@^8.5.0, eslint-config-prettier@^8.7.0: - version "8.7.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.7.0.tgz#f1cc58a8afebc50980bd53475451df146c13182d" - integrity sha512-HHVXLSlVUhMSmyW4ZzEuvjpwqamgmlfkutD53cYXLikh4pt/modINRcCIApJ84czDxM4GZInwUrromsDdTImTA== - -eslint-config-salesforce-license@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/eslint-config-salesforce-license/-/eslint-config-salesforce-license-0.1.6.tgz#75b475cf90f92e1dcb4340124466288915fed3f8" - integrity sha512-PH1nkm6MaouON4Ac4fgJh29oQiHlpU/G2xS45FAYeAWkh1up88j1UpjXt2ISNniQVvU4uqfVAOOaEb5X5hDqYw== +eslint-config-prettier@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz#31af3d94578645966c082fcb71a5846d3c94867f" + integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== eslint-config-salesforce-license@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/eslint-config-salesforce-license/-/eslint-config-salesforce-license-0.2.0.tgz#323193f1aa15dd33fbf108d25fc1210afc11065e" integrity sha512-DJdBvgj82Erum82YMe+YvG/o6ukna3UA++lRl0HSTldj0VlBl3Q8hzCp97nRXZHra6JH1I912yievZzklXDw6w== -eslint-config-salesforce-typescript@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/eslint-config-salesforce-typescript/-/eslint-config-salesforce-typescript-1.1.1.tgz#fb038f6423c5472d6439e9f780184b00ebcd2685" - integrity sha512-cjj2tU5wkushOUynecjg0JQtb/y61pWSjtOKKnNzWEdtbZEs7pe1/w5hsaZ79urdeFFUHQW2mr3qpzsWzUjgxQ== - -eslint-config-salesforce@^1.1.0, eslint-config-salesforce@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/eslint-config-salesforce/-/eslint-config-salesforce-1.1.1.tgz#0d25735324675cae3fefcbc4e6021aa2c77ea12f" - integrity sha512-xDp5ucbmSOAemFHOmzhli5RL864RoAghq/Yf5HeLvNz2JsrUvgW8n97LeZAJxlhj82JqKRg87IEHERUE4BRVPg== +eslint-config-salesforce-typescript@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/eslint-config-salesforce-typescript/-/eslint-config-salesforce-typescript-3.3.0.tgz#308acead1909665a92e9d32895c592ec4c9ee87a" + integrity sha512-83+zp2Y2h9oz9D3UksjNGCw+xWD7ylIiAJZ58vUbBD10l8FRUMNyn+RDCKn0xCQz7xed5/LcmgUE4T7roe+HBw== + dependencies: + "@typescript-eslint/eslint-plugin" "^6.21.0" + "@typescript-eslint/parser" "^6.21.0" + eslint "^8.56.0" + eslint-config-prettier "^9.1.0" + eslint-config-salesforce "^2.2.0" + eslint-config-salesforce-license "^0.2.0" + eslint-plugin-header "^3.1.1" + eslint-plugin-import "^2.29.1" + eslint-plugin-jsdoc "^46.10.1" + eslint-plugin-unicorn "^50.0.1" + +eslint-config-salesforce@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/eslint-config-salesforce/-/eslint-config-salesforce-2.2.0.tgz#04b6cf07dcbaabc32fc9edb0915860497db55c30" + integrity sha512-0zUEFJ2nNpMvVO3MgKEDUTGtaFZjL3xEIErr5h+BOft+OhGoIvZBNPnBBu12lvv29ylqIAQz5SwoVCCUzBhyPQ== -eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.7: - version "0.3.7" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz#83b375187d412324a1963d84fa664377a23eb4d7" - integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== +eslint-import-resolver-node@^0.3.9: + version "0.3.9" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== dependencies: debug "^3.2.7" - is-core-module "^2.11.0" - resolve "^1.22.1" + is-core-module "^2.13.0" + resolve "^1.22.4" -eslint-module-utils@^2.7.3, eslint-module-utils@^2.7.4: - version "2.7.4" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974" - integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== +eslint-module-utils@^2.8.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34" + integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== dependencies: debug "^3.2.7" -eslint-plugin-header@^3.0.0, eslint-plugin-header@^3.1.1: +eslint-plugin-header@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/eslint-plugin-header/-/eslint-plugin-header-3.1.1.tgz#6ce512432d57675265fac47292b50d1eff11acd6" integrity sha512-9vlKxuJ4qf793CmeeSrZUvVClw6amtpghq3CuWcB5cUNnWHQhgcqy5eF8oVKFk1G3Y/CbchGfEaw3wiIJaNmVg== -eslint-plugin-import@2.26.0: - version "2.26.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b" - integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== +eslint-plugin-import@^2.29.1: + version "2.29.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" + integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== dependencies: - array-includes "^3.1.4" - array.prototype.flat "^1.2.5" - debug "^2.6.9" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.6" - eslint-module-utils "^2.7.3" - has "^1.0.3" - is-core-module "^2.8.1" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.values "^1.1.5" - resolve "^1.22.0" - tsconfig-paths "^3.14.1" - -eslint-plugin-import@^2.27.5: - version "2.27.5" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz#876a6d03f52608a3e5bb439c2550588e51dd6c65" - integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== - dependencies: - array-includes "^3.1.6" - array.prototype.flat "^1.3.1" - array.prototype.flatmap "^1.3.1" + array-includes "^3.1.7" + array.prototype.findlastindex "^1.2.3" + array.prototype.flat "^1.3.2" + array.prototype.flatmap "^1.3.2" debug "^3.2.7" doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.7" - eslint-module-utils "^2.7.4" - has "^1.0.3" - is-core-module "^2.11.0" + eslint-import-resolver-node "^0.3.9" + eslint-module-utils "^2.8.0" + hasown "^2.0.0" + is-core-module "^2.13.1" is-glob "^4.0.3" minimatch "^3.1.2" - object.values "^1.1.6" - resolve "^1.22.1" - semver "^6.3.0" - tsconfig-paths "^3.14.1" - -eslint-plugin-jsdoc@^35.1.2: - version "35.5.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-35.5.1.tgz#45932ee22669bbe06c97b82b936d56361efad370" - integrity sha512-pPYPWtsykwVEue1tYEyoppBj4dgF7XicF67tLLLraY6RQYBq7qMKjUHji19+hfiTtYKKBD0YfeK8hgjPAE5viw== - dependencies: - "@es-joy/jsdoccomment" "0.9.0-alpha.1" - comment-parser "1.1.6-beta.0" - debug "^4.3.2" - esquery "^1.4.0" - jsdoc-type-pratt-parser "^1.0.4" - lodash "^4.17.21" - regextras "^0.8.0" - semver "^7.3.5" - spdx-expression-parse "^3.0.1" - -eslint-plugin-jsdoc@^39.9.1: - version "39.9.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.9.1.tgz#e9ce1723411fd7ea0933b3ef0dd02156ae3068e2" - integrity sha512-Rq2QY6BZP2meNIs48aZ3GlIlJgBqFCmR55+UBvaDkA3ZNQ0SvQXOs2QKkubakEijV8UbIVbVZKsOVN8G3MuqZw== - dependencies: - "@es-joy/jsdoccomment" "~0.36.1" - comment-parser "1.3.1" + object.fromentries "^2.0.7" + object.groupby "^1.0.1" + object.values "^1.1.7" + semver "^6.3.1" + tsconfig-paths "^3.15.0" + +eslint-plugin-jsdoc@^46.10.1: + version "46.10.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.10.1.tgz#77c871309c4ed93758a3b2fdf384dc6189cf8605" + integrity sha512-x8wxIpv00Y50NyweDUpa+58ffgSAI5sqe+zcZh33xphD0AVh+1kqr1ombaTRb7Fhpove1zfUuujlX9DWWBP5ag== + dependencies: + "@es-joy/jsdoccomment" "~0.41.0" + are-docs-informative "^0.0.2" + comment-parser "1.4.1" debug "^4.3.4" escape-string-regexp "^4.0.0" - esquery "^1.4.0" - semver "^7.3.8" - spdx-expression-parse "^3.0.1" - -eslint-plugin-prefer-arrow@^1.2.1: - 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-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" + esquery "^1.5.0" + is-builtin-module "^3.2.1" + semver "^7.5.4" + spdx-expression-parse "^4.0.0" + +eslint-plugin-unicorn@^50.0.1: + version "50.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-50.0.1.tgz#e539cdb02dfd893c603536264c4ed9505b70e3bf" + integrity sha512-KxenCZxqSYW0GWHH18okDlOQcpezcitm5aOSz6EnobyJ6BIByiPDviQRjJIUAjG/tMN11958MxaQ+qCoU6lfDA== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + "@eslint-community/eslint-utils" "^4.4.0" + "@eslint/eslintrc" "^2.1.4" + ci-info "^4.0.0" + clean-regexp "^1.0.0" + core-js-compat "^3.34.0" + esquery "^1.5.0" + indent-string "^4.0.0" + is-builtin-module "^3.2.1" + jsesc "^3.0.2" + pluralize "^8.0.0" + read-pkg-up "^7.0.1" + regexp-tree "^0.1.27" + regjsparser "^0.10.0" + semver "^7.5.4" + strip-indent "^3.0.0" -eslint-scope@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" - integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== - dependencies: - eslint-visitor-keys "^2.0.0" - -eslint-visitor-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== - -eslint-visitor-keys@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" - integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== - -eslint@^8.32.0, eslint@^8.35.0: - version "8.35.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.35.0.tgz#fffad7c7e326bae606f0e8f436a6158566d42323" - integrity sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw== - dependencies: - "@eslint/eslintrc" "^2.0.0" - "@eslint/js" "8.35.0" - "@humanwhocodes/config-array" "^0.11.8" +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint@^8.56.0: + version "8.57.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" + integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.0" + "@humanwhocodes/config-array" "^0.11.14" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" - ajv "^6.10.0" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.3.2" doctrine "^3.0.0" escape-string-regexp "^4.0.0" - eslint-scope "^7.1.1" - eslint-utils "^3.0.0" - eslint-visitor-keys "^3.3.0" - espree "^9.4.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" esquery "^1.4.2" esutils "^2.0.2" fast-deep-equal "^3.1.3" @@ -2509,40 +2105,36 @@ eslint@^8.32.0, eslint@^8.35.0: find-up "^5.0.0" glob-parent "^6.0.2" globals "^13.19.0" - grapheme-splitter "^1.0.4" + graphemer "^1.4.0" ignore "^5.2.0" - import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" is-path-inside "^3.0.3" - js-sdsl "^4.1.4" js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" lodash.merge "^4.6.2" minimatch "^3.1.2" natural-compare "^1.4.0" - optionator "^0.9.1" - regexpp "^3.2.0" + optionator "^0.9.3" strip-ansi "^6.0.1" - strip-json-comments "^3.1.0" text-table "^0.2.0" -espree@^9.4.0: - version "9.4.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.0.tgz#cd4bc3d6e9336c433265fc0aa016fc1aaf182f8a" - integrity sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw== +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== dependencies: - acorn "^8.8.0" + acorn "^8.9.0" acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.3.0" + eslint-visitor-keys "^3.4.1" -esprima@^4.0.0, esprima@~4.0.0: +esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.4.0, esquery@^1.4.2: +esquery@^1.4.2, esquery@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== @@ -2556,11 +2148,6 @@ esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - estraverse@^5.1.0, estraverse@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" @@ -2576,20 +2163,12 @@ event-target-shim@^5.0.0: resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== -execa@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" - integrity sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw== - dependencies: - cross-spawn "^6.0.0" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -execa@^4.0.0: +events@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== @@ -2619,78 +2198,25 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expand-tilde@^2.0.0, expand-tilde@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" - integrity sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw== - dependencies: - homedir-polyfill "^1.0.1" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: +extend@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -external-editor@^3.0.0, external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extract-stack@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/extract-stack/-/extract-stack-2.0.0.tgz#11367bc865bfcd9bc0db3123e5edb57786f11f9b" - integrity sha512-AEo4zm+TenK7zQorGK1f9mJ8L14hnTDi2ZQPR+Mub1NX8zimka1mXpV5LpH8x9HoUmFSHZCfLHqWvp0Y4FxxzQ== +fast-copy@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/fast-copy/-/fast-copy-3.0.2.tgz#59c68f59ccbcac82050ba992e0d5c389097c9d35" + integrity sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ== fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^3.0.3, fast-glob@^3.2.11, fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== +fast-glob@^3.2.11, fast-glob@^3.2.9: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -2708,10 +2234,37 @@ fast-levenshtein@^2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== +fast-levenshtein@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-3.0.0.tgz#37b899ae47e1090e40e3fd2318e4d5f0142ca912" + integrity sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ== + dependencies: + fastest-levenshtein "^1.0.7" + +fast-redact@^3.1.1: + version "3.5.0" + resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.5.0.tgz#e9ea02f7e57d0cd8438180083e93077e496285e4" + integrity sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A== + +fast-safe-stringify@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + +fast-uri@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-2.3.0.tgz#bdae493942483d299e7285dcb4627767d42e2793" + integrity sha512-eel5UKGn369gGEWOqBShmFJWfq/xSJvsgDzgLYC845GneayWvXBf0lJCBn5qTABfewy1ZDPoaR5OZCP+kssfuw== + +fastest-levenshtein@^1.0.7: + version "1.0.16" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" + integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== + fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== dependencies: reusify "^1.0.4" @@ -2734,20 +2287,6 @@ faye@^1.4.0: tough-cookie "*" tunnel-agent "*" -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA== - dependencies: - escape-string-regexp "^1.0.5" - -figures@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -2755,20 +2294,10 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" @@ -2781,19 +2310,6 @@ find-cache-dir@^3.2.0: make-dir "^3.0.2" pkg-dir "^4.1.0" -find-node-modules@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/find-node-modules/-/find-node-modules-2.0.0.tgz#5db1fb9e668a3d451db3d618cd167cdd59e41b69" - integrity sha512-8MWIBRgJi/WpjjfVXumjPKCtmQ10B+fjx6zmSA+770GMJirLhWIzg8l763rhjl9xaeaHbnxPNRQKq2mgMhr+aw== - dependencies: - findup-sync "^3.0.0" - merge "^1.2.1" - -find-root@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" - integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== - find-up@5.0.0, find-up@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" @@ -2810,29 +2326,13 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -find-yarn-workspace-root@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" - integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== - dependencies: - micromatch "^4.0.2" - -findup-sync@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" - integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== - dependencies: - detect-file "^1.0.0" - is-glob "^4.0.0" - micromatch "^3.0.4" - resolve-dir "^1.0.1" - flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== dependencies: - flatted "^3.1.0" + flatted "^3.2.9" + keyv "^4.5.3" rimraf "^3.0.2" flat@^5.0.2: @@ -2840,10 +2340,10 @@ flat@^5.0.2: resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== -flatted@^3.1.0: - version "3.2.6" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.6.tgz#022e9218c637f9f3fc9c35ab9c9193f05add60b2" - integrity sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ== +flatted@^3.2.9: + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== for-each@^0.3.3: version "0.3.3" @@ -2852,11 +2352,6 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== - foreground-child@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" @@ -2865,6 +2360,14 @@ foreground-child@^2.0.0: cross-spawn "^7.0.0" signal-exit "^3.0.2" +foreground-child@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + form-data@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" @@ -2874,51 +2377,21 @@ form-data@^4.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== - dependencies: - map-cache "^0.2.2" - fromentries@^1.2.0: version "1.3.2" resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a" integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - fs-extra@^11.0.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.0.tgz#5784b102104433bb0e090f48bfc4a30742c357ed" - integrity sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw== + version "11.2.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" + integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== dependencies: graceful-fs "^4.2.0" jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-6.0.1.tgz#8abc128f7946e310135ddc93b98bddb410e7a34b" - integrity sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" - integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^8.1, fs-extra@^8.1.0: +fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== @@ -2933,30 +2406,41 @@ fs.realpath@^1.0.0: integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== +function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" -functions-have-names@^1.2.2: +functions-have-names@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== +gaxios@^6.0.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-6.6.0.tgz#af8242fff0bbb82a682840d5feaa91b6a1c58be4" + integrity sha512-bpOZVQV5gthH/jVCSuYuokRo2bTKOcuBiVWpjmTn6C5Agl5zclGfTljuGsQZxwwDBkli+YhZhP4TdlqTnhOezQ== + dependencies: + extend "^3.0.2" + https-proxy-agent "^7.0.1" + is-stream "^2.0.0" + node-fetch "^2.6.9" + uuid "^9.0.1" + gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -2967,31 +2451,28 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-func-name@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" - integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== +get-func-name@^2.0.1, get-func-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" + integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" - integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== dependencies: - function-bind "^1.1.1" - has "^1.0.3" + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" has-symbols "^1.0.3" + hasown "^2.0.0" get-package-type@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - integrity sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ== - -get-stream@^5.0.0, get-stream@^5.1.0: +get-stream@^5.0.0: version "5.2.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== @@ -3003,20 +2484,16 @@ get-stream@^6.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== +get-symbol-description@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" + integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== + call-bind "^1.0.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" -git-raw-commits@^2.0.0: +git-raw-commits@^2.0.11: version "2.0.11" resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.11.tgz#bc3576638071d18655e1cc60d7f524920008d723" integrity sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A== @@ -3027,11 +2504,6 @@ git-raw-commits@^2.0.0: split2 "^3.0.0" through2 "^4.0.0" -github-slugger@^1.2.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.4.0.tgz#206eb96cdb22ee56fdc53a28d5a302338463444e" - integrity sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ== - glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -3046,42 +2518,29 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" -glob@7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== +glob@8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.4" + minimatch "^5.0.1" once "^1.3.0" - path-is-absolute "^1.0.0" -glob@^6.0.1: - version "6.0.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" - integrity sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A== +glob@^10.3.10: + version "10.4.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.1.tgz#0cfb01ab6a6b438177bfe6a58e2576f6efe909c2" + integrity sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw== dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + path-scurry "^1.11.1" -glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: +glob@^7.0.0, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -3100,25 +2559,14 @@ global-dirs@^0.1.1: dependencies: ini "^1.3.4" -global-modules@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" - integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== - dependencies: - global-prefix "^1.0.1" - is-windows "^1.0.1" - resolve-dir "^1.0.0" - -global-prefix@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" - integrity sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg== +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== dependencies: - expand-tilde "^2.0.2" - homedir-polyfill "^1.0.1" - ini "^1.3.4" - is-windows "^1.0.1" - which "^1.2.14" + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" globals@^11.1.0: version "11.12.0" @@ -3126,34 +2574,21 @@ globals@^11.1.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.19.0: - version "13.19.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.19.0.tgz#7a42de8e6ad4f7242fbcca27ea5b23aca367b5c8" - integrity sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ== + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== dependencies: type-fest "^0.20.2" globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== - dependencies: - define-properties "^1.1.3" - -globby@^10.0.1: - version "10.0.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543" - integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg== + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== dependencies: - "@types/glob" "^7.1.1" - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.0.3" - glob "^7.1.3" - ignore "^5.1.1" - merge2 "^1.2.3" - slash "^3.0.0" + define-properties "^1.2.1" + gopd "^1.0.1" -globby@^11.0.1, globby@^11.1.0: +globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -3172,20 +2607,15 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - -grapheme-splitter@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" - integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== +graceful-fs@^4.1.15, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== -growl@1.10.5: - version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== hard-rejection@^2.1.0: version "2.1.0" @@ -3207,67 +2637,29 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: - get-intrinsic "^1.1.1" + es-define-property "^1.0.0" -has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== +has-proto@^1.0.1, has-proto@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: - function-bind "^1.1.1" + has-symbols "^1.0.3" hasha@^5.0.0: version "5.2.2" @@ -3277,6 +2669,13 @@ hasha@^5.0.0: is-stream "^2.0.0" type-fest "^0.8.0" +hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + he@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" @@ -3290,12 +2689,10 @@ header-case@^2.0.4: capital-case "^1.0.4" tslib "^2.0.3" -homedir-polyfill@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" - integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== - dependencies: - parse-passwd "^1.0.0" +help-me@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/help-me/-/help-me-5.0.0.tgz#b1ebe63b967b74060027c2ac61f9be12d354a6f6" + integrity sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg== hosted-git-info@^2.1.4: version "2.8.9" @@ -3314,17 +2711,15 @@ html-escaper@^2.0.0: resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== -http-call@^5.1.2: - version "5.3.0" - resolved "https://registry.yarnpkg.com/http-call/-/http-call-5.3.0.tgz#4ded815b13f423de176eb0942d69c43b25b148db" - integrity sha512-ahwimsC23ICE4kPl9xTBjKB4inbRaeLyZeRunC/1Jy/Z6X8tv22MEAjK+KBOMSVLaqXPTTmd8638waVIKLGx2w== +htmlparser2@^9.0.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-9.1.0.tgz#cdb498d8a75a51f739b61d3f718136c369bc8c23" + integrity sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ== dependencies: - content-type "^1.0.4" - debug "^4.1.1" - is-retry-allowed "^1.1.0" - is-stream "^2.0.0" - parse-json "^4.0.0" - tunnel-agent "^0.6.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.1.0" + entities "^4.5.0" http-parser-js@>=0.5.1: version "0.5.8" @@ -3339,6 +2734,14 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" +https-proxy-agent@^7.0.1: + version "7.0.4" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz#8e97b841a029ad8ddc8731f26595bad868cb4168" + integrity sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg== + dependencies: + agent-base "^7.0.2" + debug "4" + human-signals@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" @@ -3354,29 +2757,22 @@ husky@^7.0.4: resolved "https://registry.yarnpkg.com/husky/-/husky-7.0.4.tgz#242048245dc49c8fb1bf0cc7cfb98dd722531535" integrity sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ== -hyperlinker@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hyperlinker/-/hyperlinker-1.0.0.tgz#23dc9e38a206b208ee49bc2d6c8ef47027df0c0e" - integrity sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ== - -iconv-lite@^0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -ieee754@^1.1.13: +ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ignore@^5.1.1, ignore@^5.1.4, ignore@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== +ignore@^5.2.0, ignore@^5.2.4, ignore@^5.3.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" + integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== -import-fresh@^3.0.0, import-fresh@^3.2.1: +immediate@~3.0.5: + version "3.0.6" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== + +import-fresh@^3.0.0, import-fresh@^3.2.1, import-fresh@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -3402,61 +2798,23 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -ini@^1.3.4: +ini@^1.3.4, ini@^1.3.5: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -inquirer@6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.0.tgz#51adcd776f661369dc1e894859c2560a224abdd8" - integrity sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg== - dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.0" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^3.0.0" - figures "^2.0.0" - lodash "^4.17.10" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^6.1.0" - string-width "^2.1.0" - strip-ansi "^4.0.0" - through "^2.3.6" - -inquirer@^7.0.0: - version "7.3.3" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" - integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.19" - mute-stream "0.0.8" - run-async "^2.4.0" - rxjs "^6.6.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - -internal-slot@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" - integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== +internal-slot@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== dependencies: - get-intrinsic "^1.2.0" - has "^1.0.3" + es-errors "^1.3.0" + hasown "^2.0.0" side-channel "^1.0.4" interpret@^1.0.0: @@ -3464,28 +2822,13 @@ interpret@^1.0.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - -is-array-buffer@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" - integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== +is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== dependencies: call-bind "^1.0.2" - get-intrinsic "^1.2.0" - is-typed-array "^1.1.10" + get-intrinsic "^1.2.1" is-arrayish@^0.2.1: version "0.2.1" @@ -3514,36 +2857,31 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== +is-builtin-module@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169" + integrity sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A== + dependencies: + builtin-modules "^3.3.0" is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@^2.11.0, is-core-module@^2.5.0, is-core-module@^2.8.1, is-core-module@^2.9.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" - integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== +is-core-module@^2.13.0, is-core-module@^2.13.1, is-core-module@^2.5.0: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== dependencies: - has "^1.0.3" + hasown "^2.0.0" -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== +is-data-view@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" + integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== dependencies: - kind-of "^6.0.0" + is-typed-array "^1.1.13" is-date-object@^1.0.1: version "1.0.5" @@ -3552,51 +2890,11 @@ is-date-object@^1.0.1: dependencies: has-tostringtag "^1.0.0" -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-docker@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== - is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" @@ -3609,10 +2907,10 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== is-number-object@^1.0.4: version "1.0.7" @@ -3621,13 +2919,6 @@ is-number-object@^1.0.4: dependencies: has-tostringtag "^1.0.0" -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== - dependencies: - kind-of "^3.0.2" - is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -3648,18 +2939,11 @@ is-plain-obj@^1.1.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== -is-plain-obj@^2.0.0, is-plain-obj@^2.1.0: +is-plain-obj@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== -is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" @@ -3668,22 +2952,12 @@ is-regex@^1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-retry-allowed@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" - integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== - -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" + integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== dependencies: - call-bind "^1.0.2" - -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== + call-bind "^1.0.7" is-stream@^2.0.0: version "2.0.1" @@ -3711,16 +2985,12 @@ is-text-path@^1.0.1: dependencies: text-extensions "^1.0.0" -is-typed-array@^1.1.10, is-typed-array@^1.1.9: - version "1.1.10" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" - integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== +is-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" + which-typed-array "^1.1.14" is-typedarray@^1.0.0: version "1.0.0" @@ -3732,11 +3002,6 @@ is-unicode-supported@^0.1.0: resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== -is-utf8@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q== - is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" @@ -3744,24 +3009,22 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" -is-windows@^1.0.1, is-windows@^1.0.2: +is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== -is-wsl@^2.1.1, is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== -isarray@1.0.0, isarray@~1.0.0: +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== @@ -3771,22 +3034,10 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== - istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + version "3.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== istanbul-lib-hook@^3.0.0: version "3.0.0" @@ -3818,12 +3069,12 @@ istanbul-lib-processinfo@^2.0.2: uuid "^8.3.2" istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + version "3.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== dependencies: istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" + make-dir "^4.0.0" supports-color "^7.1.0" istanbul-lib-source-maps@^4.0.0: @@ -3836,17 +3087,26 @@ istanbul-lib-source-maps@^4.0.0: source-map "^0.6.1" istanbul-reports@^3.0.2: - version "3.1.4" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.4.tgz#1b6f068ecbc6c331040aab5741991273e609e40c" - integrity sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw== + version "3.1.7" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" + integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -js-sdsl@^4.1.4: - version "4.1.5" - resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.1.5.tgz#1ff1645e6b4d1b028cd3f862db88c9d887f26e2a" - integrity sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q== +jackspeak@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.1.2.tgz#eada67ea949c6b71de50f1b09c92a961897b90ab" + integrity sha512-kWmLKn2tRtfYMF/BakihVVRzBKOxz4gJMiL2Rj91WnAB5TPZumSH99R/Yf1qE1u4uRimvCSJfm6hnxohXeEXjQ== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +joycon@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" + integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw== js-tokens@^4.0.0: version "4.0.0" @@ -3875,56 +3135,30 @@ js2xmlparser@^4.0.1: dependencies: xmlcreate "^2.0.4" -jsdoc-type-pratt-parser@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-1.0.4.tgz#5750d2d32ffb001866537d3baaedea7cf84c7036" - integrity sha512-jzmW9gokeq9+bHPDR1nCeidMyFUikdZlbOhKzh9+/nJqB75XhpNKec1/UuxW5c4+O+Pi31Gc/dCboyfSm/pSpQ== - -jsdoc-type-pratt-parser@^1.0.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-1.2.0.tgz#3482a3833b74a88c95a6ba7253f0c0de3b77b9f5" - integrity sha512-4STjeF14jp4bqha44nKMY1OUI6d2/g6uclHWUCZ7B4DoLzaB5bmpTkQrpqU+vSVzMD0LsKAOskcnI3I3VfIpmg== - -jsdoc-type-pratt-parser@~3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-3.1.0.tgz#a4a56bdc6e82e5865ffd9febc5b1a227ff28e67e" - integrity sha512-MgtD0ZiCDk9B+eI73BextfRrVQl0oyzRG8B2BjORts6jbunj4ScKPcyXGTbB6eXL4y9TzxCm6hyeLq/2ASzNdw== +jsdoc-type-pratt-parser@~4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz#136f0571a99c184d84ec84662c45c29ceff71114" + integrity sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ== jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== -jsforce@^2.0.0-beta.19: - version "2.0.0-beta.19" - resolved "https://registry.yarnpkg.com/jsforce/-/jsforce-2.0.0-beta.19.tgz#4a136b88d6a9f6668714c4ccbb0acd55e46ea493" - integrity sha512-WdF6hs7kukXNGvp/VRhu2DngldgiBBorsc2WA5us08oJGbEIPwn/itqYJWKJ+rfPXepz5JbkWQd48XHGjqmPpw== - dependencies: - "@babel/runtime" "^7.12.5" - "@babel/runtime-corejs3" "^7.12.5" - "@types/node" "^12.19.9" - abort-controller "^3.0.0" - base64url "^3.0.1" - commander "^4.0.1" - core-js "^3.6.4" - csv-parse "^4.8.2" - csv-stringify "^5.3.4" - faye "^1.4.0" - form-data "^4.0.0" - fs-extra "^8.1.0" - https-proxy-agent "^5.0.0" - inquirer "^7.0.0" - multistream "^3.1.0" - node-fetch "^2.6.1" - open "^7.0.0" - regenerator-runtime "^0.13.3" - strip-ansi "^6.0.0" - xml2js "^0.4.22" +jsesc@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" + integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== json-parse-even-better-errors@^2.3.0: version "2.3.1" @@ -3946,22 +3180,22 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== dependencies: minimist "^1.2.0" -json5@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" - integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== -jsonc-parser@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.1.0.tgz#73b8f0e5c940b83d03476bc2e51a20ef0932615d" - integrity sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg== +jsonc-parser@^3.0.0, jsonc-parser@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.1.tgz#031904571ccf929d7670ee8c547545081cb37f1a" + integrity sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA== jsonfile@^4.0.0: version "4.0.0" @@ -3984,15 +3218,31 @@ jsonparse@^1.2.0: resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== -jsonwebtoken@9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz#d0faf9ba1cc3a56255fe49c0961a67e520c1926d" - integrity sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw== +jsonwebtoken@9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz#65ff91f4abef1784697d40952bb1998c504caaf3" + integrity sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ== dependencies: jws "^3.2.2" - lodash "^4.17.21" + lodash.includes "^4.3.0" + lodash.isboolean "^3.0.3" + lodash.isinteger "^4.0.4" + lodash.isnumber "^3.0.3" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.once "^4.0.0" ms "^2.1.1" - semver "^7.3.8" + semver "^7.5.4" + +jszip@3.10.1: + version "3.10.1" + resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2" + integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== + dependencies: + lie "~3.3.0" + pako "~1.0.2" + readable-stream "~2.3.6" + setimmediate "^1.0.5" just-extend@^4.0.2: version "4.2.1" @@ -4016,37 +3266,18 @@ jws@^3.2.2: jwa "^1.4.1" safe-buffer "^5.0.1" -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: - is-buffer "^1.1.5" + json-buffer "3.0.1" -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: +kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== -lazystream@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.1.tgz#494c831062f1f9408251ec44db1cba29242a2638" - integrity sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw== - dependencies: - readable-stream "^2.0.5" - levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -4055,20 +3286,33 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +lie@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" + integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== + dependencies: + immediate "~3.0.5" + lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -load-json-file@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-6.2.0.tgz#5c7770b42cafa97074ca2848707c61662f4251a1" - integrity sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ== - dependencies: - graceful-fs "^4.1.15" - parse-json "^5.0.0" - strip-bom "^4.0.0" - type-fest "^0.6.0" +linkinator@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/linkinator/-/linkinator-6.0.4.tgz#2a4a9f76732b0f8968abf35ed09d57a3a8be3427" + integrity sha512-gxZ9ePUBeoaCk29p+2gAwrRIVnKOqAV8ZVCEM8N7MvpwbccDBQiKjXFyS6nQx56K1CCZLboan2i5iJfpWCsnSQ== + dependencies: + chalk "^5.0.0" + escape-html "^1.0.3" + gaxios "^6.0.0" + glob "^10.3.10" + htmlparser2 "^9.0.0" + marked "^10.0.0" + meow "^13.0.0" + mime "^4.0.0" + server-destroy "^1.0.1" + srcset "^5.0.0" locate-path@^5.0.0: version "5.0.0" @@ -4089,21 +3333,6 @@ lodash.camelcase@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== -lodash.defaults@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" - integrity sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ== - -lodash.difference@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c" - integrity sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA== - -lodash.flatten@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" - integrity sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g== - lodash.flattendeep@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" @@ -4114,26 +3343,46 @@ lodash.get@^4.4.2: resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== +lodash.includes@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" + integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== + +lodash.isboolean@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" + integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== + lodash.isfunction@^3.0.9: version "3.0.9" resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" integrity sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw== +lodash.isinteger@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" + integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA== + +lodash.isnumber@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" + integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw== + lodash.isplainobject@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== + lodash.kebabcase@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" integrity sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g== -lodash.map@^4.5.1: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" - integrity sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q== - lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" @@ -4144,6 +3393,11 @@ lodash.mergewith@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== +lodash.once@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== + lodash.snakecase@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" @@ -4154,11 +3408,6 @@ lodash.startcase@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8" integrity sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg== -lodash.union@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" - integrity sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw== - lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" @@ -4169,12 +3418,7 @@ lodash.upperfirst@^4.3.1: resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" integrity sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg== -lodash@4.17.14: - version "4.17.14" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.14.tgz#9ce487ae66c96254fe20b599f21b6816028078ba" - integrity sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw== - -lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21: +lodash@^4.17.15, lodash@^4.17.4: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -4199,17 +3443,12 @@ lolex@^5.0.1: dependencies: "@sinonjs/commons" "^1.7.0" -longest@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" - integrity sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg== - -loupe@^2.3.1: - version "2.3.4" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.4.tgz#7e0b9bffc76f148f9be769cb1321d3dcf3cb25f3" - integrity sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ== +loupe@^2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" + integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== dependencies: - get-func-name "^2.0.0" + get-func-name "^2.0.1" lower-case@^2.0.2: version "2.0.2" @@ -4218,6 +3457,18 @@ lower-case@^2.0.2: dependencies: tslib "^2.0.3" +lru-cache@^10.2.0: + version "10.2.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.2.tgz#48206bc114c1252940c41b25b41af5b545aca878" + integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -4237,16 +3488,18 @@ make-dir@^3.0.0, make-dir@^3.0.2: dependencies: semver "^6.0.0" +make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== + dependencies: + semver "^7.5.3" + make-error@^1.1.1: version "1.3.6" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== - map-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" @@ -4257,19 +3510,22 @@ map-obj@^4.0.0: resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== - dependencies: - object-visit "^1.0.0" +marked@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/marked/-/marked-10.0.0.tgz#7fe1805bb908433d760e2de0fcc8841a2b2d745c" + integrity sha512-YiGcYcWj50YrwBgNzFoYhQ1hT6GmQbFG8SksnYJX1z4BXTHSOrz1GB5/Jm2yQvMg4nN1FHP4M6r03R10KrVUiA== + +marked@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3" + integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A== -marked@^4.0.19: - version "4.2.12" - resolved "https://registry.yarnpkg.com/marked/-/marked-4.2.12.tgz#d69a64e21d71b06250da995dcd065c11083bebb5" - integrity sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw== +meow@^13.0.0: + version "13.2.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-13.2.0.tgz#6b7d63f913f984063b3cc261b6e8800c4cd3474f" + integrity sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA== -meow@^8.0.0: +meow@^8.0.0, meow@^8.1.2: version "8.1.2" resolved "https://registry.yarnpkg.com/meow/-/meow-8.1.2.tgz#bcbe45bda0ee1729d350c03cffc8395a36c4e897" integrity sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q== @@ -4291,41 +3547,17 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: +merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -merge@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" - integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== - -micromatch@^3.0.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -micromatch@^4.0.2, micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== +micromatch@^4.0.4: + version "4.0.7" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" + integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== dependencies: - braces "^3.0.2" + braces "^3.0.3" picomatch "^2.3.1" mime-db@1.52.0: @@ -4340,10 +3572,10 @@ mime-types@^2.1.12: dependencies: mime-db "1.52.0" -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== +mime@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/mime/-/mime-4.0.3.tgz#cd4a1aa052fc980dfc34f111fe1be9e8b878c5d2" + integrity sha512-KgUb15Oorc0NEKPbvfa0wRU+PItIEZmiv+pyAO2i0oTIVTJhlzMclU7w4RXWQrSOVH5ax/p/CkIO7KI4OyFJTQ== mimic-fn@^2.1.0: version "2.1.0" @@ -4355,24 +3587,38 @@ min-indent@^1.0.0: resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== -"minimatch@2 || 3", minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" + integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@9.0.3: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" -minimatch@4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-4.2.1.tgz#40d9d511a46bdc4e563c22c3080cde9c0d8299b4" - integrity sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g== +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== dependencies: - brace-expansion "^1.1.7" + brace-expansion "^2.0.1" -minimatch@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.0.tgz#1717b464f4971b144f6aabe8f2d0b8e4511e09c7" - integrity sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg== +minimatch@^9.0.3, minimatch@^9.0.4: + version "9.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" + integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== dependencies: brace-expansion "^2.0.1" @@ -4385,76 +3631,47 @@ minimist-options@4.1.0: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - integrity sha512-7Wl+Jz+IGWuSdgsQEJ4JunV0si/iMhg42MnQQG6h1R6TNeVenp4U9x5CC5v/gYqz/fENLQITAWXidNtVL0NNbw== - -minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" - integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp-classic@^0.5.2: - version "0.5.3" - resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" - integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== +minimist@^1.2.0, minimist@^1.2.6, minimist@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -mkdirp@~0.5.1: - version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== -mocha@^9.1.3: - version "9.2.2" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.2.2.tgz#d70db46bdb93ca57402c809333e5a84977a88fb9" - integrity sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g== +mocha@^10.4.0: + version "10.4.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.4.0.tgz#ed03db96ee9cfc6d20c56f8e2af07b961dbae261" + integrity sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA== dependencies: - "@ungap/promise-all-settled" "1.1.2" ansi-colors "4.1.1" browser-stdout "1.3.1" chokidar "3.5.3" - debug "4.3.3" + debug "4.3.4" diff "5.0.0" escape-string-regexp "4.0.0" find-up "5.0.0" - glob "7.2.0" - growl "1.10.5" + glob "8.1.0" he "1.2.0" js-yaml "4.1.0" log-symbols "4.1.0" - minimatch "4.2.1" + minimatch "5.0.1" ms "2.1.3" - nanoid "3.3.1" serialize-javascript "6.0.0" strip-json-comments "3.1.1" supports-color "8.1.1" - which "2.0.2" - workerpool "6.2.0" + workerpool "6.2.1" yargs "16.2.0" yargs-parser "20.2.4" yargs-unparser "2.0.0" -mri@^1.1.5: +mri@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" @@ -4465,17 +3682,6 @@ ms@2.1.3, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -multimatch@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-4.0.0.tgz#8c3c0f6e3e8449ada0af3dd29efb491a375191b3" - integrity sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ== - dependencies: - "@types/minimatch" "^3.0.3" - array-differ "^3.0.0" - array-union "^2.1.0" - arrify "^2.0.1" - minimatch "^3.0.4" - multistream@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/multistream/-/multistream-3.1.0.tgz#49c382bc0bb355e34d15ba3a9fc1cf0f66b9fded" @@ -4484,77 +3690,11 @@ multistream@^3.1.0: inherits "^2.0.1" readable-stream "^3.4.0" -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ== - -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - -mv@~2: - version "2.1.1" - resolved "https://registry.yarnpkg.com/mv/-/mv-2.1.1.tgz#ae6ce0d6f6d5e0a4f7d893798d03c1ea9559b6a2" - integrity sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg== - dependencies: - mkdirp "~0.5.1" - ncp "~2.0.0" - rimraf "~2.4.0" - -nan@^2.0.8: - version "2.16.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.16.0.tgz#664f43e45460fb98faf00edca0bb0d7b8dce7916" - integrity sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA== - -nanoid@3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" - integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -natural-compare-lite@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" - integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== - natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -natural-orderby@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/natural-orderby/-/natural-orderby-2.0.3.tgz#8623bc518ba162f8ff1cdb8941d74deb0fdcc016" - integrity sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q== - -ncp@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" - integrity sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA== - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - nise@^1.3.3: version "1.5.3" resolved "https://registry.yarnpkg.com/nise/-/nise-1.5.3.tgz#9d2cfe37d44f57317766c6e9408a359c5d3ac1f7" @@ -4577,17 +3717,6 @@ nise@^4.1.0: just-extend "^4.0.2" path-to-regexp "^1.7.0" -nise@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/nise/-/nise-5.1.2.tgz#a7b8909c216b3491fd4fc0b124efb69f3939b449" - integrity sha512-+gQjFi8v+tkfCuSCxfURHLhRhniE/+IaYbIphxAN2JRR9SHKhY8hgXpaXiYfHdw+gcGe4buxgbprBQFab9FkhA== - dependencies: - "@sinonjs/commons" "^2.0.0" - "@sinonjs/fake-timers" "^7.0.4" - "@sinonjs/text-encoding" "^0.7.1" - just-extend "^4.0.2" - path-to-regexp "^1.7.0" - no-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" @@ -4596,10 +3725,10 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" -node-fetch@^2.6.1: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== +node-fetch@^2.6.1, node-fetch@^2.6.9: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" @@ -4610,10 +3739,10 @@ node-preload@^0.2.1: dependencies: process-on-spawn "^1.0.0" -node-releases@^2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" - integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== normalize-package-data@^2.5.0: version "2.5.0" @@ -4640,13 +3769,6 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== - dependencies: - path-key "^2.0.0" - npm-run-path@^4.0.0, npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" @@ -4687,62 +3809,58 @@ nyc@^15.1.0: test-exclude "^6.0.0" yargs "^15.0.2" -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-inspect@^1.12.2, object-inspect@^1.9.0: - version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== +object-inspect@^1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object-treeify@^1.1.4: - version "1.1.33" - resolved "https://registry.yarnpkg.com/object-treeify/-/object-treeify-1.1.33.tgz#f06fece986830a3cba78ddd32d4c11d1f76cdf40" - integrity sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A== - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== - dependencies: - isobject "^3.0.0" - -object.assign@^4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== +object.assign@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" + call-bind "^1.0.5" + define-properties "^1.2.1" has-symbols "^1.0.3" object-keys "^1.1.1" -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== +object.fromentries@^2.0.7: + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== dependencies: - isobject "^3.0.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" -object.values@^1.1.5, object.values@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" - integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== +object.groupby@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" + integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + +object.values@^1.1.7: + version "1.2.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" + integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +on-exit-leak-free@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz#fed195c9ebddb7d9e4c3842f93f281ac8dadd3b8" + integrity sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA== once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" @@ -4751,13 +3869,6 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ== - dependencies: - mimic-fn "^1.0.0" - onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" @@ -4765,35 +3876,17 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" -open@^7.0.0: - version "7.4.2" - resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" - integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== - dependencies: - is-docker "^2.0.0" - is-wsl "^2.1.1" - -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== +optionator@^0.9.3: + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" - word-wrap "^1.2.3" - -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== + word-wrap "^1.2.5" p-limit@^2.2.0: version "2.3.0" @@ -4845,6 +3938,11 @@ package-hash@^4.0.0: lodash.flattendeep "^4.4.0" release-zalgo "^1.0.0" +pako@~1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + param-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" @@ -4860,15 +3958,7 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -parse-json@^5.0.0: +parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== @@ -4878,11 +3968,6 @@ parse-json@^5.0.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" -parse-passwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" - integrity sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q== - pascal-case@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" @@ -4891,19 +3976,6 @@ pascal-case@^3.1.2: no-case "^3.0.4" tslib "^2.0.3" -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== - -password-prompt@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/password-prompt/-/password-prompt-1.1.2.tgz#85b2f93896c5bd9e9f2d6ff0627fa5af3dc00923" - integrity sha512-bpuBhROdrhuN3E7G/koAju0WjVw9/uQOG5Co5mokNj0MiOSBVZS1JTwM4zl55hu0WFmIEFvO9cU9sJQiBIYeIA== - dependencies: - ansi-escapes "^3.1.0" - cross-spawn "^6.0.5" - path-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/path-case/-/path-case-3.0.4.tgz#9168645334eb942658375c56f80b4c0cb5f82c6f" @@ -4922,11 +3994,6 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== - path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" @@ -4937,6 +4004,14 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-to-regexp@^1.7.0: version "1.8.0" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" @@ -4954,49 +4029,115 @@ pathval@^1.1.1: resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picocolors@^1.0.0, picocolors@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" + integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pkg-dir@^4.1.0, pkg-dir@^4.2.0: +picomatch@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-3.0.1.tgz#817033161def55ec9638567a2f3bbc876b3e7516" + integrity sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag== + +pino-abstract-transport@^1.0.0, pino-abstract-transport@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz#97f9f2631931e242da531b5c66d3079c12c9d1b5" + integrity sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q== + dependencies: + readable-stream "^4.0.0" + split2 "^4.0.0" + +pino-pretty@^10.3.1: + version "10.3.1" + resolved "https://registry.yarnpkg.com/pino-pretty/-/pino-pretty-10.3.1.tgz#e3285a5265211ac6c7cd5988f9e65bf3371a0ca9" + integrity sha512-az8JbIYeN/1iLj2t0jR9DV48/LQ3RC6hZPpapKPkb84Q+yTidMCpgWxIT3N0flnBDilyBQ1luWNpOeJptjdp/g== + dependencies: + colorette "^2.0.7" + dateformat "^4.6.3" + fast-copy "^3.0.0" + fast-safe-stringify "^2.1.1" + help-me "^5.0.0" + joycon "^3.1.1" + minimist "^1.2.6" + on-exit-leak-free "^2.1.0" + pino-abstract-transport "^1.0.0" + pump "^3.0.0" + readable-stream "^4.0.0" + secure-json-parse "^2.4.0" + sonic-boom "^3.0.0" + strip-json-comments "^3.1.1" + +pino-std-serializers@^6.0.0: + version "6.2.2" + resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz#d9a9b5f2b9a402486a5fc4db0a737570a860aab3" + integrity sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA== + +pino@^8.21.0: + version "8.21.0" + resolved "https://registry.yarnpkg.com/pino/-/pino-8.21.0.tgz#e1207f3675a2722940d62da79a7a55a98409f00d" + integrity sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q== + dependencies: + atomic-sleep "^1.0.0" + fast-redact "^3.1.1" + on-exit-leak-free "^2.1.0" + pino-abstract-transport "^1.2.0" + pino-std-serializers "^6.0.0" + process-warning "^3.0.0" + quick-format-unescaped "^4.0.3" + real-require "^0.2.0" + safe-stable-stringify "^2.3.1" + sonic-boom "^3.7.0" + thread-stream "^2.6.0" + +pkg-dir@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: find-up "^4.0.0" -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== +platform@^1.3.3: + version "1.3.6" + resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.6.tgz#48b4ce983164b209c2d45a107adb31f473a6e7a7" + integrity sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg== + +pluralize@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" + integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== + +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prettier@^2.7.1, prettier@^2.8.4: - version "2.8.4" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.4.tgz#34dd2595629bfbb79d344ac4a91ff948694463c3" - integrity sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw== +prettier@^2.8.8: + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== -pretty-quick@^3.1.0, pretty-quick@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/pretty-quick/-/pretty-quick-3.1.3.tgz#15281108c0ddf446675157ca40240099157b638e" - integrity sha512-kOCi2FJabvuh1as9enxYmrnBC6tVMoVOenMaBqRfsvBHB0cbpYHjdQEpSglpASDFEXVwplpcGR4CLEaisYAFcA== +pretty-quick@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/pretty-quick/-/pretty-quick-3.3.1.tgz#cfde97fec77a8d201a0e0c9c71d9990e12587ee2" + integrity sha512-3b36UXfYQ+IXXqex6mCca89jC8u0mYLqFAN5eTQKoXO6oCQYcIVYZEB/5AlBHI7JPYygReM2Vv6Vom/Gln7fBg== dependencies: - chalk "^3.0.0" - execa "^4.0.0" + execa "^4.1.0" find-up "^4.1.0" - ignore "^5.1.4" - mri "^1.1.5" - multimatch "^4.0.0" + ignore "^5.3.0" + mri "^1.2.0" + picocolors "^1.0.0" + picomatch "^3.0.1" + tslib "^2.6.2" process-nextick-args@~2.0.0: version "2.0.1" @@ -5010,6 +4151,16 @@ process-on-spawn@^1.0.0: dependencies: fromentries "^1.2.0" +process-warning@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-3.0.0.tgz#96e5b88884187a1dce6f5c3166d611132058710b" + integrity sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + proper-lockfile@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/proper-lockfile/-/proper-lockfile-4.1.2.tgz#c8b9de2af6b2f1601067f98e01ac66baa223141f" @@ -5033,39 +4184,25 @@ pump@^3.0.0: once "^1.3.1" punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -q@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -qqjs@^0.3.10: - version "0.3.11" - resolved "https://registry.yarnpkg.com/qqjs/-/qqjs-0.3.11.tgz#795b9f7d00807d75c391b1241b5be3077143d9ea" - integrity sha512-pB2X5AduTl78J+xRSxQiEmga1jQV0j43jOPs/MTgTLApGFEOn6NgdE2dEjp7nvDtjkIOZbvFIojAiYUx6ep3zg== - dependencies: - chalk "^2.4.1" - debug "^4.1.1" - execa "^0.10.0" - fs-extra "^6.0.1" - get-stream "^5.1.0" - glob "^7.1.2" - globby "^10.0.1" - http-call "^5.1.2" - load-json-file "^6.2.0" - pkg-dir "^4.2.0" - tar-fs "^2.0.0" - tmp "^0.1.0" - write-json-file "^4.1.1" +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +quick-format-unescaped@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" + integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== + quick-lru@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" @@ -5097,19 +4234,30 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== +readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.4.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" util-deprecate "^1.0.1" -readable-stream@^2.0.0, readable-stream@^2.0.5: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== +readable-stream@^4.0.0: + version "4.5.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.5.2.tgz#9e7fc4c45099baeed934bff6eb97ba6cf2729e09" + integrity sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g== + dependencies: + abort-controller "^3.0.0" + buffer "^6.0.3" + events "^3.3.0" + process "^0.11.10" + string_decoder "^1.3.0" + +readable-stream@~2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -5119,13 +4267,6 @@ readable-stream@^2.0.0, readable-stream@^2.0.5: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readdir-glob@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/readdir-glob/-/readdir-glob-1.1.2.tgz#b185789b8e6a43491635b6953295c5c5e3fd224c" - integrity sha512-6RLVvwJtVwEDfPdn6X6Ille4/lxGl0ATOY4FN/B9nxQcgOazvvI0nodiD19ScKq0PvA/29VpaOQML36o5IzZWA== - dependencies: - minimatch "^5.1.0" - readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -5133,6 +4274,11 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +real-require@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/real-require/-/real-require-0.2.0.tgz#209632dea1810be2ae063a6ac084fee7e33fba78" + integrity sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg== + rechoir@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" @@ -5146,46 +4292,29 @@ redent@^3.0.0: integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== dependencies: indent-string "^4.0.0" - strip-indent "^3.0.0" - -redeyed@~2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-2.1.1.tgz#8984b5815d99cb220469c99eeeffe38913e6cc0b" - integrity sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ== - dependencies: - esprima "~4.0.0" + strip-indent "^3.0.0" -regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4: - version "0.13.9" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" - integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== +regexp-tree@^0.1.27: + version "0.1.27" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.27.tgz#2198f0ef54518ffa743fe74d983b56ffd631b6cd" + integrity sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA== -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== +regexp.prototype.flags@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" + integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" + call-bind "^1.0.6" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.1" -regexp.prototype.flags@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" - integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== +regjsparser@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.10.0.tgz#b1ed26051736b436f22fdec1c8f72635f9f44892" + integrity sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" - -regexpp@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== - -regextras@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/regextras/-/regextras-0.8.0.tgz#ec0f99853d4912839321172f608b544814b02217" - integrity sha512-k519uI04Z3SaY0fLX843MRXnDeG2+vHOFsyhiPZvNLe7r8rD2YNRjq4BQLZZ0oAr2NrtvZlICsXysGNFPGa3CQ== + jsesc "~0.5.0" release-zalgo@^1.0.0: version "1.0.0" @@ -5194,16 +4323,6 @@ release-zalgo@^1.0.0: dependencies: es6-error "^4.0.1" -repeat-element@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" - integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -5219,13 +4338,10 @@ require-main-filename@^2.0.0: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== -resolve-dir@^1.0.0, resolve-dir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" - integrity sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg== - dependencies: - expand-tilde "^2.0.0" - global-modules "^1.0.0" +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== resolve-from@5.0.0, resolve-from@^5.0.0: version "5.0.0" @@ -5244,41 +4360,15 @@ resolve-global@1.0.0, resolve-global@^1.0.0: dependencies: global-dirs "^0.1.1" -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== - -resolve@>=1.9.0, resolve@^1.1.6, resolve@^1.10.0, resolve@^1.22.0, resolve@^1.22.1: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== +resolve@^1.1.6, resolve@^1.10.0, resolve@^1.22.2, resolve@^1.22.4: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== dependencies: - is-core-module "^2.9.0" + is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q== - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - retry@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" @@ -5289,18 +4379,6 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -right-pad@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/right-pad/-/right-pad-1.0.1.tgz#8ca08c2cbb5b55e74dafa96bf7fd1a27d568c8d0" - integrity sha512-bYBjgxmkvTAfgIYy328fmkwhp39v8lwVgWhhrzxPV3yHtcSqyYKe9/XOhvW48UFjATg3VuJbpsp5822ACNvkmw== - -rimraf@^2.6.3: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -5308,18 +4386,6 @@ rimraf@^3.0.0, rimraf@^3.0.2: dependencies: glob "^7.1.3" -rimraf@~2.4.0: - version "2.4.5" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.4.5.tgz#ee710ce5d93a8fdb856fb5ea8ff0e2d75934b2da" - integrity sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ== - dependencies: - glob "^6.0.1" - -run-async@^2.2.0, run-async@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== - run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -5327,12 +4393,15 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rxjs@^6.1.0, rxjs@^6.6.0: - version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== +safe-array-concat@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" + integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== dependencies: - tslib "^1.9.0" + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + has-symbols "^1.0.3" + isarray "^2.0.5" safe-buffer@*, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: version "5.2.1" @@ -5344,31 +4413,19 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-json-stringify@~1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz#356e44bc98f1f93ce45df14bcd7c01cda86e0afd" - integrity sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg== - -safe-regex-test@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== +safe-regex-test@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" + call-bind "^1.0.6" + es-errors "^1.3.0" is-regex "^1.1.4" -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +safe-stable-stringify@^2.3.1: + version "2.4.3" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" + integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== samsam@1.3.0: version "1.3.0" @@ -5376,26 +4433,36 @@ samsam@1.3.0: integrity sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg== sax@>=0.6.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + version "1.4.1" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.4.1.tgz#44cc8988377f126304d3b3fc1010c733b929ef0f" + integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg== + +secure-json-parse@^2.4.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/secure-json-parse/-/secure-json-parse-2.7.0.tgz#5a5f9cd6ae47df23dba3151edd06855d47e09862" + integrity sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw== -"semver@2 || 3 || 4 || 5", semver@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== +"semver@2 || 3 || 4 || 5": + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@7.3.8, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== +semver@7.5.4: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" -semver@^6.0.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.4, semver@^7.5.3, semver@^7.5.4, semver@^7.6.2: + version "7.6.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" + integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== sentence-case@^3.0.4: version "3.0.4" @@ -5418,27 +4485,42 @@ serialize-javascript@6.0.0: dependencies: randombytes "^2.1.0" +server-destroy@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/server-destroy/-/server-destroy-1.0.1.tgz#f13bf928e42b9c3e79383e61cc3998b5d14e6cdd" + integrity sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ== + set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== +set-function-name@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== dependencies: - shebang-regex "^1.0.0" + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== shebang-command@^2.0.0: version "2.0.0" @@ -5447,26 +4529,12 @@ shebang-command@^2.0.0: dependencies: shebang-regex "^3.0.0" -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== - shebang-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shelljs@0.7.6: - version "0.7.6" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.6.tgz#379cccfb56b91c8601e4793356eb5382924de9ad" - integrity sha512-sK/rjl+frweS4RL1ifxTb7eIXQaliSCDN5meqwwfDIHSWU7zH2KPTa/2hS6EAgGw7wHzJ3rQHfhnLzktfagSZA== - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - -shelljs@0.8.5, shelljs@^0.8.5, shelljs@~0.8.4: +shelljs@^0.8.5: version "0.8.5" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== @@ -5475,37 +4543,36 @@ shelljs@0.8.5, shelljs@^0.8.5, shelljs@~0.8.4: interpret "^1.0.0" rechoir "^0.6.2" -shiki@^0.11.1: - version "0.11.1" - resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.11.1.tgz#df0f719e7ab592c484d8b73ec10e215a503ab8cc" - integrity sha512-EugY9VASFuDqOexOgXR18ZV+TbFrQHeCpEYaXamO+SZlsnT/2LxuLBX25GGtIrwaEVFXUAbUQ601SWE2rMwWHA== - dependencies: - jsonc-parser "^3.0.0" - vscode-oniguruma "^1.6.1" - vscode-textmate "^6.0.0" - -shx@^0.3.3: - version "0.3.4" - resolved "https://registry.yarnpkg.com/shx/-/shx-0.3.4.tgz#74289230b4b663979167f94e1935901406e40f02" - integrity sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g== +shiki@^0.14.7: + version "0.14.7" + resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.14.7.tgz#c3c9e1853e9737845f1d2ef81b31bcfb07056d4e" + integrity sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg== dependencies: - minimist "^1.2.3" - shelljs "^0.8.5" + ansi-sequence-parser "^1.1.0" + jsonc-parser "^3.2.0" + vscode-oniguruma "^1.7.0" + vscode-textmate "^8.0.0" side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" -signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: +signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + sinon@10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/sinon/-/sinon-10.0.0.tgz#52279f97e35646ff73d23207d0307977c9b81430" @@ -5518,18 +4585,6 @@ sinon@10.0.0: nise "^4.1.0" supports-color "^7.1.0" -sinon@^14.0.2: - version "14.0.2" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-14.0.2.tgz#585a81a3c7b22cf950762ac4e7c28eb8b151c46f" - integrity sha512-PDpV0ZI3ZCS3pEqx0vpNp6kzPhHrLx72wA0G+ZLaaJjLIYeE0n8INlgaohKuGy7hP0as5tbUd23QWu5U233t+w== - dependencies: - "@sinonjs/commons" "^2.0.0" - "@sinonjs/fake-timers" "^9.1.2" - "@sinonjs/samsam" "^7.0.1" - diff "^5.0.0" - nise "^5.1.2" - supports-color "^7.2.0" - sinon@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/sinon/-/sinon-5.1.1.tgz#19c59810ffb733ea6e76a28b94a71fc4c2f523b8" @@ -5556,55 +4611,14 @@ snake-case@^3.0.4: dot-case "^3.0.4" tslib "^2.0.3" -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -sort-keys@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-4.2.0.tgz#6b7638cee42c506fff8c1cecde7376d21315be18" - integrity sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg== - dependencies: - is-plain-obj "^2.0.0" - -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== +sonic-boom@^3.0.0, sonic-boom@^3.7.0: + version "3.8.1" + resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-3.8.1.tgz#d5ba8c4e26d6176c9a1d14d549d9ff579a163422" + integrity sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg== dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" + atomic-sleep "^1.0.0" -source-map-support@~0.5.19: +source-map-support@^0.5.21: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -5612,16 +4626,6 @@ source-map-support@~0.5.19: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-url@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" - integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== - -source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== - source-map@^0.6.0, source-map@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" @@ -5640,19 +4644,19 @@ spawn-wrap@^2.0.0: which "^2.0.1" spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + version "3.2.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + version "2.5.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" + integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== -spdx-expression-parse@^3.0.0, spdx-expression-parse@^3.0.1: +spdx-expression-parse@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== @@ -5660,47 +4664,51 @@ spdx-expression-parse@^3.0.0, spdx-expression-parse@^3.0.1: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" -spdx-license-ids@^3.0.0: - version "3.0.11" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" - integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== +spdx-expression-parse@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz#a23af9f3132115465dac215c099303e4ceac5794" + integrity sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ== dependencies: - extend-shallow "^3.0.0" + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" -split2@^3.0.0: +spdx-license-ids@^3.0.0: + version "3.0.18" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz#22aa922dcf2f2885a6494a261f2d8b75345d0326" + integrity sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ== + +split2@^3.0.0, split2@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== dependencies: readable-stream "^3.0.0" +split2@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" + integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" +srcset@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/srcset/-/srcset-5.0.1.tgz#e660a728f195419e4afa95121099bc9efb7a1e36" + integrity sha512-/P1UYbGfJVlxZag7aABNRrulEXAwCSDo7fklafOQrantuPTDmYgijJMks2zusPCVzgW9+4P69mq7w6pYuZpgxw== -string-width@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -5709,25 +4717,44 @@ string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2 is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string.prototype.trimend@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" - integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" -string.prototype.trimstart@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" - integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== +string.prototype.trim@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" + integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-object-atoms "^1.0.0" + +string.prototype.trimend@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" + integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" -string_decoder@^1.1.1: +string_decoder@^1.1.1, string_decoder@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== @@ -5741,12 +4768,12 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: - ansi-regex "^3.0.0" + ansi-regex "^5.0.1" strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" @@ -5755,7 +4782,14 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-bom@3.0.0, strip-bom@^3.0.0: +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== @@ -5765,11 +4799,6 @@ strip-bom@^4.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== - strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" @@ -5782,17 +4811,12 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" -strip-json-comments@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== - -strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: +strip-json-comments@3.1.1, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -supports-color@8.1.1, supports-color@^8.1.0: +supports-color@8.1.1: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== @@ -5806,47 +4830,18 @@ supports-color@^5.3.0, supports-color@^5.4.0: dependencies: has-flag "^3.0.0" -supports-color@^7.0.0, supports-color@^7.1.0, supports-color@^7.2.0: +supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" -supports-hyperlinks@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" - integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== - dependencies: - has-flag "^4.0.0" - supports-color "^7.0.0" - supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -tar-fs@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" - integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== - dependencies: - chownr "^1.1.1" - mkdirp-classic "^0.5.2" - pump "^3.0.0" - tar-stream "^2.1.4" - -tar-stream@^2.1.4, tar-stream@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" - integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== - dependencies: - bl "^4.0.3" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" - test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" @@ -5866,6 +4861,13 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== +thread-stream@^2.6.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/thread-stream/-/thread-stream-2.7.0.tgz#d8a8e1b3fd538a6cca8ce69dbe5d3d097b601e11" + integrity sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw== + dependencies: + real-require "^0.2.0" + through2@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" @@ -5873,45 +4875,16 @@ through2@^4.0.0: dependencies: readable-stream "3" -"through@>=2.2.7 <3", through@^2.3.6: +"through@>=2.2.7 <3": version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -tmp@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.1.0.tgz#ee434a4e22543082e294ba6201dcc6eafefa2877" - integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw== - dependencies: - rimraf "^2.6.3" - to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -5919,24 +4892,15 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - tough-cookie@*: - version "4.0.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" - integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== + version "4.1.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" + integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== dependencies: psl "^1.1.33" punycode "^2.1.1" - universalify "^0.1.2" + universalify "^0.2.0" + url-parse "^1.5.3" tr46@~0.0.3: version "0.0.3" @@ -5948,10 +4912,15 @@ trim-newlines@^3.0.0: resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== -ts-node@^10.0.0, ts-node@^10.4.0, ts-node@^10.8.1: - version "10.9.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" - integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== +ts-api-utils@^1.0.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" + integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== + +ts-node@^10.8.1, ts-node@^10.9.2: + version "10.9.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== dependencies: "@cspotcode/source-map-support" "^0.8.0" "@tsconfig/node10" "^1.0.7" @@ -5967,46 +4936,39 @@ ts-node@^10.0.0, ts-node@^10.4.0, ts-node@^10.8.1: v8-compile-cache-lib "^3.0.1" yn "3.1.1" -ts-retry-promise@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/ts-retry-promise/-/ts-retry-promise-0.7.0.tgz#08f2dcbbf5d2981495841cb63389a268324e8147" - integrity sha512-x6yWZXC4BfXy4UyMweOFvbS1yJ/Y5biSz/mEPiILtJZLrqD3ZxIpzVOGGgifHHdaSe3WxzFRtsRbychI6zofOg== +ts-patch@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ts-patch/-/ts-patch-3.2.0.tgz#537b0e19aa273da4a34e42be68240ef062646dd3" + integrity sha512-fUGMkjGIlD4BFibDM+6pLYLXRguzCUY6fhP1KQzSnFJfAtTDT7DKyX0yHn3CJqfBv4mia/o3ZRte31UVf9Dl1A== + dependencies: + chalk "^4.1.2" + global-prefix "^3.0.0" + minimist "^1.2.8" + resolve "^1.22.2" + semver "^7.5.4" + strip-ansi "^6.0.1" -tsconfig-paths@^3.14.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" - integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== +ts-retry-promise@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/ts-retry-promise/-/ts-retry-promise-0.8.1.tgz#ba90eb07cb03677fcbf78fe38e94c9183927e154" + integrity sha512-+AHPUmAhr5bSRRK5CurE9kNH8gZlEHnCgusZ0zy2bjfatUBDX0h6vGQjiT0YrGwSDwRZmU+bapeX6mj55FOPvg== + +tsconfig-paths@^3.15.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== dependencies: "@types/json5" "^0.0.29" - json5 "^1.0.1" + json5 "^1.0.2" minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^1.8.1, tslib@^1.9.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.0.0, tslib@^2.0.3, tslib@^2.3.1, tslib@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" - integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== - -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - -ttypescript@^1.5.15: - version "1.5.15" - resolved "https://registry.yarnpkg.com/ttypescript/-/ttypescript-1.5.15.tgz#e45550ad69289d06d3bc3fd4a3c87e7c1ef3eba7" - integrity sha512-48ykDNHzFnPMnv4hYX1P8Q84TvCZyL1QlFxeuxsuZ48X2+ameBgPenvmCkHJtoOSxpoWTWi8NcgNrRnVDOmfSg== - dependencies: - resolve ">=1.9.0" +tslib@^2.0.3, tslib@^2.6.1, tslib@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== -tunnel-agent@*, tunnel-agent@^0.6.0: +tunnel-agent@*: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== @@ -6020,7 +4982,7 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8: +type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== @@ -6035,11 +4997,6 @@ type-fest@^0.20.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - type-fest@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" @@ -6050,14 +5007,49 @@ type-fest@^0.8.0, type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -typed-array-length@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" - integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== +typed-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" + integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.7" + es-errors "^1.3.0" + is-typed-array "^1.1.13" + +typed-array-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" + integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-byte-offset@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" + integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-length@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" + integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== + dependencies: + call-bind "^1.0.7" for-each "^0.3.3" - is-typed-array "^1.1.9" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" typedarray-to-buffer@^3.1.5: version "3.1.5" @@ -6071,20 +5063,20 @@ typedoc-plugin-missing-exports@0.23.0: resolved "https://registry.yarnpkg.com/typedoc-plugin-missing-exports/-/typedoc-plugin-missing-exports-0.23.0.tgz#076df6ffce4d84e8097be009b7c62a17d58477a5" integrity sha512-9smahDSsFRno9ZwoEshQDuIYMHWGB1E6LUud5qMxR2wNZ0T4DlZz0QjoK3HzXtX34mUpTH0dYtt7NQUK4D6B6Q== -typedoc@0.23.16: - version "0.23.16" - resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.23.16.tgz#09881ada725c2190ac5d3bb0edadcc5bfeda4bfe" - integrity sha512-rumYsCeNRXlyuZVzefD7050n7ptL2uudsCJg50dY0v/stKniqIlRpvx/F/6expC0/Q6Dbab+g/JpZuB7Sw90FA== +typedoc@^0.25.12: + version "0.25.13" + resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.25.13.tgz#9a98819e3b2d155a6d78589b46fa4c03768f0922" + integrity sha512-pQqiwiJ+Z4pigfOnnysObszLiU3mVLWAExSPf+Mu06G/qsc3wzbuM56SZQvONhHLncLUhYzOVkjFFpFfL5AzhQ== dependencies: lunr "^2.3.9" - marked "^4.0.19" - minimatch "^5.1.0" - shiki "^0.11.1" + marked "^4.3.0" + minimatch "^9.0.3" + shiki "^0.14.7" -typescript@^4.1.3, typescript@^4.6.4, typescript@^4.9.5: - version "4.9.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" - integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== +"typescript@^4.6.4 || ^5.2.2", typescript@^5.4.3, typescript@^5.4.5: + version "5.4.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" + integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== unbox-primitive@^1.0.2: version "1.0.2" @@ -6096,41 +5088,33 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== -universalify@^0.1.0, universalify@^0.1.2: +universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== -update-browserslist-db@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.4.tgz#dbfc5a789caa26b1db8990796c2c8ebbce304824" - integrity sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA== +update-browserslist-db@^1.0.13: + version "1.0.16" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz#f6d489ed90fb2f07d67784eb3f53d7891f736356" + integrity sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ== dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" + escalade "^3.1.2" + picocolors "^1.0.1" upper-case-first@^2.0.2: version "2.0.2" @@ -6153,15 +5137,13 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" @@ -6173,6 +5155,11 @@ uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +uuid@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== + v8-compile-cache-lib@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" @@ -6186,15 +5173,15 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -vscode-oniguruma@^1.6.1: - version "1.6.2" - resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.6.2.tgz#aeb9771a2f1dbfc9083c8a7fdd9cccaa3f386607" - integrity sha512-KH8+KKov5eS/9WhofZR8M8dMHWN2gTxjMsG4jd04YhpbPR91fUj7rYQ2/XjeHCJWbg7X++ApRIU9NUwM2vTvLA== +vscode-oniguruma@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz#439bfad8fe71abd7798338d1cd3dc53a8beea94b" + integrity sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA== -vscode-textmate@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-6.0.0.tgz#a3777197235036814ac9a92451492f2748589210" - integrity sha512-gu73tuZfJgu+mvCSy4UZwd2JXykjK9zAZsfmDeut5dx/1a7FeTk0XwJsSuqQn+cuMCGVbIBfl+s53X4T19DnzQ== +vscode-textmate@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-8.0.0.tgz#2c7a3b1163ef0441097e0b5d6389cd5504b59e5d" + integrity sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg== webidl-conversions@^3.0.0: version "3.0.1" @@ -6235,47 +5222,39 @@ which-boxed-primitive@^1.0.2: is-symbol "^1.0.3" which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== + version "2.0.1" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== -which-typed-array@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" - integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== +which-typed-array@^1.1.14, which-typed-array@^1.1.15: + version "1.1.15" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" for-each "^0.3.3" gopd "^1.0.1" - has-tostringtag "^1.0.0" - is-typed-array "^1.1.10" - -which@2.0.2, which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" + has-tostringtag "^1.0.2" -which@^1.2.14, which@^1.2.9: +which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" -widest-line@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" - integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: - string-width "^4.0.0" + isexe "^2.0.0" -wireit@^0.9.3: - version "0.9.3" - resolved "https://registry.yarnpkg.com/wireit/-/wireit-0.9.3.tgz#2508f77418d73a632d0653a0dd3275c1808f3f98" - integrity sha512-o31NkFrr+AjGNgarZB094Tw6xWcmNn1uts672B1qKzSo2XMFBt5abjtg/SBUNlBcQPtPryEXJkIUQ6i9p+1Y9w== +wireit@^0.14.4: + version "0.14.4" + resolved "https://registry.yarnpkg.com/wireit/-/wireit-0.14.4.tgz#4c8913a4a74cb15b5381c4b8276c5d71c27f54c5" + integrity sha512-WNAXEw2cJs1nSRNJNRcPypARZNumgtsRTJFTNpd6turCA6JZ6cEwl4ZU3C1IHc/3IaXoPu9LdxcI5TBTdD6/pg== dependencies: braces "^3.0.2" chokidar "^3.5.3" @@ -6283,15 +5262,24 @@ wireit@^0.9.3: jsonc-parser "^3.0.0" proper-lockfile "^4.1.2" -word-wrap@^1.0.3, word-wrap@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== -workerpool@6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b" - integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A== +workerpool@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" + integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" wrap-ansi@^6.2.0: version "6.2.0" @@ -6311,6 +5299,15 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -6326,22 +5323,10 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -write-json-file@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-4.3.0.tgz#908493d6fd23225344af324016e4ca8f702dd12d" - integrity sha512-PxiShnxf0IlnQuMYOPPhPkhExoCQuTUNPOa/2JWCYTmBquU9njyyDuwRKN26IZBlp4yn1nt+Agh2HOOBl+55HQ== - dependencies: - detect-indent "^6.0.0" - graceful-fs "^4.1.15" - is-plain-obj "^2.0.0" - make-dir "^3.0.0" - sort-keys "^4.0.0" - write-file-atomic "^3.0.0" - -xml2js@^0.4.22: - version "0.4.23" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" - integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== +xml2js@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.6.2.tgz#dd0b630083aa09c161e25a4d0901e2b2a929b499" + integrity sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA== dependencies: sax ">=0.6.0" xmlbuilder "~11.0.0" @@ -6366,16 +5351,16 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@^1.10.0: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - yargs-parser@20.2.4: version "20.2.4" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" @@ -6394,10 +5379,10 @@ yargs-parser@^20.2.2, yargs-parser@^20.2.3: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== -yargs-parser@^21.0.0: - version "21.0.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.1.tgz#0267f286c877a4f0f728fceb6f8a3e4cb95c6e35" - integrity sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg== +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== yargs-unparser@2.0.0: version "2.0.0" @@ -6440,17 +5425,17 @@ yargs@^15.0.2: yargs-parser "^18.1.2" yargs@^17.0.0: - version "17.5.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.5.1.tgz#e109900cab6fcb7fd44b1d8249166feb0b36e58e" - integrity sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA== + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: - cliui "^7.0.2" + cliui "^8.0.1" escalade "^3.1.1" get-caller-file "^2.0.5" require-directory "^2.1.1" string-width "^4.2.3" y18n "^5.0.5" - yargs-parser "^21.0.0" + yargs-parser "^21.1.1" yn@3.1.1: version "3.1.1" @@ -6461,12 +5446,3 @@ yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -zip-stream@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-4.1.0.tgz#51dd326571544e36aa3f756430b313576dc8fc79" - integrity sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A== - dependencies: - archiver-utils "^2.1.0" - compress-commons "^4.1.0" - readable-stream "^3.6.0"