From d9f049140baa5415d4a166d833162600e8930c7b Mon Sep 17 00:00:00 2001 From: Luke Watts Date: Mon, 11 Mar 2024 16:55:42 +0100 Subject: [PATCH 01/58] chore(ci): switch to small go image (#5099) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore(ci): switch to small go image Context: p95 duration for this job over the last 90 days is 2m 17s Solution: Switch from 2.3Gb image to generic 513mb image. Fetching the `bastiandoetsch209/cli-build` image can increase the Job time by ~60 seconds if the image is not cached. ``` Warning: No authentication provided, using CircleCI credentials for pulls from Docker Hub. image cache not found on this host, downloading bastiandoetsch209/cli-build:20240214-145818 … bastiandoetsch209/cli-build:20240214-145818: using image bastiandoetsch209/cli-build@sha256:1504fdbb34f02aab15475c3eacf8c0fc82be83059cda435b91327e43a98cb863 pull stats: download 2.279GiB in 23.682s (98.54MiB/s), extract 2.31GiB in 58.549s (40.39MiB/s) ``` Even pipelines run within minutes of each other do not necessarily hit the same image cache. The caching layer at use here is entirely opaque to me, but the observed affects are that the `Spin up environment` step can take either 0 or 60 seconds. Switching to one of the Circle CI provided images which also tend to be smaller could help here. Perhaps the inscrutable image caching is more likely to be optimised for their own images. * chore(ci): removes unused dep to speed up feedback cycle i The test-go job has dependency on the artifacts generated as part of the prepare-build job. Running this asap to reduce time to results. --- .circleci/config.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 25406c5937..90905cb26f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -40,6 +40,10 @@ executors: docker: - image: ubuntu:latest resource_class: small + circle-go: + docker: + - image: cimg/go:1.20 + resource_class: medium+ docker-amd64: docker: - image: bastiandoetsch209/cli-build:20240214-145818 @@ -399,7 +403,7 @@ workflows: - nodejs-install - team_hammerhead-cli requires: - - prepare-build + - secrets-scan filters: branches: ignore: main @@ -911,7 +915,7 @@ jobs: path: test/reports test-go: - executor: docker-amd64 + executor: circle-go steps: - prepare-workspace - run: From 198162867a8ac681dc20db36ff2cf414d0bc6d3d Mon Sep 17 00:00:00 2001 From: Luke Watts Date: Tue, 12 Mar 2024 12:53:49 +0100 Subject: [PATCH 02/58] test: explicitly state project version (#5108) As of Composer v2.7.2 the tool will emit an error if the version has not been defined on the root composer.json https://github.com/composer/composer/releases/tag/2.7.2 --- test/acceptance/workspaces/composer-app/composer.json | 1 + 1 file changed, 1 insertion(+) diff --git a/test/acceptance/workspaces/composer-app/composer.json b/test/acceptance/workspaces/composer-app/composer.json index 614971538b..15f3daa1ea 100644 --- a/test/acceptance/workspaces/composer-app/composer.json +++ b/test/acceptance/workspaces/composer-app/composer.json @@ -1,6 +1,7 @@ { "name" : "vulnerable/project", "description" : "A sample vulnerable project", + "version": "1.0.0", "require" : { "php" : ">=5.3.2", "symfony/symfony": "2.3.1", From f7eb5b4ecf0d5d8376563ec1e3e5b84e27986408 Mon Sep 17 00:00:00 2001 From: Luke Watts Date: Tue, 12 Mar 2024 14:26:20 +0100 Subject: [PATCH 03/58] chore: introduce script to help create release (#5107) --- release-scripts/prepare-release.sh | 50 ++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100755 release-scripts/prepare-release.sh diff --git a/release-scripts/prepare-release.sh b/release-scripts/prepare-release.sh new file mode 100755 index 0000000000..6a31b654fa --- /dev/null +++ b/release-scripts/prepare-release.sh @@ -0,0 +1,50 @@ +#!/usr/bin/env bash +set -euo pipefail + +# This script automates the process of updating the `release-candidate` +# branch with changes from the default branch, generating release notes, +# and creating a pull request for review. + +RC_BRANCH="release-candidate" +DEFAULT_BRANCH="main" +TMP_BRANCH=tmp/$(date +%s)-$RC_BRANCH + +# Update Release Candidate branch +git checkout -b $TMP_BRANCH origin/$RC_BRANCH +git pull + +# Check if release candidate is behind default branch, merge default branch into release candidate +if git rev-list --left-right --count $DEFAULT_BRANCH...$RC_BRANCH | awk '{print $1}' | grep -q '[1-9]'; then + git merge --quiet -m "chore: merge $DEFAULT_BRANCH into $RC_BRANCH $(date)" --no-edit --no-ff $DEFAULT_BRANCH + if [ $? -ne 0 ]; then + echo "Merge conflict occurred. Please resolve conflicts and try again." + exit 1 + fi +fi + + +echo "Generating release notes…" + +# Delete existing release notes +if [ -f binary-releases/RELEASE_NOTES.md ]; then + rm binary-releases/RELEASE_NOTES.md +fi + +# Generate the release notes baseline from the commits +make binary-releases/RELEASE_NOTES.md + +# Commit and push the release notes +git add -f binary-releases/RELEASE_NOTES.md +git commit -m "docs: update release notes" + +if command -v gh >/dev/null 2>&1; then + # Use the GitHub CLI to create a pull request + # https://cli.github.com/manual/gh_pr_create + gh pr create --repo snyk/cli --base $RC_BRANCH --title "chore: Update release candidate" --body "Release Candidate" --draft +else + echo "gh cli not installed, unable to create the PR automatically.\n" + echo "Please create a PR from $TMP_BRANCH to $RC_BRANCH manually." + git push origin $TMP_BRANCH + exit 1 +fi + From aaa107427ac51dbd37c65a7e2e000f792685e114 Mon Sep 17 00:00:00 2001 From: Luke Watts Date: Tue, 12 Mar 2024 17:44:21 +0100 Subject: [PATCH 04/58] chore(ci): experiments in parallelism (#5097) Windows is the slowest test run, a problem made worse by the time consuming build process that runs before it. Perhaps a short term workaround until we have time to optimise the build step is to increase the number of shards. --- .circleci/config.yml | 7 ++++++- package.json | 2 +- test/jest/acceptance/analytics.spec.ts | 12 ++++++------ 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 90905cb26f..0e660aa51a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -585,6 +585,7 @@ workflows: test_snyk_command: binary-releases\\snyk-win.exe install_deps_extension: windows-full dont_skip_tests: 0 + shards: 4 pre_test_cmds: Import-Module $env:ChocolateyInstall\helpers\chocolateyProfile.psm1; RefreshEnv - sign: @@ -1028,7 +1029,11 @@ jobs: pre_test_cmds: type: string default: 'echo Running tests' + shards: + type: integer + default: 3 executor: << parameters.executor >> + parallelism: << parameters.shards >> steps: - prepare-workspace - install-deps-<< parameters.install_deps_extension >> @@ -1039,7 +1044,7 @@ jobs: no_output_timeout: 30m command: | << parameters.pre_test_cmds >> - npm run test:acceptance -- --selectProjects coreCli + npm run test:acceptance -- --selectProjects coreCli --shard=$(expr $CIRCLE_NODE_INDEX + 1)/<< parameters.shards >> environment: TEST_SNYK_FIPS: << parameters.fips >> TEST_SNYK_COMMAND: << parameters.test_snyk_command >> diff --git a/package.json b/package.json index 5084db0288..16a3ad5c0b 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "watch": "npm run build-cli:dev -- --watch", "test": "npm run test:unit && npm run test:acceptance && npm run test:tap", "test:unit": "jest --runInBand --testPathPattern '/test(/jest)?/unit/' --reporters=jest-junit", - "test:acceptance": "jest --runInBand --testPathPattern \"/test(/jest)?/acceptance/\" --reporters=jest-junit", + "test:acceptance": "jest --maxWorkers=1 --testPathPattern \"/test(/jest)?/acceptance/\" --reporters=jest-junit", "test:tap": "tap -Rspec --timeout=300 test/tap/*.test.* ", "test:smoke": "./scripts/run-smoke-tests-locally.sh", "dev": "ts-node ./src/cli/index.ts" diff --git a/test/jest/acceptance/analytics.spec.ts b/test/jest/acceptance/analytics.spec.ts index 83f76bcbbd..bea458da2a 100644 --- a/test/jest/acceptance/analytics.spec.ts +++ b/test/jest/acceptance/analytics.spec.ts @@ -10,9 +10,9 @@ jest.setTimeout(1000 * 30); describe('analytics module', () => { let server; let env: Record; + const port = process.env.PORT || process.env.SNYK_PORT || '12345'; beforeAll((done) => { - const port = process.env.PORT || process.env.SNYK_PORT || '12345'; const baseApi = '/api/v1'; env = { ...process.env, @@ -58,7 +58,7 @@ describe('analytics module', () => { expect(lastRequest).toMatchObject({ headers: { - host: 'localhost:12345', + host: `localhost:${port}`, accept: 'application/json', authorization: 'token 123456789', 'content-type': 'application/json; charset=utf-8', @@ -132,7 +132,7 @@ describe('analytics module', () => { const lastRequest = requests.pop(); expect(lastRequest).toMatchObject({ headers: { - host: 'localhost:12345', + host: `localhost:${port}`, accept: 'application/json', authorization: 'token 123456789', 'content-type': 'application/json; charset=utf-8', @@ -210,7 +210,7 @@ describe('analytics module', () => { const lastRequest = requests.pop(); expect(lastRequest).toMatchObject({ headers: { - host: 'localhost:12345', + host: `localhost:${port}`, accept: 'application/json', authorization: 'token 123456789', 'content-type': 'application/json; charset=utf-8', @@ -355,7 +355,7 @@ describe('analytics module', () => { const lastRequest = requests.pop(); expect(lastRequest).toMatchObject({ headers: { - host: 'localhost:12345', + host: `localhost:${port}`, accept: 'application/json', authorization: 'token 123456789', 'content-type': 'application/json; charset=utf-8', @@ -407,7 +407,7 @@ describe('analytics module', () => { const lastRequest = server.popRequest(); expect(lastRequest).toMatchObject({ headers: { - host: 'localhost:12345', + host: `localhost:${port}`, 'content-length': expect.any(String), authorization: 'token 123456789', 'content-type': 'application/json; charset=utf-8', From 0cb4c267d26a9208c2b592f8f7c8e4f58b5230a3 Mon Sep 17 00:00:00 2001 From: Luke Watts Date: Tue, 12 Mar 2024 20:44:09 +0100 Subject: [PATCH 05/58] chore: enforce pr title formatting (#5111) * fix: validate PR title * chore: introduce linting for GitHub PR titles * chore: update node for danger job * chore: attempt at tracking edits to PRs --- .github/workflows/danger-zone.yml | 3 ++- dangerfile.js | 34 +++++++++++++++++++++---------- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/.github/workflows/danger-zone.yml b/.github/workflows/danger-zone.yml index 37c35e7cf0..b9f1598d3d 100644 --- a/.github/workflows/danger-zone.yml +++ b/.github/workflows/danger-zone.yml @@ -1,6 +1,7 @@ name: 'Danger Zone' on: pull_request: + types: [opened, synchronize, reopened, edited] branches: [master, main] jobs: @@ -11,7 +12,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 with: - node-version: '16.16.0' + node-version: '18.19.1' cache: 'npm' - run: npm ci - run: npx danger ci diff --git a/dangerfile.js b/dangerfile.js index 593971df78..acca800f56 100644 --- a/dangerfile.js +++ b/dangerfile.js @@ -3,24 +3,36 @@ const fs = require('fs'); const MAX_COMMIT_MESSAGE_LENGTH = 72; +function checkCommitMessage(commitMessage, url) { + const firstLineRegex = /^(feat|fix|chore|test|docs|refactor|revert)(\([a-z0-9]+\))?:(.+)$/; + if (!firstLineRegex.test(commitMessage)) { + fail( + `"[${commitMessage}](${url})" is not using a valid commit message format. For commit guidelines, see: [CONTRIBUTING](https://github.com/snyk/snyk/blob/main/CONTRIBUTING.md#creating-commits).`, + ); + } + + if (commitMessage.length >= MAX_COMMIT_MESSAGE_LENGTH) { + warn( + `"[${commitMessage}](${url})" is too long. Keep the first line of your commit message under ${MAX_COMMIT_MESSAGE_LENGTH} characters.`, + ); + } +} + if (danger.github && danger.github.pr) { const ghCommits = danger.github.commits; for (const { commit } of ghCommits) { const { message, url } = commit; const [firstLine] = message.split('\n', 1); - const firstLineRegex = /^(feat|fix|chore|test|docs|refactor|revert)(\([a-z0-9]+\))?:(.+)$/; - if (!firstLineRegex.test(firstLine)) { - fail( - `"[${firstLine}](${url})" is not using a valid commit message format. For commit guidelines, see: [CONTRIBUTING](https://github.com/snyk/snyk/blob/main/CONTRIBUTING.md#creating-commits).`, - ); - } + checkCommitMessage(firstLine, url); + } - if (firstLine.length >= MAX_COMMIT_MESSAGE_LENGTH) { - warn( - `"[${firstLine}](${url})" is too long. Keep the first line of your commit message under ${MAX_COMMIT_MESSAGE_LENGTH} characters.`, - ); - } + if (ghCommits.length > 1) { + // If there is more than one commit in the PR when merging, + // the squash commit will be generated from the PR title + const prTitle = danger.github.pr.title; + + checkCommitMessage(prTitle, danger.github.pr.html_url); } // Forgotten tests check From bd6351aa33369407d22835460d6e2c0128f13cb4 Mon Sep 17 00:00:00 2001 From: MarcusArdelean <150140904+MarcusArdelean@users.noreply.github.com> Date: Wed, 13 Mar 2024 09:54:45 +0200 Subject: [PATCH 06/58] fix: fix add support for dev/alpha/beta/rc python versions (#5106) * fix: add support for development python versions * test: explicitly state project version (#5108) As of Composer v2.7.2 the tool will emit an error if the version has not been defined on the root composer.json https://github.com/composer/composer/releases/tag/2.7.2 * chore: introduce script to help create release (#5107) --------- Co-authored-by: Luke Watts --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6e128b1d98..2e52b92218 100644 --- a/package-lock.json +++ b/package-lock.json @@ -77,7 +77,7 @@ "snyk-nuget-plugin": "2.4.1", "snyk-php-plugin": "1.9.2", "snyk-policy": "^1.25.0", - "snyk-python-plugin": "2.1.0", + "snyk-python-plugin": "2.1.1", "snyk-resolve-deps": "4.7.3", "snyk-sbt-plugin": "2.17.1", "snyk-swiftpm-plugin": "1.4.1", @@ -21636,9 +21636,9 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/snyk-python-plugin": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/snyk-python-plugin/-/snyk-python-plugin-2.1.0.tgz", - "integrity": "sha512-4kxJpUD+rU5j6OOzCIUxd06i+T/GhifFnn5jRpYlZ9ETbIfpunsCRfYvCn9QxdH3KlwFY9ayzYDrAfcMLt8ckA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snyk-python-plugin/-/snyk-python-plugin-2.1.1.tgz", + "integrity": "sha512-TK2EecV9MQ9uKCybyR/7KotCHVVNmtc8QWp6w1O8NP8zPW9OZS1eXKoDf6ot0lnth4J+9Cec/2IgCUjJocC4uQ==", "dependencies": { "@snyk/cli-interface": "^2.11.2", "@snyk/dep-graph": "^1.28.1", @@ -41269,9 +41269,9 @@ } }, "snyk-python-plugin": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/snyk-python-plugin/-/snyk-python-plugin-2.1.0.tgz", - "integrity": "sha512-4kxJpUD+rU5j6OOzCIUxd06i+T/GhifFnn5jRpYlZ9ETbIfpunsCRfYvCn9QxdH3KlwFY9ayzYDrAfcMLt8ckA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snyk-python-plugin/-/snyk-python-plugin-2.1.1.tgz", + "integrity": "sha512-TK2EecV9MQ9uKCybyR/7KotCHVVNmtc8QWp6w1O8NP8zPW9OZS1eXKoDf6ot0lnth4J+9Cec/2IgCUjJocC4uQ==", "requires": { "@snyk/cli-interface": "^2.11.2", "@snyk/dep-graph": "^1.28.1", diff --git a/package.json b/package.json index 16a3ad5c0b..9403b63a25 100644 --- a/package.json +++ b/package.json @@ -125,7 +125,7 @@ "snyk-nuget-plugin": "2.4.1", "snyk-php-plugin": "1.9.2", "snyk-policy": "^1.25.0", - "snyk-python-plugin": "2.1.0", + "snyk-python-plugin": "2.1.1", "snyk-resolve-deps": "4.7.3", "snyk-sbt-plugin": "2.17.1", "snyk-swiftpm-plugin": "1.4.1", From ade5860daa1331aad3085fdd557f4b599ee39e07 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 13 Mar 2024 08:46:34 +0000 Subject: [PATCH 07/58] docs: synchronizing help from snyk/user-docs (#5063) Co-authored-by: Avishagp --- help/cli-commands/container-sbom.md | 2 +- help/cli-commands/monitor.md | 8 ++++---- help/cli-commands/test.md | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/help/cli-commands/container-sbom.md b/help/cli-commands/container-sbom.md index 14a37bbe08..c9ee6c2fa4 100644 --- a/help/cli-commands/container-sbom.md +++ b/help/cli-commands/container-sbom.md @@ -85,7 +85,7 @@ Required. The image for which you will generate an SBOM document. ### Create a SPDX JSON document for an image while excluding application dependencies -`$ snyk container sbom --format=spdx2.3+json redis:latest ----exclude-app-vulns` +`$ snyk container sbom --format=spdx2.3+json redis:latest --exclude-app-vulns` ### Refer to a container image by its digest diff --git a/help/cli-commands/monitor.md b/help/cli-commands/monitor.md index d31608e3d5..cc5a8f3b0e 100644 --- a/help/cli-commands/monitor.md +++ b/help/cli-commands/monitor.md @@ -221,13 +221,13 @@ This is an alias for `--project-tags` ### `--maven-aggregate-project` -Use `--maven-aggregate-project` instead of `--all-projects` when scanning Maven aggregate projects, that is, ones that use modules and inheritance. +Use `--maven-aggregate-project` instead of `--all-projects` when scanning Maven aggregate projects, that is, projects that use modules and inheritance. -When scanning these types of projects, Snyk performs a compile to ensure all modules are resolvable by the Maven reactor. +Using `--maven-aggregate-project` instructs Snyk to perform a compilation step to ensure all modules within the project are resolvable by the Maven reactor. This ensures a comprehensive scan that includes dependencies of all sub-modules. -Be sure to run the scan in the same directory as the root pom.xml file. +Be sure to run the scan in the same directory as the root `pom.xml` file. -Snyk reports test results per pom.xml file. +Snyk reports the test results per individual `pom.xml` file within the aggregate project. ### `--scan-unmanaged` diff --git a/help/cli-commands/test.md b/help/cli-commands/test.md index 98346f450a..67cc04fa21 100644 --- a/help/cli-commands/test.md +++ b/help/cli-commands/test.md @@ -224,13 +224,13 @@ To fail on any Snyk-discoverable vulnerability (the default behavior), do not us ### `--maven-aggregate-project` -Use `--maven-aggregate-project` instead of `--all-projects` when scanning Maven aggregate projects, that is, ones that use modules and inheritance. +Use `--maven-aggregate-project` instead of `--all-projects` when scanning Maven aggregate projects, that is, projects that use modules and inheritance. -When scanning these types of projects, Snyk performs a compile to ensure all modules are resolvable by the Maven reactor. +Using `--maven-aggregate-project` instructs Snyk to perform a compilation step to ensure all modules within the project are resolvable by the Maven reactor. This ensures a comprehensive scan that includes dependencies of all sub-modules. -Be sure to run the scan in the same directory as the root pom.xml file. +Be sure to run the scan in the same directory as the root `pom.xml` file. -Snyk reports test results per pom.xml file. +Snyk reports the test results per individual `pom.xml` file within the aggregate project. ### `--scan-unmanaged` From 93b4fcb10b3768a59993b8ee29698b84fd8b1ef4 Mon Sep 17 00:00:00 2001 From: PeterSchafer <101886095+PeterSchafer@users.noreply.github.com> Date: Wed, 13 Mar 2024 16:09:09 +0100 Subject: [PATCH 08/58] fix(ci): End to end test by updating to a newer test image (#5115) --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 0e660aa51a..e653ba2505 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -111,7 +111,7 @@ executors: shell: powershell cbl-mariner: docker: - - image: mcr.microsoft.com/cbl-mariner/base/python:3.9.14-6-cm2.0.20230805-arm64 + - image: mcr.microsoft.com/cbl-mariner/base/python:3.9.14-8-cm2.0.20240301-arm64 resource_class: arm.medium commands: From 9445c90542c50b711011c5f28eb093df90663d49 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 13 Mar 2024 20:59:18 +0100 Subject: [PATCH 09/58] docs: synchronizing README from GitBook (#5114) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- README.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index a0810d73d8..836434983b 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,11 @@ The **Snyk CLI brings the functionality of Snyk into your development workflow**
Snyk CLI test command output example

Snyk CLI test command output

-Snyk CLI scanning **supports many languages and tools.** For detailed information, see the [summary of supported environments](https://docs.snyk.io/getting-started/introducing-snyk#how-can-snyk-work-in-my-environment). +Snyk CLI scanning **supports many languages and tools.** For detailed information, see the following: + +- [Supported languages and frameworks for Open Source and Code](https://docs.snyk.io/getting-started/supported-languages-frameworks-and-feature-availability-overview) +- [Supported operating system distributions for Container](https://docs.snyk.io/scan-with-snyk/snyk-container/how-snyk-container-works/supported-operating-system-distributions) +- [Supported IaC Lanuages and cloud providers](https://docs.snyk.io/scan-with-snyk/snyk-iac/supported-iac-languages-cloud-providers-and-cloud-resources) This page explains how to install, authenticate, and start scanning using the CLI. Snyk also has an onboarding wizard to guide you through these steps. For a demonstration, view [Starting with Snyk: an overview of the CLI onboarding flow](https://www.youtube.com/watch?v=adj3VF82-v8). @@ -37,7 +41,7 @@ Look at the `test` command **report** in your terminal. The report shows the vul ## Scan your development Project -**Note:** Before using the Snyk CLI to test your Open Source Project for vulnerabilities, with limited exceptions, you must **build your Project**. For details, see [Which Projects must be built before testing with CLI?](https://support.snyk.io/hc/en-us/articles/360015552617-Which-projects-must-be-built-before-testing-with-CLI-) +**Note:** Before using the Snyk CLI to test your Open Source Project for vulnerabilities, with limited exceptions, you must **build your Project**. For details, see [Open Source Projects that must be built before testing](https://docs.snyk.io/snyk-cli/scan-and-maintain-projects-using-the-cli/snyk-cli-for-open-source/open-source-projects-that-must-be-built-before-testing-with-the-snyk-cli). In addition, depending on the language of your open-source Project, you may need to **set up your language environment** before using the Snyk CLI. For details, refer to [Supported languages, frameworks, and feature availability overview.](https://docs.snyk.io/scan-using-snyk/supported-languages-and-frameworks/supported-languages-frameworks-and-feature-availability-overview) @@ -115,6 +119,10 @@ For detailed information about the CLI, see the [CLI docs](https://docs.snyk.io/ The Snyk CLI project is open-source, but Snyk does not encourage outside contributors. +You may look into [design decisions for the Snyk CLI](https://github.com/snyk/snyk/blob/master/help/_about-this-project/README.md). + +The Snyk CLI repository is a monorepo that also covers other projects and tools, such as [@snyk/protect](https://github.com/snyk/snyk/tree/master/packages/snyk-protect), also available at [npm package for snyk-protect command](https://www.npmjs.com/package/@snyk/protect). + ## Security -For any security issues or concerns, see the [SECURITY.md](https://github.com/snyk/snyk/blob/main/SECURITY.md) file in the GitHub repository. +For any security issues or concerns, see the [SECURITY.md](https://github.com/snyk/snyk/blob/master/SECURITY.md) file in the GitHub repository. From 1ef091fab322e03b51397633d88fb635b92ecb89 Mon Sep 17 00:00:00 2001 From: Antonio Firmiano Gomes Date: Thu, 14 Mar 2024 11:37:42 +0000 Subject: [PATCH 10/58] feat: support -dverbose argument when testing maven projects #5117 - feat: support verbose for maven Support passing -Dverbose to resolve omitted dependencies using maven-dependency-plugin. When verbose is being used execute a specific version of the maven-dependency-plugin. This is becuase on lower version of this plugin outputType=dot is not supported, and it will output a tree. When verbose is on skip pruning and ensure all dependency lines are traversed fully, using breadth first, first in wins for version resolution. - fix: record and use visited dependency information In preparation for supporting -Dverbose the breadth first search needs to retain previously visited dependency information. At the moment we record whether a dependency has been seen (true/false) based on the maven graph node id. This id contains the dependency version. For example 'com.example:my-app:jar:jdk8:1.2.3:compile'. However when maven is determining whether a dependency has already been seen only four properties are used: * groupId * artifactId * type * classifier (optional) These are the properties that uniquely identify a dependency in Maven. Changing visited to be keyed by these four properties instead. In addition we then record the parsed dependency for these visited dependencies so that we can use that information when adding and connecting the dep-graph nodes. The effect is that if a duplicate node is found, the previously visited version is preferred regardless of what the duplicate node is set to. This doesn't really effect the current implementation because maven-dependency-plugin hides duplicates. Another PR will start to support -Dverbose where this becomes important that we select the effective version being resolved by Maven. --- package-lock.json | 21 ++++++++++++--------- package.json | 2 +- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2e52b92218..d7384fdc7d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -72,7 +72,7 @@ "snyk-go-plugin": "1.23.0", "snyk-gradle-plugin": "4.1.0", "snyk-module": "3.1.0", - "snyk-mvn-plugin": "3.1.0", + "snyk-mvn-plugin": "3.3.1", "snyk-nodejs-lockfile-parser": "1.52.11", "snyk-nuget-plugin": "2.4.1", "snyk-php-plugin": "1.9.2", @@ -21315,17 +21315,20 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/snyk-mvn-plugin": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/snyk-mvn-plugin/-/snyk-mvn-plugin-3.1.0.tgz", - "integrity": "sha512-devEs+koPeDK2U7c+txpDld2j+u4zP8/SssWJrNIJbEO3J4Ay2CGp5FkinuZpbWqQ4KVNQGPA/t9jAnY6DBcNA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/snyk-mvn-plugin/-/snyk-mvn-plugin-3.3.1.tgz", + "integrity": "sha512-Sq45+qzZmLXRuz4RSRjKBp6DN3tQpMdRwaTB7tWTI/J5HQBDiBVDmQ3NTXAb7rCuWGwxvHKL8WE3ZmBMx0Plrw==", "dependencies": { "@snyk/cli-interface": "2.11.3", "@snyk/dep-graph": "^1.23.1", - "debug": "^4.1.1", + "debug": "^4.3.4", "glob": "^7.1.6", "packageurl-js": "^1.0.0", "shescape": "1.6.1", "tslib": "^2.4.0" + }, + "engines": { + "node": "^18" } }, "node_modules/snyk-mvn-plugin/node_modules/@snyk/cli-interface": { @@ -40997,13 +41000,13 @@ } }, "snyk-mvn-plugin": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/snyk-mvn-plugin/-/snyk-mvn-plugin-3.1.0.tgz", - "integrity": "sha512-devEs+koPeDK2U7c+txpDld2j+u4zP8/SssWJrNIJbEO3J4Ay2CGp5FkinuZpbWqQ4KVNQGPA/t9jAnY6DBcNA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/snyk-mvn-plugin/-/snyk-mvn-plugin-3.3.1.tgz", + "integrity": "sha512-Sq45+qzZmLXRuz4RSRjKBp6DN3tQpMdRwaTB7tWTI/J5HQBDiBVDmQ3NTXAb7rCuWGwxvHKL8WE3ZmBMx0Plrw==", "requires": { "@snyk/cli-interface": "2.11.3", "@snyk/dep-graph": "^1.23.1", - "debug": "^4.1.1", + "debug": "^4.3.4", "glob": "^7.1.6", "packageurl-js": "^1.0.0", "shescape": "1.6.1", diff --git a/package.json b/package.json index 9403b63a25..39b6fd3ade 100644 --- a/package.json +++ b/package.json @@ -120,7 +120,7 @@ "snyk-go-plugin": "1.23.0", "snyk-gradle-plugin": "4.1.0", "snyk-module": "3.1.0", - "snyk-mvn-plugin": "3.1.0", + "snyk-mvn-plugin": "3.3.1", "snyk-nodejs-lockfile-parser": "1.52.11", "snyk-nuget-plugin": "2.4.1", "snyk-php-plugin": "1.9.2", From 2b3753931f836aea6027fea4ebf404ddabf51f2c Mon Sep 17 00:00:00 2001 From: mikeromard <146881896+mikeromard@users.noreply.github.com> Date: Fri, 15 Mar 2024 10:07:36 -0300 Subject: [PATCH 11/58] chore: disable readme sync workflow schedule (#5120) --- .github/workflows/synchronize-readme.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/synchronize-readme.yml b/.github/workflows/synchronize-readme.yml index 95b89d7f89..1f1acdd352 100644 --- a/.github/workflows/synchronize-readme.yml +++ b/.github/workflows/synchronize-readme.yml @@ -2,8 +2,8 @@ name: Synchronize Readme on: workflow_dispatch: - schedule: - - cron: '0 12 * * 1-5' # Mon-Fri at 12 + #schedule: + # - cron: '0 12 * * 1-5' # Mon-Fri at 12 jobs: build: From c903102b7037319d5cfac569b44d63f2b1518e61 Mon Sep 17 00:00:00 2001 From: PeterSchafer <101886095+PeterSchafer@users.noreply.github.com> Date: Mon, 18 Mar 2024 12:45:21 +0100 Subject: [PATCH 12/58] chore(ci): add script to install dev tools on macos (#5059) * chore: add a simple script to install dev tools * chore: use Brewfile --- .gitignore | 3 ++- CONTRIBUTING.md | 13 +++---------- scripts/Brewfile | 10 ++++++++++ scripts/install-dev-dependencies.sh | 5 +++++ 4 files changed, 20 insertions(+), 11 deletions(-) create mode 100755 scripts/Brewfile create mode 100755 scripts/install-dev-dependencies.sh diff --git a/.gitignore b/.gitignore index 398881432a..07ff951e16 100644 --- a/.gitignore +++ b/.gitignore @@ -47,4 +47,5 @@ tap-output # Jest coverage test/fixtures/basic-swift/.build -test/fixtures/basic-swift/Package.resolved \ No newline at end of file +test/fixtures/basic-swift/Package.resolved +scripts/Brewfile.lock.json diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f252f0d73b..81e3f44958 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,18 +4,11 @@ ## Prerequisites -You will need the following software installed: - -- Git -- Node.js (and bundled npm) - - Use whichever version is in [`.nvmrc`](./.nvmrc). - -Open a terminal and make sure they are available. +To install the required development dependencies in homebrew based environments, execute the following script from the root directory. +The only additional prerequisite is having [homebrew](https://brew.sh/) installed. ```sh -git --version -node --version -npm --version +./scripts/install-dev-dependencies.sh ``` ## Setting up diff --git a/scripts/Brewfile b/scripts/Brewfile new file mode 100755 index 0000000000..e3f49876de --- /dev/null +++ b/scripts/Brewfile @@ -0,0 +1,10 @@ +brew 'fnm' +brew 'git' +brew 'go' +brew 'gitleaks' +brew 'pre-commit' +brew 'convco' +brew 'python' +brew 'gnupg' + +cask 'github' diff --git a/scripts/install-dev-dependencies.sh b/scripts/install-dev-dependencies.sh new file mode 100755 index 0000000000..9b2ef85f5c --- /dev/null +++ b/scripts/install-dev-dependencies.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -exuo pipefail + +# requires https://brew.sh/ +brew bundle --file=$(dirname "$0")/Brewfile From c9cc908c69bc6d8cc4715275f9c19fa3be69aebc Mon Sep 17 00:00:00 2001 From: Teodora Sandu <81559517+teodora-sandu@users.noreply.github.com> Date: Mon, 18 Mar 2024 15:05:45 +0000 Subject: [PATCH 13/58] feat: feat: include new snyk code ignores fakes [IDE-172] (#5100) --- cliv2/go.mod | 24 +++++++++++++----------- cliv2/go.sum | 48 ++++++++++++++++++++++++++---------------------- 2 files changed, 39 insertions(+), 33 deletions(-) diff --git a/cliv2/go.mod b/cliv2/go.mod index b307e252dc..997825052b 100644 --- a/cliv2/go.mod +++ b/cliv2/go.mod @@ -14,9 +14,9 @@ require ( github.com/snyk/cli-extension-sbom v0.0.0-20231123083311-52b1cecc1a7a github.com/snyk/container-cli v0.0.0-20230920093251-fe865879a91f github.com/snyk/go-application-framework v0.0.0-20240115124746-d58d5f37748a - github.com/snyk/go-httpauth v0.0.0-20240115141312-6512e4db4656 + github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65 github.com/snyk/snyk-iac-capture v0.6.5 - github.com/snyk/snyk-ls v0.0.0-20240226103812-f5ab230ebe93 + github.com/snyk/snyk-ls v0.0.0-20240318135323-bd809c95fbe4 github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.8.4 @@ -50,7 +50,7 @@ require ( github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf // indirect github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f // indirect github.com/creachadair/jrpc2 v1.1.2 // indirect - github.com/creachadair/mds v0.11.0 // indirect + github.com/creachadair/mds v0.12.1 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/denisbrodbeck/machineid v1.0.1 // indirect github.com/docker/distribution v2.8.2+incompatible // indirect @@ -65,7 +65,7 @@ require ( github.com/gobwas/glob v0.2.3 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/mock v1.6.0 // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/gomarkdown/markdown v0.0.0-20231222211730-1d6d20845b47 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/go-querystring v1.1.0 // indirect @@ -127,6 +127,7 @@ require ( github.com/segmentio/analytics-go v3.1.0+incompatible // indirect github.com/segmentio/backo-go v1.0.1 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect + github.com/snyk/code-client-go v0.3.1 // indirect github.com/snyk/policy-engine v0.22.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/sourcegraph/go-lsp v0.0.0-20240223163137-f80c5dd31dfd // indirect @@ -149,16 +150,17 @@ require ( go.lsp.dev/uri v0.3.0 // indirect go.opencensus.io v0.24.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.19.0 // indirect + golang.org/x/crypto v0.21.0 // indirect golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 // indirect - golang.org/x/mod v0.15.0 // indirect - golang.org/x/net v0.21.0 // indirect - golang.org/x/oauth2 v0.17.0 // indirect + golang.org/x/mod v0.16.0 // indirect + golang.org/x/net v0.22.0 // indirect + golang.org/x/oauth2 v0.18.0 // indirect golang.org/x/sync v0.6.0 // indirect - golang.org/x/sys v0.17.0 // indirect - golang.org/x/term v0.17.0 // indirect + golang.org/x/sys v0.18.0 // indirect + golang.org/x/term v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.5.0 // indirect + golang.org/x/tools v0.19.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/api v0.153.0 // indirect google.golang.org/appengine v1.6.8 // indirect @@ -166,7 +168,7 @@ require ( google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f // indirect google.golang.org/grpc v1.59.0 // indirect - google.golang.org/protobuf v1.32.0 // indirect + google.golang.org/protobuf v1.33.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/cliv2/go.sum b/cliv2/go.sum index 29eb276ace..d7b1e8481f 100644 --- a/cliv2/go.sum +++ b/cliv2/go.sum @@ -271,8 +271,8 @@ github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfc github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creachadair/jrpc2 v1.1.2 h1:UOYMipEFYlwd5qmcvs9GZBurn3oXt1UDIX5JLjWWFzo= github.com/creachadair/jrpc2 v1.1.2/go.mod h1:JcCe2Eny3lIvVwZLm92WXyU+tNUgTBWFCLMsfNkjEGk= -github.com/creachadair/mds v0.11.0 h1:/SZHJlT/0ZmgMSbzJI3Skruzj7TVpO/jnrcHv/Qk7sY= -github.com/creachadair/mds v0.11.0/go.mod h1:4vrFYUzTXMJpMBU+OA292I6IUxKWCCfZkgXg+/kBZMo= +github.com/creachadair/mds v0.12.1 h1:uJh5mwLcRMpoUVjrZUednb9bxxDPvD9+tt/TnuxIUUo= +github.com/creachadair/mds v0.12.1/go.mod h1:4vrFYUzTXMJpMBU+OA292I6IUxKWCCfZkgXg+/kBZMo= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -380,8 +380,8 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -656,18 +656,20 @@ github.com/snyk/cli-extension-iac-rules v0.0.0-20230601153200-c572cfce46ce h1:Wc github.com/snyk/cli-extension-iac-rules v0.0.0-20230601153200-c572cfce46ce/go.mod h1:5/IYYTgf32pST7St4GhS3KNz32WE17Ys+Hdb5Pqxex0= github.com/snyk/cli-extension-sbom v0.0.0-20231123083311-52b1cecc1a7a h1:oRrk9bvMXdAVhRt84Y8G06+Op7fYQYrRuslngG9BPZk= github.com/snyk/cli-extension-sbom v0.0.0-20231123083311-52b1cecc1a7a/go.mod h1:IwRGWjRuNkY08O7NJb7u3JuQkroEB8Qi1MlASpZVu1Q= +github.com/snyk/code-client-go v0.3.1 h1:jCYBRJJ/qVlPRqJONwmwpMCMe7s/lulbJQE6KUe2DW0= +github.com/snyk/code-client-go v0.3.1/go.mod h1:D+cfqDbuZE1S106bY3Tr+ZXLb9BR16kKBtvlf0xdyNA= github.com/snyk/container-cli v0.0.0-20230920093251-fe865879a91f h1:ghajT5PEiLP8XNFIdc7Yn4Th74RH/9Q++dDOp6Cb9eo= github.com/snyk/container-cli v0.0.0-20230920093251-fe865879a91f/go.mod h1:38w+dcAQp9eG3P5t2eNS9eG0reut10AeJjLv5lJ5lpM= github.com/snyk/go-application-framework v0.0.0-20240115124746-d58d5f37748a h1:buG7qW184CblwYISJxNZ4ZDxf90jOFu/4S7CHq1ckP8= github.com/snyk/go-application-framework v0.0.0-20240115124746-d58d5f37748a/go.mod h1:Yz/qxFyfhf0xbA+z8Vzr5IM9IDG+BS+2PiGaP1yAsEw= -github.com/snyk/go-httpauth v0.0.0-20240115141312-6512e4db4656 h1:kG6dkw2Inzetjjy8Dw6RIOkLKT3StUdUrVaGCmTJl0Q= -github.com/snyk/go-httpauth v0.0.0-20240115141312-6512e4db4656/go.mod h1:88KbbvGYlmLgee4OcQ19yr0bNpXpOr2kciOthaSzCAg= +github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65 h1:CEQuYv0Go6MEyRCD3YjLYM2u3Oxkx8GpCpFBd4rUTUk= +github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65/go.mod h1:88KbbvGYlmLgee4OcQ19yr0bNpXpOr2kciOthaSzCAg= github.com/snyk/policy-engine v0.22.0 h1:od9pduGrXyfWO791X+8M1qmnvWUxaIXh0gBzGKqeseA= github.com/snyk/policy-engine v0.22.0/go.mod h1:Vvy/9VMXoABS3JlLqhTlAPWkB5LgbLh7LGn3gBwAqdY= github.com/snyk/snyk-iac-capture v0.6.5 h1:992DXCAJSN97KtUh8T5ndaWwd/6ZCal2bDkRXqM1u/E= github.com/snyk/snyk-iac-capture v0.6.5/go.mod h1:e47i55EmM0F69ZxyFHC4sCi7vyaJW6DLoaamJJCzWGk= -github.com/snyk/snyk-ls v0.0.0-20240226103812-f5ab230ebe93 h1:noPcQ5f+t2Ij1q1nw9JTt+JFpY/2IbrMC9vANOD/n7I= -github.com/snyk/snyk-ls v0.0.0-20240226103812-f5ab230ebe93/go.mod h1:seSz3zGy2NPbSdNq6zq4NFnD2gPteeMDnpLpzfi3qTU= +github.com/snyk/snyk-ls v0.0.0-20240318135323-bd809c95fbe4 h1:ckxsi32571LM2im35ZXBffLTEVL50yop6gZ3dsr6JtA= +github.com/snyk/snyk-ls v0.0.0-20240318135323-bd809c95fbe4/go.mod h1:hUnThwpQo1pHbwkZCHrLfjFoSExFtnWIXSpdesQlwEo= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/sourcegraph/go-lsp v0.0.0-20240223163137-f80c5dd31dfd h1:Dq5WSzWsP1TbVi10zPWBI5LKEBDg4Y1OhWEph1wr5WQ= @@ -758,8 +760,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo= -golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -798,8 +800,8 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8= -golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= +golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180811021610-c39426892332/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -851,8 +853,8 @@ golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfS golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -878,8 +880,8 @@ golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= -golang.org/x/oauth2 v0.17.0 h1:6m3ZPmLEFdVxKKWnKq4VqZ60gutO35zm+zrAHVmHyDQ= -golang.org/x/oauth2 v0.17.0/go.mod h1:OzPDGQiuQMguemayvdylqddI7qcD9lnSDb+1FiwQ5HA= +golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= +golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -970,14 +972,14 @@ golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U= -golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1049,6 +1051,8 @@ golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= +golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1277,8 +1281,8 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= -google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= From cd8eb6cc31a5bc8adf40bf104c0e3539f740e640 Mon Sep 17 00:00:00 2001 From: JSON Date: Tue, 19 Mar 2024 10:43:03 +0000 Subject: [PATCH 14/58] chore: introduce script to create release (#5116) * chore: create create-release script to create/update release branches * chore: push patch branch in create-release.sh * chore: can dry-run create-release.sh --- release-scripts/create-release.sh | 92 +++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100755 release-scripts/create-release.sh diff --git a/release-scripts/create-release.sh b/release-scripts/create-release.sh new file mode 100755 index 0000000000..0686e41f0e --- /dev/null +++ b/release-scripts/create-release.sh @@ -0,0 +1,92 @@ +#!/usr/bin/env bash +set -euo pipefail + +# This script automates the process of releasing the `release-candidate` branch, +# validates the current and next versions, and releases the next version. + +RC_BRANCH="release-candidate" +DEFAULT_BRANCH="main" + +# check if `dry-run` arg is passed +DRY_RUN_MODE=${1:-false} +if [[ $DRY_RUN_MODE == "dry-run" ]]; then + DRY_RUN_MODE=true +fi + +# Checkout Release Candidate branch +git checkout $RC_BRANCH +git pull origin $RC_BRANCH + +# Check if the script runs on the ‘release-candidate’ branch, otherwise FAIL +echo "Validating branch..." +if ! git status | grep $RC_BRANCH; then + echo "Not on branch '$RC_BRANCH', make sure you're on the '$RC_BRANCH' branch and try again." + exit 1 +fi + +# Ensure that the next version matches the version in binary-releases/RELEASE_NOTES.md, if not FAIL +echo "Validating next version..." + +# Get version from version file +VERSION_FILE="./binary-releases/version" +CURRENT_VERSION=$(cat "$VERSION_FILE") + +# Get version from RELEASE_NOTES.md +RELEASE_NOTES_MD="./binary-releases/RELEASE_NOTES.md" +header_line=$(head -n 1 "$RELEASE_NOTES_MD") +RELEASE_VERSION=$(echo "$header_line" | sed 's/.*# \[\(.*\)\].*/\1/') + +# Validate versions are the same +if [[ "$CURRENT_VERSION" != "$RELEASE_VERSION" ]]; then + echo "Version file version: '$CURRENT_VERSION', is not equal to RELEASE_NOTES.md version: '$RELEASE_VERSION'. Please ensure the versions are equal before continuing." + exit 1 +fi +echo "Current version: $CURRENT_VERSION" +# Check whether a new major, minor, or patch version has been created +echo "Checking for new versions..." + +latest_version_full=$(git describe --tags `git rev-list --tags --max-count=1`) +LATEST_VERSION=${latest_version_full:1} +echo "LATEST_VERSION: $LATEST_VERSION" + +# Extract major, minor, patch from LATEST_VERSION +IFS="." read -r LATEST_MAJOR LATEST_MINOR LATEST_PATCH <<< "$LATEST_VERSION" +# Extract major, minor, patch from CURRENT_VERSION +IFS="." read -r CURRENT_MAJOR CURRENT_MINOR CURRENT_PATCH <<< "$CURRENT_VERSION" + +# Decide whether to create major/minor release or patch release +if [[ "$CURRENT_MAJOR" -gt "$LATEST_MAJOR" || "$CURRENT_MINOR" -gt "$LATEST_MINOR" ]]; then + # If a new Major or Minor version exists, create a branch based on + # the next version following the pattern: release/${Major}.${Minor} + MAJOR_MINOR_BRANCH=release/${CURRENT_MAJOR}.${CURRENT_MINOR} + git checkout -b $MAJOR_MINOR_BRANCH + + if [[ $DRY_RUN_MODE == true ]]; then + echo "Dry running git push" + git push --dry-run origin $MAJOR_MINOR_BRANCH + else + echo "Pushing new release branch '$MAJOR_MINOR_BRANCH'" + git push origin $MAJOR_MINOR_BRANCH + fi +elif [[ "$CURRENT_PATCH" -gt "$LATEST_PATCH" ]]; then + # If only the Patch version changes, update the existing release branch + PATCH_BRANCH=release/${LATEST_MAJOR}.${LATEST_MINOR} + # Check if curent release branch (PATCH_BRANCH) is behind release candidate branch + # merge release candidate branch into current release branch + git checkout $PATCH_BRANCH + if git rev-list --left-right --count $RC_BRANCH...$PATCH_BRANCH | awk '{print $1}' | grep -q '[1-9]'; then + git merge --quiet -m "chore: merge $RC_BRANCH into $PATCH_BRANCH $(date)" --no-edit --no-ff $RC_BRANCH + if [ $? -ne 0 ]; then + echo "Merge conflict occurred. Please resolve conflicts and try again." + exit 1 + fi + fi + + if [[ $DRY_RUN_MODE == true ]]; then + echo "Dry running git push" + git push --dry-run origin $PATCH_BRANCH + else + echo "Pushing updated release branch '$PATCH_BRANCH'" + git push origin $MAJOR_MINOR_BRANCH + fi +fi From 74c864ea31848cc10bb78cf6c03b131cf4fde834 Mon Sep 17 00:00:00 2001 From: Casey Marshall Date: Wed, 20 Mar 2024 06:43:44 -0500 Subject: [PATCH 15/58] chore: publish build image to snyklabs (#5122) CLI-166 --- .circleci/config.yml | 4 ++-- .github/workflows/create-build-image.yml | 5 +++-- scripts/create-build-image.sh | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index e653ba2505..309f157d83 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -46,12 +46,12 @@ executors: resource_class: medium+ docker-amd64: docker: - - image: bastiandoetsch209/cli-build:20240214-145818 + - image: snyklabs/cli-build:20240319-123447 working_directory: /mnt/ramdisk/snyk resource_class: large docker-arm64: docker: - - image: bastiandoetsch209/cli-build-arm64:20240214-145818 + - image: snyklabs/cli-build-arm64:20240319-123447 working_directory: /mnt/ramdisk/snyk resource_class: arm.large linux-ubuntu-mantic-amd64: diff --git a/.github/workflows/create-build-image.yml b/.github/workflows/create-build-image.yml index cf751f34d4..31e87efc38 100644 --- a/.github/workflows/create-build-image.yml +++ b/.github/workflows/create-build-image.yml @@ -13,7 +13,8 @@ jobs: - uses: docker/setup-buildx-action@v2 - name: Build Docker image env: - DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} - DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + DOCKER_USERNAME: ${{ secrets.DOCKER_CLI_BUILD_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_CLI_BUILD_PASSWORD }} + DOCKER_REPO: snyklabs DOCKER_BUILDKIT: 1 run: scripts/create-build-image.sh diff --git a/scripts/create-build-image.sh b/scripts/create-build-image.sh index 34da45e088..60c77b9853 100755 --- a/scripts/create-build-image.sh +++ b/scripts/create-build-image.sh @@ -21,7 +21,7 @@ pushd "$SCRIPT_DIR/.." docker login -u "$DOCKER_USERNAME" -p "$DOCKER_PASSWORD" - BASE_IMG_NAME=$DOCKER_USERNAME/cli-build + BASE_IMG_NAME=${DOCKER_REPO:-${DOCKER_USERNAME}}/cli-build docker buildx build \ --build-arg NODEVERSION="$NODEVERSION" \ --build-arg ARCH="x86_64" \ @@ -31,7 +31,7 @@ pushd "$SCRIPT_DIR/.." --push \ --file .circleci/Dockerfile . - BASE_IMG_NAME=$DOCKER_USERNAME/cli-build-arm64 + BASE_IMG_NAME=${DOCKER_REPO:-${DOCKER_USERNAME}}/cli-build-arm64 docker buildx build \ --build-arg NODEVERSION="$NODEVERSION" \ --build-arg ARCH="aarch64" \ From 57fac5ca28fffc343ed147b709ac71ecb22e1e0e Mon Sep 17 00:00:00 2001 From: Luke Watts Date: Wed, 20 Mar 2024 22:12:51 +0100 Subject: [PATCH 16/58] chore(deps): upgrade slack webhook (#5124) --- .github/workflows/iac-cli-alert.yml | 2 +- package-lock.json | 222 +++++++++++----------------- packages/iac-cli-alert/package.json | 2 +- 3 files changed, 87 insertions(+), 139 deletions(-) diff --git a/.github/workflows/iac-cli-alert.yml b/.github/workflows/iac-cli-alert.yml index 872eb1d1d2..078957e9c1 100644 --- a/.github/workflows/iac-cli-alert.yml +++ b/.github/workflows/iac-cli-alert.yml @@ -14,7 +14,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 with: - node-version: '16.16.0' + node-version: '18.19.1' cache: 'npm' - run: npm ci - run: npm start diff --git a/package-lock.json b/package-lock.json index d7384fdc7d..3b8c8c74d5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2871,26 +2871,34 @@ "dev": true }, "node_modules/@slack/types": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@slack/types/-/types-1.10.0.tgz", - "integrity": "sha512-tA7GG7Tj479vojfV3AoxbckalA48aK6giGjNtgH6ihpLwTyHE3fIgRrvt8TWfLwW8X8dyu7vgmAsGLRG7hWWOg==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@slack/types/-/types-2.11.0.tgz", + "integrity": "sha512-UlIrDWvuLaDly3QZhCPnwUSI/KYmV1N9LyhuH6EDKCRS1HWZhyTG3Ja46T3D0rYfqdltKYFXbJSSRPwZpwO0cQ==", "engines": { - "node": ">= 8.9.0", - "npm": ">= 5.5.1" + "node": ">= 12.13.0", + "npm": ">= 6.12.0" } }, "node_modules/@slack/webhook": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@slack/webhook/-/webhook-5.0.4.tgz", - "integrity": "sha512-IC1dpVSc2F/pmwCxOb0QzH2xnGKmyT7MofPGhNkeaoiMrLMU+Oc7xV/AxGnz40mURtCtaDchZSM3tDo9c9x6BA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@slack/webhook/-/webhook-7.0.2.tgz", + "integrity": "sha512-dsrO/ow6a6+xkLm/lZKbUNTsFJlBc679tD+qwlVTztsQkDxPLH6odM7FKALz1IHa+KpLX8HKUIPV13a7y7z29w==", "dependencies": { - "@slack/types": "^1.2.1", - "@types/node": ">=8.9.0", - "axios": "^0.21.1" + "@slack/types": "^2.9.0", + "@types/node": ">=18.0.0", + "axios": "^1.6.3" }, "engines": { - "node": ">= 8.9.0", - "npm": ">= 5.5.1" + "node": ">= 18", + "npm": ">= 8.6.0" + } + }, + "node_modules/@slack/webhook/node_modules/@types/node": { + "version": "20.11.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.30.tgz", + "integrity": "sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==", + "dependencies": { + "undici-types": "~5.26.4" } }, "node_modules/@snyk/child-process": { @@ -6838,11 +6846,26 @@ } }, "node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dependencies": { - "follow-redirects": "^1.14.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" } }, "node_modules/b4a": { @@ -10764,9 +10787,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", - "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "funding": [ { "type": "individual", @@ -24683,67 +24706,13 @@ "typescript": "^4.0.2" } }, - "packages/cli-alert/node_modules/@slack/types": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@slack/types/-/types-2.11.0.tgz", - "integrity": "sha512-UlIrDWvuLaDly3QZhCPnwUSI/KYmV1N9LyhuH6EDKCRS1HWZhyTG3Ja46T3D0rYfqdltKYFXbJSSRPwZpwO0cQ==", - "engines": { - "node": ">= 12.13.0", - "npm": ">= 6.12.0" - } - }, - "packages/cli-alert/node_modules/@slack/webhook": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@slack/webhook/-/webhook-7.0.2.tgz", - "integrity": "sha512-dsrO/ow6a6+xkLm/lZKbUNTsFJlBc679tD+qwlVTztsQkDxPLH6odM7FKALz1IHa+KpLX8HKUIPV13a7y7z29w==", - "dependencies": { - "@slack/types": "^2.9.0", - "@types/node": ">=18.0.0", - "axios": "^1.6.3" - }, - "engines": { - "node": ">= 18", - "npm": ">= 8.6.0" - } - }, - "packages/cli-alert/node_modules/@types/node": { - "version": "20.11.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.23.tgz", - "integrity": "sha512-ZUarKKfQuRILSNYt32FuPL20HS7XwNT7/uRwSV8tiHWfyyVwDLYZNF6DZKc2bove++pgfsXn9sUwII/OsQ82cQ==", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "packages/cli-alert/node_modules/axios": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", - "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", - "dependencies": { - "follow-redirects": "^1.15.4", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "packages/cli-alert/node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, "packages/iac-cli-alert": { "name": "@snyk/iac-cli-alert", "version": "1.0.0", "license": "Apache-2.0", "dependencies": { "@octokit/rest": "^18.0.5", - "@slack/webhook": "^5.0.3" + "@slack/webhook": "7.0.2" }, "devDependencies": { "typescript": "^4.0.2" @@ -26944,18 +26913,28 @@ "dev": true }, "@slack/types": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@slack/types/-/types-1.10.0.tgz", - "integrity": "sha512-tA7GG7Tj479vojfV3AoxbckalA48aK6giGjNtgH6ihpLwTyHE3fIgRrvt8TWfLwW8X8dyu7vgmAsGLRG7hWWOg==" + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@slack/types/-/types-2.11.0.tgz", + "integrity": "sha512-UlIrDWvuLaDly3QZhCPnwUSI/KYmV1N9LyhuH6EDKCRS1HWZhyTG3Ja46T3D0rYfqdltKYFXbJSSRPwZpwO0cQ==" }, "@slack/webhook": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@slack/webhook/-/webhook-5.0.4.tgz", - "integrity": "sha512-IC1dpVSc2F/pmwCxOb0QzH2xnGKmyT7MofPGhNkeaoiMrLMU+Oc7xV/AxGnz40mURtCtaDchZSM3tDo9c9x6BA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@slack/webhook/-/webhook-7.0.2.tgz", + "integrity": "sha512-dsrO/ow6a6+xkLm/lZKbUNTsFJlBc679tD+qwlVTztsQkDxPLH6odM7FKALz1IHa+KpLX8HKUIPV13a7y7z29w==", "requires": { - "@slack/types": "^1.2.1", - "@types/node": ">=8.9.0", - "axios": "^0.21.1" + "@slack/types": "^2.9.0", + "@types/node": ">=18.0.0", + "axios": "^1.6.3" + }, + "dependencies": { + "@types/node": { + "version": "20.11.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.30.tgz", + "integrity": "sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==", + "requires": { + "undici-types": "~5.26.4" + } + } } }, "@snyk/child-process": { @@ -26982,51 +26961,6 @@ "@pagerduty/pdjs": "^2.2.0", "@slack/webhook": "7.0.2", "typescript": "^4.0.2" - }, - "dependencies": { - "@slack/types": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@slack/types/-/types-2.11.0.tgz", - "integrity": "sha512-UlIrDWvuLaDly3QZhCPnwUSI/KYmV1N9LyhuH6EDKCRS1HWZhyTG3Ja46T3D0rYfqdltKYFXbJSSRPwZpwO0cQ==" - }, - "@slack/webhook": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@slack/webhook/-/webhook-7.0.2.tgz", - "integrity": "sha512-dsrO/ow6a6+xkLm/lZKbUNTsFJlBc679tD+qwlVTztsQkDxPLH6odM7FKALz1IHa+KpLX8HKUIPV13a7y7z29w==", - "requires": { - "@slack/types": "^2.9.0", - "@types/node": ">=18.0.0", - "axios": "^1.6.3" - } - }, - "@types/node": { - "version": "20.11.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.23.tgz", - "integrity": "sha512-ZUarKKfQuRILSNYt32FuPL20HS7XwNT7/uRwSV8tiHWfyyVwDLYZNF6DZKc2bove++pgfsXn9sUwII/OsQ82cQ==", - "requires": { - "undici-types": "~5.26.4" - } - }, - "axios": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", - "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", - "requires": { - "follow-redirects": "^1.15.4", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - } } }, "@snyk/cli-interface": { @@ -27395,7 +27329,7 @@ "version": "file:packages/iac-cli-alert", "requires": { "@octokit/rest": "^18.0.5", - "@slack/webhook": "^5.0.3", + "@slack/webhook": "7.0.2", "typescript": "^4.0.2" } }, @@ -30090,11 +30024,25 @@ "dev": true }, "axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", "requires": { - "follow-redirects": "^1.14.0" + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + }, + "dependencies": { + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + } } }, "b4a": { @@ -33075,9 +33023,9 @@ "dev": true }, "follow-redirects": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", - "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==" + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" }, "foreground-child": { "version": "3.1.1", diff --git a/packages/iac-cli-alert/package.json b/packages/iac-cli-alert/package.json index ecffa340d6..f9108ec043 100644 --- a/packages/iac-cli-alert/package.json +++ b/packages/iac-cli-alert/package.json @@ -14,7 +14,7 @@ "license": "Apache-2.0", "dependencies": { "@octokit/rest": "^18.0.5", - "@slack/webhook": "^5.0.3" + "@slack/webhook": "7.0.2" }, "devDependencies": { "typescript": "^4.0.2" From 9419e1480c11647b86f730190798c9bc5151e7d4 Mon Sep 17 00:00:00 2001 From: Luke Watts Date: Thu, 21 Mar 2024 14:36:55 +0100 Subject: [PATCH 17/58] chore: add go entry point for `snyk code test` (#5121) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: allow unknown flags for code test * chore(dep): bump gaf to latest * chore: introduce go entry point for snyk code test * test: switch to validating output against previous run --------- Co-authored-by: Peter Schäfer <101886095+PeterSchafer@users.noreply.github.com> --- cliv2/cmd/cliv2/main.go | 6 +++++ cliv2/go.mod | 2 +- cliv2/go.sum | 4 +-- .../acceptance/snyk-code/snyk-code.spec.ts | 26 +++++++++++++++++++ 4 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 test/jest/acceptance/snyk-code/snyk-code.spec.ts diff --git a/cliv2/cmd/cliv2/main.go b/cliv2/cmd/cliv2/main.go index 09949daab9..4db6869126 100644 --- a/cliv2/cmd/cliv2/main.go +++ b/cliv2/cmd/cliv2/main.go @@ -259,6 +259,11 @@ func createCommandsForWorkflows(rootCommand *cobra.Command, engine workflow.Engi parentCommand.RunE = runCommand parentCommand.Hidden = !workflowEntry.IsVisible() parentCommand.DisableFlagParsing = false + + // special case for snyk code test, to preserve backwards compatibility we will need to relax flag validation + if currentCommandString == "code test" { + parentCommand.FParseErrWhitelist.UnknownFlags = true + } } } @@ -377,6 +382,7 @@ func MainWithErrorCode() int { engine.AddExtensionInitializer(iacrules.Init) engine.AddExtensionInitializer(snykls.Init) engine.AddExtensionInitializer(container.Init) + engine.AddExtensionInitializer(localworkflows.InitCodeWorkflow) // init engine err = engine.Init() diff --git a/cliv2/go.mod b/cliv2/go.mod index 997825052b..7fb24485a5 100644 --- a/cliv2/go.mod +++ b/cliv2/go.mod @@ -13,7 +13,7 @@ require ( github.com/snyk/cli-extension-iac-rules v0.0.0-20230601153200-c572cfce46ce github.com/snyk/cli-extension-sbom v0.0.0-20231123083311-52b1cecc1a7a github.com/snyk/container-cli v0.0.0-20230920093251-fe865879a91f - github.com/snyk/go-application-framework v0.0.0-20240115124746-d58d5f37748a + github.com/snyk/go-application-framework v0.0.0-20240320144631-1935b2cb624e github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65 github.com/snyk/snyk-iac-capture v0.6.5 github.com/snyk/snyk-ls v0.0.0-20240318135323-bd809c95fbe4 diff --git a/cliv2/go.sum b/cliv2/go.sum index d7b1e8481f..457963e0e2 100644 --- a/cliv2/go.sum +++ b/cliv2/go.sum @@ -660,8 +660,8 @@ github.com/snyk/code-client-go v0.3.1 h1:jCYBRJJ/qVlPRqJONwmwpMCMe7s/lulbJQE6KUe github.com/snyk/code-client-go v0.3.1/go.mod h1:D+cfqDbuZE1S106bY3Tr+ZXLb9BR16kKBtvlf0xdyNA= github.com/snyk/container-cli v0.0.0-20230920093251-fe865879a91f h1:ghajT5PEiLP8XNFIdc7Yn4Th74RH/9Q++dDOp6Cb9eo= github.com/snyk/container-cli v0.0.0-20230920093251-fe865879a91f/go.mod h1:38w+dcAQp9eG3P5t2eNS9eG0reut10AeJjLv5lJ5lpM= -github.com/snyk/go-application-framework v0.0.0-20240115124746-d58d5f37748a h1:buG7qW184CblwYISJxNZ4ZDxf90jOFu/4S7CHq1ckP8= -github.com/snyk/go-application-framework v0.0.0-20240115124746-d58d5f37748a/go.mod h1:Yz/qxFyfhf0xbA+z8Vzr5IM9IDG+BS+2PiGaP1yAsEw= +github.com/snyk/go-application-framework v0.0.0-20240320144631-1935b2cb624e h1:Cu5BIVoy+s6/oiOd0OAJS02AuJ+jM8FF2RBZ+YoZs80= +github.com/snyk/go-application-framework v0.0.0-20240320144631-1935b2cb624e/go.mod h1:Yz/qxFyfhf0xbA+z8Vzr5IM9IDG+BS+2PiGaP1yAsEw= github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65 h1:CEQuYv0Go6MEyRCD3YjLYM2u3Oxkx8GpCpFBd4rUTUk= github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65/go.mod h1:88KbbvGYlmLgee4OcQ19yr0bNpXpOr2kciOthaSzCAg= github.com/snyk/policy-engine v0.22.0 h1:od9pduGrXyfWO791X+8M1qmnvWUxaIXh0gBzGKqeseA= diff --git a/test/jest/acceptance/snyk-code/snyk-code.spec.ts b/test/jest/acceptance/snyk-code/snyk-code.spec.ts new file mode 100644 index 0000000000..ae4e757f7f --- /dev/null +++ b/test/jest/acceptance/snyk-code/snyk-code.spec.ts @@ -0,0 +1,26 @@ +import { runSnykCLI } from '../../util/runSnykCLI'; + +describe('code', () => { + it('prints help info', async () => { + const { stdout, code, stderr } = await runSnykCLI('code'); + + expect(stdout).toContain( + 'The snyk code test command finds security issues using Static Code Analysis.', + ); + expect(code).toBe(0); + expect(stderr).toBe(''); + }); + + describe('test', () => { + jest.setTimeout(60000); + it('supports unknown flags', async () => { + const { stdout: baselineStdOut } = await runSnykCLI('code test --help'); + const { stdout, stderr } = await runSnykCLI('code test --unknown-flag'); + + // We do not render the help message for unknown flags + expect(stdout).not.toContain(baselineStdOut); + expect(stdout).toContain('Testing '); + expect(stderr).toBe(''); + }); + }); +}); From c0d401c38742f4da593b680a53a509726f9e9717 Mon Sep 17 00:00:00 2001 From: JSON Date: Fri, 22 Mar 2024 14:59:05 +0000 Subject: [PATCH 18/58] fix: Fix handling of large json data when writing to file via --json [CLI-73] (#5093) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: Support large json data structures via --json --------- Co-authored-by: Peter Schäfer <101886095+PeterSchafer@users.noreply.github.com> --- .circleci/config.yml | 9 +- package-lock.json | 5 +- package.json | 3 +- src/cli/commands/test/index.ts | 8 +- src/cli/main.ts | 9 +- .../formatters/test/format-test-results.ts | 7 - src/lib/json.ts | 13 +- src/lib/request/request.ts | 10 +- .../vulns-result.json | 396 +++++++++++++++++- test/jest/acceptance/cli-json-output.spec.ts | 56 +++ test/jest/unit/json.spec.ts | 18 - test/jest/util/runCommand.ts | 24 +- test/setup.js | 5 + 13 files changed, 491 insertions(+), 72 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 309f157d83..f0425dda56 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -36,6 +36,7 @@ executors: alpine: docker: - image: alpine:3.17 + resource_class: xlarge generic-ubuntu: docker: - image: ubuntu:latest @@ -49,6 +50,11 @@ executors: - image: snyklabs/cli-build:20240319-123447 working_directory: /mnt/ramdisk/snyk resource_class: large + docker-amd64-xl: + docker: + - image: bastiandoetsch209/cli-build:20240214-145818 + working_directory: /mnt/ramdisk/snyk + resource_class: xlarge docker-arm64: docker: - image: snyklabs/cli-build-arm64:20240319-123447 @@ -512,7 +518,7 @@ workflows: ignore: main requires: - build linux amd64 - executor: docker-amd64 + executor: docker-amd64-xl test_snyk_command: ./binary-releases/snyk-linux - acceptance-tests: @@ -1050,6 +1056,7 @@ jobs: TEST_SNYK_COMMAND: << parameters.test_snyk_command >> TEST_SNYK_DONT_SKIP_ANYTHING: << parameters.dont_skip_tests >> JEST_JUNIT_OUTPUT_DIR: test/reports + NODE_OPTIONS: --max-old-space-size=4096 - store_test_results: path: test/reports - store_artifacts: diff --git a/package-lock.json b/package-lock.json index 3b8c8c74d5..4e7acfe462 100644 --- a/package-lock.json +++ b/package-lock.json @@ -117,6 +117,7 @@ "fs-extra": "^9.1.0", "jest": "^28.1.3", "jest-junit": "^16.0.0", + "jsonparse": "^1.3.1", "lodash": "^4.17.20", "mock-fs": "^4.13.0", "node-loader": "^2.0.0", @@ -15701,7 +15702,7 @@ "node_modules/jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "dev": true, "engines": [ "node >= 0.2.0" @@ -36640,7 +36641,7 @@ "jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "dev": true }, "jsonpointer": { diff --git a/package.json b/package.json index 39b6fd3ade..5594ba983a 100644 --- a/package.json +++ b/package.json @@ -156,12 +156,13 @@ "depcheck": "^1.4.3", "eslint": "6.8.0", "eslint-config-prettier": "^6.1.0", - "jest-junit": "^16.0.0", "eslint-plugin-anti-trojan-source": "^1.1.1", "eslint-plugin-jest": "^24.4.0", "express": "^4.17.1", "fs-extra": "^9.1.0", "jest": "^28.1.3", + "jest-junit": "^16.0.0", + "jsonparse": "^1.3.1", "lodash": "^4.17.20", "mock-fs": "^4.13.0", "node-loader": "^2.0.0", diff --git a/src/cli/commands/test/index.ts b/src/cli/commands/test/index.ts index 828dd23737..fb638f3c3f 100644 --- a/src/cli/commands/test/index.ts +++ b/src/cli/commands/test/index.ts @@ -1,6 +1,7 @@ import * as Debug from 'debug'; import { EOL } from 'os'; const cloneDeep = require('lodash.clonedeep'); +const omit = require('lodash.omit'); const assign = require('lodash.assign'); import chalk from 'chalk'; import { MissingArgError } from '../../../lib/errors'; @@ -236,8 +237,7 @@ export default async function test( } } err.code = 'VULNS'; - const dataToSendNoVulns = dataToSend; - delete dataToSendNoVulns.vulnerabilities; + const dataToSendNoVulns = omit(dataToSend, 'vulnerabilities'); err.jsonNoVulns = dataToSendNoVulns; } @@ -252,6 +252,10 @@ export default async function test( err.json = stringifiedData; err.jsonStringifiedResults = stringifiedJsonData; err.sarifStringifiedResults = stringifiedSarifData; + // set jsonPayload if we failed to stringify it + if (jsonPayload) { + err.jsonPayload = jsonPayload; + } throw err; } diff --git a/src/cli/main.ts b/src/cli/main.ts index 9c9032d8ac..86d6d56070 100755 --- a/src/cli/main.ts +++ b/src/cli/main.ts @@ -1,5 +1,6 @@ import * as Debug from 'debug'; import * as pathLib from 'path'; +import { JsonStreamStringify } from 'json-stream-stringify'; // import args as a first internal module import { args as argsLib, Args, ArgsOptions } from './args'; @@ -144,7 +145,13 @@ async function handleError(args, error) { const output = vulnsFound ? error.message : stripAnsi(error.json || error.stack); - console.log(output); + if (error.jsonPayload) { + new JsonStreamStringify(error.jsonPayload, undefined, 2).pipe( + process.stdout, + ); + } else { + console.log(output); + } } else { if (!args.options.quiet) { const result = errors.message(error); diff --git a/src/lib/formatters/test/format-test-results.ts b/src/lib/formatters/test/format-test-results.ts index 55fd9beacd..cb7c02193f 100644 --- a/src/lib/formatters/test/format-test-results.ts +++ b/src/lib/formatters/test/format-test-results.ts @@ -105,13 +105,6 @@ export function extractDataToSendFromResults( stringifiedJsonData = jsonStringifyLargeObject(jsonData); } - // TODO: Remove this when we support streaming JSON to stdout - if (stringifiedJsonData.length === 0 && options['json']) { - console.warn( - "'--json' does not work for very large objects - try just using '--json-file-output=' instead", - ); - } - const dataToSend = options.sarif ? sarifData : jsonData; const stringifiedData = options.sarif ? stringifiedSarifData diff --git a/src/lib/json.ts b/src/lib/json.ts index 94403fa488..f72943e08c 100644 --- a/src/lib/json.ts +++ b/src/lib/json.ts @@ -2,7 +2,7 @@ const debug = require('debug')('snyk-json'); /** * Attempt to json-stringify an object which is potentially very large and might exceed the string limit. - * If it does exceed the string limit, try again without pretty-print to hopefully come out below the string limit. + * If it does exceed the string limit, return empty string. * @param obj the object from which you want to get a JSON string */ export function jsonStringifyLargeObject(obj: any): string { @@ -11,14 +11,7 @@ export function jsonStringifyLargeObject(obj: any): string { res = JSON.stringify(obj, null, 2); return res; } catch (err) { - try { - // if that doesn't work, try non-pretty print - debug('JSON.stringify failed - trying again without pretty print', err); - res = JSON.stringify(obj); - return res; - } catch (error) { - debug('jsonStringifyLargeObject failed: ', error); - return res; - } + debug('jsonStringifyLargeObject failed: ', err); + return res; } } diff --git a/src/lib/request/request.ts b/src/lib/request/request.ts index 71e9bb5d6e..f1ee021db1 100644 --- a/src/lib/request/request.ts +++ b/src/lib/request/request.ts @@ -11,6 +11,7 @@ import { Payload } from './types'; import { getVersion } from '../version'; import * as https from 'https'; import * as http from 'http'; +import { jsonStringifyLargeObject } from '../json'; const debug = debugModule('snyk:req'); const snykDebug = debugModule('snyk'); @@ -46,7 +47,7 @@ function setupRequest(payload: Payload) { debug('compressing request body'); const json = JSON.stringify(body); if (json.length < 1e4) { - debug(JSON.stringify(body, null, 2)); + debug(json); } // always compress going upstream @@ -58,7 +59,7 @@ function setupRequest(payload: Payload) { let callGraphLength: number | null = null; if (body.callGraph) { - callGraphLength = JSON.stringify(body.callGraph).length; + callGraphLength = jsonStringifyLargeObject(body.callGraph).length; snykDebug('call graph size:', callGraphLength); } @@ -84,7 +85,7 @@ function setupRequest(payload: Payload) { } try { - debug('request payload: ', JSON.stringify(payload)); + debug('request payload: ', jsonStringifyLargeObject(payload)); } catch (e) { debug('request payload is too big to log', e); } @@ -139,7 +140,6 @@ export async function makeRequest( payload: Payload, ): Promise<{ res: needle.NeedleResponse; body: any }> { const { method, url, data, options } = setupRequest(payload); - debug(data); return new Promise((resolve, reject) => { needle.request(method, url, data, options, (err, res, respBody) => { @@ -147,7 +147,7 @@ export async function makeRequest( debug( 'response (%s): ', (res || {}).statusCode, - JSON.stringify(respBody), + jsonStringifyLargeObject(respBody), ); if (err) { return reject(err); diff --git a/test/acceptance/workspaces/extra-large-response-payload/vulns-result.json b/test/acceptance/workspaces/extra-large-response-payload/vulns-result.json index 04e91774e6..df007fd80e 100644 --- a/test/acceptance/workspaces/extra-large-response-payload/vulns-result.json +++ b/test/acceptance/workspaces/extra-large-response-payload/vulns-result.json @@ -8,7 +8,7 @@ "reasonRequired": false, "disregardFilesystemIgnores": false }, - "org": "test_org", + "org": "platform_hammerhead_testing", "licensesPolicy": { "severities": {}, "orgLicenseRules": { @@ -138,35 +138,39 @@ { "url": "http://www.openwall.com/lists/oss-security/2024/01/09/1", "title": "http://www.openwall.com/lists/oss-security/2024/01/09/1" + }, + { + "url": "https://security.netapp.com/advisory/ntap-20240216-0009/", + "title": "https://security.netapp.com/advisory/ntap-20240216-0009/" } ], "cvssDetails": [ - { - "assigner": "Red Hat", - "severity": "medium", - "cvssV3Vector": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H", - "cvssV3BaseScore": 5.9, - "modificationTime": "2024-01-10T13:34:49.407262Z" - }, { "assigner": "SUSE", "severity": "medium", "cvssV3Vector": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:L", "cvssV3BaseScore": 6.5, - "modificationTime": "2024-01-23T11:03:54.062787Z" + "modificationTime": "2024-03-11T09:49:44.514581Z" }, { "assigner": "NVD", "severity": "medium", "cvssV3Vector": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:H", "cvssV3BaseScore": 6.5, - "modificationTime": "2024-01-24T01:11:18.316654Z" + "modificationTime": "2024-03-11T09:49:47.519039Z" + }, + { + "assigner": "Red Hat", + "severity": "medium", + "cvssV3Vector": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:H", + "cvssV3BaseScore": 6.5, + "modificationTime": "2024-03-11T09:49:50.449769Z" } ], - "description": "## NVD Description\n**_Note:_** _Versions mentioned in the description apply only to the upstream `openssl` package and not the `openssl` package as distributed by `Alpine`._\n_See `How to fix?` for `Alpine:3.19` relevant fixed versions and status._\n\nIssue summary: The POLY1305 MAC (message authentication code) implementation\ncontains a bug that might corrupt the internal state of applications running\non PowerPC CPU based platforms if the CPU provides vector instructions.\n\nImpact summary: If an attacker can influence whether the POLY1305 MAC\nalgorithm is used, the application state might be corrupted with various\napplication dependent consequences.\n\nThe POLY1305 MAC (message authentication code) implementation in OpenSSL for\nPowerPC CPUs restores the contents of vector registers in a different order\nthan they are saved. Thus the contents of some of these vector registers\nare corrupted when returning to the caller. The vulnerable code is used only\non newer PowerPC processors supporting the PowerISA 2.07 instructions.\n\nThe consequences of this kind of internal application state corruption can\nbe various - from no consequences, if the calling application does not\ndepend on the contents of non-volatile XMM registers at all, to the worst\nconsequences, where the attacker could get complete control of the application\nprocess. However unless the compiler uses the vector registers for storing\npointers, the most likely consequence, if any, would be an incorrect result\nof some application dependent calculations or a crash leading to a denial of\nservice.\n\nThe POLY1305 MAC algorithm is most frequently used as part of the\nCHACHA20-POLY1305 AEAD (authenticated encryption with associated data)\nalgorithm. The most common usage of this AEAD cipher is with TLS protocol\nversions 1.2 and 1.3. If this cipher is enabled on the server a malicious\nclient can influence whether this AEAD cipher is used. This implies that\nTLS server applications using OpenSSL can be potentially impacted. However\nwe are currently not aware of any concrete application that would be affected\nby this issue therefore we consider this a Low severity security issue.\n## Remediation\nUpgrade `Alpine:3.19` `openssl` to version 3.1.4-r3 or higher.\n## References\n- [openssl-security@openssl.org](https://github.com/openssl/openssl/commit/050d26383d4e264966fb83428e72d5d48f402d35)\n- [openssl-security@openssl.org](https://github.com/openssl/openssl/commit/5b139f95c9a47a55a0c54100f3837b1eee942b04)\n- [openssl-security@openssl.org](https://github.com/openssl/openssl/commit/f3fc5808fe9ff74042d639839610d03b8fdcc015)\n- [openssl-security@openssl.org](https://www.openssl.org/news/secadv/20240109.txt)\n- [openssl-security@openssl.org](http://www.openwall.com/lists/oss-security/2024/01/09/1)\n", + "description": "## NVD Description\n**_Note:_** _Versions mentioned in the description apply only to the upstream `openssl` package and not the `openssl` package as distributed by `Alpine`._\n_See `How to fix?` for `Alpine:3.19` relevant fixed versions and status._\n\nIssue summary: The POLY1305 MAC (message authentication code) implementation\ncontains a bug that might corrupt the internal state of applications running\non PowerPC CPU based platforms if the CPU provides vector instructions.\n\nImpact summary: If an attacker can influence whether the POLY1305 MAC\nalgorithm is used, the application state might be corrupted with various\napplication dependent consequences.\n\nThe POLY1305 MAC (message authentication code) implementation in OpenSSL for\nPowerPC CPUs restores the contents of vector registers in a different order\nthan they are saved. Thus the contents of some of these vector registers\nare corrupted when returning to the caller. The vulnerable code is used only\non newer PowerPC processors supporting the PowerISA 2.07 instructions.\n\nThe consequences of this kind of internal application state corruption can\nbe various - from no consequences, if the calling application does not\ndepend on the contents of non-volatile XMM registers at all, to the worst\nconsequences, where the attacker could get complete control of the application\nprocess. However unless the compiler uses the vector registers for storing\npointers, the most likely consequence, if any, would be an incorrect result\nof some application dependent calculations or a crash leading to a denial of\nservice.\n\nThe POLY1305 MAC algorithm is most frequently used as part of the\nCHACHA20-POLY1305 AEAD (authenticated encryption with associated data)\nalgorithm. The most common usage of this AEAD cipher is with TLS protocol\nversions 1.2 and 1.3. If this cipher is enabled on the server a malicious\nclient can influence whether this AEAD cipher is used. This implies that\nTLS server applications using OpenSSL can be potentially impacted. However\nwe are currently not aware of any concrete application that would be affected\nby this issue therefore we consider this a Low severity security issue.\n## Remediation\nUpgrade `Alpine:3.19` `openssl` to version 3.1.4-r3 or higher.\n## References\n- [openssl-security@openssl.org](https://github.com/openssl/openssl/commit/050d26383d4e264966fb83428e72d5d48f402d35)\n- [openssl-security@openssl.org](https://github.com/openssl/openssl/commit/5b139f95c9a47a55a0c54100f3837b1eee942b04)\n- [openssl-security@openssl.org](https://github.com/openssl/openssl/commit/f3fc5808fe9ff74042d639839610d03b8fdcc015)\n- [openssl-security@openssl.org](https://www.openssl.org/news/secadv/20240109.txt)\n- [openssl-security@openssl.org](http://www.openwall.com/lists/oss-security/2024/01/09/1)\n- [openssl-security@openssl.org](https://security.netapp.com/advisory/ntap-20240216-0009/)\n", "epssDetails": { - "percentile": "0.12098", - "probability": "0.00045", + "percentile": "0.23728", + "probability": "0.00061", "modelVersion": "v2023.03.01" }, "identifiers": { @@ -180,7 +184,149 @@ "disclosureTime": "2024-01-09T17:15:12.147000Z", "packageManager": "alpine:3.19", "publicationTime": "2024-01-10T02:59:36.982837Z", - "modificationTime": "2024-01-24T01:11:18.316654Z", + "modificationTime": "2024-03-11T09:49:50.449769Z", + "socialTrendAlert": false, + "relativeImportance": null, + "severityWithCritical": "medium" + }, + "SNYK-ALPINE319-OPENSSL-6159994": { + "id": "SNYK-ALPINE319-OPENSSL-6159994", + "cpes": [], + "title": "CVE-2023-6237", + "CVSSv3": null, + "credit": [""], + "semver": { "vulnerable": ["<3.1.4-r4"] }, + "exploit": "Not Defined", + "fixedIn": ["3.1.4-r4"], + "patches": [], + "insights": { "triageAdvice": null }, + "language": "linux", + "severity": "low", + "cvssScore": null, + "malicious": false, + "isDisputed": false, + "references": [], + "cvssDetails": [ + { + "assigner": "Red Hat", + "severity": "medium", + "cvssV3Vector": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H", + "cvssV3BaseScore": 5.9, + "modificationTime": "2024-01-16T13:32:46.781382Z" + }, + { + "assigner": "SUSE", + "severity": "medium", + "cvssV3Vector": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H", + "cvssV3BaseScore": 5.9, + "modificationTime": "2024-01-23T11:03:54.426940Z" + } + ], + "description": "## NVD Description\n_This vulnerability has not been analyzed by NVD yet._\n\n## Remediation\nUpgrade `Alpine:3.19` `openssl` to version 3.1.4-r4 or higher.\n", + "epssDetails": null, + "identifiers": { + "CVE": ["CVE-2023-6237"], + "CWE": [], + "ALTERNATIVE": [] + }, + "nvdSeverity": null, + "packageName": "openssl", + "creationTime": "2024-01-17T03:01:42.989847Z", + "disclosureTime": null, + "packageManager": "alpine:3.19", + "publicationTime": "2024-01-17T03:01:42.996770Z", + "modificationTime": "2024-01-23T11:03:54.426940Z", + "socialTrendAlert": false, + "relativeImportance": null, + "severityWithCritical": "low" + }, + "SNYK-ALPINE319-OPENSSL-6191693": { + "id": "SNYK-ALPINE319-OPENSSL-6191693", + "cpes": [], + "title": "CVE-2024-0727", + "CVSSv3": "CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:H", + "credit": [""], + "semver": { "vulnerable": ["<3.1.4-r5"] }, + "exploit": "Not Defined", + "fixedIn": ["3.1.4-r5"], + "patches": [], + "insights": { "triageAdvice": null }, + "language": "linux", + "severity": "medium", + "cvssScore": 5.5, + "malicious": false, + "isDisputed": false, + "references": [ + { + "url": "https://github.com/openssl/openssl/commit/09df4395b5071217b76dc7d3d2e630eb8c5a79c2", + "title": "https://github.com/openssl/openssl/commit/09df4395b5071217b76dc7d3d2e630eb8c5a79c2" + }, + { + "url": "https://github.com/openssl/openssl/commit/775acfdbd0c6af9ac855f34969cdab0c0c90844a", + "title": "https://github.com/openssl/openssl/commit/775acfdbd0c6af9ac855f34969cdab0c0c90844a" + }, + { + "url": "https://github.com/openssl/openssl/commit/d135eeab8a5dbf72b3da5240bab9ddb7678dbd2c", + "title": "https://github.com/openssl/openssl/commit/d135eeab8a5dbf72b3da5240bab9ddb7678dbd2c" + }, + { + "url": "https://github.openssl.org/openssl/extended-releases/commit/03b3941d60c4bce58fab69a0c22377ab439bc0e8", + "title": "https://github.openssl.org/openssl/extended-releases/commit/03b3941d60c4bce58fab69a0c22377ab439bc0e8" + }, + { + "url": "https://github.openssl.org/openssl/extended-releases/commit/aebaa5883e31122b404e450732dc833dc9dee539", + "title": "https://github.openssl.org/openssl/extended-releases/commit/aebaa5883e31122b404e450732dc833dc9dee539" + }, + { + "url": "https://www.openssl.org/news/secadv/20240125.txt", + "title": "https://www.openssl.org/news/secadv/20240125.txt" + }, + { + "url": "https://security.netapp.com/advisory/ntap-20240208-0006/", + "title": "https://security.netapp.com/advisory/ntap-20240208-0006/" + } + ], + "cvssDetails": [ + { + "assigner": "NVD", + "severity": "medium", + "cvssV3Vector": "CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:H", + "cvssV3BaseScore": 5.5, + "modificationTime": "2024-03-11T09:51:16.811770Z" + }, + { + "assigner": "SUSE", + "severity": "low", + "cvssV3Vector": "CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:L", + "cvssV3BaseScore": 3.3, + "modificationTime": "2024-03-11T09:52:24.758887Z" + }, + { + "assigner": "Red Hat", + "severity": "medium", + "cvssV3Vector": "CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:H", + "cvssV3BaseScore": 5.5, + "modificationTime": "2024-03-11T09:52:48.499358Z" + } + ], + "description": "## NVD Description\n**_Note:_** _Versions mentioned in the description apply only to the upstream `openssl` package and not the `openssl` package as distributed by `Alpine`._\n_See `How to fix?` for `Alpine:3.19` relevant fixed versions and status._\n\nIssue summary: Processing a maliciously formatted PKCS12 file may lead OpenSSL\nto crash leading to a potential Denial of Service attack\n\nImpact summary: Applications loading files in the PKCS12 format from untrusted\nsources might terminate abruptly.\n\nA file in PKCS12 format can contain certificates and keys and may come from an\nuntrusted source. The PKCS12 specification allows certain fields to be NULL, but\nOpenSSL does not correctly check for this case. This can lead to a NULL pointer\ndereference that results in OpenSSL crashing. If an application processes PKCS12\nfiles from an untrusted source using the OpenSSL APIs then that application will\nbe vulnerable to this issue.\n\nOpenSSL APIs that are vulnerable to this are: PKCS12_parse(),\nPKCS12_unpack_p7data(), PKCS12_unpack_p7encdata(), PKCS12_unpack_authsafes()\nand PKCS12_newpass().\n\nWe have also fixed a similar issue in SMIME_write_PKCS7(). However since this\nfunction is related to writing data we do not consider it security significant.\n\nThe FIPS modules in 3.2, 3.1 and 3.0 are not affected by this issue.\n## Remediation\nUpgrade `Alpine:3.19` `openssl` to version 3.1.4-r5 or higher.\n## References\n- [openssl-security@openssl.org](https://github.com/openssl/openssl/commit/09df4395b5071217b76dc7d3d2e630eb8c5a79c2)\n- [openssl-security@openssl.org](https://github.com/openssl/openssl/commit/775acfdbd0c6af9ac855f34969cdab0c0c90844a)\n- [openssl-security@openssl.org](https://github.com/openssl/openssl/commit/d135eeab8a5dbf72b3da5240bab9ddb7678dbd2c)\n- [openssl-security@openssl.org](https://github.openssl.org/openssl/extended-releases/commit/03b3941d60c4bce58fab69a0c22377ab439bc0e8)\n- [openssl-security@openssl.org](https://github.openssl.org/openssl/extended-releases/commit/aebaa5883e31122b404e450732dc833dc9dee539)\n- [openssl-security@openssl.org](https://www.openssl.org/news/secadv/20240125.txt)\n- [openssl-security@openssl.org](https://security.netapp.com/advisory/ntap-20240208-0006/)\n", + "epssDetails": { + "percentile": "0.60188", + "probability": "0.00228", + "modelVersion": "v2023.03.01" + }, + "identifiers": { + "CVE": ["CVE-2024-0727"], + "CWE": [], + "ALTERNATIVE": [] + }, + "nvdSeverity": "medium", + "packageName": "openssl", + "creationTime": "2024-01-26T03:03:11.579088Z", + "disclosureTime": "2024-01-26T09:15:07.637000Z", + "packageManager": "alpine:3.19", + "publicationTime": "2024-01-26T03:03:11.584623Z", + "modificationTime": "2024-03-11T09:52:48.499358Z", "socialTrendAlert": false, "relativeImportance": null, "severityWithCritical": "medium" @@ -196,7 +342,7 @@ "upgradePaths": [ { "path": [ - { "name": "docker-image|alpine", "version": "latest" }, + { "name": "docker-image|alpine", "version": "3.19.0" }, { "name": "openssl/libcrypto3", "version": "3.1.4-r2", @@ -240,6 +386,112 @@ "isPinnable": false } }, + { + "pkgName": "openssl/libcrypto3", + "pkgVersion": "3.1.4-r2", + "issueId": "SNYK-ALPINE319-OPENSSL-6159994", + "fixInfo": { + "isPatchable": false, + "upgradePaths": [ + { + "path": [ + { "name": "docker-image|alpine", "version": "3.19.0" }, + { + "name": "openssl/libcrypto3", + "version": "3.1.4-r2", + "newVersion": "3.1.4-r4" + } + ] + }, + { + "path": [ + { "name": "apk-tools/apk-tools", "version": "2.14.0-r5" }, + { + "name": "openssl/libcrypto3", + "version": "3.1.4-r2", + "newVersion": "3.1.4-r4" + } + ] + }, + { + "path": [ + { "name": "busybox/ssl_client", "version": "1.36.1-r15" }, + { + "name": "openssl/libcrypto3", + "version": "3.1.4-r2", + "newVersion": "3.1.4-r4" + } + ] + }, + { + "path": [ + { "name": "openssl/libssl3", "version": "3.1.4-r2" }, + { + "name": "openssl/libcrypto3", + "version": "3.1.4-r2", + "newVersion": "3.1.4-r4" + } + ] + } + ], + "nearestFixedInVersion": "3.1.4-r4", + "isRuntime": false, + "isPinnable": false + } + }, + { + "pkgName": "openssl/libcrypto3", + "pkgVersion": "3.1.4-r2", + "issueId": "SNYK-ALPINE319-OPENSSL-6191693", + "fixInfo": { + "isPatchable": false, + "upgradePaths": [ + { + "path": [ + { "name": "docker-image|alpine", "version": "3.19.0" }, + { + "name": "openssl/libcrypto3", + "version": "3.1.4-r2", + "newVersion": "3.1.4-r5" + } + ] + }, + { + "path": [ + { "name": "apk-tools/apk-tools", "version": "2.14.0-r5" }, + { + "name": "openssl/libcrypto3", + "version": "3.1.4-r2", + "newVersion": "3.1.4-r5" + } + ] + }, + { + "path": [ + { "name": "busybox/ssl_client", "version": "1.36.1-r15" }, + { + "name": "openssl/libcrypto3", + "version": "3.1.4-r2", + "newVersion": "3.1.4-r5" + } + ] + }, + { + "path": [ + { "name": "openssl/libssl3", "version": "3.1.4-r2" }, + { + "name": "openssl/libcrypto3", + "version": "3.1.4-r2", + "newVersion": "3.1.4-r5" + } + ] + } + ], + "nearestFixedInVersion": "3.1.4-r5", + "isRuntime": false, + "isPinnable": false + } + }, { "pkgName": "openssl/libssl3", "pkgVersion": "3.1.4-r2", @@ -249,7 +501,7 @@ "upgradePaths": [ { "path": [ - { "name": "docker-image|alpine", "version": "latest" }, + { "name": "docker-image|alpine", "version": "3.19.0" }, { "name": "openssl/libssl3", "version": "3.1.4-r2", @@ -282,9 +534,113 @@ "isRuntime": false, "isPinnable": false } + }, + { + "pkgName": "openssl/libssl3", + "pkgVersion": "3.1.4-r2", + "issueId": "SNYK-ALPINE319-OPENSSL-6159994", + "fixInfo": { + "isPatchable": false, + "upgradePaths": [ + { + "path": [ + { "name": "docker-image|alpine", "version": "3.19.0" }, + { + "name": "openssl/libssl3", + "version": "3.1.4-r2", + "newVersion": "3.1.4-r4" + } + ] + }, + { + "path": [ + { "name": "apk-tools/apk-tools", "version": "2.14.0-r5" }, + { + "name": "openssl/libssl3", + "version": "3.1.4-r2", + "newVersion": "3.1.4-r4" + } + ] + }, + { + "path": [ + { "name": "busybox/ssl_client", "version": "1.36.1-r15" }, + { + "name": "openssl/libssl3", + "version": "3.1.4-r2", + "newVersion": "3.1.4-r4" + } + ] + } + ], + "nearestFixedInVersion": "3.1.4-r4", + "isRuntime": false, + "isPinnable": false + } + }, + { + "pkgName": "openssl/libssl3", + "pkgVersion": "3.1.4-r2", + "issueId": "SNYK-ALPINE319-OPENSSL-6191693", + "fixInfo": { + "isPatchable": false, + "upgradePaths": [ + { + "path": [ + { "name": "docker-image|alpine", "version": "3.19.0" }, + { + "name": "openssl/libssl3", + "version": "3.1.4-r2", + "newVersion": "3.1.4-r5" + } + ] + }, + { + "path": [ + { "name": "apk-tools/apk-tools", "version": "2.14.0-r5" }, + { + "name": "openssl/libssl3", + "version": "3.1.4-r2", + "newVersion": "3.1.4-r5" + } + ] + }, + { + "path": [ + { "name": "busybox/ssl_client", "version": "1.36.1-r15" }, + { + "name": "openssl/libssl3", + "version": "3.1.4-r2", + "newVersion": "3.1.4-r5" + } + ] + } + ], + "nearestFixedInVersion": "3.1.4-r5", + "isRuntime": false, + "isPinnable": false + } } ], - "docker": {}, + "docker": { + "baseImage": "alpine:3.19.0", + "baseImageRemediation": { + "code": "REMEDIATION_AVAILABLE", + "advice": [ + { + "message": "Base Image Vulnerabilities Severity\nalpine:3.19.0 3 0 critical, 0 high, 2 medium, 1 low\n" + }, + { + "message": "Recommendations for base image upgrade:\n", + "bold": true + }, + { "message": "Minor upgrades", "bold": true }, + { + "message": "Base Image Vulnerabilities Severity\nalpine:3.19.1 0 0 critical, 0 high, 0 medium, 0 low\n" + } + ] + } + }, "depGraphData": { "schemaVersion": "1.3.0", "pkgManager": { @@ -293,8 +649,8 @@ }, "pkgs": [ { - "id": "docker-image|alpine@latest", - "info": { "name": "docker-image|alpine", "version": "latest" } + "id": "docker-image|alpine@3.19.0", + "info": { "name": "docker-image|alpine", "version": "3.19.0" } }, { "id": "alpine-baselayout/alpine-baselayout-data@3.4.3-r2", @@ -374,7 +730,7 @@ "nodes": [ { "nodeId": "root-node", - "pkgId": "docker-image|alpine@latest", + "pkgId": "docker-image|alpine@3.19.0", "deps": [ { "nodeId": "alpine-baselayout/alpine-baselayout@3.4.3-r2" }, { "nodeId": "alpine-baselayout/alpine-baselayout-data@3.4.3-r2" }, diff --git a/test/jest/acceptance/cli-json-output.spec.ts b/test/jest/acceptance/cli-json-output.spec.ts index b877e2abfd..7990d49033 100644 --- a/test/jest/acceptance/cli-json-output.spec.ts +++ b/test/jest/acceptance/cli-json-output.spec.ts @@ -1,6 +1,7 @@ import { fakeServer } from '../../acceptance/fake-server'; import { createProjectFromWorkspace } from '../util/createProject'; import { runSnykCLI } from '../util/runSnykCLI'; +import * as Parser from 'jsonparse'; jest.setTimeout(1000 * 60); @@ -76,4 +77,59 @@ describe('test --json', () => { expect(code).toEqual(1); expect(stdout).not.toBe(''); }); + + describe('handling responses larger than 512Mb string size limit in v8', () => { + it('container test --json', async () => { + const expectedReferenceNumber = 420000; + const issueID = 'SNYK-ALPINE319-OPENSSL-6148881'; + const project = await createProjectFromWorkspace( + 'extra-large-response-payload', + ); + const response = await project.readJSON('vulns-result.json'); + const reference = response.result.issuesData[issueID].references[0]; + response.result.issuesData[issueID].references = new Array( + expectedReferenceNumber, + ).fill(reference); + + server.setCustomResponse(response); + + const imageName = 'hello-world:latest'; + const { code, stdoutBuffer, stderrBuffer } = await runSnykCLI( + `container test --platform=linux/amd64 ${imageName} --json`, + { + cwd: project.path(), + env, + bufferOutput: true, + }, + ); + + if (stderrBuffer && stderrBuffer.length > 0) + console.log(stderrBuffer?.toString('utf8')); + + let hasExpectedPathString = false; + let hasExpectedVulnerabilitiesString = false; + let hasReferenceCount = false; + + const p = new Parser(); + p.onValue = function(value) { + if (this.key === 'path' && value === imageName) { + hasExpectedPathString = true; + } else if (this.key === 'vulnerabilities') { + hasExpectedVulnerabilitiesString = true; + } else if ( + this.key === 'references' && + value.length === expectedReferenceNumber + ) { + hasReferenceCount = true; + } + }; + + p.write(stdoutBuffer); + + expect(code).toEqual(1); + expect(hasExpectedVulnerabilitiesString).toBeTruthy(); + expect(hasExpectedPathString).toBeTruthy(); + expect(hasReferenceCount).toBeTruthy(); + }, 120000); + }); }); diff --git a/test/jest/unit/json.spec.ts b/test/jest/unit/json.spec.ts index 3ec983d43c..5a98fe0ce4 100644 --- a/test/jest/unit/json.spec.ts +++ b/test/jest/unit/json.spec.ts @@ -10,24 +10,6 @@ describe('jsonStringifyLargeObject', () => { expect(s).toEqual('{\n "name": "Mozart",\n "isGoodBoy": true\n}'); }); - it('fallsback on non-pretty-print on very large object', () => { - const largeObject = { - name: 'Brian', - isGoodBoy: true, - type: 'big', - }; - const jsonStringifyMock = jest - .spyOn(JSON, 'stringify') - // eslint-disable-next-line @typescript-eslint/no-unused-vars - .mockImplementationOnce(() => { - throw new Error('fake error to simulate an `Invalid string length`'); - }); - - const s = jsonStringifyLargeObject(largeObject); - expect(jsonStringifyMock).toHaveBeenCalledTimes(2); - expect(s).toEqual(`{"name":"Brian","isGoodBoy":true,"type":"big"}`); - }); - it('returns empty string on fallback failure', () => { const largeObject = { name: 'Brian', diff --git a/test/jest/util/runCommand.ts b/test/jest/util/runCommand.ts index 2f35e6b441..084dea896c 100644 --- a/test/jest/util/runCommand.ts +++ b/test/jest/util/runCommand.ts @@ -5,9 +5,13 @@ type RunCommandResult = { code: number; stdout: string; stderr: string; + stdoutBuffer?: Buffer; + stderrBuffer?: Buffer; }; -type RunCommandOptions = SpawnOptionsWithoutStdio; +// bufferOutput sets the RunCommandResult stdoutBuffer and stderrBuffer +// useful if the stdout or stderr string output is too large for the v8 engine +type RunCommandOptions = SpawnOptionsWithoutStdio & { bufferOutput?: boolean }; const runCommand = ( command: string, @@ -32,11 +36,21 @@ const runCommand = ( }); child.on('close', (code) => { - resolve({ + const result: RunCommandResult = { code: code || 0, - stdout: Buffer.concat(stdout).toString('utf-8'), - stderr: Buffer.concat(stderr).toString('utf-8'), - }); + stdout: '', + stderr: '', + }; + + if (options?.bufferOutput) { + result.stdoutBuffer = Buffer.concat(stdout); + result.stderrBuffer = Buffer.concat(stderr); + } else { + result.stdout = Buffer.concat(stdout).toString('utf-8'); + result.stderr = Buffer.concat(stderr).toString('utf-8'); + } + + resolve(result); }); }); }; diff --git a/test/setup.js b/test/setup.js index aff0cdec59..e94c0b170c 100644 --- a/test/setup.js +++ b/test/setup.js @@ -18,10 +18,15 @@ module.exports = async function() { token = '***'; } + const { stdout: version } = await runSnykCLI('version'); + const SNYK_VERSION = version.trim(); + console.info( '\n------------------------------------------------------------------------------------------------------' + '\n Binary under test [TEST_SNYK_COMMAND] .............. ' + process.env.TEST_SNYK_COMMAND + + '\n Version under test .................................. ' + + SNYK_VERSION + '\n Allow to skip tests [TEST_SNYK_DONT_SKIP_ANYTHING] ... ' + !isDontSkipTestsEnabled() + '\n Run FIPS tests [TEST_SNYK_FIPS] ................. ' + From c55af61d0c76256605bf1f5780d9082f85a84120 Mon Sep 17 00:00:00 2001 From: PeterSchafer <101886095+PeterSchafer@users.noreply.github.com> Date: Fri, 22 Mar 2024 19:12:21 +0100 Subject: [PATCH 19/58] fix(ci): add missing node types (#5129) --- check-dependencies.config.ts | 1 + package-lock.json | 46 +++++++++++++++++++++++++++++ packages/cli-alert/package.json | 3 ++ packages/iac-cli-alert/package.json | 1 + 4 files changed, 51 insertions(+) diff --git a/check-dependencies.config.ts b/check-dependencies.config.ts index fa8e5498df..ed05874e80 100644 --- a/check-dependencies.config.ts +++ b/check-dependencies.config.ts @@ -11,6 +11,7 @@ export const config: Options = { 'conventional-changelog-cli', // used for generating release notes 'ts-node', // used for various scripts to avoid separate compile step 'jest-junit', // used for CI test reporting + '@types/node', // node types used for alerts ], ignoreDirs: ['node_modules', 'dist', 'fixtures', 'test-output'], }; diff --git a/package-lock.json b/package-lock.json index 4e7acfe462..a70a34bf7e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24705,6 +24705,18 @@ "@pagerduty/pdjs": "^2.2.0", "@slack/webhook": "7.0.2", "typescript": "^4.0.2" + }, + "devDependencies": { + "@types/node": "^20.11.30" + } + }, + "packages/cli-alert/node_modules/@types/node": { + "version": "20.11.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.30.tgz", + "integrity": "sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" } }, "packages/iac-cli-alert": { @@ -24716,9 +24728,19 @@ "@slack/webhook": "7.0.2" }, "devDependencies": { + "@types/node": "^20.11.30", "typescript": "^4.0.2" } }, + "packages/iac-cli-alert/node_modules/@types/node": { + "version": "20.11.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.30.tgz", + "integrity": "sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, "packages/snyk-fix": { "name": "@snyk/fix", "version": "1.0.0-monorepo", @@ -26961,7 +26983,19 @@ "@octokit/rest": "^18.0.5", "@pagerduty/pdjs": "^2.2.0", "@slack/webhook": "7.0.2", + "@types/node": "^20.11.30", "typescript": "^4.0.2" + }, + "dependencies": { + "@types/node": { + "version": "20.11.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.30.tgz", + "integrity": "sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==", + "dev": true, + "requires": { + "undici-types": "~5.26.4" + } + } } }, "@snyk/cli-interface": { @@ -27331,7 +27365,19 @@ "requires": { "@octokit/rest": "^18.0.5", "@slack/webhook": "7.0.2", + "@types/node": "^20.11.30", "typescript": "^4.0.2" + }, + "dependencies": { + "@types/node": { + "version": "20.11.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.30.tgz", + "integrity": "sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==", + "dev": true, + "requires": { + "undici-types": "~5.26.4" + } + } } }, "@snyk/mix-parser": { diff --git a/packages/cli-alert/package.json b/packages/cli-alert/package.json index 6429a3bf83..3285406cd7 100644 --- a/packages/cli-alert/package.json +++ b/packages/cli-alert/package.json @@ -17,5 +17,8 @@ "@pagerduty/pdjs": "^2.2.0", "@slack/webhook": "7.0.2", "typescript": "^4.0.2" + }, + "devDependencies": { + "@types/node": "^20.11.30" } } diff --git a/packages/iac-cli-alert/package.json b/packages/iac-cli-alert/package.json index f9108ec043..aa84e50113 100644 --- a/packages/iac-cli-alert/package.json +++ b/packages/iac-cli-alert/package.json @@ -17,6 +17,7 @@ "@slack/webhook": "7.0.2" }, "devDependencies": { + "@types/node": "^20.11.30", "typescript": "^4.0.2" } } From b22b1667ff87d5a48f6b0d36a1f42f4cd67d0990 Mon Sep 17 00:00:00 2001 From: Daniel Ekelund Date: Mon, 25 Mar 2024 10:16:15 +0100 Subject: [PATCH 20/58] feat: support CycloneDX v1.5 (#5123) - Updated `snyk sbom` to accept CycloneDX 1.5 - Updated `snyk container sbom` to accept CycloneDX 1.5 Co-authored-by: Paul Rosca --- cliv2/go.mod | 4 +- cliv2/go.sum | 8 +-- test/acceptance/fake-server.ts | 68 +++++++++++++------ .../snyk-container/container.spec.ts | 59 +++++++++++++++- test/jest/acceptance/snyk-sbom/sbom.spec.ts | 68 ++++++++++++++++++- 5 files changed, 174 insertions(+), 33 deletions(-) diff --git a/cliv2/go.mod b/cliv2/go.mod index 7fb24485a5..b9b4d6aa2e 100644 --- a/cliv2/go.mod +++ b/cliv2/go.mod @@ -11,8 +11,8 @@ require ( github.com/rs/zerolog v1.32.0 github.com/snyk/cli-extension-dep-graph v0.0.0-20230926124856-b0fdf1ee6f73 github.com/snyk/cli-extension-iac-rules v0.0.0-20230601153200-c572cfce46ce - github.com/snyk/cli-extension-sbom v0.0.0-20231123083311-52b1cecc1a7a - github.com/snyk/container-cli v0.0.0-20230920093251-fe865879a91f + github.com/snyk/cli-extension-sbom v0.0.0-20240314090036-46535b380426 + github.com/snyk/container-cli v0.0.0-20240322120441-6d9b9482f9b1 github.com/snyk/go-application-framework v0.0.0-20240320144631-1935b2cb624e github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65 github.com/snyk/snyk-iac-capture v0.6.5 diff --git a/cliv2/go.sum b/cliv2/go.sum index 457963e0e2..4fced89d02 100644 --- a/cliv2/go.sum +++ b/cliv2/go.sum @@ -654,12 +654,12 @@ github.com/snyk/cli-extension-dep-graph v0.0.0-20230926124856-b0fdf1ee6f73 h1:rw github.com/snyk/cli-extension-dep-graph v0.0.0-20230926124856-b0fdf1ee6f73/go.mod h1:QF3v8HBpOpyudYNCuR8LqfULutO76c91sBdLzD+pBJU= github.com/snyk/cli-extension-iac-rules v0.0.0-20230601153200-c572cfce46ce h1:WchwuyPX4mEr7tFCGD6EsjwTDipFWfLxs4Wps6KB3b4= github.com/snyk/cli-extension-iac-rules v0.0.0-20230601153200-c572cfce46ce/go.mod h1:5/IYYTgf32pST7St4GhS3KNz32WE17Ys+Hdb5Pqxex0= -github.com/snyk/cli-extension-sbom v0.0.0-20231123083311-52b1cecc1a7a h1:oRrk9bvMXdAVhRt84Y8G06+Op7fYQYrRuslngG9BPZk= -github.com/snyk/cli-extension-sbom v0.0.0-20231123083311-52b1cecc1a7a/go.mod h1:IwRGWjRuNkY08O7NJb7u3JuQkroEB8Qi1MlASpZVu1Q= +github.com/snyk/cli-extension-sbom v0.0.0-20240314090036-46535b380426 h1:MXbip3nmiOym3/9bNWlPISVOAEAAz4FDcPvqOMPcCc4= +github.com/snyk/cli-extension-sbom v0.0.0-20240314090036-46535b380426/go.mod h1:g2VgZU79btvZrAP3oHZGv3tHD9POVOx5a3DY894rS4w= github.com/snyk/code-client-go v0.3.1 h1:jCYBRJJ/qVlPRqJONwmwpMCMe7s/lulbJQE6KUe2DW0= github.com/snyk/code-client-go v0.3.1/go.mod h1:D+cfqDbuZE1S106bY3Tr+ZXLb9BR16kKBtvlf0xdyNA= -github.com/snyk/container-cli v0.0.0-20230920093251-fe865879a91f h1:ghajT5PEiLP8XNFIdc7Yn4Th74RH/9Q++dDOp6Cb9eo= -github.com/snyk/container-cli v0.0.0-20230920093251-fe865879a91f/go.mod h1:38w+dcAQp9eG3P5t2eNS9eG0reut10AeJjLv5lJ5lpM= +github.com/snyk/container-cli v0.0.0-20240322120441-6d9b9482f9b1 h1:9RKY9NdX5DrJAoVXDP0JiqrXT+4Nb9NH8pjEcA0NsLA= +github.com/snyk/container-cli v0.0.0-20240322120441-6d9b9482f9b1/go.mod h1:38w+dcAQp9eG3P5t2eNS9eG0reut10AeJjLv5lJ5lpM= github.com/snyk/go-application-framework v0.0.0-20240320144631-1935b2cb624e h1:Cu5BIVoy+s6/oiOd0OAJS02AuJ+jM8FF2RBZ+YoZs80= github.com/snyk/go-application-framework v0.0.0-20240320144631-1935b2cb624e/go.mod h1:Yz/qxFyfhf0xbA+z8Vzr5IM9IDG+BS+2PiGaP1yAsEw= github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65 h1:CEQuYv0Go6MEyRCD3YjLYM2u3Oxkx8GpCpFBd4rUTUk= diff --git a/test/acceptance/fake-server.ts b/test/acceptance/fake-server.ts index 524733491e..fa11825cb8 100644 --- a/test/acceptance/fake-server.ts +++ b/test/acceptance/fake-server.ts @@ -553,33 +553,57 @@ export const fakeServer = (basePath: string, snykToken: string): FakeServer => { (req, res) => { const depGraph: void | Record = req.body.depGraph; const depGraphs: void | Record[] = req.body.depGraphs; - const tools: void | Record[] = req.body.tools; - let bom: Record = { bomFormat: 'CycloneDX' }; + const tools = req.body.tools || []; + let name = ''; + let components; + + let bom: Record = { bomFormat: 'CycloneDX' }; if (Array.isArray(depGraphs) && req.body.subject) { // Return a fixture of an all-projects SBOM. - bom = { - ...bom, - metadata: { component: { name: req.body.subject.name } }, - components: depGraphs - .flatMap(({ pkgs }) => pkgs) - .map(({ info: { name } }) => ({ name })), - }; - } - - if (depGraph) { - bom = { - ...bom, - metadata: { component: { name: depGraph.pkgs[0]?.info.name } }, - components: depGraph.pkgs.map(({ info: { name } }) => ({ name })), - }; + name = req.body.subject.name; + components = depGraphs + .flatMap(({ pkgs }) => pkgs) + .map(({ info: { name } }) => ({ name })); + } else if (depGraph) { + name = depGraph.pkgs[0]?.info.name; + components = depGraph.pkgs.map(({ info: { name } }) => ({ name })); } - if (Array.isArray(tools)) { - bom.metadata = { - ...(bom.metadata as any), - tools: [...tools, { name: 'fake-server' }], - }; + switch (req.query.format) { + case 'spdx2.3+json': + bom = { + spdxVersion: 'SPDX-2.3', + name, + packages: components, + creators: [...tools, 'fake-server'], + }; + break; + case 'cyclonedx1.4+json': + bom = { + specVersion: '1.4', + $schema: 'http://cyclonedx.org/schema/bom-1.4.schema.json', + components, + metadata: { + component: { name }, + tools: [...tools, { name: 'fake-server', version: '42' }], + }, + }; + break; + case 'cyclonedx1.5+json': + bom = { + specVersion: '1.5', + $schema: 'http://cyclonedx.org/schema/bom-1.5.schema.json', + components, + metadata: { + component: { name }, + tools: { + components: [...tools, { name: 'fake-server' }], + services: [{ name: 'fake-server', version: '42' }], + }, + }, + }; + break; } res.status(200).send(bom); diff --git a/test/jest/acceptance/snyk-container/container.spec.ts b/test/jest/acceptance/snyk-container/container.spec.ts index 6935d66bed..19122973fd 100644 --- a/test/jest/acceptance/snyk-container/container.spec.ts +++ b/test/jest/acceptance/snyk-container/container.spec.ts @@ -185,7 +185,7 @@ DepGraph end`, }); }); - it('should print sbom for image', async () => { + it('should print sbom for image - spdx', async () => { const { code, stdout, @@ -201,7 +201,62 @@ DepGraph end`, expect(() => { sbom = JSON.parse(stdout); }).not.toThrow(); - expect(sbom.metadata.component.name).toEqual('gcr.io/distroless/static'); + expect(sbom.name).toEqual('gcr.io/distroless/static'); + expect(sbom.spdxVersion).toEqual('SPDX-2.3'); + expect(sbom.packages).toHaveLength( + TEST_DISTROLESS_STATIC_IMAGE_DEPGRAPH.pkgs.length, + ); + }); + + it('should print sbom for image - cyclonedx 1.4', async () => { + const { + code, + stdout, + stderr, + } = await runSnykCLIWithDebug( + `container sbom --org=aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee --format=cyclonedx1.4+json ${TEST_DISTROLESS_STATIC_IMAGE}`, + { env }, + ); + + let sbom: any; + assertCliExitCode(code, 0, stderr); + + expect(() => { + sbom = JSON.parse(stdout); + }).not.toThrow(); + + expect(sbom.specVersion).toEqual('1.4'); + expect(sbom['$schema']).toEqual( + 'http://cyclonedx.org/schema/bom-1.4.schema.json', + ); + + expect(sbom.components).toHaveLength( + TEST_DISTROLESS_STATIC_IMAGE_DEPGRAPH.pkgs.length, + ); + }); + + it('should print sbom for image - cyclonedx 1.5', async () => { + const { + code, + stdout, + stderr, + } = await runSnykCLIWithDebug( + `container sbom --org=aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee --format=cyclonedx1.5+json ${TEST_DISTROLESS_STATIC_IMAGE}`, + { env }, + ); + + let sbom: any; + assertCliExitCode(code, 0, stderr); + + expect(() => { + sbom = JSON.parse(stdout); + }).not.toThrow(); + + expect(sbom.specVersion).toEqual('1.5'); + expect(sbom['$schema']).toEqual( + 'http://cyclonedx.org/schema/bom-1.5.schema.json', + ); + expect(sbom.components).toHaveLength( TEST_DISTROLESS_STATIC_IMAGE_DEPGRAPH.pkgs.length, ); diff --git a/test/jest/acceptance/snyk-sbom/sbom.spec.ts b/test/jest/acceptance/snyk-sbom/sbom.spec.ts index c444e22333..e9ecc5138e 100644 --- a/test/jest/acceptance/snyk-sbom/sbom.spec.ts +++ b/test/jest/acceptance/snyk-sbom/sbom.spec.ts @@ -35,7 +35,7 @@ describe('snyk sbom (mocked server only)', () => { }); }); - test('`sbom` generates an SBOM for a single project', async () => { + test('`sbom` generates an SBOM for a single project - CycloneDX 1.4', async () => { const project = await createProjectFromWorkspace('npm-package'); const { code, stdout } = await runSnykCLI( @@ -45,17 +45,22 @@ describe('snyk sbom (mocked server only)', () => { env, }, ); - let bom; + let bom: any; expect(code).toEqual(0); expect(() => { bom = JSON.parse(stdout); }).not.toThrow(); + + expect(bom.specVersion).toEqual('1.4'); + expect(bom['$schema']).toEqual( + 'http://cyclonedx.org/schema/bom-1.4.schema.json', + ); expect(bom.metadata.component.name).toEqual('npm-package'); expect(bom.components).toHaveLength(3); }); - test('`sbom` includes a tool name in the document', async () => { + test('`sbom` includes a tool name in the document - CycloneDX 1.4', async () => { const project = await createProjectFromWorkspace('npm-package'); const { stdout } = await runSnykCLI( @@ -77,4 +82,61 @@ describe('snyk sbom (mocked server only)', () => { ]), ); }); + + test('`sbom` generates an SBOM for a single project - CycloneDX 1.5', async () => { + const project = await createProjectFromWorkspace('npm-package'); + + const { code, stdout } = await runSnykCLI( + `sbom --org aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee --format cyclonedx1.5+json --debug`, + { + cwd: project.path(), + env, + }, + ); + let bom: any; + + expect(code).toEqual(0); + expect(() => { + bom = JSON.parse(stdout); + }).not.toThrow(); + + expect(bom.specVersion).toEqual('1.5'); + expect(bom['$schema']).toEqual( + 'http://cyclonedx.org/schema/bom-1.5.schema.json', + ); + expect(bom.metadata.component.name).toEqual('npm-package'); + expect(bom.components).toHaveLength(3); + }); + + test('`sbom` includes a tool name in the document - CycloneDX 1.5', async () => { + const project = await createProjectFromWorkspace('npm-package'); + + const { stdout } = await runSnykCLI( + `sbom --org aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee --format cyclonedx1.5+json --debug`, + { + cwd: project.path(), + env, + }, + ); + const bom = JSON.parse(stdout); + + expect(bom.metadata.tools.components).toEqual( + expect.arrayContaining([ + { + vendor: 'Snyk', + name: 'snyk-cli', + version: expect.any(String), + }, + ]), + ); + + expect(bom.metadata.tools.services).toEqual( + expect.arrayContaining([ + { + name: 'fake-server', + version: expect.any(String), + }, + ]), + ); + }); }); From 7c25fdb3e076e9a47ab39d89d99ca9c941baead5 Mon Sep 17 00:00:00 2001 From: PeterSchafer <101886095+PeterSchafer@users.noreply.github.com> Date: Mon, 25 Mar 2024 14:41:26 +0100 Subject: [PATCH 21/58] chore: support feature flags for snyk code test (#5134) --- cliv2/go.mod | 2 +- cliv2/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cliv2/go.mod b/cliv2/go.mod index b9b4d6aa2e..105f4c7348 100644 --- a/cliv2/go.mod +++ b/cliv2/go.mod @@ -13,7 +13,7 @@ require ( github.com/snyk/cli-extension-iac-rules v0.0.0-20230601153200-c572cfce46ce github.com/snyk/cli-extension-sbom v0.0.0-20240314090036-46535b380426 github.com/snyk/container-cli v0.0.0-20240322120441-6d9b9482f9b1 - github.com/snyk/go-application-framework v0.0.0-20240320144631-1935b2cb624e + github.com/snyk/go-application-framework v0.0.0-20240325111322-3ab1f2dfef13 github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65 github.com/snyk/snyk-iac-capture v0.6.5 github.com/snyk/snyk-ls v0.0.0-20240318135323-bd809c95fbe4 diff --git a/cliv2/go.sum b/cliv2/go.sum index 4fced89d02..f41efba40a 100644 --- a/cliv2/go.sum +++ b/cliv2/go.sum @@ -660,8 +660,8 @@ github.com/snyk/code-client-go v0.3.1 h1:jCYBRJJ/qVlPRqJONwmwpMCMe7s/lulbJQE6KUe github.com/snyk/code-client-go v0.3.1/go.mod h1:D+cfqDbuZE1S106bY3Tr+ZXLb9BR16kKBtvlf0xdyNA= github.com/snyk/container-cli v0.0.0-20240322120441-6d9b9482f9b1 h1:9RKY9NdX5DrJAoVXDP0JiqrXT+4Nb9NH8pjEcA0NsLA= github.com/snyk/container-cli v0.0.0-20240322120441-6d9b9482f9b1/go.mod h1:38w+dcAQp9eG3P5t2eNS9eG0reut10AeJjLv5lJ5lpM= -github.com/snyk/go-application-framework v0.0.0-20240320144631-1935b2cb624e h1:Cu5BIVoy+s6/oiOd0OAJS02AuJ+jM8FF2RBZ+YoZs80= -github.com/snyk/go-application-framework v0.0.0-20240320144631-1935b2cb624e/go.mod h1:Yz/qxFyfhf0xbA+z8Vzr5IM9IDG+BS+2PiGaP1yAsEw= +github.com/snyk/go-application-framework v0.0.0-20240325111322-3ab1f2dfef13 h1:5ZoA7CduF4mQLfmzqxQ1RSX9OXr+L2z5kF9pI2nUmfs= +github.com/snyk/go-application-framework v0.0.0-20240325111322-3ab1f2dfef13/go.mod h1:Yz/qxFyfhf0xbA+z8Vzr5IM9IDG+BS+2PiGaP1yAsEw= github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65 h1:CEQuYv0Go6MEyRCD3YjLYM2u3Oxkx8GpCpFBd4rUTUk= github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65/go.mod h1:88KbbvGYlmLgee4OcQ19yr0bNpXpOr2kciOthaSzCAg= github.com/snyk/policy-engine v0.22.0 h1:od9pduGrXyfWO791X+8M1qmnvWUxaIXh0gBzGKqeseA= From 6aca5dbcb4c95a7a41416b8f060349a9c13db741 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 25 Mar 2024 17:03:14 +0000 Subject: [PATCH 22/58] docs: synchronizing help from snyk/user-docs (#5135) Co-authored-by: PeterSchafer --- help/cli-commands/code-test.md | 6 +++++- help/cli-commands/container-monitor.md | 6 ++++-- help/cli-commands/container-sbom.md | 14 +++++++------- help/cli-commands/container-test.md | 6 +++++- help/cli-commands/iac-test.md | 6 +++++- help/cli-commands/monitor.md | 4 +++- help/cli-commands/sbom.md | 16 ++++++++-------- help/cli-commands/test.md | 2 ++ 8 files changed, 39 insertions(+), 21 deletions(-) diff --git a/help/cli-commands/code-test.md b/help/cli-commands/code-test.md index 5be3b20a5e..69b202f3be 100644 --- a/help/cli-commands/code-test.md +++ b/help/cli-commands/code-test.md @@ -37,7 +37,11 @@ Set a default to ensure all newly tested projects are tested under your default Default: `` that is the current preferred Organization in your [Account settings](https://app.snyk.io/account) -Note that you can also use `--org=`. The `ORG_ID` works in both the CLI and the API. The Organization slug name works in the CLI, but not in the API. +**Note:** You can also use `--org=.` The `ORG_ID` works in both the CLI and the API. The Organization slug name works in the CLI, but not in the API. + +`orgslugname` must match the slug name as displayed in the URL of your org in the Snyk UI: `https://snyk.io/org/[orgslugname]`. The orgname does not work. + +For more information see the article [How to select the Organization to use in the CLI](https://docs.snyk.io/snyk-cli/scan-and-maintain-projects-using-the-cli/how-to-select-the-organization-to-use-in-the-cli) ### `--report` diff --git a/help/cli-commands/container-monitor.md b/help/cli-commands/container-monitor.md index f54581a3b9..4d941d86ec 100644 --- a/help/cli-commands/container-monitor.md +++ b/help/cli-commands/container-monitor.md @@ -46,9 +46,11 @@ Set a default to ensure all newly tested and monitored projects are tested and m Default: `` that is the current preferred Organization in your [Account settings](https://app.snyk.io/account) -Note that you can also use `--org=`. The `ORG_ID` works in both the CLI and the API. The Organization slug name works in the CLI, but not in the API. +**Note:** You can also use `--org=.` The `ORG_ID` works in both the CLI and the API. The Organization slug name works in the CLI, but not in the API. -For more information see the article [How to select the Organization to use in the CLI](https://docs.snyk.io/snyk-cli/test-for-vulnerabilities/how-to-select-the-organization-to-use-in-the-cli) +`orgslugname` must match the slug name as displayed in the URL of your org in the Snyk UI: `https://snyk.io/org/[orgslugname]`. The orgname does not work. + +For more information see the article [How to select the Organization to use in the CLI](https://docs.snyk.io/snyk-cli/scan-and-maintain-projects-using-the-cli/how-to-select-the-organization-to-use-in-the-cli) ### `--file=` diff --git a/help/cli-commands/container-sbom.md b/help/cli-commands/container-sbom.md index c9ee6c2fa4..5792bb739b 100644 --- a/help/cli-commands/container-sbom.md +++ b/help/cli-commands/container-sbom.md @@ -10,13 +10,13 @@ The `snyk container sbom` feature requires an internet connection. ## Usage -`$ snyk container sbom --format= [--org=] [--exclude-app-vulns] ` +`$ snyk container sbom --format= [--org=] [--exclude-app-vulns] ` ## Description The `snyk container sbom` command generates an SBOM for a container image. -Supported formats include CycloneDX v1.4 (JSON or XML) and SPDX v2.3 (JSON). +Supported formats include CycloneDX v1.4 (JSON or XML), CycloneDX v1.5 (JSON or XML) and SPDX v2.3 (JSON). An SBOM can be generated for operating system dependencies as well as application dependencies within the image. Unmanaged dependencies are currently not supported. @@ -33,11 +33,11 @@ Use the `-d` or `--debug` option to output the debug logs. ## Options -### `--format=` +### `--format=` Required. Specify the output format for the SBOM to be produced. -Set the desired SBOM output format. Available options are `cyclonedx1.4+json`, `cyclonedx1.4+xml`, and `spdx2.3+json` +Set the desired SBOM output format. Available options are `cyclonedx1.4+json`, `cyclonedx1.4+xml`, `cyclonedx1.5+json`, `cyclonedx1.5+xml` and `spdx2.3+json` ### `[--org=]` @@ -77,11 +77,11 @@ Required. The image for which you will generate an SBOM document. ### Create a CycloneDX JSON document for an image -`$ snyk container sbom --format=cyclonedx1.4+json redis:latest` +`$ snyk container sbom --format=cyclonedx1.5+json redis:latest` ### Create a CycloneDX JSON document for an image and redirect stdout to a file -`$ snyk container sbom --format=cyclonedx1.4+json redis:latest > mySBOM.json` +`$ snyk container sbom --format=cyclonedx1.5+json redis:latest > mySBOM.json` ### Create a SPDX JSON document for an image while excluding application dependencies @@ -89,4 +89,4 @@ Required. The image for which you will generate an SBOM document. ### Refer to a container image by its digest -`$ snyk container sbom --format=cyclonedx1.4+xml alpine@sha256:c5c5fda71656f28e49ac9c5416b3643eaa6a108a8093151d6d1afc9463be8e33` +`$ snyk container sbom --format=cyclonedx1.5+xml alpine@sha256:c5c5fda71656f28e49ac9c5416b3643eaa6a108a8093151d6d1afc9463be8e33` diff --git a/help/cli-commands/container-test.md b/help/cli-commands/container-test.md index 5d049481d0..6b68b71a79 100644 --- a/help/cli-commands/container-test.md +++ b/help/cli-commands/container-test.md @@ -45,7 +45,11 @@ Set a default to ensure all newly tested and monitored projects are tested and m Default: `` that is the current preferred Organization in your [Account settings](https://app.snyk.io/account) -Note that you can also use `--org=`. The `ORG_ID` works in both the CLI and the API. The Organization slug name works in the CLI, but not in the API. +**Note:** You can also use `--org=.` The `ORG_ID` works in both the CLI and the API. The Organization slug name works in the CLI, but not in the API. + +`orgslugname` must match the slug name as displayed in the URL of your org in the Snyk UI: `https://snyk.io/org/[orgslugname]`. The orgname does not work. + +For more information see the article [How to select the Organization to use in the CLI](https://docs.snyk.io/snyk-cli/scan-and-maintain-projects-using-the-cli/how-to-select-the-organization-to-use-in-the-cli) ### `--file=` diff --git a/help/cli-commands/iac-test.md b/help/cli-commands/iac-test.md index 3723ef03d5..bee4dcc68f 100644 --- a/help/cli-commands/iac-test.md +++ b/help/cli-commands/iac-test.md @@ -51,7 +51,11 @@ Set a default to ensure all newly tested projects are tested under your default Default: `` that is the current preferred Organization in your [Account settings](https://app.snyk.io/account) -Note that you can also use `--org=`. The `ORG_ID` works in both the CLI and the API. The Organization slug name works in the CLI, but not in the API. +**Note:** You can also use `--org=.` The `ORG_ID` works in both the CLI and the API. The Organization slug name works in the CLI, but not in the API. + +`orgslugname` must match the slug name as displayed in the URL of your org in the Snyk UI: `https://snyk.io/org/[orgslugname]`. The orgname does not work. + +For more information see the article [How to select the Organization to use in the CLI](https://docs.snyk.io/snyk-cli/scan-and-maintain-projects-using-the-cli/how-to-select-the-organization-to-use-in-the-cli) ### `--ignore-policy` diff --git a/help/cli-commands/monitor.md b/help/cli-commands/monitor.md index cc5a8f3b0e..6b85005cf5 100644 --- a/help/cli-commands/monitor.md +++ b/help/cli-commands/monitor.md @@ -121,7 +121,9 @@ Set a default to ensure all newly monitored projects are created under your defa Default: `` that is the current preferred Organization in your [Account settings](https://app.snyk.io/account) -Note that you can also use `--org=`. The `ORG_ID` works in both the CLI and the API. The Organization slug name works in the CLI, but not in the API. +**Note:** You can also use `--org=.` The `ORG_ID` works in both the CLI and the API. The Organization slug name works in the CLI, but not in the API. + +`orgslugname` must match the slug name as displayed in the URL of your org in the Snyk UI: `https://snyk.io/org/[orgslugname]`. The orgname does not work. For more information see the article [How to select the Organization to use in the CLI](https://docs.snyk.io/snyk-cli/scan-and-maintain-projects-using-the-cli/how-to-select-the-organization-to-use-in-the-cli) diff --git a/help/cli-commands/sbom.md b/help/cli-commands/sbom.md index b4ffe2ba9e..ff992cfd3a 100644 --- a/help/cli-commands/sbom.md +++ b/help/cli-commands/sbom.md @@ -10,13 +10,13 @@ The `snyk sbom` feature requires an internet connection. ## Usage -`$ snyk sbom --format= [--file=] [--unmanaged] [--org=] [--dev] [--all-projects] [--name=] [--version=] [--exclude=[,...]] [--detection-depth=] [--prune-repeated-subdependencies|-p] [--maven-aggregate-project] [--scan-unmanaged] [--scan-all-unmanaged] [--sub-project=] [--gradle-sub-project=] [--all-sub-projects] [--configuration-matching=] [--configuration-attributes=[,]] [--init-script=] [--json-file-output=] []` +`$ snyk sbom --format= [--file=] [--unmanaged] [--org=] [--dev] [--all-projects] [--name=] [--version=] [--exclude=[,...]] [--detection-depth=] [--prune-repeated-subdependencies|-p] [--maven-aggregate-project] [--scan-unmanaged] [--scan-all-unmanaged] [--sub-project=] [--gradle-sub-project=] [--all-sub-projects] [--configuration-matching=] [--configuration-attributes=[,]] [--init-script=] [--json-file-output=] []` ## Description The `snyk sbom` command generates an SBOM for a local software project in an ecosystem supported by Snyk. -Supported formats include CycloneDX v1.4 (JSON or XML) and SPDX v2.3 (JSON). +Supported formats include CycloneDX v1.4 (JSON or XML), CycloneDX v1.5 (JSON or XML) and SPDX v2.3 (JSON). An SBOM can be generated for all supported Open Source package managers as well as unmanaged software projects. @@ -33,11 +33,11 @@ Use the `-d` or `--debug` option to output the debug logs. ## Options -### `--format=` +### `--format=` Required. Specify the output format for the SBOM to be produced. -Set the desired SBOM output format. Available options are `cyclonedx1.4+json`, `cyclonedx1.4+xml`, and `spdx2.3+json` +Set the desired SBOM output format. Available options are `cyclonedx1.4+json`, `cyclonedx1.4+xml`, `cyclonedx1.5+json`, `cyclonedx1.5+xml` and `spdx2.3+json` ### `[--org=]` @@ -288,11 +288,11 @@ Example: `snyk sbom -- -s settings.xml` ### Create a CycloneDX JSON document for a local software project -`$ snyk sbom --format=cyclonedx1.4+json` +`$ snyk sbom --format=cyclonedx1.5+json` ### Create a CycloneDX JSON document and redirect stdout to a file -`$ snyk sbom --format=cyclonedx1.4+json > mySBOM.json` +`$ snyk sbom --format=cyclonedx1.5+json > mySBOM.json` ### Create an SPDX JSON document and write it to a file @@ -304,8 +304,8 @@ Example: `snyk sbom -- -s settings.xml` ### Create a CycloneDX XML document for a Maven project -`$ snyk sbom --file=pom.xml --format=cyclonedx1.4+xml` +`$ snyk sbom --file=pom.xml --format=cyclonedx1.5+xml` ### Create a CycloneDX JSON document for a monorepo -`$ snyk sbom --format=cyclonedx1.4+json --all-projects` +`$ snyk sbom --format=cyclonedx1.5+json --all-projects` diff --git a/help/cli-commands/test.md b/help/cli-commands/test.md index 67cc04fa21..04e519c653 100644 --- a/help/cli-commands/test.md +++ b/help/cli-commands/test.md @@ -114,6 +114,8 @@ Default: `` that is the current preferred Organization in your [Account **Note:** You can also use `--org=.` The `ORG_ID` works in both the CLI and the API. The Organization slug name works in the CLI, but not in the API. +`orgslugname` must match the slug name as displayed in the URL of your org in the Snyk UI: `https://snyk.io/org/[orgslugname]`. The orgname does not work. + For more information see the article [How to select the Organization to use in the CLI](https://docs.snyk.io/snyk-cli/scan-and-maintain-projects-using-the-cli/how-to-select-the-organization-to-use-in-the-cli) ### `--file=` From eee1ec5fb73a55da2afbe2eb5a8dfc867942c77e Mon Sep 17 00:00:00 2001 From: PeterSchafer <101886095+PeterSchafer@users.noreply.github.com> Date: Mon, 25 Mar 2024 20:52:03 +0100 Subject: [PATCH 23/58] fix: Fix error in sbom command when using --json-file-output (#5136) --- cliv2/go.mod | 2 +- cliv2/go.sum | 4 +-- test/jest/acceptance/snyk-sbom/sbom.spec.ts | 30 +++++++++++++++++++++ 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/cliv2/go.mod b/cliv2/go.mod index 105f4c7348..69180dccd9 100644 --- a/cliv2/go.mod +++ b/cliv2/go.mod @@ -13,7 +13,7 @@ require ( github.com/snyk/cli-extension-iac-rules v0.0.0-20230601153200-c572cfce46ce github.com/snyk/cli-extension-sbom v0.0.0-20240314090036-46535b380426 github.com/snyk/container-cli v0.0.0-20240322120441-6d9b9482f9b1 - github.com/snyk/go-application-framework v0.0.0-20240325111322-3ab1f2dfef13 + github.com/snyk/go-application-framework v0.0.0-20240325175807-5cb112133ceb github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65 github.com/snyk/snyk-iac-capture v0.6.5 github.com/snyk/snyk-ls v0.0.0-20240318135323-bd809c95fbe4 diff --git a/cliv2/go.sum b/cliv2/go.sum index f41efba40a..e9dc9cf16c 100644 --- a/cliv2/go.sum +++ b/cliv2/go.sum @@ -660,8 +660,8 @@ github.com/snyk/code-client-go v0.3.1 h1:jCYBRJJ/qVlPRqJONwmwpMCMe7s/lulbJQE6KUe github.com/snyk/code-client-go v0.3.1/go.mod h1:D+cfqDbuZE1S106bY3Tr+ZXLb9BR16kKBtvlf0xdyNA= github.com/snyk/container-cli v0.0.0-20240322120441-6d9b9482f9b1 h1:9RKY9NdX5DrJAoVXDP0JiqrXT+4Nb9NH8pjEcA0NsLA= github.com/snyk/container-cli v0.0.0-20240322120441-6d9b9482f9b1/go.mod h1:38w+dcAQp9eG3P5t2eNS9eG0reut10AeJjLv5lJ5lpM= -github.com/snyk/go-application-framework v0.0.0-20240325111322-3ab1f2dfef13 h1:5ZoA7CduF4mQLfmzqxQ1RSX9OXr+L2z5kF9pI2nUmfs= -github.com/snyk/go-application-framework v0.0.0-20240325111322-3ab1f2dfef13/go.mod h1:Yz/qxFyfhf0xbA+z8Vzr5IM9IDG+BS+2PiGaP1yAsEw= +github.com/snyk/go-application-framework v0.0.0-20240325175807-5cb112133ceb h1:ovhyFAt2BDPNmzJ1M2KuGz0s2GSfiY9VoMF4/EvMG00= +github.com/snyk/go-application-framework v0.0.0-20240325175807-5cb112133ceb/go.mod h1:Yz/qxFyfhf0xbA+z8Vzr5IM9IDG+BS+2PiGaP1yAsEw= github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65 h1:CEQuYv0Go6MEyRCD3YjLYM2u3Oxkx8GpCpFBd4rUTUk= github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65/go.mod h1:88KbbvGYlmLgee4OcQ19yr0bNpXpOr2kciOthaSzCAg= github.com/snyk/policy-engine v0.22.0 h1:od9pduGrXyfWO791X+8M1qmnvWUxaIXh0gBzGKqeseA= diff --git a/test/jest/acceptance/snyk-sbom/sbom.spec.ts b/test/jest/acceptance/snyk-sbom/sbom.spec.ts index e9ecc5138e..56ff85546d 100644 --- a/test/jest/acceptance/snyk-sbom/sbom.spec.ts +++ b/test/jest/acceptance/snyk-sbom/sbom.spec.ts @@ -1,6 +1,7 @@ import { createProjectFromWorkspace } from '../../util/createProject'; import { runSnykCLI } from '../../util/runSnykCLI'; import { fakeServer } from '../../../acceptance/fake-server'; +import * as fs from 'fs'; jest.setTimeout(1000 * 60 * 5); @@ -83,6 +84,35 @@ describe('snyk sbom (mocked server only)', () => { ); }); + test('`sbom` is written to a file - CycloneDX 1.4', async () => { + const project = await createProjectFromWorkspace('npm-package'); + + const { code } = await runSnykCLI( + `sbom --org aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee --format cyclonedx1.4+json --debug --json-file-output sbom.json`, + { + cwd: project.path(), + env, + }, + ); + + expect(code).toEqual(0); + + const sbomFileContent = fs.readFileSync( + project.path() + '/sbom.json', + 'utf8', + ); + const bom = JSON.parse(sbomFileContent); + expect(bom.metadata.tools).toEqual( + expect.arrayContaining([ + { + vendor: 'Snyk', + name: 'snyk-cli', + version: expect.any(String), + }, + ]), + ); + }); + test('`sbom` generates an SBOM for a single project - CycloneDX 1.5', async () => { const project = await createProjectFromWorkspace('npm-package'); From a4b4dbbab441291b3d42078269b7e4a8807b3521 Mon Sep 17 00:00:00 2001 From: Luke Watts Date: Tue, 26 Mar 2024 20:09:02 +0100 Subject: [PATCH 24/58] chore(ci): introduce caching around npm install step (#5110) --- .circleci/config.yml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index f0425dda56..560e248794 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -861,9 +861,19 @@ jobs: executor: docker-amd64 steps: - checkout + - restore_cache: + name: Restore npm cache + keys: + - prepare-build-npm-deps-{{ checksum "package-lock.json" }} + - prepare-build-npm-deps - run: name: Installing dependencies - command: npm ci + command: npm ci --no-audit --no-progress --cache .npm --prefer-offline + - save_cache: + name: Save npm cache + key: prepare-build-npm-deps-{{ checksum "package-lock.json" }} + paths: + - .npm - run: name: Set version command: | From 3607eb34c52327cc6ee2f7cee2a1d86630ec7aa1 Mon Sep 17 00:00:00 2001 From: Luke Watts Date: Tue, 26 Mar 2024 20:50:02 +0100 Subject: [PATCH 25/58] test: refactor to introduce helper to determine port (#5137) * refactor: mark less recommended path as deprecated * chore: introduce test helper to isolate port selection * refactor: switch to using helper to determine port We need to know about the port ahead of time so that we can use it in our configuration. This supports iterating on fixed ports to random ports so we can support running in parallel and ensure no collision between our tests. * chore: apply formatting --- test/jest/acceptance/analytics.spec.ts | 3 ++- test/jest/acceptance/auth.spec.ts | 3 ++- test/jest/acceptance/cli-args.spec.ts | 4 +++- test/jest/acceptance/cli-json-file-output.spec.ts | 3 ++- test/jest/acceptance/cli-json-output.spec.ts | 3 ++- test/jest/acceptance/cli-token-precedence.spec.ts | 3 ++- test/jest/acceptance/https.spec.ts | 3 ++- test/jest/acceptance/oauth-token.spec.ts | 3 ++- test/jest/acceptance/print-graph.spec.ts | 3 ++- test/jest/acceptance/proxy-behavior.spec.ts | 3 ++- test/jest/acceptance/snyk-apps/config.spec.ts | 3 ++- test/jest/acceptance/snyk-apps/create-app.spec.ts | 3 ++- test/jest/acceptance/snyk-config/snyk-config.spec.ts | 3 ++- test/jest/acceptance/snyk-fix/fix.spec.ts | 3 ++- test/jest/acceptance/snyk-ignore/snyk-ignore.spec.ts | 3 ++- test/jest/acceptance/snyk-monitor/target-reference.spec.ts | 3 ++- .../jest/acceptance/snyk-test-all-projects-exit-codes.spec.ts | 3 ++- test/jest/acceptance/snyk-test/all-projects.spec.ts | 3 ++- .../acceptance/snyk-test/app-vuln-container-project.spec.ts | 3 ++- .../acceptance/snyk-test/basic-test-all-languages.spec.ts | 3 ++- test/jest/acceptance/snyk-test/fail-on.spec.ts | 3 ++- test/jest/acceptance/snyk-test/missing-node-modules.spec.ts | 3 ++- test/jest/acceptance/snyk-test/output-formats/sarif.spec.ts | 3 ++- .../acceptance/snyk-test/protect-upgrade-notification.spec.ts | 3 ++- test/jest/acceptance/snyk-test/retry-mechanism.spec.ts | 3 ++- .../acceptance/snyk-test/snyk-test-local-policy-file.spec.ts | 3 ++- .../acceptance/snyk-test/spotlight-vuln-notification.spec.ts | 3 ++- test/jest/acceptance/snyk-test/trust-policies.spec.ts | 3 ++- .../acceptance/snyk-test/with-patched-vulnerabilities.spec.ts | 3 ++- test/jest/acceptance/snyk-test/yarn-workspaces.spec.ts | 3 ++- test/jest/util/createProject.ts | 2 ++ test/jest/util/getServerPort.ts | 3 +++ test/tap/auth.test.ts | 3 ++- test/tap/cli.test.ts | 3 ++- test/tap/remote-package.test.ts | 3 ++- 35 files changed, 72 insertions(+), 33 deletions(-) create mode 100644 test/jest/util/getServerPort.ts diff --git a/test/jest/acceptance/analytics.spec.ts b/test/jest/acceptance/analytics.spec.ts index bea458da2a..95fd81e111 100644 --- a/test/jest/acceptance/analytics.spec.ts +++ b/test/jest/acceptance/analytics.spec.ts @@ -4,13 +4,14 @@ import { createProjectFromWorkspace, } from '../util/createProject'; import { runSnykCLI } from '../util/runSnykCLI'; +import { getServerPort } from '../util/getServerPort'; jest.setTimeout(1000 * 30); describe('analytics module', () => { let server; let env: Record; - const port = process.env.PORT || process.env.SNYK_PORT || '12345'; + const port = getServerPort(process); beforeAll((done) => { const baseApi = '/api/v1'; diff --git a/test/jest/acceptance/auth.spec.ts b/test/jest/acceptance/auth.spec.ts index 1d0c15e91d..8da618b6ef 100644 --- a/test/jest/acceptance/auth.spec.ts +++ b/test/jest/acceptance/auth.spec.ts @@ -2,6 +2,7 @@ import { fakeServer, getFirstIPv4Address } from '../../acceptance/fake-server'; import { runSnykCLI } from '../util/runSnykCLI'; import { getCliConfig, restoreCliConfig } from '../../acceptance/config-helper'; import { ciEnvs } from '../../../src/lib/is-ci'; +import { getServerPort } from '../util/getServerPort'; jest.setTimeout(1000 * 60); @@ -13,7 +14,7 @@ describe('Auth', () => { beforeAll((done) => { const apiPath = '/api/v1'; - const apiPort = process.env.PORT || process.env.SNYK_PORT || '12345'; + const apiPort = getServerPort(process); env = { ...process.env, SNYK_API: 'http://' + getFirstIPv4Address() + ':' + apiPort + apiPath, diff --git a/test/jest/acceptance/cli-args.spec.ts b/test/jest/acceptance/cli-args.spec.ts index b4fa598b88..b50ced9383 100644 --- a/test/jest/acceptance/cli-args.spec.ts +++ b/test/jest/acceptance/cli-args.spec.ts @@ -3,6 +3,8 @@ import { UnsupportedOptionCombinationError } from '../../../src/lib/errors/unsup import { runSnykCLI } from '../util/runSnykCLI'; import { fakeServer } from '../../acceptance/fake-server'; import { createProject } from '../util/createProject'; +import { getServerPort } from '../util/getServerPort'; + import * as os from 'os'; const isWindows = os.platform().indexOf('win') === 0; @@ -14,7 +16,7 @@ describe('cli args', () => { let env: Record; beforeAll((done) => { - const port = process.env.PORT || process.env.SNYK_PORT || '12345'; + const port = getServerPort(process); const baseApi = '/api/v1'; env = { ...process.env, diff --git a/test/jest/acceptance/cli-json-file-output.spec.ts b/test/jest/acceptance/cli-json-file-output.spec.ts index 922c33efac..28f5138920 100644 --- a/test/jest/acceptance/cli-json-file-output.spec.ts +++ b/test/jest/acceptance/cli-json-file-output.spec.ts @@ -3,6 +3,7 @@ import * as fs from 'fs'; import { createProjectFromWorkspace } from '../util/createProject'; import { runSnykCLI } from '../util/runSnykCLI'; import { humanFileSize } from '../../utils'; +import { getServerPort } from '../util/getServerPort'; jest.setTimeout(1000 * 60); @@ -12,7 +13,7 @@ describe('test --json-file-output', () => { beforeAll((done) => { const apiPath = '/api/v1'; - const apiPort = process.env.PORT || process.env.SNYK_PORT || '12345'; + const apiPort = getServerPort(process); env = { ...process.env, SNYK_API: 'http://localhost:' + apiPort + apiPath, diff --git a/test/jest/acceptance/cli-json-output.spec.ts b/test/jest/acceptance/cli-json-output.spec.ts index 7990d49033..d1f4d6de37 100644 --- a/test/jest/acceptance/cli-json-output.spec.ts +++ b/test/jest/acceptance/cli-json-output.spec.ts @@ -1,5 +1,6 @@ import { fakeServer } from '../../acceptance/fake-server'; import { createProjectFromWorkspace } from '../util/createProject'; +import { getServerPort } from '../util/getServerPort'; import { runSnykCLI } from '../util/runSnykCLI'; import * as Parser from 'jsonparse'; @@ -11,7 +12,7 @@ describe('test --json', () => { beforeAll((done) => { const apiPath = '/api/v1'; - const apiPort = process.env.PORT || process.env.SNYK_PORT || '12345'; + const apiPort = getServerPort(process); env = { ...process.env, SNYK_API: 'http://localhost:' + apiPort + apiPath, diff --git a/test/jest/acceptance/cli-token-precedence.spec.ts b/test/jest/acceptance/cli-token-precedence.spec.ts index 240d29636a..6731c4fc92 100644 --- a/test/jest/acceptance/cli-token-precedence.spec.ts +++ b/test/jest/acceptance/cli-token-precedence.spec.ts @@ -1,5 +1,6 @@ import { runSnykCLI } from '../util/runSnykCLI'; import { fakeServer } from '../../acceptance/fake-server'; +import { getServerPort } from '../util/getServerPort'; jest.setTimeout(1000 * 30); // 30 seconds @@ -8,7 +9,7 @@ describe('cli token precedence', () => { let env: Record; let initialConfig: Record = {}; - const port = process.env.PORT || process.env.SNYK_PORT || '12345'; + const port = getServerPort(process); const baseApi = '/api/v1'; const initialEnvVars = { ...process.env, diff --git a/test/jest/acceptance/https.spec.ts b/test/jest/acceptance/https.spec.ts index ba70890692..a69737e07e 100644 --- a/test/jest/acceptance/https.spec.ts +++ b/test/jest/acceptance/https.spec.ts @@ -7,6 +7,7 @@ import { import { createProjectFromWorkspace } from '../util/createProject'; import { getFixturePath } from '../util/getFixturePath'; import { runSnykCLI } from '../util/runSnykCLI'; +import { getServerPort } from '../util/getServerPort'; jest.setTimeout(1000 * 30); @@ -18,7 +19,7 @@ describe('https', () => { const ipaddress = getFirstIPv4Address(); console.log('Using ip: ' + ipaddress); - const port = process.env.PORT || process.env.SNYK_PORT || '12345'; + const port = getServerPort(process); const baseApi = '/api/v1'; env = { ...process.env, diff --git a/test/jest/acceptance/oauth-token.spec.ts b/test/jest/acceptance/oauth-token.spec.ts index 1036a0a403..46a0a96255 100644 --- a/test/jest/acceptance/oauth-token.spec.ts +++ b/test/jest/acceptance/oauth-token.spec.ts @@ -1,6 +1,7 @@ import { fakeServer } from '../../acceptance/fake-server'; import { createProjectFromWorkspace } from '../util/createProject'; import { runSnykCLI } from '../util/runSnykCLI'; +import { getServerPort } from '../util/getServerPort'; jest.setTimeout(1000 * 60); @@ -10,7 +11,7 @@ describe('OAuth Token', () => { beforeAll((done) => { const apiPath = '/api/v1'; - const apiPort = process.env.PORT || process.env.SNYK_PORT || '12345'; + const apiPort = getServerPort(process); env = { ...process.env, SNYK_API: 'http://localhost:' + apiPort + apiPath, diff --git a/test/jest/acceptance/print-graph.spec.ts b/test/jest/acceptance/print-graph.spec.ts index 87c0f0d02e..f539259f70 100644 --- a/test/jest/acceptance/print-graph.spec.ts +++ b/test/jest/acceptance/print-graph.spec.ts @@ -1,6 +1,7 @@ import { fakeServer } from '../../acceptance/fake-server'; import { createProjectFromFixture } from '../util/createProject'; import { runSnykCLI } from '../util/runSnykCLI'; +import { getServerPort } from '../util/getServerPort'; import * as path from 'path'; jest.setTimeout(1000 * 30); @@ -10,7 +11,7 @@ describe('`test` command with `--print-graph` option', () => { let env: Record; beforeAll((done) => { - const port = process.env.PORT || process.env.SNYK_PORT || '12345'; + const port = getServerPort(process); const baseApi = '/api/v1'; env = { ...process.env, diff --git a/test/jest/acceptance/proxy-behavior.spec.ts b/test/jest/acceptance/proxy-behavior.spec.ts index 11f5d9ec13..6dae219170 100644 --- a/test/jest/acceptance/proxy-behavior.spec.ts +++ b/test/jest/acceptance/proxy-behavior.spec.ts @@ -10,6 +10,7 @@ import { TestCLI, startSnykCLI, } from '../../../test/jest/util/startSnykCLI'; +import { getServerPort } from '../util/getServerPort'; import { unlink } from 'fs'; import { execSync } from 'child_process'; import * as os from 'os'; @@ -48,7 +49,7 @@ const containerName = 'proxy_authentication_container'; const hostnameFakeServer = 'host.docker.internal'; const hostnameProxy = 'proxy.snyk.local'; const proxyPort = '3128'; -const port = process.env.PORT || process.env.SNYK_PORT || '12345'; +const port = getServerPort(process); const baseApi = '/api/v1'; const SNYK_API = 'http://' + hostnameFakeServer + ':' + port + baseApi; const HTTP_PROXY_WITH_USER = 'http://patch:dogsrule@localhost:' + proxyPort; diff --git a/test/jest/acceptance/snyk-apps/config.spec.ts b/test/jest/acceptance/snyk-apps/config.spec.ts index 2705efe46d..789118bc55 100644 --- a/test/jest/acceptance/snyk-apps/config.spec.ts +++ b/test/jest/acceptance/snyk-apps/config.spec.ts @@ -1,11 +1,12 @@ import { fakeServer } from '../../../acceptance/fake-server'; import { runSnykCLI } from '../../util/runSnykCLI'; +import { getServerPort } from '../../util/getServerPort'; jest.setTimeout(1000 * 30); describe('config', () => { let server: ReturnType; - const port = process.env.PORT || process.env.SNYK_PORT || '12345'; + const port = getServerPort(process); const baseURL = '/realbase'; const orgId = '4e0828f9-d92a-4f54-b005-6b9d8150b75f'; const testData = { diff --git a/test/jest/acceptance/snyk-apps/create-app.spec.ts b/test/jest/acceptance/snyk-apps/create-app.spec.ts index d9fc90d76f..e157682929 100644 --- a/test/jest/acceptance/snyk-apps/create-app.spec.ts +++ b/test/jest/acceptance/snyk-apps/create-app.spec.ts @@ -1,5 +1,6 @@ import { fakeServer, FakeServer } from '../../../acceptance/fake-server'; import { startSnykCLI, TestCLI } from '../../util/startSnykCLI'; +import { getServerPort } from '../../util/getServerPort'; describe('snyk-apps: create app', () => { let server: FakeServer; @@ -7,7 +8,7 @@ describe('snyk-apps: create app', () => { let env: Record; beforeAll((done) => { - const port = process.env.PORT || process.env.SNYK_PORT || '12345'; + const port = getServerPort(process); const baseApi = '/rest'; env = { ...process.env, diff --git a/test/jest/acceptance/snyk-config/snyk-config.spec.ts b/test/jest/acceptance/snyk-config/snyk-config.spec.ts index ef0afb8dd5..33855f932b 100644 --- a/test/jest/acceptance/snyk-config/snyk-config.spec.ts +++ b/test/jest/acceptance/snyk-config/snyk-config.spec.ts @@ -1,6 +1,7 @@ import { runSnykCLI } from '../../util/runSnykCLI'; import { FakeServer, fakeServer } from '../../../acceptance/fake-server'; import { createProjectFromWorkspace } from '../../util/createProject'; +import { getServerPort } from '../../util/getServerPort'; jest.setTimeout(1000 * 60); @@ -19,7 +20,7 @@ test('returns value in one line', async () => { describe('snyk config set endpoint', () => { let server: FakeServer; - const port = process.env.PORT || process.env.SNYK_PORT || '12345'; + const port = getServerPort(process); const baseApi = '/api'; const token = '123456789'; diff --git a/test/jest/acceptance/snyk-fix/fix.spec.ts b/test/jest/acceptance/snyk-fix/fix.spec.ts index 8b67adb363..cabc3898f8 100644 --- a/test/jest/acceptance/snyk-fix/fix.spec.ts +++ b/test/jest/acceptance/snyk-fix/fix.spec.ts @@ -7,6 +7,7 @@ import { } from '../../util/createProject'; import { runCommand } from '../../util/runCommand'; import { runSnykCLI } from '../../util/runSnykCLI'; +import { getServerPort } from '../../util/getServerPort'; // Check for existence of pipenv in the environment const hasPipEnv = spawnSync('pipenv', ['--version']).status === 0; @@ -18,7 +19,7 @@ describe('snyk fix', () => { beforeAll(async () => { const apiPath = '/api/v1'; - const apiPort = process.env.PORT || process.env.SNYK_PORT || '12345'; + const apiPort = getServerPort(process); env = { ...process.env, SNYK_API: 'http://localhost:' + apiPort + apiPath, diff --git a/test/jest/acceptance/snyk-ignore/snyk-ignore.spec.ts b/test/jest/acceptance/snyk-ignore/snyk-ignore.spec.ts index f156838ce5..3a1707fb1e 100644 --- a/test/jest/acceptance/snyk-ignore/snyk-ignore.spec.ts +++ b/test/jest/acceptance/snyk-ignore/snyk-ignore.spec.ts @@ -3,6 +3,7 @@ import { fakeServer } from '../../../acceptance/fake-server'; import { createProjectFromWorkspace } from '../../util/createProject'; import { requireSnykToken } from '../../util/requireSnykToken'; import { runSnykCLI, runSnykCLIWithArray } from '../../util/runSnykCLI'; +import { getServerPort } from '../../util/getServerPort'; jest.setTimeout(1000 * 60); @@ -12,7 +13,7 @@ describe('snyk ignore', () => { beforeAll((done) => { const apiPath = '/api/v1'; - const apiPort = process.env.PORT || process.env.SNYK_PORT || '12345'; + const apiPort = getServerPort(process); env = { ...process.env, SNYK_API: 'http://localhost:' + apiPort + apiPath, diff --git a/test/jest/acceptance/snyk-monitor/target-reference.spec.ts b/test/jest/acceptance/snyk-monitor/target-reference.spec.ts index 176de443bd..8036c1344a 100644 --- a/test/jest/acceptance/snyk-monitor/target-reference.spec.ts +++ b/test/jest/acceptance/snyk-monitor/target-reference.spec.ts @@ -1,6 +1,7 @@ import { runSnykCLI } from '../../util/runSnykCLI'; import { fakeServer } from '../../../acceptance/fake-server'; import { createProjectFromWorkspace } from '../../util/createProject'; +import { getServerPort } from '../../util/getServerPort'; jest.setTimeout(1000 * 60); @@ -9,7 +10,7 @@ describe('--target-reference', () => { let env: Record; beforeAll((done) => { - const port = process.env.PORT || process.env.SNYK_PORT || '12345'; + const port = getServerPort(process); const baseApi = '/api/v1'; env = { ...process.env, diff --git a/test/jest/acceptance/snyk-test-all-projects-exit-codes.spec.ts b/test/jest/acceptance/snyk-test-all-projects-exit-codes.spec.ts index b127017726..e00d01013d 100644 --- a/test/jest/acceptance/snyk-test-all-projects-exit-codes.spec.ts +++ b/test/jest/acceptance/snyk-test-all-projects-exit-codes.spec.ts @@ -1,6 +1,7 @@ import { fakeServer } from '../../acceptance/fake-server'; import { createProject } from '../util/createProject'; import { runSnykCLI } from '../util/runSnykCLI'; +import { getServerPort } from '../util/getServerPort'; jest.setTimeout(1000 * 60 * 5); @@ -9,7 +10,7 @@ describe('snyk test --all-projects with one project that has errors', () => { let env: Record; beforeAll((done) => { - const port = process.env.PORT || process.env.SNYK_PORT || '12345'; + const port = getServerPort(process); const baseApi = '/api/v1'; env = { ...process.env, diff --git a/test/jest/acceptance/snyk-test/all-projects.spec.ts b/test/jest/acceptance/snyk-test/all-projects.spec.ts index cff1ab65c5..3e85f0219b 100644 --- a/test/jest/acceptance/snyk-test/all-projects.spec.ts +++ b/test/jest/acceptance/snyk-test/all-projects.spec.ts @@ -1,6 +1,7 @@ import { createProjectFromWorkspace } from '../../util/createProject'; import { runSnykCLI } from '../../util/runSnykCLI'; import { fakeServer } from '../../../acceptance/fake-server'; +import { getServerPort } from '../../util/getServerPort'; jest.setTimeout(1000 * 60); @@ -9,7 +10,7 @@ describe('snyk test --all-projects (mocked server only)', () => { let env: Record; beforeAll((done) => { - const port = process.env.PORT || process.env.SNYK_PORT || '12345'; + const port = getServerPort(process); const baseApi = '/api/v1'; env = { ...process.env, diff --git a/test/jest/acceptance/snyk-test/app-vuln-container-project.spec.ts b/test/jest/acceptance/snyk-test/app-vuln-container-project.spec.ts index 7ad8121846..c56e846f21 100644 --- a/test/jest/acceptance/snyk-test/app-vuln-container-project.spec.ts +++ b/test/jest/acceptance/snyk-test/app-vuln-container-project.spec.ts @@ -1,6 +1,7 @@ import * as path from 'path'; import { fakeServer } from '../../../acceptance/fake-server'; import { runSnykCLI } from '../../util/runSnykCLI'; +import { getServerPort } from '../../util/getServerPort'; describe('container test projects behavior with --app-vulns, --file and --exclude-base-image-vulns flags', () => { it('should find nothing when only vulns are in base image', async () => { @@ -109,7 +110,7 @@ describe('container test projects behavior with --json flag', () => { let env: Record; beforeAll((done) => { - const port = process.env.PORT || process.env.SNYK_PORT || '12345'; + const port = getServerPort(process); const baseApi = '/api/v1'; env = { ...process.env, diff --git a/test/jest/acceptance/snyk-test/basic-test-all-languages.spec.ts b/test/jest/acceptance/snyk-test/basic-test-all-languages.spec.ts index 411c22f1b3..8c207a4e87 100644 --- a/test/jest/acceptance/snyk-test/basic-test-all-languages.spec.ts +++ b/test/jest/acceptance/snyk-test/basic-test-all-languages.spec.ts @@ -3,6 +3,7 @@ import { runSnykCLI } from '../../util/runSnykCLI'; import { fakeServer } from '../../../acceptance/fake-server'; import { runCommand } from '../../util/runCommand'; import { isDontSkipTestsEnabled } from '../../util/isDontSkipTestsEnabled'; +import { getServerPort } from '../../util/getServerPort'; jest.setTimeout(1000 * 60); @@ -22,7 +23,7 @@ describe('`snyk test` of basic projects for each language/ecosystem', () => { let dontSkip: boolean; beforeAll((done) => { - const port = process.env.PORT || process.env.SNYK_PORT || '12345'; + const port = getServerPort(process); const baseApi = '/api/v1'; env = { ...process.env, diff --git a/test/jest/acceptance/snyk-test/fail-on.spec.ts b/test/jest/acceptance/snyk-test/fail-on.spec.ts index e09f5138b5..9e08a2155d 100644 --- a/test/jest/acceptance/snyk-test/fail-on.spec.ts +++ b/test/jest/acceptance/snyk-test/fail-on.spec.ts @@ -1,6 +1,7 @@ import { createProjectFromWorkspace } from '../../util/createProject'; import { runSnykCLI } from '../../util/runSnykCLI'; import { fakeServer } from '../../../acceptance/fake-server'; +import { getServerPort } from '../../util/getServerPort'; jest.setTimeout(1000 * 60); @@ -10,7 +11,7 @@ describe('snyk test --fail-on', () => { beforeAll((done) => { const apiPath = '/api/v1'; - const apiPort = process.env.PORT || process.env.SNYK_PORT || '12345'; + const apiPort = getServerPort(process); env = { ...process.env, SNYK_API: 'http://localhost:' + apiPort + apiPath, diff --git a/test/jest/acceptance/snyk-test/missing-node-modules.spec.ts b/test/jest/acceptance/snyk-test/missing-node-modules.spec.ts index 4996890d1f..25fec86731 100644 --- a/test/jest/acceptance/snyk-test/missing-node-modules.spec.ts +++ b/test/jest/acceptance/snyk-test/missing-node-modules.spec.ts @@ -3,6 +3,7 @@ import { getWorkspaceJSON } from '../../../acceptance/workspace-helper'; import { createProject } from '../../util/createProject'; import { requireSnykToken } from '../../util/requireSnykToken'; import { runSnykCLI } from '../../util/runSnykCLI'; +import { getServerPort } from '../../util/getServerPort'; jest.setTimeout(1000 * 60); @@ -17,7 +18,7 @@ describe('snyk test with missing node_modules', () => { 'no-vulns', 'vulns-result.json', ); - const port = process.env.PORT || process.env.SNYK_PORT || '12345'; + const port = getServerPort(process); const BASE_API = '/api/v1'; env = { ...process.env, diff --git a/test/jest/acceptance/snyk-test/output-formats/sarif.spec.ts b/test/jest/acceptance/snyk-test/output-formats/sarif.spec.ts index 0227d0725d..18f7db7e0d 100644 --- a/test/jest/acceptance/snyk-test/output-formats/sarif.spec.ts +++ b/test/jest/acceptance/snyk-test/output-formats/sarif.spec.ts @@ -1,6 +1,7 @@ import { createProjectFromFixture } from '../../../util/createProject'; import { runSnykCLI } from '../../../util/runSnykCLI'; import { fakeServer } from '../../../../acceptance/fake-server'; +import { getServerPort } from '../../../util/getServerPort'; jest.setTimeout(1000 * 60); @@ -9,7 +10,7 @@ describe('snyk test --sarif', () => { let env: Record; beforeAll((done) => { - const port = process.env.PORT || process.env.SNYK_PORT || '12345'; + const port = getServerPort(process); const baseApi = '/api/v1'; env = { ...process.env, diff --git a/test/jest/acceptance/snyk-test/protect-upgrade-notification.spec.ts b/test/jest/acceptance/snyk-test/protect-upgrade-notification.spec.ts index bb84db1c51..c5f901b60e 100644 --- a/test/jest/acceptance/snyk-test/protect-upgrade-notification.spec.ts +++ b/test/jest/acceptance/snyk-test/protect-upgrade-notification.spec.ts @@ -1,6 +1,7 @@ import { fakeServer } from '../../../acceptance/fake-server'; import { createProjectFromFixture } from '../../util/createProject'; import { runSnykCLI } from '../../util/runSnykCLI'; +import { getServerPort } from '../../util/getServerPort'; jest.setTimeout(1000 * 30); @@ -9,7 +10,7 @@ describe('analytics module', () => { let env: Record; beforeAll((done) => { - const port = process.env.PORT || process.env.SNYK_PORT || '12345'; + const port = getServerPort(process); const baseApi = '/api/v1'; env = { ...process.env, diff --git a/test/jest/acceptance/snyk-test/retry-mechanism.spec.ts b/test/jest/acceptance/snyk-test/retry-mechanism.spec.ts index 9e7e7d5618..54cc6e54e0 100644 --- a/test/jest/acceptance/snyk-test/retry-mechanism.spec.ts +++ b/test/jest/acceptance/snyk-test/retry-mechanism.spec.ts @@ -2,6 +2,7 @@ import { fakeServer } from '../../../acceptance/fake-server'; import { createProjectFromWorkspace } from '../../util/createProject'; import { runSnykCLI } from '../../util/runSnykCLI'; import { RETRY_ATTEMPTS } from '../../../../src/lib/snyk-test/common'; +import { getServerPort } from '../../util/getServerPort'; jest.setTimeout(2000 * 60); @@ -10,7 +11,7 @@ describe('snyk test retry mechanism', () => { let env: Record; beforeAll((done) => { - const port = process.env.PORT || process.env.SNYK_PORT || '12345'; + const port = getServerPort(process); const baseApi = '/api/v1'; env = { ...process.env, diff --git a/test/jest/acceptance/snyk-test/snyk-test-local-policy-file.spec.ts b/test/jest/acceptance/snyk-test/snyk-test-local-policy-file.spec.ts index 189f51d722..b2e6081335 100644 --- a/test/jest/acceptance/snyk-test/snyk-test-local-policy-file.spec.ts +++ b/test/jest/acceptance/snyk-test/snyk-test-local-policy-file.spec.ts @@ -2,6 +2,7 @@ import * as path from 'path'; import { fakeServer } from '../../../acceptance/fake-server'; import { createProjectFromFixture } from '../../util/createProject'; import { runSnykCLI } from '../../util/runSnykCLI'; +import { getServerPort } from '../../util/getServerPort'; jest.setTimeout(1000 * 60); @@ -10,7 +11,7 @@ describe('`snyk test` with `--file=`', () => { let env: Record; beforeAll((done) => { - const port = process.env.PORT || process.env.SNYK_PORT || '12345'; + const port = getServerPort(process); const baseApi = '/api/v1'; env = { ...process.env, diff --git a/test/jest/acceptance/snyk-test/spotlight-vuln-notification.spec.ts b/test/jest/acceptance/snyk-test/spotlight-vuln-notification.spec.ts index 4ef3f5d68b..6957edecc6 100644 --- a/test/jest/acceptance/snyk-test/spotlight-vuln-notification.spec.ts +++ b/test/jest/acceptance/snyk-test/spotlight-vuln-notification.spec.ts @@ -1,6 +1,7 @@ import { fakeServer } from '../../../acceptance/fake-server'; import { createProjectFromFixture } from '../../util/createProject'; import { runSnykCLI } from '../../util/runSnykCLI'; +import { getServerPort } from '../../util/getServerPort'; jest.setTimeout(1000 * 60); @@ -9,7 +10,7 @@ describe('spotlight vuln notification', () => { let env: Record; beforeAll((done) => { - const port = process.env.PORT || process.env.SNYK_PORT || '12345'; + const port = getServerPort(process); const baseApi = '/api/v1'; env = { ...process.env, diff --git a/test/jest/acceptance/snyk-test/trust-policies.spec.ts b/test/jest/acceptance/snyk-test/trust-policies.spec.ts index 4ae89592e2..39417d882b 100644 --- a/test/jest/acceptance/snyk-test/trust-policies.spec.ts +++ b/test/jest/acceptance/snyk-test/trust-policies.spec.ts @@ -1,6 +1,7 @@ import { createProject } from '../../util/createProject'; import { runSnykCLI } from '../../util/runSnykCLI'; import { fakeServer } from '../../../acceptance/fake-server'; +import { getServerPort } from '../../util/getServerPort'; jest.setTimeout(1000 * 60); @@ -9,7 +10,7 @@ describe('trust policies', () => { let env: Record; beforeAll((done) => { - const port = process.env.PORT || process.env.SNYK_PORT || '12345'; + const port = getServerPort(process); const baseApi = '/api/v1'; env = { ...process.env, diff --git a/test/jest/acceptance/snyk-test/with-patched-vulnerabilities.spec.ts b/test/jest/acceptance/snyk-test/with-patched-vulnerabilities.spec.ts index 8c226c6173..816b109852 100644 --- a/test/jest/acceptance/snyk-test/with-patched-vulnerabilities.spec.ts +++ b/test/jest/acceptance/snyk-test/with-patched-vulnerabilities.spec.ts @@ -1,6 +1,7 @@ import { fakeServer } from '../../../acceptance/fake-server'; import { createProjectFromFixture } from '../../util/createProject'; import { runSnykCLI } from '../../util/runSnykCLI'; +import { getServerPort } from '../../util/getServerPort'; jest.setTimeout(1000 * 30); @@ -9,7 +10,7 @@ describe('snyk test with patched vulnerabilities', () => { let env: Record; beforeAll((done) => { - const port = process.env.PORT || process.env.SNYK_PORT || '12345'; + const port = getServerPort(process); const baseApi = '/api/v1'; env = { ...process.env, diff --git a/test/jest/acceptance/snyk-test/yarn-workspaces.spec.ts b/test/jest/acceptance/snyk-test/yarn-workspaces.spec.ts index 4228edd93f..e01d03e2d1 100644 --- a/test/jest/acceptance/snyk-test/yarn-workspaces.spec.ts +++ b/test/jest/acceptance/snyk-test/yarn-workspaces.spec.ts @@ -1,6 +1,7 @@ import { createProjectFromWorkspace } from '../../util/createProject'; import { runSnykCLI } from '../../util/runSnykCLI'; import { fakeServer } from '../../../acceptance/fake-server'; +import { getServerPort } from '../../util/getServerPort'; jest.setTimeout(1000 * 60); @@ -9,7 +10,7 @@ describe('snyk test --yarn-workspaces (mocked server only)', () => { let env: Record; beforeAll((done) => { - const port = process.env.PORT || process.env.SNYK_PORT || '12345'; + const port = getServerPort(process); const baseApi = '/api/v1'; env = { ...process.env, diff --git a/test/jest/util/createProject.ts b/test/jest/util/createProject.ts index f4960b9f1b..08f52ae197 100644 --- a/test/jest/util/createProject.ts +++ b/test/jest/util/createProject.ts @@ -49,6 +49,8 @@ const createProject = async ( /** * Workaround until we move all fixtures to ./test/fixtures + * + * @deprecated Use createProject instead. */ const createProjectFromWorkspace = async ( fixtureName: string, diff --git a/test/jest/util/getServerPort.ts b/test/jest/util/getServerPort.ts new file mode 100644 index 0000000000..53473b25df --- /dev/null +++ b/test/jest/util/getServerPort.ts @@ -0,0 +1,3 @@ +export const getServerPort = (process: NodeJS.Process): string => { + return process.env.PORT || process.env.SNYK_PORT || '12345'; +}; diff --git a/test/tap/auth.test.ts b/test/tap/auth.test.ts index 77c8d431a1..fb717f12df 100644 --- a/test/tap/auth.test.ts +++ b/test/tap/auth.test.ts @@ -4,8 +4,9 @@ import stripAnsi = require('strip-ansi'); import * as isAuthed from '../../src/cli/commands/auth/is-authed'; import * as errors from '../../src/lib/errors/legacy-errors'; import { fakeServer } from '../acceptance/fake-server'; +import { getServerPort } from '../jest/util/getServerPort'; -const port = process.env.PORT || process.env.SNYK_PORT || '12345'; +const port = getServerPort(process); const apiKey = '123456789'; const BASE_API = '/api/v1'; diff --git a/test/tap/cli.test.ts b/test/tap/cli.test.ts index 3b4b89b917..a99dd79d28 100644 --- a/test/tap/cli.test.ts +++ b/test/tap/cli.test.ts @@ -12,6 +12,7 @@ import stripAnsi = require('strip-ansi'); import * as os from 'os'; import * as isDocker from '../../src/lib/is-docker'; import { fakeServer } from '../acceptance/fake-server'; +import { getServerPort } from '../jest/util/getServerPort'; type Ignore = { [path: string]: { @@ -25,7 +26,7 @@ type Policy = { [id: string]: Ignore[]; }; -const port = process.env.PORT || process.env.SNYK_PORT || '12345'; +const port = getServerPort(process); const apiKey = '123456789'; let oldKey; diff --git a/test/tap/remote-package.test.ts b/test/tap/remote-package.test.ts index 3e5f5d0d4b..23650e6b3b 100644 --- a/test/tap/remote-package.test.ts +++ b/test/tap/remote-package.test.ts @@ -2,8 +2,9 @@ import { test } from 'tap'; import * as ciChecker from '../../src/lib/is-ci'; import * as sinon from 'sinon'; import { fakeServer } from '../acceptance/fake-server'; +import { getServerPort } from '../jest/util/getServerPort'; -const port = process.env.PORT || process.env.SNYK_PORT || '12345'; +const port = getServerPort(process); const apiKey = '123456789'; let oldkey; From 8438281939add435116e9e68d007ca006292ceb4 Mon Sep 17 00:00:00 2001 From: Luke Watts Date: Thu, 28 Mar 2024 14:47:27 +0100 Subject: [PATCH 26/58] chore(deps): upgrade jest to latest (#5112) * chore(deps): upgrade jest to latest * test: update snapshot --- package-lock.json | 5949 ++++++++--------- package.json | 6 +- .../test/unit/__snapshots__/fix.spec.ts.snap | 306 +- .../contains-require-directive.spec.ts.snap | 36 +- .../update-dependencies.spec.ts.snap | 2 +- ...ert-legacy-test-result-to-new.spec.ts.snap | 162 +- ...cy-test-result-to-scan-result.spec.ts.snap | 24 +- ...tests-results-to-fix-entities.spec.ts.snap | 210 +- .../format-monitor-response.spec.ts.snap | 2 +- .../open-source-sarif-output.spec.ts.snap | 66 +- .../__snapshots__/sarif-output.spec.ts.snap | 144 +- test/jest/unit/npm-modules-parser.spec.ts | 2 +- .../unit/python/snyk-test-pyproject.spec.ts | 2 +- 13 files changed, 3135 insertions(+), 3776 deletions(-) diff --git a/package-lock.json b/package-lock.json index a70a34bf7e..a6fbe6dde7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -94,7 +94,7 @@ "@types/cross-spawn": "^6.0.2", "@types/express": "^4.17.13", "@types/fs-extra": "^9.0.11", - "@types/jest": "^28.1.8", + "@types/jest": "29.5.12", "@types/lodash": "^4.14.161", "@types/needle": "^3.3.0", "@types/node": "^14.14.31", @@ -115,7 +115,7 @@ "eslint-plugin-jest": "^24.4.0", "express": "^4.17.1", "fs-extra": "^9.1.0", - "jest": "^28.1.3", + "jest": "29.7.0", "jest-junit": "^16.0.0", "jsonparse": "^1.3.1", "lodash": "^4.17.20", @@ -128,7 +128,7 @@ "proxyquire": "^1.7.4", "sinon": "^4.0.0", "tap": "^18.7.0", - "ts-jest": "^28.0.8", + "ts-jest": "29.1.2", "ts-loader": "^9.5.1", "ts-node": "^10.9.2", "typescript": "^4.9.5", @@ -179,6 +179,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@arcanis/slice-ansi": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@arcanis/slice-ansi/-/slice-ansi-1.0.2.tgz", @@ -200,35 +213,35 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", - "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.0.tgz", - "integrity": "sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.0", - "@babel/helper-compilation-targets": "^7.15.0", - "@babel/helper-module-transforms": "^7.15.0", - "@babel/helpers": "^7.14.8", - "@babel/parser": "^7.15.0", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.15.0", - "@babel/types": "^7.15.0", - "convert-source-map": "^1.7.0", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz", + "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.24.0", + "@babel/parser": "^7.24.0", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -238,6 +251,47 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/core/node_modules/@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/@babel/parser": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", + "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/core/node_modules/@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/generator": { "version": "7.18.2", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", @@ -253,164 +307,198 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz", - "integrity": "sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.15.0", - "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.16.6", - "semver": "^6.3.0" + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", - "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "dependencies": { - "@babel/helper-get-function-arity": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-get-function-arity": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", - "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", + "node_modules/@babel/helper-function-name/node_modules/@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", "dev": true, "dependencies": { - "@babel/types": "^7.14.5" + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", - "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "dependencies": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz", - "integrity": "sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg==", + "node_modules/@babel/helper-hoist-variables/node_modules/@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", "dev": true, "dependencies": { - "@babel/types": "^7.15.0" + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", - "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dev": true, "dependencies": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz", - "integrity": "sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg==", + "node_modules/@babel/helper-module-imports/node_modules/@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-replace-supers": "^7.15.0", - "@babel/helper-simple-access": "^7.14.8", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/helper-validator-identifier": "^7.14.9", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.15.0", - "@babel/types": "^7.15.0" + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", - "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dev": true, "dependencies": { - "@babel/types": "^7.14.5" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", + "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", "dev": true, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz", - "integrity": "sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA==", + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.15.0", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/traverse": "^7.15.0", - "@babel/types": "^7.15.0" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz", - "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==", + "node_modules/@babel/helper-simple-access/node_modules/@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", "dev": true, "dependencies": { - "@babel/types": "^7.14.8" + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", - "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/helper-split-export-declaration/node_modules/@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-validator-identifier": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", @@ -420,23 +508,37 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.15.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.3.tgz", - "integrity": "sha512-HwJiz52XaS96lX+28Tnbu31VeFSQJGOeKHJeaEPQlTl7PnlhFElWPj8tUXtqFIzeN86XxXoBr+WFAyK2PPVz6g==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.0.tgz", + "integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==", "dev": true, "dependencies": { - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.15.0", - "@babel/types": "^7.15.0" + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers/node_modules/@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.0" @@ -527,6 +629,21 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", @@ -649,39 +766,107 @@ "hasInstallScript": true }, "node_modules/@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template/node_modules/@babel/parser": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", + "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template/node_modules/@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz", - "integrity": "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.0", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.15.0", - "@babel/types": "^7.15.0", - "debug": "^4.1.0", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz", + "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/traverse/node_modules/@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/parser": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", + "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/types": { "version": "7.18.4", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz", @@ -897,20 +1082,20 @@ } }, "node_modules/@jest/console": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", - "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/console/node_modules/ansi-styles": { @@ -984,43 +1169,42 @@ } }, "node_modules/@jest/core": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-28.1.3.tgz", - "integrity": "sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "dependencies": { - "@jest/console": "^28.1.3", - "@jest/reporters": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^28.1.3", - "jest-config": "^28.1.3", - "jest-haste-map": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-resolve-dependencies": "^28.1.3", - "jest-runner": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", - "jest-watcher": "^28.1.3", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", - "pretty-format": "^28.1.3", - "rimraf": "^3.0.0", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -1031,32 +1215,6 @@ } } }, - "node_modules/@jest/core/node_modules/@jest/transform": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", - "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, "node_modules/@jest/core/node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -1087,58 +1245,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@jest/core/node_modules/babel-jest": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.3.tgz", - "integrity": "sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==", - "dev": true, - "dependencies": { - "@jest/transform": "^28.1.3", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^28.1.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/@jest/core/node_modules/babel-plugin-jest-hoist": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz", - "integrity": "sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==", - "dev": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/core/node_modules/babel-preset-jest": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz", - "integrity": "sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==", - "dev": true, - "dependencies": { - "babel-plugin-jest-hoist": "^28.1.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, "node_modules/@jest/core/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -1182,123 +1288,6 @@ "node": ">=8" } }, - "node_modules/@jest/core/node_modules/jest-config": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-28.1.3.tgz", - "integrity": "sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^28.1.3", - "@jest/types": "^28.1.3", - "babel-jest": "^28.1.3", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^28.1.3", - "jest-environment-node": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-runner": "^28.1.3", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^28.1.3", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/@jest/core/node_modules/jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", - "dev": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/@jest/core/node_modules/jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "dev": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "node_modules/@jest/core/node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -1313,18 +1302,17 @@ } }, "node_modules/@jest/core/node_modules/pretty-format": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", - "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/core/node_modules/pretty-format/node_modules/ansi-styles": { @@ -1345,21 +1333,6 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, - "node_modules/@jest/core/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@jest/core/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -1384,109 +1357,97 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@jest/core/node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/@jest/environment": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-28.1.3.tgz", - "integrity": "sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "dependencies": { - "@jest/fake-timers": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^28.1.3" + "jest-mock": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-28.1.3.tgz", - "integrity": "sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, "dependencies": { - "expect": "^28.1.3", - "jest-snapshot": "^28.1.3" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz", - "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dependencies": { - "jest-get-type": "^28.0.2" + "jest-get-type": "^29.6.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils/node_modules/jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/fake-timers": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-28.1.3.tgz", - "integrity": "sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "dependencies": { - "@jest/types": "^28.1.3", - "@sinonjs/fake-timers": "^9.1.2", + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^28.1.3", - "jest-mock": "^28.1.3", - "jest-util": "^28.1.3" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-28.1.3.tgz", - "integrity": "sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/expect": "^28.1.3", - "@jest/types": "^28.1.3" + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-28.1.3.tgz", - "integrity": "sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", @@ -1494,21 +1455,20 @@ "glob": "^7.1.3", "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-instrument": "^6.0.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", - "terminal-link": "^2.0.0", "v8-to-istanbul": "^9.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -1519,32 +1479,6 @@ } } }, - "node_modules/@jest/reporters/node_modules/@jest/transform": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", - "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, "node_modules/@jest/reporters/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -1603,52 +1537,19 @@ "node": ">=8" } }, - "node_modules/@jest/reporters/node_modules/jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", - "dev": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/@jest/reporters/node_modules/jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "dev": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, "node_modules/@jest/reporters/node_modules/jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "dependencies": { "@types/node": "*", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters/node_modules/jest-worker/node_modules/supports-color": { @@ -1666,19 +1567,6 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/@jest/reporters/node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, "node_modules/@jest/reporters/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -1691,147 +1579,146 @@ "node": ">=8" } }, - "node_modules/@jest/reporters/node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/@jest/schemas": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", - "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dependencies": { - "@sinclair/typebox": "^0.24.1" + "@sinclair/typebox": "^0.27.8" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/source-map": { - "version": "28.1.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-28.1.2.tgz", - "integrity": "sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.13", + "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", "graceful-fs": "^4.2.9" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/test-result": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", - "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "dependencies": { - "@jest/console": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/test-sequencer": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz", - "integrity": "sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "dependencies": { - "@jest/test-result": "^28.1.3", + "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", + "jest-haste-map": "^29.7.0", "slash": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/test-sequencer/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/test-sequencer/node_modules/jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", + "node_modules/@jest/transform/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "@jest/types": "^28.1.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "micromatch": "^4.0.4", - "walker": "^1.0.8" + "color-convert": "^2.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": ">=8" }, - "optionalDependencies": { - "fsevents": "^2.3.2" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@jest/test-sequencer/node_modules/jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@jest/test-sequencer/node_modules/jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "node_modules/@jest/transform/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": ">=7.0.0" } }, - "node_modules/@jest/test-sequencer/node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/@jest/transform/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/transform/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": ">=8" } }, - "node_modules/@jest/test-sequencer/node_modules/micromatch": { + "node_modules/@jest/transform/node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", @@ -1844,12 +1731,37 @@ "node": ">=8.6" } }, + "node_modules/@jest/transform/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/transform/node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dependencies": { - "@jest/schemas": "^28.1.3", + "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", @@ -1857,7 +1769,7 @@ "chalk": "^4.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/types/node_modules/ansi-styles": { @@ -1925,14 +1837,14 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "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" }, "engines": { "node": ">=6.0.0" @@ -1948,9 +1860,9 @@ } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "engines": { "node": ">=6.0.0" @@ -1963,13 +1875,13 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "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" } }, "node_modules/@nodelib/fs.scandir": { @@ -2812,9 +2724,9 @@ } }, "node_modules/@sinclair/typebox": { - "version": "0.24.51", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", - "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==" + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" }, "node_modules/@sindresorhus/is": { "version": "4.0.1", @@ -2837,12 +2749,21 @@ } }, "node_modules/@sinonjs/fake-timers": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", - "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "dependencies": { - "@sinonjs/commons": "^1.7.0" + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" } }, "node_modules/@sinonjs/formatio": { @@ -4755,31 +4676,57 @@ } }, "node_modules/@types/babel__core": { - "version": "7.1.18", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.18.tgz", - "integrity": "sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, + "node_modules/@types/babel__core/node_modules/@babel/parser": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", + "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@types/babel__core/node_modules/@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "dev": true, "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "dependencies": { "@babel/parser": "^7.1.0", @@ -4787,12 +4734,26 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", - "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", + "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", "dev": true, "dependencies": { - "@babel/types": "^7.3.0" + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/babel__traverse/node_modules/@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@types/body-parser": { @@ -4911,9 +4872,9 @@ } }, "node_modules/@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, "dependencies": { "@types/node": "*" @@ -4951,12 +4912,12 @@ } }, "node_modules/@types/jest": { - "version": "28.1.8", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-28.1.8.tgz", - "integrity": "sha512-8TJkV++s7B6XqnDrzR1m/TT0A0h948Pnl/097veySPN67VRAgQ4gZ7n2KfJo2rVq6njQjdxU3GCCyDvAeuHoiw==", + "version": "29.5.12", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", + "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", "dependencies": { - "expect": "^28.0.0", - "pretty-format": "^28.0.0" + "expect": "^29.0.0", + "pretty-format": "^29.0.0" } }, "node_modules/@types/jest-json-schema": { @@ -4980,17 +4941,16 @@ } }, "node_modules/@types/jest/node_modules/pretty-format": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", - "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@types/jest/node_modules/react-is": { @@ -5099,12 +5059,6 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, - "node_modules/@types/prettier": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", - "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", - "dev": true - }, "node_modules/@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", @@ -5480,15 +5434,6 @@ "source-map": "^0.6.1" } }, - "node_modules/@vue/compiler-core/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@vue/compiler-dom": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.4.tgz", @@ -5524,15 +5469,6 @@ "source-map": "^0.6.1" } }, - "node_modules/@vue/compiler-sfc/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@vue/compiler-ssr": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.4.tgz", @@ -6890,6 +6826,22 @@ "node": ">=8" } }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/babel-preset-current-node-syntax": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", @@ -7118,26 +7070,35 @@ } }, "node_modules/browserslist": { - "version": "4.16.8", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.8.tgz", - "integrity": "sha512-sc2m9ohR/49sWEbPj14ZSSZqp+kbi16aLao42Hmn3Z8FpjuMaq2xCA2l4zl9ITfyzvnvyE0hcg62YkIGKxgaNQ==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "caniuse-lite": "^1.0.30001251", - "colorette": "^1.3.0", - "electron-to-chromium": "^1.3.811", - "escalade": "^3.1.1", - "node-releases": "^1.1.75" + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" }, "engines": { "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" } }, "node_modules/bs-logger": { @@ -7683,14 +7644,24 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001251", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001251.tgz", - "integrity": "sha512-HOe1r+9VkU4TFmnU70z+r7OLmtR+/chB1rdcJUeQlAinjEeb0cKL20tlAtOagNZhbrtLnCvV19B4FmF1rgzl6A==", + "version": "1.0.30001597", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001597.tgz", + "integrity": "sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w==", "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] }, "node_modules/chalk": { "version": "2.4.2", @@ -8604,13 +8575,10 @@ } }, "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.1" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true }, "node_modules/convert-to-spaces": { "version": "2.0.1", @@ -8706,6 +8674,97 @@ "node": ">=10.0.0" } }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/create-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/create-jest/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/create-jest/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/create-jest/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/create-jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -8994,10 +9053,18 @@ } }, "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "dev": true + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", + "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } }, "node_modules/deep-extend": { "version": "0.6.0", @@ -9348,9 +9415,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.3.813", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.813.tgz", - "integrity": "sha512-YcSRImHt6JZZ2sSuQ4Bzajtk98igQ0iKkksqlzZLzbh4p0OIyJRSvUbsgqfcR8txdfsoYCc4ym306t4p2kP/aw==", + "version": "1.4.701", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.701.tgz", + "integrity": "sha512-K3WPQ36bUOtXg/1+69bFlFOvdSm0/0bGqmsfPDLRXLanoKXdA+pIWuf/VbA9b+2CwBFuONgl4NEz4OEm+OJOKA==", "dev": true }, "node_modules/elfy": { @@ -9370,9 +9437,9 @@ } }, "node_modules/emittery": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", - "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, "engines": { "node": ">=12" @@ -10215,18 +10282,18 @@ } }, "node_modules/expect": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", - "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dependencies": { - "@jest/expect-utils": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3" + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/expect/node_modules/ansi-styles": { @@ -10275,11 +10342,11 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/expect/node_modules/diff-sequences": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", - "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/expect/node_modules/has-flag": { @@ -10291,53 +10358,52 @@ } }, "node_modules/expect/node_modules/jest-diff": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", - "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dependencies": { "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/expect/node_modules/jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/expect/node_modules/jest-matcher-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", - "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/expect/node_modules/pretty-format": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", - "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/expect/node_modules/pretty-format/node_modules/ansi-styles": { @@ -10623,9 +10689,9 @@ } }, "node_modules/fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, "dependencies": { "bser": "2.1.1" @@ -11513,15 +11579,6 @@ "uglify-js": "^3.1.4" } }, - "node_modules/handlebars/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/hard-rejection": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", @@ -12802,21 +12859,66 @@ } }, "node_modules/istanbul-lib-instrument": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", - "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", + "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", "dev": true, "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" + "semver": "^7.5.4" }, "engines": { - "node": ">=8" + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/@babel/parser": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", + "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/istanbul-lib-report": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", @@ -12914,15 +13016,6 @@ "node": ">=10" } }, - "node_modules/istanbul-lib-source-maps/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/istanbul-reports": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", @@ -12955,21 +13048,21 @@ } }, "node_modules/jest": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest/-/jest-28.1.3.tgz", - "integrity": "sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "dependencies": { - "@jest/core": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", "import-local": "^3.0.2", - "jest-cli": "^28.1.3" + "jest-cli": "^29.7.0" }, "bin": { "jest": "bin/jest.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -12981,46 +13074,48 @@ } }, "node_modules/jest-changed-files": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-28.1.3.tgz", - "integrity": "sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "dependencies": { "execa": "^5.0.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-circus": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-28.1.3.tgz", - "integrity": "sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/expect": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "dedent": "^0.7.0", + "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0", - "pretty-format": "^28.1.3", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-circus/node_modules/ansi-styles": { @@ -13073,12 +13168,12 @@ "dev": true }, "node_modules/jest-circus/node_modules/diff-sequences": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", - "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-circus/node_modules/has-flag": { @@ -13091,57 +13186,56 @@ } }, "node_modules/jest-circus/node_modules/jest-diff": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", - "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-circus/node_modules/jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-circus/node_modules/jest-matcher-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", - "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-circus/node_modules/pretty-format": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", - "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-circus/node_modules/pretty-format/node_modules/ansi-styles": { @@ -13175,29 +13269,28 @@ } }, "node_modules/jest-cli": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-28.1.3.tgz", - "integrity": "sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "dependencies": { - "@jest/core": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", "chalk": "^4.0.0", + "create-jest": "^29.7.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^28.1.3", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", - "prompts": "^2.0.1", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "yargs": "^17.3.1" }, "bin": { "jest": "bin/jest.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -13208,32 +13301,6 @@ } } }, - "node_modules/jest-cli/node_modules/@jest/transform": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", - "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, "node_modules/jest-cli/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -13249,58 +13316,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-cli/node_modules/babel-jest": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.3.tgz", - "integrity": "sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==", - "dev": true, - "dependencies": { - "@jest/transform": "^28.1.3", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^28.1.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/jest-cli/node_modules/babel-plugin-jest-hoist": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz", - "integrity": "sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==", - "dev": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-cli/node_modules/babel-preset-jest": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz", - "integrity": "sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==", - "dev": true, - "dependencies": { - "babel-plugin-jest-hoist": "^28.1.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, "node_modules/jest-cli/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -13358,37 +13373,93 @@ "node": ">=8" } }, - "node_modules/jest-cli/node_modules/jest-config": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-28.1.3.tgz", - "integrity": "sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==", + "node_modules/jest-cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "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.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-cli/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^28.1.3", - "@jest/types": "^28.1.3", - "babel-jest": "^28.1.3", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^28.1.3", - "jest-environment-node": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-runner": "^28.1.3", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^28.1.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "@types/node": "*", @@ -13403,79 +13474,126 @@ } } }, - "node_modules/jest-cli/node_modules/jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", + "node_modules/jest-config/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-cli/node_modules/jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", + "node_modules/jest-config/node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "dependencies": { - "@jest/types": "^28.1.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "micromatch": "^4.0.4", - "walker": "^1.0.8" + "slash": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "optionalDependencies": { - "fsevents": "^2.3.2" + "peerDependencies": { + "@babel/core": "^7.8.0" } }, - "node_modules/jest-cli/node_modules/jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "node_modules/jest-config/node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-cli/node_modules/jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "node_modules/jest-config/node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/jest-cli/node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-cli/node_modules/micromatch": { + "node_modules/jest-config/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-config/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-config/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config/node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-config/node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", @@ -13488,22 +13606,21 @@ "node": ">=8.6" } }, - "node_modules/jest-cli/node_modules/pretty-format": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", - "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "node_modules/jest-config/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-cli/node_modules/pretty-format/node_modules/ansi-styles": { + "node_modules/jest-config/node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", @@ -13515,13 +13632,13 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-cli/node_modules/react-is": { + "node_modules/jest-config/node_modules/react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, - "node_modules/jest-cli/node_modules/supports-color": { + "node_modules/jest-config/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", @@ -13533,63 +13650,6 @@ "node": ">=8" } }, - "node_modules/jest-cli/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/jest-cli/node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/jest-cli/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "dependencies": { - "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.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/jest-cli/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, "node_modules/jest-diff": { "version": "27.4.6", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.4.6.tgz", @@ -13669,31 +13729,31 @@ } }, "node_modules/jest-docblock": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-28.1.1.tgz", - "integrity": "sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-each": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-28.1.3.tgz", - "integrity": "sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", - "jest-util": "^28.1.3", - "pretty-format": "^28.1.3" + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-each/node_modules/ansi-styles": { @@ -13755,27 +13815,26 @@ } }, "node_modules/jest-each/node_modules/jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-each/node_modules/pretty-format": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", - "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-each/node_modules/pretty-format/node_modules/ansi-styles": { @@ -13809,20 +13868,20 @@ } }, "node_modules/jest-environment-node": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.3.tgz", - "integrity": "sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^28.1.3", - "jest-util": "^28.1.3" + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-get-type": { @@ -13833,6 +13892,83 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-haste-map/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-haste-map/node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map/node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jest-haste-map/node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/jest-json-schema": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jest-json-schema/-/jest-json-schema-6.1.0.tgz", @@ -13959,16 +14095,16 @@ } }, "node_modules/jest-leak-detector": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz", - "integrity": "sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "dependencies": { - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-leak-detector/node_modules/ansi-styles": { @@ -13984,27 +14120,26 @@ } }, "node_modules/jest-leak-detector/node_modules/jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-leak-detector/node_modules/pretty-format": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", - "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-leak-detector/node_modules/react-is": { @@ -14092,22 +14227,22 @@ } }, "node_modules/jest-message-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", - "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dependencies": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^28.1.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util/node_modules/ansi-styles": { @@ -14176,17 +14311,16 @@ } }, "node_modules/jest-message-util/node_modules/pretty-format": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", - "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util/node_modules/pretty-format/node_modules/ansi-styles": { @@ -14217,16 +14351,17 @@ } }, "node_modules/jest-mock": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.3.tgz", - "integrity": "sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "dependencies": { - "@jest/types": "^28.1.3", - "@types/node": "*" + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-pnp-resolver": { @@ -14246,46 +14381,46 @@ } } }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/jest-resolve": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz", - "integrity": "sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", + "resolve.exports": "^2.0.0", "slash": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve-dependencies": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz", - "integrity": "sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "dependencies": { - "jest-regex-util": "^28.0.2", - "jest-snapshot": "^28.1.3" + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-resolve-dependencies/node_modules/jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "dev": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve/node_modules/ansi-styles": { @@ -14346,82 +14481,6 @@ "node": ">=8" } }, - "node_modules/jest-resolve/node_modules/jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", - "dev": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-resolve/node_modules/jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "dev": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-resolve/node_modules/jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-resolve/node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jest-resolve/node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, "node_modules/jest-resolve/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -14435,61 +14494,35 @@ } }, "node_modules/jest-runner": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-28.1.3.tgz", - "integrity": "sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "dependencies": { - "@jest/console": "^28.1.3", - "@jest/environment": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "emittery": "^0.10.2", + "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^28.1.1", - "jest-environment-node": "^28.1.3", - "jest-haste-map": "^28.1.3", - "jest-leak-detector": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-resolve": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-util": "^28.1.3", - "jest-watcher": "^28.1.3", - "jest-worker": "^28.1.3", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/@jest/transform": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", - "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner/node_modules/ansi-styles": { @@ -14550,52 +14583,19 @@ "node": ">=8" } }, - "node_modules/jest-runner/node_modules/jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", - "dev": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-runner/node_modules/jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "dev": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, "node_modules/jest-runner/node_modules/jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "dependencies": { "@types/node": "*", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner/node_modules/jest-worker/node_modules/supports-color": { @@ -14613,28 +14613,6 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/jest-runner/node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/jest-runner/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/jest-runner/node_modules/source-map-support": { "version": "0.5.13", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", @@ -14657,76 +14635,37 @@ "node": ">=8" } }, - "node_modules/jest-runner/node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/jest-runtime": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.3.tgz", - "integrity": "sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==", - "dev": true, - "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/globals": "^28.1.3", - "@jest/source-map": "^28.1.2", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-mock": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runtime/node_modules/@jest/transform": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", - "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runtime/node_modules/ansi-styles": { @@ -14787,82 +14726,6 @@ "node": ">=8" } }, - "node_modules/jest-runtime/node_modules/jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", - "dev": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-runtime/node_modules/jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "dev": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runtime/node_modules/jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runtime/node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jest-runtime/node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, "node_modules/jest-runtime/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -14875,77 +14738,35 @@ "node": ">=8" } }, - "node_modules/jest-runtime/node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/jest-snapshot": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz", - "integrity": "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^28.1.3", + "expect": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-haste-map": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "natural-compare": "^1.4.0", - "pretty-format": "^28.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/@jest/transform": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", - "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" + "pretty-format": "^29.7.0", + "semver": "^7.5.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-snapshot/node_modules/ansi-styles": { @@ -14998,12 +14819,12 @@ "dev": true }, "node_modules/jest-snapshot/node_modules/diff-sequences": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", - "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-snapshot/node_modules/has-flag": { @@ -15016,105 +14837,42 @@ } }, "node_modules/jest-snapshot/node_modules/jest-diff": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", - "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-snapshot/node_modules/jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-snapshot/node_modules/jest-matcher-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", - "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "dev": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-snapshot/node_modules/lru-cache": { @@ -15129,32 +14887,18 @@ "node": ">=10" } }, - "node_modules/jest-snapshot/node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, "node_modules/jest-snapshot/node_modules/pretty-format": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", - "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-snapshot/node_modules/pretty-format/node_modules/ansi-styles": { @@ -15202,19 +14946,6 @@ "node": ">=8" } }, - "node_modules/jest-snapshot/node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/jest-snapshot/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -15222,11 +14953,11 @@ "dev": true }, "node_modules/jest-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", - "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -15234,7 +14965,7 @@ "picomatch": "^2.2.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-util/node_modules/ansi-styles": { @@ -15302,20 +15033,20 @@ } }, "node_modules/jest-validate": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz", - "integrity": "sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", + "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^28.1.3" + "pretty-format": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-validate/node_modules/ansi-styles": { @@ -15377,27 +15108,26 @@ } }, "node_modules/jest-validate/node_modules/jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-validate/node_modules/pretty-format": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", - "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-validate/node_modules/pretty-format/node_modules/ansi-styles": { @@ -15431,22 +15161,22 @@ } }, "node_modules/jest-watcher": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", - "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "dependencies": { - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "emittery": "^0.10.2", - "jest-util": "^28.1.3", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", "string-length": "^4.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-watcher/node_modules/ansi-escapes": { @@ -16550,15 +16280,6 @@ "source-map": "^0.6.1" } }, - "node_modules/merge-source-map/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -17211,7 +16932,7 @@ "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true }, "node_modules/node-loader": { @@ -17248,9 +16969,9 @@ } }, "node_modules/node-releases": { - "version": "1.1.75", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.75.tgz", - "integrity": "sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, "node_modules/node.extend": { @@ -18373,6 +18094,12 @@ "node": ">=10" } }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -19176,6 +18903,22 @@ "node": ">=6" } }, + "node_modules/pure-rand": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", + "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, "node_modules/query-ast": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/query-ast/-/query-ast-1.0.4.tgz", @@ -20089,9 +19832,9 @@ } }, "node_modules/resolve.exports": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", - "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", "dev": true, "engines": { "node": ">=10" @@ -21929,10 +21672,9 @@ "dev": true }, "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "engines": { "node": ">=0.10.0" } @@ -21955,14 +21697,6 @@ "source-map": "^0.6.0" } }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/sourcemap-codec": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", @@ -22813,83 +22547,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/terminal-link/node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/terminal-link/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/terminal-link/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/terminal-link/node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/terminal-link/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/terser": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.1.tgz", @@ -22931,15 +22588,6 @@ "webpack": "^5.1.0" } }, - "node_modules/terser-webpack-plugin/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/terser/node_modules/source-map": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", @@ -23108,32 +22756,32 @@ } }, "node_modules/ts-jest": { - "version": "28.0.8", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-28.0.8.tgz", - "integrity": "sha512-5FaG0lXmRPzApix8oFG8RKjAz4ehtm8yMKOTy5HX3fY6W8kmvOrmcY0hKDElW52FJov+clhUbrKAqofnj4mXTg==", + "version": "29.1.2", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz", + "integrity": "sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==", "dev": true, "dependencies": { "bs-logger": "0.x", "fast-json-stable-stringify": "2.x", - "jest-util": "^28.0.0", - "json5": "^2.2.1", + "jest-util": "^29.0.0", + "json5": "^2.2.3", "lodash.memoize": "4.x", "make-error": "1.x", - "semver": "7.x", + "semver": "^7.5.3", "yargs-parser": "^21.0.1" }, "bin": { "ts-jest": "cli.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^16.10.0 || ^18.0.0 || >=20.0.0" }, "peerDependencies": { "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/types": "^28.0.0", - "babel-jest": "^28.0.0", - "jest": "^28.0.0", - "typescript": ">=4.3" + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" }, "peerDependenciesMeta": { "@babel/core": { @@ -23856,6 +23504,36 @@ "yarn": "*" } }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -23912,12 +23590,6 @@ "node": ">=10.12.0" } }, - "node_modules/v8-to-istanbul/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -24213,15 +23885,6 @@ "node": ">= 4.4.x" } }, - "node_modules/webpack-license-plugin/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/webpack-license-plugin/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -24854,6 +24517,16 @@ } } }, + "@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, "@arcanis/slice-ansi": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@arcanis/slice-ansi/-/slice-ansi-1.0.2.tgz", @@ -24872,32 +24545,63 @@ } }, "@babel/compat-data": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", - "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", "dev": true }, "@babel/core": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.0.tgz", - "integrity": "sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.0", - "@babel/helper-compilation-targets": "^7.15.0", - "@babel/helper-module-transforms": "^7.15.0", - "@babel/helpers": "^7.14.8", - "@babel/parser": "^7.15.0", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.15.0", - "@babel/types": "^7.15.0", - "convert-source-map": "^1.7.0", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz", + "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.24.0", + "@babel/parser": "^7.24.0", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "dependencies": { + "@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "dev": true, + "requires": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + } + }, + "@babel/parser": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", + "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", + "dev": true + }, + "@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/generator": { @@ -24912,145 +24616,193 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz", - "integrity": "sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dev": true, "requires": { - "@babel/compat-data": "^7.15.0", - "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.16.6", - "semver": "^6.3.0" + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" } }, - "@babel/helper-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", - "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/types": "^7.14.5" - } + "@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true }, - "@babel/helper-get-function-arity": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", - "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", + "@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "requires": { - "@babel/types": "^7.14.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-hoist-variables": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", - "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", - "dev": true, - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz", - "integrity": "sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "requires": { - "@babel/types": "^7.15.0" + "@babel/types": "^7.22.5" + }, + "dependencies": { + "@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-module-imports": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", - "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dev": true, "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.22.15" + }, + "dependencies": { + "@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-module-transforms": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz", - "integrity": "sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-replace-supers": "^7.15.0", - "@babel/helper-simple-access": "^7.14.8", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/helper-validator-identifier": "^7.14.9", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.15.0", - "@babel/types": "^7.15.0" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", - "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dev": true, "requires": { - "@babel/types": "^7.14.5" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" } }, "@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", + "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", "dev": true }, - "@babel/helper-replace-supers": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz", - "integrity": "sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.15.0", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/traverse": "^7.15.0", - "@babel/types": "^7.15.0" - } - }, "@babel/helper-simple-access": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz", - "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, "requires": { - "@babel/types": "^7.14.8" + "@babel/types": "^7.22.5" + }, + "dependencies": { + "@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-split-export-declaration": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", - "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.22.5" + }, + "dependencies": { + "@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + } + } } }, + "@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "dev": true + }, "@babel/helper-validator-identifier": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==" }, "@babel/helper-validator-option": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", "dev": true }, "@babel/helpers": { - "version": "7.15.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.3.tgz", - "integrity": "sha512-HwJiz52XaS96lX+28Tnbu31VeFSQJGOeKHJeaEPQlTl7PnlhFElWPj8tUXtqFIzeN86XxXoBr+WFAyK2PPVz6g==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.0.tgz", + "integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==", "dev": true, "requires": { - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.15.0", - "@babel/types": "^7.15.0" + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/highlight": { @@ -25114,6 +24866,15 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, + "@babel/plugin-syntax-jsx": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, "@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", @@ -25205,31 +24966,82 @@ } }, "@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", "dev": true, "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" + }, + "dependencies": { + "@babel/parser": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", + "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", + "dev": true + }, + "@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/traverse": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz", - "integrity": "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.0", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.15.0", - "@babel/types": "^7.15.0", - "debug": "^4.1.0", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz", + "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0", + "debug": "^4.3.1", "globals": "^11.1.0" + }, + "dependencies": { + "@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "dev": true, + "requires": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + } + }, + "@babel/parser": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", + "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", + "dev": true + }, + "@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/types": { @@ -25396,16 +25208,16 @@ "dev": true }, "@jest/console": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", - "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "requires": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0" }, "dependencies": { @@ -25461,65 +25273,41 @@ } }, "@jest/core": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-28.1.3.tgz", - "integrity": "sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "requires": { - "@jest/console": "^28.1.3", - "@jest/reporters": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^28.1.3", - "jest-config": "^28.1.3", - "jest-haste-map": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-resolve-dependencies": "^28.1.3", - "jest-runner": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", - "jest-watcher": "^28.1.3", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", - "pretty-format": "^28.1.3", - "rimraf": "^3.0.0", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, "dependencies": { - "@jest/transform": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", - "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" - } - }, "ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -25538,43 +25326,6 @@ "color-convert": "^2.0.1" } }, - "babel-jest": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.3.tgz", - "integrity": "sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==", - "dev": true, - "requires": { - "@jest/transform": "^28.1.3", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^28.1.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - } - }, - "babel-plugin-jest-hoist": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz", - "integrity": "sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-preset-jest": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz", - "integrity": "sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^28.1.3", - "babel-preset-current-node-syntax": "^1.0.0" - } - }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -25606,90 +25357,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "jest-config": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-28.1.3.tgz", - "integrity": "sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^28.1.3", - "@jest/types": "^28.1.3", - "babel-jest": "^28.1.3", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^28.1.3", - "jest-environment-node": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-runner": "^28.1.3", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^28.1.3", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - } - }, - "jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true - }, - "jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", - "dev": true, - "requires": { - "@jest/types": "^28.1.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - } - }, - "jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "dev": true - }, - "jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, "micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -25701,13 +25368,12 @@ } }, "pretty-format": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", - "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "requires": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -25726,15 +25392,6 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -25749,93 +25406,84 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true - }, - "write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - } } } }, "@jest/environment": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-28.1.3.tgz", - "integrity": "sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "requires": { - "@jest/fake-timers": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^28.1.3" + "jest-mock": "^29.7.0" } }, "@jest/expect": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-28.1.3.tgz", - "integrity": "sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, "requires": { - "expect": "^28.1.3", - "jest-snapshot": "^28.1.3" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" } }, "@jest/expect-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz", - "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "requires": { - "jest-get-type": "^28.0.2" + "jest-get-type": "^29.6.3" }, "dependencies": { "jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==" + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==" } } }, "@jest/fake-timers": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-28.1.3.tgz", - "integrity": "sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "requires": { - "@jest/types": "^28.1.3", - "@sinonjs/fake-timers": "^9.1.2", + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^28.1.3", - "jest-mock": "^28.1.3", - "jest-util": "^28.1.3" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" } }, "@jest/globals": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-28.1.3.tgz", - "integrity": "sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "requires": { - "@jest/environment": "^28.1.3", - "@jest/expect": "^28.1.3", - "@jest/types": "^28.1.3" + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" } }, "@jest/reporters": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-28.1.3.tgz", - "integrity": "sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", @@ -25843,43 +25491,19 @@ "glob": "^7.1.3", "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-instrument": "^6.0.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", - "terminal-link": "^2.0.0", "v8-to-istanbul": "^9.0.1" }, "dependencies": { - "@jest/transform": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", - "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" - } - }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -25920,39 +25544,14 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", - "dev": true, - "requires": { - "@jest/types": "^28.1.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - } - }, - "jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "dev": true - }, "jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "requires": { "@types/node": "*", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -25968,16 +25567,6 @@ } } }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -25986,116 +25575,115 @@ "requires": { "has-flag": "^4.0.0" } - }, - "write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - } } } }, "@jest/schemas": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", - "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "requires": { - "@sinclair/typebox": "^0.24.1" + "@sinclair/typebox": "^0.27.8" } }, "@jest/source-map": { - "version": "28.1.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-28.1.2.tgz", - "integrity": "sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.13", + "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", "graceful-fs": "^4.2.9" } }, "@jest/test-result": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", - "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "requires": { - "@jest/console": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz", - "integrity": "sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "requires": { - "@jest/test-result": "^28.1.3", + "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", + "jest-haste-map": "^29.7.0", "slash": "^3.0.0" + } + }, + "@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" }, "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@jest/types": "^28.1.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "micromatch": "^4.0.4", - "walker": "^1.0.8" + "color-convert": "^2.0.1" } }, - "jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "dev": true + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } }, - "jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "color-name": "~1.1.4" } }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, "micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -26105,15 +25693,34 @@ "braces": "^3.0.2", "picomatch": "^2.3.1" } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + } } } }, "@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "requires": { - "@jest/schemas": "^28.1.3", + "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", @@ -26167,14 +25774,14 @@ } }, "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "requires": { - "@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": { @@ -26184,9 +25791,9 @@ "dev": true }, "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true }, "@jridgewell/sourcemap-codec": { @@ -26196,13 +25803,13 @@ "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "@nodelib/fs.scandir": { @@ -26882,9 +26489,9 @@ } }, "@sinclair/typebox": { - "version": "0.24.51", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", - "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==" + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" }, "@sindresorhus/is": { "version": "4.0.1", @@ -26901,12 +26508,23 @@ } }, "@sinonjs/fake-timers": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", - "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "requires": { - "@sinonjs/commons": "^1.7.0" + "@sinonjs/commons": "^3.0.0" + }, + "dependencies": { + "@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + } } }, "@sinonjs/formatio": { @@ -28403,31 +28021,50 @@ } }, "@types/babel__core": { - "version": "7.1.18", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.18.tgz", - "integrity": "sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" + }, + "dependencies": { + "@babel/parser": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", + "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", + "dev": true + }, + "@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + } + } } }, "@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "dev": true, "requires": { "@babel/types": "^7.0.0" } }, "@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -28435,12 +28072,25 @@ } }, "@types/babel__traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", - "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", + "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", "dev": true, "requires": { - "@babel/types": "^7.3.0" + "@babel/types": "^7.20.7" + }, + "dependencies": { + "@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + } + } } }, "@types/body-parser": { @@ -28559,9 +28209,9 @@ } }, "@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, "requires": { "@types/node": "*" @@ -28599,12 +28249,12 @@ } }, "@types/jest": { - "version": "28.1.8", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-28.1.8.tgz", - "integrity": "sha512-8TJkV++s7B6XqnDrzR1m/TT0A0h948Pnl/097veySPN67VRAgQ4gZ7n2KfJo2rVq6njQjdxU3GCCyDvAeuHoiw==", + "version": "29.5.12", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", + "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", "requires": { - "expect": "^28.0.0", - "pretty-format": "^28.0.0" + "expect": "^29.0.0", + "pretty-format": "^29.0.0" }, "dependencies": { "ansi-styles": { @@ -28613,12 +28263,11 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" }, "pretty-format": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", - "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "requires": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } @@ -28740,12 +28389,6 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, - "@types/prettier": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", - "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", - "dev": true - }, "@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", @@ -29008,14 +28651,6 @@ "@vue/shared": "3.2.4", "estree-walker": "^2.0.1", "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "@vue/compiler-dom": { @@ -29051,14 +28686,6 @@ "postcss-modules": "^4.0.0", "postcss-selector-parser": "^6.0.4", "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "@vue/compiler-ssr": { @@ -30108,6 +29735,21 @@ "@istanbuljs/schema": "^0.1.2", "istanbul-lib-instrument": "^5.0.4", "test-exclude": "^6.0.0" + }, + "dependencies": { + "istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + } + } } }, "babel-preset-current-node-syntax": { @@ -30299,16 +29941,15 @@ } }, "browserslist": { - "version": "4.16.8", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.8.tgz", - "integrity": "sha512-sc2m9ohR/49sWEbPj14ZSSZqp+kbi16aLao42Hmn3Z8FpjuMaq2xCA2l4zl9ITfyzvnvyE0hcg62YkIGKxgaNQ==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001251", - "colorette": "^1.3.0", - "electron-to-chromium": "^1.3.811", - "escalade": "^3.1.1", - "node-releases": "^1.1.75" + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" } }, "bs-logger": { @@ -30704,9 +30345,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001251", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001251.tgz", - "integrity": "sha512-HOe1r+9VkU4TFmnU70z+r7OLmtR+/chB1rdcJUeQlAinjEeb0cKL20tlAtOagNZhbrtLnCvV19B4FmF1rgzl6A==", + "version": "1.0.30001597", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001597.tgz", + "integrity": "sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w==", "dev": true }, "chalk": { @@ -31382,13 +31023,10 @@ } }, "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true }, "convert-to-spaces": { "version": "2.0.1", @@ -31456,6 +31094,72 @@ "nan": "^2.17.0" } }, + "create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "requires": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -31679,10 +31383,11 @@ } }, "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "dev": true + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", + "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "dev": true, + "requires": {} }, "deep-extend": { "version": "0.6.0", @@ -31965,9 +31670,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.813", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.813.tgz", - "integrity": "sha512-YcSRImHt6JZZ2sSuQ4Bzajtk98igQ0iKkksqlzZLzbh4p0OIyJRSvUbsgqfcR8txdfsoYCc4ym306t4p2kP/aw==", + "version": "1.4.701", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.701.tgz", + "integrity": "sha512-K3WPQ36bUOtXg/1+69bFlFOvdSm0/0bGqmsfPDLRXLanoKXdA+pIWuf/VbA9b+2CwBFuONgl4NEz4OEm+OJOKA==", "dev": true }, "elfy": { @@ -31984,9 +31689,9 @@ "integrity": "sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ==" }, "emittery": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", - "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true }, "emoji-regex": { @@ -32597,15 +32302,15 @@ } }, "expect": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", - "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "requires": { - "@jest/expect-utils": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3" + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "dependencies": { "ansi-styles": { @@ -32639,9 +32344,9 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "diff-sequences": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", - "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==" + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==" }, "has-flag": { "version": "4.0.0", @@ -32649,39 +32354,38 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "jest-diff": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", - "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "requires": { "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" } }, "jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==" + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==" }, "jest-matcher-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", - "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "requires": { "chalk": "^4.0.0", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" } }, "pretty-format": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", - "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "requires": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -32934,9 +32638,9 @@ } }, "fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, "requires": { "bser": "2.1.1" @@ -33603,14 +33307,6 @@ "source-map": "^0.6.1", "uglify-js": "^3.1.4", "wordwrap": "^1.0.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "hard-rejection": { @@ -34507,16 +34203,48 @@ "dev": true }, "istanbul-lib-instrument": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", - "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", + "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", "dev": true, "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" + "semver": "^7.5.4" + }, + "dependencies": { + "@babel/parser": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", + "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } } }, "istanbul-lib-report": { @@ -34589,14 +34317,6 @@ "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "istanbul-reports": { @@ -34620,50 +34340,52 @@ } }, "jest": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest/-/jest-28.1.3.tgz", - "integrity": "sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "requires": { - "@jest/core": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", "import-local": "^3.0.2", - "jest-cli": "^28.1.3" + "jest-cli": "^29.7.0" } }, "jest-changed-files": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-28.1.3.tgz", - "integrity": "sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "requires": { "execa": "^5.0.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0" } }, "jest-circus": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-28.1.3.tgz", - "integrity": "sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "requires": { - "@jest/environment": "^28.1.3", - "@jest/expect": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "dedent": "^0.7.0", + "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0", - "pretty-format": "^28.1.3", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -34703,9 +34425,9 @@ "dev": true }, "diff-sequences": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", - "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true }, "has-flag": { @@ -34715,43 +34437,42 @@ "dev": true }, "jest-diff": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", - "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "requires": { "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" } }, "jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true }, "jest-matcher-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", - "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "requires": { "chalk": "^4.0.0", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" } }, "pretty-format": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", - "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "requires": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -34782,48 +34503,148 @@ } }, "jest-cli": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-28.1.3.tgz", - "integrity": "sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "requires": { - "@jest/core": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", "chalk": "^4.0.0", + "create-jest": "^29.7.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^28.1.3", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", - "prompts": "^2.0.1", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "yargs": "^17.3.1" }, "dependencies": { - "@jest/transform": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", - "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "requires": { + "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.1.1" } }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true + } + } + }, + "jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -34834,24 +34655,24 @@ } }, "babel-jest": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.3.tgz", - "integrity": "sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "requires": { - "@jest/transform": "^28.1.3", + "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^28.1.3", + "babel-preset-jest": "^29.6.3", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" } }, "babel-plugin-jest-hoist": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz", - "integrity": "sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, "requires": { "@babel/template": "^7.3.3", @@ -34861,12 +34682,12 @@ } }, "babel-preset-jest": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz", - "integrity": "sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, "requires": { - "babel-plugin-jest-hoist": "^28.1.3", + "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" } }, @@ -34880,17 +34701,6 @@ "supports-color": "^7.1.0" } }, - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -34912,90 +34722,12 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "jest-config": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-28.1.3.tgz", - "integrity": "sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^28.1.3", - "@jest/types": "^28.1.3", - "babel-jest": "^28.1.3", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^28.1.3", - "jest-environment-node": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-runner": "^28.1.3", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^28.1.3", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - } - }, "jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true - }, - "jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", - "dev": true, - "requires": { - "@jest/types": "^28.1.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - } - }, - "jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true }, - "jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, "micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -35007,13 +34739,12 @@ } }, "pretty-format": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", - "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "requires": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -35040,48 +34771,6 @@ "requires": { "has-flag": "^4.0.0" } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - } - }, - "yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "requires": { - "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.1.1" - } - }, - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true } } }, @@ -35142,25 +34831,25 @@ } }, "jest-docblock": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-28.1.1.tgz", - "integrity": "sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "requires": { "detect-newline": "^3.0.0" } }, "jest-each": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-28.1.3.tgz", - "integrity": "sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "requires": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", - "jest-util": "^28.1.3", - "pretty-format": "^28.1.3" + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, "dependencies": { "ansi-styles": { @@ -35204,19 +34893,18 @@ "dev": true }, "jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true }, "pretty-format": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", - "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "requires": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -35247,17 +34935,17 @@ } }, "jest-environment-node": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.3.tgz", - "integrity": "sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "requires": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^28.1.3", - "jest-util": "^28.1.3" + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" } }, "jest-get-type": { @@ -35265,6 +34953,67 @@ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.4.0.tgz", "integrity": "sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ==" }, + "jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "requires": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "requires": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + } + } + }, "jest-json-schema": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jest-json-schema/-/jest-json-schema-6.1.0.tgz", @@ -35358,13 +35107,13 @@ } }, "jest-leak-detector": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz", - "integrity": "sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "requires": { - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "dependencies": { "ansi-styles": { @@ -35374,19 +35123,18 @@ "dev": true }, "jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true }, "pretty-format": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", - "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "requires": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } @@ -35456,17 +35204,17 @@ } }, "jest-message-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", - "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "requires": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^28.1.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -35516,12 +35264,11 @@ } }, "pretty-format": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", - "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "requires": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -35549,13 +35296,14 @@ } }, "jest-mock": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.3.tgz", - "integrity": "sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "requires": { - "@jest/types": "^28.1.3", - "@types/node": "*" + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" } }, "jest-pnp-resolver": { @@ -35565,20 +35313,26 @@ "dev": true, "requires": {} }, + "jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true + }, "jest-resolve": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz", - "integrity": "sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "requires": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", + "resolve.exports": "^2.0.0", "slash": "^3.0.0" }, "dependencies": { @@ -35622,64 +35376,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", - "dev": true, - "requires": { - "@jest/types": "^28.1.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - } - }, - "jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "dev": true - }, - "jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -35692,75 +35388,44 @@ } }, "jest-resolve-dependencies": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz", - "integrity": "sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "requires": { - "jest-regex-util": "^28.0.2", - "jest-snapshot": "^28.1.3" - }, - "dependencies": { - "jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "dev": true - } + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" } }, "jest-runner": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-28.1.3.tgz", - "integrity": "sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "requires": { - "@jest/console": "^28.1.3", - "@jest/environment": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "emittery": "^0.10.2", + "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^28.1.1", - "jest-environment-node": "^28.1.3", - "jest-haste-map": "^28.1.3", - "jest-leak-detector": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-resolve": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-util": "^28.1.3", - "jest-watcher": "^28.1.3", - "jest-worker": "^28.1.3", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, "dependencies": { - "@jest/transform": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", - "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" - } - }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -35801,39 +35466,14 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", - "dev": true, - "requires": { - "@jest/types": "^28.1.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - } - }, - "jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "dev": true - }, "jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "requires": { "@types/node": "*", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -35849,22 +35489,6 @@ } } }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "source-map-support": { "version": "0.5.13", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", @@ -35883,72 +35507,39 @@ "requires": { "has-flag": "^4.0.0" } - }, - "write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - } } } }, "jest-runtime": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.3.tgz", - "integrity": "sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==", - "dev": true, - "requires": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/globals": "^28.1.3", - "@jest/source-map": "^28.1.2", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "requires": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-mock": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, "dependencies": { - "@jest/transform": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", - "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" - } - }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -35989,64 +35580,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", - "dev": true, - "requires": { - "@jest/types": "^28.1.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - } - }, - "jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "dev": true - }, - "jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -36055,73 +35588,37 @@ "requires": { "has-flag": "^4.0.0" } - }, - "write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - } } } }, "jest-snapshot": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz", - "integrity": "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "requires": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^28.1.3", + "expect": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-haste-map": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "natural-compare": "^1.4.0", - "pretty-format": "^28.1.3", - "semver": "^7.3.5" + "pretty-format": "^29.7.0", + "semver": "^7.5.3" }, "dependencies": { - "@jest/transform": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", - "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" - } - }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -36157,9 +35654,9 @@ "dev": true }, "diff-sequences": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", - "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true }, "has-flag": { @@ -36169,81 +35666,33 @@ "dev": true }, "jest-diff": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", - "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "requires": { "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" } }, "jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true }, - "jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", - "dev": true, - "requires": { - "@jest/types": "^28.1.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - } - }, "jest-matcher-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", - "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "requires": { "chalk": "^4.0.0", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - } - }, - "jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "dev": true - }, - "jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" } }, "lru-cache": { @@ -36255,24 +35704,13 @@ "yallist": "^4.0.0" } }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, "pretty-format": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", - "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "requires": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -36309,16 +35747,6 @@ "has-flag": "^4.0.0" } }, - "write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - } - }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -36328,11 +35756,11 @@ } }, "jest-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", - "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "requires": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -36386,17 +35814,17 @@ } }, "jest-validate": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz", - "integrity": "sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "requires": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", + "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^28.1.3" + "pretty-format": "^29.7.0" }, "dependencies": { "ansi-styles": { @@ -36440,19 +35868,18 @@ "dev": true }, "jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true }, "pretty-format": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", - "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "requires": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -36483,18 +35910,18 @@ } }, "jest-watcher": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", - "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "requires": { - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "emittery": "^0.10.2", - "jest-util": "^28.1.3", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", "string-length": "^4.0.1" }, "dependencies": { @@ -37400,14 +36827,6 @@ "dev": true, "requires": { "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "merge-stream": { @@ -37919,7 +37338,7 @@ "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true }, "node-loader": { @@ -37945,9 +37364,9 @@ } }, "node-releases": { - "version": "1.1.75", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.75.tgz", - "integrity": "sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, "node.extend": { @@ -38781,6 +38200,12 @@ "resolved": "https://registry.npmjs.org/peggy/-/peggy-1.2.0.tgz", "integrity": "sha512-PQ+NKpAobImfMprYQtc4Egmyi29bidRGEX0kKjCU5uuW09s0Cthwqhfy7mLkwcB4VcgacE5L/ZjruD/kOPCUUw==" }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -39363,6 +38788,12 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, + "pure-rand": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", + "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", + "dev": true + }, "query-ast": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/query-ast/-/query-ast-1.0.4.tgz", @@ -40030,9 +39461,9 @@ } }, "resolve.exports": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", - "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", "dev": true }, "responselike": { @@ -41497,10 +40928,9 @@ "dev": true }, "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "source-map-js": { "version": "0.6.2", @@ -41515,13 +40945,6 @@ "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } } }, "sourcemap-codec": { @@ -42172,58 +41595,6 @@ "temp-dir": "^3.0.0" } }, - "terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - }, - "dependencies": { - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - } - }, - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - } - } - }, "terser": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.1.tgz", @@ -42255,14 +41626,6 @@ "serialize-javascript": "^6.0.0", "source-map": "^0.6.1", "terser": "^5.7.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "test-exclude": { @@ -42396,18 +41759,18 @@ "dev": true }, "ts-jest": { - "version": "28.0.8", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-28.0.8.tgz", - "integrity": "sha512-5FaG0lXmRPzApix8oFG8RKjAz4ehtm8yMKOTy5HX3fY6W8kmvOrmcY0hKDElW52FJov+clhUbrKAqofnj4mXTg==", + "version": "29.1.2", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz", + "integrity": "sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==", "dev": true, "requires": { "bs-logger": "0.x", "fast-json-stable-stringify": "2.x", - "jest-util": "^28.0.0", - "json5": "^2.2.1", + "jest-util": "^29.0.0", + "json5": "^2.2.3", "lodash.memoize": "4.x", "make-error": "1.x", - "semver": "7.x", + "semver": "^7.5.3", "yargs-parser": "^21.0.1" }, "dependencies": { @@ -42908,6 +42271,16 @@ "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==" }, + "update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -42953,14 +42326,6 @@ "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^2.0.0" - }, - "dependencies": { - "convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - } } }, "validate-npm-package-license": { @@ -43198,12 +42563,6 @@ "sax": "^1.2.4" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", diff --git a/package.json b/package.json index 5594ba983a..c73e6a64be 100644 --- a/package.json +++ b/package.json @@ -139,7 +139,7 @@ "@types/cross-spawn": "^6.0.2", "@types/express": "^4.17.13", "@types/fs-extra": "^9.0.11", - "@types/jest": "^28.1.8", + "@types/jest": "29.5.12", "@types/lodash": "^4.14.161", "@types/needle": "^3.3.0", "@types/node": "^14.14.31", @@ -160,7 +160,7 @@ "eslint-plugin-jest": "^24.4.0", "express": "^4.17.1", "fs-extra": "^9.1.0", - "jest": "^28.1.3", + "jest": "29.7.0", "jest-junit": "^16.0.0", "jsonparse": "^1.3.1", "lodash": "^4.17.20", @@ -173,7 +173,7 @@ "proxyquire": "^1.7.4", "sinon": "^4.0.0", "tap": "^18.7.0", - "ts-jest": "^28.0.8", + "ts-jest": "29.1.2", "ts-loader": "^9.5.1", "ts-node": "^10.9.2", "typescript": "^4.9.5", diff --git a/packages/snyk-fix/test/unit/__snapshots__/fix.spec.ts.snap b/packages/snyk-fix/test/unit/__snapshots__/fix.spec.ts.snap index 9fbcc0dbb1..08e95deb36 100644 --- a/packages/snyk-fix/test/unit/__snapshots__/fix.spec.ts.snap +++ b/packages/snyk-fix/test/unit/__snapshots__/fix.spec.ts.snap @@ -1,59 +1,59 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`Error handling Snyk fix returns error when called with unsupported type 1`] = ` -Object { - "exceptions": Object { - "npm": Object { - "originals": Array [ - Object { - "options": Object { +{ + "exceptions": { + "npm": { + "originals": [ + { + "options": { "command": "python3", }, - "scanResult": Object { - "facts": Array [ - Object { + "scanResult": { + "facts": [ + { "data": "not-implemented", "type": "not-implemented", }, ], - "identity": Object { + "identity": { "targetFile": "package.json", "type": "npm", }, }, - "testResult": Object { + "testResult": { "depGraphData": "", - "issues": Array [ - Object { - "fixInfo": Object {}, + "issues": [ + { + "fixInfo": {}, "issueId": "VULN_ID_1", "pkgName": "package@version", }, ], - "issuesData": Object { - "vuln-id": Object { + "issuesData": { + "vuln-id": { "id": "VULN_ID_1", "severity": "high", "title": "Fake vuln", }, }, - "remediation": Object { - "ignore": Object {}, - "patch": Object {}, - "pin": Object { - "django@1.6.1": Object { + "remediation": { + "ignore": {}, + "patch": {}, + "pin": { + "django@1.6.1": { "isTransitive": false, "upgradeTo": "django@2.0.1", - "vulns": Array [ + "vulns": [ "vuln-id", ], }, }, - "unresolved": Array [], - "upgrade": Object {}, + "unresolved": [], + "upgrade": {}, }, }, - "workspace": Object { + "workspace": { "path": ".", "readFile": [Function], "writeFile": [Function], @@ -81,20 +81,20 @@ Summary: Tip: Re-run in debug mode to see more information: DEBUG=*snyk* . If the issue persists contact support@snyk.io", - "meta": Object { + "meta": { "failed": 1, "fixableIssues": 1, "fixed": 0, "fixedIssues": 0, "totalIssues": 1, }, - "results": Object {}, + "results": {}, } `; exports[`Error handling Snyk fix returns error when manifest can not be parsed 1`] = ` -Object { - "exceptions": Object {}, +{ + "exceptions": {}, "fixSummary": " Successful fixes: @@ -109,23 +109,23 @@ Summary: 1 issues are fixable 1 issues were successfully fixed ", - "meta": Object { + "meta": { "failed": 0, "fixableIssues": 1, "fixed": 1, "fixedIssues": 1, "totalIssues": 1, }, - "results": Object { - "python": Object { - "failed": Array [], - "skipped": Array [], - "succeeded": Array [ - Object { - "changes": Array [ - Object { + "results": { + "python": { + "failed": [], + "skipped": [], + "succeeded": [ + { + "changes": [ + { "from": "django@1.6.1", - "issueIds": Array [ + "issueIds": [ "vuln-id", ], "success": true, @@ -133,55 +133,55 @@ Summary: "userMessage": "Pinned django from 1.6.1 to 2.0.1", }, ], - "original": Object { - "options": Object { + "original": { + "options": { "command": "python3", }, - "scanResult": Object { - "facts": Array [ - Object { + "scanResult": { + "facts": [ + { "data": "not-implemented", "type": "not-implemented", }, ], - "identity": Object { + "identity": { "targetFile": "requirements.txt", "type": "pip", }, }, - "testResult": Object { + "testResult": { "depGraphData": "", - "issues": Array [ - Object { - "fixInfo": Object {}, + "issues": [ + { + "fixInfo": {}, "issueId": "VULN_ID_1", "pkgName": "package@version", }, ], - "issuesData": Object { - "vuln-id": Object { + "issuesData": { + "vuln-id": { "id": "VULN_ID_1", "severity": "high", "title": "Fake vuln", }, }, - "remediation": Object { - "ignore": Object {}, - "patch": Object {}, - "pin": Object { - "django@1.6.1": Object { + "remediation": { + "ignore": {}, + "patch": {}, + "pin": { + "django@1.6.1": { "isTransitive": false, "upgradeTo": "django@2.0.1", - "vulns": Array [ + "vulns": [ "vuln-id", ], }, }, - "unresolved": Array [], - "upgrade": Object {}, + "unresolved": [], + "upgrade": {}, }, }, - "workspace": Object { + "workspace": { "path": ".", "readFile": [Function], "writeFile": [Function], @@ -195,8 +195,8 @@ Summary: `; exports[`Snyk fix Snyk fix returns results for supported & unsupported type 1`] = ` -Object { - "exceptions": Object {}, +{ + "exceptions": {}, "fixSummary": " Successful fixes: @@ -215,23 +215,23 @@ Summary: 2 issues are fixable 2 issues were successfully fixed ", - "meta": Object { + "meta": { "failed": 0, "fixableIssues": 2, "fixed": 2, "fixedIssues": 2, "totalIssues": 2, }, - "results": Object { - "python": Object { - "failed": Array [], - "skipped": Array [], - "succeeded": Array [ - Object { - "changes": Array [ - Object { + "results": { + "python": { + "failed": [], + "skipped": [], + "succeeded": [ + { + "changes": [ + { "from": "django@1.6.1", - "issueIds": Array [ + "issueIds": [ "vuln-id", ], "success": true, @@ -239,66 +239,66 @@ Summary: "userMessage": "Upgraded django from 1.6.1 to 2.0.1", }, ], - "original": Object { - "options": Object { + "original": { + "options": { "command": "python3", }, - "scanResult": Object { - "facts": Array [ - Object { + "scanResult": { + "facts": [ + { "data": "not-implemented", "type": "not-implemented", }, ], - "identity": Object { + "identity": { "targetFile": "Pipfile", "type": "pip", }, }, - "testResult": Object { + "testResult": { "depGraphData": "", - "issues": Array [ - Object { - "fixInfo": Object {}, + "issues": [ + { + "fixInfo": {}, "issueId": "VULN_ID_1", "pkgName": "package@version", }, ], - "issuesData": Object { - "vuln-id": Object { + "issuesData": { + "vuln-id": { "id": "VULN_ID_1", "severity": "high", "title": "Fake vuln", }, }, - "remediation": Object { - "ignore": Object {}, - "patch": Object {}, - "pin": Object { - "django@1.6.1": Object { + "remediation": { + "ignore": {}, + "patch": {}, + "pin": { + "django@1.6.1": { "isTransitive": false, "upgradeTo": "django@2.0.1", - "vulns": Array [ + "vulns": [ "vuln-id", ], }, }, - "unresolved": Array [], - "upgrade": Object {}, + "unresolved": [], + "upgrade": {}, }, }, - "workspace": Object { + "workspace": { "path": ".", "readFile": [Function], "writeFile": [Function], }, }, }, - Object { - "changes": Array [ - Object { + { + "changes": [ + { "from": "django@1.6.1", - "issueIds": Array [ + "issueIds": [ "vuln-id", ], "success": true, @@ -306,55 +306,55 @@ Summary: "userMessage": "Upgraded django from 1.6.1 to 2.0.1", }, ], - "original": Object { - "options": Object { + "original": { + "options": { "command": "python3", }, - "scanResult": Object { - "facts": Array [ - Object { + "scanResult": { + "facts": [ + { "data": "not-implemented", "type": "not-implemented", }, ], - "identity": Object { + "identity": { "targetFile": "requirements.txt", "type": "pip", }, }, - "testResult": Object { + "testResult": { "depGraphData": "", - "issues": Array [ - Object { - "fixInfo": Object {}, + "issues": [ + { + "fixInfo": {}, "issueId": "VULN_ID_1", "pkgName": "package@version", }, ], - "issuesData": Object { - "vuln-id": Object { + "issuesData": { + "vuln-id": { "id": "VULN_ID_1", "severity": "high", "title": "Fake vuln", }, }, - "remediation": Object { - "ignore": Object {}, - "patch": Object {}, - "pin": Object { - "django@1.6.1": Object { + "remediation": { + "ignore": {}, + "patch": {}, + "pin": { + "django@1.6.1": { "isTransitive": false, "upgradeTo": "django@2.0.1", - "vulns": Array [ + "vulns": [ "vuln-id", ], }, }, - "unresolved": Array [], - "upgrade": Object {}, + "unresolved": [], + "upgrade": {}, }, }, - "workspace": Object { + "workspace": { "path": ".", "readFile": [Function], "writeFile": [Function], @@ -367,19 +367,19 @@ Summary: } `; -exports[`Snyk fix Snyk fix returns results for supported type 1`] = `Object {}`; +exports[`Snyk fix Snyk fix returns results for supported type 1`] = `{}`; exports[`Snyk fix Snyk fix returns results for supported type 2`] = ` -Object { - "python": Object { - "failed": Array [], - "skipped": Array [], - "succeeded": Array [ - Object { - "changes": Array [ - Object { +{ + "python": { + "failed": [], + "skipped": [], + "succeeded": [ + { + "changes": [ + { "from": "django@1.6.1", - "issueIds": Array [ + "issueIds": [ "vuln-id", ], "success": true, @@ -387,66 +387,66 @@ Object { "userMessage": "Upgraded django from 1.6.1 to 2.0.1", }, ], - "original": Object { - "options": Object { + "original": { + "options": { "command": "python3", }, - "scanResult": Object { - "facts": Array [ - Object { + "scanResult": { + "facts": [ + { "data": "not-implemented", "type": "not-implemented", }, ], - "identity": Object { + "identity": { "targetFile": "requirements.txt", "type": "pip", }, }, - "testResult": Object { + "testResult": { "depGraphData": "", - "issues": Array [ - Object { - "fixInfo": Object {}, + "issues": [ + { + "fixInfo": {}, "issueId": "VULN_ID_1", "pkgName": "package@version", }, ], - "issuesData": Object { - "vuln-id": Object { + "issuesData": { + "vuln-id": { "id": "VULN_ID_1", "severity": "high", "title": "Fake vuln", }, }, - "remediation": Object { - "ignore": Object {}, - "patch": Object {}, - "pin": Object { - "django@1.6.1": Object { + "remediation": { + "ignore": {}, + "patch": {}, + "pin": { + "django@1.6.1": { "isTransitive": false, "upgradeTo": "django@2.0.1", - "vulns": Array [ + "vulns": [ "vuln-id", ], }, }, - "unresolved": Array [], - "upgrade": Object {}, + "unresolved": [], + "upgrade": {}, }, }, - "workspace": Object { + "workspace": { "path": ".", "readFile": [Function], "writeFile": [MockFunction] { - "calls": Array [ - Array [ + "calls": [ + [ "requirements.txt", "django===2.0.1", ], ], - "results": Array [ - Object { + "results": [ + { "type": "return", "value": Promise {}, }, diff --git a/packages/snyk-fix/test/unit/plugins/python/__snapshots__/contains-require-directive.spec.ts.snap b/packages/snyk-fix/test/unit/plugins/python/__snapshots__/contains-require-directive.spec.ts.snap index 9af24ab24c..0861383ab4 100644 --- a/packages/snyk-fix/test/unit/plugins/python/__snapshots__/contains-require-directive.spec.ts.snap +++ b/packages/snyk-fix/test/unit/plugins/python/__snapshots__/contains-require-directive.spec.ts.snap @@ -1,10 +1,10 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`containsRequireDirective with -c 1`] = ` -Object { +{ "containsRequire": true, - "matches": Array [ - Array [ + "matches": [ + [ "-c constraints.txt", "c", "constraints.txt", @@ -14,15 +14,15 @@ Object { `; exports[`containsRequireDirective with -r & -c 1`] = ` -Object { +{ "containsRequire": true, - "matches": Array [ - Array [ + "matches": [ + [ "-c constraints.txt", "c", "constraints.txt", ], - Array [ + [ "-r base.txt", "r", "base.txt", @@ -32,15 +32,15 @@ Object { `; exports[`containsRequireDirective with -r & -c after deps 1`] = ` -Object { +{ "containsRequire": true, - "matches": Array [ - Array [ + "matches": [ + [ "-c constraints.txt", "c", "constraints.txt", ], - Array [ + [ "-r base.txt", "r", "base.txt", @@ -50,10 +50,10 @@ Object { `; exports[`containsRequireDirective with -r 1`] = ` -Object { +{ "containsRequire": true, - "matches": Array [ - Array [ + "matches": [ + [ "-r requirements.txt", "r", "requirements.txt", @@ -63,15 +63,15 @@ Object { `; exports[`containsRequireDirective with multiple -r 1`] = ` -Object { +{ "containsRequire": true, - "matches": Array [ - Array [ + "matches": [ + [ "-r requirements.txt", "r", "requirements.txt", ], - Array [ + [ "-r base.txt", "r", "base.txt", diff --git a/packages/snyk-fix/test/unit/plugins/python/handlers/pip-requirements/update-dependencies/__snapshots__/update-dependencies.spec.ts.snap b/packages/snyk-fix/test/unit/plugins/python/handlers/pip-requirements/update-dependencies/__snapshots__/update-dependencies.spec.ts.snap index 1420267ce9..3376219d11 100644 --- a/packages/snyk-fix/test/unit/plugins/python/handlers/pip-requirements/update-dependencies/__snapshots__/update-dependencies.spec.ts.snap +++ b/packages/snyk-fix/test/unit/plugins/python/handlers/pip-requirements/update-dependencies/__snapshots__/update-dependencies.spec.ts.snap @@ -6,7 +6,7 @@ Django==2.0.1 python-etcd==0.4.5 Django-Select2==6.0.1 # this version installs with lowercase so it catches a previous bug in pip_resolve.py irc==16.2 # this has a cyclic dependency (internal jaraco.text <==> jaraco.collections) -testtools==\\\\ +testtools==\\ 2.3.0 # this has a cycle (fixtures ==> testtols); ./packages/prometheus_client-0.6.0 transitive>=1.1.1 # not directly required, pinned by Snyk to avoid a vulnerability diff --git a/test/jest/unit/lib/commands/fix/__snapshots__/convert-legacy-test-result-to-new.spec.ts.snap b/test/jest/unit/lib/commands/fix/__snapshots__/convert-legacy-test-result-to-new.spec.ts.snap index 7ef7336f11..49fb72b68c 100644 --- a/test/jest/unit/lib/commands/fix/__snapshots__/convert-legacy-test-result-to-new.spec.ts.snap +++ b/test/jest/unit/lib/commands/fix/__snapshots__/convert-legacy-test-result-to-new.spec.ts.snap @@ -1,51 +1,51 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`Convert legacy TestResult to ScanResult can convert npm test result with no remediation 1`] = ` -Object { - "depGraphData": Object {}, - "issues": Array [ - Object { - "fixInfo": Object {}, +{ + "depGraphData": {}, + "issues": [ + { + "fixInfo": {}, "issueId": "npm:node-uuid:20160328", "pkgName": "node-uuid", "pkgVersion": "1.4.0", }, - Object { - "fixInfo": Object {}, + { + "fixInfo": {}, "issueId": "npm:qs:20140806", "pkgName": "qs", "pkgVersion": "0.0.6", }, - Object { - "fixInfo": Object {}, + { + "fixInfo": {}, "issueId": "npm:qs:20140806-1", "pkgName": "qs", "pkgVersion": "0.0.6", }, - Object { - "fixInfo": Object {}, + { + "fixInfo": {}, "issueId": "npm:qs:20170213", "pkgName": "qs", "pkgVersion": "0.0.6", }, ], - "issuesData": Object { - "npm:node-uuid:20160328": Object { + "issuesData": { + "npm:node-uuid:20160328": { "id": "npm:node-uuid:20160328", "severity": "low", "title": "Insecure Randomness", }, - "npm:qs:20140806": Object { + "npm:qs:20140806": { "id": "npm:qs:20140806", "severity": "low", "title": "Denial of Service (DoS)", }, - "npm:qs:20140806-1": Object { + "npm:qs:20140806-1": { "id": "npm:qs:20140806-1", "severity": "low", "title": "Denial of Service (DoS)", }, - "npm:qs:20170213": Object { + "npm:qs:20170213": { "id": "npm:qs:20170213", "severity": "low", "title": "Prototype Override Protection Bypass", @@ -56,80 +56,80 @@ Object { `; exports[`Convert legacy TestResult to ScanResult can convert npm test result with remediation 1`] = ` -Object { - "depGraphData": Object {}, - "issues": Array [ - Object { - "fixInfo": Object {}, +{ + "depGraphData": {}, + "issues": [ + { + "fixInfo": {}, "issueId": "npm:node-uuid:20160328", "pkgName": "node-uuid", "pkgVersion": "1.4.0", }, - Object { - "fixInfo": Object {}, + { + "fixInfo": {}, "issueId": "npm:qs:20140806", "pkgName": "qs", "pkgVersion": "0.0.6", }, - Object { - "fixInfo": Object {}, + { + "fixInfo": {}, "issueId": "npm:qs:20140806-1", "pkgName": "qs", "pkgVersion": "0.0.6", }, - Object { - "fixInfo": Object {}, + { + "fixInfo": {}, "issueId": "npm:qs:20170213", "pkgName": "qs", "pkgVersion": "0.0.6", }, ], - "issuesData": Object { - "npm:node-uuid:20160328": Object { + "issuesData": { + "npm:node-uuid:20160328": { "id": "npm:node-uuid:20160328", "severity": "low", "title": "Insecure Randomness", }, - "npm:qs:20140806": Object { + "npm:qs:20140806": { "id": "npm:qs:20140806", "severity": "low", "title": "Denial of Service (DoS)", }, - "npm:qs:20140806-1": Object { + "npm:qs:20140806-1": { "id": "npm:qs:20140806-1", "severity": "low", "title": "Denial of Service (DoS)", }, - "npm:qs:20170213": Object { + "npm:qs:20170213": { "id": "npm:qs:20170213", "severity": "low", "title": "Prototype Override Protection Bypass", }, }, - "remediation": Object { - "ignore": Object {}, - "patch": Object { - "npm:node-uuid:20160328": Object { - "paths": Array [ - Object { - "ms": Object { + "remediation": { + "ignore": {}, + "patch": { + "npm:node-uuid:20160328": { + "paths": [ + { + "ms": { "patched": "2019-11-29T15:08:55.159Z", }, }, ], }, }, - "pin": Object {}, - "unresolved": Array [], - "upgrade": Object { - "qs@0.0.6": Object { + "pin": {}, + "unresolved": [], + "upgrade": { + "qs@0.0.6": { "upgradeTo": "qs@6.0.4", - "upgrades": Array [ + "upgrades": [ "qs@0.0.6", "qs@0.0.6", "qs@0.0.6", ], - "vulns": Array [ + "vulns": [ "npm:qs:20170213", "npm:qs:20140806", "npm:qs:20140806-1", @@ -141,52 +141,52 @@ Object { `; exports[`Convert legacy TestResult to ScanResult can convert pip test result with remediation (pins) 1`] = ` -Object { - "depGraphData": Object {}, - "issues": Array [ - Object { - "fixInfo": Object {}, +{ + "depGraphData": {}, + "issues": [ + { + "fixInfo": {}, "issueId": "SNYK-PYTHON-DJANGO-1066259", "pkgName": "django", "pkgVersion": "1.6.1", }, - Object { - "fixInfo": Object {}, + { + "fixInfo": {}, "issueId": "SNYK-PYTHON-DJANGO-72888", "pkgName": "django", "pkgVersion": "1.6.1", }, ], - "issuesData": Object { - "SNYK-PYTHON-DJANGO-1066259": Object { + "issuesData": { + "SNYK-PYTHON-DJANGO-1066259": { "id": "SNYK-PYTHON-DJANGO-1066259", "severity": "low", "title": "Directory Traversal", }, - "SNYK-PYTHON-DJANGO-72888": Object { + "SNYK-PYTHON-DJANGO-72888": { "id": "SNYK-PYTHON-DJANGO-72888", "severity": "medium", "title": "Content Spoofing", }, }, - "remediation": Object { - "ignore": Object {}, - "patch": Object {}, - "pin": Object { - "django@1.6.1": Object { + "remediation": { + "ignore": {}, + "patch": {}, + "pin": { + "django@1.6.1": { "isTransitive": false, "upgradeTo": "django@2.2.18", - "vulns": Array [ + "vulns": [ "SNYK-PYTHON-DJANGO-72888", ], }, }, - "unresolved": Array [ - Object { + "unresolved": [ + { "CVSSv3": "CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:L/I:N/A:N", - "alternativeIds": Array [], + "alternativeIds": [], "creationTime": "2021-02-01T13:11:56.558734Z", - "credit": Array [ + "credit": [ "Wang Baohua", ], "cvssScore": 3.1, @@ -197,7 +197,7 @@ Affected versions of this package are vulnerable to Directory Traversal via the ## Details -A Directory Traversal attack (also known as path traversal) aims to access files and directories that are stored outside the intended folder. By manipulating files with \\"dot-dot-slash (../)\\" sequences and its variations, or by using absolute file paths, it may be possible to access arbitrary files and directories stored on file system, including application source code, configuration, and other critical system files. +A Directory Traversal attack (also known as path traversal) aims to access files and directories that are stored outside the intended folder. By manipulating files with "dot-dot-slash (../)" sequences and its variations, or by using absolute file paths, it may be possible to access arbitrary files and directories stored on file system, including application source code, configuration, and other critical system files. Directory Traversal vulnerabilities can be generally divided into two types: @@ -231,23 +231,23 @@ Upgrade \`django\` to version 2.2.18, 3.0.12, 3.1.6 or higher. ", "disclosureTime": "2021-02-01T12:56:31Z", "exploit": "Not Defined", - "fixedIn": Array [ + "fixedIn": [ "2.2.18", "3.0.12", "3.1.6", ], - "from": Array [ + "from": [ "pip-app@0.0.0", "django@1.6.1", ], - "functions": Array [], - "functions_new": Array [], + "functions": [], + "functions_new": [], "id": "SNYK-PYTHON-DJANGO-1066259", - "identifiers": Object { - "CVE": Array [ + "identifiers": { + "CVE": [ "CVE-2021-3281", ], - "CWE": Array [ + "CWE": [ "CWE-22", ], }, @@ -260,21 +260,21 @@ Upgrade \`django\` to version 2.2.18, 3.0.12, 3.1.6 or higher. "name": "django", "packageManager": "pip", "packageName": "django", - "patches": Array [], + "patches": [], "proprietary": false, "publicationTime": "2021-02-01T15:11:08.261009Z", - "references": Array [ - Object { + "references": [ + { "title": "Django Advisory", "url": "https://www.djangoproject.com/weblog/2021/feb/01/security-releases/", }, - Object { + { "title": "GitHub Commit", "url": "https://github.com/django/django/commit/05413afa8c18cdb978fcdf470e09f7a12b234a23", }, ], - "semver": Object { - "vulnerable": Array [ + "semver": { + "vulnerable": [ "[1.4,2.2.18)", "[3.0a1,3.0.12)", "[3.1a1,3.1.6)", @@ -283,11 +283,11 @@ Upgrade \`django\` to version 2.2.18, 3.0.12, 3.1.6 or higher. "severity": "low", "severityWithCritical": "low", "title": "Directory Traversal", - "upgradePath": Array [], + "upgradePath": [], "version": "1.6.1", }, ], - "upgrade": Object {}, + "upgrade": {}, }, } `; diff --git a/test/jest/unit/lib/commands/fix/__snapshots__/convert-legacy-test-result-to-scan-result.spec.ts.snap b/test/jest/unit/lib/commands/fix/__snapshots__/convert-legacy-test-result-to-scan-result.spec.ts.snap index 788e258a11..036946327a 100644 --- a/test/jest/unit/lib/commands/fix/__snapshots__/convert-legacy-test-result-to-scan-result.spec.ts.snap +++ b/test/jest/unit/lib/commands/fix/__snapshots__/convert-legacy-test-result-to-scan-result.spec.ts.snap @@ -1,9 +1,9 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`Convert legacy TestResult to ScanResult can convert npm test result with no remediation 1`] = ` -Object { - "facts": Array [], - "identity": Object { +{ + "facts": [], + "identity": { "targetFile": "package-lock.json", "type": "npm", }, @@ -13,14 +13,14 @@ version: v1.19.0 ignore: {} patch: {} ", - "target": Object {}, + "target": {}, } `; exports[`Convert legacy TestResult to ScanResult can convert npm test result with remediation 1`] = ` -Object { - "facts": Array [], - "identity": Object { +{ + "facts": [], + "identity": { "targetFile": "package-lock.json", "type": "npm", }, @@ -30,14 +30,14 @@ version: v1.19.0 ignore: {} patch: {} ", - "target": Object {}, + "target": {}, } `; exports[`Convert legacy TestResult to ScanResult can convert pip test result with remediation (pins) 1`] = ` -Object { - "facts": Array [], - "identity": Object { +{ + "facts": [], + "identity": { "targetFile": "requirements.txt", "type": "pip", }, @@ -47,6 +47,6 @@ version: v1.19.0 ignore: {} patch: {} ", - "target": Object {}, + "target": {}, } `; diff --git a/test/jest/unit/lib/commands/fix/__snapshots__/convert-legacy-tests-results-to-fix-entities.spec.ts.snap b/test/jest/unit/lib/commands/fix/__snapshots__/convert-legacy-tests-results-to-fix-entities.spec.ts.snap index cce17b4fb2..9b9f0e6fbc 100644 --- a/test/jest/unit/lib/commands/fix/__snapshots__/convert-legacy-tests-results-to-fix-entities.spec.ts.snap +++ b/test/jest/unit/lib/commands/fix/__snapshots__/convert-legacy-tests-results-to-fix-entities.spec.ts.snap @@ -1,14 +1,14 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`Convert legacy TestResult to ScanResult can convert npm test result with no remediation 1`] = ` -Array [ - Object { - "options": Object { +[ + { + "options": { "allProjects": true, }, - "scanResult": Object { - "facts": Array [], - "identity": Object { + "scanResult": { + "facts": [], + "identity": { "targetFile": "package-lock.json", "type": "npm", }, @@ -18,53 +18,53 @@ version: v1.19.0 ignore: {} patch: {} ", - "target": Object {}, + "target": {}, }, - "testResult": Object { - "depGraphData": Object {}, - "issues": Array [ - Object { - "fixInfo": Object {}, + "testResult": { + "depGraphData": {}, + "issues": [ + { + "fixInfo": {}, "issueId": "npm:node-uuid:20160328", "pkgName": "node-uuid", "pkgVersion": "1.4.0", }, - Object { - "fixInfo": Object {}, + { + "fixInfo": {}, "issueId": "npm:qs:20140806", "pkgName": "qs", "pkgVersion": "0.0.6", }, - Object { - "fixInfo": Object {}, + { + "fixInfo": {}, "issueId": "npm:qs:20140806-1", "pkgName": "qs", "pkgVersion": "0.0.6", }, - Object { - "fixInfo": Object {}, + { + "fixInfo": {}, "issueId": "npm:qs:20170213", "pkgName": "qs", "pkgVersion": "0.0.6", }, ], - "issuesData": Object { - "npm:node-uuid:20160328": Object { + "issuesData": { + "npm:node-uuid:20160328": { "id": "npm:node-uuid:20160328", "severity": "low", "title": "Insecure Randomness", }, - "npm:qs:20140806": Object { + "npm:qs:20140806": { "id": "npm:qs:20140806", "severity": "low", "title": "Denial of Service (DoS)", }, - "npm:qs:20140806-1": Object { + "npm:qs:20140806-1": { "id": "npm:qs:20140806-1", "severity": "low", "title": "Denial of Service (DoS)", }, - "npm:qs:20170213": Object { + "npm:qs:20170213": { "id": "npm:qs:20170213", "severity": "low", "title": "Prototype Override Protection Bypass", @@ -72,7 +72,7 @@ patch: {} }, "remediation": undefined, }, - "workspace": Object { + "workspace": { "path": "acceptance/fixtures/npm-package-with-severity-override", "readFile": [Function], "writeFile": [Function], @@ -82,14 +82,14 @@ patch: {} `; exports[`Convert legacy TestResult to ScanResult can convert npm test result with remediation 1`] = ` -Array [ - Object { - "options": Object { +[ + { + "options": { "allProjects": true, }, - "scanResult": Object { - "facts": Array [], - "identity": Object { + "scanResult": { + "facts": [], + "identity": { "targetFile": "package-lock.json", "type": "npm", }, @@ -99,82 +99,82 @@ version: v1.19.0 ignore: {} patch: {} ", - "target": Object {}, + "target": {}, }, - "testResult": Object { - "depGraphData": Object {}, - "issues": Array [ - Object { - "fixInfo": Object {}, + "testResult": { + "depGraphData": {}, + "issues": [ + { + "fixInfo": {}, "issueId": "npm:node-uuid:20160328", "pkgName": "node-uuid", "pkgVersion": "1.4.0", }, - Object { - "fixInfo": Object {}, + { + "fixInfo": {}, "issueId": "npm:qs:20140806", "pkgName": "qs", "pkgVersion": "0.0.6", }, - Object { - "fixInfo": Object {}, + { + "fixInfo": {}, "issueId": "npm:qs:20140806-1", "pkgName": "qs", "pkgVersion": "0.0.6", }, - Object { - "fixInfo": Object {}, + { + "fixInfo": {}, "issueId": "npm:qs:20170213", "pkgName": "qs", "pkgVersion": "0.0.6", }, ], - "issuesData": Object { - "npm:node-uuid:20160328": Object { + "issuesData": { + "npm:node-uuid:20160328": { "id": "npm:node-uuid:20160328", "severity": "low", "title": "Insecure Randomness", }, - "npm:qs:20140806": Object { + "npm:qs:20140806": { "id": "npm:qs:20140806", "severity": "low", "title": "Denial of Service (DoS)", }, - "npm:qs:20140806-1": Object { + "npm:qs:20140806-1": { "id": "npm:qs:20140806-1", "severity": "low", "title": "Denial of Service (DoS)", }, - "npm:qs:20170213": Object { + "npm:qs:20170213": { "id": "npm:qs:20170213", "severity": "low", "title": "Prototype Override Protection Bypass", }, }, - "remediation": Object { - "ignore": Object {}, - "patch": Object { - "npm:node-uuid:20160328": Object { - "paths": Array [ - Object { - "ms": Object { + "remediation": { + "ignore": {}, + "patch": { + "npm:node-uuid:20160328": { + "paths": [ + { + "ms": { "patched": "2019-11-29T15:08:55.159Z", }, }, ], }, }, - "pin": Object {}, - "unresolved": Array [], - "upgrade": Object { - "qs@0.0.6": Object { + "pin": {}, + "unresolved": [], + "upgrade": { + "qs@0.0.6": { "upgradeTo": "qs@6.0.4", - "upgrades": Array [ + "upgrades": [ "qs@0.0.6", "qs@0.0.6", "qs@0.0.6", ], - "vulns": Array [ + "vulns": [ "npm:qs:20170213", "npm:qs:20140806", "npm:qs:20140806-1", @@ -183,7 +183,7 @@ patch: {} }, }, }, - "workspace": Object { + "workspace": { "path": "acceptance/fixtures/npm-package-with-severity-override", "readFile": [Function], "writeFile": [Function], @@ -193,12 +193,12 @@ patch: {} `; exports[`Convert legacy TestResult to ScanResult can convert pip test result with remediation (pins) 1`] = ` -Array [ - Object { - "options": Object {}, - "scanResult": Object { - "facts": Array [], - "identity": Object { +[ + { + "options": {}, + "scanResult": { + "facts": [], + "identity": { "targetFile": "requirements.txt", "type": "pip", }, @@ -208,54 +208,54 @@ version: v1.19.0 ignore: {} patch: {} ", - "target": Object {}, + "target": {}, }, - "testResult": Object { - "depGraphData": Object {}, - "issues": Array [ - Object { - "fixInfo": Object {}, + "testResult": { + "depGraphData": {}, + "issues": [ + { + "fixInfo": {}, "issueId": "SNYK-PYTHON-DJANGO-1066259", "pkgName": "django", "pkgVersion": "1.6.1", }, - Object { - "fixInfo": Object {}, + { + "fixInfo": {}, "issueId": "SNYK-PYTHON-DJANGO-72888", "pkgName": "django", "pkgVersion": "1.6.1", }, ], - "issuesData": Object { - "SNYK-PYTHON-DJANGO-1066259": Object { + "issuesData": { + "SNYK-PYTHON-DJANGO-1066259": { "id": "SNYK-PYTHON-DJANGO-1066259", "severity": "low", "title": "Directory Traversal", }, - "SNYK-PYTHON-DJANGO-72888": Object { + "SNYK-PYTHON-DJANGO-72888": { "id": "SNYK-PYTHON-DJANGO-72888", "severity": "medium", "title": "Content Spoofing", }, }, - "remediation": Object { - "ignore": Object {}, - "patch": Object {}, - "pin": Object { - "django@1.6.1": Object { + "remediation": { + "ignore": {}, + "patch": {}, + "pin": { + "django@1.6.1": { "isTransitive": false, "upgradeTo": "django@2.2.18", - "vulns": Array [ + "vulns": [ "SNYK-PYTHON-DJANGO-72888", ], }, }, - "unresolved": Array [ - Object { + "unresolved": [ + { "CVSSv3": "CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:L/I:N/A:N", - "alternativeIds": Array [], + "alternativeIds": [], "creationTime": "2021-02-01T13:11:56.558734Z", - "credit": Array [ + "credit": [ "Wang Baohua", ], "cvssScore": 3.1, @@ -266,7 +266,7 @@ Affected versions of this package are vulnerable to Directory Traversal via the ## Details -A Directory Traversal attack (also known as path traversal) aims to access files and directories that are stored outside the intended folder. By manipulating files with \\"dot-dot-slash (../)\\" sequences and its variations, or by using absolute file paths, it may be possible to access arbitrary files and directories stored on file system, including application source code, configuration, and other critical system files. +A Directory Traversal attack (also known as path traversal) aims to access files and directories that are stored outside the intended folder. By manipulating files with "dot-dot-slash (../)" sequences and its variations, or by using absolute file paths, it may be possible to access arbitrary files and directories stored on file system, including application source code, configuration, and other critical system files. Directory Traversal vulnerabilities can be generally divided into two types: @@ -300,23 +300,23 @@ Upgrade \`django\` to version 2.2.18, 3.0.12, 3.1.6 or higher. ", "disclosureTime": "2021-02-01T12:56:31Z", "exploit": "Not Defined", - "fixedIn": Array [ + "fixedIn": [ "2.2.18", "3.0.12", "3.1.6", ], - "from": Array [ + "from": [ "pip-app@0.0.0", "django@1.6.1", ], - "functions": Array [], - "functions_new": Array [], + "functions": [], + "functions_new": [], "id": "SNYK-PYTHON-DJANGO-1066259", - "identifiers": Object { - "CVE": Array [ + "identifiers": { + "CVE": [ "CVE-2021-3281", ], - "CWE": Array [ + "CWE": [ "CWE-22", ], }, @@ -329,21 +329,21 @@ Upgrade \`django\` to version 2.2.18, 3.0.12, 3.1.6 or higher. "name": "django", "packageManager": "pip", "packageName": "django", - "patches": Array [], + "patches": [], "proprietary": false, "publicationTime": "2021-02-01T15:11:08.261009Z", - "references": Array [ - Object { + "references": [ + { "title": "Django Advisory", "url": "https://www.djangoproject.com/weblog/2021/feb/01/security-releases/", }, - Object { + { "title": "GitHub Commit", "url": "https://github.com/django/django/commit/05413afa8c18cdb978fcdf470e09f7a12b234a23", }, ], - "semver": Object { - "vulnerable": Array [ + "semver": { + "vulnerable": [ "[1.4,2.2.18)", "[3.0a1,3.0.12)", "[3.1a1,3.1.6)", @@ -352,14 +352,14 @@ Upgrade \`django\` to version 2.2.18, 3.0.12, 3.1.6 or higher. "severity": "low", "severityWithCritical": "low", "title": "Directory Traversal", - "upgradePath": Array [], + "upgradePath": [], "version": "1.6.1", }, ], - "upgrade": Object {}, + "upgrade": {}, }, }, - "workspace": Object { + "workspace": { "path": ".", "readFile": [Function], "writeFile": [Function], diff --git a/test/jest/unit/lib/formatters/__snapshots__/format-monitor-response.spec.ts.snap b/test/jest/unit/lib/formatters/__snapshots__/format-monitor-response.spec.ts.snap index ca00f75aaa..dbc1f884d5 100644 --- a/test/jest/unit/lib/formatters/__snapshots__/format-monitor-response.spec.ts.snap +++ b/test/jest/unit/lib/formatters/__snapshots__/format-monitor-response.spec.ts.snap @@ -9,7 +9,7 @@ Monitoring src/lib/jens... Detected 0 dependencies (no project created)" `; -exports[`formatErrorMonitorOutput maven monitor error with --json 1`] = `"{\\"org\\":\\"test-org\\",\\"id\\":\\"123\\",\\"path\\":\\"src/lib/jens\\",\\"licensesPolicy\\":{},\\"uri\\":\\"https://example.com/project\\",\\"isMonitored\\":true,\\"trialStarted\\":false,\\"packageManager\\":\\"maven\\"}"`; +exports[`formatErrorMonitorOutput maven monitor error with --json 1`] = `"{"org":"test-org","id":"123","path":"src/lib/jens","licensesPolicy":{},"uri":"https://example.com/project","isMonitored":true,"trialStarted":false,"packageManager":"maven"}"`; exports[`formatErrorMonitorOutput npm with project name 1`] = ` " diff --git a/test/jest/unit/lib/formatters/__snapshots__/open-source-sarif-output.spec.ts.snap b/test/jest/unit/lib/formatters/__snapshots__/open-source-sarif-output.spec.ts.snap index a0bf39e490..d78029135e 100644 --- a/test/jest/unit/lib/formatters/__snapshots__/open-source-sarif-output.spec.ts.snap +++ b/test/jest/unit/lib/formatters/__snapshots__/open-source-sarif-output.spec.ts.snap @@ -1,72 +1,72 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`createSarifOutputForOpenSource general 1`] = ` -Object { +{ "$schema": "https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json", - "runs": Array [ - Object { - "results": Array [ - Object { - "fixes": Array [ - Object { - "artifactChanges": Array [ - Object { - "artifactLocation": Object { + "runs": [ + { + "results": [ + { + "fixes": [ + { + "artifactChanges": [ + { + "artifactLocation": { "uri": "package.json", }, - "replacements": Array [ - Object { - "deletedRegion": Object { + "replacements": [ + { + "deletedRegion": { "startLine": 1, }, - "insertedContent": Object { + "insertedContent": { "text": "jimp@0.2.28", }, }, ], }, ], - "description": Object { + "description": { "text": "Upgrade to jimp@0.2.28", }, }, ], "level": "error", - "locations": Array [ - Object { - "logicalLocations": Array [ - Object { + "locations": [ + { + "logicalLocations": [ + { "fullyQualifiedName": "ajv@6.12.2", }, ], - "physicalLocation": Object { - "artifactLocation": Object { + "physicalLocation": { + "artifactLocation": { "uri": "package.json", }, - "region": Object { + "region": { "startLine": 1, }, }, }, ], - "message": Object { + "message": { "text": "This file introduces a vulnerable ajv package with a critical severity vulnerability.", }, "ruleId": "SNYK-JS-AJV-584908", }, ], - "tool": Object { - "driver": Object { + "tool": { + "driver": { "name": "Snyk Open Source", - "properties": Object { + "properties": { "artifactsScanned": 969, }, - "rules": Array [ - Object { - "fullDescription": Object { + "rules": [ + { + "fullDescription": { "text": "(CVE-2020-15366) ajv@6.12.2", }, - "help": Object { + "help": { "markdown": "* Package Manager: npm * Vulnerable module: ajv * Introduced through: PROJECT_NAME@1.0.0, jimp@0.2.28 and others @@ -77,16 +77,16 @@ Object { "text": "", }, "id": "SNYK-JS-AJV-584908", - "properties": Object { + "properties": { "cvssv3_baseScore": 7.5, "security-severity": "7.5", - "tags": Array [ + "tags": [ "security", "CWE-400", "npm", ], }, - "shortDescription": Object { + "shortDescription": { "text": "Critical severity - Prototype Pollution vulnerability in ajv", }, }, diff --git a/test/jest/unit/lib/formatters/__snapshots__/sarif-output.spec.ts.snap b/test/jest/unit/lib/formatters/__snapshots__/sarif-output.spec.ts.snap index 275a3dd0e5..d324b6bd66 100644 --- a/test/jest/unit/lib/formatters/__snapshots__/sarif-output.spec.ts.snap +++ b/test/jest/unit/lib/formatters/__snapshots__/sarif-output.spec.ts.snap @@ -1,52 +1,52 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`createSarifOutputForContainers general with critical severity issue without CVE 1`] = ` -Object { +{ "$schema": "https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json", - "runs": Array [ - Object { - "results": Array [ - Object { + "runs": [ + { + "results": [ + { "fixes": undefined, "level": "error", - "locations": Array [ - Object { - "logicalLocations": Array [ - Object { + "locations": [ + { + "logicalLocations": [ + { "fullyQualifiedName": "expat@2.2.5-r0", }, ], - "physicalLocation": Object { - "artifactLocation": Object { + "physicalLocation": { + "artifactLocation": { "uri": "Dockerfile", }, - "region": Object { + "region": { "startLine": 1, }, }, }, ], - "message": Object { + "message": { "text": "This file introduces a vulnerable expat package with a critical severity vulnerability.", }, "ruleId": "SNYK-LINUX-EXPAT-450908", }, ], - "tool": Object { - "driver": Object { + "tool": { + "driver": { "name": "Snyk Container", - "properties": Object { + "properties": { "artifactsScanned": 969, }, - "rules": Array [ - Object { - "defaultConfiguration": Object { + "rules": [ + { + "defaultConfiguration": { "level": "error", }, - "fullDescription": Object { + "fullDescription": { "text": "expat@2.2.5-r0", }, - "help": Object { + "help": { "markdown": "## Overview In libexpat in Expat before 2.2.7, XML input including XML names that contain a large number of colons could make the XML parser consume a high amount of RAM and CPU resources while processing (enough to be usable for denial-of-service attacks). @@ -69,16 +69,16 @@ In libexpat in Expat before 2.2.7, XML input including XML names that contain a "text": "", }, "id": "SNYK-LINUX-EXPAT-450908", - "properties": Object { + "properties": { "cvssv3_baseScore": 7.5, "security-severity": "7.5", - "tags": Array [ + "tags": [ "security", "CWE-611", "npm", ], }, - "shortDescription": Object { + "shortDescription": { "text": "Critical severity - XML External Entity (XXE) Injection vulnerability in expat", }, }, @@ -92,52 +92,52 @@ In libexpat in Expat before 2.2.7, XML input including XML names that contain a `; exports[`createSarifOutputForContainers general with critical severity issue without CWE 1`] = ` -Object { +{ "$schema": "https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json", - "runs": Array [ - Object { - "results": Array [ - Object { + "runs": [ + { + "results": [ + { "fixes": undefined, "level": "error", - "locations": Array [ - Object { - "logicalLocations": Array [ - Object { + "locations": [ + { + "logicalLocations": [ + { "fullyQualifiedName": "expat@2.2.5-r0", }, ], - "physicalLocation": Object { - "artifactLocation": Object { + "physicalLocation": { + "artifactLocation": { "uri": "Dockerfile", }, - "region": Object { + "region": { "startLine": 1, }, }, }, ], - "message": Object { + "message": { "text": "This file introduces a vulnerable expat package with a critical severity vulnerability.", }, "ruleId": "SNYK-LINUX-EXPAT-450908", }, ], - "tool": Object { - "driver": Object { + "tool": { + "driver": { "name": "Snyk Container", - "properties": Object { + "properties": { "artifactsScanned": 969, }, - "rules": Array [ - Object { - "defaultConfiguration": Object { + "rules": [ + { + "defaultConfiguration": { "level": "error", }, - "fullDescription": Object { + "fullDescription": { "text": "(CVE-2018-20843) expat@2.2.5-r0", }, - "help": Object { + "help": { "markdown": "## Overview In libexpat in Expat before 2.2.7, XML input including XML names that contain a large number of colons could make the XML parser consume a high amount of RAM and CPU resources while processing (enough to be usable for denial-of-service attacks). @@ -160,15 +160,15 @@ In libexpat in Expat before 2.2.7, XML input including XML names that contain a "text": "", }, "id": "SNYK-LINUX-EXPAT-450908", - "properties": Object { + "properties": { "cvssv3_baseScore": 7.5, "security-severity": "7.5", - "tags": Array [ + "tags": [ "security", "npm", ], }, - "shortDescription": Object { + "shortDescription": { "text": "Critical severity - XML External Entity (XXE) Injection vulnerability in expat", }, }, @@ -182,52 +182,52 @@ In libexpat in Expat before 2.2.7, XML input including XML names that contain a `; exports[`createSarifOutputForContainers general with high severity issue 1`] = ` -Object { +{ "$schema": "https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json", - "runs": Array [ - Object { - "results": Array [ - Object { + "runs": [ + { + "results": [ + { "fixes": undefined, "level": "error", - "locations": Array [ - Object { - "logicalLocations": Array [ - Object { + "locations": [ + { + "logicalLocations": [ + { "fullyQualifiedName": "expat@2.2.5-r0", }, ], - "physicalLocation": Object { - "artifactLocation": Object { + "physicalLocation": { + "artifactLocation": { "uri": "Dockerfile", }, - "region": Object { + "region": { "startLine": 1, }, }, }, ], - "message": Object { + "message": { "text": "This file introduces a vulnerable expat package with a high severity vulnerability.", }, "ruleId": "SNYK-LINUX-EXPAT-450908", }, ], - "tool": Object { - "driver": Object { + "tool": { + "driver": { "name": "Snyk Container", - "properties": Object { + "properties": { "artifactsScanned": 969, }, - "rules": Array [ - Object { - "defaultConfiguration": Object { + "rules": [ + { + "defaultConfiguration": { "level": "error", }, - "fullDescription": Object { + "fullDescription": { "text": "(CVE-2018-20843) expat@2.2.5-r0", }, - "help": Object { + "help": { "markdown": "## Overview In libexpat in Expat before 2.2.7, XML input including XML names that contain a large number of colons could make the XML parser consume a high amount of RAM and CPU resources while processing (enough to be usable for denial-of-service attacks). @@ -250,16 +250,16 @@ In libexpat in Expat before 2.2.7, XML input including XML names that contain a "text": "", }, "id": "SNYK-LINUX-EXPAT-450908", - "properties": Object { + "properties": { "cvssv3_baseScore": 7.5, "security-severity": "7.5", - "tags": Array [ + "tags": [ "security", "CWE-611", "npm", ], }, - "shortDescription": Object { + "shortDescription": { "text": "High severity - XML External Entity (XXE) Injection vulnerability in expat", }, }, diff --git a/test/jest/unit/npm-modules-parser.spec.ts b/test/jest/unit/npm-modules-parser.spec.ts index dfda8310a9..b07c9cb7a6 100644 --- a/test/jest/unit/npm-modules-parser.spec.ts +++ b/test/jest/unit/npm-modules-parser.spec.ts @@ -2,7 +2,7 @@ import { parse } from '../../../src/lib/plugins/nodejs-plugin/npm-modules-parser import { getFileContents } from '../../../src/lib/get-file-contents'; jest.mock('../../../src/lib/get-file-contents'); -const mockedGetFileContents = jest.mocked(getFileContents, true); +const mockedGetFileContents = jest.mocked(getFileContents, { shallow: true }); afterEach(() => { jest.clearAllMocks(); diff --git a/test/jest/unit/python/snyk-test-pyproject.spec.ts b/test/jest/unit/python/snyk-test-pyproject.spec.ts index 6c025d8bf1..2397584055 100644 --- a/test/jest/unit/python/snyk-test-pyproject.spec.ts +++ b/test/jest/unit/python/snyk-test-pyproject.spec.ts @@ -10,7 +10,7 @@ import { getFixturePath } from '../../util/getFixturePath'; jest.mock('../../../../src/lib/plugins/index'); jest.mock('../../../../src/lib/request/request'); -const mockedLoadPlugin = jest.mocked(loadPlugin, true); +const mockedLoadPlugin = jest.mocked(loadPlugin, { shallow: true }); const mockedMakeRequest = jest.mocked(makeRequest); describe('snyk test for python project', () => { From 1b5266dd06e7a84f3cd09cf019c6de2788d5bba4 Mon Sep 17 00:00:00 2001 From: Luke Watts Date: Thu, 28 Mar 2024 21:58:05 +0100 Subject: [PATCH 27/58] test: migrate code tests to acceptance (#5139) * test: migrate code tests to acceptance * test: succeed testing with correct exit code - with sarif oputput and no markdown * test: track analytics are called added * test: should fail - when server returns error codes * test: Always calls code-client with url coming from sastSettings * chore: address lint issues --- src/lib/config/index.ts | 2 + test/acceptance/deepcode-fake-server.ts | 192 ++++++++++++++ test/acceptance/fake-server.ts | 58 +++++ test/fixtures/sast-empty/empty-sarif.json | 31 +++ .../sast-empty/shallow_empty/index.java | 0 .../sast-empty/shallow_empty/index.js | 1 + test/fixtures/sast/empty-sarif.json | 31 +++ .../acceptance/snyk-code/snyk-code.spec.ts | 238 +++++++++++++++++- 8 files changed, 545 insertions(+), 8 deletions(-) create mode 100644 test/acceptance/deepcode-fake-server.ts create mode 100644 test/fixtures/sast-empty/empty-sarif.json create mode 100644 test/fixtures/sast-empty/shallow_empty/index.java create mode 100644 test/fixtures/sast-empty/shallow_empty/index.js create mode 100644 test/fixtures/sast/empty-sarif.json diff --git a/src/lib/config/index.ts b/src/lib/config/index.ts index 76bb499007..54de2e26f9 100644 --- a/src/lib/config/index.ts +++ b/src/lib/config/index.ts @@ -90,4 +90,6 @@ if (!config.ROOT) { config.PUBLIC_VULN_DB_URL = 'https://security.snyk.io'; +config.CODE_CLIENT_PROXY_URL = process.env.SNYK_CODE_CLIENT_PROXY_URL || ''; + export default config; diff --git a/test/acceptance/deepcode-fake-server.ts b/test/acceptance/deepcode-fake-server.ts new file mode 100644 index 0000000000..86250c5a26 --- /dev/null +++ b/test/acceptance/deepcode-fake-server.ts @@ -0,0 +1,192 @@ +import * as express from 'express'; +import * as http from 'http'; +import * as net from 'net'; + +export type FakeDeepCodeServer = { + getRequests: () => express.Request[]; + popRequest: () => express.Request; + popRequests: (num: number) => express.Request[]; + setCustomResponse: (next: Record) => void; + setFiltersResponse: (next: Record) => void; + setNextResponse: (r: any) => void; + setNextStatusCode: (code: number) => void; + setSarifResponse: (r: any) => void; + listen: (callback: () => void) => void; + restore: () => void; + close: (callback: () => void) => void; + getPort: () => number; +}; + +export const fakeDeepCodeServer = (): FakeDeepCodeServer => { + let filtersResponse: Record | null = { + configFiles: [], + extensions: ['.java'], + }; + let sarifResponse: Record | null = null; + let requests: express.Request[] = []; + // the status code to return for the next request, overriding statusCode + let nextResponse: Record | undefined = undefined; + let nextStatusCode: number | undefined = undefined; + let customResponse: Record | undefined = undefined; + let server: http.Server | undefined = undefined; + const sockets = new Set(); + + const restore = () => { + requests = []; + customResponse = undefined; + nextResponse = undefined; + nextStatusCode = undefined; + sarifResponse = null; + filtersResponse = { configFiles: [], extensions: ['.java', '.js'] }; + }; + + const getRequests = () => { + return requests; + }; + + const popRequest = () => { + return requests.pop()!; + }; + + const popRequests = (num: number) => { + return requests.splice(requests.length - num, num); + }; + + const setCustomResponse = (next: typeof customResponse) => { + customResponse = next; + }; + + const setFiltersResponse = (response: string | Record) => { + if (typeof response === 'string') { + filtersResponse = JSON.parse(response); + return; + } + filtersResponse = response; + }; + + const setNextResponse = (response: string | Record) => { + if (typeof response === 'string') { + nextResponse = JSON.parse(response); + return; + } + nextResponse = response; + }; + + const setNextStatusCode = (code: number) => { + nextStatusCode = code; + }; + + const setSarifResponse = (response: string | Record) => { + if (typeof response === 'string') { + sarifResponse = JSON.parse(response); + return; + } + sarifResponse = response; + }; + + const app = express(); + app.use((req, res, next) => { + requests.push(req); + next(); + }); + + app.use((req, res, next) => { + if (nextStatusCode) { + const code = nextStatusCode; + res.status(code); + } + + if (nextResponse) { + const response = nextResponse; + res.send(response); + return; + } + next(); + }); + + app.get('/filters', (req, res) => { + res.status(200); + res.send(filtersResponse); + }); + + app.post('/bundle', (req, res) => { + res.status(200); + + res.send({ + bundleHash: 'bundle-hash', + missingFiles: [], + }); + }); + + app.post('/analysis', (req, res) => { + res.status(200); + res.send({ + timing: { + fetchingCode: 1, + analysis: 1, + queue: 1, + }, + coverage: [], + status: 'COMPLETE', + type: 'sarif', + sarif: sarifResponse, + }); + }); + + const listenPromise = () => { + return new Promise((resolve) => { + server = http.createServer(app).listen(resolve); + + server?.on('connection', (socket) => { + sockets.add(socket); + }); + }); + }; + + const listen = (callback: () => void) => { + listenPromise().then(callback); + }; + + const closePromise = () => { + return new Promise((resolve) => { + if (!server) { + resolve(); + return; + } + server.close(() => resolve()); + server = undefined; + }); + }; + + const close = (callback: () => void) => { + for (const socket of sockets) { + (socket as net.Socket)?.destroy(); + sockets.delete(socket); + } + + closePromise().then(callback); + }; + + const getPort = () => { + const address = server?.address(); + if (address && typeof address === 'object') { + return address.port; + } + throw new Error('port not found'); + }; + + return { + getRequests, + popRequest, + popRequests, + setCustomResponse: setCustomResponse, + setFiltersResponse, + setSarifResponse, + setNextResponse, + setNextStatusCode, + listen, + restore, + close, + getPort, + }; +}; diff --git a/test/acceptance/fake-server.ts b/test/acceptance/fake-server.ts index fa11825cb8..1f14bc3205 100644 --- a/test/acceptance/fake-server.ts +++ b/test/acceptance/fake-server.ts @@ -42,7 +42,9 @@ export type FakeServer = { setNextStatusCode: (c: number) => void; setStatusCode: (c: number) => void; setStatusCodes: (c: number[]) => void; + setLocalCodeEngineConfiguration: (next: Record) => void; setFeatureFlag: (featureFlag: string, enabled: boolean) => void; + setOrgSetting: (setting: string, enabled: boolean) => void; unauthorizeAction: (action: string, reason?: string) => void; listen: (port: string | number, callback: () => void) => void; listenPromise: (port: string | number) => Promise; @@ -59,6 +61,10 @@ export type FakeServer = { export const fakeServer = (basePath: string, snykToken: string): FakeServer => { let requests: express.Request[] = []; let featureFlags: Map = featureFlagDefaults(); + let availableSettings: Map = new Map(); + let localCodeEngineConfiguration: Record = { + enabled: false, + }; let unauthorizedActions = new Map(); // the status code to return for the next request, overriding statusCode let nextStatusCode: number | undefined = undefined; @@ -75,6 +81,7 @@ export const fakeServer = (basePath: string, snykToken: string): FakeServer => { requests = []; customResponse = undefined; featureFlags = featureFlagDefaults(); + availableSettings = new Map(); unauthorizedActions = new Map(); }; @@ -94,6 +101,16 @@ export const fakeServer = (basePath: string, snykToken: string): FakeServer => { customResponse = next; }; + const setLocalCodeEngineConfiguration = ( + response: string | Record, + ) => { + if (typeof response === 'string') { + localCodeEngineConfiguration = JSON.parse(response); + return; + } + localCodeEngineConfiguration = response; + }; + const setNextResponse = (response: string | Record) => { if (typeof response === 'string') { nextResponse = JSON.parse(response); @@ -118,6 +135,10 @@ export const fakeServer = (basePath: string, snykToken: string): FakeServer => { featureFlags.set(featureFlag, enabled); }; + const setOrgSetting = (setting: string, enabled: boolean) => { + availableSettings.set(setting, enabled); + }; + const unauthorizeAction = ( action: string, reason = 'unauthorized by test', @@ -388,6 +409,41 @@ export const fakeServer = (basePath: string, snykToken: string): FakeServer => { }); }); + app.get(basePath + '/cli-config/settings/:setting', (req, res) => { + const org = req.query.org; + const setting = req.params.setting; + if (org === 'no-flag') { + res.send({ + ok: false, + userMessage: `Org ${org} doesn't have '${setting}' feature enabled'`, + }); + return; + } + + if (availableSettings.has(setting)) { + const settingEnabled = availableSettings.get(setting); + // TODO: Refactor to support passing in an org setting with additional + // properties, e.g. localCodeEngine. + if (settingEnabled && setting === 'sast') { + return res.send({ + ok: true, + sastEnabled: true, + localCodeEngine: localCodeEngineConfiguration, + }); + } + + return res.send({ + ok: false, + userMessage: `Org ${org} doesn't have '${setting}' feature enabled'`, + }); + } + + // default: return false for all feature flags + res.send({ + ok: false, + }); + }); + app.get(basePath + '/cli-config/feature-flags/:featureFlag', (req, res) => { const org = req.query.org; const flag = req.params.featureFlag; @@ -709,11 +765,13 @@ export const fakeServer = (basePath: string, snykToken: string): FakeServer => { popRequest, popRequests, setCustomResponse: setCustomResponse, + setLocalCodeEngineConfiguration, setNextResponse, setNextStatusCode, setStatusCode, setStatusCodes, setFeatureFlag, + setOrgSetting, unauthorizeAction, listen, listenPromise, diff --git a/test/fixtures/sast-empty/empty-sarif.json b/test/fixtures/sast-empty/empty-sarif.json new file mode 100644 index 0000000000..0e0b340ce9 --- /dev/null +++ b/test/fixtures/sast-empty/empty-sarif.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json", + "version": "2.1.0", + "runs": [ + { + "tool": { + "driver": { + "name": "SnykCode", + "semanticVersion": "1.0.0", + "version": "1.0.0", + "rules": [] + } + }, + "results": [], + "properties": { + "coverage": [ + { + "files": 8, + "isSupported": true, + "lang": "JavaScript" + }, + { + "files": 1, + "isSupported": true, + "lang": "HTML" + } + ] + } + } + ] +} diff --git a/test/fixtures/sast-empty/shallow_empty/index.java b/test/fixtures/sast-empty/shallow_empty/index.java new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/fixtures/sast-empty/shallow_empty/index.js b/test/fixtures/sast-empty/shallow_empty/index.js new file mode 100644 index 0000000000..a0cf0e4330 --- /dev/null +++ b/test/fixtures/sast-empty/shallow_empty/index.js @@ -0,0 +1 @@ +console.log('shallow_empty'); \ No newline at end of file diff --git a/test/fixtures/sast/empty-sarif.json b/test/fixtures/sast/empty-sarif.json new file mode 100644 index 0000000000..0e0b340ce9 --- /dev/null +++ b/test/fixtures/sast/empty-sarif.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json", + "version": "2.1.0", + "runs": [ + { + "tool": { + "driver": { + "name": "SnykCode", + "semanticVersion": "1.0.0", + "version": "1.0.0", + "rules": [] + } + }, + "results": [], + "properties": { + "coverage": [ + { + "files": 8, + "isSupported": true, + "lang": "JavaScript" + }, + { + "files": 1, + "isSupported": true, + "lang": "HTML" + } + ] + } + } + ] +} diff --git a/test/jest/acceptance/snyk-code/snyk-code.spec.ts b/test/jest/acceptance/snyk-code/snyk-code.spec.ts index ae4e757f7f..0a8d3243c6 100644 --- a/test/jest/acceptance/snyk-code/snyk-code.spec.ts +++ b/test/jest/acceptance/snyk-code/snyk-code.spec.ts @@ -1,10 +1,57 @@ +import { createProjectFromFixture } from '../../util/createProject'; import { runSnykCLI } from '../../util/runSnykCLI'; +import { fakeServer } from '../../../acceptance/fake-server'; +import { fakeDeepCodeServer } from '../../../acceptance/deepcode-fake-server'; +import { getServerPort } from '../../util/getServerPort'; +const stripAnsi = require('strip-ansi'); + +const EXIT_CODE_SUCCESS = 0; +const EXIT_CODE_ACTION_NEEDED = 1; +const EXIT_CODE_FAIL_WITH_ERROR = 2; +const EXIT_CODE_NO_SUPPORTED_FILES = 3; describe('code', () => { + let server: ReturnType; + let deepCodeServer: ReturnType; + let env: Record; + const port = getServerPort(process); + const baseApi = '/api/v1'; + const initialEnvVars = { + ...process.env, + SNYK_API: 'http://localhost:' + port + baseApi, + SNYK_HOST: 'http://localhost:' + port, + SNYK_TOKEN: '123456789', + }; + + beforeAll((done) => { + deepCodeServer = fakeDeepCodeServer(); + deepCodeServer.listen(() => {}); + env = { + ...initialEnvVars, + SNYK_CODE_CLIENT_PROXY_URL: `http://localhost:${deepCodeServer.getPort()}`, + }; + server = fakeServer(baseApi, 'snykToken'); + server.listen(port, () => { + done(); + }); + }); + + afterEach(() => { + server.restore(); + deepCodeServer.restore(); + }); + + afterAll((done) => { + deepCodeServer.close(() => {}); + server.close(() => { + done(); + }); + }); + it('prints help info', async () => { - const { stdout, code, stderr } = await runSnykCLI('code'); + const { stdout, code, stderr } = await runSnykCLI('code', { env }); - expect(stdout).toContain( + expect(stripAnsi(stdout)).toContain( 'The snyk code test command finds security issues using Static Code Analysis.', ); expect(code).toBe(0); @@ -12,15 +59,190 @@ describe('code', () => { }); describe('test', () => { - jest.setTimeout(60000); - it('supports unknown flags', async () => { - const { stdout: baselineStdOut } = await runSnykCLI('code test --help'); - const { stdout, stderr } = await runSnykCLI('code test --unknown-flag'); + it('should fail - when we do not support files', async () => { + // Setup + const { path } = await createProjectFromFixture('empty'); + server.setOrgSetting('sast', true); + + const { stdout, code, stderr } = await runSnykCLI(`code test ${path()}`, { + env, + }); + + expect(stderr).toBe(''); + expect(stdout).toContain(`We found 0 supported files`); + expect(code).toBe(EXIT_CODE_NO_SUPPORTED_FILES); // failure, no supported projects detected + }); + + it('should succeed - when no errors found', async () => { + // Setup + const { path } = await createProjectFromFixture( + 'sast-empty/shallow_empty', + ); + server.setOrgSetting('sast', true); + deepCodeServer.setSarifResponse( + require('../../../fixtures/sast-empty/empty-sarif.json'), + ); + + const { stdout, code, stderr } = await runSnykCLI(`code test ${path()}`, { + env, + }); + + expect(stderr).toBe(''); + expect(stdout).toContain(`Awesome! No issues were found.`); + expect(code).toBe(EXIT_CODE_SUCCESS); + + expect( + server + .getRequests() + .filter((req) => req.originalUrl.endsWith('/analytics/cli')), + ).toHaveLength(2); + }); + + it('should succeed - with correct exit code', async () => { + const { path } = await createProjectFromFixture( + 'sast/shallow_sast_webgoat', + ); + server.setOrgSetting('sast', true); + deepCodeServer.setSarifResponse( + require('../../../fixtures/sast/sample-sarif.json'), + ); + + const { stdout, stderr, code } = await runSnykCLI(`code test ${path()}`, { + env, + }); // We do not render the help message for unknown flags - expect(stdout).not.toContain(baselineStdOut); - expect(stdout).toContain('Testing '); expect(stderr).toBe(''); + expect(stripAnsi(stdout)).toContain('✗ [Medium] Information Exposure'); + expect(code).toBe(EXIT_CODE_ACTION_NEEDED); + }); + + it('should show error if sast is not enabled', async () => { + // Setup + const { path } = await createProjectFromFixture( + 'sast/shallow_sast_webgoat', + ); + server.setOrgSetting('sast', false); + + const { stdout, code, stderr } = await runSnykCLI(`code test ${path()}`, { + env, + }); + + expect(stderr).toBe(''); + expect(stdout).toContain('Snyk Code is not supported for org'); + expect(code).toBe(EXIT_CODE_FAIL_WITH_ERROR); + }); + + it.each([['sarif'], ['json']])( + 'succeed testing with correct exit code - with %p output', + async (optionsName) => { + const sarifPayload = require('../../../fixtures/sast/sample-sarif.json'); + const { path } = await createProjectFromFixture( + 'sast/shallow_sast_webgoat', + ); + server.setOrgSetting('sast', true); + deepCodeServer.setSarifResponse(sarifPayload); + + const { stdout, stderr, code } = await runSnykCLI( + `code test ${path()} --${optionsName}`, + { + env, + }, + ); + + expect(stderr).toBe(''); + expect(JSON.parse(stdout)).toEqual(sarifPayload); + expect(code).toBe(EXIT_CODE_ACTION_NEEDED); + }, + ); + + it('succeed testing with correct exit code - with sarif oputput and no markdown', async () => { + const sarifPayload = require('../../../fixtures/sast/sample-sarif.json'); + const { path } = await createProjectFromFixture( + 'sast/shallow_sast_webgoat', + ); + server.setOrgSetting('sast', true); + deepCodeServer.setSarifResponse(sarifPayload); + + const { stdout, stderr, code } = await runSnykCLI( + `code test ${path()} --sarif --no-markdown`, + { + env, + }, + ); + + expect(stderr).toBe(''); + const output = JSON.parse(stdout); + expect(Object.keys(output.runs[0].results[0].message)).not.toContain( + 'markdown', + ); + expect(code).toBe(EXIT_CODE_ACTION_NEEDED); + }); + + const failedCodeTestMessage = "Failed to run 'code test'"; + + // This is caused by the retry logic in the code-client + // which defaults to 10 retries with a 5 second delay + jest.setTimeout(60000); + it.each([ + [{ code: 401 }, `Unauthorized: ${failedCodeTestMessage}`], + [{ code: 429 }, failedCodeTestMessage], + [{ code: 500 }, failedCodeTestMessage], // TODO this causes the test to hang. Think it is due to retry logic + ])( + 'should fail - when server returns %p', + async (errorCodeObj, expectedResult) => { + const { path } = await createProjectFromFixture( + 'sast/shallow_sast_webgoat', + ); + server.setOrgSetting('sast', true); + deepCodeServer.setNextStatusCode(errorCodeObj.code); + deepCodeServer.setNextResponse({ + statusCode: errorCodeObj.code, + statusText: 'Unauthorized action', + apiName: 'code', + }); + + const { stdout, code, stderr } = await runSnykCLI( + `code test ${path()}`, + { + env, + }, + ); + + expect(stderr).toBe(''); + expect(stdout).toContain(expectedResult); + expect(code).toBe(EXIT_CODE_FAIL_WITH_ERROR); + }, + ); + + it("use remote LCE's url as base when LCE is enabled", async () => { + const localCodeEngineUrl = fakeDeepCodeServer(); + localCodeEngineUrl.listen(() => {}); + + const { path } = await createProjectFromFixture( + 'sast/shallow_sast_webgoat', + ); + server.setOrgSetting('sast', true); + server.setLocalCodeEngineConfiguration({ + enabled: true, + allowCloudUpload: true, + url: 'http://localhost:' + localCodeEngineUrl.getPort(), + }); + localCodeEngineUrl.setSarifResponse( + require('../../../fixtures/sast/sample-sarif.json'), + ); + + const { stdout, code, stderr } = await runSnykCLI(`code test ${path()}`, { + env, + }); + + expect(deepCodeServer.getRequests().length).toBe(0); + expect(localCodeEngineUrl.getRequests().length).toBeGreaterThan(0); + expect(stderr).toBe(''); + expect(stripAnsi(stdout)).toContain('✗ [Medium] Information Exposure'); + expect(code).toBe(EXIT_CODE_ACTION_NEEDED); + + await localCodeEngineUrl.close(() => {}); }); }); }); From 2011b90704582654560d6d64819fe8d3cdfc91fd Mon Sep 17 00:00:00 2001 From: 37IulianPopovici <136596702+37IulianPopovici@users.noreply.github.com> Date: Fri, 29 Mar 2024 10:58:54 +0200 Subject: [PATCH 28/58] fix: enhance sbt output width, fixing false positives vulns (#5130) --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index a6fbe6dde7..ceddfbc8bb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -79,7 +79,7 @@ "snyk-policy": "^1.25.0", "snyk-python-plugin": "2.1.1", "snyk-resolve-deps": "4.7.3", - "snyk-sbt-plugin": "2.17.1", + "snyk-sbt-plugin": "2.18.1", "snyk-swiftpm-plugin": "1.4.1", "strip-ansi": "^6.0.1", "tar": "^6.1.2", @@ -21563,9 +21563,9 @@ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, "node_modules/snyk-sbt-plugin": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/snyk-sbt-plugin/-/snyk-sbt-plugin-2.17.1.tgz", - "integrity": "sha512-jEwEaoWBz+3hOh9k+B3WRQXL8GJLrlmlQJxqHUCC9kBD5TCU+EoGRFdDU+rZZMT08zzD3D8JvLlL9h06dfmU1w==", + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/snyk-sbt-plugin/-/snyk-sbt-plugin-2.18.1.tgz", + "integrity": "sha512-a87nxSWJcFUdG5NVQAoqSPGIWfth9X4BLrviGCozKu1MRPExWCbfW+9ApkPHOBVU3Tf22s9478Ab3XzCdQQACQ==", "dependencies": { "debug": "^4.1.1", "semver": "^6.1.2", @@ -40832,9 +40832,9 @@ } }, "snyk-sbt-plugin": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/snyk-sbt-plugin/-/snyk-sbt-plugin-2.17.1.tgz", - "integrity": "sha512-jEwEaoWBz+3hOh9k+B3WRQXL8GJLrlmlQJxqHUCC9kBD5TCU+EoGRFdDU+rZZMT08zzD3D8JvLlL9h06dfmU1w==", + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/snyk-sbt-plugin/-/snyk-sbt-plugin-2.18.1.tgz", + "integrity": "sha512-a87nxSWJcFUdG5NVQAoqSPGIWfth9X4BLrviGCozKu1MRPExWCbfW+9ApkPHOBVU3Tf22s9478Ab3XzCdQQACQ==", "requires": { "debug": "^4.1.1", "semver": "^6.1.2", diff --git a/package.json b/package.json index c73e6a64be..cbfb6e7153 100644 --- a/package.json +++ b/package.json @@ -127,7 +127,7 @@ "snyk-policy": "^1.25.0", "snyk-python-plugin": "2.1.1", "snyk-resolve-deps": "4.7.3", - "snyk-sbt-plugin": "2.17.1", + "snyk-sbt-plugin": "2.18.1", "snyk-swiftpm-plugin": "1.4.1", "strip-ansi": "^6.0.1", "tar": "^6.1.2", From 3711b70898a89d383a00c7dad0c1b27195ca3259 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 29 Mar 2024 10:26:43 -0500 Subject: [PATCH 29/58] docs: synchronizing help from snyk/user-docs (#5144) Co-authored-by: Avishagp --- help/cli-commands/monitor.md | 2 ++ help/cli-commands/test.md | 2 ++ 2 files changed, 4 insertions(+) diff --git a/help/cli-commands/monitor.md b/help/cli-commands/monitor.md index 6b85005cf5..85a58aa56e 100644 --- a/help/cli-commands/monitor.md +++ b/help/cli-commands/monitor.md @@ -231,6 +231,8 @@ Be sure to run the scan in the same directory as the root `pom.xml` file. Snyk reports the test results per individual `pom.xml` file within the aggregate project. +**Note:** You can use `--all-projects` when scanning Maven aggregate projects, but you cannot use `--all-projects` with `--maven-aggregate-project`. + ### `--scan-unmanaged` To monitor individual JAR, WAR, and AAR files, use the following: diff --git a/help/cli-commands/test.md b/help/cli-commands/test.md index 04e519c653..da491a157c 100644 --- a/help/cli-commands/test.md +++ b/help/cli-commands/test.md @@ -234,6 +234,8 @@ Be sure to run the scan in the same directory as the root `pom.xml` file. Snyk reports the test results per individual `pom.xml` file within the aggregate project. +**Note:** You can use `--all-projects` when scanning Maven aggregate projects, but you cannot use `--all-projects` with `--maven-aggregate-project`. + ### `--scan-unmanaged` To test individual JAR, WAR, and AAR files, use the following: From e3925cc6e7e1dae935689df4ba390cdb28e61d32 Mon Sep 17 00:00:00 2001 From: Luke Watts Date: Tue, 2 Apr 2024 10:40:41 +0200 Subject: [PATCH 30/58] chore: ignore tap files when formatting (#5143) These files are not tracked by git and result in a noticeable lag in prettier whilst they are being processed. See here for an example of the ~4.5second delay caused by prettier. ``` .tap/coverage/01fec6e5-492e-4f01-baa6-69022efbebfc.json 15ms .tap/coverage/05a96cf2-7cea-4e31-8d82-745c88fbd122.json 224ms .tap/coverage/093b21d5-b8a4-4dd1-9815-e669729363b2.json 80ms .tap/coverage/4c57c24d-61e9-41d8-912a-8944b9e3dd85.json 15ms .tap/coverage/51be6d29-8498-42b5-b648-4331a8cc1620.json 2430ms .tap/coverage/77a86007-79d2-403a-9fd0-0099176628eb.json 58ms .tap/coverage/ad188bc4-8e9f-42ed-bdbb-febdf9e2fd70.json 2213ms .tap/coverage/e3b30972-2569-41f3-a2f0-0b516524c56e.json 56ms .tap/coverage/e4e079ea-f384-434c-8a8f-430f6bda7501.json 16ms .tap/coverage/ec4b832d-d31c-40b7-8657-48b874219100.json 18ms .tap/coverage/f47299fe-8a09-46ac-99f8-33209e0bb687.json 5ms .tap/processinfo/01fec6e5-492e-4f01-baa6-69022efbebfc.json 4ms .tap/processinfo/05a96cf2-7cea-4e31-8d82-745c88fbd122.json 5ms .tap/processinfo/093b21d5-b8a4-4dd1-9815-e669729363b2.json 4ms .tap/processinfo/4c57c24d-61e9-41d8-912a-8944b9e3dd85.json 3ms .tap/processinfo/51be6d29-8498-42b5-b648-4331a8cc1620.json 5ms .tap/processinfo/77a86007-79d2-403a-9fd0-0099176628eb.json 4ms .tap/processinfo/ad188bc4-8e9f-42ed-bdbb-febdf9e2fd70.json 5ms .tap/processinfo/e3b30972-2569-41f3-a2f0-0b516524c56e.json 4ms .tap/processinfo/e4e079ea-f384-434c-8a8f-430f6bda7501.json 3ms .tap/processinfo/ec4b832d-d31c-40b7-8657-48b874219100.json 4ms .tap/processinfo/f47299fe-8a09-46ac-99f8-33209e0bb687.json 3ms ``` --- .prettierignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.prettierignore b/.prettierignore index 156c518739..57e6325996 100644 --- a/.prettierignore +++ b/.prettierignore @@ -9,7 +9,7 @@ test-output test-results test/**/workspaces .iac-data - +.tap src/cli/commands/test/iac/local-execution/parsers/hcl-to-json/parser.js src/cli/commands/test/iac/local-execution/parsers/hcl-to-json-v2/parser.js From e06a383bd56d7d0347c9110d7ed58d8b29aa8543 Mon Sep 17 00:00:00 2001 From: Andre Faure Date: Wed, 3 Apr 2024 09:32:23 +0100 Subject: [PATCH 31/58] chore: update ignores and security scans workflow for CICD (#5066) --- .circleci/config.yml | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 560e248794..2cba68344d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -906,18 +906,14 @@ jobs: name: Linting project command: | npm run lint - pushd cliv2 + pushd cliv2 make lint popd - - snyk/scan: - fail-on-issues: true - severity-threshold: critical - additional-arguments: --all-projects --exclude=test,dist - - snyk/scan: - command: code test - fail-on-issues: true - monitor-on-build: true - severity-threshold: high + - prodsec/security_scans: + mode: auto + open-source-additional-arguments: --exclude=test,dist + iac-scan: disabled + release-branch: main test-node: executor: docker-amd64 From 84b5e8bf390d4e68665c79efa57a4a7ed7cb3600 Mon Sep 17 00:00:00 2001 From: JSON Date: Wed, 3 Apr 2024 11:54:37 +0100 Subject: [PATCH 32/58] fix: avoid potentially outputting very large JSON objects (#5147) --- src/lib/request/request.ts | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/lib/request/request.ts b/src/lib/request/request.ts index f1ee021db1..c09617be75 100644 --- a/src/lib/request/request.ts +++ b/src/lib/request/request.ts @@ -143,13 +143,10 @@ export async function makeRequest( return new Promise((resolve, reject) => { needle.request(method, url, data, options, (err, res, respBody) => { - debug(err); - debug( - 'response (%s): ', - (res || {}).statusCode, - jsonStringifyLargeObject(respBody), - ); + // respBody potentially very large, do not output it in debug + debug('response (%s)', (res || {}).statusCode); if (err) { + debug('response err: %s', err); return reject(err); } From f645bbe4b439a9523fcd16cc9857786bd25898b4 Mon Sep 17 00:00:00 2001 From: Bastian Doetsch Date: Wed, 3 Apr 2024 13:52:00 +0200 Subject: [PATCH 33/58] fix: always finish progress when auto-fixing in language server (#5145) --- .circleci/config.yml | 51 ++++++++++++++- cliv2/go.mod | 47 ++++++++++---- cliv2/go.sum | 143 ++++++++++++++++++++++++++++++++++--------- 3 files changed, 197 insertions(+), 44 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 2cba68344d..d6c9f8507b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -387,6 +387,10 @@ workflows: - secrets-scan - code-analysis: + go_target_os: linux + go_os: linux + go_arch: amd64 + go_download_base_url: << pipeline.parameters.go_download_base_url >> context: devex_cli requires: - prepare-build @@ -405,6 +409,10 @@ workflows: ignore: main - test-go: + go_target_os: linux + go_os: linux + go_arch: amd64 + go_download_base_url: << pipeline.parameters.go_download_base_url >> context: - nodejs-install - team_hammerhead-cli @@ -899,15 +907,34 @@ jobs: - packages/* code-analysis: + parameters: + go_os: + type: string + go_target_os: + type: string + go_arch: + type: string + go_download_base_url: + type: string + install_path: + type: string + default: '/tmp' executor: docker-amd64 steps: - prepare-workspace + - install-go: + go_os: << parameters.go_os >> + go_target_os: << parameters.go_target_os >> + go_arch: << parameters.go_arch >> + base_url: << parameters.go_download_base_url >> + extraction_path: << parameters.install_path >> - run: name: Linting project command: | npm run lint - pushd cliv2 - make lint + pushd cliv2 + export CGO_ENABLED=1 + make lint popd - prodsec/security_scans: mode: auto @@ -928,9 +955,27 @@ jobs: path: test/reports test-go: - executor: circle-go + executor: docker-amd64 + parameters: + go_os: + type: string + go_target_os: + type: string + go_arch: + type: string + go_download_base_url: + type: string + install_path: + type: string + default: '.' steps: - prepare-workspace + - install-go: + go_os: << parameters.go_os >> + go_target_os: << parameters.go_target_os >> + go_arch: << parameters.go_arch >> + base_url: << parameters.go_download_base_url >> + extraction_path: << parameters.install_path >> - run: name: Running Go unit tests working_directory: ./cliv2 diff --git a/cliv2/go.mod b/cliv2/go.mod index 69180dccd9..8e5b06eb70 100644 --- a/cliv2/go.mod +++ b/cliv2/go.mod @@ -16,10 +16,10 @@ require ( github.com/snyk/go-application-framework v0.0.0-20240325175807-5cb112133ceb github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65 github.com/snyk/snyk-iac-capture v0.6.5 - github.com/snyk/snyk-ls v0.0.0-20240318135323-bd809c95fbe4 + github.com/snyk/snyk-ls v0.0.0-20240402143951-9d7d19ca1a78 github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 - github.com/stretchr/testify v1.8.4 + github.com/stretchr/testify v1.9.0 ) require ( @@ -28,7 +28,10 @@ require ( cloud.google.com/go/compute/metadata v0.2.3 // indirect cloud.google.com/go/iam v1.1.5 // indirect cloud.google.com/go/storage v1.35.1 // indirect + dario.cat/mergo v1.0.0 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect github.com/OneOfOne/xxhash v1.2.8 // indirect + github.com/ProtonMail/go-crypto v1.0.0 // indirect github.com/adrg/xdg v0.4.0 // indirect github.com/agext/levenshtein v1.2.3 // indirect github.com/agnivade/levenshtein v1.1.1 // indirect @@ -46,27 +49,37 @@ require ( github.com/charmbracelet/bubbles v0.14.0 // indirect github.com/charmbracelet/bubbletea v0.23.1 // indirect github.com/charmbracelet/lipgloss v0.6.0 // indirect + github.com/cloudflare/circl v1.3.7 // indirect github.com/containerd/console v1.0.3 // indirect github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf // indirect github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f // indirect - github.com/creachadair/jrpc2 v1.1.2 // indirect - github.com/creachadair/mds v0.12.1 // indirect + github.com/creachadair/jrpc2 v1.2.0 // indirect + github.com/creachadair/mds v0.14.0 // indirect + github.com/cyphar/filepath-securejoin v0.2.4 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/deepmap/oapi-codegen v1.16.2 // indirect github.com/denisbrodbeck/machineid v1.0.1 // indirect github.com/docker/distribution v2.8.2+incompatible // indirect + github.com/emirpasic/gods v1.18.1 // indirect github.com/erikgeiser/promptkit v0.8.0 // indirect github.com/erni27/imcache v1.2.0 // indirect github.com/fatih/color v1.16.0 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/gertd/go-pluralize v0.2.1 // indirect + github.com/getkin/kin-openapi v0.123.0 // indirect github.com/getsentry/sentry-go v0.27.0 // indirect github.com/ghodss/yaml v1.0.0 // indirect + github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect + github.com/go-git/go-billy/v5 v5.5.0 // indirect + github.com/go-git/go-git/v5 v5.12.0 // indirect github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-openapi/jsonpointer v0.21.0 // indirect + github.com/go-openapi/swag v0.23.0 // indirect github.com/gobwas/glob v0.2.3 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/mock v1.6.0 // indirect github.com/golang/protobuf v1.5.4 // indirect - github.com/gomarkdown/markdown v0.0.0-20231222211730-1d6d20845b47 // indirect + github.com/gomarkdown/markdown v0.0.0-20240328165702-4d01890c35c0 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/google/s2a-go v0.1.7 // indirect @@ -87,6 +100,8 @@ require ( github.com/hashicorp/terraform-svchost v0.0.0-20200729002733-f050f53b9734 // indirect github.com/hexops/gotextdiff v1.0.3 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/invopop/yaml v0.2.0 // indirect + github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/jcmturner/aescts/v2 v2.0.0 // indirect github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect github.com/jcmturner/gofork v1.7.6 // indirect @@ -94,17 +109,21 @@ require ( github.com/jcmturner/gokrb5/v8 v8.4.4 // indirect github.com/jcmturner/rpc/v2 v2.0.3 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/kevinburke/ssh_config v1.2.0 // indirect github.com/klauspost/compress v1.17.0 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect github.com/magiconair/properties v1.8.7 // indirect + github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-localereader v0.0.1 // indirect - github.com/mattn/go-runewidth v0.0.14 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/mitchellh/go-wordwrap v1.0.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect github.com/muesli/ansi v0.0.0-20221106050444-61f0cd9a192a // indirect github.com/muesli/cancelreader v0.2.2 // indirect github.com/muesli/reflow v0.3.0 // indirect @@ -112,22 +131,26 @@ require ( github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/open-policy-agent/opa v0.51.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/pelletier/go-toml/v2 v2.1.1 // indirect + github.com/pelletier/go-toml/v2 v2.2.0 // indirect + github.com/perimeterx/marshmallow v1.1.5 // indirect github.com/peterh/liner v1.2.2 // indirect github.com/pingcap/errors v0.11.4 // indirect + github.com/pjbgf/sha1cd v0.3.0 // indirect github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/puzpuzpuz/xsync v1.5.2 // indirect github.com/puzpuzpuz/xsync/v3 v3.1.0 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect - github.com/rivo/uniseg v0.4.3 // indirect + github.com/rivo/uniseg v0.4.4 // indirect github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/segmentio/analytics-go v3.1.0+incompatible // indirect - github.com/segmentio/backo-go v1.0.1 // indirect + github.com/segmentio/backo-go v1.1.0 // indirect + github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect - github.com/snyk/code-client-go v0.3.1 // indirect + github.com/skeema/knownhosts v1.2.2 // indirect + github.com/snyk/code-client-go v1.2.0 // indirect github.com/snyk/policy-engine v0.22.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/sourcegraph/go-lsp v0.0.0-20240223163137-f80c5dd31dfd // indirect @@ -139,6 +162,7 @@ require ( github.com/tklauser/go-sysconf v0.3.13 // indirect github.com/tklauser/numcpus v0.7.0 // indirect github.com/ulikunitz/xz v0.5.11 // indirect + github.com/xanzy/ssh-agent v0.3.3 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // indirect @@ -151,7 +175,7 @@ require ( go.opencensus.io v0.24.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/crypto v0.21.0 // indirect - golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 // indirect + golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 // indirect golang.org/x/mod v0.16.0 // indirect golang.org/x/net v0.22.0 // indirect golang.org/x/oauth2 v0.18.0 // indirect @@ -170,6 +194,7 @@ require ( google.golang.org/grpc v1.59.0 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/cliv2/go.sum b/cliv2/go.sum index e9dc9cf16c..77aff81500 100644 --- a/cliv2/go.sum +++ b/cliv2/go.sum @@ -184,12 +184,19 @@ cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xX cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= +dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= +dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8= github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= +github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78= +github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls= github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E= github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo= @@ -200,6 +207,8 @@ github.com/alexbrainman/sspi v0.0.0-20231016080023-1a75b4708caa h1:LHTHcTQiSGT7V github.com/alexbrainman/sspi v0.0.0-20231016080023-1a75b4708caa/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4= github.com/amplitude/analytics-go v1.0.1 h1:rrdC5VBctlJigSk0kw7ktwSijob/wyH4bop2SqWduCU= github.com/amplitude/analytics-go v1.0.1/go.mod h1:kAQG8OQ6aPOxZrEZ3+/NFCfxdYSyjqXZhgkjWFD3/vo= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apparentlymart/go-cidr v1.1.0 h1:2mAhrMoF+nhXqxTzSZMUzDHkLjmIHC+Zzn4tdgBZjnU= github.com/apparentlymart/go-cidr v1.1.0/go.mod h1:EBcsNrHc3zQeuaeCeCtQruQm+n9/YjEn/vI25Lg7Gwc= @@ -212,6 +221,8 @@ github.com/apparentlymart/go-versions v1.0.1 h1:ECIpSn0adcYNsBfSRwdDdz9fWlL+S/6E github.com/apparentlymart/go-versions v1.0.1/go.mod h1:YF5j7IQtrOAOnsGkniupEA5bfCjzd7i14yu0shZavyM= github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0 h1:jfIu9sQUG6Ig+0+Ap1h4unLjW6YQJpKZVmUzxsD4E/Q= github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= @@ -228,8 +239,7 @@ github.com/bmatcuk/doublestar v1.3.4 h1:gPypJ5xD31uhX6Tf54sDPUOBXTqKH4c9aPY66CyQ github.com/bmatcuk/doublestar v1.3.4/go.mod h1:wiQtGV+rzVYxB7WIlirSN++5HPtPlXEo9MEoZQC/PmE= github.com/bmatcuk/doublestar/v4 v4.6.0 h1:HTuxyug8GyFbRkrffIpzNCSK4luc0TY3wzXvzIZhEXc= github.com/bmatcuk/doublestar/v4 v4.6.0/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= +github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/bytecodealliance/wasmtime-go/v3 v3.0.2 h1:3uZCA/BLTIu+DqCfguByNMJa2HVHpXvjfy0Dy7g6fuA= github.com/bytecodealliance/wasmtime-go/v3 v3.0.2/go.mod h1:RnUjnIXxEJcL6BgCvNyzCCRzZcxCgsZCi+RNlvYor5Q= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -252,6 +262,9 @@ github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWR github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= +github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= +github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= @@ -269,14 +282,18 @@ github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSV github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creachadair/jrpc2 v1.1.2 h1:UOYMipEFYlwd5qmcvs9GZBurn3oXt1UDIX5JLjWWFzo= -github.com/creachadair/jrpc2 v1.1.2/go.mod h1:JcCe2Eny3lIvVwZLm92WXyU+tNUgTBWFCLMsfNkjEGk= -github.com/creachadair/mds v0.12.1 h1:uJh5mwLcRMpoUVjrZUednb9bxxDPvD9+tt/TnuxIUUo= -github.com/creachadair/mds v0.12.1/go.mod h1:4vrFYUzTXMJpMBU+OA292I6IUxKWCCfZkgXg+/kBZMo= +github.com/creachadair/jrpc2 v1.2.0 h1:SXr0OgnwM0X18P+HccJP0uT3KGSDk/BCSRlJBvE2bMY= +github.com/creachadair/jrpc2 v1.2.0/go.mod h1:66uKSdr6tR5ZeNvkIjDSbbVUtOv0UhjS/vcd8ECP7Iw= +github.com/creachadair/mds v0.14.0 h1:gRrZNaykFmn0z2FCzmfb+imCyEbEiRFTq7jopzn9RlM= +github.com/creachadair/mds v0.14.0/go.mod h1:4vrFYUzTXMJpMBU+OA292I6IUxKWCCfZkgXg+/kBZMo= +github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= +github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/deepmap/oapi-codegen v1.16.2 h1:xGHx0dNqYfy9gE8a7AVgVM8Sd5oF9SEgePzP+UPAUXI= +github.com/deepmap/oapi-codegen v1.16.2/go.mod h1:rdYoEA2GE+riuZ91DvpmBX9hJbQpuY9wchXpfQ3n+ho= github.com/denisbrodbeck/machineid v1.0.1 h1:geKr9qtkB876mXguW2X6TU4ZynleN6ezuMSRhl4D7AQ= github.com/denisbrodbeck/machineid v1.0.1/go.mod h1:dJUwb7PTidGDeYyUBmXZ2GphQBbjJCrnectwCyxcUSI= github.com/dgraph-io/badger/v3 v3.2103.5 h1:ylPa6qzbjYRQMU6jokoj4wzcaweHylt//CH0AKt0akg= @@ -294,6 +311,8 @@ github.com/elazarl/goproxy v0.0.0-20231031074852-3ec07828be7a/go.mod h1:Ro8st/El github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8= github.com/elazarl/goproxy/ext v0.0.0-20230808193330-2592e75ae04a h1:6hp3+W5oJSkbk/m2XquFdhih2H4wxxR0Nl6GfPL8kss= github.com/elazarl/goproxy/ext v0.0.0-20230808193330-2592e75ae04a/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8= +github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= +github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -322,21 +341,37 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/gertd/go-pluralize v0.2.1 h1:M3uASbVjMnTsPb0PNqg+E/24Vwigyo/tvyMTtAlLgiA= github.com/gertd/go-pluralize v0.2.1/go.mod h1:rbYaKDbsXxmRfr8uygAEKhOWsjyrrqrkHVpZvoOp8zk= +github.com/getkin/kin-openapi v0.123.0 h1:zIik0mRwFNLyvtXK274Q6ut+dPh6nlxBp0x7mNrPhs8= +github.com/getkin/kin-openapi v0.123.0/go.mod h1:wb1aSZA/iWmorQP9KTAS/phLj/t17B5jT7+fS8ed9NM= github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gliderlabs/ssh v0.3.7 h1:iV3Bqi942d9huXnzEF2Mt+CY9gLu8DNM4Obd+8bODRE= +github.com/gliderlabs/ssh v0.3.7/go.mod h1:zpHEXBstFnQYtGnB8k8kQLol82umzn/2/snG7alWVD8= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= +github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= +github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= +github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= +github.com/go-git/go-git/v5 v5.12.0 h1:7Md+ndsjrzZxbddRDZjF14qK+NN56sy6wkqaVrjZtys= +github.com/go-git/go-git/v5 v5.12.0/go.mod h1:FTM9VKtnI2m65hNI/TenDDDnUf2Q9FHnXYjuz9i5OEY= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= github.com/go-test/deep v1.0.1/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= -github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68= -github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= +github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= +github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -385,8 +420,8 @@ github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6 github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/gomarkdown/markdown v0.0.0-20231222211730-1d6d20845b47 h1:k4Tw0nt6lwro3Uin8eqoET7MDA4JnT8YgbCjc/g5E3k= -github.com/gomarkdown/markdown v0.0.0-20231222211730-1d6d20845b47/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA= +github.com/gomarkdown/markdown v0.0.0-20240328165702-4d01890c35c0 h1:4gjrh/PN2MuWCCElk8/I4OCKRKWCCo2zEct3VKCbibU= +github.com/gomarkdown/markdown v0.0.0-20240328165702-4d01890c35c0/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/flatbuffers v1.12.1 h1:MVlul7pQNoDzWRLTw5imwYsl+usrS1TXG2H4jg6ImGw= @@ -501,6 +536,10 @@ github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1: github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/invopop/yaml v0.2.0 h1:7zky/qH+O0DwAyoobXUqvVBwgBFRxKoQ/3FjcVpjTMY= +github.com/invopop/yaml v0.2.0/go.mod h1:2XuRLgs/ouIrW3XNzuNj7J3Nvu/Dig5MXvbCEdiBN3Q= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= @@ -517,8 +556,12 @@ github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9Y github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= +github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM= @@ -537,6 +580,8 @@ github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69 github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= @@ -557,8 +602,9 @@ github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/miekg/dns v1.1.43 h1:JKfpVSCB84vrAmHzyrsxB5NAr5kLoMXZArPSw7Qlgyg= @@ -571,6 +617,8 @@ github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQ github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b/go.mod h1:fQuZ0gauxyBcmsdE3ZT4NasjaRdxmbCS0jRHsrWu3Ho= github.com/muesli/ansi v0.0.0-20221106050444-61f0cd9a192a h1:jlDOeO5TU0pYlbc/y6PFguab5IjANI0Knrpg3u/ton4= github.com/muesli/ansi v0.0.0-20221106050444-61f0cd9a192a/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo= @@ -586,18 +634,24 @@ github.com/muesli/termenv v0.13.0 h1:wK20DRpJdDX8b7Ek2QfhvqhRQFZ237RGRO0RQ/Iqdy0 github.com/muesli/termenv v0.13.0/go.mod h1:sP1+uffeLaEYpyOTb8pLCUctGcGLnoFjSn4YJK5e2bc= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= github.com/open-policy-agent/opa v0.51.0 h1:2hS5xhos8HtkN+mgpqMhNJSFtn/1n/h3wh+AeTPJg6Q= github.com/open-policy-agent/opa v0.51.0/go.mod h1:OjmwLfXdeR7skSxrt8Yd3ScXTqPxyJn7GeTRJrcEerU= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/pact-foundation/pact-go v1.7.0 h1:5iyVyg+avkWz9Jn7cefRmlPbXu+KMZvWblIe15v4fc8= github.com/pact-foundation/pact-go v1.7.0/go.mod h1:NcAbRqIE0cjRF+JKl2vcLlzjvrgcZrnq4SwQu2o4PeA= -github.com/pelletier/go-toml/v2 v2.1.1 h1:LWAJwfNvjQZCFIDKWYQaM62NcYeYViCmWIwmOStowAI= -github.com/pelletier/go-toml/v2 v2.1.1/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= +github.com/pelletier/go-toml/v2 v2.2.0 h1:QLgLl2yMN7N+ruc31VynXs1vhMZa7CeHHejIeBAsoHo= +github.com/pelletier/go-toml/v2 v2.2.0/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s= +github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= github.com/peterh/liner v1.2.2 h1:aJ4AOodmL+JxOZZEL2u9iJf8omNRpqHc/EbrK+3mAXw= github.com/peterh/liner v1.2.2/go.mod h1:xFwJyiKIXJZUKItq5dGHZSTBRAuG/CpeNpWLyiNRNwI= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= +github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -622,13 +676,13 @@ github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5X github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= -github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= +github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.32.0 h1:keLypqrlIjaFsbmJOBdB/qvyF8KEtCWHwobLp5l/mQ0= github.com/rs/zerolog v1.32.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= @@ -642,22 +696,25 @@ github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWR github.com/sahilm/fuzzy v0.1.0/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y= github.com/segmentio/analytics-go v3.1.0+incompatible h1:IyiOfUgQFVHvsykKKbdI7ZsH374uv3/DfZUo9+G0Z80= github.com/segmentio/analytics-go v3.1.0+incompatible/go.mod h1:C7CYBtQWk4vRk2RyLu0qOcbHJ18E3F1HV2C/8JvKN48= -github.com/segmentio/backo-go v1.0.1 h1:68RQccglxZeyURy93ASB/2kc9QudzgIDexJ927N++y4= -github.com/segmentio/backo-go v1.0.1/go.mod h1:9/Rh6yILuLysoQnZ2oNooD2g7aBnvM7r/fNVxRNWfBc= -github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= -github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/segmentio/backo-go v1.1.0 h1:cJIfHQUdmLsd8t9IXqf5J8SdrOMn9vMa7cIvOavHAhc= +github.com/segmentio/backo-go v1.1.0/go.mod h1:ckenwdf+v/qbyhVdNPWHnqh2YdJBED1O9cidYyM5J18= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/skeema/knownhosts v1.2.2 h1:Iug2P4fLmDw9f41PB6thxUkNUkJzB5i+1/exaj40L3A= +github.com/skeema/knownhosts v1.2.2/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= github.com/snyk/cli-extension-dep-graph v0.0.0-20230926124856-b0fdf1ee6f73 h1:rwdJzpPWkWWf7csbv871GoKgRGwJ4GVNXMSsO0cRuLk= github.com/snyk/cli-extension-dep-graph v0.0.0-20230926124856-b0fdf1ee6f73/go.mod h1:QF3v8HBpOpyudYNCuR8LqfULutO76c91sBdLzD+pBJU= github.com/snyk/cli-extension-iac-rules v0.0.0-20230601153200-c572cfce46ce h1:WchwuyPX4mEr7tFCGD6EsjwTDipFWfLxs4Wps6KB3b4= github.com/snyk/cli-extension-iac-rules v0.0.0-20230601153200-c572cfce46ce/go.mod h1:5/IYYTgf32pST7St4GhS3KNz32WE17Ys+Hdb5Pqxex0= github.com/snyk/cli-extension-sbom v0.0.0-20240314090036-46535b380426 h1:MXbip3nmiOym3/9bNWlPISVOAEAAz4FDcPvqOMPcCc4= github.com/snyk/cli-extension-sbom v0.0.0-20240314090036-46535b380426/go.mod h1:g2VgZU79btvZrAP3oHZGv3tHD9POVOx5a3DY894rS4w= -github.com/snyk/code-client-go v0.3.1 h1:jCYBRJJ/qVlPRqJONwmwpMCMe7s/lulbJQE6KUe2DW0= -github.com/snyk/code-client-go v0.3.1/go.mod h1:D+cfqDbuZE1S106bY3Tr+ZXLb9BR16kKBtvlf0xdyNA= +github.com/snyk/code-client-go v1.2.0 h1:iTtODPUAINmneyfoEPt3t5Y5H84x2x325LGgnrqpzEI= +github.com/snyk/code-client-go v1.2.0/go.mod h1:zULRDwUaDANSvDfHIU0Eux4tTbSj7w0xWmbvQikhM9E= github.com/snyk/container-cli v0.0.0-20240322120441-6d9b9482f9b1 h1:9RKY9NdX5DrJAoVXDP0JiqrXT+4Nb9NH8pjEcA0NsLA= github.com/snyk/container-cli v0.0.0-20240322120441-6d9b9482f9b1/go.mod h1:38w+dcAQp9eG3P5t2eNS9eG0reut10AeJjLv5lJ5lpM= github.com/snyk/go-application-framework v0.0.0-20240325175807-5cb112133ceb h1:ovhyFAt2BDPNmzJ1M2KuGz0s2GSfiY9VoMF4/EvMG00= @@ -668,8 +725,8 @@ github.com/snyk/policy-engine v0.22.0 h1:od9pduGrXyfWO791X+8M1qmnvWUxaIXh0gBzGKq github.com/snyk/policy-engine v0.22.0/go.mod h1:Vvy/9VMXoABS3JlLqhTlAPWkB5LgbLh7LGn3gBwAqdY= github.com/snyk/snyk-iac-capture v0.6.5 h1:992DXCAJSN97KtUh8T5ndaWwd/6ZCal2bDkRXqM1u/E= github.com/snyk/snyk-iac-capture v0.6.5/go.mod h1:e47i55EmM0F69ZxyFHC4sCi7vyaJW6DLoaamJJCzWGk= -github.com/snyk/snyk-ls v0.0.0-20240318135323-bd809c95fbe4 h1:ckxsi32571LM2im35ZXBffLTEVL50yop6gZ3dsr6JtA= -github.com/snyk/snyk-ls v0.0.0-20240318135323-bd809c95fbe4/go.mod h1:hUnThwpQo1pHbwkZCHrLfjFoSExFtnWIXSpdesQlwEo= +github.com/snyk/snyk-ls v0.0.0-20240402143951-9d7d19ca1a78 h1:7xE+EoQ8wp6bpsB/ULm+lz21ka2OxTU8uWsKFXhpgZc= +github.com/snyk/snyk-ls v0.0.0-20240402143951-9d7d19ca1a78/go.mod h1:Fvc7SyLVLFLCG+GX/Lc3yyweXFonEM+IZtLx40gmBlQ= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/sourcegraph/go-lsp v0.0.0-20240223163137-f80c5dd31dfd h1:Dq5WSzWsP1TbVi10zPWBI5LKEBDg4Y1OhWEph1wr5WQ= @@ -688,8 +745,8 @@ github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMV github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.1 h1:4VhoImhV/Bm0ToFkXFi8hXNXwpDRZ/ynw3amt82mzq0= -github.com/stretchr/objx v0.5.1/go.mod h1:/iHQpkQwBD6DLUmQ4pE+s1TXdob1mORJ4/UFdrifcy0= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -700,8 +757,9 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/tchap/go-patricia/v2 v2.3.1 h1:6rQp39lgIYZ+MHmdEq4xzuk1t7OdC35z/xm0BGhTkes= @@ -710,10 +768,14 @@ github.com/tklauser/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08 github.com/tklauser/go-sysconf v0.3.13/go.mod h1:zwleP4Q4OehZHGn4CYZDipCgg9usW5IJePewFCGVEa0= github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr4= github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk= +github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= +github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= @@ -759,7 +821,10 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -772,8 +837,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 h1:LfspQV/FYTatPTr/3HzIcmiUFH7PGP+OQ6mgDYo3yuQ= -golang.org/x/exp v0.0.0-20240222234643-814bf88cf225/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc= +golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 h1:aAcj0Da7eBAtrTp03QXWvm88pSyOt+UgdZw2BFZ+lEw= +golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -787,6 +852,7 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= @@ -800,6 +866,7 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -839,6 +906,7 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= @@ -851,8 +919,10 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -896,6 +966,7 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -909,6 +980,7 @@ golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -965,10 +1037,13 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -977,7 +1052,9 @@ golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -992,6 +1069,7 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1051,6 +1129,7 @@ golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1285,18 +1364,22 @@ google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGm google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From 6b96473e3c07a93fdc5da2f10bb39ea6f5a222d7 Mon Sep 17 00:00:00 2001 From: Andreea Neata <119867733+andreeaneata@users.noreply.github.com> Date: Thu, 4 Apr 2024 13:51:27 +0300 Subject: [PATCH 34/58] fix: upgrade iac custom rules extension to address vulns [IAC-2921] (#5149) --- cliv2/go.mod | 4 ++-- cliv2/go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cliv2/go.mod b/cliv2/go.mod index 8e5b06eb70..c949bbc817 100644 --- a/cliv2/go.mod +++ b/cliv2/go.mod @@ -10,7 +10,7 @@ require ( github.com/pkg/errors v0.9.1 github.com/rs/zerolog v1.32.0 github.com/snyk/cli-extension-dep-graph v0.0.0-20230926124856-b0fdf1ee6f73 - github.com/snyk/cli-extension-iac-rules v0.0.0-20230601153200-c572cfce46ce + github.com/snyk/cli-extension-iac-rules v0.0.0-20240404084125-0098857e0e1a github.com/snyk/cli-extension-sbom v0.0.0-20240314090036-46535b380426 github.com/snyk/container-cli v0.0.0-20240322120441-6d9b9482f9b1 github.com/snyk/go-application-framework v0.0.0-20240325175807-5cb112133ceb @@ -177,7 +177,7 @@ require ( golang.org/x/crypto v0.21.0 // indirect golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 // indirect golang.org/x/mod v0.16.0 // indirect - golang.org/x/net v0.22.0 // indirect + golang.org/x/net v0.23.0 // indirect golang.org/x/oauth2 v0.18.0 // indirect golang.org/x/sync v0.6.0 // indirect golang.org/x/sys v0.18.0 // indirect diff --git a/cliv2/go.sum b/cliv2/go.sum index 77aff81500..cf98bcf8c6 100644 --- a/cliv2/go.sum +++ b/cliv2/go.sum @@ -709,8 +709,8 @@ github.com/skeema/knownhosts v1.2.2 h1:Iug2P4fLmDw9f41PB6thxUkNUkJzB5i+1/exaj40L github.com/skeema/knownhosts v1.2.2/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= github.com/snyk/cli-extension-dep-graph v0.0.0-20230926124856-b0fdf1ee6f73 h1:rwdJzpPWkWWf7csbv871GoKgRGwJ4GVNXMSsO0cRuLk= github.com/snyk/cli-extension-dep-graph v0.0.0-20230926124856-b0fdf1ee6f73/go.mod h1:QF3v8HBpOpyudYNCuR8LqfULutO76c91sBdLzD+pBJU= -github.com/snyk/cli-extension-iac-rules v0.0.0-20230601153200-c572cfce46ce h1:WchwuyPX4mEr7tFCGD6EsjwTDipFWfLxs4Wps6KB3b4= -github.com/snyk/cli-extension-iac-rules v0.0.0-20230601153200-c572cfce46ce/go.mod h1:5/IYYTgf32pST7St4GhS3KNz32WE17Ys+Hdb5Pqxex0= +github.com/snyk/cli-extension-iac-rules v0.0.0-20240404084125-0098857e0e1a h1:pvj3bsgPMmYma56TU+rjFsulqS2kV1D2kBg1mVb8Et4= +github.com/snyk/cli-extension-iac-rules v0.0.0-20240404084125-0098857e0e1a/go.mod h1:4c6XS4n6mWbJM9md3r4B2NFgjs2tyi8GzGlz1BbWIx0= github.com/snyk/cli-extension-sbom v0.0.0-20240314090036-46535b380426 h1:MXbip3nmiOym3/9bNWlPISVOAEAAz4FDcPvqOMPcCc4= github.com/snyk/cli-extension-sbom v0.0.0-20240314090036-46535b380426/go.mod h1:g2VgZU79btvZrAP3oHZGv3tHD9POVOx5a3DY894rS4w= github.com/snyk/code-client-go v1.2.0 h1:iTtODPUAINmneyfoEPt3t5Y5H84x2x325LGgnrqpzEI= @@ -923,8 +923,8 @@ golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= -golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= From 0fd8fa6063f35f208c36fdcbd04c8c4732d32af4 Mon Sep 17 00:00:00 2001 From: Jasper Van der Jeugt <100228594+jaspervdj-snyk@users.noreply.github.com> Date: Thu, 4 Apr 2024 14:20:44 +0200 Subject: [PATCH 35/58] feat: upgrade snyk-iac-test to v0.51.3 (#5127) Upgrade snyk-iac-test to v0.51.3. Changes: - Print scan URL to debug output after uploading report. - Fix panic on invalid arm input - Minor fixes in Policy-Engine --- .../v2/local-cache/policy-engine/constants/utils.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/lib/iac/test/v2/local-cache/policy-engine/constants/utils.ts b/src/lib/iac/test/v2/local-cache/policy-engine/constants/utils.ts index 13d530859c..4ae18c75a0 100644 --- a/src/lib/iac/test/v2/local-cache/policy-engine/constants/utils.ts +++ b/src/lib/iac/test/v2/local-cache/policy-engine/constants/utils.ts @@ -1,11 +1,11 @@ import * as os from 'os'; const policyEngineChecksums = ` -5152d4bc7a8f5f1a7bfdd198b6bb5b82a1d2c66555fdc657f62069a00cc993fe snyk-iac-test_0.50.4_Linux_x86_64 -59ea910aac234e7ce563078b54ef721adf795a9bc6348183028374662ab35ec9 snyk-iac-test_0.50.4_Windows_x86_64.exe -5a7136b0dc8b8ee40bf61ab101fb5689d18cf9476521a6a16ed939ad62a6d695 snyk-iac-test_0.50.4_Darwin_x86_64 -87657782a31f66897dd568303b38862d3587589bc12601adfbbdcbd688818814 snyk-iac-test_0.50.4_Linux_arm64 -a7150de35ab607163343ce287eac7cfe8b9a904843837ea643c188d0406a3e2f snyk-iac-test_0.50.4_Darwin_arm64 +44bc8c547e26f0960b95333a273fc6f7154f4919d51f2ee323c4133e29f322fc snyk-iac-test_0.51.3_Linux_arm64 +955d9416588379dff0ca128d4a26675a5e9575f6bd702fceeab58224f355d007 snyk-iac-test_0.51.3_Darwin_arm64 +9bb87bff18af15fd50a1e518f78d649373a607a0a3d09e2d88c420649fae020f snyk-iac-test_0.51.3_Windows_x86_64.exe +a2d91e709a8908a0df56fd0d05a029ecc75cbcfef6b2c5b80a621472a552952c snyk-iac-test_0.51.3_Linux_x86_64 +de5676c97e9f9080b2ebcc87bce2bcc9dc17961eadb81816489ea7130ab73ebc snyk-iac-test_0.51.3_Darwin_x86_64 `; export const policyEngineVersion = getPolicyEngineVersion(); From 08647f295dd92ceb206a4f1b99e3b1905eab016e Mon Sep 17 00:00:00 2001 From: Luke Watts Date: Mon, 8 Apr 2024 10:38:41 +0200 Subject: [PATCH 36/58] fix: add --experimental flag for snyk code test (#5151) --- cliv2/go.mod | 2 +- cliv2/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cliv2/go.mod b/cliv2/go.mod index c949bbc817..0814d81038 100644 --- a/cliv2/go.mod +++ b/cliv2/go.mod @@ -13,7 +13,7 @@ require ( github.com/snyk/cli-extension-iac-rules v0.0.0-20240404084125-0098857e0e1a github.com/snyk/cli-extension-sbom v0.0.0-20240314090036-46535b380426 github.com/snyk/container-cli v0.0.0-20240322120441-6d9b9482f9b1 - github.com/snyk/go-application-framework v0.0.0-20240325175807-5cb112133ceb + github.com/snyk/go-application-framework v0.0.0-20240404113733-1ee20e5f3ae4 github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65 github.com/snyk/snyk-iac-capture v0.6.5 github.com/snyk/snyk-ls v0.0.0-20240402143951-9d7d19ca1a78 diff --git a/cliv2/go.sum b/cliv2/go.sum index cf98bcf8c6..0c80943923 100644 --- a/cliv2/go.sum +++ b/cliv2/go.sum @@ -717,8 +717,8 @@ github.com/snyk/code-client-go v1.2.0 h1:iTtODPUAINmneyfoEPt3t5Y5H84x2x325LGgnrq github.com/snyk/code-client-go v1.2.0/go.mod h1:zULRDwUaDANSvDfHIU0Eux4tTbSj7w0xWmbvQikhM9E= github.com/snyk/container-cli v0.0.0-20240322120441-6d9b9482f9b1 h1:9RKY9NdX5DrJAoVXDP0JiqrXT+4Nb9NH8pjEcA0NsLA= github.com/snyk/container-cli v0.0.0-20240322120441-6d9b9482f9b1/go.mod h1:38w+dcAQp9eG3P5t2eNS9eG0reut10AeJjLv5lJ5lpM= -github.com/snyk/go-application-framework v0.0.0-20240325175807-5cb112133ceb h1:ovhyFAt2BDPNmzJ1M2KuGz0s2GSfiY9VoMF4/EvMG00= -github.com/snyk/go-application-framework v0.0.0-20240325175807-5cb112133ceb/go.mod h1:Yz/qxFyfhf0xbA+z8Vzr5IM9IDG+BS+2PiGaP1yAsEw= +github.com/snyk/go-application-framework v0.0.0-20240404113733-1ee20e5f3ae4 h1:bwk32eWWmTUr2i3Wumab+VLUy5DICIQDNbyd2BfGU70= +github.com/snyk/go-application-framework v0.0.0-20240404113733-1ee20e5f3ae4/go.mod h1:Yz/qxFyfhf0xbA+z8Vzr5IM9IDG+BS+2PiGaP1yAsEw= github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65 h1:CEQuYv0Go6MEyRCD3YjLYM2u3Oxkx8GpCpFBd4rUTUk= github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65/go.mod h1:88KbbvGYlmLgee4OcQ19yr0bNpXpOr2kciOthaSzCAg= github.com/snyk/policy-engine v0.22.0 h1:od9pduGrXyfWO791X+8M1qmnvWUxaIXh0gBzGKqeseA= From 1e5194853a3183629a9fad9679fc83e7b8d4d4cb Mon Sep 17 00:00:00 2001 From: Bastian Doetsch Date: Tue, 9 Apr 2024 09:21:17 +0200 Subject: [PATCH 37/58] fix: make download of CLI in language server more resilient under windows [IDE-90] (#5155) --- cliv2/go.mod | 27 +++++++++++++------------- cliv2/go.sum | 55 +++++++++++++++++++++++++--------------------------- 2 files changed, 39 insertions(+), 43 deletions(-) diff --git a/cliv2/go.mod b/cliv2/go.mod index 0814d81038..aaf30073c2 100644 --- a/cliv2/go.mod +++ b/cliv2/go.mod @@ -16,7 +16,7 @@ require ( github.com/snyk/go-application-framework v0.0.0-20240404113733-1ee20e5f3ae4 github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65 github.com/snyk/snyk-iac-capture v0.6.5 - github.com/snyk/snyk-ls v0.0.0-20240402143951-9d7d19ca1a78 + github.com/snyk/snyk-ls v0.0.0-20240408072540-75df46322994 github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.9.0 @@ -54,7 +54,7 @@ require ( github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf // indirect github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f // indirect github.com/creachadair/jrpc2 v1.2.0 // indirect - github.com/creachadair/mds v0.14.0 // indirect + github.com/creachadair/mds v0.14.3 // indirect github.com/cyphar/filepath-securejoin v0.2.4 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/deepmap/oapi-codegen v1.16.2 // indirect @@ -66,7 +66,7 @@ require ( github.com/fatih/color v1.16.0 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/gertd/go-pluralize v0.2.1 // indirect - github.com/getkin/kin-openapi v0.123.0 // indirect + github.com/getkin/kin-openapi v0.124.0 // indirect github.com/getsentry/sentry-go v0.27.0 // indirect github.com/ghodss/yaml v1.0.0 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect @@ -150,7 +150,7 @@ require ( github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/skeema/knownhosts v1.2.2 // indirect - github.com/snyk/code-client-go v1.2.0 // indirect + github.com/snyk/code-client-go v1.3.0 // indirect github.com/snyk/policy-engine v0.22.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/sourcegraph/go-lsp v0.0.0-20240223163137-f80c5dd31dfd // indirect @@ -174,20 +174,19 @@ require ( go.lsp.dev/uri v0.3.0 // indirect go.opencensus.io v0.24.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.21.0 // indirect - golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 // indirect - golang.org/x/mod v0.16.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/oauth2 v0.18.0 // indirect - golang.org/x/sync v0.6.0 // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/term v0.18.0 // indirect + golang.org/x/crypto v0.22.0 // indirect + golang.org/x/exp v0.0.0-20240404231335-c0f41cb1a7a0 // indirect + golang.org/x/mod v0.17.0 // indirect + golang.org/x/net v0.24.0 // indirect + golang.org/x/oauth2 v0.19.0 // indirect + golang.org/x/sync v0.7.0 // indirect + golang.org/x/sys v0.19.0 // indirect + golang.org/x/term v0.19.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.5.0 // indirect - golang.org/x/tools v0.19.0 // indirect + golang.org/x/tools v0.20.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/api v0.153.0 // indirect - google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f // indirect diff --git a/cliv2/go.sum b/cliv2/go.sum index 0c80943923..dff3be73b0 100644 --- a/cliv2/go.sum +++ b/cliv2/go.sum @@ -284,8 +284,8 @@ github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfc github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creachadair/jrpc2 v1.2.0 h1:SXr0OgnwM0X18P+HccJP0uT3KGSDk/BCSRlJBvE2bMY= github.com/creachadair/jrpc2 v1.2.0/go.mod h1:66uKSdr6tR5ZeNvkIjDSbbVUtOv0UhjS/vcd8ECP7Iw= -github.com/creachadair/mds v0.14.0 h1:gRrZNaykFmn0z2FCzmfb+imCyEbEiRFTq7jopzn9RlM= -github.com/creachadair/mds v0.14.0/go.mod h1:4vrFYUzTXMJpMBU+OA292I6IUxKWCCfZkgXg+/kBZMo= +github.com/creachadair/mds v0.14.3 h1:yb5rf+OJJcKptGyBU/1oSRs/ybJmKKB4HTNWF8g4emc= +github.com/creachadair/mds v0.14.3/go.mod h1:4vrFYUzTXMJpMBU+OA292I6IUxKWCCfZkgXg+/kBZMo= github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -341,8 +341,8 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/gertd/go-pluralize v0.2.1 h1:M3uASbVjMnTsPb0PNqg+E/24Vwigyo/tvyMTtAlLgiA= github.com/gertd/go-pluralize v0.2.1/go.mod h1:rbYaKDbsXxmRfr8uygAEKhOWsjyrrqrkHVpZvoOp8zk= -github.com/getkin/kin-openapi v0.123.0 h1:zIik0mRwFNLyvtXK274Q6ut+dPh6nlxBp0x7mNrPhs8= -github.com/getkin/kin-openapi v0.123.0/go.mod h1:wb1aSZA/iWmorQP9KTAS/phLj/t17B5jT7+fS8ed9NM= +github.com/getkin/kin-openapi v0.124.0 h1:VSFNMB9C9rTKBnQ/fpyDU8ytMTr4dWI9QovSKj9kz/M= +github.com/getkin/kin-openapi v0.124.0/go.mod h1:wb1aSZA/iWmorQP9KTAS/phLj/t17B5jT7+fS8ed9NM= github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= @@ -713,8 +713,8 @@ github.com/snyk/cli-extension-iac-rules v0.0.0-20240404084125-0098857e0e1a h1:pv github.com/snyk/cli-extension-iac-rules v0.0.0-20240404084125-0098857e0e1a/go.mod h1:4c6XS4n6mWbJM9md3r4B2NFgjs2tyi8GzGlz1BbWIx0= github.com/snyk/cli-extension-sbom v0.0.0-20240314090036-46535b380426 h1:MXbip3nmiOym3/9bNWlPISVOAEAAz4FDcPvqOMPcCc4= github.com/snyk/cli-extension-sbom v0.0.0-20240314090036-46535b380426/go.mod h1:g2VgZU79btvZrAP3oHZGv3tHD9POVOx5a3DY894rS4w= -github.com/snyk/code-client-go v1.2.0 h1:iTtODPUAINmneyfoEPt3t5Y5H84x2x325LGgnrqpzEI= -github.com/snyk/code-client-go v1.2.0/go.mod h1:zULRDwUaDANSvDfHIU0Eux4tTbSj7w0xWmbvQikhM9E= +github.com/snyk/code-client-go v1.3.0 h1:RlE92b29DCyinnwmFIfsp/7ZQ1RZ9+yw4lSxchkwlyY= +github.com/snyk/code-client-go v1.3.0/go.mod h1:zULRDwUaDANSvDfHIU0Eux4tTbSj7w0xWmbvQikhM9E= github.com/snyk/container-cli v0.0.0-20240322120441-6d9b9482f9b1 h1:9RKY9NdX5DrJAoVXDP0JiqrXT+4Nb9NH8pjEcA0NsLA= github.com/snyk/container-cli v0.0.0-20240322120441-6d9b9482f9b1/go.mod h1:38w+dcAQp9eG3P5t2eNS9eG0reut10AeJjLv5lJ5lpM= github.com/snyk/go-application-framework v0.0.0-20240404113733-1ee20e5f3ae4 h1:bwk32eWWmTUr2i3Wumab+VLUy5DICIQDNbyd2BfGU70= @@ -725,8 +725,8 @@ github.com/snyk/policy-engine v0.22.0 h1:od9pduGrXyfWO791X+8M1qmnvWUxaIXh0gBzGKq github.com/snyk/policy-engine v0.22.0/go.mod h1:Vvy/9VMXoABS3JlLqhTlAPWkB5LgbLh7LGn3gBwAqdY= github.com/snyk/snyk-iac-capture v0.6.5 h1:992DXCAJSN97KtUh8T5ndaWwd/6ZCal2bDkRXqM1u/E= github.com/snyk/snyk-iac-capture v0.6.5/go.mod h1:e47i55EmM0F69ZxyFHC4sCi7vyaJW6DLoaamJJCzWGk= -github.com/snyk/snyk-ls v0.0.0-20240402143951-9d7d19ca1a78 h1:7xE+EoQ8wp6bpsB/ULm+lz21ka2OxTU8uWsKFXhpgZc= -github.com/snyk/snyk-ls v0.0.0-20240402143951-9d7d19ca1a78/go.mod h1:Fvc7SyLVLFLCG+GX/Lc3yyweXFonEM+IZtLx40gmBlQ= +github.com/snyk/snyk-ls v0.0.0-20240408072540-75df46322994 h1:XK3dxElJvE/xtI51dcAZ1XJePLe9vzj8/PzJ1MCuvZI= +github.com/snyk/snyk-ls v0.0.0-20240408072540-75df46322994/go.mod h1:jSKV+XpanDzYZ3bLHNuT4v3+b39WEy6kCh4dkkSyykc= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/sourcegraph/go-lsp v0.0.0-20240223163137-f80c5dd31dfd h1:Dq5WSzWsP1TbVi10zPWBI5LKEBDg4Y1OhWEph1wr5WQ= @@ -825,8 +825,8 @@ golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= +golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -837,8 +837,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 h1:aAcj0Da7eBAtrTp03QXWvm88pSyOt+UgdZw2BFZ+lEw= -golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ= +golang.org/x/exp v0.0.0-20240404231335-c0f41cb1a7a0 h1:985EYyeCOxTpcgOTJpflJUwOeEz0CQOdPt73OzpE9F8= +golang.org/x/exp v0.0.0-20240404231335-c0f41cb1a7a0/go.mod h1:/lliqkxwWAhPjf5oSOIJup2XcqJaw8RGS6k3TGEc7GI= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -867,8 +867,8 @@ golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= -golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180811021610-c39426892332/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -923,8 +923,8 @@ golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= +golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -950,8 +950,8 @@ golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= -golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= -golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= +golang.org/x/oauth2 v0.19.0 h1:9+E/EZBCbTLNrbN35fHv/a/d/mOBatymz1zbtQrXpIg= +golang.org/x/oauth2 v0.19.0/go.mod h1:vYi7skDa1x015PmRRYZ7+s1cWyPgrPiSYRe4rnsexc8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -967,8 +967,8 @@ golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= -golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1047,16 +1047,16 @@ golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= +golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= -golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= +golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1066,7 +1066,6 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= @@ -1130,8 +1129,8 @@ golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= -golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= +golang.org/x/tools v0.20.0 h1:hz/CVckiOxybQvFw6h7b/q80NTr9IUQb4s1IIzW7KNY= +golang.org/x/tools v0.20.0/go.mod h1:WvitBU7JJf6A4jOdg4S1tviW9bhUxkgeCui/0JHctQg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1198,8 +1197,6 @@ google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= From fc41937f14f647e43e2b21b93ce3cc261a3de468 Mon Sep 17 00:00:00 2001 From: Bastian Doetsch Date: Tue, 9 Apr 2024 11:51:46 +0200 Subject: [PATCH 38/58] feat: bump language server protocol version to 11 [IDE-236] (#5156) This safe-guards and enforces that global ignores functionality has the necessary commands available. --- cliv2/go.mod | 2 +- cliv2/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cliv2/go.mod b/cliv2/go.mod index aaf30073c2..fced16e8dd 100644 --- a/cliv2/go.mod +++ b/cliv2/go.mod @@ -16,7 +16,7 @@ require ( github.com/snyk/go-application-framework v0.0.0-20240404113733-1ee20e5f3ae4 github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65 github.com/snyk/snyk-iac-capture v0.6.5 - github.com/snyk/snyk-ls v0.0.0-20240408072540-75df46322994 + github.com/snyk/snyk-ls v0.0.0-20240409081112-f3ca3f397a7b github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.9.0 diff --git a/cliv2/go.sum b/cliv2/go.sum index dff3be73b0..3b32793251 100644 --- a/cliv2/go.sum +++ b/cliv2/go.sum @@ -725,8 +725,8 @@ github.com/snyk/policy-engine v0.22.0 h1:od9pduGrXyfWO791X+8M1qmnvWUxaIXh0gBzGKq github.com/snyk/policy-engine v0.22.0/go.mod h1:Vvy/9VMXoABS3JlLqhTlAPWkB5LgbLh7LGn3gBwAqdY= github.com/snyk/snyk-iac-capture v0.6.5 h1:992DXCAJSN97KtUh8T5ndaWwd/6ZCal2bDkRXqM1u/E= github.com/snyk/snyk-iac-capture v0.6.5/go.mod h1:e47i55EmM0F69ZxyFHC4sCi7vyaJW6DLoaamJJCzWGk= -github.com/snyk/snyk-ls v0.0.0-20240408072540-75df46322994 h1:XK3dxElJvE/xtI51dcAZ1XJePLe9vzj8/PzJ1MCuvZI= -github.com/snyk/snyk-ls v0.0.0-20240408072540-75df46322994/go.mod h1:jSKV+XpanDzYZ3bLHNuT4v3+b39WEy6kCh4dkkSyykc= +github.com/snyk/snyk-ls v0.0.0-20240409081112-f3ca3f397a7b h1:zVft430r9wUecY2IlGH/mQcRpHwWg0mgtEd8NweRds8= +github.com/snyk/snyk-ls v0.0.0-20240409081112-f3ca3f397a7b/go.mod h1:jSKV+XpanDzYZ3bLHNuT4v3+b39WEy6kCh4dkkSyykc= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/sourcegraph/go-lsp v0.0.0-20240223163137-f80c5dd31dfd h1:Dq5WSzWsP1TbVi10zPWBI5LKEBDg4Y1OhWEph1wr5WQ= From 43c9acfdfae7b1465f1c7158b0e1d95854c68d85 Mon Sep 17 00:00:00 2001 From: PeterSchafer <101886095+PeterSchafer@users.noreply.github.com> Date: Fri, 12 Apr 2024 15:31:57 +0200 Subject: [PATCH 39/58] docs: mention how to test against a binary (#5158) --- CONTRIBUTING.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 81e3f44958..a0e09c52b3 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -55,6 +55,12 @@ You can run tests using standard Jest commands. See: [Jest CLI docs](https://jes npx jest --runInBand ``` +For closed box tests (like User Journey tests, acceptance tests, ...) you will have to specify the binary under test by setting the environment variable **TEST_SNYK_COMMAND**. + +``` +TEST_SNYK_COMMAND=./binary-releases/snyk-macos npx jest --runInBand +``` + If you are working on a specific project, you can filter by project. ``` From b55fbc89dae9506c0deffeb4a365928ec84bddda Mon Sep 17 00:00:00 2001 From: Luke Watts Date: Mon, 15 Apr 2024 14:25:46 +0200 Subject: [PATCH 40/58] chore: ignore go sum (#5160) --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 07ff951e16..bc217c5e4f 100644 --- a/.gitignore +++ b/.gitignore @@ -49,3 +49,4 @@ coverage test/fixtures/basic-swift/.build test/fixtures/basic-swift/Package.resolved scripts/Brewfile.lock.json +test/fixtures/**/go.sum \ No newline at end of file From 5fc3d591fefbcf0c5e7615bf4d9899a3a17c7990 Mon Sep 17 00:00:00 2001 From: Andreea Neata <119867733+andreeaneata@users.noreply.github.com> Date: Mon, 15 Apr 2024 16:29:07 +0300 Subject: [PATCH 41/58] fix(iac): Fix Issue Path in human readable and json output [IAC-2935] (#5159) --- .../formatters/iac-output/text/formatters.ts | 8 +---- src/lib/iac/test/v2/json.ts | 2 +- .../fixtures/integrated-json-output.json | 28 ++++++++++------- ...st-text-output-data-with-suppressions.json | 30 +++++++++---------- .../snyk-iac-test-text-output-data.json | 30 +++++++++---------- 5 files changed, 48 insertions(+), 50 deletions(-) diff --git a/src/lib/formatters/iac-output/text/formatters.ts b/src/lib/formatters/iac-output/text/formatters.ts index 09f351a5a7..40a1db67be 100644 --- a/src/lib/formatters/iac-output/text/formatters.ts +++ b/src/lib/formatters/iac-output/text/formatters.ts @@ -214,11 +214,5 @@ function extractResolve(vulnerability: Vulnerability): string { } function formatCloudConfigPath(vulnerability: Vulnerability): string[] { - const cloudConfigPath = vulnerability.resource.id.split('.'); - - if (vulnerability.resource.path) { - cloudConfigPath.push(...vulnerability.resource.path); - } - - return cloudConfigPath; + return vulnerability.resource.formattedPath.split('.'); } diff --git a/src/lib/iac/test/v2/json.ts b/src/lib/iac/test/v2/json.ts index 4bf063ba65..71bc746b94 100644 --- a/src/lib/iac/test/v2/json.ts +++ b/src/lib/iac/test/v2/json.ts @@ -264,7 +264,7 @@ function vulnerabilitiesToIacIssues( lineNumber: v.resource.line || -1, documentation: v.rule.documentation, // only works for rules available on snyk.io isGeneratedByCustomRule: !!v.rule.isGeneratedByCustomRule, - path: v.resource.path || [], // needs to be fixed, currently doesn't show the full path + path: v?.resource?.formattedPath.split('.') || [], compliance: [], description: v.rule.description, }; diff --git a/test/jest/unit/iac/process-results/fixtures/integrated-json-output.json b/test/jest/unit/iac/process-results/fixtures/integrated-json-output.json index 2f14229bfc..17c0e521cd 100644 --- a/test/jest/unit/iac/process-results/fixtures/integrated-json-output.json +++ b/test/jest/unit/iac/process-results/fixtures/integrated-json-output.json @@ -63,7 +63,10 @@ "lineNumber": -1, "documentation": "https://security.snyk.io/rules/cloud/SNYK-CC-00151", "isGeneratedByCustomRule": false, - "path": [], + "path": [ + "resource", + "aws_vpc[mainvpc]" + ], "compliance": [], "description": "VPC flow logging should be enabled. AWS VPC Flow Logs provide visibility into network traffic that traverses the AWS VPC.\nUsers can use the flow logs to detect anomalous traffic or insight during security workflows.\n" }, @@ -94,10 +97,11 @@ "documentation": "https://security.snyk.io/rules/cloud/SNYK-CC-TF-5", "isGeneratedByCustomRule": false, "path": [ - "ingress", - 0, - "cidr_blocks", - 0 + "input", + "resource", + "aws_default_security_group[default]", + "ingress[0]", + "cidr_blocks[0]" ], "compliance": [], "description": "Configuring all VPC default security groups to restrict all traffic encourages least privilege security\ngroup development and mindful placement of AWS resources into security groups which in turn reduces the exposure of those resources.\n" @@ -162,7 +166,10 @@ "lineNumber": 5, "documentation": "https://security.snyk.io/rules/cloud/SNYK-CC-00151", "isGeneratedByCustomRule": false, - "path": [], + "path": [ + "resource", + "aws_vpc[mainvpc]" + ], "compliance": [], "description": "VPC flow logging should be enabled. AWS VPC Flow Logs provide visibility into network traffic that traverses the AWS VPC.\nUsers can use the flow logs to detect anomalous traffic or insight during security workflows.\n" }, @@ -193,10 +200,11 @@ "documentation": "https://security.snyk.io/rules/cloud/SNYK-CC-TF-5", "isGeneratedByCustomRule": false, "path": [ - "ingress", - 0, - "cidr_blocks", - 0 + "input", + "resource", + "aws_default_security_group[default]", + "ingress[0]", + "cidr_blocks[0]" ], "compliance": [], "description": "Configuring all VPC default security groups to restrict all traffic encourages least privilege security\ngroup development and mindful placement of AWS resources into security groups which in turn reduces the exposure of those resources.\n" diff --git a/test/jest/unit/iac/process-results/fixtures/snyk-iac-test-text-output-data-with-suppressions.json b/test/jest/unit/iac/process-results/fixtures/snyk-iac-test-text-output-data-with-suppressions.json index c1a1f8e776..12646d3a11 100644 --- a/test/jest/unit/iac/process-results/fixtures/snyk-iac-test-text-output-data-with-suppressions.json +++ b/test/jest/unit/iac/process-results/fixtures/snyk-iac-test-text-output-data-with-suppressions.json @@ -8,8 +8,8 @@ "title": "VPC flow logging should be enabled", "lineNumber": -1, "cloudConfigPath": [ - "aws_vpc", - "mainvpc" + "resource", + "aws_vpc[mainvpc]" ], "issue": "VPC flow logging should be enabled", "impact": "VPC flow logging should be enabled. AWS VPC Flow Logs provide visibility into network traffic that traverses the AWS VPC.\nUsers can use the flow logs to detect anomalous traffic or insight during security workflows.\n", @@ -29,12 +29,11 @@ "title": "VPC default security group allows unrestricted ingress traffic", "lineNumber": -1, "cloudConfigPath": [ - "aws_default_security_group", - "default", - "ingress", - 0, - "cidr_blocks", - 0 + "input", + "resource", + "aws_default_security_group[default]", + "ingress[0]", + "cidr_blocks[0]" ], "issue": "VPC default security group allows unrestricted ingress traffic", "impact": "Configuring all VPC default security groups to restrict all traffic encourages least privilege security\ngroup development and mindful placement of AWS resources into security groups which in turn reduces the exposure of those resources.\n", @@ -54,8 +53,8 @@ "title": "VPC flow logging should be enabled", "lineNumber": 5, "cloudConfigPath": [ - "aws_vpc", - "mainvpc" + "resource", + "aws_vpc[mainvpc]" ], "issue": "VPC flow logging should be enabled", "impact": "VPC flow logging should be enabled. AWS VPC Flow Logs provide visibility into network traffic that traverses the AWS VPC.\nUsers can use the flow logs to detect anomalous traffic or insight during security workflows.\n", @@ -75,12 +74,11 @@ "title": "VPC default security group allows unrestricted ingress traffic", "lineNumber": 16, "cloudConfigPath": [ - "aws_default_security_group", - "default", - "ingress", - 0, - "cidr_blocks", - 0 + "input", + "resource", + "aws_default_security_group[default]", + "ingress[0]", + "cidr_blocks[0]" ], "issue": "VPC default security group allows unrestricted ingress traffic", "impact": "Configuring all VPC default security groups to restrict all traffic encourages least privilege security\ngroup development and mindful placement of AWS resources into security groups which in turn reduces the exposure of those resources.\n", diff --git a/test/jest/unit/iac/process-results/fixtures/snyk-iac-test-text-output-data.json b/test/jest/unit/iac/process-results/fixtures/snyk-iac-test-text-output-data.json index 1276c81182..c483d14d74 100644 --- a/test/jest/unit/iac/process-results/fixtures/snyk-iac-test-text-output-data.json +++ b/test/jest/unit/iac/process-results/fixtures/snyk-iac-test-text-output-data.json @@ -8,8 +8,8 @@ "title": "VPC flow logging should be enabled", "lineNumber": -1, "cloudConfigPath": [ - "aws_vpc", - "mainvpc" + "resource", + "aws_vpc[mainvpc]" ], "issue": "VPC flow logging should be enabled", "impact": "VPC flow logging should be enabled. AWS VPC Flow Logs provide visibility into network traffic that traverses the AWS VPC.\nUsers can use the flow logs to detect anomalous traffic or insight during security workflows.\n", @@ -29,12 +29,11 @@ "title": "VPC default security group allows unrestricted ingress traffic", "lineNumber": -1, "cloudConfigPath": [ - "aws_default_security_group", - "default", - "ingress", - 0, - "cidr_blocks", - 0 + "input", + "resource", + "aws_default_security_group[default]", + "ingress[0]", + "cidr_blocks[0]" ], "issue": "VPC default security group allows unrestricted ingress traffic", "impact": "Configuring all VPC default security groups to restrict all traffic encourages least privilege security\ngroup development and mindful placement of AWS resources into security groups which in turn reduces the exposure of those resources.\n", @@ -54,8 +53,8 @@ "title": "VPC flow logging should be enabled", "lineNumber": 5, "cloudConfigPath": [ - "aws_vpc", - "mainvpc" + "resource", + "aws_vpc[mainvpc]" ], "issue": "VPC flow logging should be enabled", "impact": "VPC flow logging should be enabled. AWS VPC Flow Logs provide visibility into network traffic that traverses the AWS VPC.\nUsers can use the flow logs to detect anomalous traffic or insight during security workflows.\n", @@ -75,12 +74,11 @@ "title": "VPC default security group allows unrestricted ingress traffic", "lineNumber": 16, "cloudConfigPath": [ - "aws_default_security_group", - "default", - "ingress", - 0, - "cidr_blocks", - 0 + "input", + "resource", + "aws_default_security_group[default]", + "ingress[0]", + "cidr_blocks[0]" ], "issue": "VPC default security group allows unrestricted ingress traffic", "impact": "Configuring all VPC default security groups to restrict all traffic encourages least privilege security\ngroup development and mindful placement of AWS resources into security groups which in turn reduces the exposure of those resources.\n", From efb048882c23aa72212c80ca0e81880c991b9501 Mon Sep 17 00:00:00 2001 From: Luke Watts Date: Mon, 15 Apr 2024 16:47:56 +0200 Subject: [PATCH 42/58] test: install pip deps during setup (#5162) --- test/jest/acceptance/snyk-sbom/pip-options.spec.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/jest/acceptance/snyk-sbom/pip-options.spec.ts b/test/jest/acceptance/snyk-sbom/pip-options.spec.ts index 8c83a15102..f7dca9527f 100644 --- a/test/jest/acceptance/snyk-sbom/pip-options.spec.ts +++ b/test/jest/acceptance/snyk-sbom/pip-options.spec.ts @@ -1,4 +1,5 @@ import * as os from 'os'; +import { execSync } from 'child_process'; import { createProjectFromWorkspace } from '../../util/createProject'; import { runSnykCLI } from '../../util/runSnykCLI'; @@ -43,6 +44,7 @@ describe('snyk sbom --command (mocked server only)', () => { const project = await createProjectFromWorkspace('pip-app'); const command = os.platform().indexOf('win') === 0 ? 'python3.11.exe' : 'python3'; + execSync(`pip install -r requirements.txt`, { cwd: project.path() }); const { code, stdout } = await runSnykCLI( `sbom --org aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee --format cyclonedx1.4+json --debug --command=${command}`, @@ -63,6 +65,7 @@ describe('snyk sbom --command (mocked server only)', () => { test('`sbom pip-app-custom` generates an SBOM with pip for custom manifest names', async () => { const project = await createProjectFromWorkspace('pip-app-custom'); + execSync(`pip install -r base.txt`, { cwd: project.path() }); const { code, stdout } = await runSnykCLI( `sbom --org aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee --format cyclonedx1.4+json --debug --package-manager=pip --file=base.txt`, From 51c717b20c7eb8de1d2bca48c4d78ed530890b7c Mon Sep 17 00:00:00 2001 From: Luke Watts Date: Mon, 15 Apr 2024 21:00:52 +0200 Subject: [PATCH 43/58] feat: use workflow data to determine exit code errors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: parse workflow data to determine errors * fix: switch to align with finalised schema * chore(deps): bump gaf to latest * test: refactor to support integration test * fix: introduce custom error for storing exit code * chore: adjust wording on json error * test: update to match new error * chore: remove file * chore(deps): update go-application-framework to latest * chore: reorder imports * chore: remove unused code * refactor: switch to structured test data * chore: fix formatting * chore: rename to include global prefix * fix: switch to content_type ref * chore: remove unused file * refactor: switch to exported type * refactor: introduce tests for displayError We want to ensure that nothing is displayed for the new Error being generated from TestSummary payload * test: switch to NewInMemory configuration * fix: display error logic to handle ExitCode errors * fix: broken import * test: remove defunct test --------- Co-authored-by: Peter Schäfer <101886095+PeterSchafer@users.noreply.github.com> --- cliv2/cmd/cliv2/main.go | 118 +++++++++++----- cliv2/cmd/cliv2/main_test.go | 189 ++++++++++++++++++++++++-- cliv2/go.mod | 2 +- cliv2/go.sum | 4 +- cliv2/internal/cliv2/cliv2.go | 4 + cliv2/internal/cliv2/cliv2_test.go | 22 +++ cliv2/internal/constants/constants.go | 1 + cliv2/internal/errors/errors.go | 11 ++ 8 files changed, 301 insertions(+), 50 deletions(-) create mode 100644 cliv2/internal/errors/errors.go diff --git a/cliv2/cmd/cliv2/main.go b/cliv2/cmd/cliv2/main.go index 4db6869126..cc1017c779 100644 --- a/cliv2/cmd/cliv2/main.go +++ b/cliv2/cmd/cliv2/main.go @@ -27,6 +27,8 @@ import ( "github.com/snyk/go-application-framework/pkg/auth" "github.com/snyk/go-application-framework/pkg/configuration" localworkflows "github.com/snyk/go-application-framework/pkg/local_workflows" + "github.com/snyk/go-application-framework/pkg/local_workflows/content_type" + "github.com/snyk/go-application-framework/pkg/local_workflows/json_schemas" "github.com/snyk/go-application-framework/pkg/networking" "github.com/snyk/go-application-framework/pkg/runtimeinfo" "github.com/snyk/go-application-framework/pkg/utils" @@ -37,11 +39,12 @@ import ( "github.com/snyk/cli/cliv2/internal/cliv2" "github.com/snyk/cli/cliv2/internal/constants" + cli_errors "github.com/snyk/cli/cliv2/internal/errors" "github.com/snyk/cli/cliv2/pkg/basic_workflows" ) var internalOS string -var engine workflow.Engine +var globalEngine workflow.Engine var globalConfiguration configuration.Configuration var helpProvided bool @@ -154,18 +157,59 @@ func runMainWorkflow(config configuration.Configuration, cmd *cobra.Command, arg name := getFullCommandString(cmd) globalLogger.Print("Running ", name) - engine.GetAnalytics().SetCommand(name) + globalEngine.GetAnalytics().SetCommand(name) + err = runWorkflowAndProcessData(globalEngine, globalLogger, name) + + return err +} + +func runWorkflowAndProcessData(engine workflow.Engine, logger *zerolog.Logger, name string) error { data, err := engine.Invoke(workflow.NewWorkflowIdentifier(name)) + if err == nil { _, err = engine.InvokeWithInput(localworkflows.WORKFLOWID_OUTPUT_WORKFLOW, data) + if err == nil { + err = getErrorFromWorkFlowData(data) + } } else { - globalLogger.Print("Failed to execute the command!", err) + logger.Print("Failed to execute the command!", err) } - return err } +func getErrorFromWorkFlowData(data []workflow.Data) error { + for i := range data { + mimeType := data[i].GetContentType() + if strings.EqualFold(mimeType, content_type.TEST_SUMMARY) { + singleData, ok := data[i].GetPayload().([]byte) + if !ok { + return fmt.Errorf("invalid payload type: %T", data[i].GetPayload()) + } + + summary := json_schemas.TestSummary{} + + err := json.Unmarshal(singleData, &summary) + if err != nil { + return fmt.Errorf("failed to parse test summary payload: %w", err) + } + + // We are missing an understanding of ignored issues here + // this should be supported in the future + for _, result := range summary.Results { + if result.Open > 0 { + return cli_errors.ErrorWithExitCode{ + ExitCode: constants.SNYK_EXIT_CODE_VULNERABILITIES_FOUND, + } + } + } + + return nil + } + } + return nil +} + func sendAnalytics(analytics analytics.Analytics, debugLogger *zerolog.Logger) { debugLogger.Print("Sending Analytics") @@ -202,7 +246,7 @@ func defaultCmd(args []string) error { // * by specifying the raw cmd args for it globalConfiguration.Set(configuration.WORKFLOW_USE_STDIO, true) globalConfiguration.Set(configuration.RAW_CMD_ARGS, args) - _, err := engine.Invoke(basic_workflows.WORKFLOWID_LEGACY_CLI) + _, err := globalEngine.Invoke(basic_workflows.WORKFLOWID_LEGACY_CLI) return err } @@ -324,25 +368,29 @@ func handleError(err error) HandleError { return resultError } -func displayError(err error) { +func displayError(err error, output io.Writer, config configuration.Configuration) { if err != nil { var exitError *exec.ExitError - if !errors.As(err, &exitError) { - if globalConfiguration.GetBool(localworkflows.OUTPUT_CONFIG_KEY_JSON) { - jsonError := JsonErrorStruct{ - Ok: false, - ErrorMsg: err.Error(), - Path: globalConfiguration.GetString(configuration.INPUT_DIRECTORY), - } + isExitError := errors.As(err, &exitError) + isErrorWithCode := errors.As(err, &cli_errors.ErrorWithExitCode{}) + if isExitError || isErrorWithCode { + return + } - jsonErrorBuffer, _ := json.MarshalIndent(jsonError, "", " ") - fmt.Println(string(jsonErrorBuffer)) + if config.GetBool(localworkflows.OUTPUT_CONFIG_KEY_JSON) { + jsonError := JsonErrorStruct{ + Ok: false, + ErrorMsg: err.Error(), + Path: globalConfiguration.GetString(configuration.INPUT_DIRECTORY), + } + + jsonErrorBuffer, _ := json.MarshalIndent(jsonError, "", " ") + fmt.Fprintln(output, string(jsonErrorBuffer)) + } else { + if errors.Is(err, context.DeadlineExceeded) { + fmt.Fprintln(output, "command timed out") } else { - if errors.Is(err, context.DeadlineExceeded) { - fmt.Println("command timed out") - } else { - fmt.Println(err) - } + fmt.Fprintln(output, err) } } } @@ -368,39 +416,39 @@ func MainWithErrorCode() int { debugEnabled := globalConfiguration.GetBool(configuration.DEBUG) globalLogger = initDebugLogger(globalConfiguration) - engine = app.CreateAppEngineWithOptions(app.WithZeroLogger(globalLogger), app.WithConfiguration(globalConfiguration), app.WithRuntimeInfo(rInfo)) + globalEngine = app.CreateAppEngineWithOptions(app.WithZeroLogger(globalLogger), app.WithConfiguration(globalConfiguration), app.WithRuntimeInfo(rInfo)) if noProxyAuth := globalConfiguration.GetBool(basic_workflows.PROXY_NOAUTH); noProxyAuth { globalConfiguration.Set(configuration.PROXY_AUTHENTICATION_MECHANISM, httpauth.StringFromAuthenticationMechanism(httpauth.NoAuth)) } // initialize the extensions -> they register themselves at the engine - engine.AddExtensionInitializer(basic_workflows.Init) - engine.AddExtensionInitializer(sbom.Init) - engine.AddExtensionInitializer(depgraph.Init) - engine.AddExtensionInitializer(capture.Init) - engine.AddExtensionInitializer(iacrules.Init) - engine.AddExtensionInitializer(snykls.Init) - engine.AddExtensionInitializer(container.Init) - engine.AddExtensionInitializer(localworkflows.InitCodeWorkflow) + globalEngine.AddExtensionInitializer(basic_workflows.Init) + globalEngine.AddExtensionInitializer(sbom.Init) + globalEngine.AddExtensionInitializer(depgraph.Init) + globalEngine.AddExtensionInitializer(capture.Init) + globalEngine.AddExtensionInitializer(iacrules.Init) + globalEngine.AddExtensionInitializer(snykls.Init) + globalEngine.AddExtensionInitializer(container.Init) + globalEngine.AddExtensionInitializer(localworkflows.InitCodeWorkflow) // init engine - err = engine.Init() + err = globalEngine.Init() if err != nil { globalLogger.Print("Failed to init Workflow Engine!", err) return constants.SNYK_EXIT_CODE_ERROR } // add output flags as persistent flags - outputWorkflow, _ := engine.GetWorkflow(localworkflows.WORKFLOWID_OUTPUT_WORKFLOW) + outputWorkflow, _ := globalEngine.GetWorkflow(localworkflows.WORKFLOWID_OUTPUT_WORKFLOW) outputFlags := workflow.FlagsetFromConfigurationOptions(outputWorkflow.GetConfigurationOptions()) rootCommand.PersistentFlags().AddFlagSet(outputFlags) // add workflows as commands - createCommandsForWorkflows(rootCommand, engine) + createCommandsForWorkflows(rootCommand, globalEngine) // init NetworkAccess - networkAccess := engine.GetNetworkAccess() + networkAccess := globalEngine.GetNetworkAccess() networkAccess.AddHeaderField("x-snyk-cli-version", cliv2.GetFullVersion()) networkAccess.AddHeaderField( "User-Agent", @@ -415,7 +463,7 @@ func MainWithErrorCode() int { } // init Analytics - cliAnalytics := engine.GetAnalytics() + cliAnalytics := globalEngine.GetAnalytics() cliAnalytics.SetVersion(cliv2.GetFullVersion()) cliAnalytics.SetCmdArguments(os.Args[1:]) cliAnalytics.SetOperatingSystem(internalOS) @@ -443,7 +491,7 @@ func MainWithErrorCode() int { cliAnalytics.AddError(err) } - displayError(err) + displayError(err, os.Stdout, globalConfiguration) exitCode := cliv2.DeriveExitCode(err) globalLogger.Printf("Exiting with %d", exitCode) diff --git a/cliv2/cmd/cliv2/main_test.go b/cliv2/cmd/cliv2/main_test.go index cca2e8f93d..3d6d177d74 100644 --- a/cliv2/cmd/cliv2/main_test.go +++ b/cliv2/cmd/cliv2/main_test.go @@ -1,23 +1,34 @@ package main import ( + "bytes" + "encoding/json" + "errors" + "fmt" "os" + "os/exec" "testing" "time" + "github.com/rs/zerolog" + "github.com/snyk/go-application-framework/pkg/configuration" + localworkflows "github.com/snyk/go-application-framework/pkg/local_workflows" + "github.com/snyk/go-application-framework/pkg/local_workflows/content_type" + "github.com/snyk/go-application-framework/pkg/local_workflows/json_schemas" + "github.com/snyk/go-application-framework/pkg/workflow" "github.com/spf13/cobra" "github.com/spf13/pflag" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" - "github.com/snyk/go-application-framework/pkg/configuration" - localworkflows "github.com/snyk/go-application-framework/pkg/local_workflows" - "github.com/snyk/go-application-framework/pkg/workflow" + "github.com/snyk/cli/cliv2/internal/constants" + clierrors "github.com/snyk/cli/cliv2/internal/errors" ) func cleanup() { helpProvided = false globalConfiguration = nil - engine = nil + globalEngine = nil } func Test_MainWithErrorCode(t *testing.T) { @@ -93,7 +104,7 @@ func Test_CreateCommandsForWorkflowWithSubcommands(t *testing.T) { globalConfiguration = configuration.New() globalConfiguration.Set(configuration.DEBUG, true) - engine = workflow.NewWorkFlowEngine(globalConfiguration) + globalEngine = workflow.NewWorkFlowEngine(globalConfiguration) fn := func(invocation workflow.InvocationContext, input []workflow.Data) ([]workflow.Data, error) { return []workflow.Data{}, nil @@ -104,17 +115,17 @@ func Test_CreateCommandsForWorkflowWithSubcommands(t *testing.T) { for _, v := range commandList { workflowConfig := workflow.ConfigurationOptionsFromFlagset(pflag.NewFlagSet("pla", pflag.ContinueOnError)) workflowId1 := workflow.NewWorkflowIdentifier(v) - _, err := engine.Register(workflowId1, workflowConfig, fn) + _, err := globalEngine.Register(workflowId1, workflowConfig, fn) if err != nil { t.Fatal(err) } } - _ = engine.Init() + _ = globalEngine.Init() rootCommand := prepareRootCommand() // invoke method under test - createCommandsForWorkflows(rootCommand, engine) + createCommandsForWorkflows(rootCommand, globalEngine) // test that root subcmd2 has expected subcommands cmd, _, _ := rootCommand.Find([]string{"cmd"}) @@ -168,7 +179,7 @@ func Test_runMainWorkflow_unknownargs(t *testing.T) { defer cleanup() globalConfiguration = configuration.New() globalConfiguration.Set(configuration.DEBUG, true) - engine = workflow.NewWorkFlowEngine(globalConfiguration) + globalEngine = workflow.NewWorkFlowEngine(globalConfiguration) fn := func(invocation workflow.InvocationContext, input []workflow.Data) ([]workflow.Data, error) { return []workflow.Data{}, nil @@ -179,13 +190,13 @@ func Test_runMainWorkflow_unknownargs(t *testing.T) { for _, v := range commandList { workflowConfig := workflow.ConfigurationOptionsFromFlagset(pflag.NewFlagSet("pla", pflag.ContinueOnError)) workflowId1 := workflow.NewWorkflowIdentifier(v) - _, err := engine.Register(workflowId1, workflowConfig, fn) + _, err := globalEngine.Register(workflowId1, workflowConfig, fn) if err != nil { t.Fatal(err) } } - _ = engine.Init() + _ = globalEngine.Init() config := configuration.NewInMemory() cmd := &cobra.Command{ @@ -214,12 +225,130 @@ func Test_runMainWorkflow_unknownargs(t *testing.T) { } } +func Test_getErrorFromWorkFlowData(t *testing.T) { + t.Run("nil error", func(t *testing.T) { + err := getErrorFromWorkFlowData(nil) + assert.Nil(t, err) + }) + t.Run("workflow error", func(t *testing.T) { + workflowId := workflow.NewWorkflowIdentifier("output") + workflowIdentifier := workflow.NewTypeIdentifier(workflowId, "output") + data := workflow.NewData(workflowIdentifier, "application/json", []byte(`{"error": "test error"}`)) + err := getErrorFromWorkFlowData([]workflow.Data{data}) + assert.Nil(t, err) + }) + t.Run("workflow with test findings", func(t *testing.T) { + workflowId := workflow.NewWorkflowIdentifier("output") + workflowIdentifier := workflow.NewTypeIdentifier(workflowId, "output") + payload, err := json.Marshal(json_schemas.TestSummary{ + Results: []json_schemas.TestSummaryResult{{ + Severity: "critical", + Total: 99, + Open: 97, + Ignored: 2, + }}, + Type: "sast", + }) + assert.Nil(t, err) + data := workflow.NewData(workflowIdentifier, content_type.TEST_SUMMARY, payload) + err = getErrorFromWorkFlowData([]workflow.Data{data}) + require.NotNil(t, err) + assert.ErrorIs(t, err, clierrors.ErrorWithExitCode{ExitCode: constants.SNYK_EXIT_CODE_VULNERABILITIES_FOUND}) + }) + + t.Run("workflow with empty testing findings", func(t *testing.T) { + workflowId := workflow.NewWorkflowIdentifier("output") + workflowIdentifier := workflow.NewTypeIdentifier(workflowId, "output") + d, err := json.Marshal(json_schemas.TestSummary{ + Results: []json_schemas.TestSummaryResult{{ + Severity: "critical", + Total: 0, + Open: 0, + Ignored: 0, + }}, + Type: "sast", + }) + assert.Nil(t, err) + data := workflow.NewData(workflowIdentifier, content_type.TEST_SUMMARY, d) + err = getErrorFromWorkFlowData([]workflow.Data{data}) + assert.Nil(t, err) + }) +} + +func addEmptyWorkflows(t *testing.T, engine workflow.Engine, commandList []string) { + t.Helper() + for _, v := range commandList { + fn := func(invocation workflow.InvocationContext, input []workflow.Data) ([]workflow.Data, error) { + return []workflow.Data{}, nil + } + + workflowConfig := workflow.ConfigurationOptionsFromFlagset(pflag.NewFlagSet("pla", pflag.ContinueOnError)) + workflowId1 := workflow.NewWorkflowIdentifier(v) + _, err := engine.Register(workflowId1, workflowConfig, fn) + if err != nil { + t.Fatal(err) + } + } +} + +func Test_runWorkflowAndProcessData(t *testing.T) { + defer cleanup() + globalConfiguration = configuration.New() + globalConfiguration.Set(configuration.DEBUG, true) + globalEngine = workflow.NewWorkFlowEngine(globalConfiguration) + + testCmnd := "subcmd1" + addEmptyWorkflows(t, globalEngine, []string{"output"}) + + fn := func(invocation workflow.InvocationContext, input []workflow.Data) ([]workflow.Data, error) { + typeId := workflow.NewTypeIdentifier(invocation.GetWorkflowIdentifier(), "workflowData") + testSummary := json_schemas.TestSummary{ + Results: []json_schemas.TestSummaryResult{ + { + Severity: "critical", + Total: 10, + Open: 10, + Ignored: 0, + }, + }, + Type: "sast", + } + d, err := json.Marshal(testSummary) + if err != nil { + t.Fatal(err) + } + + data := workflow.NewData(typeId, content_type.TEST_SUMMARY, d) + return []workflow.Data{ + data, + }, nil + } + + // setup workflow engine to contain a workflow with subcommands + wrkflowId := workflow.NewWorkflowIdentifier(testCmnd) + workflowConfig := workflow.ConfigurationOptionsFromFlagset(pflag.NewFlagSet("pla", pflag.ContinueOnError)) + + entry, err := globalEngine.Register(wrkflowId, workflowConfig, fn) + assert.Nil(t, err) + assert.NotNil(t, entry) + + err = globalEngine.Init() + assert.NoError(t, err) + + // invoke method under test + logger := zerolog.New(os.Stderr) + err = runWorkflowAndProcessData(globalEngine, &logger, testCmnd) + assert.ErrorIs(t, err, clierrors.ErrorWithExitCode{ + ExitCode: constants.SNYK_EXIT_CODE_VULNERABILITIES_FOUND, + }) +} + func Test_setTimeout(t *testing.T) { exitedCh := make(chan struct{}) fakeExit := func() { close(exitedCh) } - config := configuration.New() + config := configuration.NewInMemory() config.Set(configuration.TIMEOUT, 1) setTimeout(config, fakeExit) select { @@ -229,3 +358,39 @@ func Test_setTimeout(t *testing.T) { t.Fatal("timeout func never executed") } } + +func Test_displayError(t *testing.T) { + t.Run("prints out generic error messages", func(t *testing.T) { + var b bytes.Buffer + config := configuration.NewInMemory() + err := errors.New("test error") + displayError(err, &b, config) + + assert.Equal(t, "test error\n", b.String()) + }) + + scenarios := []struct { + name string + err error + }{ + { + name: "exec.ExitError", + err: &exec.ExitError{}, + }, + { + name: "clierrors.ErrorWithExitCode", + err: clierrors.ErrorWithExitCode{ExitCode: 42}, + }, + } + + for _, scenario := range scenarios { + t.Run(fmt.Sprintf("%s does not display anything", scenario.name), func(t *testing.T) { + var b bytes.Buffer + config := configuration.NewInMemory() + err := scenario.err + displayError(err, &b, config) + + assert.Equal(t, "", b.String()) + }) + } +} diff --git a/cliv2/go.mod b/cliv2/go.mod index fced16e8dd..fb8b4f2362 100644 --- a/cliv2/go.mod +++ b/cliv2/go.mod @@ -13,7 +13,7 @@ require ( github.com/snyk/cli-extension-iac-rules v0.0.0-20240404084125-0098857e0e1a github.com/snyk/cli-extension-sbom v0.0.0-20240314090036-46535b380426 github.com/snyk/container-cli v0.0.0-20240322120441-6d9b9482f9b1 - github.com/snyk/go-application-framework v0.0.0-20240404113733-1ee20e5f3ae4 + github.com/snyk/go-application-framework v0.0.0-20240412134724-124163becdd6 github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65 github.com/snyk/snyk-iac-capture v0.6.5 github.com/snyk/snyk-ls v0.0.0-20240409081112-f3ca3f397a7b diff --git a/cliv2/go.sum b/cliv2/go.sum index 3b32793251..c886449718 100644 --- a/cliv2/go.sum +++ b/cliv2/go.sum @@ -717,8 +717,8 @@ github.com/snyk/code-client-go v1.3.0 h1:RlE92b29DCyinnwmFIfsp/7ZQ1RZ9+yw4lSxchk github.com/snyk/code-client-go v1.3.0/go.mod h1:zULRDwUaDANSvDfHIU0Eux4tTbSj7w0xWmbvQikhM9E= github.com/snyk/container-cli v0.0.0-20240322120441-6d9b9482f9b1 h1:9RKY9NdX5DrJAoVXDP0JiqrXT+4Nb9NH8pjEcA0NsLA= github.com/snyk/container-cli v0.0.0-20240322120441-6d9b9482f9b1/go.mod h1:38w+dcAQp9eG3P5t2eNS9eG0reut10AeJjLv5lJ5lpM= -github.com/snyk/go-application-framework v0.0.0-20240404113733-1ee20e5f3ae4 h1:bwk32eWWmTUr2i3Wumab+VLUy5DICIQDNbyd2BfGU70= -github.com/snyk/go-application-framework v0.0.0-20240404113733-1ee20e5f3ae4/go.mod h1:Yz/qxFyfhf0xbA+z8Vzr5IM9IDG+BS+2PiGaP1yAsEw= +github.com/snyk/go-application-framework v0.0.0-20240412134724-124163becdd6 h1:Ntg/AajKoVcDVVJ/Y+vs6uQ9Jejxm2fKh8cN9kR52V4= +github.com/snyk/go-application-framework v0.0.0-20240412134724-124163becdd6/go.mod h1:Yz/qxFyfhf0xbA+z8Vzr5IM9IDG+BS+2PiGaP1yAsEw= github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65 h1:CEQuYv0Go6MEyRCD3YjLYM2u3Oxkx8GpCpFBd4rUTUk= github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65/go.mod h1:88KbbvGYlmLgee4OcQ19yr0bNpXpOr2kciOthaSzCAg= github.com/snyk/policy-engine v0.22.0 h1:od9pduGrXyfWO791X+8M1qmnvWUxaIXh0gBzGKqeseA= diff --git a/cliv2/internal/cliv2/cliv2.go b/cliv2/internal/cliv2/cliv2.go index 71e13a9a2d..3f79b10ae5 100644 --- a/cliv2/internal/cliv2/cliv2.go +++ b/cliv2/internal/cliv2/cliv2.go @@ -18,6 +18,7 @@ import ( "time" "github.com/gofrs/flock" + cli_errors "github.com/snyk/cli/cliv2/internal/errors" "github.com/snyk/go-application-framework/pkg/configuration" "github.com/snyk/go-application-framework/pkg/utils" @@ -445,11 +446,14 @@ func DeriveExitCode(err error) int { if err != nil { var exitError *exec.ExitError + var errorWithExitCode *cli_errors.ErrorWithExitCode if errors.As(err, &exitError) { returnCode = exitError.ExitCode() } else if errors.Is(err, context.DeadlineExceeded) { returnCode = constants.SNYK_EXIT_CODE_EX_UNAVAILABLE + } else if errors.As(err, &errorWithExitCode) { + returnCode = errorWithExitCode.ExitCode } else { // got an error but it's not an ExitError returnCode = constants.SNYK_EXIT_CODE_ERROR diff --git a/cliv2/internal/cliv2/cliv2_test.go b/cliv2/internal/cliv2/cliv2_test.go index f130f41f8f..609fa6487d 100644 --- a/cliv2/internal/cliv2/cliv2_test.go +++ b/cliv2/internal/cliv2/cliv2_test.go @@ -2,6 +2,7 @@ package cliv2_test import ( "context" + "errors" "io" "log" "os" @@ -12,6 +13,7 @@ import ( "testing" "time" + cli_errors "github.com/snyk/cli/cliv2/internal/errors" "github.com/snyk/go-application-framework/pkg/configuration" "github.com/snyk/cli/cliv2/internal/cliv2" @@ -484,3 +486,23 @@ func Test_setTimeout(t *testing.T) { // ensure that -1 is correctly mapped if timeout is set assert.Equal(t, constants.SNYK_EXIT_CODE_EX_UNAVAILABLE, cliv2.DeriveExitCode(err)) } + +func TestDeriveExitCode(t *testing.T) { + tests := []struct { + name string + err error + expected int + }{ + {name: "no error", err: nil, expected: constants.SNYK_EXIT_CODE_OK}, + {name: "error with exit code", err: &cli_errors.ErrorWithExitCode{ExitCode: 42}, expected: 42}, + {name: "context.DeadlineExceeded", err: context.DeadlineExceeded, expected: constants.SNYK_EXIT_CODE_EX_UNAVAILABLE}, + {name: "other error", err: errors.New("some other error"), expected: constants.SNYK_EXIT_CODE_ERROR}, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + exitCode := cliv2.DeriveExitCode(tc.err) + assert.Equal(t, tc.expected, exitCode) + }) + } +} diff --git a/cliv2/internal/constants/constants.go b/cliv2/internal/constants/constants.go index d95e4af4be..fa01a6b831 100644 --- a/cliv2/internal/constants/constants.go +++ b/cliv2/internal/constants/constants.go @@ -1,6 +1,7 @@ package constants const SNYK_EXIT_CODE_OK = 0 +const SNYK_EXIT_CODE_VULNERABILITIES_FOUND = 1 const SNYK_EXIT_CODE_ERROR = 2 const SNYK_EXIT_CODE_EX_UNAVAILABLE = 69 const SNYK_INTEGRATION_NAME = "CLI_V1_PLUGIN" diff --git a/cliv2/internal/errors/errors.go b/cliv2/internal/errors/errors.go new file mode 100644 index 0000000000..7b7c19003b --- /dev/null +++ b/cliv2/internal/errors/errors.go @@ -0,0 +1,11 @@ +package cli_errors + +import "fmt" + +type ErrorWithExitCode struct { + ExitCode int +} + +func (e ErrorWithExitCode) Error() string { + return fmt.Sprintf("exit code: %d", e.ExitCode) +} From 05cb9f5ba9284999269368d1a0a98c8562f4badd Mon Sep 17 00:00:00 2001 From: Bastian Doetsch Date: Tue, 16 Apr 2024 10:14:16 +0200 Subject: [PATCH 44/58] fix(ls): Trigger re-analysis after fixing interfile issues (#5163) --- cliv2/go.mod | 6 ++++-- cliv2/go.sum | 16 ++++++++++++---- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/cliv2/go.mod b/cliv2/go.mod index fb8b4f2362..f1ba1586c2 100644 --- a/cliv2/go.mod +++ b/cliv2/go.mod @@ -16,7 +16,7 @@ require ( github.com/snyk/go-application-framework v0.0.0-20240412134724-124163becdd6 github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65 github.com/snyk/snyk-iac-capture v0.6.5 - github.com/snyk/snyk-ls v0.0.0-20240409081112-f3ca3f397a7b + github.com/snyk/snyk-ls v0.0.0-20240415080013-f8e44edf8883 github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.9.0 @@ -37,6 +37,7 @@ require ( github.com/agnivade/levenshtein v1.1.1 // indirect github.com/alexbrainman/sspi v0.0.0-20231016080023-1a75b4708caa // indirect github.com/amplitude/analytics-go v1.0.1 // indirect + github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/apparentlymart/go-cidr v1.1.0 // indirect github.com/apparentlymart/go-textseg/v13 v13.0.0 // indirect github.com/apparentlymart/go-versions v1.0.1 // indirect @@ -128,6 +129,7 @@ require ( github.com/muesli/cancelreader v0.2.2 // indirect github.com/muesli/reflow v0.3.0 // indirect github.com/muesli/termenv v0.13.0 // indirect + github.com/oapi-codegen/runtime v1.0.0 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/open-policy-agent/opa v0.51.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect @@ -150,7 +152,7 @@ require ( github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/skeema/knownhosts v1.2.2 // indirect - github.com/snyk/code-client-go v1.3.0 // indirect + github.com/snyk/code-client-go v1.4.2 // indirect github.com/snyk/policy-engine v0.22.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/sourcegraph/go-lsp v0.0.0-20240223163137-f80c5dd31dfd // indirect diff --git a/cliv2/go.sum b/cliv2/go.sum index c886449718..5d6111158d 100644 --- a/cliv2/go.sum +++ b/cliv2/go.sum @@ -197,6 +197,7 @@ github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8 github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78= github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= +github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls= github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E= github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo= @@ -210,6 +211,8 @@ github.com/amplitude/analytics-go v1.0.1/go.mod h1:kAQG8OQ6aPOxZrEZ3+/NFCfxdYSyj github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= +github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= github.com/apparentlymart/go-cidr v1.1.0 h1:2mAhrMoF+nhXqxTzSZMUzDHkLjmIHC+Zzn4tdgBZjnU= github.com/apparentlymart/go-cidr v1.1.0/go.mod h1:EBcsNrHc3zQeuaeCeCtQruQm+n9/YjEn/vI25Lg7Gwc= github.com/apparentlymart/go-dump v0.0.0-20190214190832-042adf3cf4a0 h1:MzVXffFUye+ZcSR6opIgz9Co7WcDx6ZcY+RjfFHoA0I= @@ -235,6 +238,7 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= +github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= github.com/bmatcuk/doublestar v1.3.4 h1:gPypJ5xD31uhX6Tf54sDPUOBXTqKH4c9aPY66CyQrS0= github.com/bmatcuk/doublestar v1.3.4/go.mod h1:wiQtGV+rzVYxB7WIlirSN++5HPtPlXEo9MEoZQC/PmE= github.com/bmatcuk/doublestar/v4 v4.6.0 h1:HTuxyug8GyFbRkrffIpzNCSK4luc0TY3wzXvzIZhEXc= @@ -560,6 +564,7 @@ github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8Hm github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= @@ -632,6 +637,8 @@ github.com/muesli/termenv v0.11.1-0.20220204035834-5ac8409525e0/go.mod h1:Bd5NYQ github.com/muesli/termenv v0.11.1-0.20220212125758-44cd13922739/go.mod h1:Bd5NYQ7pd+SrtBSrSNoBBmXlcY8+Xj4BMJgh8qcZrvs= github.com/muesli/termenv v0.13.0 h1:wK20DRpJdDX8b7Ek2QfhvqhRQFZ237RGRO0RQ/Iqdy0= github.com/muesli/termenv v0.13.0/go.mod h1:sP1+uffeLaEYpyOTb8pLCUctGcGLnoFjSn4YJK5e2bc= +github.com/oapi-codegen/runtime v1.0.0 h1:P4rqFX5fMFWqRzY9M/3YF9+aPSPPB06IzP2P7oOxrWo= +github.com/oapi-codegen/runtime v1.0.0/go.mod h1:LmCUMQuPB4M/nLXilQXhHw+BLZdDb18B34OO356yJ/A= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= @@ -713,8 +720,8 @@ github.com/snyk/cli-extension-iac-rules v0.0.0-20240404084125-0098857e0e1a h1:pv github.com/snyk/cli-extension-iac-rules v0.0.0-20240404084125-0098857e0e1a/go.mod h1:4c6XS4n6mWbJM9md3r4B2NFgjs2tyi8GzGlz1BbWIx0= github.com/snyk/cli-extension-sbom v0.0.0-20240314090036-46535b380426 h1:MXbip3nmiOym3/9bNWlPISVOAEAAz4FDcPvqOMPcCc4= github.com/snyk/cli-extension-sbom v0.0.0-20240314090036-46535b380426/go.mod h1:g2VgZU79btvZrAP3oHZGv3tHD9POVOx5a3DY894rS4w= -github.com/snyk/code-client-go v1.3.0 h1:RlE92b29DCyinnwmFIfsp/7ZQ1RZ9+yw4lSxchkwlyY= -github.com/snyk/code-client-go v1.3.0/go.mod h1:zULRDwUaDANSvDfHIU0Eux4tTbSj7w0xWmbvQikhM9E= +github.com/snyk/code-client-go v1.4.2 h1:Vy27Xr6CVAs0qKZlU8I/fxWWI6X2ppzan6IZnUJYmvg= +github.com/snyk/code-client-go v1.4.2/go.mod h1:Kkr7pQc8ItsBZSYd6A1S4r4VHO6HNyTWZsqi18sAtwQ= github.com/snyk/container-cli v0.0.0-20240322120441-6d9b9482f9b1 h1:9RKY9NdX5DrJAoVXDP0JiqrXT+4Nb9NH8pjEcA0NsLA= github.com/snyk/container-cli v0.0.0-20240322120441-6d9b9482f9b1/go.mod h1:38w+dcAQp9eG3P5t2eNS9eG0reut10AeJjLv5lJ5lpM= github.com/snyk/go-application-framework v0.0.0-20240412134724-124163becdd6 h1:Ntg/AajKoVcDVVJ/Y+vs6uQ9Jejxm2fKh8cN9kR52V4= @@ -725,8 +732,8 @@ github.com/snyk/policy-engine v0.22.0 h1:od9pduGrXyfWO791X+8M1qmnvWUxaIXh0gBzGKq github.com/snyk/policy-engine v0.22.0/go.mod h1:Vvy/9VMXoABS3JlLqhTlAPWkB5LgbLh7LGn3gBwAqdY= github.com/snyk/snyk-iac-capture v0.6.5 h1:992DXCAJSN97KtUh8T5ndaWwd/6ZCal2bDkRXqM1u/E= github.com/snyk/snyk-iac-capture v0.6.5/go.mod h1:e47i55EmM0F69ZxyFHC4sCi7vyaJW6DLoaamJJCzWGk= -github.com/snyk/snyk-ls v0.0.0-20240409081112-f3ca3f397a7b h1:zVft430r9wUecY2IlGH/mQcRpHwWg0mgtEd8NweRds8= -github.com/snyk/snyk-ls v0.0.0-20240409081112-f3ca3f397a7b/go.mod h1:jSKV+XpanDzYZ3bLHNuT4v3+b39WEy6kCh4dkkSyykc= +github.com/snyk/snyk-ls v0.0.0-20240415080013-f8e44edf8883 h1:wnS1SUX7zPC+uE59zFoSW9VBhhOy5QlToABKJlExVic= +github.com/snyk/snyk-ls v0.0.0-20240415080013-f8e44edf8883/go.mod h1:R0Q7JbWeDHvvKgxnC7zMyqdLH6rMP+Y+kwB9juAJ7Sk= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/sourcegraph/go-lsp v0.0.0-20240223163137-f80c5dd31dfd h1:Dq5WSzWsP1TbVi10zPWBI5LKEBDg4Y1OhWEph1wr5WQ= @@ -742,6 +749,7 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= +github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= From 5bd898e708dfb8caaa758debbf7d21998e9f2693 Mon Sep 17 00:00:00 2001 From: PeterSchafer <101886095+PeterSchafer@users.noreply.github.com> Date: Tue, 16 Apr 2024 10:56:14 +0200 Subject: [PATCH 45/58] feat(code): Integrate experimental go native code client [CLI-224] (#5164) --- cliv2/go.mod | 10 +++++----- cliv2/go.sum | 21 ++++++++++----------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/cliv2/go.mod b/cliv2/go.mod index f1ba1586c2..a0021eb9d6 100644 --- a/cliv2/go.mod +++ b/cliv2/go.mod @@ -13,7 +13,7 @@ require ( github.com/snyk/cli-extension-iac-rules v0.0.0-20240404084125-0098857e0e1a github.com/snyk/cli-extension-sbom v0.0.0-20240314090036-46535b380426 github.com/snyk/container-cli v0.0.0-20240322120441-6d9b9482f9b1 - github.com/snyk/go-application-framework v0.0.0-20240412134724-124163becdd6 + github.com/snyk/go-application-framework v0.0.0-20240415154737-b9e500770430 github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65 github.com/snyk/snyk-iac-capture v0.6.5 github.com/snyk/snyk-ls v0.0.0-20240415080013-f8e44edf8883 @@ -101,7 +101,7 @@ require ( github.com/hashicorp/terraform-svchost v0.0.0-20200729002733-f050f53b9734 // indirect github.com/hexops/gotextdiff v1.0.3 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/invopop/yaml v0.2.0 // indirect + github.com/invopop/yaml v0.3.1 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/jcmturner/aescts/v2 v2.0.0 // indirect github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect @@ -129,11 +129,11 @@ require ( github.com/muesli/cancelreader v0.2.2 // indirect github.com/muesli/reflow v0.3.0 // indirect github.com/muesli/termenv v0.13.0 // indirect - github.com/oapi-codegen/runtime v1.0.0 // indirect + github.com/oapi-codegen/runtime v1.1.1 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/open-policy-agent/opa v0.51.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/pelletier/go-toml/v2 v2.2.0 // indirect + github.com/pelletier/go-toml/v2 v2.2.1 // indirect github.com/perimeterx/marshmallow v1.1.5 // indirect github.com/peterh/liner v1.2.2 // indirect github.com/pingcap/errors v0.11.4 // indirect @@ -177,7 +177,7 @@ require ( go.opencensus.io v0.24.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/crypto v0.22.0 // indirect - golang.org/x/exp v0.0.0-20240404231335-c0f41cb1a7a0 // indirect + golang.org/x/exp v0.0.0-20240409090435-93d18d7e34b8 // indirect golang.org/x/mod v0.17.0 // indirect golang.org/x/net v0.24.0 // indirect golang.org/x/oauth2 v0.19.0 // indirect diff --git a/cliv2/go.sum b/cliv2/go.sum index 5d6111158d..1299f7d85a 100644 --- a/cliv2/go.sum +++ b/cliv2/go.sum @@ -540,8 +540,8 @@ github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1: github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/invopop/yaml v0.2.0 h1:7zky/qH+O0DwAyoobXUqvVBwgBFRxKoQ/3FjcVpjTMY= -github.com/invopop/yaml v0.2.0/go.mod h1:2XuRLgs/ouIrW3XNzuNj7J3Nvu/Dig5MXvbCEdiBN3Q= +github.com/invopop/yaml v0.3.1 h1:f0+ZpmhfBSS4MhG+4HYseMdJhoeeopbSKbq5Rpeelso= +github.com/invopop/yaml v0.3.1/go.mod h1:PMOp3nn4/12yEZUFfmOuNHJsZToEEOwoWsT+D81KkeA= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= @@ -637,8 +637,8 @@ github.com/muesli/termenv v0.11.1-0.20220204035834-5ac8409525e0/go.mod h1:Bd5NYQ github.com/muesli/termenv v0.11.1-0.20220212125758-44cd13922739/go.mod h1:Bd5NYQ7pd+SrtBSrSNoBBmXlcY8+Xj4BMJgh8qcZrvs= github.com/muesli/termenv v0.13.0 h1:wK20DRpJdDX8b7Ek2QfhvqhRQFZ237RGRO0RQ/Iqdy0= github.com/muesli/termenv v0.13.0/go.mod h1:sP1+uffeLaEYpyOTb8pLCUctGcGLnoFjSn4YJK5e2bc= -github.com/oapi-codegen/runtime v1.0.0 h1:P4rqFX5fMFWqRzY9M/3YF9+aPSPPB06IzP2P7oOxrWo= -github.com/oapi-codegen/runtime v1.0.0/go.mod h1:LmCUMQuPB4M/nLXilQXhHw+BLZdDb18B34OO356yJ/A= +github.com/oapi-codegen/runtime v1.1.1 h1:EXLHh0DXIJnWhdRPN2w4MXAzFyE4CskzhNLUmtpMYro= +github.com/oapi-codegen/runtime v1.1.1/go.mod h1:SK9X900oXmPWilYR5/WKPzt3Kqxn/uS/+lbpREv+eCg= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= @@ -649,8 +649,8 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/pact-foundation/pact-go v1.7.0 h1:5iyVyg+avkWz9Jn7cefRmlPbXu+KMZvWblIe15v4fc8= github.com/pact-foundation/pact-go v1.7.0/go.mod h1:NcAbRqIE0cjRF+JKl2vcLlzjvrgcZrnq4SwQu2o4PeA= -github.com/pelletier/go-toml/v2 v2.2.0 h1:QLgLl2yMN7N+ruc31VynXs1vhMZa7CeHHejIeBAsoHo= -github.com/pelletier/go-toml/v2 v2.2.0/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/pelletier/go-toml/v2 v2.2.1 h1:9TA9+T8+8CUCO2+WYnDLCgrYi9+omqKXyjDtosvtEhg= +github.com/pelletier/go-toml/v2 v2.2.1/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s= github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= github.com/peterh/liner v1.2.2 h1:aJ4AOodmL+JxOZZEL2u9iJf8omNRpqHc/EbrK+3mAXw= @@ -724,8 +724,8 @@ github.com/snyk/code-client-go v1.4.2 h1:Vy27Xr6CVAs0qKZlU8I/fxWWI6X2ppzan6IZnUJ github.com/snyk/code-client-go v1.4.2/go.mod h1:Kkr7pQc8ItsBZSYd6A1S4r4VHO6HNyTWZsqi18sAtwQ= github.com/snyk/container-cli v0.0.0-20240322120441-6d9b9482f9b1 h1:9RKY9NdX5DrJAoVXDP0JiqrXT+4Nb9NH8pjEcA0NsLA= github.com/snyk/container-cli v0.0.0-20240322120441-6d9b9482f9b1/go.mod h1:38w+dcAQp9eG3P5t2eNS9eG0reut10AeJjLv5lJ5lpM= -github.com/snyk/go-application-framework v0.0.0-20240412134724-124163becdd6 h1:Ntg/AajKoVcDVVJ/Y+vs6uQ9Jejxm2fKh8cN9kR52V4= -github.com/snyk/go-application-framework v0.0.0-20240412134724-124163becdd6/go.mod h1:Yz/qxFyfhf0xbA+z8Vzr5IM9IDG+BS+2PiGaP1yAsEw= +github.com/snyk/go-application-framework v0.0.0-20240415154737-b9e500770430 h1:emdZv4L8mAoLNLulH452DQ2PEHEVynT2xuLRmrRdH+0= +github.com/snyk/go-application-framework v0.0.0-20240415154737-b9e500770430/go.mod h1:PiFY8OkhxenSXWgwGkaQRRsZUBZMkNev3EQOzmwRaSo= github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65 h1:CEQuYv0Go6MEyRCD3YjLYM2u3Oxkx8GpCpFBd4rUTUk= github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65/go.mod h1:88KbbvGYlmLgee4OcQ19yr0bNpXpOr2kciOthaSzCAg= github.com/snyk/policy-engine v0.22.0 h1:od9pduGrXyfWO791X+8M1qmnvWUxaIXh0gBzGKqeseA= @@ -845,8 +845,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20240404231335-c0f41cb1a7a0 h1:985EYyeCOxTpcgOTJpflJUwOeEz0CQOdPt73OzpE9F8= -golang.org/x/exp v0.0.0-20240404231335-c0f41cb1a7a0/go.mod h1:/lliqkxwWAhPjf5oSOIJup2XcqJaw8RGS6k3TGEc7GI= +golang.org/x/exp v0.0.0-20240409090435-93d18d7e34b8 h1:ESSUROHIBHg7USnszlcdmjBEwdMj9VUvU+OPk4yl2mc= +golang.org/x/exp v0.0.0-20240409090435-93d18d7e34b8/go.mod h1:/lliqkxwWAhPjf5oSOIJup2XcqJaw8RGS6k3TGEc7GI= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1384,7 +1384,6 @@ gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From a8be76486bfc17dda643d18a6fa9475744ddbd5c Mon Sep 17 00:00:00 2001 From: Luke Watts Date: Tue, 16 Apr 2024 11:35:32 +0200 Subject: [PATCH 46/58] feat: include additional policy properties, when provided, in plain text output (#5142) --- .../remediation-based-format-issues.ts | 142 +++++--- .../formatters/test/format-test-results.ts | 2 + src/lib/formatters/types.ts | 24 ++ src/lib/snyk-test/legacy.ts | 2 + .../npm-package-single-vuln/package-lock.json | 14 + .../npm-package-single-vuln/package.json | 9 + .../test-graph-results-with-annotation.json | 116 ++++++ .../test-graph-results.json | 104 ++++++ .../test-graph-results.json | 337 ++++++++++++++++++ .../test-graph-user-note-results.json | 333 +++++++++++++++++ .../snyk-test/human-formatted-output.spec.ts | 66 ++++ ...mediation-based-format-issues.spec.ts.snap | 8 +- .../remediation-based-format-issues.spec.ts | 261 +++++++++----- 13 files changed, 1263 insertions(+), 155 deletions(-) create mode 100644 test/acceptance/workspaces/npm-package-single-vuln/package-lock.json create mode 100644 test/acceptance/workspaces/npm-package-single-vuln/package.json create mode 100644 test/acceptance/workspaces/npm-package-single-vuln/test-graph-results-with-annotation.json create mode 100644 test/acceptance/workspaces/npm-package-single-vuln/test-graph-results.json create mode 100644 test/fixtures/sca-dep-graph-with-annotation/test-graph-results.json create mode 100644 test/fixtures/sca-dep-graph-with-annotation/test-graph-user-note-results.json create mode 100644 test/jest/acceptance/snyk-test/human-formatted-output.spec.ts diff --git a/src/lib/formatters/remediation-based-format-issues.ts b/src/lib/formatters/remediation-based-format-issues.ts index b9042489d0..88df5f4280 100644 --- a/src/lib/formatters/remediation-based-format-issues.ts +++ b/src/lib/formatters/remediation-based-format-issues.ts @@ -15,7 +15,11 @@ import { } from '../../lib/snyk-test/legacy'; import { colorTextBySeverity } from '../../lib/snyk-test/common'; import { formatLegalInstructions } from './legal-license-instructions'; -import { BasicVulnInfo, UpgradesByAffectedPackage } from './types'; +import { + AppliedPolicyRules, + BasicVulnInfo, + UpgradesByAffectedPackage, +} from './types'; import { PATH_SEPARATOR } from '../constants'; import { getSeverityValue } from './get-severity-value'; import { getVulnerabilityUrl } from './get-vuln-url'; @@ -45,6 +49,7 @@ export function formatIssuesWithRemediation( note: vuln.note, legalInstructions: vuln.legalInstructionsArray, paths: vuln.list.map((v) => v.from), + appliedPolicyRules: vuln.appliedPolicyRules, }; if (vulnData.type === 'license') { @@ -140,18 +145,19 @@ function constructLicenseText( const licenseTextArray = [chalk.bold.green('\nLicense issues:')]; for (const id of Object.keys(basicLicenseInfo)) { - const licenseText = formatIssue( + const licenseText = formatIssue({ id, - basicLicenseInfo[id].title, - basicLicenseInfo[id].severity, - basicLicenseInfo[id].isNew, - `${basicLicenseInfo[id].name}@${basicLicenseInfo[id].version}`, - basicLicenseInfo[id].paths, + title: basicLicenseInfo[id].title, + severity: basicLicenseInfo[id].severity, + isNew: basicLicenseInfo[id].isNew, + vulnerableModule: `${basicLicenseInfo[id].name}@${basicLicenseInfo[id].version}`, + paths: basicLicenseInfo[id].paths, testOptions, - basicLicenseInfo[id].note, - undefined, // We can never override license rules, so no originalSeverity here - basicLicenseInfo[id].legalInstructions, - ); + note: basicLicenseInfo[id].note, + originalSeverity: undefined, // We can never override license rules, so no originalSeverity here + legalInstructions: basicLicenseInfo[id].legalInstructions, + appliedPolicyRules: basicLicenseInfo[id].appliedPolicyRules, + }); licenseTextArray.push('\n' + licenseText); } return licenseTextArray; @@ -183,17 +189,19 @@ function constructPatchesText( const patchedText = `\n Patch available for ${chalk.bold.whiteBright( packageAtVersion, )}\n`; - const thisPatchFixes = formatIssue( + const thisPatchFixes = formatIssue({ id, - basicVulnInfo[id].title, - basicVulnInfo[id].severity, - basicVulnInfo[id].isNew, - `${basicVulnInfo[id].name}@${basicVulnInfo[id].version}`, - basicVulnInfo[id].paths, + title: basicVulnInfo[id].title, + severity: basicVulnInfo[id].severity, + isNew: basicVulnInfo[id].isNew, + vulnerableModule: `${basicVulnInfo[id].name}@${basicVulnInfo[id].version}`, + paths: basicVulnInfo[id].paths, testOptions, - basicVulnInfo[id].note, - basicVulnInfo[id].originalSeverity, - ); + note: basicVulnInfo[id].note, + originalSeverity: basicVulnInfo[id].originalSeverity, + legalInstructions: [], + appliedPolicyRules: basicVulnInfo[id]?.appliedPolicyRules, + }); patchedTextArray.push(patchedText + thisPatchFixes); } @@ -214,18 +222,19 @@ function thisUpgradeFixes( ) .filter((id) => basicVulnInfo[id].type !== 'license') .map((id) => - formatIssue( + formatIssue({ id, - basicVulnInfo[id].title, - basicVulnInfo[id].severity, - basicVulnInfo[id].isNew, - `${basicVulnInfo[id].name}@${basicVulnInfo[id].version}`, - basicVulnInfo[id].paths, + title: basicVulnInfo[id].title, + severity: basicVulnInfo[id].severity, + isNew: basicVulnInfo[id].isNew, + vulnerableModule: `${basicVulnInfo[id].name}@${basicVulnInfo[id].version}`, + paths: basicVulnInfo[id].paths, testOptions, - basicVulnInfo[id].note, - basicVulnInfo[id].originalSeverity, - [], - ), + note: basicVulnInfo[id].note, + originalSeverity: basicVulnInfo[id].originalSeverity, + legalInstructions: [], + appliedPolicyRules: basicVulnInfo[id]?.appliedPolicyRules, + }), ) .join('\n'); } @@ -366,18 +375,19 @@ function constructUnfixableText( )}` : '\n No upgrade or patch available'; unfixableIssuesTextArray.push( - formatIssue( - issue.id, - issue.title, - issue.severity, - issue.isNew, - `${issue.packageName}@${issue.version}`, - issueInfo.paths, + formatIssue({ + id: issue.id, + title: issue.title, + severity: issue.severity, + isNew: issue.isNew, + vulnerableModule: `${issue.packageName}@${issue.version}`, + paths: issueInfo.paths, testOptions, - issueInfo.note, - issueInfo.originalSeverity, - [], - ) + `${extraInfo}`, + note: issueInfo.note, + originalSeverity: issueInfo.originalSeverity, + legalInstructions: [], + appliedPolicyRules: issueInfo?.appliedPolicyRules, + }) + `${extraInfo}`, ); } @@ -394,18 +404,34 @@ export function printPath(path: string[], slice = 1) { return path.slice(slice).join(PATH_SEPARATOR); } -export function formatIssue( - id: string, - title: string, - severity: SEVERITY, - isNew: boolean, - vulnerableModule: string, - paths: string[][], - testOptions: TestOptions, - note: string | false, - originalSeverity?: SEVERITY, - legalInstructions?: LegalInstruction[], -): string { +interface IssueForDisplay { + id: string; + title: string; + severity: SEVERITY; + isNew: boolean; + vulnerableModule: string; + paths: string[][]; + testOptions: TestOptions; + note: string | false; + originalSeverity?: SEVERITY; + legalInstructions?: LegalInstruction[]; + appliedPolicyRules?: AppliedPolicyRules; +} + +function formatIssue(issue: IssueForDisplay): string { + const { + id, + title, + severity, + isNew, + vulnerableModule, + paths, + testOptions, + note, + originalSeverity, + legalInstructions, + appliedPolicyRules, + } = issue; const newBadge = isNew ? ' (new)' : ''; const name = vulnerableModule ? ` in ${chalk.bold(vulnerableModule)}` : ''; let legalLicenseInstructionsText; @@ -447,6 +473,11 @@ export function formatIssue( originalSeverityStr = ` (originally ${titleCaseText(originalSeverity)})`; } + const { value: userNote, reason: userNoteReason } = + appliedPolicyRules?.annotation || {}; + + const { reason: severityReason } = appliedPolicyRules?.severityChange || {}; + return ( colorTextBySeverity( severity, @@ -462,7 +493,10 @@ export function formatIssue( '\n Legal instructions', )}:\n ${legalLicenseInstructionsText}` : '') + - (note ? `${chalk.bold('\n Note')}:\n ${note}` : '') + (note ? `${chalk.bold('\n Note')}:\n ${note}` : '') + + (severityReason ? '\n Severity reason: ' + severityReason : '') + + (userNote ? '\n User note: ' + userNote : '') + + (userNoteReason ? '\n Note reason: ' + userNoteReason : '') ); } diff --git a/src/lib/formatters/test/format-test-results.ts b/src/lib/formatters/test/format-test-results.ts index cb7c02193f..dff3d27d18 100644 --- a/src/lib/formatters/test/format-test-results.ts +++ b/src/lib/formatters/test/format-test-results.ts @@ -380,6 +380,8 @@ export function groupVulnerabilities( map[curr.id].dockerBaseImage = curr.dockerBaseImage; map[curr.id].nearestFixedInVersion = curr.nearestFixedInVersion; map[curr.id].legalInstructionsArray = curr.legalInstructionsArray; + map[curr.id].severityReason = curr.severityReason; + map[curr.id].appliedPolicyRules = curr.appliedPolicyRules; } map[curr.id].list.push(curr); diff --git a/src/lib/formatters/types.ts b/src/lib/formatters/types.ts index 0ec9399854..f800884003 100644 --- a/src/lib/formatters/types.ts +++ b/src/lib/formatters/types.ts @@ -12,6 +12,30 @@ export interface BasicVulnInfo { legalInstructions?: LegalInstruction[]; paths: string[][]; note: string | false; + severityReason?: string; + userNote?: string; + appliedPolicyRules?: AppliedPolicyRules; +} + +export interface AppliedPolicyRules { + annotation?: { + value: string; + reason?: string; + }; + severityChange?: { + newSeverity?: SEVERITY; + originalSeverity?: SEVERITY; + reason?: string; + }; + ignore?: { + path: string[]; + source?: string; + created: string; + expires?: string; + reason: string; + disregardIfFixable: boolean; + reasonType: string; + }; } interface TopLevelPackageUpgrade { diff --git a/src/lib/snyk-test/legacy.ts b/src/lib/snyk-test/legacy.ts index 36a4ba2b01..df0bd06239 100644 --- a/src/lib/snyk-test/legacy.ts +++ b/src/lib/snyk-test/legacy.ts @@ -8,6 +8,7 @@ import { import { SupportedPackageManagers } from '../package-managers'; import { Options, SupportedProjectTypes, TestOptions } from '../types'; import { SEVERITIES } from './common'; +import { AppliedPolicyRules } from '../formatters/types'; interface Pkg { name: string; @@ -56,6 +57,7 @@ export interface GroupedVuln { isFixable: boolean; fixedIn: string[]; legalInstructionsArray?: LegalInstruction[]; + appliedPolicyRules?: AppliedPolicyRules; } export interface LegalInstruction { diff --git a/test/acceptance/workspaces/npm-package-single-vuln/package-lock.json b/test/acceptance/workspaces/npm-package-single-vuln/package-lock.json new file mode 100644 index 0000000000..4903c5d9ad --- /dev/null +++ b/test/acceptance/workspaces/npm-package-single-vuln/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "no-fix-app", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "cxct": { + "version": "0.0.1-security", + "resolved": "https://registry.npmjs.org/cxct/-/cxct-0.0.1-security.tgz", + "integrity": "sha512-/ET+kx45P3MjvA/RUCFSW9aQOotUCnEzGfDbcC0HHtUGyVnv7yC/djSTL6ZZvY+NUIe3vpHRsNAYq76N+rsXKg==" + } + } + } + \ No newline at end of file diff --git a/test/acceptance/workspaces/npm-package-single-vuln/package.json b/test/acceptance/workspaces/npm-package-single-vuln/package.json new file mode 100644 index 0000000000..19d92513c7 --- /dev/null +++ b/test/acceptance/workspaces/npm-package-single-vuln/package.json @@ -0,0 +1,9 @@ +{ + "name": "no-fix-app", + "version": "1.0.0", + "description": "application with annotated vulns", + "dependencies": { + "cxct": "0.0.1-security" + }, + "devDependencies": {} +} diff --git a/test/acceptance/workspaces/npm-package-single-vuln/test-graph-results-with-annotation.json b/test/acceptance/workspaces/npm-package-single-vuln/test-graph-results-with-annotation.json new file mode 100644 index 0000000000..9fa78a77c0 --- /dev/null +++ b/test/acceptance/workspaces/npm-package-single-vuln/test-graph-results-with-annotation.json @@ -0,0 +1,116 @@ +{ + "result": { + "affectedPkgs": { + "cxct@0.0.1-security": { + "pkg": { "name": "cxct", "version": "0.0.1-security" }, + "issues": { + "SNYK-JS-CXCT-535487": { + "issueId": "SNYK-JS-CXCT-535487", + "fixInfo": { "isPatchable": false, "upgradePaths": [] } + } + } + } + }, + "issuesData": { + "SNYK-JS-CXCT-535487": { + "CVSSv3": "CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H", + "alternativeIds": [], + "creationTime": "2019-11-24T13:10:43.888332Z", + "credit": ["npm 󠅮󠅰󠅭security"], + "cvssScore": 9.8, + "description": "## Overview\n\n[cxct](https://www.npmjs.com/package/cxct) is a malicious package.\n\n\nThe package finds and exfiltrates cryptocurrency wallets.\n\n## Remediation\n\nAvoid using `cxct` altogether.\n\n\n## References\n\n- [NPM Security Advisory](https://www.npmjs.com/advisories/1344)\n", + "disclosureTime": "2019-11-22T00:24:41Z", + "exploit": "Not Defined", + "fixedIn": [], + "functions": [], + "functions_new": [], + "id": "SNYK-JS-CXCT-535487", + "identifiers": { "CVE": [], "CWE": ["CWE-506"], "NSP": [1344] }, + "language": "js", + "modificationTime": "2019-11-24T16:16:16.630345Z", + "moduleName": "cxct", + "packageManager": "npm", + "packageName": "cxct", + "patches": [], + "publicationTime": "2019-11-24T13:11:04Z", + "references": [ + { + "title": "NPM Security Advisory", + "url": "https://www.npmjs.com/advisories/1344" + } + ], + "semver": { "vulnerable": ["*"] }, + "severity": "high", + "title": "Malicious 󠅮󠅰󠅭Package", + "isPinnable": false, + "appliedPolicyRules": { + "annotation": { + "value": "This is a test user note", + "reason": "This vulnerability is a papercut and can be ignored" + } + } + } + }, + "remediation": { + "unresolved": [ + { + "CVSSv3": "CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H", + "alternativeIds": [], + "creationTime": "2019-11-24T13:10:43.888332Z", + "credit": ["npm 󠅮󠅰󠅭security"], + "cvssScore": 9.8, + "description": "## Overview\n\n[cxct](https://www.npmjs.com/package/cxct) is a malicious package.\n\n\nThe package finds and exfiltrates cryptocurrency wallets.\n\n## Remediation\n\nAvoid using `cxct` altogether.\n\n\n## References\n\n- [NPM Security Advisory](https://www.npmjs.com/advisories/1344)\n", + "disclosureTime": "2019-11-22T00:24:41Z", + "exploit": "Not Defined", + "fixedIn": [], + "functions": [], + "functions_new": [], + "id": "SNYK-JS-CXCT-535487", + "identifiers": { "CVE": [], "CWE": ["CWE-506"], "NSP": [1344] }, + "language": "js", + "modificationTime": "2019-11-24T16:16:16.630345Z", + "moduleName": "cxct", + "packageManager": "npm", + "packageName": "cxct", + "patches": [], + "publicationTime": "2019-11-24T13:11:04Z", + "references": [ + { + "title": "NPM Security Advisory", + "url": "https://www.npmjs.com/advisories/1344" + } + ], + "semver": { "vulnerable": ["*"] }, + "severity": "high", + "title": "Malicious 󠅮󠅰󠅭Package for you", + "isPinnable": false, + "from": ["no-fix-app@1.0.0", "cxct@0.0.1-security"], + "upgradePath": [], + "isUpgradable": false, + "isPatchable": false, + "name": "cxct", + "version": "0.0.1-security", + "appliedPolicyRules": { + "annotation": { + "value": "This is a test user note", + "reason": "This vulnerability is a papercut and can be ignored" + } + } + } + ], + "upgrade": {}, + "patch": {}, + "ignore": {}, + "pin": {} + } + }, + "meta": { + "isPrivate": true, + "isLicensesEnabled": false, + "licensesPolicy": { "severities": {}, "orgLicenseRules": {} }, + "policy": "# Snyk (https://snyk.io) policy file, patches or ignores known vulnerabilities.\nversion: v1.14.1\nignore: {}\npatch: {}\n", + "ignoreSettings": null, + "org": "gitphill" + }, + "filesystemPolicy": false +} diff --git a/test/acceptance/workspaces/npm-package-single-vuln/test-graph-results.json b/test/acceptance/workspaces/npm-package-single-vuln/test-graph-results.json new file mode 100644 index 0000000000..484a5e108b --- /dev/null +++ b/test/acceptance/workspaces/npm-package-single-vuln/test-graph-results.json @@ -0,0 +1,104 @@ +{ + "result": { + "affectedPkgs": { + "cxct@0.0.1-security": { + "pkg": { "name": "cxct", "version": "0.0.1-security" }, + "issues": { + "SNYK-JS-CXCT-535487": { + "issueId": "SNYK-JS-CXCT-535487", + "fixInfo": { "isPatchable": false, "upgradePaths": [] } + } + } + } + }, + "issuesData": { + "SNYK-JS-CXCT-535487": { + "CVSSv3": "CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H", + "alternativeIds": [], + "creationTime": "2019-11-24T13:10:43.888332Z", + "credit": ["npm 󠅮󠅰󠅭security"], + "cvssScore": 9.8, + "description": "## Overview\n\n[cxct](https://www.npmjs.com/package/cxct) is a malicious package.\n\n\nThe package finds and exfiltrates cryptocurrency wallets.\n\n## Remediation\n\nAvoid using `cxct` altogether.\n\n\n## References\n\n- [NPM Security Advisory](https://www.npmjs.com/advisories/1344)\n", + "disclosureTime": "2019-11-22T00:24:41Z", + "exploit": "Not Defined", + "fixedIn": [], + "functions": [], + "functions_new": [], + "id": "SNYK-JS-CXCT-535487", + "identifiers": { "CVE": [], "CWE": ["CWE-506"], "NSP": [1344] }, + "language": "js", + "modificationTime": "2019-11-24T16:16:16.630345Z", + "moduleName": "cxct", + "packageManager": "npm", + "packageName": "cxct", + "patches": [], + "publicationTime": "2019-11-24T13:11:04Z", + "references": [ + { + "title": "NPM Security Advisory", + "url": "https://www.npmjs.com/advisories/1344" + } + ], + "semver": { "vulnerable": ["*"] }, + "severity": "high", + "title": "Malicious 󠅮󠅰󠅭Package", + "isPinnable": false + } + }, + "remediation": { + "unresolved": [ + { + "CVSSv3": "CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H", + "alternativeIds": [], + "creationTime": "2019-11-24T13:10:43.888332Z", + "credit": ["npm 󠅮󠅰󠅭security"], + "cvssScore": 9.8, + "description": "## Overview\n\n[cxct](https://www.npmjs.com/package/cxct) is a malicious package.\n\n\nThe package finds and exfiltrates cryptocurrency wallets.\n\n## Remediation\n\nAvoid using `cxct` altogether.\n\n\n## References\n\n- [NPM Security Advisory](https://www.npmjs.com/advisories/1344)\n", + "disclosureTime": "2019-11-22T00:24:41Z", + "exploit": "Not Defined", + "fixedIn": [], + "functions": [], + "functions_new": [], + "id": "SNYK-JS-CXCT-535487", + "identifiers": { "CVE": [], "CWE": ["CWE-506"], "NSP": [1344] }, + "language": "js", + "modificationTime": "2019-11-24T16:16:16.630345Z", + "moduleName": "cxct", + "packageManager": "npm", + "packageName": "cxct", + "patches": [], + "publicationTime": "2019-11-24T13:11:04Z", + "references": [ + { + "title": "NPM Security Advisory", + "url": "https://www.npmjs.com/advisories/1344" + } + ], + "semver": { "vulnerable": ["*"] }, + "severity": "high", + "title": "Malicious 󠅮󠅰󠅭Package", + "isPinnable": false, + "from": ["no-fix-app@1.0.0", "cxct@0.0.1-security"], + "upgradePath": [], + "isUpgradable": false, + "isPatchable": false, + "name": "cxct", + "version": "0.0.1-security" + } + ], + "upgrade": {}, + "patch": {}, + "ignore": {}, + "pin": {} + } + }, + "meta": { + "isPrivate": true, + "isLicensesEnabled": false, + "licensesPolicy": { "severities": {}, "orgLicenseRules": {} }, + "policy": "# Snyk (https://snyk.io) policy file, patches or ignores known vulnerabilities.\nversion: v1.14.1\nignore: {}\npatch: {}\n", + "ignoreSettings": null, + "org": "gitphill" + }, + "filesystemPolicy": false +} diff --git a/test/fixtures/sca-dep-graph-with-annotation/test-graph-results.json b/test/fixtures/sca-dep-graph-with-annotation/test-graph-results.json new file mode 100644 index 0000000000..4ec54e2d3b --- /dev/null +++ b/test/fixtures/sca-dep-graph-with-annotation/test-graph-results.json @@ -0,0 +1,337 @@ +{ + "vulnerabilities": [ + { + "CVSSv3": "CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:L/I:N/A:N", + "alternativeIds": [], + "creationTime": "2021-02-01T13:11:56.558734Z", + "credit": [ + "Wang Baohua" + ], + "cvssScore": 3.1, + "description": "## Overview\n[django](https://pypi.org/project/Django/) is a high-level Python Web framework that encourages rapid development and clean, pragmatic design.\n\nAffected versions of this package are vulnerable to Directory Traversal via the `django.utils.archive.extract()` function, which is used by `startapp --template` and `startproject --template`. This can happen via an archive with absolute paths or relative paths with dot segments.\n\n## Details\n\nA Directory Traversal attack (also known as path traversal) aims to access files and directories that are stored outside the intended folder. By manipulating files with \"dot-dot-slash (../)\" sequences and its variations, or by using absolute file paths, it may be possible to access arbitrary files and directories stored on file system, including application source code, configuration, and other critical system files.\n\nDirectory Traversal vulnerabilities can be generally divided into two types:\n\n- **Information Disclosure**: Allows the attacker to gain information about the folder structure or read the contents of sensitive files on the system.\n\n`st` is a module for serving static files on web pages, and contains a [vulnerability of this type](https://snyk.io/vuln/npm:st:20140206). In our example, we will serve files from the `public` route.\n\nIf an attacker requests the following URL from our server, it will in turn leak the sensitive private key of the root user.\n\n```\ncurl http://localhost:8080/public/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/root/.ssh/id_rsa\n```\n**Note** `%2e` is the URL encoded version of `.` (dot).\n\n- **Writing arbitrary files**: Allows the attacker to create or replace existing files. This type of vulnerability is also known as `Zip-Slip`. \n\nOne way to achieve this is by using a malicious `zip` archive that holds path traversal filenames. When each filename in the zip archive gets concatenated to the target extraction folder, without validation, the final path ends up outside of the target folder. If an executable or a configuration file is overwritten with a file containing malicious code, the problem can turn into an arbitrary code execution issue quite easily.\n\nThe following is an example of a `zip` archive with one benign file and one malicious file. Extracting the malicious file will result in traversing out of the target folder, ending up in `/root/.ssh/` overwriting the `authorized_keys` file:\n\n```\n2018-04-15 22:04:29 ..... 19 19 good.txt\n2018-04-15 22:04:42 ..... 20 20 ../../../../../../root/.ssh/authorized_keys\n```\n\n## Remediation\nUpgrade `django` to version 2.2.18, 3.0.12, 3.1.6 or higher.\n## References\n- [Django Advisory](https://www.djangoproject.com/weblog/2021/feb/01/security-releases/)\n- [GitHub Commit](https://github.com/django/django/commit/05413afa8c18cdb978fcdf470e09f7a12b234a23)\n", + "disclosureTime": "2021-02-01T12:56:31Z", + "exploit": "Not Defined", + "fixedIn": [ + "2.2.18", + "3.0.12", + "3.1.6" + ], + "functions": [], + "functions_new": [], + "id": "SNYK-PYTHON-DJANGO-1066259", + "identifiers": { + "CVE": [ + "CVE-2021-3281" + ], + "CWE": [ + "CWE-22" + ] + }, + "language": "python", + "modificationTime": "2021-02-01T15:11:08.053324Z", + "moduleName": "django", + "packageManager": "pip", + "packageName": "django", + "patches": [], + "proprietary": false, + "publicationTime": "2021-02-01T15:11:08.261009Z", + "references": [ + { + "title": "Django Advisory", + "url": "https://www.djangoproject.com/weblog/2021/feb/01/security-releases/" + }, + { + "title": "GitHub Commit", + "url": "https://github.com/django/django/commit/05413afa8c18cdb978fcdf470e09f7a12b234a23" + } + ], + "semver": { + "vulnerable": [ + "[1.4,2.2.18)", + "[3.0a1,3.0.12)", + "[3.1a1,3.1.6)" + ] + }, + "severity": "medium", + "originalSeverity": "low", + "severityWithCritical": "medium", + "title": "Directory Traversal", + "from": [ + "pip-app@0.0.0", + "django@1.6.1" + ], + "appliedPolicyRules": { + "annotation": { + }, + "severityChange": { + "newSeverity": "medium", + "originalSeverity": "low", + "reason": "Not a long running service" + } + }, + "upgradePath": [], + "isUpgradable": false, + "isPatchable": false, + "name": "django", + "version": "1.6.1" + }, + { + "CVSSv3": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:N", + "alternativeIds": [], + "creationTime": "2019-01-08T15:45:12.317736Z", + "credit": [ + "Jerbi Nessim" + ], + "cvssScore": 4.3, + "description": "## Overview\n[django](https://pypi.org/project/Django/) is a high-level Python Web framework that encourages rapid development and clean, pragmatic design.\n\nAffected versions of this package are vulnerable to Content Spoofing. The default 404 page did not properly handle user-supplied data, an attacker could supply content to the web application, typically via a parameter value, that is reflected back to the user. This presented the user with a modified page under the context of the trusted domain.\n## Remediation\nUpgrade `django` to version 1.11.18, 2.0.10, 2.1.5 or higher.\n## References\n- [Django Project Security Blog](https://www.djangoproject.com/weblog/2019/jan/04/security-releases/)\n- [GitHub Commit](https://github.com/django/django/commit/1ecc0a395)\n- [RedHat Bugzilla Bug](https://bugzilla.redhat.com/show_bug.cgi?id=1663722)\n", + "disclosureTime": "2019-01-04T22:34:17Z", + "exploit": "Not Defined", + "fixedIn": [ + "1.11.18", + "2.0.10", + "2.1.5" + ], + "functions": [], + "functions_new": [], + "id": "SNYK-PYTHON-DJANGO-72888", + "identifiers": { + "CVE": [ + "CVE-2019-3498" + ], + "CWE": [ + "CWE-148" + ] + }, + "language": "python", + "modificationTime": "2020-06-12T14:36:55.736404Z", + "moduleName": "django", + "packageManager": "pip", + "packageName": "django", + "patches": [], + "proprietary": false, + "publicationTime": "2019-01-08T16:10:39.792267Z", + "references": [ + { + "title": "Django Project Security Blog", + "url": "https://www.djangoproject.com/weblog/2019/jan/04/security-releases/" + }, + { + "title": "GitHub Commit", + "url": "https://github.com/django/django/commit/1ecc0a395" + }, + { + "title": "RedHat Bugzilla Bug", + "url": "https://bugzilla.redhat.com/show_bug.cgi?id=1663722" + } + ], + "semver": { + "vulnerable": [ + "[,1.11.18)", + "[2.0.0, 2.0.10)", + "[2.1.0, 2.1.5)" + ] + }, + "severity": "medium", + "severityWithCritical": "medium", + "title": "Content Spoofing", + "from": [ + "pip-app@0.0.0", + "django@1.6.1" + ], + "upgradePath": [], + "isUpgradable": false, + "isPatchable": false, + "name": "django", + "version": "1.6.1" + } + ], + "ok": false, + "dependencyCount": 2, + "org": "lili", + "policy": "# Snyk (https://snyk.io) policy file, patches or ignores known vulnerabilities.\nversion: v1.19.0\nignore: {}\npatch: {}\n", + "isPrivate": true, + "licensesPolicy": { + "severities": {}, + "orgLicenseRules": { + "AGPL-1.0": { + "licenseType": "AGPL-1.0", + "severity": "high", + "instructions": "" + }, + "AGPL-3.0": { + "licenseType": "AGPL-3.0", + "severity": "high", + "instructions": "" + }, + "Artistic-1.0": { + "licenseType": "Artistic-1.0", + "severity": "medium", + "instructions": "" + }, + "Artistic-2.0": { + "licenseType": "Artistic-2.0", + "severity": "medium", + "instructions": "" + }, + "CDDL-1.0": { + "licenseType": "CDDL-1.0", + "severity": "medium", + "instructions": "" + }, + "CPOL-1.02": { + "licenseType": "CPOL-1.02", + "severity": "high", + "instructions": "" + }, + "EPL-1.0": { + "licenseType": "EPL-1.0", + "severity": "medium", + "instructions": "" + }, + "GPL-2.0": { + "licenseType": "GPL-2.0", + "severity": "high", + "instructions": "" + }, + "GPL-3.0": { + "licenseType": "GPL-3.0", + "severity": "high", + "instructions": "" + }, + "LGPL-2.0": { + "licenseType": "LGPL-2.0", + "severity": "medium", + "instructions": "" + }, + "LGPL-2.1": { + "licenseType": "LGPL-2.1", + "severity": "medium", + "instructions": "" + }, + "LGPL-3.0": { + "licenseType": "LGPL-3.0", + "severity": "medium", + "instructions": "" + }, + "MPL-1.1": { + "licenseType": "MPL-1.1", + "severity": "medium", + "instructions": "" + }, + "MPL-2.0": { + "licenseType": "MPL-2.0", + "severity": "medium", + "instructions": "" + }, + "MS-RL": { + "licenseType": "MS-RL", + "severity": "medium", + "instructions": "" + }, + "SimPL-2.0": { + "licenseType": "SimPL-2.0", + "severity": "high", + "instructions": "" + }, + "MIT": { + "licenseType": "MIT", + "severity": "high", + "instructions": "Not suitable to use, please find a different package." + } + } + }, + "packageManager": "pip", + "ignoreSettings": null, + "summary": "32 vulnerable dependency paths", + "remediation": { + "unresolved": [ + { + "CVSSv3": "CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:L/I:N/A:N", + "alternativeIds": [], + "creationTime": "2021-02-01T13:11:56.558734Z", + "credit": [ + "Wang Baohua" + ], + "cvssScore": 3.1, + "description": "## Overview\n[django](https://pypi.org/project/Django/) is a high-level Python Web framework that encourages rapid development and clean, pragmatic design.\n\nAffected versions of this package are vulnerable to Directory Traversal via the `django.utils.archive.extract()` function, which is used by `startapp --template` and `startproject --template`. This can happen via an archive with absolute paths or relative paths with dot segments.\n\n## Details\n\nA Directory Traversal attack (also known as path traversal) aims to access files and directories that are stored outside the intended folder. By manipulating files with \"dot-dot-slash (../)\" sequences and its variations, or by using absolute file paths, it may be possible to access arbitrary files and directories stored on file system, including application source code, configuration, and other critical system files.\n\nDirectory Traversal vulnerabilities can be generally divided into two types:\n\n- **Information Disclosure**: Allows the attacker to gain information about the folder structure or read the contents of sensitive files on the system.\n\n`st` is a module for serving static files on web pages, and contains a [vulnerability of this type](https://snyk.io/vuln/npm:st:20140206). In our example, we will serve files from the `public` route.\n\nIf an attacker requests the following URL from our server, it will in turn leak the sensitive private key of the root user.\n\n```\ncurl http://localhost:8080/public/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/root/.ssh/id_rsa\n```\n**Note** `%2e` is the URL encoded version of `.` (dot).\n\n- **Writing arbitrary files**: Allows the attacker to create or replace existing files. This type of vulnerability is also known as `Zip-Slip`. \n\nOne way to achieve this is by using a malicious `zip` archive that holds path traversal filenames. When each filename in the zip archive gets concatenated to the target extraction folder, without validation, the final path ends up outside of the target folder. If an executable or a configuration file is overwritten with a file containing malicious code, the problem can turn into an arbitrary code execution issue quite easily.\n\nThe following is an example of a `zip` archive with one benign file and one malicious file. Extracting the malicious file will result in traversing out of the target folder, ending up in `/root/.ssh/` overwriting the `authorized_keys` file:\n\n```\n2018-04-15 22:04:29 ..... 19 19 good.txt\n2018-04-15 22:04:42 ..... 20 20 ../../../../../../root/.ssh/authorized_keys\n```\n\n## Remediation\nUpgrade `django` to version 2.2.18, 3.0.12, 3.1.6 or higher.\n## References\n- [Django Advisory](https://www.djangoproject.com/weblog/2021/feb/01/security-releases/)\n- [GitHub Commit](https://github.com/django/django/commit/05413afa8c18cdb978fcdf470e09f7a12b234a23)\n", + "disclosureTime": "2021-02-01T12:56:31Z", + "exploit": "Not Defined", + "fixedIn": [ + "2.2.18", + "3.0.12", + "3.1.6" + ], + "functions": [], + "functions_new": [], + "id": "SNYK-PYTHON-DJANGO-1066259", + "identifiers": { + "CVE": [ + "CVE-2021-3281" + ], + "CWE": [ + "CWE-22" + ] + }, + "language": "python", + "modificationTime": "2021-02-01T15:11:08.053324Z", + "moduleName": "django", + "packageManager": "pip", + "packageName": "django", + "patches": [], + "proprietary": false, + "publicationTime": "2021-02-01T15:11:08.261009Z", + "references": [ + { + "title": "Django Advisory", + "url": "https://www.djangoproject.com/weblog/2021/feb/01/security-releases/" + }, + { + "title": "GitHub Commit", + "url": "https://github.com/django/django/commit/05413afa8c18cdb978fcdf470e09f7a12b234a23" + } + ], + "semver": { + "vulnerable": [ + "[1.4,2.2.18)", + "[3.0a1,3.0.12)", + "[3.1a1,3.1.6)" + ] + }, + "severity": "low", + "severityWithCritical": "low", + "title": "Directory Traversal", + "from": [ + "pip-app@0.0.0", + "django@1.6.1" + ], + "upgradePath": [], + "isUpgradable": false, + "isPatchable": false, + "isPinnable": true, + "name": "django", + "version": "1.6.1" + } + ], + "upgrade": {}, + "patch": {}, + "ignore": {}, + "pin": { + "django@1.6.1": { + "upgradeTo": "django@2.2.18", + "vulns": [ + "SNYK-PYTHON-DJANGO-72888" + ], + "isTransitive": false + } + } + }, + "filesystemPolicy": false, + "filtered": { + "ignore": [], + "patch": [] + }, + "uniqueCount": 32, + "projectName": "pip-app", + "foundProjectCount": 2, + "displayTargetFile": "requirements.txt" +} diff --git a/test/fixtures/sca-dep-graph-with-annotation/test-graph-user-note-results.json b/test/fixtures/sca-dep-graph-with-annotation/test-graph-user-note-results.json new file mode 100644 index 0000000000..2773c2b4a1 --- /dev/null +++ b/test/fixtures/sca-dep-graph-with-annotation/test-graph-user-note-results.json @@ -0,0 +1,333 @@ +{ + "vulnerabilities": [ + { + "CVSSv3": "CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:L/I:N/A:N", + "alternativeIds": [], + "creationTime": "2021-02-01T13:11:56.558734Z", + "credit": [ + "Wang Baohua" + ], + "cvssScore": 3.1, + "description": "## Overview\n[django](https://pypi.org/project/Django/) is a high-level Python Web framework that encourages rapid development and clean, pragmatic design.\n\nAffected versions of this package are vulnerable to Directory Traversal via the `django.utils.archive.extract()` function, which is used by `startapp --template` and `startproject --template`. This can happen via an archive with absolute paths or relative paths with dot segments.\n\n## Details\n\nA Directory Traversal attack (also known as path traversal) aims to access files and directories that are stored outside the intended folder. By manipulating files with \"dot-dot-slash (../)\" sequences and its variations, or by using absolute file paths, it may be possible to access arbitrary files and directories stored on file system, including application source code, configuration, and other critical system files.\n\nDirectory Traversal vulnerabilities can be generally divided into two types:\n\n- **Information Disclosure**: Allows the attacker to gain information about the folder structure or read the contents of sensitive files on the system.\n\n`st` is a module for serving static files on web pages, and contains a [vulnerability of this type](https://snyk.io/vuln/npm:st:20140206). In our example, we will serve files from the `public` route.\n\nIf an attacker requests the following URL from our server, it will in turn leak the sensitive private key of the root user.\n\n```\ncurl http://localhost:8080/public/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/root/.ssh/id_rsa\n```\n**Note** `%2e` is the URL encoded version of `.` (dot).\n\n- **Writing arbitrary files**: Allows the attacker to create or replace existing files. This type of vulnerability is also known as `Zip-Slip`. \n\nOne way to achieve this is by using a malicious `zip` archive that holds path traversal filenames. When each filename in the zip archive gets concatenated to the target extraction folder, without validation, the final path ends up outside of the target folder. If an executable or a configuration file is overwritten with a file containing malicious code, the problem can turn into an arbitrary code execution issue quite easily.\n\nThe following is an example of a `zip` archive with one benign file and one malicious file. Extracting the malicious file will result in traversing out of the target folder, ending up in `/root/.ssh/` overwriting the `authorized_keys` file:\n\n```\n2018-04-15 22:04:29 ..... 19 19 good.txt\n2018-04-15 22:04:42 ..... 20 20 ../../../../../../root/.ssh/authorized_keys\n```\n\n## Remediation\nUpgrade `django` to version 2.2.18, 3.0.12, 3.1.6 or higher.\n## References\n- [Django Advisory](https://www.djangoproject.com/weblog/2021/feb/01/security-releases/)\n- [GitHub Commit](https://github.com/django/django/commit/05413afa8c18cdb978fcdf470e09f7a12b234a23)\n", + "disclosureTime": "2021-02-01T12:56:31Z", + "exploit": "Not Defined", + "fixedIn": [ + "2.2.18", + "3.0.12", + "3.1.6" + ], + "functions": [], + "functions_new": [], + "id": "SNYK-PYTHON-DJANGO-1066259", + "identifiers": { + "CVE": [ + "CVE-2021-3281" + ], + "CWE": [ + "CWE-22" + ] + }, + "language": "python", + "modificationTime": "2021-02-01T15:11:08.053324Z", + "moduleName": "django", + "packageManager": "pip", + "packageName": "django", + "patches": [], + "proprietary": false, + "publicationTime": "2021-02-01T15:11:08.261009Z", + "references": [ + { + "title": "Django Advisory", + "url": "https://www.djangoproject.com/weblog/2021/feb/01/security-releases/" + }, + { + "title": "GitHub Commit", + "url": "https://github.com/django/django/commit/05413afa8c18cdb978fcdf470e09f7a12b234a23" + } + ], + "semver": { + "vulnerable": [ + "[1.4,2.2.18)", + "[3.0a1,3.0.12)", + "[3.1a1,3.1.6)" + ] + }, + "severity": "low", + "severityWithCritical": "low", + "title": "Directory Traversal", + "from": [ + "pip-app@0.0.0", + "django@1.6.1" + ], + "appliedPolicyRules": { + "annotation": { + "value": "Papercut", + "reason": "This vulnerability is a papercut and can be ignored" + } + }, + "upgradePath": [], + "isUpgradable": false, + "isPatchable": false, + "name": "django", + "version": "1.6.1" + }, + { + "CVSSv3": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:N", + "alternativeIds": [], + "creationTime": "2019-01-08T15:45:12.317736Z", + "credit": [ + "Jerbi Nessim" + ], + "cvssScore": 4.3, + "description": "## Overview\n[django](https://pypi.org/project/Django/) is a high-level Python Web framework that encourages rapid development and clean, pragmatic design.\n\nAffected versions of this package are vulnerable to Content Spoofing. The default 404 page did not properly handle user-supplied data, an attacker could supply content to the web application, typically via a parameter value, that is reflected back to the user. This presented the user with a modified page under the context of the trusted domain.\n## Remediation\nUpgrade `django` to version 1.11.18, 2.0.10, 2.1.5 or higher.\n## References\n- [Django Project Security Blog](https://www.djangoproject.com/weblog/2019/jan/04/security-releases/)\n- [GitHub Commit](https://github.com/django/django/commit/1ecc0a395)\n- [RedHat Bugzilla Bug](https://bugzilla.redhat.com/show_bug.cgi?id=1663722)\n", + "disclosureTime": "2019-01-04T22:34:17Z", + "exploit": "Not Defined", + "fixedIn": [ + "1.11.18", + "2.0.10", + "2.1.5" + ], + "functions": [], + "functions_new": [], + "id": "SNYK-PYTHON-DJANGO-72888", + "identifiers": { + "CVE": [ + "CVE-2019-3498" + ], + "CWE": [ + "CWE-148" + ] + }, + "language": "python", + "modificationTime": "2020-06-12T14:36:55.736404Z", + "moduleName": "django", + "packageManager": "pip", + "packageName": "django", + "patches": [], + "proprietary": false, + "publicationTime": "2019-01-08T16:10:39.792267Z", + "references": [ + { + "title": "Django Project Security Blog", + "url": "https://www.djangoproject.com/weblog/2019/jan/04/security-releases/" + }, + { + "title": "GitHub Commit", + "url": "https://github.com/django/django/commit/1ecc0a395" + }, + { + "title": "RedHat Bugzilla Bug", + "url": "https://bugzilla.redhat.com/show_bug.cgi?id=1663722" + } + ], + "semver": { + "vulnerable": [ + "[,1.11.18)", + "[2.0.0, 2.0.10)", + "[2.1.0, 2.1.5)" + ] + }, + "severity": "medium", + "severityWithCritical": "medium", + "title": "Content Spoofing", + "from": [ + "pip-app@0.0.0", + "django@1.6.1" + ], + "upgradePath": [], + "isUpgradable": false, + "isPatchable": false, + "name": "django", + "version": "1.6.1" + } + ], + "ok": false, + "dependencyCount": 2, + "org": "lili", + "policy": "# Snyk (https://snyk.io) policy file, patches or ignores known vulnerabilities.\nversion: v1.19.0\nignore: {}\npatch: {}\n", + "isPrivate": true, + "licensesPolicy": { + "severities": {}, + "orgLicenseRules": { + "AGPL-1.0": { + "licenseType": "AGPL-1.0", + "severity": "high", + "instructions": "" + }, + "AGPL-3.0": { + "licenseType": "AGPL-3.0", + "severity": "high", + "instructions": "" + }, + "Artistic-1.0": { + "licenseType": "Artistic-1.0", + "severity": "medium", + "instructions": "" + }, + "Artistic-2.0": { + "licenseType": "Artistic-2.0", + "severity": "medium", + "instructions": "" + }, + "CDDL-1.0": { + "licenseType": "CDDL-1.0", + "severity": "medium", + "instructions": "" + }, + "CPOL-1.02": { + "licenseType": "CPOL-1.02", + "severity": "high", + "instructions": "" + }, + "EPL-1.0": { + "licenseType": "EPL-1.0", + "severity": "medium", + "instructions": "" + }, + "GPL-2.0": { + "licenseType": "GPL-2.0", + "severity": "high", + "instructions": "" + }, + "GPL-3.0": { + "licenseType": "GPL-3.0", + "severity": "high", + "instructions": "" + }, + "LGPL-2.0": { + "licenseType": "LGPL-2.0", + "severity": "medium", + "instructions": "" + }, + "LGPL-2.1": { + "licenseType": "LGPL-2.1", + "severity": "medium", + "instructions": "" + }, + "LGPL-3.0": { + "licenseType": "LGPL-3.0", + "severity": "medium", + "instructions": "" + }, + "MPL-1.1": { + "licenseType": "MPL-1.1", + "severity": "medium", + "instructions": "" + }, + "MPL-2.0": { + "licenseType": "MPL-2.0", + "severity": "medium", + "instructions": "" + }, + "MS-RL": { + "licenseType": "MS-RL", + "severity": "medium", + "instructions": "" + }, + "SimPL-2.0": { + "licenseType": "SimPL-2.0", + "severity": "high", + "instructions": "" + }, + "MIT": { + "licenseType": "MIT", + "severity": "high", + "instructions": "Not suitable to use, please find a different package." + } + } + }, + "packageManager": "pip", + "ignoreSettings": null, + "summary": "32 vulnerable dependency paths", + "remediation": { + "unresolved": [ + { + "CVSSv3": "CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:L/I:N/A:N", + "alternativeIds": [], + "creationTime": "2021-02-01T13:11:56.558734Z", + "credit": [ + "Wang Baohua" + ], + "cvssScore": 3.1, + "description": "## Overview\n[django](https://pypi.org/project/Django/) is a high-level Python Web framework that encourages rapid development and clean, pragmatic design.\n\nAffected versions of this package are vulnerable to Directory Traversal via the `django.utils.archive.extract()` function, which is used by `startapp --template` and `startproject --template`. This can happen via an archive with absolute paths or relative paths with dot segments.\n\n## Details\n\nA Directory Traversal attack (also known as path traversal) aims to access files and directories that are stored outside the intended folder. By manipulating files with \"dot-dot-slash (../)\" sequences and its variations, or by using absolute file paths, it may be possible to access arbitrary files and directories stored on file system, including application source code, configuration, and other critical system files.\n\nDirectory Traversal vulnerabilities can be generally divided into two types:\n\n- **Information Disclosure**: Allows the attacker to gain information about the folder structure or read the contents of sensitive files on the system.\n\n`st` is a module for serving static files on web pages, and contains a [vulnerability of this type](https://snyk.io/vuln/npm:st:20140206). In our example, we will serve files from the `public` route.\n\nIf an attacker requests the following URL from our server, it will in turn leak the sensitive private key of the root user.\n\n```\ncurl http://localhost:8080/public/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/root/.ssh/id_rsa\n```\n**Note** `%2e` is the URL encoded version of `.` (dot).\n\n- **Writing arbitrary files**: Allows the attacker to create or replace existing files. This type of vulnerability is also known as `Zip-Slip`. \n\nOne way to achieve this is by using a malicious `zip` archive that holds path traversal filenames. When each filename in the zip archive gets concatenated to the target extraction folder, without validation, the final path ends up outside of the target folder. If an executable or a configuration file is overwritten with a file containing malicious code, the problem can turn into an arbitrary code execution issue quite easily.\n\nThe following is an example of a `zip` archive with one benign file and one malicious file. Extracting the malicious file will result in traversing out of the target folder, ending up in `/root/.ssh/` overwriting the `authorized_keys` file:\n\n```\n2018-04-15 22:04:29 ..... 19 19 good.txt\n2018-04-15 22:04:42 ..... 20 20 ../../../../../../root/.ssh/authorized_keys\n```\n\n## Remediation\nUpgrade `django` to version 2.2.18, 3.0.12, 3.1.6 or higher.\n## References\n- [Django Advisory](https://www.djangoproject.com/weblog/2021/feb/01/security-releases/)\n- [GitHub Commit](https://github.com/django/django/commit/05413afa8c18cdb978fcdf470e09f7a12b234a23)\n", + "disclosureTime": "2021-02-01T12:56:31Z", + "exploit": "Not Defined", + "fixedIn": [ + "2.2.18", + "3.0.12", + "3.1.6" + ], + "functions": [], + "functions_new": [], + "id": "SNYK-PYTHON-DJANGO-1066259", + "identifiers": { + "CVE": [ + "CVE-2021-3281" + ], + "CWE": [ + "CWE-22" + ] + }, + "language": "python", + "modificationTime": "2021-02-01T15:11:08.053324Z", + "moduleName": "django", + "packageManager": "pip", + "packageName": "django", + "patches": [], + "proprietary": false, + "publicationTime": "2021-02-01T15:11:08.261009Z", + "references": [ + { + "title": "Django Advisory", + "url": "https://www.djangoproject.com/weblog/2021/feb/01/security-releases/" + }, + { + "title": "GitHub Commit", + "url": "https://github.com/django/django/commit/05413afa8c18cdb978fcdf470e09f7a12b234a23" + } + ], + "semver": { + "vulnerable": [ + "[1.4,2.2.18)", + "[3.0a1,3.0.12)", + "[3.1a1,3.1.6)" + ] + }, + "severity": "low", + "severityWithCritical": "low", + "title": "Directory Traversal", + "from": [ + "pip-app@0.0.0", + "django@1.6.1" + ], + "upgradePath": [], + "isUpgradable": false, + "isPatchable": false, + "isPinnable": true, + "name": "django", + "version": "1.6.1" + } + ], + "upgrade": {}, + "patch": {}, + "ignore": {}, + "pin": { + "django@1.6.1": { + "upgradeTo": "django@2.2.18", + "vulns": [ + "SNYK-PYTHON-DJANGO-72888" + ], + "isTransitive": false + } + } + }, + "filesystemPolicy": false, + "filtered": { + "ignore": [], + "patch": [] + }, + "uniqueCount": 32, + "projectName": "pip-app", + "foundProjectCount": 2, + "displayTargetFile": "requirements.txt" +} diff --git a/test/jest/acceptance/snyk-test/human-formatted-output.spec.ts b/test/jest/acceptance/snyk-test/human-formatted-output.spec.ts new file mode 100644 index 0000000000..19e2a2d807 --- /dev/null +++ b/test/jest/acceptance/snyk-test/human-formatted-output.spec.ts @@ -0,0 +1,66 @@ +import { fakeServer } from '../../../acceptance/fake-server'; +import { createProjectFromWorkspace } from '../../util/createProject'; +import { getServerPort } from '../../util/getServerPort'; +import { runSnykCLI } from '../../util/runSnykCLI'; +const stripAnsi = require('strip-ansi'); + +jest.setTimeout(1000 * 60); + +describe('test formatting for human consumption', () => { + let server: ReturnType; + let env: Record; + + beforeAll((done) => { + const apiPath = '/api/v1'; + const apiPort = getServerPort(process); + env = { + ...process.env, + SNYK_API: 'http://localhost:' + apiPort + apiPath, + SNYK_TOKEN: '123456789', + SNYK_DISABLE_ANALYTICS: '1', + }; + + server = fakeServer(apiPath, env.SNYK_TOKEN); + server.listen(apiPort, () => done()); + }); + + afterEach(() => { + server.restore(); + }); + + afterAll((done) => { + server.close(() => done()); + }); + + it('includes a summary of vulnerabilites and paths', async () => { + const project = await createProjectFromWorkspace('npm-package-single-vuln'); + server.setCustomResponse(await project.readJSON('test-graph-results.json')); + + const { code, stdout } = await runSnykCLI(`test`, { + cwd: project.path(), + env, + }); + + expect(code).toEqual(1); + expect(stripAnsi(stdout)).toContain( + 'Tested 1 dependencies for known issues, found 1 issue, 1 vulnerable path.', + ); + expect(server.getRequests().length).toBeGreaterThanOrEqual(1); + }); + + it('includes a user note and reason', async () => { + const project = await createProjectFromWorkspace('npm-package-single-vuln'); + server.setCustomResponse( + await project.readJSON('test-graph-results-with-annotation.json'), + ); + + const { code, stdout } = await runSnykCLI(`test`, { + cwd: project.path(), + env, + }); + + expect(code).toEqual(1); + expect(stripAnsi(stdout)).toContain('User note: This is a test user note'); + expect(server.getRequests().length).toBeGreaterThanOrEqual(1); + }); +}); diff --git a/test/jest/unit/lib/formatters/__snapshots__/remediation-based-format-issues.spec.ts.snap b/test/jest/unit/lib/formatters/__snapshots__/remediation-based-format-issues.spec.ts.snap index 2b73b1ae70..2b8c1c7bd6 100644 --- a/test/jest/unit/lib/formatters/__snapshots__/remediation-based-format-issues.spec.ts.snap +++ b/test/jest/unit/lib/formatters/__snapshots__/remediation-based-format-issues.spec.ts.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`with license issues 1`] = ` +exports[`formatIssuesWithRemediation with license issues 1`] = ` " Issues to fix by upgrading: @@ -47,7 +47,7 @@ License issues: ○ for LGPL-3.0 license: I am legal license instruction" `; -exports[`with pins & unfixable & showVulnsPaths = all 1`] = ` +exports[`formatIssuesWithRemediation with pins & unfixable & showVulnsPaths = all 1`] = ` " Issues to fix by upgrading dependencies: @@ -64,7 +64,7 @@ Issues with no direct upgrade or patch: This issue was fixed in versions: 2.2.18, 3.0.12, 3.1.6" `; -exports[`with showVulnPaths = some 1`] = ` +exports[`formatIssuesWithRemediation with showVulnPaths = some 1`] = ` " Issues to fix by upgrading dependencies: @@ -79,7 +79,7 @@ Issues with no direct upgrade or patch: This issue was fixed in versions: 2.2.18, 3.0.12, 3.1.6" `; -exports[`with upgrades & patches 1`] = ` +exports[`formatIssuesWithRemediation with upgrades & patches 1`] = ` " Issues to fix by upgrading: diff --git a/test/jest/unit/lib/formatters/remediation-based-format-issues.spec.ts b/test/jest/unit/lib/formatters/remediation-based-format-issues.spec.ts index fb415b3509..ace1be5965 100644 --- a/test/jest/unit/lib/formatters/remediation-based-format-issues.spec.ts +++ b/test/jest/unit/lib/formatters/remediation-based-format-issues.spec.ts @@ -6,105 +6,172 @@ import { formatIssuesWithRemediation } from '../../../../../src/lib/formatters/r import { getFixturePath } from '../../../util/getFixturePath'; import { getWorkspacePath } from '../../../util/getWorkspacePath'; -it('with pins & unfixable & showVulnsPaths = all', () => { - const withRemediation = JSON.parse( - fs.readFileSync( - getFixturePath('pip-app-with-remediation/test-graph-results.json'), - 'utf8', - ), - ); - const groupedVulns = groupVulnerabilities(withRemediation.vulnerabilities); - - const sortedGroupedVulns = orderBy( - groupedVulns, - ['metadata.severityValue', 'metadata.name'], - ['asc', 'desc'], - ); - - const res = formatIssuesWithRemediation( - sortedGroupedVulns, - withRemediation.remediation, - { showVulnPaths: 'all' }, - ); - expect( - stripAnsi(res.join('\n').replace(/\[http.*\]/g, '[URL]')), - ).toMatchSnapshot(); -}); +describe('formatIssuesWithRemediation', () => { + it('with pins & unfixable & showVulnsPaths = all', () => { + const withRemediation = JSON.parse( + fs.readFileSync( + getFixturePath('pip-app-with-remediation/test-graph-results.json'), + 'utf8', + ), + ); + const groupedVulns = groupVulnerabilities(withRemediation.vulnerabilities); -it('with showVulnPaths = some', () => { - const withRemediation = JSON.parse( - fs.readFileSync( - getFixturePath('pip-app-with-remediation/test-graph-results.json'), - 'utf8', - ), - ); - const groupedVulns = groupVulnerabilities(withRemediation.vulnerabilities); - - const sortedGroupedVulns = orderBy( - groupedVulns, - ['metadata.severityValue', 'metadata.name'], - ['asc', 'desc'], - ); - - const res = formatIssuesWithRemediation( - sortedGroupedVulns, - withRemediation.remediation, - { showVulnPaths: 'some' }, - ); - expect( - stripAnsi(res.join('\n').replace(/\[http.*\]/g, '[URL]')), - ).toMatchSnapshot(); -}); -it('with upgrades & patches', () => { - const withRemediation = JSON.parse( - fs.readFileSync( - getFixturePath( - 'npm-package-with-severity-override/test-graph-result-patches.json', + const sortedGroupedVulns = orderBy( + groupedVulns, + ['metadata.severityValue', 'metadata.name'], + ['asc', 'desc'], + ); + + const res = formatIssuesWithRemediation( + sortedGroupedVulns, + withRemediation.remediation, + { showVulnPaths: 'all' }, + ); + expect( + stripAnsi(res.join('\n').replace(/\[http.*\]/g, '[URL]')), + ).toMatchSnapshot(); + }); + + it('with showVulnPaths = some', () => { + const withRemediation = JSON.parse( + fs.readFileSync( + getFixturePath('pip-app-with-remediation/test-graph-results.json'), + 'utf8', ), - 'utf8', - ), - ); - const groupedVulns = groupVulnerabilities(withRemediation.vulnerabilities); - - const sortedGroupedVulns = orderBy( - groupedVulns, - ['metadata.severityValue', 'metadata.name'], - ['asc', 'desc'], - ); - - const res = formatIssuesWithRemediation( - sortedGroupedVulns, - withRemediation.remediation, - { showVulnPaths: 'all' }, - ); - expect( - stripAnsi(res.join('\n').replace(/\[http.*\]/g, '[URL]')), - ).toMatchSnapshot(); -}); + ); + const groupedVulns = groupVulnerabilities(withRemediation.vulnerabilities); + + const sortedGroupedVulns = orderBy( + groupedVulns, + ['metadata.severityValue', 'metadata.name'], + ['asc', 'desc'], + ); -it('with license issues', () => { - const withRemediation = JSON.parse( - fs.readFileSync( - getWorkspacePath( - 'ruby-app/test-graph-response-with-legal-instruction.json', + const res = formatIssuesWithRemediation( + sortedGroupedVulns, + withRemediation.remediation, + { showVulnPaths: 'some' }, + ); + expect( + stripAnsi(res.join('\n').replace(/\[http.*\]/g, '[URL]')), + ).toMatchSnapshot(); + }); + + it('with upgrades & patches', () => { + const withRemediation = JSON.parse( + fs.readFileSync( + getFixturePath( + 'npm-package-with-severity-override/test-graph-result-patches.json', + ), + 'utf8', + ), + ); + const groupedVulns = groupVulnerabilities(withRemediation.vulnerabilities); + + const sortedGroupedVulns = orderBy( + groupedVulns, + ['metadata.severityValue', 'metadata.name'], + ['asc', 'desc'], + ); + + const res = formatIssuesWithRemediation( + sortedGroupedVulns, + withRemediation.remediation, + { showVulnPaths: 'all' }, + ); + expect( + stripAnsi(res.join('\n').replace(/\[http.*\]/g, '[URL]')), + ).toMatchSnapshot(); + }); + + it('with license issues', () => { + const withRemediation = JSON.parse( + fs.readFileSync( + getWorkspacePath( + 'ruby-app/test-graph-response-with-legal-instruction.json', + ), + 'utf8', ), - 'utf8', - ), - ); - const groupedVulns = groupVulnerabilities(withRemediation.vulnerabilities); - - const sortedGroupedVulns = orderBy( - groupedVulns, - ['metadata.severityValue', 'metadata.name'], - ['asc', 'desc'], - ); - - const res = formatIssuesWithRemediation( - sortedGroupedVulns, - withRemediation.remediation, - { showVulnPaths: 'all' }, - ); - expect( - stripAnsi(res.join('\n').replace(/\[http.*\]/g, '[URL]')), - ).toMatchSnapshot(); + ); + const groupedVulns = groupVulnerabilities(withRemediation.vulnerabilities); + + const sortedGroupedVulns = orderBy( + groupedVulns, + ['metadata.severityValue', 'metadata.name'], + ['asc', 'desc'], + ); + + const res = formatIssuesWithRemediation( + sortedGroupedVulns, + withRemediation.remediation, + { showVulnPaths: 'all' }, + ); + expect( + stripAnsi(res.join('\n').replace(/\[http.*\]/g, '[URL]')), + ).toMatchSnapshot(); + }); + + it('includes severity change reason', () => { + const withRemediation = JSON.parse( + fs.readFileSync( + getFixturePath('sca-dep-graph-with-annotation/test-graph-results.json'), + 'utf8', + ), + ); + const groupedVulns = groupVulnerabilities(withRemediation.vulnerabilities); + + const sortedGroupedVulns = orderBy( + groupedVulns, + ['metadata.severityValue', 'metadata.name'], + ['asc', 'desc'], + ); + + const res = formatIssuesWithRemediation( + sortedGroupedVulns, + withRemediation.remediation, + { showVulnPaths: 'all' }, + ); + const plainText = res.join('\n'); + expect(plainText).toContain('Severity reason: Not a long running service'); + + // Severity reason should only appear when attribute is present + const rgex = new RegExp(/Severity reason/, 'g'); + expect(plainText.match(rgex)).toHaveLength(1); + }); + + it('includes user note and reason when available', () => { + const withRemediation = JSON.parse( + fs.readFileSync( + getFixturePath( + 'sca-dep-graph-with-annotation/test-graph-user-note-results.json', + ), + 'utf8', + ), + ); + const groupedVulns = groupVulnerabilities(withRemediation.vulnerabilities); + + const sortedGroupedVulns = orderBy( + groupedVulns, + ['metadata.severityValue', 'metadata.name'], + ['asc', 'desc'], + ); + + const res = formatIssuesWithRemediation( + sortedGroupedVulns, + withRemediation.remediation, + { showVulnPaths: 'all' }, + ); + const plainText = res.join('\n'); + expect(plainText).toContain('User note: Papercut'); + expect(plainText).toContain( + 'Note reason: This vulnerability is a papercut and can be ignored', + ); + + // User note should only appear when attribute is present + const rgex = new RegExp(/User note/, 'g'); + expect(plainText.match(rgex)).toHaveLength(1); + + const rgex2 = new RegExp(/Note reason/, 'g'); + expect(plainText.match(rgex2)).toHaveLength(1); + }); }); From 86484c942807bfea8f8716b6f1b8760b83219c62 Mon Sep 17 00:00:00 2001 From: JSON Date: Tue, 16 Apr 2024 14:59:20 +0100 Subject: [PATCH 47/58] test: validate applied policy rules in json output (#5167) --- test/jest/acceptance/cli-json-output.spec.ts | 32 ++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/test/jest/acceptance/cli-json-output.spec.ts b/test/jest/acceptance/cli-json-output.spec.ts index d1f4d6de37..1fb65b7b3f 100644 --- a/test/jest/acceptance/cli-json-output.spec.ts +++ b/test/jest/acceptance/cli-json-output.spec.ts @@ -2,6 +2,7 @@ import { fakeServer } from '../../acceptance/fake-server'; import { createProjectFromWorkspace } from '../util/createProject'; import { getServerPort } from '../util/getServerPort'; import { runSnykCLI } from '../util/runSnykCLI'; +import { AppliedPolicyRules } from '../../../src/lib/formatters/types'; import * as Parser from 'jsonparse'; jest.setTimeout(1000 * 60); @@ -133,4 +134,35 @@ describe('test --json', () => { expect(hasReferenceCount).toBeTruthy(); }, 120000); }); + + describe('when policy data is available', () => { + it('includes a user note and reason', async () => { + const project = await createProjectFromWorkspace( + 'npm-package-single-vuln', + ); + server.setCustomResponse( + await project.readJSON('test-graph-results-with-annotation.json'), + ); + + const { code, stdout } = await runSnykCLI(`test --json`, { + cwd: project.path(), + env, + }); + + const expectedPolicyData: AppliedPolicyRules = { + annotation: { + value: 'This is a test user note', + reason: 'This vulnerability is a papercut and can be ignored', + }, + }; + + const returnedJson = JSON.parse(stdout); + const actualPolicyData = + returnedJson.vulnerabilities[0].appliedPolicyRules; + + expect(actualPolicyData).toStrictEqual(expectedPolicyData); + expect(code).toEqual(1); + expect(server.getRequests().length).toBeGreaterThanOrEqual(1); + }); + }); }); From 5400c698a2798672e96c91dd18706c2effebc416 Mon Sep 17 00:00:00 2001 From: PeterSchafer <101886095+PeterSchafer@users.noreply.github.com> Date: Tue, 16 Apr 2024 19:33:18 +0200 Subject: [PATCH 48/58] fix(code): Fix error handling for experimental go native code client (#5170) --- cliv2/cmd/cliv2/main.go | 5 +++-- cliv2/cmd/cliv2/main_test.go | 17 ++++++++++++----- cliv2/internal/cliv2/cliv2.go | 3 ++- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/cliv2/cmd/cliv2/main.go b/cliv2/cmd/cliv2/main.go index cc1017c779..17032084de 100644 --- a/cliv2/cmd/cliv2/main.go +++ b/cliv2/cmd/cliv2/main.go @@ -198,7 +198,7 @@ func getErrorFromWorkFlowData(data []workflow.Data) error { // this should be supported in the future for _, result := range summary.Results { if result.Open > 0 { - return cli_errors.ErrorWithExitCode{ + return &cli_errors.ErrorWithExitCode{ ExitCode: constants.SNYK_EXIT_CODE_VULNERABILITIES_FOUND, } } @@ -371,8 +371,9 @@ func handleError(err error) HandleError { func displayError(err error, output io.Writer, config configuration.Configuration) { if err != nil { var exitError *exec.ExitError + var exitCode *cli_errors.ErrorWithExitCode isExitError := errors.As(err, &exitError) - isErrorWithCode := errors.As(err, &cli_errors.ErrorWithExitCode{}) + isErrorWithCode := errors.As(err, &exitCode) if isExitError || isErrorWithCode { return } diff --git a/cliv2/cmd/cliv2/main_test.go b/cliv2/cmd/cliv2/main_test.go index 3d6d177d74..a8f74f4072 100644 --- a/cliv2/cmd/cliv2/main_test.go +++ b/cliv2/cmd/cliv2/main_test.go @@ -21,6 +21,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "github.com/snyk/cli/cliv2/internal/cliv2" "github.com/snyk/cli/cliv2/internal/constants" clierrors "github.com/snyk/cli/cliv2/internal/errors" ) @@ -253,7 +254,9 @@ func Test_getErrorFromWorkFlowData(t *testing.T) { data := workflow.NewData(workflowIdentifier, content_type.TEST_SUMMARY, payload) err = getErrorFromWorkFlowData([]workflow.Data{data}) require.NotNil(t, err) - assert.ErrorIs(t, err, clierrors.ErrorWithExitCode{ExitCode: constants.SNYK_EXIT_CODE_VULNERABILITIES_FOUND}) + var expectedError *clierrors.ErrorWithExitCode + assert.ErrorAs(t, err, &expectedError) + assert.Equal(t, constants.SNYK_EXIT_CODE_VULNERABILITIES_FOUND, expectedError.ExitCode) }) t.Run("workflow with empty testing findings", func(t *testing.T) { @@ -338,9 +341,13 @@ func Test_runWorkflowAndProcessData(t *testing.T) { // invoke method under test logger := zerolog.New(os.Stderr) err = runWorkflowAndProcessData(globalEngine, &logger, testCmnd) - assert.ErrorIs(t, err, clierrors.ErrorWithExitCode{ - ExitCode: constants.SNYK_EXIT_CODE_VULNERABILITIES_FOUND, - }) + + var expectedError *clierrors.ErrorWithExitCode + assert.ErrorAs(t, err, &expectedError) + assert.Equal(t, constants.SNYK_EXIT_CODE_VULNERABILITIES_FOUND, expectedError.ExitCode) + + actualCode := cliv2.DeriveExitCode(err) + assert.Equal(t, constants.SNYK_EXIT_CODE_VULNERABILITIES_FOUND, actualCode) } func Test_setTimeout(t *testing.T) { @@ -379,7 +386,7 @@ func Test_displayError(t *testing.T) { }, { name: "clierrors.ErrorWithExitCode", - err: clierrors.ErrorWithExitCode{ExitCode: 42}, + err: &clierrors.ErrorWithExitCode{ExitCode: 42}, }, } diff --git a/cliv2/internal/cliv2/cliv2.go b/cliv2/internal/cliv2/cliv2.go index 3f79b10ae5..fec6c23473 100644 --- a/cliv2/internal/cliv2/cliv2.go +++ b/cliv2/internal/cliv2/cliv2.go @@ -18,10 +18,11 @@ import ( "time" "github.com/gofrs/flock" - cli_errors "github.com/snyk/cli/cliv2/internal/errors" "github.com/snyk/go-application-framework/pkg/configuration" "github.com/snyk/go-application-framework/pkg/utils" + cli_errors "github.com/snyk/cli/cliv2/internal/errors" + "github.com/snyk/cli/cliv2/internal/constants" "github.com/snyk/cli/cliv2/internal/embedded" "github.com/snyk/cli/cliv2/internal/embedded/cliv1" From 7c88a448105df02941216ff22b3e720befb7c5b6 Mon Sep 17 00:00:00 2001 From: PeterSchafer <101886095+PeterSchafer@users.noreply.github.com> Date: Wed, 17 Apr 2024 13:56:04 +0200 Subject: [PATCH 49/58] chore: extend commit pattern to allow more complex scope (#5171) --- dangerfile.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dangerfile.js b/dangerfile.js index acca800f56..a9208f89b4 100644 --- a/dangerfile.js +++ b/dangerfile.js @@ -4,7 +4,7 @@ const fs = require('fs'); const MAX_COMMIT_MESSAGE_LENGTH = 72; function checkCommitMessage(commitMessage, url) { - const firstLineRegex = /^(feat|fix|chore|test|docs|refactor|revert)(\([a-z0-9]+\))?:(.+)$/; + const firstLineRegex = /^(feat|fix|chore|test|docs|refactor|revert)(\([a-z0-9-_]+\))?:(.+)$/; if (!firstLineRegex.test(commitMessage)) { fail( `"[${commitMessage}](${url})" is not using a valid commit message format. For commit guidelines, see: [CONTRIBUTING](https://github.com/snyk/snyk/blob/main/CONTRIBUTING.md#creating-commits).`, From 34bbc955d241d619177dcdbf5f45bf02342e2adc Mon Sep 17 00:00:00 2001 From: Luke Watts Date: Wed, 17 Apr 2024 15:42:55 +0200 Subject: [PATCH 50/58] feat(code): introduce human readable formatting for experimental test mechanism (#5174) --- cliv2/go.mod | 10 +++++----- cliv2/go.sum | 35 ++++++++++++++++++++++++++--------- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/cliv2/go.mod b/cliv2/go.mod index a0021eb9d6..71c73706f8 100644 --- a/cliv2/go.mod +++ b/cliv2/go.mod @@ -13,7 +13,7 @@ require ( github.com/snyk/cli-extension-iac-rules v0.0.0-20240404084125-0098857e0e1a github.com/snyk/cli-extension-sbom v0.0.0-20240314090036-46535b380426 github.com/snyk/container-cli v0.0.0-20240322120441-6d9b9482f9b1 - github.com/snyk/go-application-framework v0.0.0-20240415154737-b9e500770430 + github.com/snyk/go-application-framework v0.0.0-20240417122153-755586b0312f github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65 github.com/snyk/snyk-iac-capture v0.6.5 github.com/snyk/snyk-ls v0.0.0-20240415080013-f8e44edf8883 @@ -43,13 +43,13 @@ require ( github.com/apparentlymart/go-versions v1.0.1 // indirect github.com/atotto/clipboard v0.1.4 // indirect github.com/aws/aws-sdk-go v1.45.6 // indirect - github.com/aymanbagabas/go-osc52 v1.2.1 // indirect + github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect github.com/bmatcuk/doublestar v1.3.4 // indirect github.com/bmatcuk/doublestar/v4 v4.6.0 // indirect github.com/charmbracelet/bubbles v0.14.0 // indirect github.com/charmbracelet/bubbletea v0.23.1 // indirect - github.com/charmbracelet/lipgloss v0.6.0 // indirect + github.com/charmbracelet/lipgloss v0.10.0 // indirect github.com/cloudflare/circl v1.3.7 // indirect github.com/containerd/console v1.0.3 // indirect github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf // indirect @@ -128,7 +128,7 @@ require ( github.com/muesli/ansi v0.0.0-20221106050444-61f0cd9a192a // indirect github.com/muesli/cancelreader v0.2.2 // indirect github.com/muesli/reflow v0.3.0 // indirect - github.com/muesli/termenv v0.13.0 // indirect + github.com/muesli/termenv v0.15.2 // indirect github.com/oapi-codegen/runtime v1.1.1 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/open-policy-agent/opa v0.51.0 // indirect @@ -143,7 +143,7 @@ require ( github.com/puzpuzpuz/xsync v1.5.2 // indirect github.com/puzpuzpuz/xsync/v3 v3.1.0 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect - github.com/rivo/uniseg v0.4.4 // indirect + github.com/rivo/uniseg v0.4.7 // indirect github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect diff --git a/cliv2/go.sum b/cliv2/go.sum index 1299f7d85a..fe29333e56 100644 --- a/cliv2/go.sum +++ b/cliv2/go.sum @@ -232,8 +232,8 @@ github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX github.com/aws/aws-sdk-go v1.45.6 h1:Y2isQQBZsnO15dzUQo9YQRThtHgrV200XCH05BRHVJI= github.com/aws/aws-sdk-go v1.45.6/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/aymanbagabas/go-osc52 v1.0.3/go.mod h1:zT8H+Rk4VSabYN90pWyugflM3ZhpTZNC7cASDfUCdT4= -github.com/aymanbagabas/go-osc52 v1.2.1 h1:q2sWUyDcozPLcLabEMd+a+7Ea2DitxZVN9hTxab9L4E= -github.com/aymanbagabas/go-osc52 v1.2.1/go.mod h1:zT8H+Rk4VSabYN90pWyugflM3ZhpTZNC7cASDfUCdT4= +github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= +github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= @@ -259,8 +259,8 @@ github.com/charmbracelet/bubbletea v0.23.1 h1:CYdteX1wCiCzKNUlwm25ZHBIc1GXlYFyUI github.com/charmbracelet/bubbletea v0.23.1/go.mod h1:JAfGK/3/pPKHTnAS8JIE2u9f61BjWTQY57RbT25aMXU= github.com/charmbracelet/harmonica v0.2.0/go.mod h1:KSri/1RMQOZLbw7AHqgcBycp8pgJnQMYYT8QZRqZ1Ao= github.com/charmbracelet/lipgloss v0.5.0/go.mod h1:EZLha/HbzEt7cYqdFPovlqy5FZPj0xFhg5SaqxScmgs= -github.com/charmbracelet/lipgloss v0.6.0 h1:1StyZB9vBSOyuZxQUcUwGr17JmojPNm87inij9N3wJY= -github.com/charmbracelet/lipgloss v0.6.0/go.mod h1:tHh2wr34xcHjC2HCXIlGSG1jaDF0S0atAUvBMP6Ppuk= +github.com/charmbracelet/lipgloss v0.10.0 h1:KWeXFSexGcfahHX+54URiZGkBFazf70JNMtwg/AFW3s= +github.com/charmbracelet/lipgloss v0.10.0/go.mod h1:Wig9DSfvANsxqkRsqj6x87irdy123SR4dOXlKa91ciE= github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= @@ -351,6 +351,12 @@ github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gkampitakis/ciinfo v0.3.0 h1:gWZlOC2+RYYttL0hBqcoQhM7h1qNkVqvRCV1fOvpAv8= +github.com/gkampitakis/ciinfo v0.3.0/go.mod h1:1NIwaOcFChN4fa/B0hEBdAb6npDlFL8Bwx4dfRLRqAo= +github.com/gkampitakis/go-diff v1.3.2 h1:Qyn0J9XJSDTgnsgHRdz9Zp24RaJeKMUHg2+PDZZdC4M= +github.com/gkampitakis/go-diff v1.3.2/go.mod h1:LLgOrpqleQe26cte8s36HTWcTmMEur6OPYerdAAS9tk= +github.com/gkampitakis/go-snaps v0.5.3 h1:2cJnBgHzJhh0Jk5XBIyDYDe1Ylfncoa9r9bVJ5qvOAE= +github.com/gkampitakis/go-snaps v0.5.3/go.mod h1:ZABkO14uCuVxBHAXAfKG+bqNz+aa1bGPAg8jkI0Nk8Y= github.com/gliderlabs/ssh v0.3.7 h1:iV3Bqi942d9huXnzEF2Mt+CY9gLu8DNM4Obd+8bODRE= github.com/gliderlabs/ssh v0.3.7/go.mod h1:zpHEXBstFnQYtGnB8k8kQLol82umzn/2/snG7alWVD8= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= @@ -587,6 +593,8 @@ github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0V github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/maruel/natural v1.1.1 h1:Hja7XhhmvEFhcByqDoHz9QZbkWey+COd9xWfCfn1ioo= +github.com/maruel/natural v1.1.1/go.mod h1:v+Rfd79xlw1AgVBjbO0BEQmptqb5HvL/k9GRHB7ZKEg= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= @@ -635,8 +643,9 @@ github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s= github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8= github.com/muesli/termenv v0.11.1-0.20220204035834-5ac8409525e0/go.mod h1:Bd5NYQ7pd+SrtBSrSNoBBmXlcY8+Xj4BMJgh8qcZrvs= github.com/muesli/termenv v0.11.1-0.20220212125758-44cd13922739/go.mod h1:Bd5NYQ7pd+SrtBSrSNoBBmXlcY8+Xj4BMJgh8qcZrvs= -github.com/muesli/termenv v0.13.0 h1:wK20DRpJdDX8b7Ek2QfhvqhRQFZ237RGRO0RQ/Iqdy0= github.com/muesli/termenv v0.13.0/go.mod h1:sP1+uffeLaEYpyOTb8pLCUctGcGLnoFjSn4YJK5e2bc= +github.com/muesli/termenv v0.15.2 h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo= +github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8= github.com/oapi-codegen/runtime v1.1.1 h1:EXLHh0DXIJnWhdRPN2w4MXAzFyE4CskzhNLUmtpMYro= github.com/oapi-codegen/runtime v1.1.1/go.mod h1:SK9X900oXmPWilYR5/WKPzt3Kqxn/uS/+lbpREv+eCg= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= @@ -683,8 +692,8 @@ github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5X github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= -github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -724,8 +733,8 @@ github.com/snyk/code-client-go v1.4.2 h1:Vy27Xr6CVAs0qKZlU8I/fxWWI6X2ppzan6IZnUJ github.com/snyk/code-client-go v1.4.2/go.mod h1:Kkr7pQc8ItsBZSYd6A1S4r4VHO6HNyTWZsqi18sAtwQ= github.com/snyk/container-cli v0.0.0-20240322120441-6d9b9482f9b1 h1:9RKY9NdX5DrJAoVXDP0JiqrXT+4Nb9NH8pjEcA0NsLA= github.com/snyk/container-cli v0.0.0-20240322120441-6d9b9482f9b1/go.mod h1:38w+dcAQp9eG3P5t2eNS9eG0reut10AeJjLv5lJ5lpM= -github.com/snyk/go-application-framework v0.0.0-20240415154737-b9e500770430 h1:emdZv4L8mAoLNLulH452DQ2PEHEVynT2xuLRmrRdH+0= -github.com/snyk/go-application-framework v0.0.0-20240415154737-b9e500770430/go.mod h1:PiFY8OkhxenSXWgwGkaQRRsZUBZMkNev3EQOzmwRaSo= +github.com/snyk/go-application-framework v0.0.0-20240417122153-755586b0312f h1:AXJHrOs9vPv1+afYQgcUr9kpj65t646fHUWZfpk4u3Y= +github.com/snyk/go-application-framework v0.0.0-20240417122153-755586b0312f/go.mod h1:tt21xKL9Y5DHxd9NLMAwRciHuZr2wEzs0g/nH6x5+bA= github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65 h1:CEQuYv0Go6MEyRCD3YjLYM2u3Oxkx8GpCpFBd4rUTUk= github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65/go.mod h1:88KbbvGYlmLgee4OcQ19yr0bNpXpOr2kciOthaSzCAg= github.com/snyk/policy-engine v0.22.0 h1:od9pduGrXyfWO791X+8M1qmnvWUxaIXh0gBzGKqeseA= @@ -772,6 +781,14 @@ github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8 github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/tchap/go-patricia/v2 v2.3.1 h1:6rQp39lgIYZ+MHmdEq4xzuk1t7OdC35z/xm0BGhTkes= github.com/tchap/go-patricia/v2 v2.3.1/go.mod h1:VZRHKAb53DLaG+nA9EaYYiaEx6YztwDlLElMsnSHD4k= +github.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM= +github.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= +github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= +github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/tklauser/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08lq3r4= github.com/tklauser/go-sysconf v0.3.13/go.mod h1:zwleP4Q4OehZHGn4CYZDipCgg9usW5IJePewFCGVEa0= github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr4= From 216af9c72e483b4b639ffa635588c32f06faf806 Mon Sep 17 00:00:00 2001 From: PeterSchafer <101886095+PeterSchafer@users.noreply.github.com> Date: Thu, 18 Apr 2024 11:27:11 +0200 Subject: [PATCH 51/58] chore(ci): increase timeouts to reduce flakiness (#5175) --- jest.config.js | 1 + test/jest/acceptance/extra-certs.spec.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/jest.config.js b/jest.config.js index 8938a93d44..3e3fdb574d 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,6 +1,7 @@ const { createJestConfig } = require('./test/createJestConfig'); module.exports = createJestConfig({ + testTimeout: 10000, displayName: 'coreCli', projects: ['', '/packages/*'], globalSetup: './test/setup.js', diff --git a/test/jest/acceptance/extra-certs.spec.ts b/test/jest/acceptance/extra-certs.spec.ts index 96ae3069a3..72ce9d53d3 100644 --- a/test/jest/acceptance/extra-certs.spec.ts +++ b/test/jest/acceptance/extra-certs.spec.ts @@ -3,7 +3,7 @@ import * as fs from 'fs'; import { runCommand } from '../util/runCommand'; import { fakeServer } from '../../../test/acceptance/fake-server'; -jest.setTimeout(1000 * 60 * 1); +jest.setTimeout(1000 * 60 * 2); describe('Extra CA certificates specified with `NODE_EXTRA_CA_CERTS`', () => { it('using a not existing file', async () => { const { code } = await runSnykCLI(`woof --debug`, { From ed2e754bace7a37f10a86564d5cf662f69e58daf Mon Sep 17 00:00:00 2001 From: mgyorke Date: Thu, 18 Apr 2024 13:38:07 +0300 Subject: [PATCH 52/58] feat: snyk woof ro language support and tests (#5166) * feat: snyk woof ro language support and tests * chore: use jest table tests instead of forEach --- src/cli/commands/woof.ts | 2 +- src/cli/commands/woof/getWoof.ts | 1 + test/jest/acceptance/woof.spec.ts | 27 +++++++++++++++++++++------ 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/cli/commands/woof.ts b/src/cli/commands/woof.ts index 6bc3e3d9a6..1eccb538f0 100644 --- a/src/cli/commands/woof.ts +++ b/src/cli/commands/woof.ts @@ -1,7 +1,7 @@ import { MethodArgs } from '../args'; import getWoof from './woof/getWoof'; -export default function woof(...args: MethodArgs) { +export default function woof(...args: MethodArgs): void { const woof = getWoof(args); console.log(` | | diff --git a/src/cli/commands/woof/getWoof.ts b/src/cli/commands/woof/getWoof.ts index 24350edce7..f9f3648ec2 100644 --- a/src/cli/commands/woof/getWoof.ts +++ b/src/cli/commands/woof/getWoof.ts @@ -8,6 +8,7 @@ const woofs = { cs: ' Haf!', uk: ' Гав!', de: 'Wuff!', + ro: ' Ham!', cat: 'Meow?', }; diff --git a/test/jest/acceptance/woof.spec.ts b/test/jest/acceptance/woof.spec.ts index f16b561a12..9fb86982a6 100644 --- a/test/jest/acceptance/woof.spec.ts +++ b/test/jest/acceptance/woof.spec.ts @@ -1,28 +1,43 @@ import { runSnykCLI } from '../util/runSnykCLI'; describe('woof', () => { + // supported languages + const languages = [ + { langCode: 'en', expectedWoof: 'Woof!' }, + { langCode: 'he', expectedWoof: 'בה! ' }, + { langCode: 'ru', expectedWoof: 'Гав!' }, + { langCode: 'es', expectedWoof: 'Guau!' }, + { langCode: 'cs', expectedWoof: 'Haf!' }, + { langCode: 'uk', expectedWoof: 'Гав!' }, + { langCode: 'de', expectedWoof: 'Wuff!' }, + { langCode: 'ro', expectedWoof: 'Ham!' }, + { langCode: 'cat', expectedWoof: 'Meow?' }, + ]; + + // test default it('Woofs in English by default', async () => { const { stdout, code, stderr } = await runSnykCLI(`woof`); - expect(stdout).toContain('Woof!'); expect(code).toBe(0); expect(stderr).toBe(''); }); + // test unsuported it('Woofs in English when passed unsupported language', async () => { const { stdout, stderr, code } = await runSnykCLI( `woof --language=blalbla`, ); - expect(stdout).toContain('Woof!'); expect(code).toBe(0); expect(stderr).toBe(''); }); - it('Woofs in Czech when passed "cs"', async () => { - const { stdout, code, stderr } = await runSnykCLI(`woof --language=cs`); - - expect(stdout).toContain('Haf!'); + // test each supported language code + test.each(languages)('Woofs in %s', async ({ langCode, expectedWoof }) => { + const { stdout, code, stderr } = await runSnykCLI( + `woof --language=${langCode}`, + ); + expect(stdout).toContain(expectedWoof); expect(code).toBe(0); expect(stderr).toBe(''); }); From ea6293b3adabd2459bb10a0ae65f78da8cf1311d Mon Sep 17 00:00:00 2001 From: Paul Rosca <152853861+paulrosca-snyk@users.noreply.github.com> Date: Thu, 18 Apr 2024 15:33:35 +0300 Subject: [PATCH 53/58] feat(sbom): Introduce experimental sbom test command (#5176) * feat(sbom): Introduce experimental sbom test command --------- Co-authored-by: Tim Pickles --- cliv2/go.mod | 2 +- cliv2/go.sum | 6 +- test/acceptance/fake-server.ts | 51 ++++++++ test/fixtures/sbom/npm-sbom-cdx15.json | 2 + .../fixtures/sbom/npm-sbom-test-response.json | 1 + .../snyk-sbom-test/all-projects.spec.ts | 113 ++++++++++++++++++ 6 files changed, 172 insertions(+), 3 deletions(-) create mode 100644 test/fixtures/sbom/npm-sbom-cdx15.json create mode 100644 test/fixtures/sbom/npm-sbom-test-response.json create mode 100644 test/jest/acceptance/snyk-sbom-test/all-projects.spec.ts diff --git a/cliv2/go.mod b/cliv2/go.mod index 71c73706f8..3ef5944167 100644 --- a/cliv2/go.mod +++ b/cliv2/go.mod @@ -11,7 +11,7 @@ require ( github.com/rs/zerolog v1.32.0 github.com/snyk/cli-extension-dep-graph v0.0.0-20230926124856-b0fdf1ee6f73 github.com/snyk/cli-extension-iac-rules v0.0.0-20240404084125-0098857e0e1a - github.com/snyk/cli-extension-sbom v0.0.0-20240314090036-46535b380426 + github.com/snyk/cli-extension-sbom v0.0.0-20240418082712-4732b4b2d7b3 github.com/snyk/container-cli v0.0.0-20240322120441-6d9b9482f9b1 github.com/snyk/go-application-framework v0.0.0-20240417122153-755586b0312f github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65 diff --git a/cliv2/go.sum b/cliv2/go.sum index fe29333e56..6752d32301 100644 --- a/cliv2/go.sum +++ b/cliv2/go.sum @@ -243,6 +243,8 @@ github.com/bmatcuk/doublestar v1.3.4 h1:gPypJ5xD31uhX6Tf54sDPUOBXTqKH4c9aPY66CyQ github.com/bmatcuk/doublestar v1.3.4/go.mod h1:wiQtGV+rzVYxB7WIlirSN++5HPtPlXEo9MEoZQC/PmE= github.com/bmatcuk/doublestar/v4 v4.6.0 h1:HTuxyug8GyFbRkrffIpzNCSK4luc0TY3wzXvzIZhEXc= github.com/bmatcuk/doublestar/v4 v4.6.0/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= +github.com/bradleyjkemp/cupaloy/v2 v2.8.0 h1:any4BmKE+jGIaMpnU8YgH/I2LPiLBufr6oMMlVBbn9M= +github.com/bradleyjkemp/cupaloy/v2 v2.8.0/go.mod h1:bm7JXdkRd4BHJk9HpwqAI8BoAY1lps46Enkdqw6aRX0= github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/bytecodealliance/wasmtime-go/v3 v3.0.2 h1:3uZCA/BLTIu+DqCfguByNMJa2HVHpXvjfy0Dy7g6fuA= github.com/bytecodealliance/wasmtime-go/v3 v3.0.2/go.mod h1:RnUjnIXxEJcL6BgCvNyzCCRzZcxCgsZCi+RNlvYor5Q= @@ -727,8 +729,8 @@ github.com/snyk/cli-extension-dep-graph v0.0.0-20230926124856-b0fdf1ee6f73 h1:rw github.com/snyk/cli-extension-dep-graph v0.0.0-20230926124856-b0fdf1ee6f73/go.mod h1:QF3v8HBpOpyudYNCuR8LqfULutO76c91sBdLzD+pBJU= github.com/snyk/cli-extension-iac-rules v0.0.0-20240404084125-0098857e0e1a h1:pvj3bsgPMmYma56TU+rjFsulqS2kV1D2kBg1mVb8Et4= github.com/snyk/cli-extension-iac-rules v0.0.0-20240404084125-0098857e0e1a/go.mod h1:4c6XS4n6mWbJM9md3r4B2NFgjs2tyi8GzGlz1BbWIx0= -github.com/snyk/cli-extension-sbom v0.0.0-20240314090036-46535b380426 h1:MXbip3nmiOym3/9bNWlPISVOAEAAz4FDcPvqOMPcCc4= -github.com/snyk/cli-extension-sbom v0.0.0-20240314090036-46535b380426/go.mod h1:g2VgZU79btvZrAP3oHZGv3tHD9POVOx5a3DY894rS4w= +github.com/snyk/cli-extension-sbom v0.0.0-20240418082712-4732b4b2d7b3 h1:2dOzIy4L0LRH7EnMw//80K510ZgoXiDPpylpGNRSZTI= +github.com/snyk/cli-extension-sbom v0.0.0-20240418082712-4732b4b2d7b3/go.mod h1:lqmQT+QdzLdfi7qsqIH4qvCsSWu+P09GDFwQcmFfC0g= github.com/snyk/code-client-go v1.4.2 h1:Vy27Xr6CVAs0qKZlU8I/fxWWI6X2ppzan6IZnUJYmvg= github.com/snyk/code-client-go v1.4.2/go.mod h1:Kkr7pQc8ItsBZSYd6A1S4r4VHO6HNyTWZsqi18sAtwQ= github.com/snyk/container-cli v0.0.0-20240322120441-6d9b9482f9b1 h1:9RKY9NdX5DrJAoVXDP0JiqrXT+4Nb9NH8pjEcA0NsLA= diff --git a/test/acceptance/fake-server.ts b/test/acceptance/fake-server.ts index 1f14bc3205..71c20ce9ff 100644 --- a/test/acceptance/fake-server.ts +++ b/test/acceptance/fake-server.ts @@ -603,6 +603,57 @@ export const fakeServer = (basePath: string, snykToken: string): FakeServer => { res.status(200).send({}); }); + app.post(`/rest/orgs/:orgId/sbom_tests`, (req, res) => { + const response = { + data: { + id: '4b341b8a-4697-4e35-928b-4b9ae37f8ea8', + type: 'sbom_tests', + }, + jsonapi: { + version: '1.0', + }, + links: { + self: + '/rest/orgs/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/sbom_tests?version=2023-08-31~beta', + related: + '/rest/orgs/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/sbom_tests/4b341b8a-4697-4e35-928b-4b9ae37f8ea8?version=2023-08-31~beta', + }, + }; + res.status(201); + res.send(response); + }); + + app.get(`/rest/orgs/:orgId/sbom_tests/:id`, (req, res) => { + const response = { + data: { + id: '4b341b8a-4697-4e35-928b-4b9ae37f8ea8', + type: 'sbom_tests', + attributes: { + status: 'finished', + }, + }, + jsonapi: { + version: '1.0', + }, + links: { + self: + '/rest/orgs/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/sbom_tests/4b341b8a-4697-4e35-928b-4b9ae37f8ea8?version=2023-08-31~beta', + related: + '/rest/orgs/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/sbom_tests/4b341b8a-4697-4e35-928b-4b9ae37f8ea8/results?version=2023-08-31~beta', + }, + }; + res.status(303); + res.send(response); + }); + + app.get(`/rest/orgs/:orgId/sbom_tests/:id/results`, (req, res) => { + const body = fs.readFileSync( + path.resolve(getFixturePath('sbom'), 'npm-sbom-test-response.json'), + 'utf8', + ); + res.send(JSON.parse(body)); + }); + app.post( basePath.replace('v1', 'hidden') + '/orgs/:org/sbom', express.json(), diff --git a/test/fixtures/sbom/npm-sbom-cdx15.json b/test/fixtures/sbom/npm-sbom-cdx15.json new file mode 100644 index 0000000000..5f3408acd1 --- /dev/null +++ b/test/fixtures/sbom/npm-sbom-cdx15.json @@ -0,0 +1,2 @@ +{"$schema":"http://cyclonedx.org/schema/bom-1.5.schema.json","bomFormat":"CycloneDX","specVersion":"1.5","serialNumber":"urn:uuid:f441a916-51e8-4a53-b5e7-db914182fa7c","version":1,"metadata":{"timestamp":"2024-04-12T09:28:22Z","tools":{"components":[{"type":"application","author":"Snyk","name":"snyk-cli","version":"1.1288.0"}],"services":[{"provider":{"name":"Snyk"},"name":"SBOM Export API","version":"v1.84.1"}]},"component":{"bom-ref":"1-development@1.0.0","type":"application","name":"development","version":"1.0.0","purl":"pkg:npm/development@1.0.0"}},"components":[{"bom-ref":"2-minimatch@3.0.4","type":"library","name":"minimatch","version":"3.0.4","purl":"pkg:npm/minimatch@3.0.4"},{"bom-ref":"3-brace-expansion@1.1.11","type":"library","name":"brace-expansion","version":"1.1.11","purl":"pkg:npm/brace-expansion@1.1.11"},{"bom-ref":"4-balanced-match@1.0.2","type":"library","name":"balanced-match","version":"1.0.2","purl":"pkg:npm/balanced-match@1.0.2"},{"bom-ref":"5-concat-map@0.0.1","type":"library","name":"concat-map","version":"0.0.1","purl":"pkg:npm/concat-map@0.0.1"},{"bom-ref":"6-semver@7.3.5","type":"library","name":"semver","version":"7.3.5","purl":"pkg:npm/semver@7.3.5"},{"bom-ref":"7-lru-cache@6.0.0","type":"library","name":"lru-cache","version":"6.0.0","purl":"pkg:npm/lru-cache@6.0.0"},{"bom-ref":"8-yallist@4.0.0","type":"library","name":"yallist","version":"4.0.0","purl":"pkg:npm/yallist@4.0.0"}],"dependencies":[{"ref":"1-development@1.0.0","dependsOn":["2-minimatch@3.0.4","6-semver@7.3.5"]},{"ref":"2-minimatch@3.0.4","dependsOn":["3-brace-expansion@1.1.11"]},{"ref":"3-brace-expansion@1.1.11","dependsOn":["4-balanced-match@1.0.2","5-concat-map@0.0.1"]},{"ref":"4-balanced-match@1.0.2"},{"ref":"5-concat-map@0.0.1"},{"ref":"6-semver@7.3.5","dependsOn":["7-lru-cache@6.0.0"]},{"ref":"7-lru-cache@6.0.0","dependsOn":["8-yallist@4.0.0"]},{"ref":"8-yallist@4.0.0"}]} + diff --git a/test/fixtures/sbom/npm-sbom-test-response.json b/test/fixtures/sbom/npm-sbom-test-response.json new file mode 100644 index 0000000000..4569307727 --- /dev/null +++ b/test/fixtures/sbom/npm-sbom-test-response.json @@ -0,0 +1 @@ +{"data":{"id":"2c82ad1f-6868-40a9-acc6-f4a7b8bf0326","type":"sbom_test_results","attributes":{"sbom":{"format":"CycloneDX JSON"},"test_summary":{"tested":["2-minimatch@3.0.4","3-brace-expansion@1.1.11","4-balanced-match@1.0.2","5-concat-map@0.0.1","6-semver@7.3.5","7-lru-cache@6.0.0","8-yallist@4.0.0","1-development@1.0.0"],"untested":[],"total_issues":2,"total_license_issues":0,"total_vulnerabilities":2,"vulnerabilities_by_severity":{"critical":0,"high":1,"medium":1,"low":0}}},"relationships":{"affected_pkgs":{"data":[{"type":"packages","id":"semver@7.3.5"},{"type":"packages","id":"minimatch@3.0.4"}]},"vulnerabilities":{"data":[{"type":"vulnerabilities","id":"SNYK-JS-MINIMATCH-3050818"},{"type":"vulnerabilities","id":"SNYK-JS-SEMVER-3247795"}]},"remedies":{"data":[{"type":"remedies","id":"minimatch@3.0.4:SNYK-JS-MINIMATCH-3050818"},{"type":"remedies","id":"semver@7.3.5:SNYK-JS-SEMVER-3247795"}]}}},"jsonapi":{"version":"1.0"},"links":{"self":"/rest/orgs/0e10f26f-81f9-4bb0-8811-6c1b1b896a6c/sbom_tests/2c82ad1f-6868-40a9-acc6-f4a7b8bf0326/results?version=2023-08-31~beta"},"included":[{"type":"remedies","id":"minimatch@3.0.4:SNYK-JS-MINIMATCH-3050818","attributes":{"is_fixable":true,"upgrade_paths":[{"path":[{"name":"development","version":"1.0.0"},{"name":"minimatch","version":"3.0.4","new_version":"3.0.5"}]}]},"relationships":{"affected_package":{"data":{"type":"packages","id":"minimatch@3.0.4"}},"vulnerability":{"data":{"type":"vulnerabilities","id":"SNYK-JS-MINIMATCH-3050818"}}}},{"type":"remedies","id":"semver@7.3.5:SNYK-JS-SEMVER-3247795","attributes":{"is_fixable":true,"upgrade_paths":[{"path":[{"name":"development","version":"1.0.0"},{"name":"semver","version":"7.3.5","new_version":"7.5.2"}]}]},"relationships":{"affected_package":{"data":{"type":"packages","id":"semver@7.3.5"}},"vulnerability":{"data":{"type":"vulnerabilities","id":"SNYK-JS-SEMVER-3247795"}}}},{"id":"semver@7.3.5","type":"packages","attributes":{"name":"semver","version":"7.3.5","purl":"pkg:npm/semver@7.3.5"}},{"id":"minimatch@3.0.4","type":"packages","attributes":{"name":"minimatch","version":"3.0.4","purl":"pkg:npm/minimatch@3.0.4"}},{"id":"SNYK-JS-MINIMATCH-3050818","type":"vulnerabilities","attributes":{"title":"Regular Expression Denial of Service (ReDoS)","description":"## Overview\n[minimatch](https://www.npmjs.com/package/minimatch) is a minimal matching utility.\n\nAffected versions of this package are vulnerable to Regular Expression Denial of Service (ReDoS) via the `braceExpand` function in `minimatch.js`.\n\n## Details\n\nDenial of Service (DoS) describes a family of attacks, all aimed at making a system inaccessible to its original and legitimate users. There are many types of DoS attacks, ranging from trying to clog the network pipes to the system by generating a large volume of traffic from many machines (a Distributed Denial of Service - DDoS - attack) to sending crafted requests that cause a system to crash or take a disproportional amount of time to process.\n\nThe Regular expression Denial of Service (ReDoS) is a type of Denial of Service attack. Regular expressions are incredibly powerful, but they aren't very intuitive and can ultimately end up making it easy for attackers to take your site down.\n\nLet’s take the following regular expression as an example:\n```js\nregex = /A(B|C+)+D/\n```\n\nThis regular expression accomplishes the following:\n- `A` The string must start with the letter 'A'\n- `(B|C+)+` The string must then follow the letter A with either the letter 'B' or some number of occurrences of the letter 'C' (the `+` matches one or more times). The `+` at the end of this section states that we can look for one or more matches of this section.\n- `D` Finally, we ensure this section of the string ends with a 'D'\n\nThe expression would match inputs such as `ABBD`, `ABCCCCD`, `ABCBCCCD` and `ACCCCCD`\n\nIt most cases, it doesn't take very long for a regex engine to find a match:\n\n```bash\n$ time node -e '/A(B|C+)+D/.test(\"ACCCCCCCCCCCCCCCCCCCCCCCCCCCCD\")'\n0.04s user 0.01s system 95% cpu 0.052 total\n\n$ time node -e '/A(B|C+)+D/.test(\"ACCCCCCCCCCCCCCCCCCCCCCCCCCCCX\")'\n1.79s user 0.02s system 99% cpu 1.812 total\n```\n\nThe entire process of testing it against a 30 characters long string takes around ~52ms. But when given an invalid string, it takes nearly two seconds to complete the test, over ten times as long as it took to test a valid string. The dramatic difference is due to the way regular expressions get evaluated.\n\nMost Regex engines will work very similarly (with minor differences). The engine will match the first possible way to accept the current character and proceed to the next one. If it then fails to match the next one, it will backtrack and see if there was another way to digest the previous character. If it goes too far down the rabbit hole only to find out the string doesn’t match in the end, and if many characters have multiple valid regex paths, the number of backtracking steps can become very large, resulting in what is known as _catastrophic backtracking_.\n\nLet's look at how our expression runs into this problem, using a shorter string: \"ACCCX\". While it seems fairly straightforward, there are still four different ways that the engine could match those three C's:\n1. CCC\n2. CC+C\n3. C+CC\n4. C+C+C.\n\nThe engine has to try each of those combinations to see if any of them potentially match against the expression. When you combine that with the other steps the engine must take, we can use [RegEx 101 debugger](https://regex101.com/debugger) to see the engine has to take a total of 38 steps before it can determine the string doesn't match.\n\nFrom there, the number of steps the engine must use to validate a string just continues to grow.\n\n| String | Number of C's | Number of steps |\n| -------|-------------:| -----:|\n| ACCCX | 3 | 38\n| ACCCCX | 4 | 71\n| ACCCCCX | 5 | 136\n| ACCCCCCCCCCCCCCX | 14 | 65,553\n\n\nBy the time the string includes 14 C's, the engine has to take over 65,000 steps just to see if the string is valid. These extreme situations can cause them to work very slowly (exponentially related to input size, as shown above), allowing an attacker to exploit this and can cause the service to excessively consume CPU, resulting in a Denial of Service.\n\n## Remediation\nUpgrade `minimatch` to version 3.0.5 or higher.\n## References\n- [GitHub Commit](https://github.com/isaacs/minimatch/commit/a8763f4388e51956be62dc6025cec1126beeb5e6)\n","created_at":"2022-10-18T06:10:47Z","updated_at":"2024-03-11T09:53:57Z","problems":[{"id":"CVE-2022-3517","source":"CVE"},{"id":"CWE-1333","source":"CWE"}],"coordinates":[{"remedies":[{"description":"Upgrade to version 3.0.5 to fix this vulnerability","details":{"upgrade_package":"3.0.5"},"type":"indeterminate"}],"representation":[{"resource_path":"\u003c3.0.5"}]}],"severities":[{"source":"Snyk","level":"medium","score":5.3,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L"}],"effective_severity_level":"medium","slots":[{"disclosure_time":"2022-10-18 06:00:25 +0000 UTC","exploit":"Not Defined","publication_time":"2022-10-18 06:29:18.07895 +0000 UTC","references":[{"url":"https://github.com/isaacs/minimatch/commit/a8763f4388e51956be62dc6025cec1126beeb5e6","title":"GitHub Commit"}]}]}},{"id":"SNYK-JS-SEMVER-3247795","type":"vulnerabilities","attributes":{"title":"Regular Expression Denial of Service (ReDoS)","description":"## Overview\n[semver](https://github.com/npm/node-semver) is a semantic version parser used by npm.\n\nAffected versions of this package are vulnerable to Regular Expression Denial of Service (ReDoS) via the function `new Range`, when untrusted user data is provided as a range.\r\n\r\n\r\n## PoC\r\n\r\n```js\r\n\r\nconst semver = require('semver')\r\nconst lengths_2 = [2000, 4000, 8000, 16000, 32000, 64000, 128000]\r\n\r\nconsole.log(\"n[+] Valid range - Test payloads\")\r\nfor (let i = 0; i =1.2.3' + ' '.repeat(lengths_2[i]) + '\u003c1.3.0';\r\nconst start = Date.now()\r\nsemver.validRange(value)\r\n// semver.minVersion(value)\r\n// semver.maxSatisfying([\"1.2.3\"], value)\r\n// semver.minSatisfying([\"1.2.3\"], value)\r\n// new semver.Range(value, {})\r\n\r\nconst end = Date.now();\r\nconsole.log('length=%d, time=%d ms', value.length, end - start);\r\n}\r\n```\n\n## Details\n\nDenial of Service (DoS) describes a family of attacks, all aimed at making a system inaccessible to its original and legitimate users. There are many types of DoS attacks, ranging from trying to clog the network pipes to the system by generating a large volume of traffic from many machines (a Distributed Denial of Service - DDoS - attack) to sending crafted requests that cause a system to crash or take a disproportional amount of time to process.\n\nThe Regular expression Denial of Service (ReDoS) is a type of Denial of Service attack. Regular expressions are incredibly powerful, but they aren't very intuitive and can ultimately end up making it easy for attackers to take your site down.\n\nLet’s take the following regular expression as an example:\n```js\nregex = /A(B|C+)+D/\n```\n\nThis regular expression accomplishes the following:\n- `A` The string must start with the letter 'A'\n- `(B|C+)+` The string must then follow the letter A with either the letter 'B' or some number of occurrences of the letter 'C' (the `+` matches one or more times). The `+` at the end of this section states that we can look for one or more matches of this section.\n- `D` Finally, we ensure this section of the string ends with a 'D'\n\nThe expression would match inputs such as `ABBD`, `ABCCCCD`, `ABCBCCCD` and `ACCCCCD`\n\nIt most cases, it doesn't take very long for a regex engine to find a match:\n\n```bash\n$ time node -e '/A(B|C+)+D/.test(\"ACCCCCCCCCCCCCCCCCCCCCCCCCCCCD\")'\n0.04s user 0.01s system 95% cpu 0.052 total\n\n$ time node -e '/A(B|C+)+D/.test(\"ACCCCCCCCCCCCCCCCCCCCCCCCCCCCX\")'\n1.79s user 0.02s system 99% cpu 1.812 total\n```\n\nThe entire process of testing it against a 30 characters long string takes around ~52ms. But when given an invalid string, it takes nearly two seconds to complete the test, over ten times as long as it took to test a valid string. The dramatic difference is due to the way regular expressions get evaluated.\n\nMost Regex engines will work very similarly (with minor differences). The engine will match the first possible way to accept the current character and proceed to the next one. If it then fails to match the next one, it will backtrack and see if there was another way to digest the previous character. If it goes too far down the rabbit hole only to find out the string doesn’t match in the end, and if many characters have multiple valid regex paths, the number of backtracking steps can become very large, resulting in what is known as _catastrophic backtracking_.\n\nLet's look at how our expression runs into this problem, using a shorter string: \"ACCCX\". While it seems fairly straightforward, there are still four different ways that the engine could match those three C's:\n1. CCC\n2. CC+C\n3. C+CC\n4. C+C+C.\n\nThe engine has to try each of those combinations to see if any of them potentially match against the expression. When you combine that with the other steps the engine must take, we can use [RegEx 101 debugger](https://regex101.com/debugger) to see the engine has to take a total of 38 steps before it can determine the string doesn't match.\n\nFrom there, the number of steps the engine must use to validate a string just continues to grow.\n\n| String | Number of C's | Number of steps |\n| -------|-------------:| -----:|\n| ACCCX | 3 | 38\n| ACCCCX | 4 | 71\n| ACCCCCX | 5 | 136\n| ACCCCCCCCCCCCCCX | 14 | 65,553\n\n\nBy the time the string includes 14 C's, the engine has to take over 65,000 steps just to see if the string is valid. These extreme situations can cause them to work very slowly (exponentially related to input size, as shown above), allowing an attacker to exploit this and can cause the service to excessively consume CPU, resulting in a Denial of Service.\n\n## Remediation\nUpgrade `semver` to version 5.7.2, 6.3.1, 7.5.2 or higher.\n## References\n- [GitHub Commit](https://github.com/npm/node-semver/commit/2f8fd41487acf380194579ecb6f8b1bbfe116be0)\n- [GitHub Commit](https://github.com/npm/node-semver/commit/717534ee353682f3bcf33e60a8af4292626d4441)\n- [GitHub Commit](https://github.com/npm/node-semver/commit/928e56d21150da0413a3333a3148b20e741a920c)\n- [GitHub PR](https://github.com/npm/node-semver/pull/564)\n- [Vulnerable Code](https://github.com/npm/node-semver/blob/main/classes/range.js#L97-L104)\n- [Vulnerable Code](https://github.com/npm/node-semver/blob/main/internal/re.js#L138)\n- [Vulnerable Code](https://github.com/npm/node-semver/blob/main/internal/re.js#L160)\n","created_at":"2023-01-25T16:16:50Z","updated_at":"2024-03-11T09:54:01Z","problems":[{"id":"CVE-2022-25883","source":"CVE"},{"id":"CWE-1333","source":"CWE"}],"coordinates":[{"remedies":[{"description":"Upgrade to version 5.7.2 to fix this vulnerability","details":{"upgrade_package":"5.7.2"},"type":"indeterminate"}],"representation":[{"resource_path":"\u003c5.7.2,\u003e=6.0.0 \u003c6.3.1,\u003e=7.0.0 \u003c7.5.2"}]}],"severities":[{"source":"Snyk","level":"high","score":7.5,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H/E:P"}],"effective_severity_level":"high","slots":[{"disclosure_time":"2023-01-25 16:00:59 +0000 UTC","exploit":"Proof of Concept","publication_time":"2023-06-20 15:39:58.313421 +0000 UTC","references":[{"url":"https://github.com/npm/node-semver/commit/2f8fd41487acf380194579ecb6f8b1bbfe116be0","title":"GitHub Commit"},{"url":"https://github.com/npm/node-semver/commit/717534ee353682f3bcf33e60a8af4292626d4441","title":"GitHub Commit"},{"url":"https://github.com/npm/node-semver/commit/928e56d21150da0413a3333a3148b20e741a920c","title":"GitHub Commit"},{"url":"https://github.com/npm/node-semver/pull/564","title":"GitHub PR"},{"url":"https://github.com/npm/node-semver/blob/main/classes/range.js%23L97-L104","title":"Vulnerable Code"},{"url":"https://github.com/npm/node-semver/blob/main/internal/re.js%23L138","title":"Vulnerable Code"},{"url":"https://github.com/npm/node-semver/blob/main/internal/re.js%23L160","title":"Vulnerable Code"}]}]}}]} diff --git a/test/jest/acceptance/snyk-sbom-test/all-projects.spec.ts b/test/jest/acceptance/snyk-sbom-test/all-projects.spec.ts new file mode 100644 index 0000000000..fee363aaae --- /dev/null +++ b/test/jest/acceptance/snyk-sbom-test/all-projects.spec.ts @@ -0,0 +1,113 @@ +import { runSnykCLI } from '../../util/runSnykCLI'; +import { fakeServer } from '../../../acceptance/fake-server'; +import { getServerPort } from '../../util/getServerPort'; +import { getFixturePath } from '../../util/getFixturePath'; +import * as path from 'path'; + +jest.setTimeout(1000 * 60); + +describe('snyk sbom test (mocked server only)', () => { + let server: ReturnType; + let env: Record; + + beforeAll((done) => { + const port = getServerPort(process); + const baseApi = ''; + env = { + ...process.env, + SNYK_API: 'http://localhost:' + port + baseApi, + SNYK_API_REST_URL: 'http://localhost:' + port + baseApi, + SNYK_HOST: 'http://localhost:' + port, + SNYK_TOKEN: '123456789', + SNYK_DISABLE_ANALYTICS: '1', + }; + server = fakeServer(baseApi, env.SNYK_TOKEN); + server.listen(port, () => { + done(); + }); + }); + + afterEach(() => { + jest.resetAllMocks(); + server.restore(); + }); + + afterAll((done) => { + server.close(() => { + done(); + }); + }); + + test('`npm CycloneDX JSON`', async () => { + const fileToTest = path.resolve( + getFixturePath('sbom'), + 'npm-sbom-cdx15.json', + ); + + const { + code, + stdout, + stderr, + } = await runSnykCLI( + `sbom test --org aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee --experimental --file ${fileToTest}`, + { env }, + ); + + expect(stdout).toMatch( + '[MEDIUM] Regular Expression Denial of Service (ReDoS)', + ); + expect(stdout).toMatch('Introduced through: pkg:npm/minimatch@3.0.4'); + expect(stdout).toMatch( + 'URL: https://security.snyk.io/vuln/SNYK-JS-MINIMATCH-3050818', + ); + + expect(stdout).toMatch( + '[HIGH] Regular Expression Denial of Service (ReDoS)', + ); + expect(stdout).toMatch('Introduced through: pkg:npm/semver@7.3.5'); + expect(stdout).toMatch( + 'URL: https://security.snyk.io/vuln/SNYK-JS-SEMVER-3247795', + ); + + expect(code).toEqual(1); + + expect(stderr).toEqual(''); + }); + + test('`missing experimental flag`', async () => { + const fileToTest = path.resolve( + getFixturePath('sbom'), + 'npm-sbom-cdx15.json', + ); + + const { + stdout, + stderr, + } = await runSnykCLI( + `sbom test --org aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee --file ${fileToTest}`, + { env }, + ); + + expect(stdout).toMatch( + 'Flag `--experimental` is required to execute this command.', + ); + + expect(stderr).toEqual(''); + }); + + test('`missing file flag`', async () => { + const { + stdout, + stderr, + } = await runSnykCLI( + `sbom test --org aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee --experimental`, + { env }, + ); + + expect(stdout).toMatch( + 'Flag `--file` is required to execute this command. Value should point to a valid SBOM document.', + ); + + expect(stderr).toEqual(''); + }); +}); From 77d8bfe1a3ae1c865040f995363454bcc5002689 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 18 Apr 2024 16:45:34 +0000 Subject: [PATCH 54/58] docs: synchronizing help from snyk/user-docs (#5179) Co-authored-by: mcombuechen --- help/cli-commands/README.md | 2 +- help/cli-commands/sbom-test.md | 54 ++++++++++++++++++++++++++++++++++ help/cli-commands/sbom.md | 4 +++ 3 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 help/cli-commands/sbom-test.md diff --git a/help/cli-commands/README.md b/help/cli-commands/README.md index da5ce34c78..0fb60594f4 100644 --- a/help/cli-commands/README.md +++ b/help/cli-commands/README.md @@ -46,7 +46,7 @@ The `snyk code test` command finds security issues using Static Code Analysis. ### [`snyk sbom`](sbom.md) -Produce an SBOM for a local software project in an ecosystem supported by Snyk. +Generate or test an SBOM document in ecosystems supported by Snyk. ### [`snyk log4shell`](log4shell.md) diff --git a/help/cli-commands/sbom-test.md b/help/cli-commands/sbom-test.md new file mode 100644 index 0000000000..da02eba9f7 --- /dev/null +++ b/help/cli-commands/sbom-test.md @@ -0,0 +1,54 @@ +# SBOM test + +**Feature availability:** This feature is available to customers on Snyk Enterprise plans. + +## Usage + +`snyk sbom test --experimental --file= []` + +## Description + +The `snyk sbom test` command checks SBOM files for vulnerabilities in open-source packages. + +## Exit codes + +Possible exit codes and their meaning: + +**0**: success (scan completed), no vulnerabilities found\ +**1**: action_needed (scan completed), vulnerabilities found\ +**2**: failure, try to re-run the command + +## Configure the Snyk CLI + +You can use environment variables to configure the Snyk CLI and set variables for connecting with the Snyk API. See [Configure the Snyk CLI](https://docs.snyk.io/snyk-cli/configure-the-snyk-cli) + +## Debug + +Use the `-d` or `--debug` option to output the debug logs. + +## Options + +### `--experimental` + +Required. Use experimental command features. This option is currently required as the command is in its experimental phase. + +### `--file=` + +Required. Specify the file path of the SBOM document. + +The `snyk sbom test` command accepts the following file formats: + +- **CycloneDX:** JSON version 1.4, 1.5 and 2.0 +- **SPDX:** JSON version 2.3 and 2.3.1 + +Packages and components within the provided SBOM file must be identified by a PackageURL (purl). + +Supported purl types are: `apk`, `deb`, `cargo`, `cocoapods`, `composer`, `gem`, `generic`, `golang`, `hex`, `maven`, `npm`, `nuget`, `pypi`, `rpm`, `swift`. + +Example: `$ snyk sbom test --experimental --file=bom.cdx.json` + +### `--json` + +Print results on the console as a JSON data structure. + +Example: `$ snyk sbom test --experimental --file=bom.cdx.json --json` diff --git a/help/cli-commands/sbom.md b/help/cli-commands/sbom.md index ff992cfd3a..a2c982c7fb 100644 --- a/help/cli-commands/sbom.md +++ b/help/cli-commands/sbom.md @@ -1,3 +1,7 @@ +--- +description: Generate an SBOM document from a local file system. +--- + # SBOM ## Prerequisites From dcce4d43b6523968b69c73c1d8c504c1479b3422 Mon Sep 17 00:00:00 2001 From: PeterSchafer <101886095+PeterSchafer@users.noreply.github.com> Date: Fri, 19 Apr 2024 10:50:48 +0200 Subject: [PATCH 55/58] chore(ci): Enable preview and stable deployments (#5178) * chore(ci): enable stable release channels * chore: add release scripts to makefile * chore: add additional instructions to prepare-release * chore: run formatter after generating release notes * chore: remove unused variable * chore: ensure to use the correct version in release notes * chore: use correct version in create-release * chore: use long form of semver --coerce * chore: add comment on version cleanup --- Makefile | 14 ++++++++++++++ release-scripts/create-release.sh | 2 +- release-scripts/enable-stable-release-channels.sh | 2 +- release-scripts/next-version.sh | 1 - release-scripts/prepare-release.sh | 8 +++++++- 5 files changed, 23 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 10037bd83a..bb5e1c3202 100644 --- a/Makefile +++ b/Makefile @@ -96,6 +96,10 @@ $(BINARY_OUTPUT_FOLDER)/release.json: $(BINARY_OUTPUT_FOLDER)/RELEASE_NOTES.md: prepack | $(BINARY_RELEASES_FOLDER_TS_CLI) npx conventional-changelog-cli -p angular -l -r 1 > $(BINARY_OUTPUT_FOLDER)/RELEASE_NOTES.md + # if the releease notes are generated locally, the version contains something like X.Y.Z-dev.hash + # the replacement below ensures that the version in the RELEASE_NOTES.md is X.Y.Z + sed -i '' -e "s/$(shell cat $(BINARY_OUTPUT_FOLDER)/version)/$(shell npx semver --coerce $(shell cat $(BINARY_OUTPUT_FOLDER)/version))/g" $(BINARY_OUTPUT_FOLDER)/RELEASE_NOTES.md + # Generates a shasum of a target with the same name. # See "Automatic Variables" in GNU Make docs (linked at the top) %.sha256: @@ -263,6 +267,16 @@ release-pre: @echo "-- Publishing to S3 /version" @./release-scripts/upload-artifacts.sh version +.PHONY: release-mgt-prepare +release-mgt-prepare: + @echo "-- Preparing release" + @./release-scripts/prepare-release.sh + +.PHONY: release-mgt-create +release-mgt-create: + @echo "-- Creating stable release" + @./release-scripts/create-release.sh + .PHONY: format format: @echo "-- Formatting code" diff --git a/release-scripts/create-release.sh b/release-scripts/create-release.sh index 0686e41f0e..6646d3a8b1 100755 --- a/release-scripts/create-release.sh +++ b/release-scripts/create-release.sh @@ -29,7 +29,7 @@ echo "Validating next version..." # Get version from version file VERSION_FILE="./binary-releases/version" -CURRENT_VERSION=$(cat "$VERSION_FILE") +CURRENT_VERSION=$(npx semver --coerce $(cat $VERSION_FILE)) # Get version from RELEASE_NOTES.md RELEASE_NOTES_MD="./binary-releases/RELEASE_NOTES.md" diff --git a/release-scripts/enable-stable-release-channels.sh b/release-scripts/enable-stable-release-channels.sh index 546c171f60..58da4d9ab0 100755 --- a/release-scripts/enable-stable-release-channels.sh +++ b/release-scripts/enable-stable-release-channels.sh @@ -2,5 +2,5 @@ set -euo pipefail # enable support for stable, preview and other release channels -ENABLE_STABLE_CHANNELS=false +ENABLE_STABLE_CHANNELS=true echo $ENABLE_STABLE_CHANNELS diff --git a/release-scripts/next-version.sh b/release-scripts/next-version.sh index f810da817c..5659bcf1db 100755 --- a/release-scripts/next-version.sh +++ b/release-scripts/next-version.sh @@ -3,7 +3,6 @@ set -euo pipefail # Checks the latest version of Snyk CLI on npm and decides the next version. # Only output the next version to stdout. All other output should go to stderr. -RELEASE_BRANCH="main" NEXT_VERSION="$(convco version --bump)" CURRENT_TAG="$(git describe --tags `git rev-list --tags --max-count=1`)" RELEASE_CHANNEL="$($(dirname "$0")/determine-release-channel.sh)" diff --git a/release-scripts/prepare-release.sh b/release-scripts/prepare-release.sh index 6a31b654fa..1f29fd585a 100755 --- a/release-scripts/prepare-release.sh +++ b/release-scripts/prepare-release.sh @@ -28,10 +28,11 @@ echo "Generating release notes…" # Delete existing release notes if [ -f binary-releases/RELEASE_NOTES.md ]; then rm binary-releases/RELEASE_NOTES.md + rm binary-releases/version fi # Generate the release notes baseline from the commits -make binary-releases/RELEASE_NOTES.md +make binary-releases/RELEASE_NOTES.md clean-package-files format # Commit and push the release notes git add -f binary-releases/RELEASE_NOTES.md @@ -48,3 +49,8 @@ else exit 1 fi +echo "\n#################################################################################################" +echo "# Next Steps:" +echo "# 1. [optional] take a look at the release notes, edit and push changes if necessary. (binary-releases/RELEASE_NOTES.md)" +echo "# 2. Mark the created PR for review and merge it as soon as approved." +echo "#################################################################################################" From e54b227a4a05de78d3a210f099da93693f77fdc4 Mon Sep 17 00:00:00 2001 From: PeterSchafer <101886095+PeterSchafer@users.noreply.github.com> Date: Fri, 19 Apr 2024 12:47:13 +0200 Subject: [PATCH 56/58] fix(ci): Adapt script to work on different environments (#5182) --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index bb5e1c3202..153405a18f 100644 --- a/Makefile +++ b/Makefile @@ -98,7 +98,7 @@ $(BINARY_OUTPUT_FOLDER)/RELEASE_NOTES.md: prepack | $(BINARY_RELEASES_FOLDER_TS_ # if the releease notes are generated locally, the version contains something like X.Y.Z-dev.hash # the replacement below ensures that the version in the RELEASE_NOTES.md is X.Y.Z - sed -i '' -e "s/$(shell cat $(BINARY_OUTPUT_FOLDER)/version)/$(shell npx semver --coerce $(shell cat $(BINARY_OUTPUT_FOLDER)/version))/g" $(BINARY_OUTPUT_FOLDER)/RELEASE_NOTES.md + sed -i -e "s/$(shell cat $(BINARY_OUTPUT_FOLDER)/version)/$(shell npx semver --coerce $(shell cat $(BINARY_OUTPUT_FOLDER)/version))/g" $(BINARY_OUTPUT_FOLDER)/RELEASE_NOTES.md # Generates a shasum of a target with the same name. # See "Automatic Variables" in GNU Make docs (linked at the top) From f18cbcec7466b4ea1de9632fa2cef1aa68ff5f4b Mon Sep 17 00:00:00 2001 From: PeterSchafer <101886095+PeterSchafer@users.noreply.github.com> Date: Fri, 19 Apr 2024 16:15:09 +0200 Subject: [PATCH 57/58] feat(ci): First release on stable channel (#5183) From c03cc64b79395aa921619d084f019c2fee8daf7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Scha=CC=88fer?= <101886095+PeterSchafer@users.noreply.github.com> Date: Fri, 19 Apr 2024 18:05:46 +0200 Subject: [PATCH 58/58] docs: update release notes --- binary-releases/RELEASE_NOTES.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 binary-releases/RELEASE_NOTES.md diff --git a/binary-releases/RELEASE_NOTES.md b/binary-releases/RELEASE_NOTES.md new file mode 100644 index 0000000000..408a51235a --- /dev/null +++ b/binary-releases/RELEASE_NOTES.md @@ -0,0 +1,9 @@ +# [1.1291.0](https://github.com/snyk/snyk/compare/v1.1290.0...v1.1291.0) (2024-04-19) + +### Bug Fixes + +- **ci:** Adapt script to work on different environments ([#5182](https://github.com/snyk/snyk/issues/5182)) ([e54b227](https://github.com/snyk/snyk/commit/e54b227a4a05de78d3a210f099da93693f77fdc4)) + +### Features + +- **ci:** First release on stable channel ([#5183](https://github.com/snyk/snyk/issues/5183)) ([f18cbce](https://github.com/snyk/snyk/commit/f18cbcec7466b4ea1de9632fa2cef1aa68ff5f4b))