diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index f4b35369354095..f2d00f11fdb4bf 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,6 +1,11 @@ -FROM ghcr.io/containerbase/node:18.15.0@sha256:d7bd3e320e60dfd51a5b4ddbb01929f18d8c54b00c6f9d706e6dcfbc17dfee1e +FROM ghcr.io/containerbase/node:18.16.0 USER root +RUN install-apt make g++ + +# renovate: datasource=github-releases packageName=containerbase/python-prebuild +RUN install-tool python 3.11.3 + # renovate: datasource=npm RUN install-tool yarn 1.22.19 diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 306cb29b34a443..ff52204e6e3a68 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,21 +1,28 @@ { + "$schema": "https://raw.githubusercontent.com/devcontainers/spec/main/schemas/devContainer.schema.json", "hostRequirements": { "cpus": 4, - "memory": "8gb", + "memory": "7gb", "storage": "32gb" }, "name": "Renovate", "dockerFile": "Dockerfile", - "settings": { - "terminal.integrated.profiles.linux": { "bash": { "path": "/bin/bash" } }, - "terminal.integrated.defaultProfile.linux": "bash" + "customizations": { + "vscode": { + "settings": { + "terminal.integrated.profiles.linux": { + "bash": { "path": "/bin/bash" } + }, + "terminal.integrated.defaultProfile.linux": "bash" + }, + "extensions": [ + "dbaeumer.vscode-eslint", + "esbenp.prettier-vscode", + "orta.vscode-jest", + "EditorConfig.editorconfig" + ] + } }, - "extensions": [ - "dbaeumer.vscode-eslint", - "esbenp.prettier-vscode", - "orta.vscode-jest", - "EditorConfig.editorconfig" - ], "runArgs": [ "--cap-add=SYS_PTRACE", "--security-opt", diff --git a/.eslintrc.js b/.eslintrc.js index 259a035c36bb55..def4988a60d781 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -137,7 +137,7 @@ module.exports = { }, ], - '@typescript-eslint/unbound-method': 2, + '@typescript-eslint/unbound-method': [2, { ignoreStatic: true }], '@typescript-eslint/ban-types': 2, '@renovate/jest-root-describe': 2, diff --git a/.github/contributing.md b/.github/contributing.md index 1bc968d73d2ed8..decea2ffbb1414 100644 --- a/.github/contributing.md +++ b/.github/contributing.md @@ -14,7 +14,12 @@ If you want help with your Renovate configuration, go to the [discussions tab in ## Bug Reports and Feature Requests -If you've found a **bug** or have a **feature request** then please create an issue in this repository (but search first in case a similar issue already exists). +**Bugs**: First search for related bugs in the issues and discussions, if you don't find anything then: + +1. Create a [minimal reproduction](https://github.com/renovatebot/renovate/blob/main/docs/development/minimal-reproductions.md) +1. Open a new _discussion_ and link to the minimal reproduction + +For **feature requests**: first search for related requests in the issues and discussions, if you don't find anything: create a _discussion_. ## Code @@ -35,12 +40,13 @@ This makes it harder for us to review your work because we don't know what has c PRs will always be squashed by us when we merge your work. Commit as many times as you need in your pull request branch. -If you are updating your PR branch from within the GitHub PR interface, then only use the default "Update branch" button. +If you're updating your PR branch from within the GitHub PR interface, use the default "Update branch" button. +This is the "Update with merge commit" option in the dropdown. -Force pushing a PR is OK when: +Force pushing a PR, or using the "Update with rebase" button is OK when you: -- you need to make large changes on a PR which require a full review anyway -- you need to bring the branch up-to-date with the target branch and incorporating the changes is more work than to create a new PR +- make large changes on a PR which require a full review anyway +- bring the branch up-to-date with the target branch and incorporating the changes is more work than to create a new PR ## Apply maintainer provided review suggestions diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7e0c723117a77f..b0b1ab49ca4d65 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -55,7 +55,7 @@ jobs: NODE_VERSION: ${{ matrix.node-version }} steps: - - uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v3.5.0 + - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 with: fetch-depth: 2 @@ -93,7 +93,7 @@ jobs: run: yarn jest --ci --coverage ${{ env.coverage }} - name: Codecov - uses: codecov/codecov-action@40a12dcee2df644d47232dde008099a3e9e4f865 # v3.1.2 + uses: codecov/codecov-action@894ff025c7b54547a9a2a1e9f228beae737ad3c2 # v3.1.3 if: always() && env.coverage == 'true' - name: E2E Test @@ -106,7 +106,7 @@ jobs: timeout-minutes: 15 steps: - - uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v3.5.0 + - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 with: fetch-depth: 2 @@ -156,7 +156,7 @@ jobs: steps: # full checkout for semantic-release - - uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v3.5.0 + - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 with: fetch-depth: 0 diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index e98a663c7c7fb2..3130613022887a 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -22,7 +22,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v3.5.0 + uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 - name: Delete fixtures to suppress false positives run: | @@ -30,7 +30,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@d186a2a36cc67bfa1b860e6170d37fb9634742c7 # v2.2.11 + uses: github/codeql-action/init@b2c19fb9a2a485599ccf4ed5d65527d94bc57226 # v2.3.0 with: languages: javascript @@ -40,7 +40,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@d186a2a36cc67bfa1b860e6170d37fb9634742c7 # v2.2.11 + uses: github/codeql-action/autobuild@b2c19fb9a2a485599ccf4ed5d65527d94bc57226 # v2.3.0 # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -54,4 +54,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@d186a2a36cc67bfa1b860e6170d37fb9634742c7 # v2.2.11 + uses: github/codeql-action/analyze@b2c19fb9a2a485599ccf4ed5d65527d94bc57226 # v2.3.0 diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml index 73184c0fdb8973..5c45b7bdd56623 100644 --- a/.github/workflows/dependency-review.yml +++ b/.github/workflows/dependency-review.yml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest steps: - name: 'Checkout Repository' - uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v3.5.0 + uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 - name: 'Dependency Review' uses: actions/dependency-review-action@f46c48ed6d4f1227fb2d9ea62bf6bcbed315589e # v3.0.4 diff --git a/.github/workflows/devcontainer.yml b/.github/workflows/devcontainer.yml new file mode 100644 index 00000000000000..98463b0240c10b --- /dev/null +++ b/.github/workflows/devcontainer.yml @@ -0,0 +1,17 @@ +name: devcontainer +on: + pull_request: + branches: + - main + +jobs: + devcontainer-test: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + + - name: Build and run dev container task + uses: devcontainers/ci@57eaf0c9b518a76872bc429cdceefd65a912309b # v0.3.1900000329 + with: + runCmd: yarn build diff --git a/.github/workflows/release-npm.yml b/.github/workflows/release-npm.yml index ecdfb908973d85..f8f32c34c6d8dc 100644 --- a/.github/workflows/release-npm.yml +++ b/.github/workflows/release-npm.yml @@ -25,6 +25,7 @@ env: permissions: contents: read + id-token: write jobs: release-npm: @@ -38,7 +39,7 @@ jobs: echo "NPM_TAG=${{ github.event.inputs.tag }}" >> $GITHUB_ENV fi - - uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v3.5.0 + - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 with: ref: ${{ env.GIT_SHA }} diff --git a/.github/workflows/stale-action.yml b/.github/workflows/stale-action.yml index 2f918a83a9d625..0ef526217ed2d4 100644 --- a/.github/workflows/stale-action.yml +++ b/.github/workflows/stale-action.yml @@ -13,7 +13,7 @@ jobs: stale: runs-on: ubuntu-latest steps: - - uses: actions/stale@6f05e4244c9a0b2ed3401882b05d701dd0a7289b # v7.0.0 + - uses: actions/stale@1160a2240286f5da8ec72b1c0816ce2481aabf84 # v8.0.0 with: # Rate limit per run, (defaults to 30, but we've increased it to 40 for now). operations-per-run: 40 diff --git a/.github/workflows/update-data.yml b/.github/workflows/update-data.yml index 48b4f6c67505e0..12bfef2f6266ae 100644 --- a/.github/workflows/update-data.yml +++ b/.github/workflows/update-data.yml @@ -15,7 +15,7 @@ jobs: update-data: runs-on: ubuntu-latest steps: - - uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v3.5.0 + - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 - name: Set up Node.js ${{ env.NODE_VERSION }} uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 @@ -33,7 +33,7 @@ jobs: run: yarn prettier-fix - name: Create pull request - uses: peter-evans/create-pull-request@38e0b6e68b4c852a5500a94740f0e535e0d7ba54 # v4.2.4 + uses: peter-evans/create-pull-request@5b4a9f6a9e2af26e5f02351490b90d01eb8ec1e5 # v5.0.0 with: author: 'Renovate Bot ' branch: 'chore/update-static-data' diff --git a/.github/workflows/ws_scan.yaml b/.github/workflows/ws_scan.yaml index ad50866346a57d..f38944c6ac38ec 100644 --- a/.github/workflows/ws_scan.yaml +++ b/.github/workflows/ws_scan.yaml @@ -11,7 +11,7 @@ jobs: WS_SCAN: runs-on: ubuntu-latest steps: - - uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v3.5.0 + - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 - name: Download UA run: curl -LJO https://github.com/whitesource/unified-agent-distribution/releases/latest/download/wss-unified-agent.jar diff --git a/.npmrc b/.npmrc index 1dab4ed4c30209..0234a32dfacdba 100644 --- a/.npmrc +++ b/.npmrc @@ -1 +1,2 @@ save-exact = true +provenance = true diff --git a/.nvmrc b/.nvmrc index 55bffd620b9af5..6d80269a4f04ad 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -18.15.0 +18.16.0 diff --git a/docs/development/creating-editing-renovate-presets.md b/docs/development/creating-editing-renovate-presets.md index c62fcae8e1f1c7..2e7c5468a9c609 100644 --- a/docs/development/creating-editing-renovate-presets.md +++ b/docs/development/creating-editing-renovate-presets.md @@ -1,6 +1,6 @@ # Creating/editing Renovate presets -Renovate comes with default presets that you can find in the `lib/config/presets/internal` directory. +Renovate comes with default presets that you can find in the [`lib/config/presets/internal`](https://github.com/renovatebot/renovate/tree/main/lib/config/presets/internal) directory. You can suggest changes to the presets with a pull request. Follow the rules below to increase the chance that your pull request gets merged. diff --git a/docs/development/local-development.md b/docs/development/local-development.md index a141a9b3a537aa..d1714fe95a8132 100644 --- a/docs/development/local-development.md +++ b/docs/development/local-development.md @@ -47,9 +47,9 @@ If you already installed a part, skip the corresponding step. PS C:\Windows\system32> yarn --version ``` -#### VS Code Remote Development +#### VS Code Dev Containers -If you are using [VS Code](https://code.visualstudio.com/) you can skip installing [the prerequisites](#prerequisites) and work in a [development container](https://code.visualstudio.com/docs/remote/containers) instead. +If you are using [VS Code](https://code.visualstudio.com/) you can skip installing [the prerequisites](#prerequisites) and work in a [development container](https://code.visualstudio.com/docs/devcontainers/containers) instead. - Install the [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) and [check its system requirements](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers#system-requirements) - Open the repository folder in VS Code @@ -57,6 +57,12 @@ If you are using [VS Code](https://code.visualstudio.com/) you can skip installi The VS Code [integrated terminal](https://code.visualstudio.com/docs/editor/integrated-terminal) is now running in the container and can be used to run additional commands. +To build inside the container: + +```shell +yarn build +``` + #### Local Docker If, for some reason, you can't run the relevant versions on your local machine, you can run everything from a Docker image. diff --git a/docs/usage/config-presets.md b/docs/usage/config-presets.md index 635656ee5b6243..0afcd775de8299 100644 --- a/docs/usage/config-presets.md +++ b/docs/usage/config-presets.md @@ -164,7 +164,7 @@ In short, the number of `{{argx}}` parameters in the definition is how many para Parameters must be strings, non-quoted, and separated by commas if there are more than one. If you find that you are repeating config a lot, you might consider publishing one of these types of parameterised presets yourself. -Or if you think your preset would be valuable for others, please contribute a PR to the Renovate repository. +Or if you think your preset would be valuable for others, please contribute a PR to the Renovate repository, see [Contributing to presets](#contributing-to-presets). ## GitHub-hosted Presets @@ -211,7 +211,10 @@ Renovate will determine the current platform and look up the preset from there. ## Contributing to presets Have you configured a rule that you think others might benefit from? -Please consider contributing it to the [Renovate](https://github.com/renovatebot/renovate) repository so that it gains higher visibility and saves others from reinventing the same thing. +Please consider contributing it to the [Renovate repository](https://github.com/renovatebot/renovate/tree/main/lib/config/presets/internal) so that it gains higher visibility and saves others from reinventing the same thing. + +Create a [discussion](https://github.com/renovatebot/renovate/discussions) to propose your preset to the Renovate maintainers. +The maintainers can also help improve the preset, and let you know where to put it in the code. ## Organization level presets diff --git a/docs/usage/configuration-options.md b/docs/usage/configuration-options.md index f44b2ad0db4ca7..6b46b8c499012e 100644 --- a/docs/usage/configuration-options.md +++ b/docs/usage/configuration-options.md @@ -119,6 +119,12 @@ See [GitHub](https://docs.github.com/en/repositories/managing-your-repositorys-s If configured, Renovate will take a random sample of given size from assignees and assign them only, instead of assigning the entire list of `assignees` you have configured. +## autoApprove + +Setting this to `true` will automatically approve the PRs. + +You can also configure this using `packageRules` if you want to use it selectively (e.g. per-package). + ## autoReplaceGlobalMatch Setting this to `false` will replace only the first match during replacements updates. @@ -258,12 +264,6 @@ If you prefer that Renovate more silently automerge _without_ Pull Requests at a The final value for `automergeType` is `"pr-comment"`, intended only for users who already have a "merge bot" such as [bors-ng](https://github.com/bors-ng/bors-ng) and want Renovate to _not_ actually automerge by itself and instead tell `bors-ng` to merge for it, by using a comment in the PR. If you're not already using `bors-ng` or similar, don't worry about this option. -## azureAutoApprove - -Setting this to `true` will automatically approve the PRs in Azure DevOps. - -You can also configure this using `packageRules` if you want to use it selectively (e.g. per-package). - ## azureWorkItemId When creating a PR in Azure DevOps, some branches can be protected with branch policies to [check for linked work items](https://docs.microsoft.com/en-us/azure/devops/repos/git/branch-policies?view=azure-devops#check-for-linked-work-items). @@ -531,7 +531,7 @@ After we changed the [`baseBranches`](https://docs.renovatebot.com/configuration ``` -!!! caution +!!! warning The `configMigration` feature writes plain JSON for `.json` files, and JSON5 for `.json5` files. Renovate may downgrade JSON5 content to plain JSON. When downgrading JSON5 to JSON Renovate may also remove the JSON5 comments. @@ -553,7 +553,6 @@ Configure this option to `false` if you prefer Renovate to open a new issue when Constraints are used in package managers which use third-party tools to update "artifacts" like lock files or checksum files. Typically, the constraint is detected automatically by Renovate from files within the repository and there is no need to manually configure it. -Manually specifying constraints is supported for `ruby`, `bundler`, `composer`, `go`, `helmfile`, `npm`, `yarn`, `pnpm`, `python`, `pipenv`, and `poetry`. Constraints are also used to manually restrict which _datasource_ versions are possible to upgrade to based on their language support. For now this datasource constraint feature only supports `python`, other compatibility restrictions will be added in the future. @@ -854,7 +853,8 @@ The above would mean Renovate would not include files matching the above glob pa ## extends -See [shareable config presets](https://docs.renovatebot.com/config-presets) for details. +See [shareable config presets](./config-presets.md) for details. +Learn how to use presets by reading the [Key concepts, Presets](./key-concepts/presets.md/#how-to-use-presets) page. ## extractVersion @@ -912,6 +912,8 @@ Renovate can fetch release notes when they are hosted on one of these platforms: - GitHub (.com and Enterprise Server) - GitLab (.com and CE/EE) +If you are running on any platform except github.com, you need to [configure a Personal Access Token](https://docs.renovatebot.com/getting-started/running/#githubcom-token-for-release-notes) to allow Renovate to fetch release notes from github.com. + !!! note Renovate can only show release notes from some platforms and some package managers. @@ -992,17 +994,37 @@ If this option is enabled, reviewers will need to create a new PR if additional ## forkProcessing -By default, Renovate will skip over any repositories that are forked if Renovate is using `autodiscover` mode. -This includes if the forked repository has a Renovate config file in the repo, because Renovate can't tell if that file was added by the original repository or not. -If you wish to enable processing of a forked repository by Renovate when autodiscovering, you need to add `"forkProcessing": "enabled"` to your repository config or run the CLI command with `--fork-processing=enabled`. +By default, Renovate skips any forked repositories when in `autodiscover` mode. +It even skips a forked repository that has a Renovate configuration file, because Renovate doesn't know if that file was added by the forked repository. - -!!! note - Only the `onboardingConfigFileName` (which defaults to `renovate.json`) is supported for `forkProcessing`. You cannot use other filenames because Renovate will use the platform API to check only for the default filename. +**Process a fork in `autodiscover` mode`** + +If you want Renovate to run on a forked repository when in `autodiscover` mode then: + +- Ensure a `renovate.json` config exists with `"forkProcessing": "enabled"` in your repository, +- Or run the CLI command with `--fork-processing=enabled` + +**Process a fork in other modes** + +If you're running Renovate in some other mode, for example when giving a list of repositories to Renovate, but want to skip forked repositories: set `"forkProcessing": "disabled"` in your _global_ config. + +**When using the hosted GitHub Mend Renovate app** -If you are running in non-autodiscover mode (e.g. supplying a list of repositories to Renovate) but wish to skip forked repositories, you need to configure `"forkProcessing": "disabled"` in your global config. +The behavior of `forkProcessing` depends on how you allow Renovate to run on your account. -If you are using the hosted Mend Renovate then this option will be configured to `"enabled"` automatically if you "Selected" repositories individually but `"disabled"` if you installed for "All" repositories. If you have installed Renovate into "All" repositories but have a fork you want to use, then add `"forkProcessing": "enabled"` to the repository's `renovate.json` file. +**Renovate runs on all repositories** + +If you allow Renovate to run on all your repositories, `forkProcessing` will be `"disabled"`. +To run Renovate on a fork: add `"forkProcessing": "enabled"` to the forked repository's `renovate.json` file. + +**Renovate runs on selected repositories** + +If you allow Renovate to run on "Selected" repositories, `forkProcessing` will be `"enabled"` for each "Selected" repository. + +**Allowed filenames** + +Only the `onboardingConfigFileName` (which defaults to `renovate.json`) is supported for `forkProcessing`. +You can't use other filenames because Renovate only checks the default filename when using the Git-hosting platform's API. ## gitAuthor @@ -1037,6 +1059,17 @@ Under the hood, it creates a MR-level approval rule where `approvals_required` i This option works only when `automerge=true`, `automergeType=pr` or `automergeType=branch`, and `platformAutomerge=true`. Also, approval rules overriding should not be [prevented in GitLab settings](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/settings.html#prevent-editing-approval-rules-in-merge-requests). +## goGetDirs + +By default, Renovate will run `go get -d -t ./...` to update the `go.sum`. +If you need to modify this path, for example in order to ignore directories, you can override the default `./...` value using this option: + +```json +{ + "goGetDirs": ["./some-project/", "./tools/..."] +} +``` + ## golang Configuration added here applies for all Go-related updates. @@ -1346,6 +1379,31 @@ Example: If enabled, this allows a single TCP connection to remain open for multiple HTTP(S) requests/responses. +### artifactAuth + +You may use this field whenever it is needed to only enable authentication for a specific set of managers. + +For example, using this option could be used whenever authentication using Git for private composer packages is already being handled through the use of SSH keys, which results in no need for also setting up authentication using tokens. + +```json +{ + "hostRules": [ + { + "hostType": "gitlab", + "matchHost": "gitlab.myorg.com", + "token": "abc123", + "artifactAuth": ["composer"] + } + ] +} +``` + +Supported artifactAuth and hostType combinations: + +| artifactAuth | hostTypes | +| ------------ | ------------------------------------------- | +| `composer` | `gitlab`, `packagist`, `github`, `git-tags` | + ### matchHost This can be a base URL (e.g. `https://api.github.com`) or a hostname like `github.com` or `api.github.com`. @@ -1518,14 +1576,14 @@ Change this setting to `true` if you want to use internal Renovate checks toward ## internalChecksFilter This setting determines whether Renovate controls when and how filtering of internal checks are performed, particularly when multiple versions of the same update type are available. -Currently this applies to the `stabilityDays` check only. +Currently this applies to the `minimumReleaseAge` check only. - `none`: No filtering will be performed, and the highest release will be used regardless of whether it's pending or not - `strict`: All pending releases will be filtered. PRs will be skipped unless a non-pending version is available - `flexible`: Similar to strict, but in the case where all versions are pending then a PR will be created with the highest pending version -The `flexible` mode can result in "flapping" of Pull Requests, where e.g. a pending PR with version `1.0.3` is first released but then downgraded to `1.0.2` once it passes `stabilityDays`. -We recommend that you use the `strict` mode, and enable the `dependencyDashboard` so that you have visibility into suppressed PRs. +The `flexible` mode can result in "flapping" of Pull Requests, for example: a pending PR with version `1.0.3` is first released but then downgraded to `1.0.2` once it passes `minimumReleaseAge`. +We recommend that you use the `strict` mode, and enable the `dependencyDashboard` so that you can see suppressed PRs. ## java @@ -1608,6 +1666,60 @@ Depending on its running schedule, Renovate may run a few times within that time Add to this object if you wish to define rules that apply only to major updates. +## minimumReleaseAge + +If this is set _and_ an update has a release timestamp header, then Renovate will check if the set duration has passed. + +Note: Renovate will wait for the set duration to pass for each **separate** version. +Renovate does not wait until the package has seen no releases for x time-duration(`minimumReleaseAge`). +`minimumReleaseAge` is not intended to help with slowing down fast releasing project updates. +If you want to slow down PRs for a specific package, setup a custom schedule for that package. +Read [our selective-scheduling help](https://docs.renovatebot.com/noise-reduction/#selective-scheduling) to learn how to set the schedule. + +If the time since the release is less than the set `minimumReleaseAge` a "pending" status check is added to the branch. +If enough days have passed then the "pending" status is removed, and a "passing" status check is added. + +Some datasources don't have a release timestamp, in which case this feature is not compatible. +Other datasources may have a release timestamp, but Renovate does not support it yet, in which case a feature request needs to be implemented. + +Maven users: you cannot use `minimumReleaseAge` if a Maven source returns unreliable `last-modified` headers. + + +!!! note + Configuring this option will add a `renovate/stability-days` option to the status checks. + +There are a couple of uses for `minimumReleaseAge`: + + + +#### Suppress branch/PR creation for X days + +If you combine `minimumReleaseAge=3 days` and `internalChecksFilter="strict"` then Renovate will hold back from creating branches until 3 or more days have elapsed since the version was released. +We recommend that you set `dependencyDashboard=true` so you can see these pending PRs. + +#### Prevent holding broken npm packages + +npm packages less than 72 hours (3 days) old can be unpublished, which could result in a service impact if you have already updated to it. +Set `minimumReleaseAge` to `3 days` for npm packages to prevent relying on a package that can be removed from the registry: + +```json +{ + "packageRules": [ + { + "matchDatasources": ["npm"], + "minimumReleaseAge": "3 days" + } + ] +} +``` + +#### Await X time duration before Automerging + +If you enabled `automerge` _and_ `minimumReleaseAge`, it means that PRs will be created immediately but automerging will be delayed until the time-duration has passed. +This works because Renovate will add a "renovate/stability-days" pending status check to each branch/PR and that pending check will prevent the branch going green to automerge. + + + ## minor Add to this object if you wish to define rules that apply only to minor updates. @@ -1721,22 +1833,25 @@ For example, if you have an `examples` directory and you want all updates to tho } ``` -If you wish to limit Renovate to apply configuration rules to certain files in the root repository directory, you have to use `matchPaths` with either a partial string match or a minimatch pattern. +If you wish to limit Renovate to apply configuration rules to certain files in the root repository directory, you have to use `matchPaths` with a `minimatch` pattern or use [`matchFiles`](#matchfiles) with an exact match. For example you have multiple `package.json` and want to use `dependencyDashboardApproval` only on the root `package.json`: ```json { "packageRules": [ { - "matchPaths": ["+(package.json)"], + "matchFiles": ["package.json"], "dependencyDashboardApproval": true } ] } ``` -Important to know: Renovate will evaluate all `packageRules` and not stop once it gets a first match. -You should order your `packageRules` in ascending order of importance so that more important rules come later and can override settings from earlier rules if needed. + +!!! tip + Renovate evaluates all `packageRules` and does not stop after the first match. + Order your `packageRules` so the least important rules are at the _top_, and the most important rules at the _bottom_. + This way important rules override settings from earlier rules if needed. !!! warning @@ -1975,7 +2090,7 @@ The `currentVersion` field will be one of the following (in order of preference) Consider using instead `matchCurrentValue` if you wish to match against the raw string value of a dependency. -`matchCurrentVersion` can be an exact SemVer version or a SemVer range: +`matchCurrentVersion` can be an exact version or a version range: ```json { @@ -1988,6 +2103,10 @@ Consider using instead `matchCurrentValue` if you wish to match against the raw } ``` +The syntax of the version range must follow the [versioning scheme](https://docs.renovatebot.com/modules/versioning/#supported-versioning) used by the matched package(s). +This is usually defined by the [manager](https://docs.renovatebot.com/modules/manager/#supported-managers) which discovered them or by the default versioning for the package's [datasource](https://docs.renovatebot.com/modules/datasource/). +For example, a Gradle package would typically need Gradle constraint syntax (e.g. `[,7.0)`) and not SemVer syntax (e.g. `<7.0`). + This field also supports Regular Expressions which must begin and end with `/`. For example, the following enforces that only `1.*` versions will be used: @@ -2022,11 +2141,17 @@ Renovate will compare `matchFiles` for an exact match against the dependency's p For example the following would match `package.json` but not `package/frontend/package.json`: -``` - "matchFiles": ["package.json"], +```json +{ + "packageRules": [ + { + "matchFiles": ["package.json"] + } + ] +} ``` -Use `matchPaths` instead if you need more flexible matching. +Use [`matchPaths`](#matchpaths) instead if you need more flexible matching. ### matchDepNames @@ -2088,9 +2213,9 @@ Just like the earlier `matchPackagePatterns` example, the above will configure ` ### matchPaths -Renovate finds the file(s) listed in `matchPaths` with a minimatch glob pattern. +Renovate finds the file(s) listed in `matchPaths` with a `minimatch` glob pattern. -For example the following would match any `package.json`, including files like `backend/package.json`: +For example the following matches any `package.json`, including files like `backend/package.json`: ```json { @@ -2104,7 +2229,7 @@ For example the following would match any `package.json`, including files like ` } ``` -The following would match any file in directories starting with `app/`: +The following matches any file in directories starting with `app/`: ```json { @@ -2118,6 +2243,11 @@ The following would match any file in directories starting with `app/`: } ``` + +!!! warning + Partial matches for `matchPaths` are deprecated. + Please use a `minimatch` glob pattern or switch to [`matchFiles`](#matchfiles) if you need exact matching. + ### matchSourceUrlPrefixes Here's an example of where you use this to group together all packages from the `renovatebot` GitHub org: @@ -2150,8 +2280,8 @@ Here's an example of where you use this to group together all packages from the ### matchUpdateTypes -Use this field to match rules against types of updates. -For example to apply a special label for Major updates: +Use `matchUpdateTypes` to match rules against types of updates. +For example to apply a special label to `major` updates: ```json { @@ -2164,6 +2294,13 @@ For example to apply a special label for Major updates: } ``` + +!!! warning + Packages that follow SemVer are allowed to make breaking changes in _any_ `0.x` version, even `patch` and `minor`. + Check if you're using any `0.x` package, and see if you need custom `packageRules` for it. + When setting up automerge for dependencies, make sure to stop accidental automerges of `0.x` versions. + Read the [automerge non-major updates](./key-concepts/automerge.md#automerge-non-major-updates) docs for a config example that blocks `0.x` updates. + ### matchConfidence @@ -2583,7 +2720,7 @@ This is why we configured an upper limit for how long we wait until creating a P !!! note - If the option `stabilityDays` is non-zero then Renovate disables the `prNotPendingHours` functionality. + If the option `minimumReleaseAge` is non-zero then Renovate disables the `prNotPendingHours` functionality. ## prPriority @@ -2613,6 +2750,14 @@ Here's an example of how you would define PR priority so that devDependencies ar The PR title is important for some of Renovate's matching algorithms (e.g. determining whether to recreate a PR or not) so ideally don't modify it much. +## prTitleStrict + +There are certain scenarios where the default behavior appends extra context to the PR title. + +These scenarios include if a `baseBranch` or if there is a grouped update and either `separateMajorMinor` or `separateMinorPatch` is true. + +Using this option allows you to skip these default behaviors and use other templating methods to control the format of the PR title. + ## printConfig This option is useful for troubleshooting, particularly if using presets. @@ -3192,55 +3337,6 @@ Configure this to `true` if you wish to get one PR for every separate major vers e.g. if you are on webpack@v1 currently then default behavior is a PR for upgrading to webpack@v3 and not for webpack@v2. If this setting is true then you would get one PR for webpack@v2 and one for webpack@v3. -## stabilityDays - -If this is set to a non-zero value, _and_ an update has a release timestamp header, then Renovate will check if the "stability days" have passed. - -Note: Renovate will wait for the set number of `stabilityDays` to pass for each **separate** version. -Renovate does not wait until the package has seen no releases for x `stabilityDays`. -`stabilityDays` is not intended to help with slowing down fast releasing project updates. -If you want to slow down PRs for a specific package, setup a custom schedule for that package. -Read [our selective-scheduling help](https://docs.renovatebot.com/noise-reduction/#selective-scheduling) to learn how to set the schedule. - -If the number of days since the release is less than the set `stabilityDays` a "pending" status check is added to the branch. -If enough days have passed then the "pending" status is removed, and a "passing" status check is added. - -Some datasources do not provide a release timestamp (in which case this feature is not compatible), and other datasources may provide a release timestamp but it's not supported by Renovate (in which case a feature request needs to be implemented). - -Maven users: you cannot use `stabilityDays` if a Maven source returns unreliable `last-modified` headers. - -There are a couple of uses for `stabilityDays`: - - - -#### Suppress branch/PR creation for X days - -If you combine `stabilityDays=3` and `internalChecksFilter="strict"` then Renovate will hold back from creating branches until 3 or more days have elapsed since the version was released. -It's recommended that you enable `dependencyDashboard=true` so you don't lose visibility of these pending PRs. - -#### Prevent holding broken npm packages - -npm packages less than 72 hours (3 days) old can be unpublished, which could result in a service impact if you have already updated to it. -Set `stabilityDays` to 3 for npm packages to prevent relying on a package that can be removed from the registry: - -```json -{ - "packageRules": [ - { - "matchDatasources": ["npm"], - "stabilityDays": 3 - } - ] -} -``` - -#### Await X days before Automerging - -If you have both `automerge` as well as `stabilityDays` enabled, it means that PRs will be created immediately but automerging will be delayed until X days have passed. -This works because Renovate will add a "renovate/stability-days" pending status check to each branch/PR and that pending check will prevent the branch going green to automerge. - - - ## stopUpdatingLabel This feature only works on supported platforms, check the table above. diff --git a/docs/usage/docker.md b/docs/usage/docker.md index 523a292ec3c643..07973d42280e6a 100644 --- a/docs/usage/docker.md +++ b/docs/usage/docker.md @@ -388,7 +388,7 @@ To get access to the token a custom Renovate Docker image is needed that include The Dockerfile to create such an image can look like this: ```Dockerfile -FROM renovate/renovate:35.40.0 +FROM renovate/renovate:35.58.0 # Include the "Docker tip" which you can find here https://cloud.google.com/sdk/docs/install # under "Installation" for "Debian/Ubuntu" RUN ... diff --git a/docs/usage/getting-started/running.md b/docs/usage/getting-started/running.md index d9da42ae870780..ccdc504552cf95 100644 --- a/docs/usage/getting-started/running.md +++ b/docs/usage/getting-started/running.md @@ -29,8 +29,6 @@ If you need Renovate to support any non-npm lock files like Bundler then you'll The `renovate` npm package is compatible with all of Renovate's supported platforms. -Renovate requires Node.js `>=14.15.0` and Git `>=2.33.0`. - #### Docker image The `renovate` npm package is also distributed via pre-built Node.js images on Docker Hub (`renovate/renovate`). diff --git a/docs/usage/golang.md b/docs/usage/golang.md index 705e294f208096..fd560949a99308 100644 --- a/docs/usage/golang.md +++ b/docs/usage/golang.md @@ -13,7 +13,7 @@ Renovate supports upgrading dependencies in `go.mod` files and their accompanyin 1. Renovate extracts existing dependencies from `require` statements 1. Renovate resolves the dependency's source repository and checks for SemVer tags if found. Otherwise commits and `v0.0.0-....` syntax will be used 1. If Renovate finds an update, Renovate will update `go.mod` to the new value -1. Renovate runs `go get` to update the `go.sum` files +1. Renovate runs `go get` to update the `go.sum` files (you can configure which directory are included using the `goGetDirs` option) 1. If the user has enabled the option `gomodUpdateImportPaths` in the [`postUpdateOptions`](https://docs.renovatebot.com/configuration-options/#postupdateoptions) array, then Renovate uses [mod](https://github.com/marwan-at-work/mod) to update import paths on major updates, which can update any Go source file 1. If the user has any of the available `gomodTidy` options (e.g. `gomodTidy1.17`) in the [`postUpdateOptions`](https://docs.renovatebot.com/configuration-options/#postupdateoptions), then Renovate runs `go mod tidy` with the respective options (multiple options are allowed). 1. `go mod vendor` is run if vendored modules are detected diff --git a/docs/usage/key-concepts/presets.md b/docs/usage/key-concepts/presets.md index f6bf06d9b5991f..778d3f288f0aed 100644 --- a/docs/usage/key-concepts/presets.md +++ b/docs/usage/key-concepts/presets.md @@ -16,6 +16,21 @@ Use presets to: - Share your configuration with others - Use somebody else's configuration and extend it with your own rules +## How to use presets + +Let's say you're using the `config:base` preset, and want to pin your GitHub Action digests. +Instead of writing your own Renovate config, you search through Renovate's built-in presets. +You find the the `helpers:pinGitHubActionDigests` preset and add it to the `extends` array: + +```json +{ + "extends": ["config:base", "helpers:pinGitHubActionDigests"] +} +``` + +Renovate now follows the rules for `config:base` plus the rules for `helpers:pinGitHubActionDigests`. +If there is a logical conflict between presets, then the last preset in the array wins. + ## Managing config for many repositories If you manage Renovate for many repositories, then you should create a global preset configuration. @@ -32,6 +47,12 @@ Renovate comes with a lot of built-in presets that you can use. Browse [Renovate's default presets](https://docs.renovatebot.com/presets-default/) to find any that are useful to you. Once you find a preset you like, put it in an `extends` array in your config file. +### Contributing a new built-in preset + +If you have a Renovate config that may help others, you can put it into Renovate's built-in presets. + +Read [Contributing to presets](../config-presets.md#contributing-to-presets) to learn how. + ## Summary In short: diff --git a/docs/usage/key-concepts/pull-requests.md b/docs/usage/key-concepts/pull-requests.md index b930aa8c7a244a..75164c5fd95906 100644 --- a/docs/usage/key-concepts/pull-requests.md +++ b/docs/usage/key-concepts/pull-requests.md @@ -7,23 +7,31 @@ This page describes how Renovate pull requests work. ## How Renovate finds existing PRs -Renovate does not keep any kind of database/state of its own about open or closed Pull Requests. +Renovate does not need to maintain any database/state about open or closed Pull Requests. Instead, it uses the code platform's APIs to search and find such PRs. -Locating of existing PRs - whether open or closed - is done by matching both the branch name (e.g. `renovate/lodash-4.x`) and Pull Request title (e.g. `Update lodash to v4.17.21`). +Renovate finds existing PRs (open or closed) by matching both: -In cases like the above, there is typically at most one existing PR with the desired branch + title combination. -When grouping is enabled by users, and PRs have titles like "All non-major updates", then there may be multiple past PRs which match. +- the branch name, for example: `renovate/lodash-4.x`, +- _and_ the Pull Request title, for example: `Update lodash to v4.17.21` + +In cases like the above, there is typically one existing PR with a matching branch name and PR title. +But if you group PRs and use titles like "All non-major updates", then multiple past PRs may match. ## Normal PRs -As described above, Renovate PRs normally have some uniqueness in their title relating to the version in the upgrade. -In such cases, if a user closes such a PR, it can be inferred that they don't want to see it again in future. -For example, they wish to ignore `lodash@4.17.21`. +As explained above, Renovate PRs normally have some "uniqueness" in their title relating to the version in the upgrade. +When you close a "unique" PR, Renovate assumes you don't want to see that PR again in future, for example: + +1. You ignored `lodash@4.17.21` by closing Renovate's PR +1. Renovate assumes you don't want any updates to `4.17.21` of `lodash` +1. Renovate creates a new PR when the branch + title "uniqueness" exists again, like when `lodash@4.17.22` releases -In such cases, new PRs won't be created until the branch+title uniqueness exists again, such as if there is a `lodash@4.17.22`. +Renovate behaves similarly for `major` updates, for example: -Similarly in the case of major updates (such as "Update lodash to v4") then it can be inferred that the user wishes to ignore all of v4 of `lodash`, even when newer v4 versions are available. +1. You ignored a `major` update for Lodash (pr title: "Update lodash to v4") by closing Renovate's PR +1. Renovate assumes you don't want any updates to `v4` of `lodash` +1. Renovate won't create any update PRs for `v4` of `lodash`, even if there are newer versions of `v4` ## Immortal PRs @@ -62,7 +70,7 @@ Then the update becomes "Update react (major)", which is not safely ignorable, i ### Future plans for immortal PRs In the future we may embed metadata in each PR identifying the exact files and packages + versions that PR contains. -Then we could allow such PRs to be closed/ignored but then as soon as there's any chance to files/packages/versions being updated then we'd be cached busted and create a new PR. +Then we could allow such PRs to be closed/ignored but then as soon as there's any chance to files/packages/versions being updated then we'd be cache busted and create a new PR. If you regularly wish to close immortal PRs, it's an indication that you may be grouping too widely. ### How to fix immortal PRs diff --git a/docs/usage/noise-reduction.md b/docs/usage/noise-reduction.md index f3d36eb5faf197..01cb98055776a1 100644 --- a/docs/usage/noise-reduction.md +++ b/docs/usage/noise-reduction.md @@ -176,7 +176,8 @@ Let's automerge it if all the linting updates pass: ``` Have you come up with a rule that you think others would benefit from? -How about a PR back to [renovate-config](https://github.com/singapore/renovate-config) with the above rule named `":automergeEslintWeekly"` ? +How about a PR to [our presets](https://github.com/renovatebot/renovate/tree/main/lib/config/presets/internal)? +For example the above rule could be named `":automergeEslintWeekly"` in `schedule.ts`. ## Lock file considerations diff --git a/docs/usage/rust.md b/docs/usage/rust.md index cf7494e0b41293..45365bbfa46c76 100644 --- a/docs/usage/rust.md +++ b/docs/usage/rust.md @@ -11,7 +11,7 @@ Renovate supports upgrading dependencies in `Cargo.toml` files and their accompa 1. Renovate searches in each repository for any `Cargo.toml` files 1. Renovate extracts existing dependencies from `[dependencies]`, `[dev-dependencies]`, `[build-dependencies]` and `[workspace.dependencies]` -1. Renovate tries to find and parse a `.cargo/config.toml` file to discover index URLs for private registries +1. Renovate looks up Cargo configuration to find index URLs for private registries 1. Renovate resolves the dependency's version using the crates.io API or by cloning the index URL 1. If Renovate finds an update, Renovate will use `cargo update` to update both `Cargo.toml` and `Cargo.lock` @@ -19,6 +19,16 @@ Renovate supports upgrading dependencies in `Cargo.toml` files and their accompa Renovate updates Rust crates by default. +## Cargo configuration and private registry discovery + +Renovate can find private registry URLs in these Cargo configuration files: + +- `.cargo/config.toml` +- `.cargo/config` (legacy) + +Renovate can also find private registry URLs via a `CARGO_REGISTRIES__INDEX` environment variable. +Read the [Rust environment variables docs](https://doc.rust-lang.org/cargo/reference/environment-variables.html#configuration-environment-variables) to learn more. + ## Private crate registries and private Git dependencies If any dependencies are hosted in private Git repositories, [Git Authentication for cargo](https://doc.rust-lang.org/cargo/appendix/git-authentication.html) must be set up. diff --git a/docs/usage/self-hosted-configuration.md b/docs/usage/self-hosted-configuration.md index 4c3c178ef7c660..e0fb0cc5ed8fec 100644 --- a/docs/usage/self-hosted-configuration.md +++ b/docs/usage/self-hosted-configuration.md @@ -470,6 +470,12 @@ Use the `globalExtends` field if your preset has any global-only configuration o Use the `extends` field instead of this if, for example, you need the ability for a repository config (e.g. `renovate.json`) to be able to use `ignorePresets` for any preset defined in global config. + +!!! warning + `globalExtends` presets can't be private. + When Renovate resolves `globalExtends` it does not fully process the configuration. + This means that Renovate does not have the authentication it needs to fetch private things. + ## logContext `logContext` is included with each log entry only if `logFormat="json"` - it is not included in the pretty log output. diff --git a/docs/usage/user-stories/.pages b/docs/usage/user-stories/.pages index 328263cc25e5fd..514440edf04e85 100644 --- a/docs/usage/user-stories/.pages +++ b/docs/usage/user-stories/.pages @@ -1,4 +1,5 @@ title: User Stories nav: - 'Swissquote': 'swissquote.md' + - 'Maintaining AUR packages with Renovate': 'maintaining-aur-packages-with-renovate.md' diff --git a/docs/usage/user-stories/maintaining-aur-packages-with-renovate.md b/docs/usage/user-stories/maintaining-aur-packages-with-renovate.md new file mode 100644 index 00000000000000..a9da98da7578d2 --- /dev/null +++ b/docs/usage/user-stories/maintaining-aur-packages-with-renovate.md @@ -0,0 +1,172 @@ + + + +# Maintaining AUR packages with Renovate + +> This article was written by [Jamie Magee](https://github.com/JamieMagee) and originally published on [Jamie Magee's blog](https://jamiemagee.co.uk/blog/maintaining-aur-packages-with-renovate/). + + +!!! note + Jamie Magee helps to maintain Renovate. + They obviously like Renovate, and want you to use it. + +One big advantage that Arch Linux has over other distributions, apart from being able to say “BTW I use Arch.”, is the Arch User Repository (AUR). +It’s a community-driven repository with over 80,000 packages. +If you’re looking for a package, chances are you'll find it in the AUR. + +Keeping all those packages up to date, takes a lot of manual effort by a lot of volunteers. +People have created and used tools, like [`urlwatch`](https://github.com/thp/urlwatch) and [`aurpublish`](https://github.com/eli-schwartz/aurpublish), to let them know when upstream releases are cut and automate some parts of the process. +I know I do. +But I wanted to automate the entire process. +I think [Renovate](https://github.com/renovatebot/renovate/) can help here. + +## Updating versions with Renovate + +Renovate is an automated dependency update tool. +You might have seen it opening pull requests on GitHub and making updates for npm or other package managers, but it’s a lot more powerful than just that. + +Renovate has a couple of concepts that I need to explain first: [datasources](../modules/datasource/index.md) and [managers](../modules/manager/index.md). +Datasources define where to look for new versions of a dependency. +Renovate comes with over 50 different datasources, but the one that is important for AUR packages is the [`git-tags` datasource](https://docs.renovatebot.com/modules/datasource/#git-tags-datasource). +Managers are the Renovate concept for package managers. +There isn’t an AUR or `PKGBUILD` manager, but there is a [regex manager](https://docs.renovatebot.com/modules/manager/regex/) that I can use. + +I can create a `renovate.json` configuration with the following regex manager configuration: + +```json +{ + "regexManagers": [ + { + "fileMatch": ["(^|/)PKGBUILD$"], + "matchStrings": [ + "pkgver=(?.*) # renovate: datasource=(?.*) depName=(?.*)" + ], + "extractVersionTemplate": "^v?(?.*)$" + } + ] +} +``` + +Breaking that down: + +- The `fileMatch` setting tells Renovate to look for any `PKGBUILD` files in a repository +- The `matchStrings` is the regex format to extract the version, datasource, and dependency name from the `PKGBUILD` +- The `extractVersionTemplate` is to handle a “v” in front of any version number that is sometimes added to Git tags + +And here’s an extract from the PKGBUILD for the [bicep-bin](https://aur.archlinux.org/packages/bicep-bin) AUR package that I maintain: + +```bash +pkgver=0.15.31 # renovate: datasource=github-tags depName=Azure/bicep +``` + +Here I’m configuring Renovate to use the [`github-tags`](https://docs.renovatebot.com/modules/datasource/github-tags/) datasource and to look in the [`Azure/bicep` GitHub repository](https://github.com/Azure/bicep) for new versions. +That means it’ll look in the [list of tags for the `Azure/bicep` repository](https://github.com/Azure/bicep/tags) for any new versions. +If Renovate finds any new versions, it’ll automatically update the `PKGBUILD` and open a pull request with the updated version. + +So I’ve automated the `PKGBUILD` update, but that’s only half of the work. +The checksums and `.SRCINFO` must be updated before pushing to the AUR. +Unfortunately, Renovate can’t do that (yet, see [Renovate issue #16923](https://github.com/renovatebot/renovate/issues/16923)), but GitHub Actions can! + +## Updating checksums and `.SRCINFO` with GitHub Actions + +Updating the checksums with `updpkgsums` is easy, and generating an updated `.SRCINFO` with `makepkg --printsrcinfo > .SRCINFO` is straightforward too. +But doing that for a whole repository of AUR packages is going to be a little trickier. +So let me build up the GitHub actions workflow step-by-step. + +First, I only want to run this workflow on pull requests targeting the `main` branch. + +```yaml +on: + pull_request: + types: + - opened + - synchronize + branches: + - main +``` + +Next, I’m going to need to check out the entire history of the repository, so I can compare the files changed in the latest commit with the Git history. + +```yaml +jobs: + updpkgsums: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + with: + fetch-depth: 0 + ref: ${{ github.ref }} +``` + +Getting the package that changed in a pull request requires a little bit of shell magic. + +```yaml +- name: Find updated package + run: | + #!/usr/bin/env bash + set -euxo pipefail + + echo "pkgbuild=$(git diff --name-only origin/main origin/${GITHUB_HEAD_REF} "*PKGBUILD" | head -1 | xargs dirname)" >> $GITHUB_ENV +``` + +Now I’ve found the package that changed in the Renovate pull request, I can update the files. + +This step in the workflow uses a private GitHub Action that I have in my `aur-packages` repository. +I’m not going to break it down here, but at its core it runs `updpkgsums` and `makepkg --printsrcinfo > .SRCINFO` with a little extra configuration required to run Arch Linux on GitHub Actions runners. +You can [check out the full code on GitHub](https://github.com/JamieMagee/aur-packages/tree/main/.github/actions/aur). + +```yaml +- name: Validate package + if: ${{ env.pkgbuild != '' }} + uses: ./.github/actions/aur + with: + action: 'updpkgsums' + pkgname: ${{ env.pkgbuild }} +``` + +Finally, once the `PKGBUILD` and `.SRCINFO` are updated I need to commit that change back to the pull request. + +```yaml +- name: Commit + if: ${{ env.pkgbuild != '' }} + uses: stefanzweifel/git-auto-commit-action@3ea6ae190baf489ba007f7c92608f33ce20ef04a # v4.16.0 + with: + file_pattern: '*/PKGBUILD */.SRCINFO' +``` + +Check out [this pull request for `bicep-bin`](https://github.com/JamieMagee/aur-packages/pull/62) where Renovate opened a pull request, and my GitHub Actions workflow updated the `b2sums` in the `PKGBUILD` and updated the `.SRCINFO`. + +But why stop there? +Let’s talk about publishing. + +## Publishing to the AUR + +Each AUR package is its own Git repository. +So to update a package in the AUR, I only need to push a new commit with the updated `PKGBUILD` and `.SRCINFO`. +Thankfully, [KSXGitHub](https://github.com/KSXGitHub) created the [`github-actions-deploy-aur` GitHub Action](https://github.com/KSXGitHub/github-actions-deploy-aur) to streamline the whole process. + +If I create a new GitHub Actions workflow to publish to the AUR, I can reuse the first two steps from my previous workflow to check out the repository and find the updated package. +Then all I need to do is to use the `github-actions-deploy-aur` GitHub Action: + +```yaml +- name: Publish package + uses: KSXGitHub/github-actions-deploy-aur@065b6056b25bdd43830d5a3f01899d0ff7169819 # v2.6.0 + if: ${{ env.pkgbuild != '' }} + with: + pkgname: ${{ env.pkgbuild }} + pkgbuild: ${{ env.pkgbuild }}/PKGBUILD + commit_username: ${{ secrets.AUR_USERNAME }} + commit_email: ${{ secrets.AUR_EMAIL }} + ssh_private_key: ${{ secrets.AUR_SSH_PRIVATE_KEY }} +``` + +### All together now + +If you own any AUR packages and want to automate some of the maintenance burden, check out [my AUR packages template GitHub repository](https://github.com/JamieMagee/aur-packages-template/). +It contains all of the steps I showed in this blog post. +And if you want to see how it works in practice, check out [my AUR packages GitHub repository](https://github.com/JamieMagee/aur-packages). diff --git a/lib/config/migrations/custom/datasource-migration.spec.ts b/lib/config/migrations/custom/datasource-migration.spec.ts index 10eda1e06a7109..53540fddf463cc 100644 --- a/lib/config/migrations/custom/datasource-migration.spec.ts +++ b/lib/config/migrations/custom/datasource-migration.spec.ts @@ -22,4 +22,15 @@ describe('config/migrations/custom/datasource-migration', () => { } ); }); + + it('should migrate node', () => { + expect(DatasourceMigration).toMigrate( + { + datasource: 'node', + }, + { + datasource: 'node-version', + } + ); + }); }); diff --git a/lib/config/migrations/custom/datasource-migration.ts b/lib/config/migrations/custom/datasource-migration.ts index d9158db39c2dc4..25c114f1147f41 100644 --- a/lib/config/migrations/custom/datasource-migration.ts +++ b/lib/config/migrations/custom/datasource-migration.ts @@ -18,6 +18,8 @@ export function migrateDatasource(value: string): string { return 'java-version'; case 'dotnet': return 'dotnet-version'; + case 'node': + return 'node-version'; } return value; } diff --git a/lib/config/migrations/custom/match-datasources-migration.spec.ts b/lib/config/migrations/custom/match-datasources-migration.spec.ts index 1a8c8ac579d3c3..8efaf46950d39b 100644 --- a/lib/config/migrations/custom/match-datasources-migration.spec.ts +++ b/lib/config/migrations/custom/match-datasources-migration.spec.ts @@ -4,10 +4,15 @@ describe('config/migrations/custom/match-datasources-migration', () => { it('should migrate properly', () => { expect(MatchDatasourcesMigration).toMigrate( { - matchDatasources: ['adoptium-java', 'dotnet', 'npm'], + matchDatasources: ['adoptium-java', 'dotnet', 'npm', 'node'], }, { - matchDatasources: ['java-version', 'dotnet-version', 'npm'], + matchDatasources: [ + 'java-version', + 'dotnet-version', + 'npm', + 'node-version', + ], } ); }); diff --git a/lib/config/migrations/custom/match-datasources-migration.ts b/lib/config/migrations/custom/match-datasources-migration.ts index 5d87e57d453f19..9beb79fc3f067b 100644 --- a/lib/config/migrations/custom/match-datasources-migration.ts +++ b/lib/config/migrations/custom/match-datasources-migration.ts @@ -12,6 +12,8 @@ export class MatchDatasourcesMigration extends AbstractMigration { return 'java-version'; case 'dotnet': return 'dotnet-version'; + case 'node': + return 'node-version'; default: return datasource; } diff --git a/lib/config/migrations/custom/stability-days-migration.spec.ts b/lib/config/migrations/custom/stability-days-migration.spec.ts new file mode 100644 index 00000000000000..b13719bb3901ea --- /dev/null +++ b/lib/config/migrations/custom/stability-days-migration.spec.ts @@ -0,0 +1,30 @@ +import { StabilityDaysMigration } from './stability-days-migration'; + +describe('config/migrations/custom/stability-days-migration', () => { + it('migrates', () => { + expect(StabilityDaysMigration).toMigrate( + { + stabilityDays: 0, + }, + { + minimumReleaseAge: null, + } + ); + expect(StabilityDaysMigration).toMigrate( + { + stabilityDays: 2, + }, + { + minimumReleaseAge: '2 days', + } + ); + expect(StabilityDaysMigration).toMigrate( + { + stabilityDays: 1, + }, + { + minimumReleaseAge: '1 day', + } + ); + }); +}); diff --git a/lib/config/migrations/custom/stability-days-migration.ts b/lib/config/migrations/custom/stability-days-migration.ts new file mode 100644 index 00000000000000..49d86cdabf80ea --- /dev/null +++ b/lib/config/migrations/custom/stability-days-migration.ts @@ -0,0 +1,25 @@ +import is from '@sindresorhus/is'; +import { AbstractMigration } from '../base/abstract-migration'; + +export class StabilityDaysMigration extends AbstractMigration { + override readonly deprecated = true; + override readonly propertyName = 'stabilityDays'; + + override run(value: unknown): void { + if (is.integer(value)) { + let newValue: null | string; + switch (value) { + case 0: + newValue = null; + break; + case 1: + newValue = '1 day'; + break; + default: + newValue = `${value} days`; + break; + } + this.setSafely('minimumReleaseAge', newValue); + } + } +} diff --git a/lib/config/migrations/migrations-service.ts b/lib/config/migrations/migrations-service.ts index de172fdd7c391b..1b6c0d357d515f 100644 --- a/lib/config/migrations/migrations-service.ts +++ b/lib/config/migrations/migrations-service.ts @@ -47,6 +47,7 @@ import { SemanticCommitsMigration } from './custom/semantic-commits-migration'; import { SemanticPrefixMigration } from './custom/semantic-prefix-migration'; import { SeparateMajorReleasesMigration } from './custom/separate-major-release-migration'; import { SeparateMultipleMajorMigration } from './custom/separate-multiple-major-migration'; +import { StabilityDaysMigration } from './custom/stability-days-migration'; import { SuppressNotificationsMigration } from './custom/suppress-notifications-migration'; import { TrustLevelMigration } from './custom/trust-level-migration'; import { UnpublishSafeMigration } from './custom/unpublish-safe-migration'; @@ -75,6 +76,7 @@ export class MigrationsService { static readonly renamedProperties: ReadonlyMap = new Map([ ['adoptium-java', 'java-version'], + ['azureAutoApprove', 'autoApprove'], ['endpoints', 'hostRules'], ['excludedPackageNames', 'excludePackageNames'], ['exposeEnv', 'exposeAllEnv'], @@ -143,6 +145,7 @@ export class MigrationsService { SemanticPrefixMigration, MatchDatasourcesMigration, DatasourceMigration, + StabilityDaysMigration, ]; static run(originalConfig: RenovateConfig): RenovateConfig { diff --git a/lib/config/options/index.ts b/lib/config/options/index.ts index faa0653fd50761..76a7881dd40fe7 100644 --- a/lib/config/options/index.ts +++ b/lib/config/options/index.ts @@ -366,6 +366,14 @@ const options: RenovateOptions[] = [ subType: 'string', default: [], }, + { + name: 'goGetDirs', + description: 'Directory pattern to run `go get` on', + type: 'array', + subType: 'string', + default: ['./...'], + supportedManagers: ['gomod'], + }, // Log options { name: 'logFile', @@ -421,7 +429,7 @@ const options: RenovateOptions[] = [ { name: 'forkProcessing', description: - 'Whether to process forked repositories. By default, all forked repositories are skipped when in autodiscover mode.', + 'Whether to process forked repositories. By default, all forked repositories are skipped when in `autodiscover` mode.', stage: 'repository', type: 'string', allowedValues: ['auto', 'enabled', 'disabled'], @@ -917,8 +925,8 @@ const options: RenovateOptions[] = [ supportedPlatforms: ['azure'], }, { - name: 'azureAutoApprove', - description: 'Set to `true` to automatically approve Azure DevOps PRs.', + name: 'autoApprove', + description: 'Set to `true` to automatically approve PRs.', type: 'boolean', default: false, supportedPlatforms: ['azure'], @@ -1576,16 +1584,15 @@ const options: RenovateOptions[] = [ supportedPlatforms: ['azure', 'gitea', 'github', 'gitlab'], }, { - name: 'stabilityDays', - description: - 'Number of days required before a new release is considered stable.', - type: 'integer', - default: 0, + name: 'minimumReleaseAge', + description: 'Time required before a new release is considered stable.', + type: 'string', + default: null, }, { name: 'internalChecksAsSuccess', description: - 'Whether to consider passing internal checks such as stabilityDays when determining branch status.', + 'Whether to consider passing internal checks such as `minimumReleaseAge` when determining branch status.', type: 'boolean', default: false, }, @@ -1719,7 +1726,7 @@ const options: RenovateOptions[] = [ groupName: null, schedule: [], dependencyDashboardApproval: false, - stabilityDays: 0, + minimumReleaseAge: null, rangeStrategy: 'update-lockfile', commitMessageSuffix: '[SECURITY]', branchTopic: `{{{datasource}}}-{{{depName}}}-vulnerability`, @@ -1848,6 +1855,15 @@ const options: RenovateOptions[] = [ default: null, cli: false, }, + { + name: 'prTitleStrict', + description: + 'Whether to bypass appending extra context to the Pull Request title.', + type: 'boolean', + experimental: true, + default: false, + cli: false, + }, { name: 'prHeader', description: 'Text added here will be placed first in the PR body.', @@ -2303,6 +2319,20 @@ const options: RenovateOptions[] = [ env: false, experimental: true, }, + { + name: 'artifactAuth', + description: + 'A list of package managers to enable artifact auth. Only managers on the list are enabled. All are enabled if `null`', + experimental: true, + type: 'array', + subType: 'string', + stage: 'repository', + parent: 'hostRules', + allowedValues: ['composer'], + default: null, + cli: false, + env: false, + }, { name: 'cacheHardTtlMinutes', description: diff --git a/lib/config/presets/internal/monorepo.ts b/lib/config/presets/internal/monorepo.ts index 6fa72f85951539..6a8f2afe18fa0d 100644 --- a/lib/config/presets/internal/monorepo.ts +++ b/lib/config/presets/internal/monorepo.ts @@ -77,6 +77,8 @@ const repoGroups = { ], 'dotnet-azure-ad-identitymodel-extensions': 'https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet', + 'dotnet-azure-ad-microsoft-identity-web': + 'https://github.com/AzureAD/microsoft-identity-web', 'dotnet-wcf': 'https://github.com/dotnet/wcf', dropwizard: 'https://github.com/dropwizard/dropwizard', 'elastic-apm-agent-rum-js': 'https://github.com/elastic/apm-agent-rum-js', @@ -263,6 +265,7 @@ const orgGroups = { ngrx: 'https://github.com/ngrx/', nrwl: 'https://github.com/nrwl/', 'semantic-release': 'https://github.com/semantic-release/', + swc: 'https://github.com/swc-project/', }; /* eslint sort-keys: ["error", "asc", {caseSensitive: false, natural: true}] */ diff --git a/lib/config/presets/internal/npm.ts b/lib/config/presets/internal/npm.ts index 57552b194e38e9..e269bbd8c77072 100644 --- a/lib/config/presets/internal/npm.ts +++ b/lib/config/presets/internal/npm.ts @@ -7,7 +7,7 @@ export const presets: Record = { description: 'Wait until the npm package is three days old before raising the update, this prevents npm unpublishing a package you already upgraded to.', npm: { - stabilityDays: 3, + minimumReleaseAge: '3 days', }, }, }; diff --git a/lib/config/presets/internal/packages.ts b/lib/config/presets/internal/packages.ts index 1f1aa638d338e6..740365505b52e8 100644 --- a/lib/config/presets/internal/packages.ts +++ b/lib/config/presets/internal/packages.ts @@ -66,9 +66,11 @@ export const presets: Record = { 'supertest', 'ts-auto-mock', 'ts-jest', + 'vitest', ], matchPackagePrefixes: [ '@testing-library', + '@vitest', 'chai', 'jest', 'mocha', diff --git a/lib/config/presets/internal/regex-managers.spec.ts b/lib/config/presets/internal/regex-managers.spec.ts index d963a5e70627d4..91bdd85ba6ecab 100644 --- a/lib/config/presets/internal/regex-managers.spec.ts +++ b/lib/config/presets/internal/regex-managers.spec.ts @@ -110,7 +110,7 @@ describe('config/presets/internal/regex-managers', () => { expect(res?.deps).toMatchObject([ { currentValue: '18.13.0', - datasource: 'node', + datasource: 'node-version', depName: 'node', replaceString: '# renovate: datasource=node depName=node versioning=node\n NODE_VERSION: 18.13.0\n', diff --git a/lib/config/presets/npm/index.ts b/lib/config/presets/npm/index.ts index 28b2b3253cc6d4..a1c038f7b120f3 100644 --- a/lib/config/presets/npm/index.ts +++ b/lib/config/presets/npm/index.ts @@ -26,13 +26,11 @@ export async function getPreset({ let dep: (NpmResponseVersion & { 'renovate-config'?: any }) | undefined; try { const registryUrl = resolveRegistryUrl(pkg); + logger.once.warn( + { registryUrl, pkg }, + 'Using npm packages for Renovate presets is now deprecated. Please migrate to repository-based presets instead.' + ); const packageUrl = resolvePackageUrl(registryUrl, pkg); - // istanbul ignore if - if (!packageUrl.startsWith('https://registry.npmjs.org/')) { - logger.warn( - 'npm presets from non-default registries are now deprecated. Please migrate to repository-based presets instead.' - ); - } const body = (await http.getJson(packageUrl)).body; // TODO: check null #7154 dep = body.versions![body['dist-tags']!.latest]; diff --git a/lib/logger/utils.spec.ts b/lib/logger/utils.spec.ts index 95b02ef5f0a97a..376584700b8f40 100644 --- a/lib/logger/utils.spec.ts +++ b/lib/logger/utils.spec.ts @@ -37,6 +37,7 @@ describe('logger/utils', () => { input | output ${' https://somepw@domain.com/gitlab/org/repo?go-get'} | ${' https://**redacted**@domain.com/gitlab/org/repo?go-get'} ${'https://someuser:somepw@domain.com'} | ${'https://**redacted**@domain.com'} + ${'https://someuser:pass%word_with-speci(a)l&chars@domain.com'} | ${'https://**redacted**@domain.com'} ${'https://someuser:@domain.com'} | ${'https://**redacted**@domain.com'} ${'redis://:somepw@172.32.11.71:6379/0'} | ${'redis://**redacted**@172.32.11.71:6379/0'} ${'some text with\r\n url: https://somepw@domain.com\nand some more'} | ${'some text with\r\n url: https://**redacted**@domain.com\nand some more'} diff --git a/lib/logger/utils.ts b/lib/logger/utils.ts index e4b34a13579b3a..d1697686784080 100644 --- a/lib/logger/utils.ts +++ b/lib/logger/utils.ts @@ -244,7 +244,7 @@ export function validateLogLevel(logLevelToCheck: string | undefined): void { } // Can't use `util/regex` because of circular reference to logger -const urlRe = /[a-z]{3,9}:\/\/[-;:&=+$,\w]+@[a-z0-9.-]+/gi; +const urlRe = /[a-z]{3,9}:\/\/[^@/]+@[a-z0-9.-]+/gi; const urlCredRe = /\/\/[^@]+@/g; export function sanitizeUrls(text: string): string { diff --git a/lib/modules/datasource/api.ts b/lib/modules/datasource/api.ts index 48ffd8c4c97cf0..e75ad8aa10bf9c 100644 --- a/lib/modules/datasource/api.ts +++ b/lib/modules/datasource/api.ts @@ -3,6 +3,7 @@ import { AwsMachineImageDataSource } from './aws-machine-image'; import { AwsRdsDataSource } from './aws-rds'; import { AzureBicepResourceDatasource } from './azure-bicep-resource'; import { AzurePipelinesTasksDatasource } from './azure-pipelines-tasks'; +import { BazelDatasource } from './bazel'; import { BitbucketTagsDatasource } from './bitbucket-tags'; import { CdnJsDatasource } from './cdnjs'; import { ClojureDatasource } from './clojure'; @@ -37,7 +38,7 @@ import { JavaVersionDatasource } from './java-version'; import { JenkinsPluginsDatasource } from './jenkins-plugins'; import { KubernetesApiDatasource } from './kubernetes-api'; import { MavenDatasource } from './maven'; -import { NodeDatasource } from './node'; +import { NodeVersionDatasource } from './node-version'; import { NpmDatasource } from './npm'; import { NugetDatasource } from './nuget'; import { OrbDatasource } from './orb'; @@ -62,6 +63,7 @@ api.set(AwsMachineImageDataSource.id, new AwsMachineImageDataSource()); api.set(AwsRdsDataSource.id, new AwsRdsDataSource()); api.set(AzureBicepResourceDatasource.id, new AzureBicepResourceDatasource()); api.set(AzurePipelinesTasksDatasource.id, new AzurePipelinesTasksDatasource()); +api.set(BazelDatasource.id, new BazelDatasource()); api.set(BitbucketTagsDatasource.id, new BitbucketTagsDatasource()); api.set(CdnJsDatasource.id, new CdnJsDatasource()); api.set(ClojureDatasource.id, new ClojureDatasource()); @@ -99,7 +101,7 @@ api.set(JavaVersionDatasource.id, new JavaVersionDatasource()); api.set(JenkinsPluginsDatasource.id, new JenkinsPluginsDatasource()); api.set(KubernetesApiDatasource.id, new KubernetesApiDatasource()); api.set(MavenDatasource.id, new MavenDatasource()); -api.set(NodeDatasource.id, new NodeDatasource()); +api.set(NodeVersionDatasource.id, new NodeVersionDatasource()); api.set(NpmDatasource.id, new NpmDatasource()); api.set(NugetDatasource.id, new NugetDatasource()); api.set(OrbDatasource.id, new OrbDatasource()); diff --git a/lib/modules/datasource/bazel/__fixtures__/metadata-no-yanked-versions.json b/lib/modules/datasource/bazel/__fixtures__/metadata-no-yanked-versions.json new file mode 100644 index 00000000000000..2bbf5b1186fc61 --- /dev/null +++ b/lib/modules/datasource/bazel/__fixtures__/metadata-no-yanked-versions.json @@ -0,0 +1,9 @@ +{ + "versions": [ + "0.14.8", + "0.14.9", + "0.15.0", + "0.16.0" + ], + "yanked_versions": {} +} diff --git a/lib/modules/datasource/bazel/__fixtures__/metadata-with-yanked-versions.json b/lib/modules/datasource/bazel/__fixtures__/metadata-with-yanked-versions.json new file mode 100644 index 00000000000000..213792c075a86a --- /dev/null +++ b/lib/modules/datasource/bazel/__fixtures__/metadata-with-yanked-versions.json @@ -0,0 +1,11 @@ +{ + "versions": [ + "0.14.8", + "0.14.9", + "0.15.0", + "0.16.0" + ], + "yanked_versions": { + "0.15.0": "Very bad bug." + } +} diff --git a/lib/modules/datasource/bazel/index.spec.ts b/lib/modules/datasource/bazel/index.spec.ts new file mode 100644 index 00000000000000..c9ba6ebb67437f --- /dev/null +++ b/lib/modules/datasource/bazel/index.spec.ts @@ -0,0 +1,82 @@ +import { getPkgReleases } from '..'; +import { Fixtures } from '../../../../test/fixtures'; +import * as httpMock from '../../../../test/http-mock'; +import { EXTERNAL_HOST_ERROR } from '../../../constants/error-messages'; +import { BazelDatasource } from '.'; + +const datasource = BazelDatasource.id; +const defaultRegistryUrl = BazelDatasource.bazelCentralRepoUrl; +const packageName = 'rules_foo'; +const path = BazelDatasource.packageMetadataPath(packageName); + +describe('modules/datasource/bazel/index', () => { + describe('getReleases', () => { + it('throws for error', async () => { + httpMock.scope(defaultRegistryUrl).get(path).replyWithError('error'); + await expect(getPkgReleases({ datasource, packageName })).rejects.toThrow( + EXTERNAL_HOST_ERROR + ); + }); + + it('returns null for 404', async () => { + httpMock.scope(defaultRegistryUrl).get(path).reply(404); + expect(await getPkgReleases({ datasource, packageName })).toBeNull(); + }); + + it('returns null for empty result', async () => { + httpMock.scope(defaultRegistryUrl).get(path).reply(200, {}); + expect(await getPkgReleases({ datasource, packageName })).toBeNull(); + }); + + it('returns null for empty 200 OK', async () => { + httpMock + .scope(defaultRegistryUrl) + .get(path) + .reply(200, '{ "versions": [], "yanked_versions": {} }'); + expect(await getPkgReleases({ datasource, packageName })).toBeNull(); + }); + + it('throws for 5xx', async () => { + httpMock.scope(defaultRegistryUrl).get(path).reply(502); + await expect(getPkgReleases({ datasource, packageName })).rejects.toThrow( + EXTERNAL_HOST_ERROR + ); + }); + + it('metadata without yanked versions', async () => { + httpMock + .scope(defaultRegistryUrl) + .get(path) + .reply(200, Fixtures.get('metadata-no-yanked-versions.json')); + const res = await getPkgReleases({ datasource, packageName }); + expect(res).toEqual({ + registryUrl: + 'https://raw.githubusercontent.com/bazelbuild/bazel-central-registry/main', + releases: [ + { version: '0.14.8' }, + { version: '0.14.9' }, + { version: '0.15.0' }, + { version: '0.16.0' }, + ], + }); + }); + + it('metadata with yanked versions', async () => { + httpMock + .scope(defaultRegistryUrl) + .get(path) + .reply(200, Fixtures.get('metadata-with-yanked-versions.json')); + const res = await getPkgReleases({ datasource, packageName }); + expect(res).toEqual({ + registryUrl: + 'https://raw.githubusercontent.com/bazelbuild/bazel-central-registry/main', + releases: [ + { version: '0.14.8' }, + { version: '0.14.9' }, + { version: '0.15.0', isDeprecated: true }, + { version: '0.16.0' }, + ], + }); + }); + }); +}); diff --git a/lib/modules/datasource/bazel/index.ts b/lib/modules/datasource/bazel/index.ts new file mode 100644 index 00000000000000..2a15a0eb84f830 --- /dev/null +++ b/lib/modules/datasource/bazel/index.ts @@ -0,0 +1,70 @@ +import is from '@sindresorhus/is'; +import { ExternalHostError } from '../../../types/errors/external-host-error'; +import { cache } from '../../../util/cache/package/decorator'; +import { HttpError } from '../../../util/http'; +import { joinUrlParts } from '../../../util/url'; +import { BzlmodVersion } from '../../versioning/bazel-module/bzlmod-version'; +import { Datasource } from '../datasource'; +import type { GetReleasesConfig, Release, ReleaseResult } from '../types'; +import { BazelModuleMetadata } from './schema'; + +export class BazelDatasource extends Datasource { + static readonly id = 'bazel'; + + static readonly bazelCentralRepoUrl = + 'https://raw.githubusercontent.com/bazelbuild/bazel-central-registry/main'; + + override readonly defaultRegistryUrls = [BazelDatasource.bazelCentralRepoUrl]; + override readonly customRegistrySupport = true; + override readonly caching = true; + + static packageMetadataPath(packageName: string): string { + return `/modules/${packageName}/metadata.json`; + } + + constructor() { + super(BazelDatasource.id); + } + + @cache({ + namespace: `datasource-${BazelDatasource.id}`, + key: ({ registryUrl, packageName }: GetReleasesConfig) => + `${registryUrl!}:${packageName}`, + }) + async getReleases({ + registryUrl, + packageName, + }: GetReleasesConfig): Promise { + const path = BazelDatasource.packageMetadataPath(packageName); + const url = joinUrlParts(registryUrl!, path); + + const result: ReleaseResult = { releases: [] }; + try { + const { body: metadata } = await this.http.getJson( + url, + BazelModuleMetadata + ); + result.releases = metadata.versions + .map((v) => new BzlmodVersion(v)) + .sort(BzlmodVersion.defaultCompare) + .map((bv) => { + const release: Release = { version: bv.original }; + if (is.truthy(metadata.yanked_versions[bv.original])) { + release.isDeprecated = true; + } + return release; + }); + } catch (err) { + // istanbul ignore else: not testable with nock + if (err instanceof HttpError) { + if (err.response?.statusCode === 404) { + return null; + } + throw new ExternalHostError(err); + } + this.handleGenericErrors(err); + } + + return result.releases.length ? result : null; + } +} diff --git a/lib/modules/datasource/bazel/readme.md b/lib/modules/datasource/bazel/readme.md new file mode 100644 index 00000000000000..e4282e3d45c672 --- /dev/null +++ b/lib/modules/datasource/bazel/readme.md @@ -0,0 +1 @@ +The `bazel` datasource is designed to query one or more [Bazel registries](https://bazel.build/external/registry) using the first successful result. diff --git a/lib/modules/datasource/bazel/schema.spec.ts b/lib/modules/datasource/bazel/schema.spec.ts new file mode 100644 index 00000000000000..832133baf11ab7 --- /dev/null +++ b/lib/modules/datasource/bazel/schema.spec.ts @@ -0,0 +1,12 @@ +import { Fixtures } from '../../../../test/fixtures'; +import { BazelModuleMetadata } from './schema'; + +describe('modules/datasource/bazel/schema', () => { + describe('BazelModuleMetadata', () => { + it('parses metadata', () => { + const metadataJson = Fixtures.get('metadata-with-yanked-versions.json'); + const metadata = BazelModuleMetadata.parse(JSON.parse(metadataJson)); + expect(metadata.versions).toHaveLength(4); + }); + }); +}); diff --git a/lib/modules/datasource/bazel/schema.ts b/lib/modules/datasource/bazel/schema.ts new file mode 100644 index 00000000000000..4315d260c4c93a --- /dev/null +++ b/lib/modules/datasource/bazel/schema.ts @@ -0,0 +1,6 @@ +import { z } from 'zod'; + +export const BazelModuleMetadata = z.object({ + versions: z.array(z.string()), + yanked_versions: z.record(z.string(), z.string()), +}); diff --git a/lib/modules/datasource/deno/schema.ts b/lib/modules/datasource/deno/schema.ts index 412c379776e896..047bcea03c4af0 100644 --- a/lib/modules/datasource/deno/schema.ts +++ b/lib/modules/datasource/deno/schema.ts @@ -1,6 +1,6 @@ import { z } from 'zod'; import { getSourceUrl as getGithubSourceUrl } from '../../../util/github/url'; -import { looseArray } from '../../../util/schema-utils'; +import { LooseArray } from '../../../util/schema-utils'; import type { Release } from '../types'; export const DenoApiTag = z.object({ @@ -9,13 +9,15 @@ export const DenoApiTag = z.object({ }); export const DenoAPIModuleResponse = z.object({ - tags: looseArray(DenoApiTag).transform((tags) => { - const record: Record = {}; - for (const { kind, value } of tags) { - record[kind] = value; - } - return record; - }), + tags: LooseArray(DenoApiTag) + .transform((tags) => { + const record: Record = {}; + for (const { kind, value } of tags) { + record[kind] = value; + } + return record; + }) + .catch({}), versions: z.array(z.string()), }); diff --git a/lib/modules/datasource/docker/index.spec.ts b/lib/modules/datasource/docker/index.spec.ts index d3317515d050d0..17ce2dee16a6c4 100644 --- a/lib/modules/datasource/docker/index.spec.ts +++ b/lib/modules/datasource/docker/index.spec.ts @@ -546,7 +546,7 @@ describe('modules/datasource/docker/index', () => { .reply(200, {}, { 'docker-content-digest': 'some-digest' }); httpMock .scope(authUrl) - .get('/token?service=&scope=repository:library/some-other-dep:pull') + .get('/token?scope=repository:library/some-other-dep:pull') .reply(200, { access_token: 'test' }); const res = await getDigest( { datasource: 'docker', packageName: 'some-other-dep' }, diff --git a/lib/modules/datasource/docker/index.ts b/lib/modules/datasource/docker/index.ts index ef96dc8c8668ad..7dd36c4fd3061c 100644 --- a/lib/modules/datasource/docker/index.ts +++ b/lib/modules/datasource/docker/index.ts @@ -161,10 +161,13 @@ export async function getAuthHeaders( } let service = authenticateHeader.params.service; - if (!is.string(service)) { - service = ''; + if (is.string(service)) { + service = `service=${service}&`; + } else { + service = ``; } - const authUrl = `${authenticateHeader.params.realm}?service=${service}&scope=${scope}`; + + const authUrl = `${authenticateHeader.params.realm}?${service}scope=${scope}`; logger.trace( { registryHost, dockerRepository, authUrl }, `Obtaining docker registry token` @@ -974,13 +977,6 @@ export class DockerDatasource extends Datasource { ); throw new ExternalHostError(err); } - if (err.statusCode === 401 && isDockerHost(registryHost)) { - logger.warn( - { registryHost, dockerRepository, err }, - 'docker registry failure: unauthorized' - ); - throw new ExternalHostError(err); - } if (err.statusCode >= 500 && err.statusCode < 600) { logger.warn( { registryHost, dockerRepository, err }, diff --git a/lib/modules/datasource/dotnet-version/schema.ts b/lib/modules/datasource/dotnet-version/schema.ts index 0985f96634fc8c..b41350695cce54 100644 --- a/lib/modules/datasource/dotnet-version/schema.ts +++ b/lib/modules/datasource/dotnet-version/schema.ts @@ -1,16 +1,16 @@ import { z } from 'zod'; -import { looseArray } from '../../../util/schema-utils'; +import { LooseArray } from '../../../util/schema-utils'; import type { Release } from '../types'; export const ReleasesIndex = z .object({ - 'releases-index': looseArray( + 'releases-index': LooseArray( z .object({ 'releases.json': z.string(), }) .transform(({ 'releases.json': releasesUrl }) => releasesUrl) - ), + ).catch([]), }) .transform(({ 'releases-index': releasesIndex }) => releasesIndex); @@ -24,11 +24,11 @@ const ReleaseDetails = z.object({ export const DotnetSdkReleases = z .object({ - releases: looseArray( + releases: LooseArray( ReleaseBase.extend({ sdk: ReleaseDetails, }) - ), + ).catch([]), }) .transform(({ releases }): Release[] => releases.map( @@ -42,11 +42,11 @@ export const DotnetSdkReleases = z export const DotnetRuntimeReleases = z .object({ - releases: looseArray( + releases: LooseArray( ReleaseBase.extend({ runtime: ReleaseDetails, }) - ), + ).catch([]), }) .transform(({ releases }): Release[] => releases.map( diff --git a/lib/modules/datasource/node/__fixtures__/index.json b/lib/modules/datasource/node-version/__fixtures__/index.json similarity index 100% rename from lib/modules/datasource/node/__fixtures__/index.json rename to lib/modules/datasource/node-version/__fixtures__/index.json diff --git a/lib/modules/datasource/node/__snapshots__/index.spec.ts.snap b/lib/modules/datasource/node-version/__snapshots__/index.spec.ts.snap similarity index 98% rename from lib/modules/datasource/node/__snapshots__/index.spec.ts.snap rename to lib/modules/datasource/node-version/__snapshots__/index.spec.ts.snap index 19f0672668480d..e5eefdf5302186 100644 --- a/lib/modules/datasource/node/__snapshots__/index.spec.ts.snap +++ b/lib/modules/datasource/node-version/__snapshots__/index.spec.ts.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`modules/datasource/node/index getReleases processes real data 1`] = ` +exports[`modules/datasource/node-version/index getReleases processes real data 1`] = ` { "homepage": "https://nodejs.org", "registryUrl": "https://nodejs.org/dist", diff --git a/lib/modules/datasource/node/common.ts b/lib/modules/datasource/node-version/common.ts similarity index 59% rename from lib/modules/datasource/node/common.ts rename to lib/modules/datasource/node-version/common.ts index 9a88f37c5cb889..ce6b58c7b579c2 100644 --- a/lib/modules/datasource/node/common.ts +++ b/lib/modules/datasource/node-version/common.ts @@ -1,3 +1,3 @@ export const defaultRegistryUrl = 'https://nodejs.org/dist'; -export const datasource = 'node'; +export const datasource = 'node-version'; diff --git a/lib/modules/datasource/node/index.spec.ts b/lib/modules/datasource/node-version/index.spec.ts similarity index 96% rename from lib/modules/datasource/node/index.spec.ts rename to lib/modules/datasource/node-version/index.spec.ts index 1a68ce8a7506e4..ac1934ce3317c7 100644 --- a/lib/modules/datasource/node/index.spec.ts +++ b/lib/modules/datasource/node-version/index.spec.ts @@ -4,7 +4,7 @@ import * as httpMock from '../../../../test/http-mock'; import { EXTERNAL_HOST_ERROR } from '../../../constants/error-messages'; import { datasource, defaultRegistryUrl } from './common'; -describe('modules/datasource/node/index', () => { +describe('modules/datasource/node-version/index', () => { describe('getReleases', () => { it('throws for 500', async () => { httpMock.scope(defaultRegistryUrl).get('/index.json').reply(500); diff --git a/lib/modules/datasource/node/index.ts b/lib/modules/datasource/node-version/index.ts similarity index 96% rename from lib/modules/datasource/node/index.ts rename to lib/modules/datasource/node-version/index.ts index c3585953904bae..34f0c1bbbb2775 100644 --- a/lib/modules/datasource/node/index.ts +++ b/lib/modules/datasource/node-version/index.ts @@ -6,7 +6,7 @@ import type { GetReleasesConfig, ReleaseResult } from '../types'; import { datasource, defaultRegistryUrl } from './common'; import type { NodeRelease } from './types'; -export class NodeDatasource extends Datasource { +export class NodeVersionDatasource extends Datasource { static readonly id = datasource; constructor() { diff --git a/lib/modules/datasource/node/readme.md b/lib/modules/datasource/node-version/readme.md similarity index 100% rename from lib/modules/datasource/node/readme.md rename to lib/modules/datasource/node-version/readme.md diff --git a/lib/modules/datasource/node/types.ts b/lib/modules/datasource/node-version/types.ts similarity index 100% rename from lib/modules/datasource/node/types.ts rename to lib/modules/datasource/node-version/types.ts diff --git a/lib/modules/datasource/packagist/schema.ts b/lib/modules/datasource/packagist/schema.ts index e2929c33e1984b..4a9375c7cb4154 100644 --- a/lib/modules/datasource/packagist/schema.ts +++ b/lib/modules/datasource/packagist/schema.ts @@ -1,11 +1,7 @@ import is from '@sindresorhus/is'; import { z } from 'zod'; import { logger } from '../../../logger'; -import { - looseArray, - looseRecord, - looseValue, -} from '../../../util/schema-utils'; +import { LooseArray, LooseRecord } from '../../../util/schema-utils'; import type { Release, ReleaseResult } from '../types'; export const MinifiedArray = z.array(z.record(z.unknown())).transform((xs) => { @@ -46,20 +42,17 @@ export type MinifiedArray = z.infer; export const ComposerRelease = z.object({ version: z.string(), - homepage: looseValue(z.string()), - source: looseValue(z.object({ url: z.string() })), - time: looseValue(z.string()), - require: looseValue(z.object({ php: z.string() })), + homepage: z.string().nullable().catch(null), + source: z.object({ url: z.string() }).nullable().catch(null), + time: z.string().nullable().catch(null), + require: z.object({ php: z.string() }).nullable().catch(null), }); export type ComposerRelease = z.infer; -const ComposerReleasesLooseArray = looseArray(ComposerRelease); -type ComposerReleasesLooseArray = z.infer; - export const ComposerReleases = z .union([ - MinifiedArray.transform((xs) => ComposerReleasesLooseArray.parse(xs)), - looseRecord(ComposerRelease).transform((map) => Object.values(map)), + MinifiedArray.pipe(LooseArray(ComposerRelease)), + LooseRecord(ComposerRelease).transform((map) => Object.values(map)), ]) .catch([]); export type ComposerReleases = z.infer; @@ -178,17 +171,19 @@ export const RegistryFile = z.intersection( export type RegistryFile = z.infer; export const PackagesResponse = z.object({ - packages: looseRecord(ComposerReleases), + packages: LooseRecord(ComposerReleases).catch({}), }); export type PackagesResponse = z.infer; export const PackagistFile = PackagesResponse.merge( z.object({ - providers: looseRecord(HashSpec).transform((x) => - Object.fromEntries( - Object.entries(x).map(([key, { hash }]) => [key, hash]) + providers: LooseRecord(HashSpec) + .transform((x) => + Object.fromEntries( + Object.entries(x).map(([key, { hash }]) => [key, hash]) + ) ) - ), + .catch({}), }) ); export type PackagistFile = z.infer; @@ -198,15 +193,19 @@ export const RegistryMeta = z (x) => (is.plainObject(x) ? x : {}), PackagistFile.merge( z.object({ - ['includes']: looseRecord(HashSpec).transform((x) => - Object.entries(x).map(([name, { hash }]) => ({ key: name, hash })) - ), - ['provider-includes']: looseRecord(HashSpec).transform((x) => - Object.entries(x).map(([key, { hash }]) => ({ key, hash })) - ), - ['providers-lazy-url']: looseValue(z.string()), - ['providers-url']: looseValue(z.string()), - ['metadata-url']: looseValue(z.string()), + ['includes']: LooseRecord(HashSpec) + .transform((x) => + Object.entries(x).map(([name, { hash }]) => ({ key: name, hash })) + ) + .catch([]), + ['provider-includes']: LooseRecord(HashSpec) + .transform((x) => + Object.entries(x).map(([key, { hash }]) => ({ key, hash })) + ) + .catch([]), + ['providers-lazy-url']: z.string().nullable().catch(null), + ['providers-url']: z.string().nullable().catch(null), + ['metadata-url']: z.string().nullable().catch(null), }) ) ) diff --git a/lib/modules/manager/ansible-galaxy/collections.ts b/lib/modules/manager/ansible-galaxy/collections.ts index 5b1380262f78eb..83ba8e2d66ab2d 100644 --- a/lib/modules/manager/ansible-galaxy/collections.ts +++ b/lib/modules/manager/ansible-galaxy/collections.ts @@ -30,7 +30,11 @@ function interpretLine( } case 'source': { localDependency.managerData.source = value; - localDependency.registryUrls = value ? [value] : []; + if (value?.startsWith('git@')) { + localDependency.packageName = value; + } else { + localDependency.registryUrls = value ? [value] : []; + } break; } case 'type': { diff --git a/lib/modules/manager/ansible-galaxy/extract.spec.ts b/lib/modules/manager/ansible-galaxy/extract.spec.ts index 5c2dbb36274d7e..0174d8d77fb90b 100644 --- a/lib/modules/manager/ansible-galaxy/extract.spec.ts +++ b/lib/modules/manager/ansible-galaxy/extract.spec.ts @@ -1,3 +1,4 @@ +import { codeBlock } from 'common-tags'; import { Fixtures } from '../../../../test/fixtures'; import { getSliceEndNumber } from './extract'; import { extractPackageFile } from './'; @@ -27,6 +28,31 @@ describe('modules/manager/ansible-galaxy/extract', () => { expect(res?.deps).toHaveLength(2); }); + it('extracts dependencies from requirements.yml with a space at the end of line', () => { + const yamlFile = codeBlock`collections: + - name: https://github.com/lowlydba/lowlydba.sqlserver.git + type: git + version: 1.1.3`; + const res = extractPackageFile(yamlFile, 'requirements.yml'); + expect(res?.deps).toHaveLength(1); + expect(res?.deps[0].currentValue).toBe('1.1.3'); + }); + + it('extracts git@ dependencies', () => { + const yamlFile = codeBlock`collections: + - name: community.docker + source: git@github.com:ansible-collections/community.docker + type: git + version: 2.7.5`; + const res = extractPackageFile(yamlFile, 'requirements.yml'); + expect(res?.deps).toHaveLength(1); + expect(res?.deps[0].currentValue).toBe('2.7.5'); + expect(res?.deps[0].registryUrls).toBeUndefined(); + expect(res?.deps[0].packageName).toBe( + 'git@github.com:ansible-collections/community.docker' + ); + }); + it('check if an empty file returns null', () => { const res = extractPackageFile('\n', 'requirements.yml'); expect(res).toBeNull(); @@ -75,7 +101,7 @@ describe('modules/manager/ansible-galaxy/extract', () => { it('choose second block', () => { const res = getSliceEndNumber(5, 10, 5); - expect(res).toBe(9); + expect(res).toBe(10); }); }); }); diff --git a/lib/modules/manager/ansible-galaxy/extract.ts b/lib/modules/manager/ansible-galaxy/extract.ts index 6ef90271a3cd2a..cf94569973d92e 100644 --- a/lib/modules/manager/ansible-galaxy/extract.ts +++ b/lib/modules/manager/ansible-galaxy/extract.ts @@ -13,7 +13,7 @@ export function getSliceEndNumber( if (start < 0 || start > numberOfLines - 1) { return -1; } - let nearestEnd = numberOfLines - 1; + let nearestEnd = numberOfLines; for (const blocksKey of blocks) { if (start < blocksKey && blocksKey < nearestEnd) { nearestEnd = blocksKey; diff --git a/lib/modules/manager/ansible-galaxy/util.ts b/lib/modules/manager/ansible-galaxy/util.ts index a6e127688ce43d..36bb71ad9e00a7 100644 --- a/lib/modules/manager/ansible-galaxy/util.ts +++ b/lib/modules/manager/ansible-galaxy/util.ts @@ -1,7 +1,7 @@ import { regEx } from '../../../util/regex'; export const newBlockRegEx = /^\s*-\s*((\w+):\s*(.*))$/; -export const blockLineRegEx = /^\s*((\w+):\s*(.*))$/; +export const blockLineRegEx = /^\s*((\w+):\s*(\S+))\s*$/; export const galaxyDepRegex = /[\w-]+\.[\w-]+/; export const dependencyRegex = /^dependencies:/; export const galaxyRegEx = regEx( diff --git a/lib/modules/manager/asdf/extract.spec.ts b/lib/modules/manager/asdf/extract.spec.ts index dd323150f2b1fd..bc77ae464bd7a4 100644 --- a/lib/modules/manager/asdf/extract.spec.ts +++ b/lib/modules/manager/asdf/extract.spec.ts @@ -9,7 +9,7 @@ describe('modules/manager/asdf/extract', () => { deps: [ { currentValue: '16.16.0', - datasource: 'node', + datasource: 'node-version', depName: 'node', }, ], @@ -34,7 +34,7 @@ describe('modules/manager/asdf/extract', () => { deps: [ { currentValue: '16.16.0', - datasource: 'node', + datasource: 'node-version', depName: 'node', }, ], @@ -77,6 +77,7 @@ ocaml 4.14.0 perl 5.37.5 php 8.1.12 pnpm 7.26.2 +poetry 1.3.2 pulumi 3.57.1 python 3.11.0 ruby 3.1.2 @@ -287,7 +288,7 @@ dummy 1.2.3 }, { currentValue: '18.12.0', - datasource: 'node', + datasource: 'node-version', depName: 'node', }, { @@ -317,6 +318,12 @@ dummy 1.2.3 depName: 'pnpm', versioning: 'semver', }, + { + currentValue: '1.3.2', + datasource: 'pypi', + packageName: 'poetry', + depName: 'poetry', + }, { currentValue: '3.57.1', datasource: 'github-releases', @@ -489,7 +496,7 @@ dummy 1.2.3 deps: [ { currentValue: data.expect, - datasource: 'node', + datasource: 'node-version', depName: 'node', }, ], @@ -518,7 +525,7 @@ dummy 1.2.3 deps: [ { currentValue: '16.16.0', - datasource: 'node', + datasource: 'node-version', depName: 'node', }, ], @@ -531,7 +538,7 @@ dummy 1.2.3 deps: [ { currentValue: '16.16.0', - datasource: 'node', + datasource: 'node-version', depName: 'node', skipReason: 'ignored', }, diff --git a/lib/modules/manager/asdf/index.ts b/lib/modules/manager/asdf/index.ts index 134ac7e3663a5d..679ae29b93f6eb 100644 --- a/lib/modules/manager/asdf/index.ts +++ b/lib/modules/manager/asdf/index.ts @@ -5,8 +5,9 @@ import { GithubReleasesDatasource } from '../../datasource/github-releases'; import { GithubTagsDatasource } from '../../datasource/github-tags'; import { HexpmBobDatasource } from '../../datasource/hexpm-bob'; import { JavaVersionDatasource } from '../../datasource/java-version'; -import { NodeDatasource } from '../../datasource/node'; +import { NodeVersionDatasource } from '../../datasource/node-version'; import { NpmDatasource } from '../../datasource/npm'; +import { PypiDatasource } from '../../datasource/pypi'; import { RubyVersionDatasource } from '../../datasource/ruby-version'; export { extractPackageFile } from './extract'; @@ -18,14 +19,15 @@ export const defaultConfig = { }; export const supportedDatasources = [ - JavaVersionDatasource.id, + DartVersionDatasource.id, DockerDatasource.id, + FlutterVersionDatasource.id, GithubReleasesDatasource.id, GithubTagsDatasource.id, HexpmBobDatasource.id, - NodeDatasource.id, + JavaVersionDatasource.id, + NodeVersionDatasource.id, NpmDatasource.id, + PypiDatasource.id, RubyVersionDatasource.id, - DartVersionDatasource.id, - FlutterVersionDatasource.id, ]; diff --git a/lib/modules/manager/asdf/upgradeable-tooling.ts b/lib/modules/manager/asdf/upgradeable-tooling.ts index 0c75a80c0a118e..d076f0913e22ca 100644 --- a/lib/modules/manager/asdf/upgradeable-tooling.ts +++ b/lib/modules/manager/asdf/upgradeable-tooling.ts @@ -5,8 +5,9 @@ import { GithubReleasesDatasource } from '../../datasource/github-releases'; import { GithubTagsDatasource } from '../../datasource/github-tags'; import { HexpmBobDatasource } from '../../datasource/hexpm-bob'; import { JavaVersionDatasource } from '../../datasource/java-version'; -import { NodeDatasource } from '../../datasource/node'; +import { NodeVersionDatasource } from '../../datasource/node-version'; import { NpmDatasource } from '../../datasource/npm'; +import { PypiDatasource } from '../../datasource/pypi'; import { RubyVersionDatasource } from '../../datasource/ruby-version'; import * as regexVersioning from '../../versioning/regex'; import * as semverVersioning from '../../versioning/semver'; @@ -266,7 +267,7 @@ export const upgradeableTooling: Record = { asdfPluginUrl: 'https://github.com/asdf-vm/asdf-nodejs', config: { depName: 'node', - datasource: NodeDatasource.id, + datasource: NodeVersionDatasource.id, }, }, ocaml: { @@ -300,6 +301,13 @@ export const upgradeableTooling: Record = { versioning: semverVersioning.id, }, }, + poetry: { + asdfPluginUrl: 'https://github.com/asdf-community/asdf-poetry', + config: { + datasource: PypiDatasource.id, + packageName: 'poetry', + }, + }, pulumi: { asdfPluginUrl: 'https://github.com/canha/asdf-pulumi.git', config: { diff --git a/lib/modules/manager/cargo/extract.spec.ts b/lib/modules/manager/cargo/extract.spec.ts index 1800fc57da3d29..457e92ef8716ed 100644 --- a/lib/modules/manager/cargo/extract.spec.ts +++ b/lib/modules/manager/cargo/extract.spec.ts @@ -31,6 +31,8 @@ describe('modules/manager/cargo/extract', () => { }; GlobalConfig.set(adminConfig); + delete process.env.CARGO_REGISTRIES_PRIVATE_CRATES_INDEX; + delete process.env.CARGO_REGISTRIES_MCORBIN_INDEX; }); afterEach(async () => { @@ -113,6 +115,50 @@ describe('modules/manager/cargo/extract', () => { expect(res?.deps).toHaveLength(3); }); + it('extracts registry urls from environment', async () => { + process.env.CARGO_REGISTRIES_PRIVATE_CRATES_INDEX = + 'https://dl.cloudsmith.io/basic/my-org/my-repo/cargo/index.git'; + process.env.CARGO_REGISTRIES_MCORBIN_INDEX = + 'https://github.com/mcorbin/testregistry'; + const res = await extractPackageFile(cargo6toml, 'Cargo.toml', { + ...config, + }); + + expect(res?.deps).toEqual([ + { + currentValue: '0.1.0', + datasource: 'crate', + depName: 'proprietary-crate', + depType: 'dependencies', + managerData: { + nestedVersion: true, + }, + registryUrls: [ + 'https://dl.cloudsmith.io/basic/my-org/my-repo/cargo/index.git', + ], + }, + { + currentValue: '3.0.0', + datasource: 'crate', + depName: 'mcorbin-test', + depType: 'dependencies', + managerData: { + nestedVersion: true, + }, + registryUrls: ['https://github.com/mcorbin/testregistry'], + }, + { + currentValue: '0.2', + datasource: 'crate', + depName: 'tokio', + depType: 'dependencies', + managerData: { + nestedVersion: false, + }, + }, + ]); + }); + it('extracts workspace dependencies', async () => { const cargoToml = codeBlock` [package] diff --git a/lib/modules/manager/cargo/extract.ts b/lib/modules/manager/cargo/extract.ts index 4da8fa5e4939ae..89ea94bee4c842 100644 --- a/lib/modules/manager/cargo/extract.ts +++ b/lib/modules/manager/cargo/extract.ts @@ -15,6 +15,11 @@ import type { CargoSection, } from './types'; +function getCargoIndexEnv(registryName: string): string | null { + const registry = registryName.toUpperCase().replaceAll('-', '_'); + return process.env[`CARGO_REGISTRIES_${registry}_INDEX`] ?? null; +} + function extractFromSection( parsedContent: CargoSection, section: keyof CargoSection, @@ -47,7 +52,9 @@ function extractFromSection( currentValue = version; nestedVersion = true; if (registryName) { - const registryUrl = cargoRegistries[registryName]; + const registryUrl = + cargoRegistries[registryName] ?? getCargoIndexEnv(registryName); + if (registryUrl) { registryUrls = [registryUrl]; } else { diff --git a/lib/modules/manager/composer/artifacts.spec.ts b/lib/modules/manager/composer/artifacts.spec.ts index d7486171970396..bd197b7233d21c 100644 --- a/lib/modules/manager/composer/artifacts.spec.ts +++ b/lib/modules/manager/composer/artifacts.spec.ts @@ -292,6 +292,329 @@ describe('modules/manager/composer/artifacts', () => { ]); }); + it('does set github COMPOSER_AUTH for github when only hostType git-tags artifactAuth does not include composer', async () => { + hostRules.add({ + hostType: 'github', + matchHost: 'api.github.com', + token: 'ghs_token', + }); + hostRules.add({ + hostType: GitTagsDatasource.id, + matchHost: 'github.com', + token: 'ghp_token', + artifactAuth: [], + }); + fs.readLocalFile.mockResolvedValueOnce('{}'); + const execSnapshots = mockExecAll(); + fs.readLocalFile.mockResolvedValueOnce('{}'); + const authConfig = { + ...config, + registryUrls: ['https://packagist.renovatebot.com'], + }; + git.getRepoStatus.mockResolvedValueOnce(repoStatus); + expect( + await composer.updateArtifacts({ + packageFileName: 'composer.json', + updatedDeps: [], + newPackageFileContent: '{}', + config: authConfig, + }) + ).toBeNull(); + expect(execSnapshots).toMatchObject([ + { + options: { + env: { + COMPOSER_AUTH: '{"github-oauth":{"github.com":"ghs_token"}}', + }, + }, + }, + ]); + }); + + it('does set github COMPOSER_AUTH for git-tags when only hostType github artifactAuth does not include composer', async () => { + hostRules.add({ + hostType: 'github', + matchHost: 'api.github.com', + token: 'ghs_token', + artifactAuth: [], + }); + hostRules.add({ + hostType: GitTagsDatasource.id, + matchHost: 'github.com', + token: 'ghp_token', + }); + fs.readLocalFile.mockResolvedValueOnce('{}'); + const execSnapshots = mockExecAll(); + fs.readLocalFile.mockResolvedValueOnce('{}'); + const authConfig = { + ...config, + registryUrls: ['https://packagist.renovatebot.com'], + }; + git.getRepoStatus.mockResolvedValueOnce(repoStatus); + expect( + await composer.updateArtifacts({ + packageFileName: 'composer.json', + updatedDeps: [], + newPackageFileContent: '{}', + config: authConfig, + }) + ).toBeNull(); + expect(execSnapshots).toMatchObject([ + { + options: { + env: { + COMPOSER_AUTH: '{"github-oauth":{"github.com":"ghp_token"}}', + }, + }, + }, + ]); + }); + + it('does not set github COMPOSER_AUTH when artifactAuth does not include composer, for both hostType github & git-tags', async () => { + hostRules.add({ + hostType: 'github', + matchHost: 'api.github.com', + token: 'ghs_token', + artifactAuth: [], + }); + hostRules.add({ + hostType: GitTagsDatasource.id, + matchHost: 'github.com', + token: 'ghp_token', + artifactAuth: [], + }); + fs.readLocalFile.mockResolvedValueOnce('{}'); + const execSnapshots = mockExecAll(); + fs.readLocalFile.mockResolvedValueOnce('{}'); + const authConfig = { + ...config, + registryUrls: ['https://packagist.renovatebot.com'], + }; + git.getRepoStatus.mockResolvedValueOnce(repoStatus); + expect( + await composer.updateArtifacts({ + packageFileName: 'composer.json', + updatedDeps: [], + newPackageFileContent: '{}', + config: authConfig, + }) + ).toBeNull(); + expect(execSnapshots[0].options?.env).not.toContainKey('COMPOSER_AUTH'); + }); + + it('does not set gitlab COMPOSER_AUTH when artifactAuth does not include composer', async () => { + hostRules.add({ + hostType: GitTagsDatasource.id, + matchHost: 'github.com', + token: 'ghp_token', + }); + hostRules.add({ + hostType: 'gitlab', + matchHost: 'gitlab.com', + token: 'gitlab-token', + artifactAuth: [], + }); + fs.readLocalFile.mockResolvedValueOnce('{}'); + const execSnapshots = mockExecAll(); + fs.readLocalFile.mockResolvedValueOnce('{}'); + const authConfig = { + ...config, + postUpdateOptions: ['composerGitlabToken'], + registryUrls: ['https://packagist.renovatebot.com'], + }; + git.getRepoStatus.mockResolvedValueOnce(repoStatus); + expect( + await composer.updateArtifacts({ + packageFileName: 'composer.json', + updatedDeps: [], + newPackageFileContent: '{}', + config: authConfig, + }) + ).toBeNull(); + + expect(execSnapshots).toMatchObject([ + { + options: { + env: { + COMPOSER_AUTH: '{"github-oauth":{"github.com":"ghp_token"}}', + }, + }, + }, + ]); + }); + + it('does not set packagist COMPOSER_AUTH when artifactAuth does not include composer', async () => { + hostRules.add({ + hostType: GitTagsDatasource.id, + matchHost: 'github.com', + token: 'ghp_token', + }); + hostRules.add({ + hostType: PackagistDatasource.id, + matchHost: 'packagist.renovatebot.com', + username: 'some-username', + password: 'some-password', + artifactAuth: [], + }); + hostRules.add({ + hostType: PackagistDatasource.id, + matchHost: 'https://artifactory.yyyyyyy.com/artifactory/api/composer/', + username: 'some-other-username', + password: 'some-other-password', + artifactAuth: [], + }); + hostRules.add({ + hostType: PackagistDatasource.id, + username: 'some-other-username', + password: 'some-other-password', + artifactAuth: [], + }); + hostRules.add({ + hostType: PackagistDatasource.id, + matchHost: 'https://packages-bearer.example.com/', + token: 'abcdef0123456789', + artifactAuth: [], + }); + fs.readLocalFile.mockResolvedValueOnce('{}'); + const execSnapshots = mockExecAll(); + fs.readLocalFile.mockResolvedValueOnce('{}'); + const authConfig = { + ...config, + postUpdateOptions: ['composerGitlabToken'], + registryUrls: ['https://packagist.renovatebot.com'], + }; + git.getRepoStatus.mockResolvedValueOnce(repoStatus); + expect( + await composer.updateArtifacts({ + packageFileName: 'composer.json', + updatedDeps: [], + newPackageFileContent: '{}', + config: authConfig, + }) + ).toBeNull(); + + expect(execSnapshots).toMatchObject([ + { + options: { + env: { + COMPOSER_AUTH: '{"github-oauth":{"github.com":"ghp_token"}}', + }, + }, + }, + ]); + }); + + it('does set gitlab COMPOSER_AUTH when artifactAuth does include composer', async () => { + hostRules.add({ + hostType: GitTagsDatasource.id, + matchHost: 'github.com', + token: 'ghp_token', + }); + hostRules.add({ + hostType: 'gitlab', + matchHost: 'gitlab.com', + token: 'gitlab-token', + artifactAuth: ['composer'], + }); + fs.readLocalFile.mockResolvedValueOnce('{}'); + const execSnapshots = mockExecAll(); + fs.readLocalFile.mockResolvedValueOnce('{}'); + const authConfig = { + ...config, + postUpdateOptions: ['composerGitlabToken'], + registryUrls: ['https://packagist.renovatebot.com'], + }; + git.getRepoStatus.mockResolvedValueOnce(repoStatus); + expect( + await composer.updateArtifacts({ + packageFileName: 'composer.json', + updatedDeps: [], + newPackageFileContent: '{}', + config: authConfig, + }) + ).toBeNull(); + + expect(execSnapshots).toMatchObject([ + { + options: { + env: { + COMPOSER_AUTH: + '{"github-oauth":{"github.com":"ghp_token"},' + + '"gitlab-token":{"gitlab.com":"gitlab-token"},' + + '"gitlab-domains":["gitlab.com"]}', + }, + }, + }, + ]); + }); + + it('does set packagist COMPOSER_AUTH when artifactAuth does include composer', async () => { + hostRules.add({ + hostType: GitTagsDatasource.id, + matchHost: 'github.com', + token: 'ghp_token', + }); + hostRules.add({ + hostType: PackagistDatasource.id, + matchHost: 'packagist.renovatebot.com', + username: 'some-username', + password: 'some-password', + artifactAuth: ['composer'], + }); + hostRules.add({ + hostType: PackagistDatasource.id, + matchHost: 'https://artifactory.yyyyyyy.com/artifactory/api/composer/', + username: 'some-other-username', + password: 'some-other-password', + artifactAuth: ['composer'], + }); + hostRules.add({ + hostType: PackagistDatasource.id, + username: 'some-other-username', + password: 'some-other-password', + artifactAuth: ['composer'], + }); + hostRules.add({ + hostType: PackagistDatasource.id, + matchHost: 'https://packages-bearer.example.com/', + token: 'abcdef0123456789', + artifactAuth: ['composer'], + }); + fs.readLocalFile.mockResolvedValueOnce('{}'); + const execSnapshots = mockExecAll(); + fs.readLocalFile.mockResolvedValueOnce('{}'); + const authConfig = { + ...config, + postUpdateOptions: ['composerGitlabToken'], + registryUrls: ['https://packagist.renovatebot.com'], + }; + git.getRepoStatus.mockResolvedValueOnce(repoStatus); + expect( + await composer.updateArtifacts({ + packageFileName: 'composer.json', + updatedDeps: [], + newPackageFileContent: '{}', + config: authConfig, + }) + ).toBeNull(); + + expect(execSnapshots).toMatchObject([ + { + options: { + env: { + COMPOSER_AUTH: + '{"github-oauth":{"github.com":"ghp_token"},' + + '"http-basic":{' + + '"packagist.renovatebot.com":{"username":"some-username","password":"some-password"},' + + '"artifactory.yyyyyyy.com":{"username":"some-other-username","password":"some-other-password"}' + + '},' + + '"bearer":{"packages-bearer.example.com":"abcdef0123456789"}}', + }, + }, + }, + ]); + }); + it('returns updated composer.lock', async () => { fs.readLocalFile.mockResolvedValueOnce('{}'); const execSnapshots = mockExecAll(); diff --git a/lib/modules/manager/composer/artifacts.ts b/lib/modules/manager/composer/artifacts.ts index 290a212073a523..cc6acbbf266ff0 100644 --- a/lib/modules/manager/composer/artifacts.ts +++ b/lib/modules/manager/composer/artifacts.ts @@ -21,13 +21,13 @@ import { regEx } from '../../../util/regex'; import { GitTagsDatasource } from '../../datasource/git-tags'; import { PackagistDatasource } from '../../datasource/packagist'; import type { UpdateArtifact, UpdateArtifactsResult } from '../types'; -import { ComposerConfig, ComposerLock } from './schema'; -import type { AuthJson } from './types'; +import type { AuthJson, ComposerLock } from './types'; import { extractConstraints, findGithubToken, getComposerArguments, getPhpConstraint, + isArtifactAuthEnabled, requireComposerDependencyInstallation, takePersonalAccessTokenIfPossible, } from './utils'; @@ -35,27 +35,36 @@ import { function getAuthJson(): string | null { const authJson: AuthJson = {}; - const githubToken = findGithubToken({ + const githubHostRule = hostRules.find({ hostType: 'github', url: 'https://api.github.com/', }); - const gitTagsGithubToken = findGithubToken({ + const gitTagsHostRule = hostRules.find({ hostType: GitTagsDatasource.id, url: 'https://github.com', }); const selectedGithubToken = takePersonalAccessTokenIfPossible( - githubToken, - gitTagsGithubToken + isArtifactAuthEnabled(githubHostRule) + ? findGithubToken(githubHostRule) + : undefined, + isArtifactAuthEnabled(gitTagsHostRule) + ? findGithubToken(gitTagsHostRule) + : undefined ); + if (selectedGithubToken) { authJson['github-oauth'] = { 'github.com': selectedGithubToken, }; } - hostRules.findAll({ hostType: 'gitlab' })?.forEach((gitlabHostRule) => { + for (const gitlabHostRule of hostRules.findAll({ hostType: 'gitlab' })) { + if (!isArtifactAuthEnabled(gitlabHostRule)) { + continue; + } + if (gitlabHostRule?.token) { const host = gitlabHostRule.resolvedHost ?? 'gitlab.com'; authJson['gitlab-token'] = authJson['gitlab-token'] ?? {}; @@ -66,20 +75,24 @@ function getAuthJson(): string | null { ...(authJson['gitlab-domains'] ?? []), ]; } - }); + } - hostRules - .findAll({ hostType: PackagistDatasource.id }) - ?.forEach((hostRule) => { - const { resolvedHost, username, password, token } = hostRule; - if (resolvedHost && username && password) { - authJson['http-basic'] = authJson['http-basic'] ?? {}; - authJson['http-basic'][resolvedHost] = { username, password }; - } else if (resolvedHost && token) { - authJson.bearer = authJson.bearer ?? {}; - authJson.bearer[resolvedHost] = token; - } - }); + for (const packagistHostRule of hostRules.findAll({ + hostType: PackagistDatasource.id, + })) { + if (!isArtifactAuthEnabled(packagistHostRule)) { + continue; + } + + const { resolvedHost, username, password, token } = packagistHostRule; + if (resolvedHost && username && password) { + authJson['http-basic'] = authJson['http-basic'] ?? {}; + authJson['http-basic'][resolvedHost] = { username, password }; + } else if (resolvedHost && token) { + authJson.bearer = authJson.bearer ?? {}; + authJson.bearer[resolvedHost] = token; + } + } return is.emptyObject(authJson) ? null : JSON.stringify(authJson); } @@ -105,32 +118,12 @@ export async function updateArtifacts({ try { await writeLocalFile(packageFileName, newPackageFileContent); - const composerLockResult = ComposerLock.safeParse( - JSON.parse(existingLockFileContent) - ); - // istanbul ignore if - if (!composerLockResult.success) { - logger.warn( - { error: composerLockResult.error }, - 'Unable to parse composer.lock' - ); - return null; - } - - const newPackageFileResult = ComposerConfig.safeParse( - JSON.parse(newPackageFileContent) - ); - // istanbul ignore if - if (!newPackageFileResult.success) { - logger.warn( - { error: newPackageFileResult.error }, - 'Unable to parse composer.json' - ); - return null; - } - + const existingLockFile: ComposerLock = JSON.parse(existingLockFileContent); const constraints = { - ...extractConstraints(newPackageFileResult.data, composerLockResult.data), + ...extractConstraints( + JSON.parse(newPackageFileContent), + existingLockFile + ), ...config.constraints, }; @@ -157,7 +150,7 @@ export async function updateArtifacts({ const commands: string[] = []; // Determine whether install is required before update - if (requireComposerDependencyInstallation(composerLockResult.data)) { + if (requireComposerDependencyInstallation(existingLockFile)) { const preCmd = 'composer'; const preArgs = 'install' + getComposerArguments(config, composerToolConstraint); diff --git a/lib/modules/manager/composer/extract.ts b/lib/modules/manager/composer/extract.ts index c18c264d84ba10..ae40abec469249 100644 --- a/lib/modules/manager/composer/extract.ts +++ b/lib/modules/manager/composer/extract.ts @@ -10,10 +10,10 @@ import type { PackageDependency, PackageFileContent } from '../types'; import type { ComposerConfig, ComposerLock, + ComposerManagerData, ComposerRepositories, - ComposerRepository, -} from './schema'; -import type { ComposerManagerData } from './types'; + Repo, +} from './types'; /** * The regUrl is expected to be a base URL. GitLab composer repository installation guide specifies @@ -34,7 +34,7 @@ function transformRegUrl(url: string): string { */ function parseRepositories( repoJson: ComposerRepositories, - repositories: Record, + repositories: Record, registryUrls: string[] ): void { try { @@ -91,7 +91,7 @@ export async function extractPackageFile( logger.debug(`Invalid JSON in ${fileName}`); return null; } - const repositories: Record = {}; + const repositories: Record = {}; const registryUrls: string[] = []; const res: PackageFileContent = { deps: [] }; diff --git a/lib/modules/manager/composer/schema.ts b/lib/modules/manager/composer/schema.ts deleted file mode 100644 index 35cffa60bc4b42..00000000000000 --- a/lib/modules/manager/composer/schema.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { z } from 'zod'; - -const ComposerLockPackage = z.object({ - name: z.string(), - version: z.string(), -}); - -export const ComposerLock = z.object({ - 'plugin-api-version': z.string().optional(), - packages: z.array(ComposerLockPackage).optional(), - 'packages-dev': z.array(ComposerLockPackage).optional(), -}); -export type ComposerLock = z.infer; - -const ComposerRepository = z.object({ - name: z.string().optional(), - type: z.union([ - z.literal('composer'), - z.literal('git'), - z.literal('package'), - z.literal('path'), - z.literal('vcs'), - ]), - packagist: z.boolean().optional(), - 'packagist.org': z.boolean().optional(), - url: z.string().url(), -}); -export type ComposerRepository = z.infer; - -const ComposerRepositories = z.union([ - z.record(z.string(), z.union([ComposerRepository, z.boolean()])), - z.array(ComposerRepository), -]); -export type ComposerRepositories = z.infer; - -export const ComposerConfig = z.object({ - type: z.string().optional(), - /** - * Setting a fixed PHP version (e.g. {"php": "7.0.3"}) will let you fake the - * platform version so that you can emulate a production env or define your - * target platform in the config. - * See https://getcomposer.org/doc/06-config.md#platform - */ - config: z - .object({ platform: z.object({ php: z.string().optional() }).optional() }) - .optional(), - /** - * A repositories field can be an array of Repo objects or an object of repoName: Repo - * Also it can be a boolean (usually false) to disable packagist. - * (Yes this can be confusing, as it is also not properly documented in the composer docs) - * See https://getcomposer.org/doc/05-repositories.md#disabling-packagist-org - */ - repositories: ComposerRepositories.optional(), - require: z.record(z.string(), z.string()).optional(), - 'require-dev': z.record(z.string(), z.string()).optional(), -}); -export type ComposerConfig = z.infer; diff --git a/lib/modules/manager/composer/types.ts b/lib/modules/manager/composer/types.ts index 7261568b101a0d..c46f294d0cf861 100644 --- a/lib/modules/manager/composer/types.ts +++ b/lib/modules/manager/composer/types.ts @@ -1,4 +1,49 @@ // istanbul ignore file: types only +export interface Repo { + name?: string; + type: 'composer' | 'git' | 'package' | 'path' | 'vcs'; + packagist?: boolean; + 'packagist.org'?: boolean; + url: string; +} +export type ComposerRepositories = Record | Repo[]; + +export interface ComposerConfig { + type?: string; + /** + * Setting a fixed PHP version (e.g. {"php": "7.0.3"}) will let you fake the + * platform version so that you can emulate a production env or define your + * target platform in the config. + * See https://getcomposer.org/doc/06-config.md#platform + */ + config?: { + platform?: { + php?: string; + }; + }; + /** + * A repositories field can be an array of Repo objects or an object of repoName: Repo + * Also it can be a boolean (usually false) to disable packagist. + * (Yes this can be confusing, as it is also not properly documented in the composer docs) + * See https://getcomposer.org/doc/05-repositories.md#disabling-packagist-org + */ + repositories?: ComposerRepositories; + + require?: Record; + 'require-dev'?: Record; +} + +export interface ComposerLockPackage { + name: string; + version: string; +} + +export interface ComposerLock { + 'plugin-api-version'?: string; + packages?: ComposerLockPackage[]; + 'packages-dev'?: ComposerLockPackage[]; +} + export interface ComposerManagerData { composerJsonType?: string; } diff --git a/lib/modules/manager/composer/update-locked.ts b/lib/modules/manager/composer/update-locked.ts index 76897b49e793b9..fcfaa89d2f11c9 100644 --- a/lib/modules/manager/composer/update-locked.ts +++ b/lib/modules/manager/composer/update-locked.ts @@ -1,7 +1,7 @@ import { logger } from '../../../logger'; import { api as composer } from '../../versioning/composer'; import type { UpdateLockedConfig, UpdateLockedResult } from '../types'; -import type { ComposerLock } from './schema'; +import type { ComposerLock } from './types'; export function updateLockedDependency( config: UpdateLockedConfig diff --git a/lib/modules/manager/composer/utils.spec.ts b/lib/modules/manager/composer/utils.spec.ts index c591825be75663..481df517e6f260 100644 --- a/lib/modules/manager/composer/utils.spec.ts +++ b/lib/modules/manager/composer/utils.spec.ts @@ -308,21 +308,26 @@ describe('modules/manager/composer/utils', () => { matchHost: 'github.com', token: TOKEN_STRING, }); - expect( - findGithubToken({ - hostType: GitTagsDatasource.id, - url: 'https://github.com', - }) - ).toEqual(TOKEN_STRING); + + const foundHostRule = hostRules.find({ + hostType: GitTagsDatasource.id, + url: 'https://github.com', + }); + + expect(findGithubToken(foundHostRule)).toEqual(TOKEN_STRING); }); - it('returns undefined when no hostRule match search', () => { - expect( - findGithubToken({ - hostType: GitTagsDatasource.id, - url: 'https://github.com', - }) - ).toBeUndefined(); + it('returns undefined when no token is defined', () => { + hostRules.add({ + hostType: GitTagsDatasource.id, + matchHost: 'github.com', + }); + + const foundHostRule = hostRules.find({ + hostType: GitTagsDatasource.id, + url: 'https://github.com', + }); + expect(findGithubToken(foundHostRule)).toBeUndefined(); }); it('remove x-access-token token prefix', () => { @@ -333,12 +338,12 @@ describe('modules/manager/composer/utils', () => { matchHost: 'github.com', token: TOKEN_STRING_WITH_PREFIX, }); - expect( - findGithubToken({ - hostType: GitTagsDatasource.id, - url: 'https://github.com', - }) - ).toEqual(TOKEN_STRING); + + const foundHostRule = hostRules.find({ + hostType: GitTagsDatasource.id, + url: 'https://github.com', + }); + expect(findGithubToken(foundHostRule)).toEqual(TOKEN_STRING); }); }); diff --git a/lib/modules/manager/composer/utils.ts b/lib/modules/manager/composer/utils.ts index 7835a2a84e4d3a..8342798971adb7 100644 --- a/lib/modules/manager/composer/utils.ts +++ b/lib/modules/manager/composer/utils.ts @@ -3,11 +3,11 @@ import { quote } from 'shlex'; import { GlobalConfig } from '../../../config/global'; import { logger } from '../../../logger'; +import type { HostRuleSearchResult } from '../../../types'; import type { ToolConstraint } from '../../../util/exec/types'; -import { HostRuleSearch, find as findHostRule } from '../../../util/host-rules'; import { api, id as composerVersioningId } from '../../versioning/composer'; import type { UpdateArtifactsConfig } from '../types'; -import type { ComposerConfig, ComposerLock } from './schema'; +import type { ComposerConfig, ComposerLock } from './types'; export { composerVersioningId }; @@ -111,8 +111,10 @@ export function extractConstraints( return res; } -export function findGithubToken(search: HostRuleSearch): string | undefined { - return findHostRule(search)?.token?.replace('x-access-token:', ''); +export function findGithubToken( + searchResult: HostRuleSearchResult +): string | undefined { + return searchResult?.token?.replace('x-access-token:', ''); } export function isGithubPersonalAccessToken(token: string): boolean { @@ -173,3 +175,7 @@ export function takePersonalAccessTokenIfPossible( return githubToken; } + +export function isArtifactAuthEnabled(rule: HostRuleSearchResult): boolean { + return !rule.artifactAuth || rule.artifactAuth.includes('composer'); +} diff --git a/lib/modules/manager/git-submodules/__fixtures__/.gitmodules.5 b/lib/modules/manager/git-submodules/__fixtures__/.gitmodules.5 index eb85ce493d435c..9ae692206fd56c 100644 --- a/lib/modules/manager/git-submodules/__fixtures__/.gitmodules.5 +++ b/lib/modules/manager/git-submodules/__fixtures__/.gitmodules.5 @@ -7,3 +7,10 @@ [submodule "renovate-config"] path = deps/renovate-config url = git@github.com:renovatebot/renovate-config.git +[submodule "some-other"] + path = some-other + url = https://domain.test/some/other.git + +[submodule "some-gitlab"] + path = some-gitlab + url = https://gitlab.com/some/repo.git diff --git a/lib/modules/manager/git-submodules/extract.spec.ts b/lib/modules/manager/git-submodules/extract.spec.ts index 8ea9e76d32ceb0..08776774857ecb 100644 --- a/lib/modules/manager/git-submodules/extract.spec.ts +++ b/lib/modules/manager/git-submodules/extract.spec.ts @@ -18,11 +18,16 @@ const Git = jest.requireActual('simple-git') as SimpleGitFactory; describe('modules/manager/git-submodules/extract', () => { // flaky ci tests - jest.setTimeout(10 * 1000); + //jest.setTimeout(10 * 1000); beforeAll(() => { simpleGit.mockImplementation((basePath: string) => { const git = Git(basePath); + const lsRemote: Record = { + 'https://abc@domain.test/some/other.git': '', + 'https://gitlab-ci-token:xyz@gitlab.com/some/repo.git': + 'ref: refs/heads/dev HEAD\n', + }; return { subModule(): Response { return Promise.resolve( @@ -40,7 +45,13 @@ describe('modules/manager/git-submodules/extract', () => { } return git.raw(options); }, - listRemote(): Response { + listRemote(options: TaskOptions): Response { + if ( + is.array(options, is.string) && + lsRemote[options[1]] !== undefined + ) { + return Promise.resolve(lsRemote[options[1]]) as Response; + } return Promise.resolve( 'ref: refs/heads/main HEAD\n5701164b9f5edba1f6ca114c491a564ffb55a964 HEAD' ) as Response; @@ -54,6 +65,16 @@ describe('modules/manager/git-submodules/extract', () => { it('extracts submodules', async () => { GlobalConfig.set({ localDir: `${__dirname}/__fixtures__` }); hostRules.add({ matchHost: 'github.com', token: '123test' }); + hostRules.add({ + matchHost: 'domain.test', + token: 'abc', + hostType: 'git-refs', + }); + hostRules.add({ + matchHost: 'gitlab.com', + token: 'xyz', + hostType: 'gitlab', + }); let res: PackageFileContent | null; expect(await extractPackageFile('', '.gitmodules.1', {})).toBeNull(); res = await extractPackageFile('', '.gitmodules.2', {}); @@ -64,10 +85,41 @@ describe('modules/manager/git-submodules/extract', () => { res = await extractPackageFile('', '.gitmodules.4', {}); expect(res?.deps).toHaveLength(1); res = await extractPackageFile('', '.gitmodules.5', {}); - expect(res?.deps).toHaveLength(3); - expect(res?.deps[2].packageName).toBe( - 'https://github.com/renovatebot/renovate-config.git' - ); + expect(res).toEqual({ + datasource: 'git-refs', + deps: [ + { + currentDigest: '4b825dc642cb6eb9a060e54bf8d69288fbee4904', + currentValue: 'main', + depName: 'deps/renovate', + packageName: 'https://github.com/renovatebot/renovate.git', + }, + { + currentDigest: '4b825dc642cb6eb9a060e54bf8d69288fbee4904', + currentValue: 'main', + depName: 'deps/renovate-pro', + packageName: 'https://github.com/renovatebot/pro.git', + }, + { + currentDigest: '4b825dc642cb6eb9a060e54bf8d69288fbee4904', + currentValue: 'main', + depName: 'deps/renovate-config', + packageName: 'https://github.com/renovatebot/renovate-config.git', + }, + { + currentDigest: '4b825dc642cb6eb9a060e54bf8d69288fbee4904', + currentValue: 'master', + depName: 'some-other', + packageName: 'https://domain.test/some/other.git', + }, + { + currentDigest: '4b825dc642cb6eb9a060e54bf8d69288fbee4904', + currentValue: 'dev', + depName: 'some-gitlab', + packageName: 'https://gitlab.com/some/repo.git', + }, + ], + }); }); }); }); diff --git a/lib/modules/manager/git-submodules/extract.ts b/lib/modules/manager/git-submodules/extract.ts index 82902cd1b61ca0..8cb5f1ff6cb76a 100644 --- a/lib/modules/manager/git-submodules/extract.ts +++ b/lib/modules/manager/git-submodules/extract.ts @@ -3,6 +3,7 @@ import Git, { SimpleGit } from 'simple-git'; import upath from 'upath'; import { GlobalConfig } from '../../../config/global'; import { logger } from '../../../logger'; +import { detectPlatform } from '../../../util/common'; import { simpleGitConfig } from '../../../util/git/config'; import { getHttpUrl, getRemoteUrlWithToken } from '../../../util/git/url'; import { regEx } from '../../../util/regex'; @@ -115,7 +116,8 @@ export default async function extractPackageFile( // hostRules only understands HTTP URLs // Find HTTP URL, then apply token let httpSubModuleUrl = getHttpUrl(subModuleUrl); - httpSubModuleUrl = getRemoteUrlWithToken(httpSubModuleUrl); + const hostType = detectPlatform(httpSubModuleUrl) ?? GitRefsDatasource.id; + httpSubModuleUrl = getRemoteUrlWithToken(httpSubModuleUrl, hostType); const currentValue = await getBranch( gitModulesPath, name, diff --git a/lib/modules/manager/github-actions/extract.ts b/lib/modules/manager/github-actions/extract.ts index 90ff7ce93cfd13..714acad7e3db19 100644 --- a/lib/modules/manager/github-actions/extract.ts +++ b/lib/modules/manager/github-actions/extract.ts @@ -10,7 +10,7 @@ import type { Workflow } from './types'; const dockerActionRe = regEx(/^\s+uses: ['"]?docker:\/\/([^'"]+)\s*$/); const actionRe = regEx( - /^\s+-?\s+?uses: (?['"]?(?[\w-]+\/[\w-]+)(?\/.*)?@(?[^\s'"]+)['"]?(?:\s+#\s*(?:renovate\s*:\s*)?(?:pin\s+|tag\s*=\s*)?@?(?v?\d+(?:\.\d+(?:\.\d+)?)?))?)/ + /^\s+-?\s+?uses: (?['"]?(?[\w-]+\/[.\w-]+)(?\/.*)?@(?[^\s'"]+)['"]?(?:\s+#\s*(?:renovate\s*:\s*)?(?:pin\s+|tag\s*=\s*)?@?(?v?\d+(?:\.\d+(?:\.\d+)?)?))?)/ ); // SHA1 or SHA256, see https://github.blog/2020-10-19-git-2-29-released/ diff --git a/lib/modules/manager/gitlabci/extract.ts b/lib/modules/manager/gitlabci/extract.ts index 6601e91580e198..acc67acfa19b10 100644 --- a/lib/modules/manager/gitlabci/extract.ts +++ b/lib/modules/manager/gitlabci/extract.ts @@ -1,7 +1,7 @@ import is from '@sindresorhus/is'; import { load } from 'js-yaml'; import { logger } from '../../../logger'; -import { readLocalFile } from '../../../util/fs'; +import { isValidLocalPath, readLocalFile } from '../../../util/fs'; import { trimLeadingSlash } from '../../../util/url'; import type { ExtractConfig, @@ -133,6 +133,11 @@ export async function extractAllPackageFiles( while (filesToExamine.length > 0) { const file = filesToExamine.pop()!; + if (!isValidLocalPath(file)) { + logger.debug(`Invalid gitlabci file path ${file}`); + continue; + } + const content = await readLocalFile(file, 'utf8'); if (!content) { logger.debug(`Empty or non existent gitlabci file ${file}`); diff --git a/lib/modules/manager/gomod/artifacts.spec.ts b/lib/modules/manager/gomod/artifacts.spec.ts index 667eee6bdd7a3d..22cfc117b74df2 100644 --- a/lib/modules/manager/gomod/artifacts.spec.ts +++ b/lib/modules/manager/gomod/artifacts.spec.ts @@ -15,7 +15,17 @@ jest.mock('../../../util/exec/env'); jest.mock('../../../util/git'); jest.mock('../../../util/host-rules'); jest.mock('../../../util/http'); -jest.mock('../../../util/fs'); +jest.mock('../../../util/fs', () => { + // restore + return { + __esModules: true, + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + ...(jest.createMockFromModule('../../../util/fs') as any), + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + isValidLocalPath: (jest.requireActual('../../../util/fs') as any) + .isValidLocalPath, + }; +}); jest.mock('../../datasource'); process.env.BUILDPACK = 'true'; @@ -1939,4 +1949,102 @@ describe('modules/manager/gomod/artifacts', () => { ]; expect(execSnapshots).toMatchObject(expectedResult); }); + + it('handles goGetDirs configuration correctly', async () => { + fs.readLocalFile.mockResolvedValueOnce('Current go.sum'); + fs.readLocalFile.mockResolvedValueOnce(null); // vendor modules filename + const execSnapshots = mockExecAll(); + git.getRepoStatus.mockResolvedValueOnce( + partial({ + modified: [], + }) + ); + + expect( + await gomod.updateArtifacts({ + packageFileName: 'go.mod', + updatedDeps: [], + newPackageFileContent: gomod1, + config: { + ...config, + goGetDirs: ['.', 'foo', '.bar/...', '&&', 'cat', '/etc/passwd'], + }, + }) + ).toBeNull(); + expect(execSnapshots).toMatchObject([ + { + cmd: 'go get -d -t . foo .bar/... cat', + options: { + cwd: '/tmp/github/some/repo', + }, + }, + ]); + }); + + it('returns updated go.sum when goGetDirs is specified', async () => { + fs.readLocalFile.mockResolvedValueOnce('Current go.sum'); + fs.readLocalFile.mockResolvedValueOnce(null); // vendor modules filename + const execSnapshots = mockExecAll(); + git.getRepoStatus.mockResolvedValueOnce( + partial({ + modified: ['go.sum'], + }) + ); + fs.readLocalFile.mockResolvedValueOnce('New go.sum'); + fs.readLocalFile.mockResolvedValueOnce(gomod1); + expect( + await gomod.updateArtifacts({ + packageFileName: 'go.mod', + updatedDeps: [], + newPackageFileContent: gomod1, + config: { + ...config, + goGetDirs: ['.'], + }, + }) + ).toEqual([ + { + file: { + contents: 'New go.sum', + path: 'go.sum', + type: 'addition', + }, + }, + ]); + expect(execSnapshots).toMatchObject([ + { + cmd: 'go get -d -t .', + options: { + cwd: '/tmp/github/some/repo', + }, + }, + ]); + }); + + it('errors when goGetDirs is specified with all invalid paths', async () => { + fs.readLocalFile.mockResolvedValueOnce('Current go.sum'); + fs.readLocalFile.mockResolvedValueOnce(null); // vendor modules filename + const execSnapshots = mockExecAll(); + git.getRepoStatus.mockResolvedValueOnce( + partial({ + modified: ['go.sum'], + }) + ); + fs.readLocalFile.mockResolvedValueOnce('New go.sum'); + fs.readLocalFile.mockResolvedValueOnce(gomod1); + expect( + await gomod.updateArtifacts({ + packageFileName: 'go.mod', + updatedDeps: [], + newPackageFileContent: gomod1, + config: { + ...config, + goGetDirs: ['&&', '||'], + }, + }) + ).toEqual([ + { artifactError: { lockFile: 'go.sum', stderr: 'Invalid goGetDirs' } }, + ]); + expect(execSnapshots).toMatchObject([]); + }); }); diff --git a/lib/modules/manager/gomod/artifacts.ts b/lib/modules/manager/gomod/artifacts.ts index 6ef9025014685b..0b6de5e39d2d0c 100644 --- a/lib/modules/manager/gomod/artifacts.ts +++ b/lib/modules/manager/gomod/artifacts.ts @@ -1,5 +1,6 @@ import is from '@sindresorhus/is'; import semver from 'semver'; +import { quote } from 'shlex'; import upath from 'upath'; import { GlobalConfig } from '../../../config/global'; import type { PlatformId } from '../../../constants'; @@ -10,6 +11,7 @@ import { exec } from '../../../util/exec'; import type { ExecOptions } from '../../../util/exec/types'; import { ensureCacheDir, + isValidLocalPath, readLocalFile, writeLocalFile, } from '../../../util/fs'; @@ -296,7 +298,25 @@ export async function updateArtifacts({ const execCommands: string[] = []; - let args = 'get -d -t ./...'; + let goGetDirs: string | undefined; + if (config.goGetDirs) { + goGetDirs = config.goGetDirs + .filter((dir) => { + const isValid = isValidLocalPath(dir); + if (!isValid) { + logger.warn({ dir }, 'Invalid path in goGetDirs'); + } + return isValid; + }) + .map(quote) + .join(' '); + + if (goGetDirs === '') { + throw new Error('Invalid goGetDirs'); + } + } + + let args = `get -d -t ${goGetDirs ?? './...'}`; logger.trace({ cmd, args }, 'go get command included'); execCommands.push(`${cmd} ${args}`); diff --git a/lib/modules/manager/gradle/parser.spec.ts b/lib/modules/manager/gradle/parser.spec.ts index cb39d618c21c3a..a0fab69af0b064 100644 --- a/lib/modules/manager/gradle/parser.spec.ts +++ b/lib/modules/manager/gradle/parser.spec.ts @@ -737,21 +737,12 @@ describe('modules/manager/gradle/parser', () => { describe('heuristic dependency matching', () => { test.each` - input | output - ${'("foo", "bar", "1.2.3")'} | ${{ depName: 'foo:bar', currentValue: '1.2.3' }} - ${'("foo", "bar", "1.2.3", "4.5.6")'} | ${null} - ${'(["foo", "bar", "1.2.3"])'} | ${null} - ${'someMethod("foo", "bar", "1.2.3")'} | ${{ depName: 'foo:bar', currentValue: '1.2.3' }} - ${'createXmlValueRemover("defaults", "integer", "integer")'} | ${{ depName: 'defaults:integer', currentValue: 'integer', skipReason: 'ignored' }} - ${'events("passed", "skipped", "failed")'} | ${{ depName: 'passed:skipped', currentValue: 'failed', skipReason: 'ignored' }} - ${'args("foo", "bar", "baz")'} | ${{ depName: 'foo:bar', currentValue: 'baz', skipReason: 'ignored' }} - ${'arrayOf("foo", "bar", "baz")'} | ${{ depName: 'foo:bar', currentValue: 'baz', skipReason: 'ignored' }} - ${'listOf("foo", "bar", "baz")'} | ${{ depName: 'foo:bar', currentValue: 'baz', skipReason: 'ignored' }} - ${'mutableListOf("foo", "bar", "baz")'} | ${{ depName: 'foo:bar', currentValue: 'baz', skipReason: 'ignored' }} - ${'setOf("foo", "bar", "baz")'} | ${{ depName: 'foo:bar', currentValue: 'baz', skipReason: 'ignored' }} - ${'mutableSetOf("foo", "bar", "baz")'} | ${{ depName: 'foo:bar', currentValue: 'baz', skipReason: 'ignored' }} - ${'stages("foo", "bar", "baz")'} | ${{ depName: 'foo:bar', currentValue: 'baz', skipReason: 'ignored' }} - ${'mapScalar("foo", "bar", "baz")'} | ${{ depName: 'foo:bar', currentValue: 'baz', skipReason: 'ignored' }} + input | output + ${'("foo", "bar", "1.2.3")'} | ${{ depName: 'foo:bar', currentValue: '1.2.3' }} + ${'("foo", "bar", "1.2.3", "4.5.6")'} | ${null} + ${'(["foo", "bar", "1.2.3"])'} | ${null} + ${'someMethod("foo", "bar", "1.2.3")'} | ${{ depName: 'foo:bar', currentValue: '1.2.3' }} + ${'listOf("foo", "bar", "baz")'} | ${null} `('$input', ({ input, output }) => { const { deps } = parseGradle(input); expect(deps).toMatchObject([output].filter(is.truthy)); diff --git a/lib/modules/manager/gradle/parser/common.spec.ts b/lib/modules/manager/gradle/parser/common.spec.ts index c2742363c049a7..9b2c2339dead2f 100644 --- a/lib/modules/manager/gradle/parser/common.spec.ts +++ b/lib/modules/manager/gradle/parser/common.spec.ts @@ -1,9 +1,10 @@ import type { lexer } from 'good-enough-parser'; import { partial } from '../../../../../test/util'; -import type { Ctx, PackageVariables } from '../types'; +import type { Ctx } from '../types'; import { cleanupTempVars, coalesceVariable, + findVariable, increaseNestingDepth, interpolateString, loadFromTokenMap, @@ -112,8 +113,17 @@ describe('modules/manager/gradle/parser/common', () => { expect(ctx.varTokens).toStrictEqual([{ value: 'foo.bar.baz.qux' }]); }); + it('findVariable', () => { + ctx.globalVars = { + foo: { key: 'foo', value: 'bar' }, + }; + + expect(findVariable('unknown-global-var', ctx)).toBeUndefined(); + expect(findVariable('foo', ctx)).toStrictEqual(ctx.globalVars['foo']); + }); + it('interpolateString', () => { - expect(interpolateString([], {})).toBeEmptyString(); + expect(interpolateString([], ctx)).toBeEmptyString(); expect( interpolateString( partial([ @@ -121,6 +131,7 @@ describe('modules/manager/gradle/parser/common', () => { { type: 'symbol', value: 'bar' }, { type: 'string-value', value: 'baz' }, ]), + ctx, { bar: { key: '', value: 'BAR' }, } @@ -129,13 +140,13 @@ describe('modules/manager/gradle/parser/common', () => { expect( interpolateString( partial([{ type: 'symbol', value: 'foo' }]), - partial() + ctx ) ).toBeNull(); expect( interpolateString( partial([{ type: '_', value: 'foo' }]), - partial() + ctx ) ).toBeNull(); }); diff --git a/lib/modules/manager/gradle/parser/common.ts b/lib/modules/manager/gradle/parser/common.ts index 4693da32c294f6..6f5c17790d20c0 100644 --- a/lib/modules/manager/gradle/parser/common.ts +++ b/lib/modules/manager/gradle/parser/common.ts @@ -1,7 +1,12 @@ import { lexer, parser, query as q } from 'good-enough-parser'; import { clone } from '../../../../util/clone'; import { regEx } from '../../../../util/regex'; -import type { Ctx, NonEmptyArray, PackageVariables } from '../types'; +import type { + Ctx, + NonEmptyArray, + PackageVariables, + VariableData, +} from '../types'; export const REGISTRY_URLS = { google: 'https://dl.google.com/android/maven2/', @@ -30,19 +35,6 @@ export const GRADLE_PLUGINS = { spotbugs: ['toolVersion', 'com.github.spotbugs:spotbugs'], }; -export const ANNOYING_METHODS: ReadonlySet = new Set([ - 'createXmlValueRemover', - 'events', - 'args', - 'arrayOf', - 'listOf', - 'mutableListOf', - 'setOf', - 'mutableSetOf', - 'stages', // https://github.com/ajoberstar/reckon, - 'mapScalar', // https://github.com/apollographql/apollo-kotlin -]); - export function storeVarToken(ctx: Ctx, node: lexer.Token): Ctx { ctx.varTokens.push(node); return ctx; @@ -114,9 +106,18 @@ export function coalesceVariable(ctx: Ctx): Ctx { return ctx; } +export function findVariable( + name: string, + ctx: Ctx, + variables: PackageVariables = ctx.globalVars +): VariableData | undefined { + return variables[name]; +} + export function interpolateString( childTokens: lexer.Token[], - variables: PackageVariables + ctx: Ctx, + variables: PackageVariables = ctx.globalVars ): string | null { const resolvedSubstrings: string[] = []; for (const childToken of childTokens) { @@ -124,7 +125,7 @@ export function interpolateString( if (type === 'string-value') { resolvedSubstrings.push(childToken.value); } else if (type === 'symbol') { - const varData = variables[childToken.value]; + const varData = findVariable(childToken.value, ctx, variables); if (varData) { resolvedSubstrings.push(varData.value); } else { diff --git a/lib/modules/manager/gradle/parser/handlers.ts b/lib/modules/manager/gradle/parser/handlers.ts index 972322435b479f..273ffeabbe09bc 100644 --- a/lib/modules/manager/gradle/parser/handlers.ts +++ b/lib/modules/manager/gradle/parser/handlers.ts @@ -8,9 +8,9 @@ import type { parseGradle as parseGradleCallback } from '../parser'; import type { Ctx, GradleManagerData } from '../types'; import { parseDependencyString } from '../utils'; import { - ANNOYING_METHODS, GRADLE_PLUGINS, REGISTRY_URLS, + findVariable, interpolateString, loadFromTokenMap, } from './common'; @@ -32,7 +32,7 @@ export function handleAssignment(ctx: Ctx): Ctx { delete ctx.tokenMap.templateStringTokens; } else if (valTokens[0].type === 'symbol') { // foo = bar || foo = "${bar}" - const varData = ctx.globalVars[valTokens[0].value]; + const varData = findVariable(valTokens[0].value, ctx); if (varData) { ctx.globalVars[key] = { ...varData }; } @@ -62,7 +62,7 @@ export function handleAssignment(ctx: Ctx): Ctx { export function handleDepString(ctx: Ctx): Ctx { const stringTokens = loadFromTokenMap(ctx, 'templateStringTokens'); - const templateString = interpolateString(stringTokens, ctx.globalVars); + const templateString = interpolateString(stringTokens, ctx); if (!templateString) { return ctx; } @@ -76,7 +76,7 @@ export function handleDepString(ctx: Ctx): Ctx { let fileReplacePosition: number | undefined; for (const token of stringTokens) { if (token.type === 'symbol') { - const varData = ctx.globalVars[token.value]; + const varData = findVariable(token.value, ctx); if (varData) { packageFile = varData.packageFile; fileReplacePosition = varData.fileReplacePosition; @@ -118,8 +118,8 @@ export function handleKotlinShortNotationDep(ctx: Ctx): Ctx { const moduleNameTokens = loadFromTokenMap(ctx, 'artifactId'); const versionTokens = loadFromTokenMap(ctx, 'version'); - const moduleName = interpolateString(moduleNameTokens, ctx.globalVars); - const versionValue = interpolateString(versionTokens, ctx.globalVars); + const moduleName = interpolateString(moduleNameTokens, ctx); + const versionValue = interpolateString(versionTokens, ctx); if (!moduleName || !versionValue) { return ctx; } @@ -141,7 +141,7 @@ export function handleKotlinShortNotationDep(ctx: Ctx): Ctx { // = template string with multiple variables dep.skipReason = 'unknown-version'; } else if (versionTokens[0].type === 'symbol') { - const varData = ctx.globalVars[versionTokens[0].value]; + const varData = findVariable(versionTokens[0].value, ctx); if (varData) { dep.groupName = varData.key; dep.currentValue = varData.value; @@ -162,9 +162,9 @@ export function handleLongFormDep(ctx: Ctx): Ctx { const artifactIdTokens = loadFromTokenMap(ctx, 'artifactId'); const versionTokens = loadFromTokenMap(ctx, 'version'); - const groupId = interpolateString(groupIdTokens, ctx.globalVars); - const artifactId = interpolateString(artifactIdTokens, ctx.globalVars); - const version = interpolateString(versionTokens, ctx.globalVars); + const groupId = interpolateString(groupIdTokens, ctx); + const artifactId = interpolateString(artifactIdTokens, ctx); + const version = interpolateString(versionTokens, ctx); if (!groupId || !artifactId || !version) { return ctx; } @@ -179,7 +179,7 @@ export function handleLongFormDep(ctx: Ctx): Ctx { // = template string with multiple variables dep.skipReason = 'unknown-version'; } else if (versionTokens[0].type === 'symbol') { - const varData = ctx.globalVars[versionTokens[0].value]; + const varData = findVariable(versionTokens[0].value, ctx); if (varData) { dep.groupName = varData.key; dep.managerData = { @@ -198,10 +198,6 @@ export function handleLongFormDep(ctx: Ctx): Ctx { }; } - if (methodName?.[0] && ANNOYING_METHODS.has(methodName[0].value)) { - dep.skipReason = 'ignored'; - } - ctx.deps.push(dep); return ctx; @@ -233,7 +229,7 @@ export function handlePlugin(ctx: Ctx): Ctx { // = template string with multiple variables dep.skipReason = 'unknown-version'; } else if (pluginVersion[0].type === 'symbol') { - const varData = ctx.globalVars[pluginVersion[0].value]; + const varData = findVariable(pluginVersion[0].value, ctx); if (varData) { dep.groupName = varData.key; dep.currentValue = varData.value; @@ -276,7 +272,7 @@ export function handleCustomRegistryUrl(ctx: Ctx): Ctx { if (ctx.tokenMap.name) { const nameTokens = loadFromTokenMap(ctx, 'name'); - const nameValue = interpolateString(nameTokens, localVariables); + const nameValue = interpolateString(nameTokens, ctx, localVariables); if (nameValue) { localVariables = { ...localVariables, @@ -290,6 +286,7 @@ export function handleCustomRegistryUrl(ctx: Ctx): Ctx { let registryUrl = interpolateString( loadFromTokenMap(ctx, 'registryUrl'), + ctx, localVariables ); if (registryUrl) { @@ -314,8 +311,8 @@ export function handleLibraryDep(ctx: Ctx): Ctx { const groupIdTokens = loadFromTokenMap(ctx, 'groupId'); const artifactIdTokens = loadFromTokenMap(ctx, 'artifactId'); - const groupId = interpolateString(groupIdTokens, ctx.globalVars); - const artifactId = interpolateString(artifactIdTokens, ctx.globalVars); + const groupId = interpolateString(groupIdTokens, ctx); + const artifactId = interpolateString(artifactIdTokens, ctx); if (!groupId || !artifactId) { return ctx; } @@ -331,10 +328,7 @@ export function handleLibraryDep(ctx: Ctx): Ctx { }; if (ctx.tokenMap.version) { - const version = interpolateString( - loadFromTokenMap(ctx, 'version'), - ctx.globalVars - ); + const version = interpolateString(loadFromTokenMap(ctx, 'version'), ctx); if (version) { handleLongFormDep(ctx); } @@ -344,10 +338,7 @@ export function handleLibraryDep(ctx: Ctx): Ctx { } export function handleApplyFrom(ctx: Ctx): Ctx { - let scriptFile = interpolateString( - loadFromTokenMap(ctx, 'scriptFile'), - ctx.globalVars - ); + let scriptFile = interpolateString(loadFromTokenMap(ctx, 'scriptFile'), ctx); if (!scriptFile) { return ctx; } @@ -355,7 +346,7 @@ export function handleApplyFrom(ctx: Ctx): Ctx { if (ctx.tokenMap.parentPath) { const parentPath = interpolateString( loadFromTokenMap(ctx, 'parentPath'), - ctx.globalVars + ctx ); if (parentPath && scriptFile) { scriptFile = upath.join(parentPath, scriptFile); @@ -397,7 +388,7 @@ export function handleApplyFrom(ctx: Ctx): Ctx { export function handleImplicitGradlePlugin(ctx: Ctx): Ctx { const pluginName = loadFromTokenMap(ctx, 'pluginName')[0].value; const versionTokens = loadFromTokenMap(ctx, 'version'); - const versionValue = interpolateString(versionTokens, ctx.globalVars); + const versionValue = interpolateString(versionTokens, ctx); if (!versionValue) { return ctx; } @@ -420,7 +411,7 @@ export function handleImplicitGradlePlugin(ctx: Ctx): Ctx { // = template string with multiple variables dep.skipReason = 'unknown-version'; } else if (versionTokens[0].type === 'symbol') { - const varData = ctx.globalVars[versionTokens[0].value]; + const varData = findVariable(versionTokens[0].value, ctx); if (varData) { dep.groupName = varData.key; dep.currentValue = varData.value; diff --git a/lib/modules/manager/gradle/utils.spec.ts b/lib/modules/manager/gradle/utils.spec.ts index 0a3ee6c05ef0d3..ac8bfb824d15f8 100644 --- a/lib/modules/manager/gradle/utils.spec.ts +++ b/lib/modules/manager/gradle/utils.spec.ts @@ -13,13 +13,11 @@ describe('modules/manager/gradle/utils', () => { it('versionLikeSubstring', () => { [ '1.2.3', - 'foobar', '[1.0,2.0]', '(,2.0[', '2.1.1.RELEASE', '1.0.+', '2022-05-10_55', - 'latest', ].forEach((input) => { expect(versionLikeSubstring(input)).toEqual(input); expect(versionLikeSubstring(`${input}'`)).toEqual(input); @@ -31,12 +29,14 @@ describe('modules/manager/gradle/utils', () => { expect(versionLikeSubstring('')).toBeNull(); expect(versionLikeSubstring(undefined)).toBeNull(); expect(versionLikeSubstring(null)).toBeNull(); + expect(versionLikeSubstring('foobar')).toBeNull(); + expect(versionLikeSubstring('latest')).toBeNull(); }); it('isDependencyString', () => { expect(isDependencyString('foo:bar:1.2.3')).toBeTrue(); expect(isDependencyString('foo.foo:bar.bar:1.2.3')).toBeTrue(); - expect(isDependencyString('foo:bar:baz:qux')).toBeTrue(); + expect(isDependencyString('foo:bar:baz:qux')).toBeFalse(); expect(isDependencyString('foo.bar:baz:1.2.3')).toBeTrue(); expect(isDependencyString('foo.bar:baz:1.2.3:linux-cpu-x86_64')).toBeTrue(); expect(isDependencyString('foo.bar:baz:1.2.+')).toBeTrue(); @@ -57,10 +57,6 @@ describe('modules/manager/gradle/utils', () => { depName: 'foo.foo:bar.bar', currentValue: '1.2.3', }); - expect(parseDependencyString('foo:bar:baz:qux')).toMatchObject({ - depName: 'foo:bar', - currentValue: 'baz', - }); expect(parseDependencyString('foo.bar:baz:1.2.3')).toMatchObject({ depName: 'foo.bar:baz', currentValue: '1.2.3', @@ -69,6 +65,7 @@ describe('modules/manager/gradle/utils', () => { depName: 'foo:bar', currentValue: '1.2.+', }); + expect(parseDependencyString('foo:bar:baz:qux')).toBeNull(); expect(parseDependencyString('foo:bar:baz:qux:quux')).toBeNull(); expect(parseDependencyString("foo:bar:1.2.3'")).toBeNull(); expect(parseDependencyString('foo:bar:1.2.3"')).toBeNull(); diff --git a/lib/modules/manager/gradle/utils.ts b/lib/modules/manager/gradle/utils.ts index c2c898b3806455..bed8720663dc5f 100644 --- a/lib/modules/manager/gradle/utils.ts +++ b/lib/modules/manager/gradle/utils.ts @@ -18,8 +18,17 @@ const versionLikeRegex = regEx('^(?[-_.\\[\\](),a-zA-Z0-9+]+)'); export function versionLikeSubstring( input: string | null | undefined ): string | null { - const match = input ? versionLikeRegex.exec(input) : null; - return match?.groups?.version ?? null; + if (!input) { + return null; + } + + const match = versionLikeRegex.exec(input); + const version = match?.groups?.version; + if (!version || !regEx(/\d/).test(version)) { + return null; + } + + return version; } export function isDependencyString(input: string): boolean { diff --git a/lib/modules/manager/helmfile/__fixtures__/go-template.yaml b/lib/modules/manager/helmfile/__fixtures__/go-template.yaml index d9179d9a170271..29553475bd178d 100644 --- a/lib/modules/manager/helmfile/__fixtures__/go-template.yaml +++ b/lib/modules/manager/helmfile/__fixtures__/go-template.yaml @@ -12,10 +12,10 @@ releases: chart: ./foo - name: "{{ requiredEnv \"RELEASE_NAME\" }}" namespace: default - chart: ../bar + chart: ../repo/bar - name: "{{ requiredEnv \"RELEASE_NAME\" }}" namespace: default - chart: /baz + chart: /tmp/github/some/repo/baz - name: {{ requiredEnv "RELEASE_NAME" }} namespace: default chart: ./foo diff --git a/lib/modules/manager/helmfile/__fixtures__/multidoc.yaml b/lib/modules/manager/helmfile/__fixtures__/multidoc.yaml index d42bd70e57cfd2..f194b9c30410a9 100644 --- a/lib/modules/manager/helmfile/__fixtures__/multidoc.yaml +++ b/lib/modules/manager/helmfile/__fixtures__/multidoc.yaml @@ -25,8 +25,6 @@ repositories: url: https://charts.bitnami.com/bitnami - name: prometheus-community url: https://prometheus-community.github.io/helm-charts -- name: incubator - url: https://charts.helm.sh/incubator/ templates: external-chart: &external-chart diff --git a/lib/modules/manager/helmfile/__fixtures__/uses-kustomization.yaml b/lib/modules/manager/helmfile/__fixtures__/uses-kustomization.yaml new file mode 100644 index 00000000000000..13db1e75ffdcf1 --- /dev/null +++ b/lib/modules/manager/helmfile/__fixtures__/uses-kustomization.yaml @@ -0,0 +1,10 @@ +repositories: + - name: bitnami + url: https://charts.bitnami.com/bitnami + +releases: + - name: my-chart + chart: ../charts/my-chart + - name: memcached + version: 6.0.0 + chart: bitnami/memcached diff --git a/lib/modules/manager/helmfile/__snapshots__/extract.spec.ts.snap b/lib/modules/manager/helmfile/__snapshots__/extract.spec.ts.snap index 49b560fae84aa4..a81b5d69302566 100644 --- a/lib/modules/manager/helmfile/__snapshots__/extract.spec.ts.snap +++ b/lib/modules/manager/helmfile/__snapshots__/extract.spec.ts.snap @@ -33,14 +33,14 @@ exports[`modules/manager/helmfile/extract extractPackageFile() parses multidoc y { "currentValue": "0.1.0", "depName": "raw", - "managerData": { - "needKustomize": true, - }, "registryUrls": [ "https://charts.helm.sh/incubator/", ], }, ], + "managerData": { + "needKustomize": true, + }, } `; diff --git a/lib/modules/manager/helmfile/extract.spec.ts b/lib/modules/manager/helmfile/extract.spec.ts index 68a7bbb8cd1b05..479fad453fa780 100644 --- a/lib/modules/manager/helmfile/extract.spec.ts +++ b/lib/modules/manager/helmfile/extract.spec.ts @@ -1,20 +1,28 @@ import { Fixtures } from '../../../../test/fixtures'; +import { fs } from '../../../../test/util'; +import { GlobalConfig } from '../../../config/global'; +import { FILE_ACCESS_VIOLATION_ERROR } from '../../../constants/error-messages'; import { extractPackageFile } from '.'; +jest.mock('../../../util/fs'); + +const localDir = '/tmp/github/some/repo'; + describe('modules/manager/helmfile/extract', () => { describe('extractPackageFile()', () => { beforeEach(() => { + GlobalConfig.set({ localDir }); jest.resetAllMocks(); }); - it('returns null if no releases', () => { + it('returns null if no releases', async () => { const content = ` repositories: - name: kiwigrid url: https://kiwigrid.github.io `; const fileName = 'helmfile.yaml'; - const result = extractPackageFile(content, fileName, { + const result = await extractPackageFile(content, fileName, { registryAliases: { stable: 'https://charts.helm.sh/stable', }, @@ -22,7 +30,7 @@ describe('modules/manager/helmfile/extract', () => { expect(result).toBeNull(); }); - it('do not crash on invalid helmfile.yaml', () => { + it('do not crash on invalid helmfile.yaml', async () => { const content = ` repositories: - name: kiwigrid @@ -31,7 +39,7 @@ describe('modules/manager/helmfile/extract', () => { releases: [ `; const fileName = 'helmfile.yaml'; - const result = extractPackageFile(content, fileName, { + const result = await extractPackageFile(content, fileName, { registryAliases: { stable: 'https://charts.helm.sh/stable', }, @@ -39,7 +47,7 @@ describe('modules/manager/helmfile/extract', () => { expect(result).toBeNull(); }); - it('skip if repository details are not specified', () => { + it('skip if repository details are not specified', async () => { const content = ` repositories: - name: kiwigrid @@ -50,7 +58,7 @@ describe('modules/manager/helmfile/extract', () => { chart: experimental/example `; const fileName = 'helmfile.yaml'; - const result = extractPackageFile(content, fileName, { + const result = await extractPackageFile(content, fileName, { registryAliases: { stable: 'https://charts.helm.sh/stable', }, @@ -60,7 +68,7 @@ describe('modules/manager/helmfile/extract', () => { expect(result?.deps.every((dep) => dep.skipReason)).toBeTruthy(); }); - it('skip templetized release with invalid characters', () => { + it('skip templetized release with invalid characters', async () => { const content = ` repositories: - name: kiwigrid @@ -74,7 +82,7 @@ describe('modules/manager/helmfile/extract', () => { chart: stable/example `; const fileName = 'helmfile.yaml'; - const result = extractPackageFile(content, fileName, { + const result = await extractPackageFile(content, fileName, { registryAliases: { stable: 'https://charts.helm.sh/stable', }, @@ -94,7 +102,7 @@ describe('modules/manager/helmfile/extract', () => { }); }); - it('skip local charts', () => { + it('skip local charts', async () => { const content = ` repositories: - name: kiwigrid @@ -105,7 +113,7 @@ describe('modules/manager/helmfile/extract', () => { chart: ./charts/example `; const fileName = 'helmfile.yaml'; - const result = extractPackageFile(content, fileName, { + const result = await extractPackageFile(content, fileName, { registryAliases: { stable: 'https://charts.helm.sh/stable', }, @@ -115,7 +123,7 @@ describe('modules/manager/helmfile/extract', () => { expect(result?.deps.every((dep) => dep.skipReason)).toBeTruthy(); }); - it('skip chart with unknown repository', () => { + it('skip chart with unknown repository', async () => { const content = ` repositories: - name: kiwigrid @@ -126,7 +134,7 @@ describe('modules/manager/helmfile/extract', () => { chart: example `; const fileName = 'helmfile.yaml'; - const result = extractPackageFile(content, fileName, { + const result = await extractPackageFile(content, fileName, { registryAliases: { stable: 'https://charts.helm.sh/stable', }, @@ -136,7 +144,7 @@ describe('modules/manager/helmfile/extract', () => { expect(result?.deps.every((dep) => dep.skipReason)).toBeTruthy(); }); - it('skip chart with special character in the name', () => { + it('skip chart with special character in the name', async () => { const content = ` repositories: - name: kiwigrid @@ -150,7 +158,7 @@ describe('modules/manager/helmfile/extract', () => { chart: kiwigrid/example?example `; const fileName = 'helmfile.yaml'; - const result = extractPackageFile(content, fileName, { + const result = await extractPackageFile(content, fileName, { registryAliases: { stable: 'https://charts.helm.sh/stable', }, @@ -160,7 +168,7 @@ describe('modules/manager/helmfile/extract', () => { expect(result?.deps.every((dep) => dep.skipReason)).toBeTruthy(); }); - it('skip chart that does not have specified version', () => { + it('skip chart that does not have specified version', async () => { const content = ` repositories: - name: kiwigrid @@ -170,7 +178,7 @@ describe('modules/manager/helmfile/extract', () => { chart: stable/example `; const fileName = 'helmfile.yaml'; - const result = extractPackageFile(content, fileName, { + const result = await extractPackageFile(content, fileName, { registryAliases: { stable: 'https://charts.helm.sh/stable', }, @@ -180,9 +188,9 @@ describe('modules/manager/helmfile/extract', () => { expect(result?.deps.every((dep) => dep.skipReason)).toBeTruthy(); }); - it('parses multidoc yaml', () => { + it('parses multidoc yaml', async () => { const fileName = 'helmfile.yaml'; - const result = extractPackageFile( + const result = await extractPackageFile( Fixtures.get('multidoc.yaml'), fileName, { @@ -199,12 +207,13 @@ describe('modules/manager/helmfile/extract', () => { { depName: 'kube-prometheus-stack', currentValue: '13.7' }, { depName: 'invalid', skipReason: 'invalid-name' }, { depName: 'external-dns', skipReason: 'invalid-version' }, - { depName: 'raw', managerData: { needKustomize: true } }, + { depName: 'raw' }, ], + managerData: { needKustomize: true }, }); }); - it('parses a chart with a go templating', () => { + it('parses a chart with a go templating', async () => { const content = ` repositories: - name: kiwigrid @@ -222,7 +231,7 @@ describe('modules/manager/helmfile/extract', () => { chart: stable/example `; const fileName = 'helmfile.yaml'; - const result = extractPackageFile(content, fileName, { + const result = await extractPackageFile(content, fileName, { registryAliases: { stable: 'https://charts.helm.sh/stable', }, @@ -242,7 +251,7 @@ describe('modules/manager/helmfile/extract', () => { }); }); - it('parses a chart with empty strings for template values', () => { + it('parses a chart with empty strings for template values', async () => { const content = ` repositories: - name: kiwigrid @@ -259,7 +268,7 @@ describe('modules/manager/helmfile/extract', () => { chart: stable/example `; const fileName = 'helmfile.yaml'; - const result = extractPackageFile(content, fileName, { + const result = await extractPackageFile(content, fileName, { registryAliases: { stable: 'https://charts.helm.sh/stable', }, @@ -281,7 +290,7 @@ describe('modules/manager/helmfile/extract', () => { }); }); - it('parses a chart with an oci repository and non-oci one', () => { + it('parses a chart with an oci repository and non-oci one', async () => { const content = ` repositories: - name: oci-repo @@ -299,7 +308,7 @@ describe('modules/manager/helmfile/extract', () => { version: 3.3.0 `; const fileName = 'helmfile.yaml'; - const result = extractPackageFile(content, fileName, { + const result = await extractPackageFile(content, fileName, { registryAliases: { stable: 'https://charts.helm.sh/stable', }, @@ -321,9 +330,10 @@ describe('modules/manager/helmfile/extract', () => { }); }); - it('parses and replaces templating strings', () => { + it('parses and replaces templating strings', async () => { const filename = 'helmfile.yaml'; - const result = extractPackageFile( + fs.localPathExists.mockReturnValue(Promise.resolve(true)); + const result = await extractPackageFile( Fixtures.get('go-template.yaml'), filename, { @@ -347,7 +357,10 @@ describe('modules/manager/helmfile/extract', () => { depName: '', skipReason: 'local-chart', }, - { depName: null, skipReason: 'local-chart' }, + { + depName: null, + skipReason: 'local-chart', + }, { depName: 'ingress-nginx', currentValue: '3.37.0', @@ -372,6 +385,43 @@ describe('modules/manager/helmfile/extract', () => { registryUrls: ['https://charts.helm.sh/stable'], }, ], + managerData: { needKustomize: true }, + }); + }); + + it('detects kustomize and respects relative paths', async () => { + fs.localPathExists.mockImplementationOnce((path) => { + if (!path.startsWith(GlobalConfig.get('localDir') ?? '')) { + throw new Error(FILE_ACCESS_VIOLATION_ERROR); + } + return Promise.resolve(true); + }); + + const parentDir = `${localDir}/project`; + fs.getParentDir.mockReturnValue(parentDir); + const result = await extractPackageFile( + Fixtures.get('uses-kustomization.yaml'), + `${parentDir}/helmfile.yaml`, // In subdir + { + registryAliases: { + stable: 'https://charts.helm.sh/stable', + }, + } + ); + expect(result).toMatchObject({ + datasource: 'helm', + deps: [ + { + depName: 'my-chart', + skipReason: 'local-chart', + }, + { + depName: 'memcached', + currentValue: '6.0.0', + registryUrls: ['https://charts.bitnami.com/bitnami'], + }, + ], + managerData: { needKustomize: true }, }); }); }); diff --git a/lib/modules/manager/helmfile/extract.ts b/lib/modules/manager/helmfile/extract.ts index 4f65fbd823c1be..a1c6bc4c96a6e8 100644 --- a/lib/modules/manager/helmfile/extract.ts +++ b/lib/modules/manager/helmfile/extract.ts @@ -10,7 +10,10 @@ import type { PackageFileContent, } from '../types'; import type { Doc } from './types'; -import { areKustomizationsUsed } from './utils'; +import { + kustomizationsKeysUsed, + localChartHasKustomizationsYaml, +} from './utils'; const isValidChartName = (name: string | undefined): boolean => !!name && !regEx(/[!@#$%^&*(),.?":{}/|<>A-Z]/).test(name); @@ -22,14 +25,22 @@ function extractYaml(content: string): string { .replace(regEx(/{{.+?}}/g), ''); } -export function extractPackageFile( +function isLocalPath(possiblePath: string): boolean { + return ['./', '../', '/'].some((localPrefix) => + possiblePath.startsWith(localPrefix) + ); +} + +export async function extractPackageFile( content: string, fileName: string, config: ExtractConfig -): PackageFileContent | null { - let deps: PackageDependency[] = []; +): Promise { + const deps: PackageDependency[] = []; let docs: Doc[]; const registryAliases: Record = {}; + // Record kustomization usage for all deps, since updating artifacts is run on the helmfile.yaml as a whole. + let needKustomize = false; try { docs = loadAll(extractYaml(content), null, { json: true }) as Doc[]; } catch (err) { @@ -48,23 +59,31 @@ export function extractPackageFile( } logger.debug({ registryAliases }, 'repositories discovered.'); - deps = doc.releases.map((dep) => { + for (const dep of doc.releases) { let depName = dep.chart; let repoName: string | null = null; if (!is.string(dep.chart)) { - return { + deps.push({ depName: dep.name, skipReason: 'invalid-name', - }; + }); + continue; } // If it starts with ./ ../ or / then it's a local path - if (['./', '../', '/'].some((val) => dep.chart.startsWith(val))) { - return { + if (isLocalPath(dep.chart)) { + if ( + kustomizationsKeysUsed(dep) || + (await localChartHasKustomizationsYaml(dep, fileName)) + ) { + needKustomize = true; + } + deps.push({ depName: dep.name, skipReason: 'local-chart', - }; + }); + continue; } if (is.number(dep.version)) { @@ -80,10 +99,11 @@ export function extractPackageFile( } if (!is.string(dep.version)) { - return { + deps.push({ depName, skipReason: 'invalid-version', - }; + }); + continue; } const res: PackageDependency = { @@ -93,8 +113,8 @@ export function extractPackageFile( .concat([config.registryAliases?.[repoName]] as string[]) .filter(is.string), }; - if (areKustomizationsUsed(dep)) { - res.managerData = { needKustomize: true }; + if (kustomizationsKeysUsed(dep)) { + needKustomize = true; } // in case of OCI repository, we need a PackageDependency with a DockerDatasource and a packageName const repository = doc.repositories?.find( @@ -116,9 +136,15 @@ export function extractPackageFile( res.skipReason = 'unknown-registry'; } - return res; - }); + deps.push(res); + } } - return deps.length ? { deps, datasource: HelmDatasource.id } : null; + return deps.length + ? { + deps, + datasource: HelmDatasource.id, + ...(needKustomize && { managerData: { needKustomize } }), + } + : null; } diff --git a/lib/modules/manager/helmfile/utils.ts b/lib/modules/manager/helmfile/utils.ts index 415925b9d10aa0..9f843612c59061 100644 --- a/lib/modules/manager/helmfile/utils.ts +++ b/lib/modules/manager/helmfile/utils.ts @@ -1,10 +1,25 @@ +import upath from 'upath'; + +import { getParentDir, localPathExists } from '../../../util/fs'; import type { Release } from './types'; -/** Returns true if kustomize specific keys exist in a helmfile release */ -export function areKustomizationsUsed(release: Release): boolean { +/** Returns true if a helmfile release contains kustomize specific keys **/ +export function kustomizationsKeysUsed(release: Release): boolean { return ( release.strategicMergePatches !== undefined || release.jsonPatches !== undefined || release.transformers !== undefined ); } + +/** Returns true if a helmfile release uses a local chart with a kustomization.yaml file **/ +// eslint-disable-next-line require-await +export async function localChartHasKustomizationsYaml( + release: Release, + helmFileYamlFileName: string +): Promise { + const helmfileYamlParentDir = getParentDir(helmFileYamlFileName) || ''; + return localPathExists( + upath.join(helmfileYamlParentDir, release.chart, 'kustomization.yaml') + ); +} diff --git a/lib/modules/manager/pipenv/artifacts.ts b/lib/modules/manager/pipenv/artifacts.ts index e6959984718669..50692ec341312e 100644 --- a/lib/modules/manager/pipenv/artifacts.ts +++ b/lib/modules/manager/pipenv/artifacts.ts @@ -17,7 +17,7 @@ import type { } from '../types'; import { PipfileLockSchema } from './schema'; -function getPythonConstraint( +export function getPythonConstraint( existingLockFileContent: string, config: UpdateArtifactsConfig ): string | undefined { @@ -51,7 +51,7 @@ function getPythonConstraint( return undefined; } -function getPipenvConstraint( +export function getPipenvConstraint( existingLockFileContent: string, config: UpdateArtifactsConfig ): string { diff --git a/lib/modules/manager/regex/index.spec.ts b/lib/modules/manager/regex/index.spec.ts index 886c7ed2ffb1af..c1adbbb93347b7 100644 --- a/lib/modules/manager/regex/index.spec.ts +++ b/lib/modules/manager/regex/index.spec.ts @@ -559,33 +559,68 @@ describe('modules/manager/regex/index', () => { }); }); - it('migrates', async () => { - const config: CustomExtractConfig = { - matchStrings: [ - '# renovate: datasource=(?[a-z-]+?)(?: (?:packageName|lookupName)=(?.+?))?(?: versioning=(?[a-z-]+?))?\\sRUN install-[a-z]+? (?[a-z-]+?) (?.+?)(?:\\s|$)', - ], - versioningTemplate: - '{{#if versioning}}{{versioning}}{{else}}semver{{/if}}', - }; - const res = await extractPackageFile( + it.each([ + [ + 'dotnet', codeBlock` - # renovate: datasource=dotnet packageName=dotnet-runtime - RUN install-tool dotnet 6.0.13 - `, + # renovate: datasource=dotnet packageName=dotnet-runtime + RUN install-tool dotnet 6.0.13 + `, 'Dockerfile', - config - ); - expect(res).toMatchObject({ - deps: [ - { - depName: 'dotnet', - packageName: 'dotnet-runtime', - currentValue: '6.0.13', - datasource: 'dotnet-version', - replaceString: - '# renovate: datasource=dotnet packageName=dotnet-runtime\nRUN install-tool dotnet 6.0.13', - }, - ], - }); - }); + 'dotnet-version', + 'dotnet-runtime', + 'dotnet', + ], + [ + 'adoptium-java', + codeBlock` + # renovate: datasource=adoptium-java packageName=java + RUN install-tool java 6.0.13 + `, + 'Dockerfile', + 'java-version', + 'java', + 'java', + ], + [ + 'node', + codeBlock` + # renovate: datasource=node packageName=node + RUN install-tool node 6.0.13 + `, + 'Dockerfile', + 'node-version', + 'node', + 'node', + ], + ])( + 'migrates %s', + async ( + _oldDatasource, + content, + packageFile, + newDatasource, + packageName, + depName + ) => { + const config: CustomExtractConfig = { + matchStrings: [ + '# renovate: datasource=(?[a-z-]+?)(?: (?:packageName|lookupName)=(?.+?))?(?: versioning=(?[a-z-]+?))?\\sRUN install-[a-z]+? (?[a-z-]+?) (?.+?)(?:\\s|$)', + ], + versioningTemplate: + '{{#if versioning}}{{versioning}}{{else}}semver{{/if}}', + }; + const res = await extractPackageFile(content, packageFile, config); + expect(res).toMatchObject({ + deps: [ + { + depName, + packageName, + currentValue: '6.0.13', + datasource: newDatasource, + }, + ], + }); + } + ); }); diff --git a/lib/modules/manager/sbt/types.ts b/lib/modules/manager/sbt/types.ts deleted file mode 100644 index 340f93b2047374..00000000000000 --- a/lib/modules/manager/sbt/types.ts +++ /dev/null @@ -1,11 +0,0 @@ -export interface ParseContext { - scalaVersion?: string | null; - variables: Record; - depType?: string; -} - -export interface ParseOptions { - isMultiDeps?: boolean; - scalaVersion?: string | null; - variables?: Record; -} diff --git a/lib/modules/manager/terraform/extractors/others/modules.spec.ts b/lib/modules/manager/terraform/extractors/others/modules.spec.ts index 88c204c1b46826..eb2ff9844bc401 100644 --- a/lib/modules/manager/terraform/extractors/others/modules.spec.ts +++ b/lib/modules/manager/terraform/extractors/others/modules.spec.ts @@ -19,10 +19,24 @@ describe('modules/manager/terraform/extractors/others/modules', () => { const groups = githubRefMatchRegex.exec( 'github.com/hashicorp/example?ref=v1.0.0' )?.groups; + const depth = githubRefMatchRegex.exec( + 'github.com/hashicorp/example?depth=1&ref=v1.0.0' + )?.groups; + const depth2 = githubRefMatchRegex.exec( + 'github.com/hashicorp/example?ref=v1.0.0&depth=1' + )?.groups; expect(groups).toEqual({ project: 'hashicorp/example', tag: 'v1.0.0', }); + expect(depth).toEqual({ + project: 'hashicorp/example', + tag: 'v1.0.0', + }); + expect(depth2).toEqual({ + project: 'hashicorp/example', + tag: 'v1.0.0', + }); }); it('should parse alpha-numeric characters as well as dots, underscores, and dashes in repo names', () => { @@ -47,6 +61,15 @@ describe('modules/manager/terraform/extractors/others/modules', () => { const ssh = gitTagsRefMatchRegex.exec( 'ssh://github.com/hashicorp/example?ref=v1.0.0' )?.groups; + const depth = gitTagsRefMatchRegex.exec( + 'ssh://github.com/hashicorp/example?depth=1&ref=v1.0.0' + )?.groups; + const depth2 = gitTagsRefMatchRegex.exec( + 'ssh://github.com/hashicorp/example?ref=v1.0.0&depth=1' + )?.groups; + const folder = gitTagsRefMatchRegex.exec( + 'git::ssh://git@git.example.com/modules/foo-module.git//bar?depth=1&ref=v1.0.0' + )?.groups; expect(http).toMatchObject({ project: 'hashicorp/example', @@ -60,6 +83,18 @@ describe('modules/manager/terraform/extractors/others/modules', () => { project: 'hashicorp/example', tag: 'v1.0.0', }); + expect(depth).toMatchObject({ + project: 'hashicorp/example', + tag: 'v1.0.0', + }); + expect(depth2).toMatchObject({ + project: 'hashicorp/example', + tag: 'v1.0.0', + }); + expect(folder).toMatchObject({ + project: '/bar', + tag: 'v1.0.0', + }); }); it('should parse alpha-numeric characters as well as dots, underscores, and dashes in repo names', () => { @@ -113,6 +148,12 @@ describe('modules/manager/terraform/extractors/others/modules', () => { const subfolderWithDoubleSlash = bitbucketRefMatchRegex.exec( 'bitbucket.org/hashicorp/example.git//terraform?ref=v1.0.0' )?.groups; + const depth = bitbucketRefMatchRegex.exec( + 'git::https://git@bitbucket.org/hashicorp/example.git?depth=1&ref=v1.0.0' + )?.groups; + const depth2 = bitbucketRefMatchRegex.exec( + 'git::https://git@bitbucket.org/hashicorp/example.git?ref=v1.0.0&depth=1' + )?.groups; expect(ssh).toMatchObject({ workspace: 'hashicorp', @@ -139,6 +180,16 @@ describe('modules/manager/terraform/extractors/others/modules', () => { project: 'example', tag: 'v1.0.0', }); + expect(depth).toMatchObject({ + workspace: 'hashicorp', + project: 'example', + tag: 'v1.0.0', + }); + expect(depth2).toMatchObject({ + workspace: 'hashicorp', + project: 'example', + tag: 'v1.0.0', + }); }); it('should parse alpha-numeric characters as well as dots, underscores, and dashes in repo names', () => { @@ -200,6 +251,32 @@ describe('modules/manager/terraform/extractors/others/modules', () => { }); }); + it('should split organization, project, repository and tag from source url with depth argument', () => { + const depth = azureDevOpsSshRefMatchRegex.exec( + 'git::git@ssh.dev.azure.com:v3/MyOrg/MyProject/MyRepository//some-module/path?depth=1&ref=1.0.0' + )?.groups; + const depth2 = azureDevOpsSshRefMatchRegex.exec( + 'git::git@ssh.dev.azure.com:v3/MyOrg/MyProject/MyRepository//some-module/path?ref=1.0.0&depth=1' + )?.groups; + + expect(depth).toEqual({ + modulepath: '//some-module/path', + organization: 'MyOrg', + project: 'MyProject', + repository: 'MyRepository', + tag: '1.0.0', + url: 'git@ssh.dev.azure.com:v3/MyOrg/MyProject/MyRepository', + }); + expect(depth2).toEqual({ + modulepath: '//some-module/path', + organization: 'MyOrg', + project: 'MyProject', + repository: 'MyRepository', + tag: '1.0.0', + url: 'git@ssh.dev.azure.com:v3/MyOrg/MyProject/MyRepository', + }); + }); + it('should parse alpha-numeric characters as well as dots, underscores, and dashes in repo names', () => { const dots = azureDevOpsSshRefMatchRegex.exec( 'git::git@ssh.dev.azure.com:v3/MyOrg/MyProject/MyRepository//some-module/path?ref=v1.0.0' diff --git a/lib/modules/manager/terraform/extractors/others/modules.ts b/lib/modules/manager/terraform/extractors/others/modules.ts index 3eba9cc81aa02c..2c135d995d55f3 100644 --- a/lib/modules/manager/terraform/extractors/others/modules.ts +++ b/lib/modules/manager/terraform/extractors/others/modules.ts @@ -10,16 +10,16 @@ import { DependencyExtractor } from '../../base'; import type { TerraformDefinitionFile } from '../../hcl/types'; export const githubRefMatchRegex = regEx( - /github\.com([/:])(?[^/]+\/[a-z0-9-_.]+).*\?ref=(?.*)$/i + /github\.com([/:])(?[^/]+\/[a-z0-9-_.]+).*\?(depth=\d+&)?ref=(?.*?)(&depth=\d+)?$/i ); export const bitbucketRefMatchRegex = regEx( - /(?:git::)?(?(?:http|https|ssh)?(?::\/\/)?(?:.*@)?(?bitbucket\.org\/(?.*)\/(?.*).git\/?(?.*)))\?ref=(?.*)$/ + /(?:git::)?(?(?:http|https|ssh)?(?::\/\/)?(?:.*@)?(?bitbucket\.org\/(?.*)\/(?.*).git\/?(?.*)))\?(depth=\d+&)?ref=(?.*?)(&depth=\d+)?$/ ); export const gitTagsRefMatchRegex = regEx( - /(?:git::)?(?(?:(?:http|https|ssh):\/\/)?(?:.*@)?(?.*\/(?.*\/.*)))\?ref=(?.*)$/ + /(?:git::)?(?(?:(?:http|https|ssh):\/\/)?(?:.*@)?(?.*\/(?.*\/.*)))\?(depth=\d+&)?ref=(?.*?)(&depth=\d+)?$/ ); export const azureDevOpsSshRefMatchRegex = regEx( - /(?:git::)?(?git@ssh\.dev\.azure\.com:v3\/(?[^/]*)\/(?[^/]*)\/(?[^/]*))(?.*)?\?ref=(?.*)$/ + /(?:git::)?(?git@ssh\.dev\.azure\.com:v3\/(?[^/]*)\/(?[^/]*)\/(?[^/]*))(?.*)?\?(depth=\d+&)?ref=(?.*?)(&depth=\d+)?$/ ); const hostnameMatchRegex = regEx(/^(?([\w|\d]+\.)+[\w|\d]+)/); diff --git a/lib/modules/manager/terragrunt/__fixtures__/2.hcl b/lib/modules/manager/terragrunt/__fixtures__/2.hcl index 29d30085460cf2..b99906d626d704 100644 --- a/lib/modules/manager/terragrunt/__fixtures__/2.hcl +++ b/lib/modules/manager/terragrunt/__fixtures__/2.hcl @@ -33,9 +33,9 @@ terraform { source = "github.com/hashicorp/example?ref=next" } -#hostname +#IP terraform { - source = "https://104.196.242.174"example?ref=next" + source = "https://104.196.242.174/example?ref=next" } #local hostname @@ -63,7 +63,7 @@ terraform { source = "my.host.local/sources/example?ref=v1.2.1" } -#ip +#hostname terraform { source = "my.host/example?ref=next" } diff --git a/lib/modules/manager/terragrunt/__fixtures__/3.hcl b/lib/modules/manager/terragrunt/__fixtures__/3.hcl new file mode 100644 index 00000000000000..bfb076653db875 --- /dev/null +++ b/lib/modules/manager/terragrunt/__fixtures__/3.hcl @@ -0,0 +1,166 @@ +#real +terraform { + extra_arguments "common_vars" { + commands = ["plan", "apply"] + + arguments = [ + "-var-file=../../common.tfvars", + "-var-file=../region.tfvars" + ] + } + + before_hook "before_hook" { + commands = ["apply", "plan"] + execute = ["echo", "Running Terraform"] + } + + source = "github.com/myuser/myrepo//folder/modules/moduleone?ref=v0.0.9&depth=1" + + after_hook "after_hook" { + commands = ["apply", "plan"] + execute = ["echo", "Finished running Terraform"] + run_on_error = true + } +} + +#foo +terraform { + source = "github.com/hashicorp/example?ref=v1.0.0&depth=1" +} + +#bar +terraform { + source = "github.com/hashicorp/example?ref=next&depth=3" +} + +#IP +terraform { + source = "https://104.196.242.174/example?ref=next&depth=1" +} + +#local hostname +terraform { + source = "my.host.local/example?ref=v1.2.1&depth=1" +} + +#local hostname +terraform { + source = "my.host/modules/test" +} + +#local hostname +terraform { + source = "my.host/modules/test?ref=v1.2.1&depth=1" +} + +#local hostname +terraform { + source = "my.host" +} + +#local hostname +terraform { + source = "my.host.local/sources/example?ref=v1.2.1&depth=1" +} + +#hostname +terraform { + source = "my.host/example?ref=next&depth=1" +} + +#invalid +terraform { + source = "//terraform/module/test?ref=next&depth=1" +} + +#repo-with-non-semver-ref +terraform { + source = "github.com/githubuser/myrepo//terraform/modules/moduleone?ref=tfmodule_one-v0.0.9&depth=1" +} + +#repo-with-dot +terraform { + source = "github.com/hashicorp/example.2.3?ref=v1.0.0&depth=1" +} + +#repo-with-dot-and-git-suffix +terraform { + source = "github.com/hashicorp/example.2.3.git?ref=v1.0.0&depth=1" +} + +#source without pinning +terraform { + source = "hashicorp/consul/aws" +} + +# source with double-slash +terraform { + source = "github.com/tieto-cem/terraform-aws-ecs-task-definition//modules/container-definition?ref=v0.1.0&depth=1" +} + +# regular sources +terraform { + source = "github.com/tieto-cem/terraform-aws-ecs-task-definition?ref=v0.1.0&depth=1" +} + +terraform { + source = "git@github.com:hashicorp/example.git?ref=v2.0.0&depth=1" +} + +terraform { + source = "terraform-aws-modules/security-group/aws//modules/http-80" + +} + +terraform { + source = "terraform-aws-modules/security-group/aws" +} + +terraform { + source = "../../terraforms/fe" +} + +# nosource, ignored by test since it does not have source on the next line +terraform { + foo = "bar" +} + +# foobar +terraform { + source = "https://bitbucket.com/hashicorp/example?ref=v1.0.0&depth=1" +} + +# gittags +terraform { + source = "git::https://bitbucket.com/hashicorp/example?ref=v1.0.0&depth=1" +} + +# gittags_badversion +terraform { + source = "git::https://bitbucket.com/hashicorp/example?ref=next&depth=1" +} + +# gittags_subdir +terraform { + source = "git::https://bitbucket.com/hashicorp/example//subdir/test?ref=v1.0.1&depth=1" +} + +# gittags_http +terraform { + source = "git::http://bitbucket.com/hashicorp/example?ref=v1.0.2&depth=1" +} + +# gittags_ssh +terraform { + source = "git::ssh://git@bitbucket.com/hashicorp/example?ref=v1.0.3&depth=1" +} + +# invalid, ignored by test since it does not have source on the next line +terraform { +} + +# unsupported terragrunt, ignored by test since it does not have source on the next line +terraform { + name = "foo" + dummy = "true" +} diff --git a/lib/modules/manager/terragrunt/__fixtures__/4.hcl b/lib/modules/manager/terragrunt/__fixtures__/4.hcl new file mode 100644 index 00000000000000..72889fb6aed347 --- /dev/null +++ b/lib/modules/manager/terragrunt/__fixtures__/4.hcl @@ -0,0 +1,166 @@ +#real +terraform { + extra_arguments "common_vars" { + commands = ["plan", "apply"] + + arguments = [ + "-var-file=../../common.tfvars", + "-var-file=../region.tfvars" + ] + } + + before_hook "before_hook" { + commands = ["apply", "plan"] + execute = ["echo", "Running Terraform"] + } + + source = "github.com/myuser/myrepo//folder/modules/moduleone?depth=1&ref=v0.0.9" + + after_hook "after_hook" { + commands = ["apply", "plan"] + execute = ["echo", "Finished running Terraform"] + run_on_error = true + } +} + +#foo +terraform { + source = "github.com/hashicorp/example?depth=5&ref=v1.0.0" +} + +#bar +terraform { + source = "github.com/hashicorp/example?depth=1&ref=next" +} + +#IP +terraform { + source = "https://104.196.242.174/example?depth=1&ref=next" +} + +#local hostname +terraform { + source = "my.host.local/example?depth=1&ref=v1.2.1" +} + +#local hostname +terraform { + source = "my.host/modules/test" +} + +#local hostname +terraform { + source = "my.host/modules/test?depth=1&ref=v1.2.1" +} + +#local hostname +terraform { + source = "my.host" +} + +#local hostname +terraform { + source = "my.host.local/sources/example?depth=1&ref=v1.2.1" +} + +#hostname +terraform { + source = "my.host/example?depth=1&ref=next" +} + +#invalid +terraform { + source = "//terraform/module/test?depth=1&ref=next" +} + +#repo-with-non-semver-ref +terraform { + source = "github.com/githubuser/myrepo//terraform/modules/moduleone?depth=1&ref=tfmodule_one-v0.0.9" +} + +#repo-with-dot +terraform { + source = "github.com/hashicorp/example.2.3?depth=1&ref=v1.0.0" +} + +#repo-with-dot-and-git-suffix +terraform { + source = "github.com/hashicorp/example.2.3.git?depth=1&ref=v1.0.0" +} + +#source without pinning +terraform { + source = "hashicorp/consul/aws" +} + +# source with double-slash +terraform { + source = "github.com/tieto-cem/terraform-aws-ecs-task-definition//modules/container-definition?depth=1&ref=v0.1.0" +} + +# regular sources +terraform { + source = "github.com/tieto-cem/terraform-aws-ecs-task-definition?depth=1&ref=v0.1.0" +} + +terraform { + source = "git@github.com:hashicorp/example.git?depth=1&ref=v2.0.0" +} + +terraform { + source = "terraform-aws-modules/security-group/aws//modules/http-80" + +} + +terraform { + source = "terraform-aws-modules/security-group/aws" +} + +terraform { + source = "../../terraforms/fe" +} + +# nosource, ignored by test since it does not have source on the next line +terraform { + foo = "bar" +} + +# foobar +terraform { + source = "https://bitbucket.com/hashicorp/example?depth=1&ref=v1.0.0" +} + +# gittags +terraform { + source = "git::https://bitbucket.com/hashicorp/example?depth=1&ref=v1.0.0" +} + +# gittags_badversion +terraform { + source = "git::https://bitbucket.com/hashicorp/example?depth=1&ref=next" +} + +# gittags_subdir +terraform { + source = "git::https://bitbucket.com/hashicorp/example//subdir/test?depth=1&ref=v1.0.1" +} + +# gittags_http +terraform { + source = "git::http://bitbucket.com/hashicorp/example?depth=1&ref=v1.0.2" +} + +# gittags_ssh +terraform { + source = "git::ssh://git@bitbucket.com/hashicorp/example?depth=1&ref=v1.0.3" +} + +# invalid, ignored by test since it does not have source on the next line +terraform { +} + +# unsupported terragrunt, ignored by test since it does not have source on the next line +terraform { + name = "foo" + dummy = "true" +} diff --git a/lib/modules/manager/terragrunt/__snapshots__/extract.spec.ts.snap b/lib/modules/manager/terragrunt/__snapshots__/extract.spec.ts.snap deleted file mode 100644 index 84d85982b1cb2a..00000000000000 --- a/lib/modules/manager/terragrunt/__snapshots__/extract.spec.ts.snap +++ /dev/null @@ -1,171 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`modules/manager/terragrunt/extract extractPackageFile() extracts terragrunt sources 1`] = ` -{ - "deps": [ - { - "currentValue": "v0.0.9", - "datasource": "github-tags", - "depName": "github.com/myuser/myrepo", - "depType": "github", - "packageName": "myuser/myrepo", - }, - { - "currentValue": "v1.0.0", - "datasource": "github-tags", - "depName": "github.com/hashicorp/example", - "depType": "github", - "packageName": "hashicorp/example", - }, - { - "currentValue": "next", - "datasource": "github-tags", - "depName": "github.com/hashicorp/example", - "depType": "github", - "packageName": "hashicorp/example", - }, - { - "skipReason": "no-source", - }, - {}, - { - "datasource": "terraform-module", - "depName": "my.host/modules/test", - "depType": "terragrunt", - "registryUrls": [ - "https://my.host", - ], - }, - { - "datasource": "terraform-module", - "depName": "my.host/modules/test?ref=v1.2.1", - "depType": "terragrunt", - "registryUrls": [ - "https://my.host", - ], - }, - {}, - { - "datasource": "terraform-module", - "depName": "my.host.local/sources/example?ref=v1.2.1", - "depType": "terragrunt", - "registryUrls": [ - "https://my.host.local", - ], - }, - {}, - {}, - { - "currentValue": "tfmodule_one-v0.0.9", - "datasource": "github-tags", - "depName": "github.com/githubuser/myrepo", - "depType": "github", - "packageName": "githubuser/myrepo", - }, - { - "currentValue": "v1.0.0", - "datasource": "github-tags", - "depName": "github.com/hashicorp/example.2.3", - "depType": "github", - "packageName": "hashicorp/example.2.3", - }, - { - "currentValue": "v1.0.0", - "datasource": "github-tags", - "depName": "github.com/hashicorp/example.2.3", - "depType": "github", - "packageName": "hashicorp/example.2.3", - }, - { - "datasource": "terraform-module", - "depName": "hashicorp/consul/aws", - "depType": "terragrunt", - }, - { - "currentValue": "v0.1.0", - "datasource": "github-tags", - "depName": "github.com/tieto-cem/terraform-aws-ecs-task-definition", - "depType": "github", - "packageName": "tieto-cem/terraform-aws-ecs-task-definition", - }, - { - "currentValue": "v0.1.0", - "datasource": "github-tags", - "depName": "github.com/tieto-cem/terraform-aws-ecs-task-definition", - "depType": "github", - "packageName": "tieto-cem/terraform-aws-ecs-task-definition", - }, - { - "currentValue": "v2.0.0", - "datasource": "github-tags", - "depName": "github.com/hashicorp/example", - "depType": "github", - "packageName": "hashicorp/example", - }, - { - "datasource": "terraform-module", - "depName": "terraform-aws-modules/security-group/aws", - "depType": "terragrunt", - }, - { - "datasource": "terraform-module", - "depName": "terraform-aws-modules/security-group/aws", - "depType": "terragrunt", - }, - { - "skipReason": "local", - }, - { - "skipReason": "no-source", - }, - { - "currentValue": "v1.0.0", - "datasource": "git-tags", - "depName": "bitbucket.com/hashicorp/example", - "depType": "gitTags", - "packageName": "https://bitbucket.com/hashicorp/example", - }, - { - "currentValue": "v1.0.0", - "datasource": "git-tags", - "depName": "bitbucket.com/hashicorp/example", - "depType": "gitTags", - "packageName": "https://bitbucket.com/hashicorp/example", - }, - { - "currentValue": "next", - "datasource": "git-tags", - "depName": "bitbucket.com/hashicorp/example", - "depType": "gitTags", - "packageName": "https://bitbucket.com/hashicorp/example", - }, - { - "currentValue": "v1.0.1", - "datasource": "git-tags", - "depName": "bitbucket.com/hashicorp/example", - "depType": "gitTags", - "packageName": "https://bitbucket.com/hashicorp/example", - }, - { - "currentValue": "v1.0.2", - "datasource": "git-tags", - "depName": "bitbucket.com/hashicorp/example", - "depType": "gitTags", - "packageName": "http://bitbucket.com/hashicorp/example", - }, - { - "currentValue": "v1.0.3", - "datasource": "git-tags", - "depName": "bitbucket.com/hashicorp/example", - "depType": "gitTags", - "packageName": "ssh://git@bitbucket.com/hashicorp/example", - }, - { - "skipReason": "no-source", - }, - { - "skipReason": "no-source", - }, - ], -} -`; diff --git a/lib/modules/manager/terragrunt/extract.spec.ts b/lib/modules/manager/terragrunt/extract.spec.ts index 9d9a201e1e9681..d4720df6168e5a 100644 --- a/lib/modules/manager/terragrunt/extract.spec.ts +++ b/lib/modules/manager/terragrunt/extract.spec.ts @@ -8,10 +8,498 @@ describe('modules/manager/terragrunt/extract', () => { }); it('extracts terragrunt sources', () => { - const res = extractPackageFile(Fixtures?.get('2.hcl')); - expect(res).toMatchSnapshot(); + const res = extractPackageFile(Fixtures.get('2.hcl')); + expect(res).toEqual({ + deps: [ + { + currentValue: 'v0.0.9', + datasource: 'github-tags', + depName: 'github.com/myuser/myrepo', + depType: 'github', + packageName: 'myuser/myrepo', + }, + { + currentValue: 'v1.0.0', + datasource: 'github-tags', + depName: 'github.com/hashicorp/example', + depType: 'github', + packageName: 'hashicorp/example', + }, + { + currentValue: 'next', + datasource: 'github-tags', + depName: 'github.com/hashicorp/example', + depType: 'github', + packageName: 'hashicorp/example', + }, + {}, + {}, + { + datasource: 'terraform-module', + depName: 'my.host/modules/test', + depType: 'terragrunt', + registryUrls: ['https://my.host'], + }, + { + datasource: 'terraform-module', + depName: 'my.host/modules/test?ref=v1.2.1', + depType: 'terragrunt', + registryUrls: ['https://my.host'], + }, + {}, + { + datasource: 'terraform-module', + depName: 'my.host.local/sources/example?ref=v1.2.1', + depType: 'terragrunt', + registryUrls: ['https://my.host.local'], + }, + {}, + {}, + { + currentValue: 'tfmodule_one-v0.0.9', + datasource: 'github-tags', + depName: 'github.com/githubuser/myrepo', + depType: 'github', + packageName: 'githubuser/myrepo', + }, + { + currentValue: 'v1.0.0', + datasource: 'github-tags', + depName: 'github.com/hashicorp/example.2.3', + depType: 'github', + packageName: 'hashicorp/example.2.3', + }, + { + currentValue: 'v1.0.0', + datasource: 'github-tags', + depName: 'github.com/hashicorp/example.2.3', + depType: 'github', + packageName: 'hashicorp/example.2.3', + }, + { + datasource: 'terraform-module', + depName: 'hashicorp/consul/aws', + depType: 'terragrunt', + }, + { + currentValue: 'v0.1.0', + datasource: 'github-tags', + depName: 'github.com/tieto-cem/terraform-aws-ecs-task-definition', + depType: 'github', + packageName: 'tieto-cem/terraform-aws-ecs-task-definition', + }, + { + currentValue: 'v0.1.0', + datasource: 'github-tags', + depName: 'github.com/tieto-cem/terraform-aws-ecs-task-definition', + depType: 'github', + packageName: 'tieto-cem/terraform-aws-ecs-task-definition', + }, + { + currentValue: 'v2.0.0', + datasource: 'github-tags', + depName: 'github.com/hashicorp/example', + depType: 'github', + packageName: 'hashicorp/example', + }, + { + datasource: 'terraform-module', + depName: 'terraform-aws-modules/security-group/aws', + depType: 'terragrunt', + }, + { + datasource: 'terraform-module', + depName: 'terraform-aws-modules/security-group/aws', + depType: 'terragrunt', + }, + { + skipReason: 'local', + }, + { + skipReason: 'no-source', + }, + { + currentValue: 'v1.0.0', + datasource: 'git-tags', + depName: 'bitbucket.com/hashicorp/example', + depType: 'gitTags', + packageName: 'https://bitbucket.com/hashicorp/example', + }, + { + currentValue: 'v1.0.0', + datasource: 'git-tags', + depName: 'bitbucket.com/hashicorp/example', + depType: 'gitTags', + packageName: 'https://bitbucket.com/hashicorp/example', + }, + { + currentValue: 'next', + datasource: 'git-tags', + depName: 'bitbucket.com/hashicorp/example', + depType: 'gitTags', + packageName: 'https://bitbucket.com/hashicorp/example', + }, + { + currentValue: 'v1.0.1', + datasource: 'git-tags', + depName: 'bitbucket.com/hashicorp/example', + depType: 'gitTags', + packageName: 'https://bitbucket.com/hashicorp/example', + }, + { + currentValue: 'v1.0.2', + datasource: 'git-tags', + depName: 'bitbucket.com/hashicorp/example', + depType: 'gitTags', + packageName: 'http://bitbucket.com/hashicorp/example', + }, + { + currentValue: 'v1.0.3', + datasource: 'git-tags', + depName: 'bitbucket.com/hashicorp/example', + depType: 'gitTags', + packageName: 'ssh://git@bitbucket.com/hashicorp/example', + }, + { + skipReason: 'no-source', + }, + { + skipReason: 'no-source', + }, + ], + }); expect(res?.deps).toHaveLength(30); - expect(res?.deps.filter((dep) => dep.skipReason)).toHaveLength(5); + expect(res?.deps.filter((dep) => dep.skipReason)).toHaveLength(4); + }); + + it('extracts terragrunt sources with depth specified after the branch', () => { + const res = extractPackageFile(Fixtures.get('3.hcl')); + expect(res).toEqual({ + deps: [ + { + currentValue: 'v0.0.9', + datasource: 'github-tags', + depName: 'github.com/myuser/myrepo', + depType: 'github', + packageName: 'myuser/myrepo', + }, + { + currentValue: 'v1.0.0', + datasource: 'github-tags', + depName: 'github.com/hashicorp/example', + depType: 'github', + packageName: 'hashicorp/example', + }, + { + currentValue: 'next', + datasource: 'github-tags', + depName: 'github.com/hashicorp/example', + depType: 'github', + packageName: 'hashicorp/example', + }, + {}, + {}, + { + datasource: 'terraform-module', + depName: 'my.host/modules/test', + depType: 'terragrunt', + registryUrls: ['https://my.host'], + }, + { + datasource: 'terraform-module', + depName: 'my.host/modules/test?ref=v1.2.1&depth=1', + depType: 'terragrunt', + registryUrls: ['https://my.host'], + }, + {}, + { + datasource: 'terraform-module', + depName: 'my.host.local/sources/example?ref=v1.2.1&depth=1', + depType: 'terragrunt', + registryUrls: ['https://my.host.local'], + }, + {}, + {}, + { + currentValue: 'tfmodule_one-v0.0.9', + datasource: 'github-tags', + depName: 'github.com/githubuser/myrepo', + depType: 'github', + packageName: 'githubuser/myrepo', + }, + { + currentValue: 'v1.0.0', + datasource: 'github-tags', + depName: 'github.com/hashicorp/example.2.3', + depType: 'github', + packageName: 'hashicorp/example.2.3', + }, + { + currentValue: 'v1.0.0', + datasource: 'github-tags', + depName: 'github.com/hashicorp/example.2.3', + depType: 'github', + packageName: 'hashicorp/example.2.3', + }, + { + datasource: 'terraform-module', + depName: 'hashicorp/consul/aws', + depType: 'terragrunt', + }, + { + currentValue: 'v0.1.0', + datasource: 'github-tags', + depName: 'github.com/tieto-cem/terraform-aws-ecs-task-definition', + depType: 'github', + packageName: 'tieto-cem/terraform-aws-ecs-task-definition', + }, + { + currentValue: 'v0.1.0', + datasource: 'github-tags', + depName: 'github.com/tieto-cem/terraform-aws-ecs-task-definition', + depType: 'github', + packageName: 'tieto-cem/terraform-aws-ecs-task-definition', + }, + { + currentValue: 'v2.0.0', + datasource: 'github-tags', + depName: 'github.com/hashicorp/example', + depType: 'github', + packageName: 'hashicorp/example', + }, + { + datasource: 'terraform-module', + depName: 'terraform-aws-modules/security-group/aws', + depType: 'terragrunt', + }, + { + datasource: 'terraform-module', + depName: 'terraform-aws-modules/security-group/aws', + depType: 'terragrunt', + }, + { + skipReason: 'local', + }, + { + skipReason: 'no-source', + }, + { + currentValue: 'v1.0.0', + datasource: 'git-tags', + depName: 'bitbucket.com/hashicorp/example', + depType: 'gitTags', + packageName: 'https://bitbucket.com/hashicorp/example', + }, + { + currentValue: 'v1.0.0', + datasource: 'git-tags', + depName: 'bitbucket.com/hashicorp/example', + depType: 'gitTags', + packageName: 'https://bitbucket.com/hashicorp/example', + }, + { + currentValue: 'next', + datasource: 'git-tags', + depName: 'bitbucket.com/hashicorp/example', + depType: 'gitTags', + packageName: 'https://bitbucket.com/hashicorp/example', + }, + { + currentValue: 'v1.0.1', + datasource: 'git-tags', + depName: 'bitbucket.com/hashicorp/example', + depType: 'gitTags', + packageName: 'https://bitbucket.com/hashicorp/example', + }, + { + currentValue: 'v1.0.2', + datasource: 'git-tags', + depName: 'bitbucket.com/hashicorp/example', + depType: 'gitTags', + packageName: 'http://bitbucket.com/hashicorp/example', + }, + { + currentValue: 'v1.0.3', + datasource: 'git-tags', + depName: 'bitbucket.com/hashicorp/example', + depType: 'gitTags', + packageName: 'ssh://git@bitbucket.com/hashicorp/example', + }, + { + skipReason: 'no-source', + }, + { + skipReason: 'no-source', + }, + ], + }); + expect(res?.deps).toHaveLength(30); + expect(res?.deps.filter((dep) => dep.skipReason)).toHaveLength(4); + }); + + it('extracts terragrunt sources with depth specified before the branch', () => { + const res = extractPackageFile(Fixtures.get('4.hcl')); + expect(res).toEqual({ + deps: [ + { + currentValue: 'v0.0.9', + datasource: 'github-tags', + depName: 'github.com/myuser/myrepo', + depType: 'github', + packageName: 'myuser/myrepo', + }, + { + currentValue: 'v1.0.0', + datasource: 'github-tags', + depName: 'github.com/hashicorp/example', + depType: 'github', + packageName: 'hashicorp/example', + }, + { + currentValue: 'next', + datasource: 'github-tags', + depName: 'github.com/hashicorp/example', + depType: 'github', + packageName: 'hashicorp/example', + }, + {}, + {}, + { + datasource: 'terraform-module', + depName: 'my.host/modules/test', + depType: 'terragrunt', + registryUrls: ['https://my.host'], + }, + { + datasource: 'terraform-module', + depName: 'my.host/modules/test?depth=1&ref=v1.2.1', + depType: 'terragrunt', + registryUrls: ['https://my.host'], + }, + {}, + { + datasource: 'terraform-module', + depName: 'my.host.local/sources/example?depth=1&ref=v1.2.1', + depType: 'terragrunt', + registryUrls: ['https://my.host.local'], + }, + {}, + {}, + { + currentValue: 'tfmodule_one-v0.0.9', + datasource: 'github-tags', + depName: 'github.com/githubuser/myrepo', + depType: 'github', + packageName: 'githubuser/myrepo', + }, + { + currentValue: 'v1.0.0', + datasource: 'github-tags', + depName: 'github.com/hashicorp/example.2.3', + depType: 'github', + packageName: 'hashicorp/example.2.3', + }, + { + currentValue: 'v1.0.0', + datasource: 'github-tags', + depName: 'github.com/hashicorp/example.2.3', + depType: 'github', + packageName: 'hashicorp/example.2.3', + }, + { + datasource: 'terraform-module', + depName: 'hashicorp/consul/aws', + depType: 'terragrunt', + }, + { + currentValue: 'v0.1.0', + datasource: 'github-tags', + depName: 'github.com/tieto-cem/terraform-aws-ecs-task-definition', + depType: 'github', + packageName: 'tieto-cem/terraform-aws-ecs-task-definition', + }, + { + currentValue: 'v0.1.0', + datasource: 'github-tags', + depName: 'github.com/tieto-cem/terraform-aws-ecs-task-definition', + depType: 'github', + packageName: 'tieto-cem/terraform-aws-ecs-task-definition', + }, + { + currentValue: 'v2.0.0', + datasource: 'github-tags', + depName: 'github.com/hashicorp/example', + depType: 'github', + packageName: 'hashicorp/example', + }, + { + datasource: 'terraform-module', + depName: 'terraform-aws-modules/security-group/aws', + depType: 'terragrunt', + }, + { + datasource: 'terraform-module', + depName: 'terraform-aws-modules/security-group/aws', + depType: 'terragrunt', + }, + { + skipReason: 'local', + }, + { + skipReason: 'no-source', + }, + { + currentValue: 'v1.0.0', + datasource: 'git-tags', + depName: 'bitbucket.com/hashicorp/example', + depType: 'gitTags', + packageName: 'https://bitbucket.com/hashicorp/example', + }, + { + currentValue: 'v1.0.0', + datasource: 'git-tags', + depName: 'bitbucket.com/hashicorp/example', + depType: 'gitTags', + packageName: 'https://bitbucket.com/hashicorp/example', + }, + { + currentValue: 'next', + datasource: 'git-tags', + depName: 'bitbucket.com/hashicorp/example', + depType: 'gitTags', + packageName: 'https://bitbucket.com/hashicorp/example', + }, + { + currentValue: 'v1.0.1', + datasource: 'git-tags', + depName: 'bitbucket.com/hashicorp/example', + depType: 'gitTags', + packageName: 'https://bitbucket.com/hashicorp/example', + }, + { + currentValue: 'v1.0.2', + datasource: 'git-tags', + depName: 'bitbucket.com/hashicorp/example', + depType: 'gitTags', + packageName: 'http://bitbucket.com/hashicorp/example', + }, + { + currentValue: 'v1.0.3', + datasource: 'git-tags', + depName: 'bitbucket.com/hashicorp/example', + depType: 'gitTags', + packageName: 'ssh://git@bitbucket.com/hashicorp/example', + }, + { + skipReason: 'no-source', + }, + { + skipReason: 'no-source', + }, + ], + }); + expect(res?.deps).toHaveLength(30); + expect(res?.deps.filter((dep) => dep.skipReason)).toHaveLength(4); }); it('returns null if only local terragrunt deps', () => { diff --git a/lib/modules/manager/terragrunt/modules.ts b/lib/modules/manager/terragrunt/modules.ts index e4bd9901a739b9..43a0987735f3ef 100644 --- a/lib/modules/manager/terragrunt/modules.ts +++ b/lib/modules/manager/terragrunt/modules.ts @@ -8,10 +8,10 @@ import { extractTerragruntProvider } from './providers'; import type { ExtractionResult, TerraformManagerData } from './types'; export const githubRefMatchRegex = regEx( - /github\.com([/:])(?[^/]+\/[a-z0-9-_.]+).*\?ref=(?.*)$/i + /github\.com([/:])(?[^/]+\/[a-z0-9-_.]+).*\?(depth=\d+&)?ref=(?.*?)(&depth=\d+)?$/i ); export const gitTagsRefMatchRegex = regEx( - /(?:git::)?(?(?:http|https|ssh):\/\/(?:.*@)?(?.*.*\/(?.*\/.*)))\?ref=(?.*)$/ + /(?:git::)?(?(?:http|https|ssh):\/\/(?:.*@)?(?.*.*\/(?.*\/.*)))\?(depth=\d+&)?ref=(?.*?)(&depth=\d+)?$/ ); const hostnameMatchRegex = regEx(/^(?([\w|\d]+\.)+[\w|\d]+)/); diff --git a/lib/modules/manager/types.ts b/lib/modules/manager/types.ts index abd361b4b15006..c81b729d1c8470 100644 --- a/lib/modules/manager/types.ts +++ b/lib/modules/manager/types.ts @@ -33,6 +33,7 @@ export interface UpdateArtifactsConfig { isLockFileMaintenance?: boolean; constraints?: Record; composerIgnorePlatformReqs?: string[]; + goGetDirs?: string[]; currentValue?: string; postUpdateOptions?: string[]; ignorePlugins?: boolean; diff --git a/lib/modules/platform/azure/azure-helper.ts b/lib/modules/platform/azure/azure-helper.ts index 8369779fad547e..f357c3c18a648d 100644 --- a/lib/modules/platform/azure/azure-helper.ts +++ b/lib/modules/platform/azure/azure-helper.ts @@ -141,12 +141,11 @@ export async function getMergeMethod( }; const policyConfigurations = ( - await (await azureApi.policyApi()).getPolicyConfigurations(project) + await ( + await azureApi.policyApi() + ).getPolicyConfigurations(project, mergePolicyGuid) ) - .filter( - (p) => - p.settings.scope.some(isRelevantScope) && p.type?.id === mergePolicyGuid - ) + .filter((p) => p.settings.scope.some(isRelevantScope)) .map((p) => p.settings)[0]; logger.trace( diff --git a/lib/modules/platform/azure/index.spec.ts b/lib/modules/platform/azure/index.spec.ts index 31b58e79dc9945..da8a998a7b702e 100644 --- a/lib/modules/platform/azure/index.spec.ts +++ b/lib/modules/platform/azure/index.spec.ts @@ -805,7 +805,7 @@ describe('modules/platform/azure/index', () => { prTitle: 'The Title', prBody: 'Hello world', labels: ['deps', 'renovate'], - platformOptions: { azureAutoApprove: true }, + platformOptions: { autoApprove: true }, }); expect(updateFn).toHaveBeenCalled(); expect(pr).toMatchSnapshot(); @@ -1349,13 +1349,6 @@ describe('modules/platform/azure/index', () => { }); }); - describe('getVulnerabilityAlerts()', () => { - it('returns empty', async () => { - const res = await azure.getVulnerabilityAlerts(); - expect(res).toHaveLength(0); - }); - }); - describe('deleteLabel()', () => { it('Should delete a label', async () => { await initRepo({ repository: 'some/repo' }); diff --git a/lib/modules/platform/azure/index.ts b/lib/modules/platform/azure/index.ts index cd47dbadceca81..b1eb1430369d14 100644 --- a/lib/modules/platform/azure/index.ts +++ b/lib/modules/platform/azure/index.ts @@ -16,7 +16,7 @@ import { REPOSITORY_NOT_FOUND, } from '../../../constants/error-messages'; import { logger } from '../../../logger'; -import type { BranchStatus, VulnerabilityAlert } from '../../../types'; +import type { BranchStatus } from '../../../types'; import * as git from '../../../util/git'; import * as hostRules from '../../../util/host-rules'; import { regEx } from '../../../util/regex'; @@ -472,7 +472,7 @@ export async function createPr({ pr.pullRequestId! ); } - if (platformOptions?.azureAutoApprove) { + if (platformOptions?.autoApprove) { await azureApiGit.createPullRequestReviewer( { reviewerUrl: pr.createdBy!.url, @@ -909,7 +909,3 @@ export async function deleteLabel( const azureApiGit = await azureApi.gitApi(); await azureApiGit.deletePullRequestLabels(config.repoId, prNumber, label); } - -export function getVulnerabilityAlerts(): Promise { - return Promise.resolve([]); -} diff --git a/lib/modules/platform/bitbucket-server/index.spec.ts b/lib/modules/platform/bitbucket-server/index.spec.ts index 6c8965a2ab87dd..763d837ecf1220 100644 --- a/lib/modules/platform/bitbucket-server/index.spec.ts +++ b/lib/modules/platform/bitbucket-server/index.spec.ts @@ -1729,13 +1729,6 @@ Followed by some information. }); }); - describe('getVulnerabilityAlerts()', () => { - it('returns empty array', async () => { - expect.assertions(1); - expect(await bitbucket.getVulnerabilityAlerts()).toEqual([]); - }); - }); - describe('getBranchStatus()', () => { it('should be success', async () => { const scope = await initRepo(); diff --git a/lib/modules/platform/bitbucket-server/index.ts b/lib/modules/platform/bitbucket-server/index.ts index f99b960f5b2aa9..b8258e58043656 100644 --- a/lib/modules/platform/bitbucket-server/index.ts +++ b/lib/modules/platform/bitbucket-server/index.ts @@ -7,7 +7,7 @@ import { REPOSITORY_NOT_FOUND, } from '../../../constants/error-messages'; import { logger } from '../../../logger'; -import type { BranchStatus, VulnerabilityAlert } from '../../../types'; +import type { BranchStatus } from '../../../types'; import type { FileData } from '../../../types/platform/bitbucket-server'; import * as git from '../../../util/git'; import { deleteBranch } from '../../../util/git'; @@ -979,8 +979,3 @@ export function massageMarkdown(input: string): string { .replace(regEx(`\n---\n\n.*?.*?(\n|$)`), '') .replace(regEx('', 'g'), ''); } - -export function getVulnerabilityAlerts(): Promise { - logger.debug(`getVulnerabilityAlerts()`); - return Promise.resolve([]); -} diff --git a/lib/modules/platform/bitbucket/index.spec.ts b/lib/modules/platform/bitbucket/index.spec.ts index 03337462d67624..70a93df243c374 100644 --- a/lib/modules/platform/bitbucket/index.spec.ts +++ b/lib/modules/platform/bitbucket/index.spec.ts @@ -1456,12 +1456,6 @@ describe('modules/platform/bitbucket/index', () => { }); }); - describe('getVulnerabilityAlerts()', () => { - it('returns empty array', async () => { - expect(await bitbucket.getVulnerabilityAlerts()).toEqual([]); - }); - }); - describe('getJsonFile()', () => { it('returns file content', async () => { const data = { foo: 'bar' }; diff --git a/lib/modules/platform/bitbucket/index.ts b/lib/modules/platform/bitbucket/index.ts index 278d2ed0d2f581..b76e66576851c6 100644 --- a/lib/modules/platform/bitbucket/index.ts +++ b/lib/modules/platform/bitbucket/index.ts @@ -3,7 +3,7 @@ import is from '@sindresorhus/is'; import JSON5 from 'json5'; import { REPOSITORY_NOT_FOUND } from '../../../constants/error-messages'; import { logger } from '../../../logger'; -import type { BranchStatus, VulnerabilityAlert } from '../../../types'; +import type { BranchStatus } from '../../../types'; import * as git from '../../../util/git'; import * as hostRules from '../../../util/host-rules'; import { BitbucketHttp, setBaseUrl } from '../../../util/http/bitbucket'; @@ -949,7 +949,3 @@ export async function mergePr({ } return true; } - -export function getVulnerabilityAlerts(): Promise { - return Promise.resolve([]); -} diff --git a/lib/modules/platform/codecommit/codecommit-client.ts b/lib/modules/platform/codecommit/codecommit-client.ts index 38ac15f69e78eb..42a5af5d670e99 100644 --- a/lib/modules/platform/codecommit/codecommit-client.ts +++ b/lib/modules/platform/codecommit/codecommit-client.ts @@ -147,7 +147,7 @@ export async function createPrComment( export async function updatePrStatus( pullRequestId: string, - pullRequestStatus: PullRequestStatusEnum.CLOSED | PullRequestStatusEnum.OPEN + pullRequestStatus: PullRequestStatusEnum ): Promise { const input: UpdatePullRequestStatusInput = { pullRequestId, diff --git a/lib/modules/platform/codecommit/index.ts b/lib/modules/platform/codecommit/index.ts index c4a12b1db4885e..e689415cb39457 100644 --- a/lib/modules/platform/codecommit/index.ts +++ b/lib/modules/platform/codecommit/index.ts @@ -12,7 +12,7 @@ import { REPOSITORY_NOT_FOUND, } from '../../../constants/error-messages'; import { logger } from '../../../logger'; -import type { BranchStatus, PrState, VulnerabilityAlert } from '../../../types'; +import type { BranchStatus, PrState } from '../../../types'; import * as git from '../../../util/git'; import { regEx } from '../../../util/regex'; import { sanitize } from '../../../util/sanitize'; @@ -563,11 +563,6 @@ export function deleteLabel(prNumber: number, label: string): Promise { return Promise.resolve(); } -/* istanbul ignore next */ -export function getVulnerabilityAlerts(): Promise { - return Promise.resolve([]); -} - // Returns the combined status for a branch. /* istanbul ignore next */ export function getBranchStatus(branchName: string): Promise { diff --git a/lib/modules/platform/gitea/index.spec.ts b/lib/modules/platform/gitea/index.spec.ts index 5142b0d8299ff6..4b61916037cf34 100644 --- a/lib/modules/platform/gitea/index.spec.ts +++ b/lib/modules/platform/gitea/index.spec.ts @@ -1916,12 +1916,6 @@ describe('modules/platform/gitea/index', () => { }); }); - describe('getVulnerabilityAlerts', () => { - it('should return an empty list - unsupported by platform', async () => { - expect(await gitea.getVulnerabilityAlerts()).toEqual([]); - }); - }); - describe('getJsonFile()', () => { it('returns file content', async () => { const data = { foo: 'bar' }; diff --git a/lib/modules/platform/gitea/index.ts b/lib/modules/platform/gitea/index.ts index 9627e86d8cfb3c..2162e5252215dc 100644 --- a/lib/modules/platform/gitea/index.ts +++ b/lib/modules/platform/gitea/index.ts @@ -10,7 +10,7 @@ import { REPOSITORY_MIRRORED, } from '../../../constants/error-messages'; import { logger } from '../../../logger'; -import type { BranchStatus, VulnerabilityAlert } from '../../../types'; +import type { BranchStatus } from '../../../types'; import * as git from '../../../util/git'; import { setBaseUrl } from '../../../util/http/gitea'; import { sanitize } from '../../../util/sanitize'; @@ -949,10 +949,6 @@ const platform: Platform = { massageMarkdown(prBody: string): string { return smartTruncate(smartLinks(prBody), 1000000); }, - - getVulnerabilityAlerts(): Promise { - return Promise.resolve([]); - }, }; /* eslint-disable @typescript-eslint/unbound-method */ @@ -979,7 +975,6 @@ export const { getPrList, getRepoForceRebase, getRepos, - getVulnerabilityAlerts, initPlatform, initRepo, mergePr, diff --git a/lib/modules/platform/github/index.spec.ts b/lib/modules/platform/github/index.spec.ts index ca15ae314d6da8..91d35bc7177cf7 100644 --- a/lib/modules/platform/github/index.spec.ts +++ b/lib/modules/platform/github/index.spec.ts @@ -35,7 +35,6 @@ describe('modules/platform/github/index', () => { setBaseUrl(githubApiHost); - git.branchExists.mockReturnValue(true); git.isBranchBehindBase.mockResolvedValue(true); git.getBranchCommit.mockReturnValue( '0d9c7726c3d628b7e28af234595cfd20febdbf8e' @@ -861,6 +860,8 @@ describe('modules/platform/github/index', () => { updated_at: '01-09-2022', }, ]) + .head('/repos/some/repo/git/refs/heads/somebranch') + .reply(404) .post('/repos/some/repo/git/refs') .reply(201) .patch('/repos/some/repo/pulls/91') @@ -950,6 +951,8 @@ describe('modules/platform/github/index', () => { closed_at: DateTime.now().minus({ minutes: 10 }).toISO(), }, ]) + .head('/repos/some/repo/git/refs/heads/somebranch') + .reply(404) .post('/repos/some/repo/git/refs') .reply(201) .patch('/repos/some/repo/pulls/91') @@ -976,7 +979,7 @@ describe('modules/platform/github/index', () => { closed_at: DateTime.now().minus({ minutes: 10 }).toISO(), }, ]) - .post('/repos/some/repo/git/refs') + .head('/repos/some/repo/git/refs/heads/somebranch') .reply(422); await github.initRepo({ repository: 'some/repo' }); @@ -3202,7 +3205,7 @@ describe('modules/platform/github/index', () => { files, }) ); - git.fetchCommit.mockImplementation(() => Promise.resolve('0abcdef')); + git.fetchBranch.mockImplementation(() => Promise.resolve('0abcdef')); }); it('returns null if pre-commit phase has failed', async () => { @@ -3243,7 +3246,6 @@ describe('modules/platform/github/index', () => { it('commits and returns SHA string', async () => { git.pushCommitToRenovateRef.mockResolvedValueOnce(); git.listCommitTree.mockResolvedValueOnce([]); - git.branchExists.mockReturnValueOnce(false); const scope = httpMock.scope(githubApiHost); @@ -3255,6 +3257,8 @@ describe('modules/platform/github/index', () => { .reply(200, { sha: '111' }) .post('/repos/some/repo/git/commits') .reply(200, { sha: '222' }) + .head('/repos/some/repo/git/refs/heads/foo/bar') + .reply(404) .post('/repos/some/repo/git/refs') .reply(200); @@ -3270,7 +3274,6 @@ describe('modules/platform/github/index', () => { it('performs rebase', async () => { git.pushCommitToRenovateRef.mockResolvedValueOnce(); git.listCommitTree.mockResolvedValueOnce([]); - git.branchExists.mockReturnValueOnce(true); const scope = httpMock.scope(githubApiHost); @@ -3282,6 +3285,8 @@ describe('modules/platform/github/index', () => { .reply(200, { sha: '111' }) .post('/repos/some/repo/git/commits') .reply(200, { sha: '222' }) + .head('/repos/some/repo/git/refs/heads/foo/bar') + .reply(200) .patch('/repos/some/repo/git/refs/heads/foo/bar') .reply(200); diff --git a/lib/modules/platform/github/index.ts b/lib/modules/platform/github/index.ts index 7162a9749554cf..ffc5f1ab893144 100644 --- a/lib/modules/platform/github/index.ts +++ b/lib/modules/platform/github/index.ts @@ -742,6 +742,29 @@ export async function findPr({ const REOPEN_THRESHOLD_MILLIS = 1000 * 60 * 60 * 24 * 7; +async function ensureBranchSha(branchName: string, sha: string): Promise { + const refUrl = `/repos/${config.repository}/git/refs/heads/${branchName}`; + + let branchExists = false; + try { + await githubApi.head(refUrl, { useCache: false }); + branchExists = true; + } catch (err) { + if (err.statusCode !== 404) { + throw err; + } + } + + if (branchExists) { + await githubApi.patchJson(refUrl, { body: { sha, force: true } }); + return; + } + + await githubApi.postJson(`/repos/${config.repository}/git/refs`, { + body: { sha, ref: `refs/heads/${branchName}` }, + }); +} + // Returns the Pull Request for a branch. Null if not exists. export async function getBranchPr(branchName: string): Promise { logger.debug(`getBranchPr(${branchName})`); @@ -776,9 +799,7 @@ export async function getBranchPr(branchName: string): Promise { } const { sha, number } = autoclosedPr; try { - await githubApi.postJson(`repos/${config.repository}/git/refs`, { - body: { ref: `refs/heads/${branchName}`, sha }, - }); + await ensureBranchSha(branchName, sha!); logger.debug(`Recreated autoclosed branch ${branchName} with sha ${sha}`); } catch (err) { logger.debug('Could not recreate autoclosed branch - skipping reopen'); @@ -1794,21 +1815,7 @@ async function pushFiles( { body: { message, tree: treeSha, parents: [parentCommitSha] } } ); const remoteCommitSha = commitRes.body.sha; - - // Create branch if it didn't already exist, update it otherwise - if (git.branchExists(branchName)) { - // This is the equivalent of a git force push - // We are using this REST API because the GraphQL API doesn't support force push - await githubApi.patchJson( - `/repos/${config.repository}/git/refs/heads/${branchName}`, - { body: { sha: remoteCommitSha, force: true } } - ); - } else { - await githubApi.postJson(`/repos/${config.repository}/git/refs`, { - body: { ref: `refs/heads/${branchName}`, sha: remoteCommitSha }, - }); - } - + await ensureBranchSha(branchName, remoteCommitSha); return remoteCommitSha; } catch (err) { logger.debug({ branchName, err }, 'Platform-native commit: unknown error'); @@ -1836,6 +1843,6 @@ export async function commitFiles( // Replace locally created branch with the remotely created one // and return the remote commit SHA await git.resetToCommit(commitResult.parentCommitSha); - const commitSha = await git.fetchCommit(config); + const commitSha = await git.fetchBranch(branchName); return commitSha; } diff --git a/lib/modules/platform/gitlab/index.spec.ts b/lib/modules/platform/gitlab/index.spec.ts index 5990f566b0aeb2..de8b8b466c2ce0 100644 --- a/lib/modules/platform/gitlab/index.spec.ts +++ b/lib/modules/platform/gitlab/index.spec.ts @@ -2139,13 +2139,6 @@ These updates have all been created already. Click a checkbox below to force a r }); }); - describe('getVulnerabilityAlerts()', () => { - it('returns empty', async () => { - const res = await gitlab.getVulnerabilityAlerts(); - expect(res).toHaveLength(0); - }); - }); - describe('deleteLabel(issueNo, label)', () => { it('should delete the label', async () => { httpMock diff --git a/lib/modules/platform/gitlab/index.ts b/lib/modules/platform/gitlab/index.ts index fc0f7fd391aeee..24b69b9865ed25 100644 --- a/lib/modules/platform/gitlab/index.ts +++ b/lib/modules/platform/gitlab/index.ts @@ -16,7 +16,7 @@ import { TEMPORARY_ERROR, } from '../../../constants/error-messages'; import { logger } from '../../../logger'; -import type { BranchStatus, VulnerabilityAlert } from '../../../types'; +import type { BranchStatus } from '../../../types'; import * as git from '../../../util/git'; import * as hostRules from '../../../util/host-rules'; import { setBaseUrl } from '../../../util/http/gitlab'; @@ -1209,10 +1209,6 @@ export async function ensureCommentRemoval( } } -export function getVulnerabilityAlerts(): Promise { - return Promise.resolve([]); -} - export async function filterUnavailableUsers( users: string[] ): Promise { diff --git a/lib/modules/platform/types.ts b/lib/modules/platform/types.ts index 06b9fc1896db75..188e50b125c041 100644 --- a/lib/modules/platform/types.ts +++ b/lib/modules/platform/types.ts @@ -88,7 +88,7 @@ export interface Issue { title?: string; } export type PlatformPrOptions = { - azureAutoApprove?: boolean; + autoApprove?: boolean; azureWorkItemId?: number; bbUseDefaultReviewers?: boolean; gitLabIgnoreApprovals?: boolean; @@ -165,7 +165,7 @@ export interface Platform { findIssue(title: string): Promise; getIssueList(): Promise; getIssue?(number: number, useCache?: boolean): Promise; - getVulnerabilityAlerts(): Promise; + getVulnerabilityAlerts?(): Promise; getRawFile( fileName: string, repoName?: string, diff --git a/lib/modules/versioning/api.ts b/lib/modules/versioning/api.ts index 56b21ce27e5092..417c8657a7e2d1 100644 --- a/lib/modules/versioning/api.ts +++ b/lib/modules/versioning/api.ts @@ -1,5 +1,6 @@ import * as amazonMachineImage from './aws-machine-image'; import * as azureRestApi from './azure-rest-api'; +import * as bazelModule from './bazel-module'; import * as cargo from './cargo'; import * as composer from './composer'; import * as conan from './conan'; @@ -40,6 +41,7 @@ export default api; api.set(amazonMachineImage.id, amazonMachineImage.api); api.set(azureRestApi.id, azureRestApi.api); +api.set(bazelModule.id, bazelModule.api); api.set(cargo.id, cargo.api); api.set(composer.id, composer.api); api.set(conan.id, conan.api); diff --git a/lib/modules/versioning/bazel-module/bzlmod-version.spec.ts b/lib/modules/versioning/bazel-module/bzlmod-version.spec.ts new file mode 100644 index 00000000000000..a47c8062b48708 --- /dev/null +++ b/lib/modules/versioning/bazel-module/bzlmod-version.spec.ts @@ -0,0 +1,260 @@ +import { BzlmodVersion, Identifier, VersionPart } from './bzlmod-version'; + +describe('modules/versioning/bazel-module/bzlmod-version', () => { + describe('Identifier', () => { + it('when all digits', () => { + const ident = new Identifier('123'); + expect(ident.asString).toBe('123'); + expect(ident.asNumber).toBe(123); + expect(ident.isDigitsOnly).toBe(true); + }); + + it('when not all digits', () => { + const ident = new Identifier('foo123'); + expect(ident.asString).toBe('foo123'); + expect(ident.asNumber).toBe(0); + expect(ident.isDigitsOnly).toBe(false); + }); + + it.each` + a | b | exp + ${'1'} | ${'1'} | ${true} + ${'1'} | ${'2'} | ${false} + ${'foo1'} | ${'1'} | ${false} + ${'a'} | ${'a'} | ${true} + ${'a'} | ${'b'} | ${false} + `('$a equals $b', ({ a, b, exp }) => { + const aIdent = new Identifier(a); + const bIdent = new Identifier(b); + expect(aIdent.equals(bIdent)).toBe(exp); + }); + + it.each` + a | b | exp + ${'1'} | ${'1'} | ${false} + ${'1'} | ${'2'} | ${true} + ${'2'} | ${'1'} | ${false} + ${'foo1'} | ${'1'} | ${false} + ${'1'} | ${'foo1'} | ${true} + ${'a'} | ${'b'} | ${true} + ${'b'} | ${'a'} | ${false} + `('$a is isLessThan $b', ({ a, b, exp }) => { + const aIdent = new Identifier(a); + const bIdent = new Identifier(b); + expect(aIdent.isLessThan(bIdent)).toBe(exp); + }); + }); + + describe('VersionPart', () => { + it.each` + a | expLen | expStr + ${[]} | ${0} | ${''} + ${['1', new Identifier('0')]} | ${2} | ${'1.0'} + `('VersionPart.create(...$a}', ({ a, expLen, expStr }) => { + const vp = VersionPart.create(...a); + expect(vp).toHaveLength(expLen); + expect(vp.asString).toBe(expStr); + }); + + it.each` + a | exp + ${[]} | ${''} + ${['1', '2', '3']} | ${'1.2.3'} + `('.asString', ({ a, exp }) => { + const avp = VersionPart.create(...a); + expect(avp.asString).toBe(exp); + }); + + it.each` + a | exp + ${[]} | ${0} + ${['2']} | ${2} + ${['1', '2', '3']} | ${1} + `('.major', ({ a, exp }) => { + const avp = VersionPart.create(...a); + expect(avp.major).toBe(exp); + }); + + it.each` + a | exp + ${[]} | ${0} + ${['1', '2', '3']} | ${2} + `('.minor', ({ a, exp }) => { + const avp = VersionPart.create(...a); + expect(avp.minor).toBe(exp); + }); + + it.each` + a | exp + ${[]} | ${0} + ${['1', '2', '3']} | ${3} + `('.patch', ({ a, exp }) => { + const avp = VersionPart.create(...a); + expect(avp.patch).toBe(exp); + }); + + it.each` + a | b | exp + ${['1', '0']} | ${['1', '0']} | ${true} + ${['1', '0']} | ${['1', '1']} | ${false} + ${['foo1', '0']} | ${['foo1', '0']} | ${true} + `('$a equals $b', ({ a, b, exp }) => { + const avp = VersionPart.create(...a); + const bvp = VersionPart.create(...b); + expect(avp.equals(bvp)).toBe(exp); + }); + + it.each` + a | b | exp + ${['1', '0']} | ${['1', '0']} | ${false} + ${['1', '0']} | ${['1', '1']} | ${true} + ${['1', '1']} | ${['1', '0']} | ${false} + ${['a']} | ${['b']} | ${true} + ${[]} | ${['1']} | ${false} + ${['1']} | ${[]} | ${true} + ${['1', '0']} | ${['2']} | ${true} + ${['2']} | ${['1', '0']} | ${false} + ${['1', '9']} | ${['2', '0']} | ${true} + ${['2', '0']} | ${['1', '9']} | ${false} + `('$a is isLessThan $b', ({ a, b, exp }) => { + const avp = VersionPart.create(...a); + const bvp = VersionPart.create(...b); + expect(avp.isLessThan(bvp)).toBe(exp); + }); + + it.each` + a | exp + ${[]} | ${true} + ${['1']} | ${false} + ${['1', '0']} | ${false} + `('.isEmpty', ({ a, exp }) => { + const avp = VersionPart.create(...a); + expect(avp.isEmpty).toBe(exp); + }); + }); + + describe('BzlmodVersion', () => { + it.each` + v | rexp | pexp | bexp + ${'1.2.3'} | ${'1.2.3'} | ${''} | ${''} + ${''} | ${''} | ${''} | ${''} + ${'1.2.3-pre.20230417.1'} | ${'1.2.3'} | ${'pre.20230417.1'} | ${''} + ${'1.2.3+build5'} | ${'1.2.3'} | ${''} | ${'build5'} + ${'1.2.3-pre.20230417.1+build5'} | ${'1.2.3'} | ${'pre.20230417.1'} | ${'build5'} + `('constructor($v)', ({ v, rexp, pexp, bexp }) => { + const bv = new BzlmodVersion(v); + expect(bv.release.asString).toBe(rexp); + expect(bv.prerelease.asString).toBe(pexp); + expect(bv.build.asString).toBe(bexp); + }); + + // Tests replicated from + // https://cs.opensource.google/bazel/bazel/+/master:src/test/java/com/google/devtools/build/lib/bazel/bzlmod/VersionTest.java + it.each` + a + ${'-abc'} + ${'-1_2'} + ${'ßážëł'} + ${'1.0-pre?'} + ${'1.0-pre///'} + ${'1..0'} + ${'1.0-pre..erp'} + `('bad versions $a', ({ a }) => { + expect(() => { + new BzlmodVersion(a); + }).toThrow(); + }); + + it.each` + a | b | ignoreBuild | exp + ${'1.2.3'} | ${'1.2.3'} | ${undefined} | ${true} + ${'1.2.3'} | ${'1.2.4'} | ${undefined} | ${false} + ${'1.2.3'} | ${'1.2.3-pre.20230417.1'} | ${undefined} | ${false} + ${'1.2.3'} | ${'1.2.3+build5'} | ${undefined} | ${false} + ${'1.2.3'} | ${'1.2.3+build5'} | ${false} | ${false} + ${'1.2.3'} | ${'1.2.3+build5'} | ${true} | ${true} + ${'1.2.3'} | ${'1.2.3-pre.20230417.1+build5'} | ${undefined} | ${false} + ${'1.2.3-pre.20230417.1+build5'} | ${'1.2.3-pre.20230417.1+build5'} | ${undefined} | ${true} + ${'1.2.3-pre.20230417.1+build4'} | ${'1.2.3-pre.20230417.1+build5'} | ${undefined} | ${false} + ${'1.2.3'} | ${'foo1.2.3'} | ${undefined} | ${false} + ${'1.2.3'} | ${''} | ${undefined} | ${false} + ${''} | ${''} | ${undefined} | ${true} + `('$a equals $b', ({ a, b, ignoreBuild, exp }) => { + const abv = new BzlmodVersion(a); + const bbv = new BzlmodVersion(b); + expect(abv.equals(bbv, ignoreBuild)).toBe(exp); + }); + + it.each` + a | b | exp + ${'1.2.3'} | ${'1.2.3'} | ${false} + ${'1.2.3'} | ${'1.2.4'} | ${true} + ${'1.2.3'} | ${'1.2.3-pre.20230417.1'} | ${false} + ${'1.2.3-pre.20230417.1'} | ${'1.2.3'} | ${true} + ${''} | ${'1.2.3'} | ${false} + ${'1.2.3'} | ${''} | ${true} + ${''} | ${''} | ${false} + ${'1.2.3-pre.20230417.1+build5'} | ${'1.2.3-pre.20230417.1+build5'} | ${false} + ${'1.2.3-pre.20230417.1+build4'} | ${'1.2.3-pre.20230417.1+build5'} | ${false} + ${'4'} | ${'a'} | ${true} + ${'abc'} | ${'abd'} | ${true} + ${'pre'} | ${'pre.foo'} | ${true} + `('$a is isLessThan $b', ({ a, b, exp }) => { + const abv = new BzlmodVersion(a); + const bbv = new BzlmodVersion(b); + expect(abv.isLessThan(bbv)).toBe(exp); + }); + + it.each` + a | b | exp + ${'1.2.3'} | ${'1.2.3'} | ${false} + ${'1.2.3'} | ${'1.2.4'} | ${false} + ${'1.2.4'} | ${'1.2.3'} | ${true} + `('$a isGreaterThan $b', ({ a, b, exp }) => { + const abv = new BzlmodVersion(a); + const bbv = new BzlmodVersion(b); + expect(abv.isGreaterThan(bbv)).toBe(exp); + }); + + // Tests replicated from + // https://cs.opensource.google/bazel/bazel/+/master:src/test/java/com/google/devtools/build/lib/bazel/bzlmod/VersionTest.java + it.each` + a | b | exp + ${'1.2.3'} | ${'1.2.3'} | ${0} + ${'1.2.3-pre.20230417.1'} | ${'1.2.3'} | ${-1} + ${'1.2.3'} | ${'1.2.3-pre.20230417.1'} | ${1} + ${'2'} | ${'1.0'} | ${1} + ${''} | ${'1.0'} | ${1} + ${''} | ${'1.0+build'} | ${1} + ${''} | ${'1.0-pre'} | ${1} + ${''} | ${'1.0-pre+build-kek.lol'} | ${1} + ${'2.0'} | ${'1.0'} | ${1} + ${'2.0'} | ${'1.9'} | ${1} + ${'11.0'} | ${'3.0'} | ${1} + ${'1.0.1'} | ${'1.0'} | ${1} + ${'1.0.0'} | ${'1.0'} | ${1} + ${'1.0+build2'} | ${'1.0+build3'} | ${0} + ${'1.0'} | ${'1.0-pre'} | ${1} + ${'1.0'} | ${'1.0+build-notpre'} | ${0} + ${'1.0.patch.3'} | ${'1.0'} | ${1} + ${'1.0.patch.3'} | ${'1.0.patch.2'} | ${1} + ${'1.0.patch.3'} | ${'1.0.patch.10'} | ${-1} + ${'1.0.patch3'} | ${'1.0.patch10'} | ${1} + ${'4'} | ${'a'} | ${-1} + ${'abc'} | ${'abd'} | ${-1} + ${'1.0-pre'} | ${'1.0-are'} | ${1} + ${'1.0-3'} | ${'1.0-2'} | ${1} + ${'1.0-pre'} | ${'1.0-pre.foo'} | ${-1} + ${'1.0-pre.3'} | ${'1.0-pre.2'} | ${1} + ${'1.0-pre.10'} | ${'1.0-pre.2'} | ${1} + ${'1.0-pre.10a'} | ${'1.0-pre.2a'} | ${-1} + ${'1.0-pre.99'} | ${'1.0-pre.2a'} | ${-1} + ${'1.0-pre.patch.3'} | ${'1.0-pre.patch.4'} | ${-1} + ${'1.0--'} | ${'1.0----'} | ${-1} + `('defaultCompare($a, $b)', ({ a, b, exp }) => { + const abv = new BzlmodVersion(a); + const bbv = new BzlmodVersion(b); + expect(BzlmodVersion.defaultCompare(abv, bbv)).toBe(exp); + }); + }); +}); diff --git a/lib/modules/versioning/bazel-module/bzlmod-version.ts b/lib/modules/versioning/bazel-module/bzlmod-version.ts new file mode 100644 index 00000000000000..42b315ed6724ff --- /dev/null +++ b/lib/modules/versioning/bazel-module/bzlmod-version.ts @@ -0,0 +1,312 @@ +/** + * @fileoverview Contains classes that represent a Bazel module version. + */ + +/** + * Represents a single value in a VersionPart. For example, the version string + * `1.2.3` has three identifiers: `1`, `2`, `3`. + */ +export class Identifier { + /** + * Returns the identifier as a string. + */ + readonly asString: string; + + /** + * If the identifier only contains digits, this is the numeric value. + * Otherwise, it is `0`. + */ + readonly asNumber: number; + + /** + * Specifies whether the identifier only contains digits. + */ + readonly isDigitsOnly: boolean; + + /** + * Regular expression used to identify whether an identifier value only + * contains digits. + */ + static readonly digitsOnlyMatcher = /^[0-9]+$/; + + /** + * @param value The value that is parsed for the Bazel module version parts. + */ + constructor(value: string) { + if (value === '') { + throw new Error('Identifier value cannot be empty.'); + } + this.asString = value; + if (Identifier.digitsOnlyMatcher.test(value)) { + this.isDigitsOnly = true; + this.asNumber = parseInt(value); + } else { + this.isDigitsOnly = false; + this.asNumber = 0; + } + } + + /** + * Determines whether this identifier and another identifier are equal. + */ + equals(other: Identifier): boolean { + return this.asString === other.asString; + } + + /** + * Determines whether this identifier comes before the other identifier. + */ + isLessThan(other: Identifier): boolean { + // This logic mirrors the comparison logic in + // https://cs.opensource.google/bazel/bazel/+/refs/heads/master:src/main/java/com/google/devtools/build/lib/bazel/bzlmod/Version.java + // isDigitsOnly: true first + if (this.isDigitsOnly !== other.isDigitsOnly) { + return this.isDigitsOnly; + } + if (this.asNumber !== other.asNumber) { + return this.asNumber < other.asNumber; + } + return this.asString < other.asString; + } +} + +/** + * A collection of {@link Identifier} values that represent a portion of a + * Bazel module version. + */ +export class VersionPart extends Array { + /** + * Creates a {@link VersionPart} populated with the provided identifiers. + */ + static create(...items: Array): VersionPart { + const idents = items.map((item) => { + if (typeof item === 'string') { + return new Identifier(item); + } + return item; + }); + const vp = new VersionPart(); + vp.push(...idents); + return vp; + } + + /** + * The string representation of the version part. + */ + get asString(): string { + return this.map((ident) => ident.asString).join('.'); + } + + /** + * Specifies whether this contains any identifiers. + */ + get isEmpty(): boolean { + return this.length === 0; + } + + /** + * Returns the equivalent of the a Semver major value. + */ + get major(): number { + return this.length > 0 ? this[0].asNumber : 0; + } + + /** + * Returns the equivalent of the a Semver minor value. + */ + get minor(): number { + return this.length > 1 ? this[1].asNumber : 0; + } + + /** + * Returns the equivalent of the a Semver patch value. + */ + get patch(): number { + return this.length > 2 ? this[2].asNumber : 0; + } + + /** + * Determines whether this version part is equal to the other. + */ + equals(other: VersionPart): boolean { + if (this.length !== other.length) { + return false; + } + for (let i = 0; i < this.length; i++) { + const a = this[i]; + const b = other[i]; + if (!a.equals(b)) { + return false; + } + } + return true; + } + + /** + * Determines whether this version part comes before the other. + */ + isLessThan(other: VersionPart): boolean { + // This logic mirrors the comparison logic in + // https://cs.opensource.google/bazel/bazel/+/refs/heads/master:src/main/java/com/google/devtools/build/lib/bazel/bzlmod/Version.java + if (this.equals(other)) { + return false; + } + // Non-empty are first + if (this.length === 0 && other.length !== 0) { + return false; + } + if (other.length === 0 && this.length !== 0) { + return true; + } + const shortestLen = this.length < other.length ? this.length : other.length; + for (let i = 0; i < shortestLen; i++) { + const a = this[i]; + const b = other[i]; + if (!a.equals(b)) { + return a.isLessThan(b); + } + } + return this.length < other.length; + } +} + +// Represents the capture groups produced by BzlmodVersion.versionMatcher. +interface VersionRegexResult { + release: string; + prerelease: string | undefined; + build: string | undefined; +} + +/** + * Represents a version in the Bazel module system. The version format we support is + * `RELEASE[-PRERELEASE][+BUILD]`, where `RELEASE`, `PRERELEASE`, and `BUILD` are + * each a sequence of "identifiers" (defined as a non-empty sequence of ASCII alphanumerical + * characters and hyphens) separated by dots. The `RELEASE` part may not contain hyphens. + * + * Otherwise, this format is identical to SemVer, especially in terms of the comparison algorithm + * (https://semver.org/#spec-item-11). In other words, this format is intentionally looser than + * SemVer; in particular: + * + * - the "release" part isn't limited to exactly 3 segments (major, minor, patch), but can be + * fewer or more; + * - each segment in the "release" part can be identifiers instead of just numbers (so letters + * are also allowed -- although hyphens are not). + * + * Any valid SemVer version is a valid Bazel module version. Additionally, two SemVer versions + * `a` and `b` compare `a < b` iff the same holds when they're compared as Bazel * module versions. + * + * The special "empty string" version can also be used, and compares higher than everything else. + * It signifies that there is a NonRegistryOverride for a module. + */ +export class BzlmodVersion { + readonly original: string; + readonly release: VersionPart; + readonly prerelease: VersionPart; + readonly build: VersionPart; + + /** + * The regular expression that identifies a valid Bazel module version. + */ + static readonly versionMatcher = + /^(?[a-zA-Z0-9.]+)(?:-(?[a-zA-Z0-9.-]+))?(?:\+(?[a-zA-Z0-9.-]+))?$/; + + /** + * @param version The string that is parsed for the Bazel module version + * values. + */ + constructor(version: string) { + this.original = version; + if (version === '') { + this.release = VersionPart.create(); + this.prerelease = VersionPart.create(); + this.build = VersionPart.create(); + return; + } + const vparts: Partial | undefined = + BzlmodVersion.versionMatcher.exec(version)?.groups; + if (!vparts) { + throw new Error(`Invalid Bazel module version: ${version}`); + } + // The regex check above ensures that we will have a release group. + const rparts = vparts.release!.split('.'); + this.release = VersionPart.create(...rparts); + const pparts = vparts.prerelease ? vparts.prerelease.split('.') : []; + this.prerelease = VersionPart.create(...pparts); + // Do not parse the build value. Treat it as a single value. + const bparts = vparts.build ? [vparts.build] : []; + this.build = VersionPart.create(...bparts); + } + + /** + * Specifies whether this is a pre-release version. + */ + get isPrerelease(): boolean { + return !this.prerelease.isEmpty; + } + + // Comparison + + /** + * Determines whether this Bazel module version is equal to the other. + * + * @param other The other version for the comparison. + * @param ignoreBuild? If specified, determines whether the build value is + * evaluated as part of the equality check. This is useful when + * determining precedence. + */ + equals(other: BzlmodVersion, ignoreBuild?: boolean): boolean { + if (ignoreBuild) { + return ( + this.release.equals(other.release) && + this.prerelease.equals(other.prerelease) + ); + } + return ( + this.release.equals(other.release) && + this.prerelease.equals(other.prerelease) && + this.build.equals(other.build) + ); + } + + /** + * Determines whether this Bazel module version comes before the other. + */ + isLessThan(other: BzlmodVersion): boolean { + // This logic mirrors the comparison logic in + // https://cs.opensource.google/bazel/bazel/+/refs/heads/master:src/main/java/com/google/devtools/build/lib/bazel/bzlmod/Version.java + if (this.release.isLessThan(other.release)) { + return true; + } + // Ensure that prerelease is listed before regular releases + if (this.isPrerelease && !other.isPrerelease) { + return true; + } + if (this.prerelease.isLessThan(other.prerelease)) { + return true; + } + // NOTE: We ignore the build value for precedence comparison per the Semver spec. + // https://semver.org/#spec-item-10 + return false; + } + + /** + * Determines whether this Bazel module version comes after the other. + */ + isGreaterThan(other: BzlmodVersion): boolean { + return BzlmodVersion.defaultCompare(this, other) === 1; + } + + /** + * Evaluates two Bazel module versions and returns a value specifying whether + * a < b (-1), a == b (0), or a > b (1). + */ + static defaultCompare(a: BzlmodVersion, b: BzlmodVersion): number { + if (a.equals(b, true)) { + return 0; + } + if (a.isLessThan(b)) { + return -1; + } + return 1; + } +} diff --git a/lib/modules/versioning/bazel-module/index.spec.ts b/lib/modules/versioning/bazel-module/index.spec.ts new file mode 100644 index 00000000000000..21bbd8763e185e --- /dev/null +++ b/lib/modules/versioning/bazel-module/index.spec.ts @@ -0,0 +1,108 @@ +import type { NewValueConfig } from '../types'; +import { api as bzlmod } from '.'; + +describe('modules/versioning/bazel-module/index', () => { + it('getMajor()', () => { + expect(bzlmod.getMajor('1.2.3')).toBe(1); + }); + + it('getMinor()', () => { + expect(bzlmod.getMinor('1.2.3')).toBe(2); + }); + + it('getPatch()', () => { + expect(bzlmod.getPatch('1.2.3')).toBe(3); + }); + + it.each` + a | b | exp + ${'1.2.3'} | ${'1.2.3'} | ${true} + ${'1.2.3'} | ${'1.2.4'} | ${false} + `('equals($a, $b)', ({ a, b, exp }) => { + expect(bzlmod.equals(a, b)).toBe(exp); + // The following are currently aliases for equals. + expect(bzlmod.matches(a, b)).toBe(exp); + }); + + it.each` + a | b | exp + ${'1.2.4'} | ${'1.2.3'} | ${true} + ${'1.2.3'} | ${'1.2.3'} | ${false} + ${'1.2.2'} | ${'1.2.3'} | ${false} + `('isGreaterThan($a, $b)', ({ a, b, exp }) => { + expect(bzlmod.isGreaterThan(a, b)).toBe(exp); + }); + + it.each` + a | b | exp + ${'1.2.4'} | ${'1.2.3'} | ${false} + ${'1.2.3'} | ${'1.2.3'} | ${false} + ${'1.2.2'} | ${'1.2.3'} | ${true} + `('isLessThanRange($a, $b)', ({ a, b, exp }) => { + expect(bzlmod.isLessThanRange!(a, b)).toBe(exp); + }); + + it.each` + vers | rng | exp + ${[]} | ${'1.2.3'} | ${null} + ${['1.1.0', '1.2.0', '2.0.0']} | ${'1.2.0'} | ${'1.2.0'} + ${['1.1.0', '1.2.0', '2.0.0']} | ${'1.2.3'} | ${null} + `('getSatisfyingVersion(vers, rng)', ({ vers, rng, exp }) => { + expect(bzlmod.getSatisfyingVersion(vers, rng)).toBe(exp); + // The following are currently aliases for getSatisfyingVersion. + expect(bzlmod.minSatisfyingVersion(vers, rng)).toBe(exp); + }); + + it.each` + a | b | exp + ${'1.2.3'} | ${'1.2.3'} | ${0} + ${'1.2.3'} | ${'1.2.4'} | ${-1} + ${'1.2.4'} | ${'1.2.3'} | ${1} + `('sortVersions($a, $b)', ({ a, b, exp }) => { + expect(bzlmod.sortVersions(a, b)).toBe(exp); + }); + + it.each` + a | exp + ${'1.2.3'} | ${true} + ${'1.2.3-pre'} | ${false} + ${'1.2.3+build'} | ${true} + `('isStable', ({ a, exp }) => { + expect(bzlmod.isStable(a)).toBe(exp); + }); + + it.each` + a | exp + ${'1.2.3'} | ${true} + ${'1.2.3-pre'} | ${true} + ${'1.2.3+build'} | ${true} + ${'1.2.3-pre+build'} | ${true} + ${'1.2.3-pre+build'} | ${true} + ${'-abc'} | ${false} + ${'1_2'} | ${false} + `('isValid($a)', ({ a, exp }) => { + expect(bzlmod.isValid(a)).toBe(exp); + // The following are currently aliases for isValid. + expect(bzlmod.isCompatible(a)).toBe(exp); + expect(bzlmod.isSingleVersion(a)).toBe(exp); + }); + + it.each` + a | exp + ${'1.2.3'} | ${true} + ${'-abc'} | ${false} + ${null} | ${false} + ${undefined} | ${false} + `('isVersion($a)', ({ a, exp }) => { + expect(bzlmod.isVersion(a)).toBe(exp); + }); + + it('getNewValue()', () => { + const config: NewValueConfig = { + currentValue: '1.0.0', + rangeStrategy: 'auto', + newVersion: '1.0.1', + }; + expect(bzlmod.getNewValue(config)).toBe('1.0.1'); + }); +}); diff --git a/lib/modules/versioning/bazel-module/index.ts b/lib/modules/versioning/bazel-module/index.ts new file mode 100644 index 00000000000000..fbb7febbaa43ec --- /dev/null +++ b/lib/modules/versioning/bazel-module/index.ts @@ -0,0 +1,174 @@ +import type { NewValueConfig, VersioningApi } from '../types'; +import { BzlmodVersion } from './bzlmod-version'; + +export const id = 'bazel-module'; +export const displayName = 'Bazel Module'; +export const urls = ['https://bazel.build/external/module']; +export const supportsRanges = false; + +function getBzlmodVersion(version: string): BzlmodVersion { + return new BzlmodVersion(version); +} + +function getMajor(version: string): null | number { + return getBzlmodVersion(version).release.major; +} + +function getMinor(version: string): null | number { + return getBzlmodVersion(version).release.minor; +} + +function getPatch(version: string): null | number { + return getBzlmodVersion(version).release.patch; +} + +/** + * Check whether `version` and `other` are logically equivalent, even if + * they're not the exact same string. + * + * For example, with Semver the build metadata should be ignored when comparing. + */ +function equals(version: string, other: string): boolean { + const abv = new BzlmodVersion(version); + const bbv = new BzlmodVersion(other); + return abv.equals(bbv); +} + +/** + * Check whether `version` is "greater" than the `other` version. + */ +function isGreaterThan(version: string, other: string): boolean { + const abv = new BzlmodVersion(version); + const bbv = new BzlmodVersion(other); + return abv.isGreaterThan(bbv); +} + +/** + * Check whether the `version` is "less" than all the versions possible in + * the `range`. + */ +function isLessThanRange(version: string, range: string): boolean { + const abv = new BzlmodVersion(version); + const bbv = new BzlmodVersion(range); + return abv.isLessThan(bbv); +} + +/** + * Select the highest version from `versions` that is within the given + * `range` constraint, or return `null` if there is no matching version. + */ +function getSatisfyingVersion( + versions: string[], + range: string +): string | null { + const target = new BzlmodVersion(range); + const result = versions.find((ver) => { + const bv = new BzlmodVersion(ver); + return target.equals(bv); + }); + return result ? range : null; +} + +/** + * Select the lowest version from `versions` that is within the given + * `range` constraint, or return `null` if there is no matching version. + */ +function minSatisfyingVersion( + versions: string[], + range: string +): string | null { + return getSatisfyingVersion(versions, range); +} + +/** + * Calculate a new version constraint based on the current constraint, the + * `rangeStrategy` option, and the current and new version. + */ +function getNewValue({ newVersion }: NewValueConfig): string { + return newVersion; +} + +/** + * Compare two versions. Return `0` if `v1 == v2`, or `1` if `v1` is + * greater, or `-1` if `v2` is greater. + */ +function sortVersions(version: string, other: string): number { + const abv = new BzlmodVersion(version); + const bbv = new BzlmodVersion(other); + return BzlmodVersion.defaultCompare(abv, bbv); +} + +/** + * Check whether the `version` satisfies the `range` constraint. + */ +function matches(version: string, range: string): boolean { + return equals(version, range); +} + +/** + * Check whether the `version` is compatible with the `current` value + * constraint. + */ +function isCompatible(version: string, current?: string): boolean { + return isValid(version); +} + +/** + * Check whether the `version` constraint is not a range, i.e. it only allows a + * single specific version. + */ +function isSingleVersion(version: string): boolean { + return isValid(version); +} + +/** + * Check whether the `version` is considered to be "stable". + * + * Example: in SemVer the version must not have a pre-release marker. + */ +function isStable(version: string): boolean { + const abv = new BzlmodVersion(version); + return !abv.isPrerelease; +} + +/** + * Check whether the `input` is a valid version or a valid version range constraint. + */ +function isValid(input: string): boolean { + try { + new BzlmodVersion(input); + } catch (e) { + return false; + } + return true; +} + +/** + * Check whether the `input` is a valid version string. + */ +function isVersion(input: string | undefined | null): boolean { + if (input === undefined || input === null) { + return false; + } + return isValid(input); +} + +export const api: VersioningApi = { + equals, + getMajor, + getMinor, + getPatch, + isCompatible, + isGreaterThan, + isLessThanRange, + isSingleVersion, + isStable, + isValid, + isVersion, + matches, + getSatisfyingVersion, + minSatisfyingVersion, + getNewValue, + sortVersions, +}; +export default api; diff --git a/lib/modules/versioning/composer/index.spec.ts b/lib/modules/versioning/composer/index.spec.ts index f5ad722ef60478..63eaed7e24706d 100644 --- a/lib/modules/versioning/composer/index.spec.ts +++ b/lib/modules/versioning/composer/index.spec.ts @@ -84,8 +84,9 @@ describe('modules/versioning/composer/index', () => { test.each` versions | range | expected + ${['0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0']} | ${'~6'} | ${null} ${['0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0']} | ${'~4'} | ${'4.2.0'} - ${['v0.4.0', 'v0.5.0', 'v4.0.0', 'v4.2.0', 'v5.0.0']} | ${'~4'} | ${'4.2.0'} + ${['v0.4.0', 'v0.5.0', 'v4.0.0', 'v4.2.0', 'v5.0.0']} | ${'~4'} | ${'v4.2.0'} ${['0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0']} | ${'~0.4'} | ${'0.5.0'} ${['0.4.0', '0.5.0', '4.0.0-beta1', '4.0.0-beta2', '4.2.0-beta1', '4.2.0-beta2', '5.0.0']} | ${'~4@beta'} | ${'4.0.0-beta2'} `( @@ -97,8 +98,9 @@ describe('modules/versioning/composer/index', () => { test.each` versions | range | expected + ${['0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0']} | ${'~6'} | ${null} ${['0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0']} | ${'~4'} | ${'4.0.0'} - ${['v0.4.0', 'v0.5.0', 'v4.0.0', 'v4.2.0', 'v5.0.0']} | ${'~4'} | ${'4.0.0'} + ${['v0.4.0', 'v0.5.0', 'v4.0.0', 'v4.2.0', 'v5.0.0']} | ${'~4'} | ${'v4.0.0'} ${['0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0']} | ${'~0.4'} | ${'0.4.0'} ${['0.4.0', '0.5.0', '4.0.0-beta1', '4.0.0', '4.2.0-beta1', '4.2.0-beta2', '5.0.0']} | ${'~4@beta'} | ${'4.0.0-beta1'} `( @@ -195,8 +197,8 @@ describe('modules/versioning/composer/index', () => { ); test.each` - versions | expected - ${['1.2.3-beta', '2.0.1', '1.3.4', '1.2.3']} | ${['1.2.3-beta', '1.2.3', '1.3.4', '2.0.1']} + versions | expected + ${['1.2.3-beta', '1.0.0-alpha24', '2.0.1', '1.3.4', '1.0.0-alpha9', '1.2.3']} | ${['1.0.0-alpha9', '1.0.0-alpha24', '1.2.3-beta', '1.2.3', '1.3.4', '2.0.1']} `('$versions -> sortVersions -> $expected ', ({ versions, expected }) => { expect(versions.sort(semver.sortVersions)).toEqual(expected); }); diff --git a/lib/modules/versioning/composer/index.ts b/lib/modules/versioning/composer/index.ts index 1c1db9884b2d42..7fc94cd290cc9c 100644 --- a/lib/modules/versioning/composer/index.ts +++ b/lib/modules/versioning/composer/index.ts @@ -93,6 +93,7 @@ function composer2npm(input: string): string { return output + stability; }) + .map((part) => part.replace(/([a-z])([0-9])/gi, '$1.$2')) .join(' || '); } @@ -147,20 +148,26 @@ function getSatisfyingVersion( versions: string[], range: string ): string | null { - return npm.getSatisfyingVersion( - versions.map(composer2npm), - composer2npm(range) - ); + const npmVersions = versions.map(composer2npm); + const npmVersion = npm.getSatisfyingVersion(npmVersions, composer2npm(range)); + if (!npmVersion) { + return null; + } + // get index of npmVersion in npmVersions + return versions[npmVersions.indexOf(npmVersion)] ?? npmVersion; } function minSatisfyingVersion( versions: string[], range: string ): string | null { - return npm.minSatisfyingVersion( - versions.map(composer2npm), - composer2npm(range) - ); + const npmVersions = versions.map(composer2npm); + const npmVersion = npm.minSatisfyingVersion(npmVersions, composer2npm(range)); + if (!npmVersion) { + return null; + } + // get index of npmVersion in npmVersions + return versions[npmVersions.indexOf(npmVersion)] ?? npmVersion; } function subset(subRange: string, superRange: string): boolean | undefined { diff --git a/lib/modules/versioning/hashicorp/convertor.spec.ts b/lib/modules/versioning/hashicorp/convertor.spec.ts index c46be23ef5427e..943fe457e8df8e 100644 --- a/lib/modules/versioning/hashicorp/convertor.spec.ts +++ b/lib/modules/versioning/hashicorp/convertor.spec.ts @@ -3,6 +3,7 @@ import { hashicorp2npm, npm2hashicorp } from './convertor'; describe('modules/versioning/hashicorp/convertor', () => { test.each` hashicorp | npm + ${''} | ${''} ${'4.2.0'} | ${'4.2.0'} ${'4.2.0-alpha'} | ${'4.2.0-alpha'} ${'~> 4.0'} | ${'^4.0'} diff --git a/lib/modules/versioning/hashicorp/convertor.ts b/lib/modules/versioning/hashicorp/convertor.ts index ffff6416d779a1..e558e0f7e57700 100644 --- a/lib/modules/versioning/hashicorp/convertor.ts +++ b/lib/modules/versioning/hashicorp/convertor.ts @@ -10,6 +10,9 @@ import { regEx } from '../../../util/regex'; * are made */ export function hashicorp2npm(input: string): string { + if (!input) { + return input; + } return input .split(',') .map((single) => { @@ -62,6 +65,9 @@ export function hashicorp2npm(input: string): string { * It cannot handle `*`, `1.x.x`, range with `-`, `||` */ export function npm2hashicorp(input: string): string { + if (!input) { + return input; + } return input .split(' ') .map((single) => { diff --git a/lib/modules/versioning/ivy/index.ts b/lib/modules/versioning/ivy/index.ts index d8999f85ced7fc..79ff4641c11f70 100644 --- a/lib/modules/versioning/ivy/index.ts +++ b/lib/modules/versioning/ivy/index.ts @@ -42,13 +42,27 @@ function isValid(str: string): boolean { if (!str) { return false; } - return maven.isVersion(str) || !!parseDynamicRevision(str); + + if (LATEST_REGEX.test(str)) { + return true; + } + + return isVersion(str) || !!parseDynamicRevision(str); } function isVersion(str: string): boolean { - if (!str || LATEST_REGEX.test(str)) { + if (!str) { return false; } + + if (LATEST_REGEX.test(str)) { + return false; + } + + if (str.includes('+')) { + return false; + } + return maven.isVersion(str); } diff --git a/lib/modules/versioning/maven/compare.spec.ts b/lib/modules/versioning/maven/compare.spec.ts index 55b0af3d2b4587..61bcc1aaed34c2 100644 --- a/lib/modules/versioning/maven/compare.spec.ts +++ b/lib/modules/versioning/maven/compare.spec.ts @@ -187,6 +187,7 @@ describe('modules/versioning/maven/compare', () => { ${'1-0.alpha'} | ${'1-0.beta'} ${'1_5ea'} | ${'1_c3b'} ${'1_c3b'} | ${'2'} + ${'17.0.5'} | ${'17.0.5+8'} `('$x < $y', ({ x, y }) => { expect(compare(x, y)).toBe(-1); expect(compare(y, x)).toBe(1); diff --git a/lib/modules/versioning/maven/compare.ts b/lib/modules/versioning/maven/compare.ts index e65c1f2de2446f..f186d0fbfac286 100644 --- a/lib/modules/versioning/maven/compare.ts +++ b/lib/modules/versioning/maven/compare.ts @@ -44,7 +44,7 @@ function isDigit(char: string): boolean { } function isLetter(char: string): boolean { - return regEx(/^[a-z_]$/i).test(char); + return regEx(/^[a-z_+]$/i).test(char); } function isTransition(prevChar: string, nextChar: string): boolean { @@ -281,7 +281,7 @@ function isVersion(version: unknown): version is string { if (!version || typeof version !== 'string') { return false; } - if (!regEx(/^[a-z_0-9.-]+$/i).test(version)) { + if (!regEx(/^[-.a-z_+0-9]+$/i).test(version)) { return false; } if (regEx(/^[.-]/).test(version)) { diff --git a/lib/modules/versioning/maven/index.spec.ts b/lib/modules/versioning/maven/index.spec.ts index 1089a0c4aea73e..d52110c92440a3 100644 --- a/lib/modules/versioning/maven/index.spec.ts +++ b/lib/modules/versioning/maven/index.spec.ts @@ -11,6 +11,7 @@ describe('modules/versioning/maven/index', () => { test.each` version | expected ${'1.0.0'} | ${true} + ${'17.0.5+8'} | ${true} ${'[1.12.6,1.18.6]'} | ${true} ${undefined} | ${false} `('isValid("$version") === $expected', ({ version, expected }) => { diff --git a/lib/modules/versioning/maven/readme.md b/lib/modules/versioning/maven/readme.md index 4512769a5d7baf..d014af85a55f5a 100644 --- a/lib/modules/versioning/maven/readme.md +++ b/lib/modules/versioning/maven/readme.md @@ -1,4 +1,5 @@ -Maven versioning is similar to SemVer but also very different in places. It's specified by Maven itself. +Maven versioning is similar to SemVer but also very different in places. +It's specified by Maven itself. Ranges are supported using Maven's special syntax. @@ -13,5 +14,3 @@ Display parameters as parsed by Maven (in canonical form) and comparison result: 3.2.4-SNAPSHOT < 3.2.4.0 3. 3.2.4.0 == 3.2.4 ``` - -Also, take a look at [maven-cmp](https://github.com/zharinov/maven-cmp) utility. diff --git a/lib/modules/versioning/regex/index.spec.ts b/lib/modules/versioning/regex/index.spec.ts index e8dd5e3dfab6c9..e9070d7de7fc1c 100644 --- a/lib/modules/versioning/regex/index.spec.ts +++ b/lib/modules/versioning/regex/index.spec.ts @@ -1,9 +1,9 @@ -import { VersioningApi, get } from '..'; +import { get } from '..'; import { CONFIG_VALIDATION } from '../../../constants/error-messages'; describe('modules/versioning/regex/index', () => { describe('regex versioning', () => { - const regex: VersioningApi = get( + const regex = get( 'regex:^(?\\d+)\\.(?\\d+)\\.(?\\d+)(?[^.-]+)?(?:-(?.*))?$' ); @@ -11,6 +11,16 @@ describe('modules/versioning/regex/index', () => { expect(() => get('regex:not a regex')).toThrow(); }); + it('works without config', () => { + const re = get('regex'); + expect(re.isValid('alpine')).toBeFalse(); + }); + + it('works with missing version', () => { + const re = get('regex:^(?\\d+)?(?.+)'); + expect(re.isValid('alpine')).toBeTrue(); + }); + describe('throws', () => { for (const re of [ '^(?\\d+)(', @@ -43,7 +53,7 @@ describe('modules/versioning/regex/index', () => { ${'1.2.aardvark-foo'} | ${false} ${'1.2a2.3'} | ${false} `('isValid("$version") === $expected', ({ version, expected }) => { - expect(!!regex.isValid(version)).toBe(expected); + expect(regex.isValid(version)).toBe(expected); }); test.each` @@ -342,9 +352,9 @@ describe('modules/versioning/regex/index', () => { ); }); - describe('Supported 4th number as build', () => { + describe('Supported 4th number as build and 5th as revision', () => { const re = get( - 'regex:^(?\\d+)\\.(?\\d+)\\.(?\\d+)(:?-(?.*-r)(?\\d+))?$' + 'regex:^(?\\d+)\\.(?\\d+)\\.(?\\d+)(:?-(?.+)(?\\d+)-r(?\\d+))?$' ); test.each` diff --git a/lib/modules/versioning/regex/index.ts b/lib/modules/versioning/regex/index.ts index c77ee139a83c90..a11369635d4817 100644 --- a/lib/modules/versioning/regex/index.ts +++ b/lib/modules/versioning/regex/index.ts @@ -71,7 +71,8 @@ export class RegExpVersioningApi extends GenericVersioningApi { return null; } - const { major, minor, patch, build, prerelease, compatibility } = groups; + const { major, minor, patch, build, revision, prerelease, compatibility } = + groups; const release = [ typeof major === 'undefined' ? 0 : Number.parseInt(major, 10), typeof minor === 'undefined' ? 0 : Number.parseInt(minor, 10), @@ -80,6 +81,9 @@ export class RegExpVersioningApi extends GenericVersioningApi { if (build) { release.push(Number.parseInt(build, 10)); + if (revision) { + release.push(Number.parseInt(revision, 10)); + } } return { diff --git a/lib/modules/versioning/regex/readme.md b/lib/modules/versioning/regex/readme.md index cabd8e88b08db6..bb2310082ed612 100644 --- a/lib/modules/versioning/regex/readme.md +++ b/lib/modules/versioning/regex/readme.md @@ -5,6 +5,7 @@ The valid capture groups for `regex` versioning are: - `major`, `minor`, and `patch`: at least one of these must be provided. When determining whether a package has updates, these values will be compared in the standard semantic versioning fashion. If any of these fields are omitted, they will be treated as if they were `0` -- in this way, you can describe versioning schemes with up to three incrementing values. - `build`: this capture group can be used after you've already used the `major`, `minor` and `patch` capture groups and need a fourth version part. `build` updates are handled like `patch` updates. +- `revision`: this capture group can be used after you've already used the `build` capture groups and need a fifth version part. `revision` updates are handled like `patch` updates. - `prerelease`: this value, if captured, will mark a given release as a prerelease (e.g. unstable). If this value is captured and you have configured `"ignoreUnstable": true`, the given release will be skipped. - `compatibility`: this value defines the "build compatibility" of a given dependency. A proposed Renovate update will never change the specified compatibility value. For example, if you are pinning to `1.2.3-linux` (and `linux` is captured as the compatibility value), Renovate will not update you to `1.2.4-osx`. @@ -37,7 +38,7 @@ Here is another example, this time for handling `python` Docker images, which us } ``` -Here is another example, this time for handling Bitnami Docker images, which use build indicators as well as version suffixes for compatibility: +Here is another example, this time for handling Bitnami Docker images, which use `build` and `revision` indicators as well as version suffixes for compatibility: ```json { @@ -45,7 +46,7 @@ Here is another example, this time for handling Bitnami Docker images, which use { "matchDatasources": ["docker"], "matchPackagePrefixes": ["bitnami/"], - "versioning": "regex:^(?\\d+)\\.(?\\d+)\\.(?\\d+)(:?-(?.*-r)(?\\d+))?$" + "versioning": "regex:^(?\\d+)\\.(?\\d+)\\.(?\\d+)(?:-(?.+)(?\\d+)-r(?\\d+))?$" } ] } diff --git a/lib/types/host-rules.ts b/lib/types/host-rules.ts index d5b23a80ac246b..ac02a813c38a0b 100644 --- a/lib/types/host-rules.ts +++ b/lib/types/host-rules.ts @@ -14,6 +14,7 @@ export interface HostRuleSearchResult { dnsCache?: boolean; keepalive?: boolean; + artifactAuth?: string[] | null; } export interface HostRule extends HostRuleSearchResult { diff --git a/lib/util/cache/repository/types.ts b/lib/util/cache/repository/types.ts index 6f5cbfe32601da..3146e6e06385c4 100644 --- a/lib/util/cache/repository/types.ts +++ b/lib/util/cache/repository/types.ts @@ -26,12 +26,6 @@ export interface BranchUpgradeCache { sourceUrl?: string; } -export interface OnboardingBranchCache { - onboardingBranch: string; - defaultBranchSha: string; - onboardingBranchSha: string; -} - export interface PrCache { fingerprint: string; /** @@ -106,7 +100,6 @@ export interface RepoCacheData { github?: Record; }; prComments?: Record>; - onboardingBranchCache?: OnboardingBranchCache; } export interface RepoCache { diff --git a/lib/util/date.spec.ts b/lib/util/date.spec.ts index 87d3742ac28923..df5012031209a4 100644 --- a/lib/util/date.spec.ts +++ b/lib/util/date.spec.ts @@ -1,37 +1,52 @@ -import { getElapsedDays, getElapsedHours, getElapsedMinutes } from './date'; - -const ONE_MINUTE_MS = 60 * 1000; -const ONE_HOUR_MS = 60 * ONE_MINUTE_MS; -const ONE_DAY_MS = 24 * ONE_HOUR_MS; +import { DateTime } from 'luxon'; +import { + getElapsedDays, + getElapsedHours, + getElapsedMinutes, + getElapsedMs, +} from './date'; describe('util/date', () => { - const Jan1 = new Date(new Date().getFullYear(), 0, 1); + const t0 = DateTime.fromISO('2020-10-10'); + + beforeAll(() => { + jest.useFakeTimers(); + }); + + beforeEach(() => { + jest.setSystemTime(t0.toMillis()); + }); - it('returns elapsed days', () => { - const elapsedDays = Math.floor( - (new Date().getTime() - new Date(Jan1).getTime()) / ONE_DAY_MS - ); - expect(getElapsedDays(Jan1.toDateString())).toBe(elapsedDays); + describe('getElapsedDays', () => { + it('returns elapsed days', () => { + const t = t0.minus({ days: 42 }); + expect(getElapsedDays(t.toISO()!)).toBe(42); + }); }); - it('returns elapsed minutes', () => { - const elapsedMinutes = Math.floor( - (new Date().getTime() - new Date(Jan1).getTime()) / ONE_MINUTE_MS - ); - expect(getElapsedMinutes(new Date(Jan1))).toBe(elapsedMinutes); + describe('getElapsedMinutes', () => { + it('returns elapsed minutes', () => { + const t = t0.minus({ minutes: 42 }); + expect(getElapsedMinutes(t.toJSDate())).toBe(42); + }); }); describe('getElapsedHours', () => { it('returns elapsed hours', () => { - const elapsedHours = Math.floor( - (new Date().getTime() - new Date(Jan1).getTime()) / ONE_HOUR_MS - ); - expect(getElapsedHours(Jan1.toISOString())).toBe(elapsedHours); // ISOstring - expect(getElapsedHours(Jan1)).toBe(elapsedHours); // JS Date + const t = t0.minus({ hours: 42 }); + expect(getElapsedHours(t.toISO()!)).toBe(42); // ISOstring + expect(getElapsedHours(t.toJSDate())).toBe(42); // JS Date }); it('returns zero when date passed is invalid', () => { expect(getElapsedHours(new Date('invalid_date_string'))).toBe(0); }); }); + + describe('getElapsedMs', () => { + it('returns elapsed time in milliseconds', () => { + const t = t0.minus({ milliseconds: 42 }); + expect(getElapsedMs(t.toISO()!)).toBe(42); + }); + }); }); diff --git a/lib/util/date.ts b/lib/util/date.ts index 53d7877da52dc5..61fbe64b5c8f40 100644 --- a/lib/util/date.ts +++ b/lib/util/date.ts @@ -26,3 +26,7 @@ export function getElapsedHours(date: Date | string): number { const diff = DateTime.now().diff(pastDate, 'hours'); return Math.floor(diff.hours); } + +export function getElapsedMs(timestamp: string): number { + return new Date().getTime() - new Date(timestamp).getTime(); +} diff --git a/lib/util/exec/containerbase.ts b/lib/util/exec/containerbase.ts index ed55be68f8879c..bcb21adab9dee1 100644 --- a/lib/util/exec/containerbase.ts +++ b/lib/util/exec/containerbase.ts @@ -5,6 +5,8 @@ import { logger } from '../../logger'; import { getPkgReleases } from '../../modules/datasource'; import * as allVersioning from '../../modules/versioning'; import { id as composerVersioningId } from '../../modules/versioning/composer'; +import { id as gradleVersioningId } from '../../modules/versioning/gradle'; +import { id as mavenVersioningId } from '../../modules/versioning/maven'; import { id as nodeVersioningId } from '../../modules/versioning/node'; import { id as npmVersioningId } from '../../modules/versioning/npm'; import { id as pep440VersioningId } from '../../modules/versioning/pep440'; @@ -60,6 +62,16 @@ const allToolConfig: Record = { packageName: 'golang', versioning: npmVersioningId, }, + gradle: { + datasource: 'gradle-version', + packageName: 'gradle', + versioning: gradleVersioningId, + }, + hashin: { + datasource: 'pypi', + packageName: 'hashin', + versioning: pep440VersioningId, + }, helm: { datasource: 'github-releases', packageName: 'helm/helm', @@ -75,6 +87,12 @@ const allToolConfig: Record = { packageName: 'java', versioning: npmVersioningId, }, + /* not used in Renovate */ + 'java-maven': { + datasource: 'java-version', + packageName: 'java', + versioning: mavenVersioningId, + }, jb: { datasource: 'github-releases', packageName: 'jsonnet-bundler/jsonnet-bundler', @@ -91,13 +109,18 @@ const allToolConfig: Record = { packageName: 'lerna', versioning: npmVersioningId, }, + maven: { + datasource: 'maven', + packageName: 'org.apache.maven:maven', + versioning: mavenVersioningId, + }, nix: { datasource: 'github-tags', packageName: 'NixOS/nix', versioning: semverVersioningId, }, node: { - datasource: 'node', + datasource: 'node-version', packageName: 'node', versioning: nodeVersioningId, }, @@ -112,6 +135,16 @@ const allToolConfig: Record = { packageName: 'containerbase/php-prebuild', versioning: composerVersioningId, }, + 'pip-tools': { + datasource: 'pypi', + packageName: 'pip-tools', + versioning: pep440VersioningId, + }, + pipenv: { + datasource: 'pypi', + packageName: 'pipenv', + versioning: pep440VersioningId, + }, pnpm: { datasource: 'npm', packageName: 'pnpm', @@ -219,7 +252,10 @@ export async function resolveConstraint( return constraint; } } else { - logger.warn({ toolName, constraint }, 'Invalid tool constraint'); + logger.warn( + { toolName, constraint, versioning: toolConfig.versioning }, + 'Invalid tool constraint' + ); constraint = undefined; } } diff --git a/lib/util/fs/index.spec.ts b/lib/util/fs/index.spec.ts index 2e0af88fe02919..e97ebf1a41257b 100644 --- a/lib/util/fs/index.spec.ts +++ b/lib/util/fs/index.spec.ts @@ -17,6 +17,7 @@ import { getLocalFiles, getParentDir, getSiblingFileName, + isValidLocalPath, listCacheDir, localPathExists, localPathIsFile, @@ -205,7 +206,17 @@ describe('util/fs/index', () => { }); it('returns false', async () => { - expect(await localPathExists('file.txt')).toBe(false); + expect(await localPathExists('file.txt')).toBeFalse(); + }); + }); + + describe('isLocalPath', () => { + it('returns true for valid local path', () => { + expect(isValidLocalPath('./foo/...')).toBeTrue(); + }); + + it('returns false', () => { + expect(isValidLocalPath('/file.txt')).toBeFalse(); }); }); diff --git a/lib/util/fs/index.ts b/lib/util/fs/index.ts index 7b76b61db8b688..5493a6397f8493 100644 --- a/lib/util/fs/index.ts +++ b/lib/util/fs/index.ts @@ -6,7 +6,7 @@ import fs from 'fs-extra'; import upath from 'upath'; import { GlobalConfig } from '../../config/global'; import { logger } from '../../logger'; -import { ensureCachePath, ensureLocalPath } from './util'; +import { ensureCachePath, ensureLocalPath, isValidPath } from './util'; export const pipeline = util.promisify(stream.pipeline); @@ -120,6 +120,15 @@ export async function localPathExists(pathName: string): Promise { } } +/** + * Validate local path without throwing. + * @param path Path to check + * @returns `true` if given `path` is a valid local path, otherwise `false`. + */ +export function isValidLocalPath(path: string): boolean { + return isValidPath(path, 'localDir'); +} + /** * Tries to find `otherFileName` in the directory where * `existingFileNameWithPath` is, then in its parent directory, then in the diff --git a/lib/util/fs/util.spec.ts b/lib/util/fs/util.spec.ts index f62fff16254565..345acf38c21adc 100644 --- a/lib/util/fs/util.spec.ts +++ b/lib/util/fs/util.spec.ts @@ -1,7 +1,7 @@ import upath from 'upath'; import { GlobalConfig } from '../../config/global'; import { FILE_ACCESS_VIOLATION_ERROR } from '../../constants/error-messages'; -import { ensureCachePath, ensureLocalPath } from './util'; +import { ensureCachePath, ensureLocalPath, isValidPath } from './util'; describe('util/fs/util', () => { const localDir = upath.resolve('/foo'); @@ -45,7 +45,36 @@ describe('util/fs/util', () => { ${'/bar/../foo'} ${'/bar/../../etc/passwd'} ${'/baz'} + ${'/baz"'} `(`ensureCachePath('$path', '${cacheDir}') - throws`, ({ path }) => { expect(() => ensureCachePath(path)).toThrow(FILE_ACCESS_VIOLATION_ERROR); }); + + it.each` + value | expected + ${'.'} | ${true} + ${'./...'} | ${true} + ${'foo'} | ${true} + ${'foo/bar'} | ${true} + ${'./foo/bar'} | ${true} + ${'./foo/bar/...'} | ${true} + ${'..'} | ${false} + ${'....'} | ${true} + ${'./foo/..'} | ${true} + ${'./foo/..../bar'} | ${true} + ${'./..'} | ${false} + ${'\\foo'} | ${false} + ${"foo'"} | ${false} + ${'fo"o'} | ${false} + ${'fo&o'} | ${false} + ${'f;oo'} | ${true} + ${'f o o'} | ${true} + ${'/'} | ${false} + ${'/foo'} | ${false} + ${'&&'} | ${false} + ${';'} | ${true} + ${'./[foo]/bar'} | ${true} + `('isValidPath($value) == $expected', ({ value, expected }) => { + expect(isValidPath(value, 'cacheDir')).toBe(expected); + }); }); diff --git a/lib/util/fs/util.ts b/lib/util/fs/util.ts index 323e0257ffd51f..d43d6e27b6f27c 100644 --- a/lib/util/fs/util.ts +++ b/lib/util/fs/util.ts @@ -3,8 +3,12 @@ import { GlobalConfig } from '../../config/global'; import { FILE_ACCESS_VIOLATION_ERROR } from '../../constants/error-messages'; import { logger } from '../../logger'; +// http://www.mtu.edu/umc/services/digital/writing/characters-avoid/ +// We allow spaces, but not newlines +const restricted = /[#%&<>*?\b\n\r\0!'"|‘“^`]/; + function assertBaseDir(path: string, baseDir: string): void { - if (!path.startsWith(upath.resolve(baseDir))) { + if (!path.startsWith(baseDir)) { logger.debug( { path, baseDir }, 'Preventing access to file outside the base directory' @@ -14,6 +18,11 @@ function assertBaseDir(path: string, baseDir: string): void { } function ensurePath(path: string, key: 'localDir' | 'cacheDir'): string { + if (restricted.test(path)) { + logger.debug({ path }, 'Preventing access to path with illegal characters'); + throw new Error(FILE_ACCESS_VIOLATION_ERROR); + } + const baseDir = upath.resolve(GlobalConfig.get(key)!); const fullPath = upath.resolve( upath.isAbsolute(path) ? path : upath.join(baseDir, path) @@ -29,3 +38,19 @@ export function ensureLocalPath(path: string): string { export function ensureCachePath(path: string): string { return ensurePath(path, 'cacheDir'); } + +export function isValidPath( + path: string, + key: 'localDir' | 'cacheDir' +): boolean { + if (restricted.test(path)) { + return false; + } + + const baseDir = upath.resolve(GlobalConfig.get(key)!); + const fullPath = upath.resolve( + upath.isAbsolute(path) ? path : upath.join(baseDir, path) + ); + + return fullPath.startsWith(baseDir); +} diff --git a/lib/util/git/error.ts b/lib/util/git/error.ts index 19b8ab6a528103..b006e1f1425bee 100644 --- a/lib/util/git/error.ts +++ b/lib/util/git/error.ts @@ -73,9 +73,9 @@ export function checkForPlatformFailure(err: Error): Error | null { // istanbul ignore next export function handleCommitError( - files: FileChange[], + err: Error, branchName: string, - err: Error + files?: FileChange[] ): null { checkForPlatformFailure(err); if (err.message.includes(`'refs/heads/renovate' exists`)) { diff --git a/lib/util/git/index.spec.ts b/lib/util/git/index.spec.ts index 1f205f85bd4893..1551fdca230c63 100644 --- a/lib/util/git/index.spec.ts +++ b/lib/util/git/index.spec.ts @@ -500,7 +500,7 @@ describe('util/git/index', () => { message: 'Update something', }; const commitSha = await git.commitFiles(commitConfig); - const remoteSha = await git.fetchCommit(commitConfig); + const remoteSha = await git.fetchBranch(commitConfig.branchName); expect(commitSha).toEqual(remoteSha); }); diff --git a/lib/util/git/index.ts b/lib/util/git/index.ts index 2df34dfdcd43b9..806bda394b9889 100644 --- a/lib/util/git/index.ts +++ b/lib/util/git/index.ts @@ -1024,7 +1024,7 @@ export async function prepareCommit({ return result; } catch (err) /* istanbul ignore next */ { - return handleCommitError(files, branchName, err); + return handleCommitError(err, branchName, files); } } @@ -1053,15 +1053,14 @@ export async function pushCommit({ incLimitedValue('Commits'); result = true; } catch (err) /* istanbul ignore next */ { - handleCommitError(files, sourceRef, err); + handleCommitError(err, sourceRef, files); } return result; } -export async function fetchCommit({ - branchName, - files, -}: CommitFilesConfig): Promise { +export async function fetchBranch( + branchName: string +): Promise { await syncGit(); logger.debug(`Fetching branch ${branchName}`); try { @@ -1072,7 +1071,7 @@ export async function fetchCommit({ config.branchIsModified[branchName] = false; return commit; } catch (err) /* istanbul ignore next */ { - return handleCommitError(files, branchName, err); + return handleCommitError(err, branchName); } } diff --git a/lib/util/github/graphql/cache-strategies/abstract-cache-strategy.ts b/lib/util/github/graphql/cache-strategies/abstract-cache-strategy.ts index 461b8f7b3eee15..ed23730c885e24 100644 --- a/lib/util/github/graphql/cache-strategies/abstract-cache-strategy.ts +++ b/lib/util/github/graphql/cache-strategies/abstract-cache-strategy.ts @@ -23,7 +23,7 @@ export abstract class AbstractGithubGraphqlCacheStrategy< /** * The time which is used during single cache access cycle. */ - protected readonly now = DateTime.now(); + protected readonly now = DateTime.now().toUTC(); /** * Set of all versions which were reconciled @@ -73,14 +73,14 @@ export abstract class AbstractGithubGraphqlCacheStrategy< const storedData = await this.load(); if (storedData) { const cacheTTLDuration = { - days: AbstractGithubGraphqlCacheStrategy.cacheTTLDays, + hours: AbstractGithubGraphqlCacheStrategy.cacheTTLDays * 24, }; if (!isDateExpired(this.now, storedData.createdAt, cacheTTLDuration)) { result = storedData; } } - this.createdAt = DateTime.fromISO(result.createdAt); + this.createdAt = DateTime.fromISO(result.createdAt).toUTC(); this.items = result.items; return this.items; } @@ -91,7 +91,7 @@ export abstract class AbstractGithubGraphqlCacheStrategy< */ private isStabilized(item: GithubItem): boolean { const unstableDuration = { - days: AbstractGithubGraphqlCacheStrategy.cacheTTLDays, + hours: AbstractGithubGraphqlCacheStrategy.cacheTTLDays * 24, }; return isDateExpired(this.now, item.releaseTimestamp, unstableDuration); } diff --git a/lib/util/github/graphql/cache-strategies/memory-cache-strategy.spec.ts b/lib/util/github/graphql/cache-strategies/memory-cache-strategy.spec.ts index 6c7bc66c7f4fe6..88849193a12b66 100644 --- a/lib/util/github/graphql/cache-strategies/memory-cache-strategy.spec.ts +++ b/lib/util/github/graphql/cache-strategies/memory-cache-strategy.spec.ts @@ -4,7 +4,25 @@ import { clone } from '../../../clone'; import type { GithubDatasourceItem, GithubGraphqlCacheRecord } from '../types'; import { GithubGraphqlMemoryCacheStrategy } from './memory-cache-strategy'; -const isoTs = (t: string) => DateTime.fromJSDate(new Date(t)).toISO()!; +// const isoTs = (t: string) => DateTime.fromJSDate(new Date(t)).toISO()!; + +const hourMinRe = /T\d{2}:\d{2}$/; +const hourMinSecRe = /T\d{2}:\d{2}:\d{2}$/; +const hourMinSecMillisRe = /T\d{2}:\d{2}:\d{2}\.\d\d\d$/; + +const isoTs = (t: string) => { + let iso = t.replace(' ', 'T'); + if (hourMinSecMillisRe.test(iso)) { + iso = iso + 'Z'; + } else if (hourMinSecRe.test(iso)) { + iso = iso + '.000Z'; + } else if (hourMinRe.test(iso)) { + iso = iso + ':00.000Z'; + } else { + throw new Error('Unrecognized date-time string. ' + t); + } + return iso; +}; const mockTime = (input: string): void => { const now = DateTime.fromISO(isoTs(input)).valueOf(); diff --git a/lib/util/github/graphql/cache-strategies/package-cache-strategy.spec.ts b/lib/util/github/graphql/cache-strategies/package-cache-strategy.spec.ts index 1ee0c3f9369044..80c02add16a5b3 100644 --- a/lib/util/github/graphql/cache-strategies/package-cache-strategy.spec.ts +++ b/lib/util/github/graphql/cache-strategies/package-cache-strategy.spec.ts @@ -4,7 +4,7 @@ import { clone } from '../../../clone'; import type { GithubDatasourceItem, GithubGraphqlCacheRecord } from '../types'; import { GithubGraphqlPackageCacheStrategy } from './package-cache-strategy'; -const isoTs = (t: string) => DateTime.fromJSDate(new Date(t)).toISO()!; +const isoTs = (t: string) => t.replace(' ', 'T') + ':00.000Z'; const mockTime = (input: string): void => { const now = DateTime.fromISO(isoTs(input)).valueOf(); diff --git a/lib/util/github/graphql/cache-strategies/package-cache-strategy.ts b/lib/util/github/graphql/cache-strategies/package-cache-strategy.ts index 6459f170c43d29..8e9f6f25e97439 100644 --- a/lib/util/github/graphql/cache-strategies/package-cache-strategy.ts +++ b/lib/util/github/graphql/cache-strategies/package-cache-strategy.ts @@ -16,11 +16,13 @@ export class GithubGraphqlPackageCacheStrategy< cacheRecord: GithubGraphqlCacheRecord ): Promise { if (this.hasUpdatedItems) { - const expiry = this.createdAt.plus({ - // Not using 'days' as it does not handle adjustments for Daylight Saving time. - // The offset in the resulting DateTime object does not match that of the expiry or this.now. - hours: AbstractGithubGraphqlCacheStrategy.cacheTTLDays * 24, - }); + const expiry = this.createdAt + .plus({ + // Not using 'days' as it does not handle adjustments for Daylight Saving time. + // The offset in the resulting DateTime object does not match that of the expiry or this.now. + hours: AbstractGithubGraphqlCacheStrategy.cacheTTLDays * 24, + }) + .toUTC(); const ttlMinutes = expiry.diff(this.now, ['minutes']).as('minutes'); if (ttlMinutes && ttlMinutes > 0) { await packageCache.set( diff --git a/lib/util/github/graphql/util.ts b/lib/util/github/graphql/util.ts index d595c39de488e2..1ae3214b418916 100644 --- a/lib/util/github/graphql/util.ts +++ b/lib/util/github/graphql/util.ts @@ -20,6 +20,6 @@ export function isDateExpired( initialTimestamp: string, duration: DurationLikeObject ): boolean { - const expiryTime = DateTime.fromISO(initialTimestamp).plus(duration); + const expiryTime = DateTime.fromISO(initialTimestamp).plus(duration).toUTC(); return currentTime >= expiryTime; } diff --git a/lib/util/pretty-time.spec.ts b/lib/util/pretty-time.spec.ts index a9f291e467a9c6..266089e7e03c29 100644 --- a/lib/util/pretty-time.spec.ts +++ b/lib/util/pretty-time.spec.ts @@ -15,6 +15,8 @@ describe('util/pretty-time', () => { ${'1h 1 m 1s'} | ${1 * 60 * 60 * 1000 + 1 * 60 * 1000 + 1000} ${'1hour 1 min 1s'} | ${1 * 60 * 60 * 1000 + 1 * 60 * 1000 + 1000} ${'1h 1m 1s 1ms'} | ${1 * 60 * 60 * 1000 + 1 * 60 * 1000 + 1000 + 1} + ${'1d2h3m'} | ${24 * 60 * 60 * 1000 + 2 * 60 * 60 * 1000 + 3 * 60 * 1000} + ${'1 day'} | ${24 * 60 * 60 * 1000} ${'3 days'} | ${3 * 24 * 60 * 60 * 1000} ${'1 week'} | ${7 * 24 * 60 * 60 * 1000} ${'1 month'} | ${30 * 24 * 60 * 60 * 1000} diff --git a/lib/util/schema-utils.spec.ts b/lib/util/schema-utils.spec.ts index f8ae991b26b53a..a10869342d0523 100644 --- a/lib/util/schema-utils.spec.ts +++ b/lib/util/schema-utils.spec.ts @@ -1,155 +1,222 @@ import { z } from 'zod'; -import { - looseArray, - looseRecord, - looseValue, - parseJson, - safeParseJson, -} from './schema-utils'; +import { Json, Json5, LooseArray, LooseRecord } from './schema-utils'; describe('util/schema-utils', () => { - describe('looseArray', () => { + describe('LooseArray', () => { it('parses array', () => { - const s = looseArray(z.string()); + const s = LooseArray(z.string()); expect(s.parse(['foo', 'bar'])).toEqual(['foo', 'bar']); }); - it('handles non-array', () => { - const s = looseArray(z.string()); - expect(s.parse({ foo: 'bar' })).toEqual([]); - }); - it('drops wrong items', () => { - const s = looseArray(z.string()); + const s = LooseArray(z.string()); expect(s.parse(['foo', 123, null, undefined, []])).toEqual(['foo']); }); it('runs callback for wrong elements', () => { - let called = false; - const s = looseArray(z.string(), () => { - called = true; + let err: z.ZodError | undefined = undefined; + const Schema = LooseArray(z.string(), { + onError: ({ error }) => { + err = error; + }, }); - expect(s.parse(['foo', 123, 'bar'])).toEqual(['foo', 'bar']); - expect(called).toBeTrue(); - }); - it('runs callback for non-array', () => { - let called = false; - const s = looseArray(z.string(), () => { - called = true; + const res = Schema.parse(['foo', 123, 'bar']); + + expect(res).toEqual(['foo', 'bar']); + expect(err).toMatchObject({ + issues: [ + { + message: 'Expected string, received number', + code: 'invalid_type', + expected: 'string', + received: 'number', + path: [1], + }, + ], }); - expect(s.parse('foobar')).toEqual([]); - expect(called).toBeTrue(); }); }); - describe('looseRecord', () => { + describe('LooseRecord', () => { it('parses record', () => { - const s = looseRecord(z.string()); + const s = LooseRecord(z.string()); expect(s.parse({ foo: 'bar' })).toEqual({ foo: 'bar' }); }); - it('handles non-record', () => { - const s = looseRecord(z.string()); - expect(s.parse(['foo', 'bar'])).toEqual({}); - }); - it('drops wrong items', () => { - const s = looseRecord(z.string()); + const s = LooseRecord(z.string()); expect(s.parse({ foo: 'foo', bar: 123 })).toEqual({ foo: 'foo' }); }); it('runs callback for wrong elements', () => { - let called = false; - const s = looseRecord(z.string(), () => { - called = true; - }); - expect(s.parse({ foo: 'foo', bar: 123 })).toEqual({ foo: 'foo' }); - expect(called).toBeTrue(); - }); + let err: z.ZodError | undefined = undefined; + const Schema = LooseRecord( + z.object({ foo: z.object({ bar: z.string() }) }), + { + onError: ({ error }) => { + err = error; + }, + } + ); - it('runs callback for non-record', () => { - let called = false; - const s = looseRecord(z.string(), () => { - called = true; + const res = Schema.parse({ + aaa: { foo: { bar: 42 } }, + bbb: { foo: { baz: 'asdf' } }, + ccc: { foo: { bar: 'baz' } }, }); - expect(s.parse('foobar')).toEqual({}); - expect(called).toBeTrue(); - }); - }); - describe('looseValue', () => { - it('parses value', () => { - const s = looseValue(z.string()); - expect(s.parse('foobar')).toBe('foobar'); - }); - - it('falls back to null wrong value', () => { - const s = looseValue(z.string()); - expect(s.parse(123)).toBeNull(); - }); - - it('runs callback for wrong elements', () => { - let called = false; - const s = looseValue(z.string(), () => { - called = true; + expect(res).toEqual({ ccc: { foo: { bar: 'baz' } } }); + expect(err).toMatchObject({ + issues: [ + { + message: 'Expected string, received number', + code: 'invalid_type', + expected: 'string', + received: 'number', + path: ['aaa', 'foo', 'bar'], + }, + { + message: 'Required', + code: 'invalid_type', + expected: 'string', + received: 'undefined', + path: ['bbb', 'foo', 'bar'], + }, + ], }); - expect(s.parse(123)).toBeNull(); - expect(called).toBeTrue(); }); }); - describe('parseJson', () => { + describe('Json', () => { it('parses json', () => { - const res = parseJson('{"foo": "bar"}', z.object({ foo: z.string() })); - expect(res).toEqual({ foo: 'bar' }); - }); + const Schema = Json.pipe(z.object({ foo: z.literal('bar') })); + + expect(Schema.parse('{"foo": "bar"}')).toEqual({ foo: 'bar' }); + + expect(Schema.safeParse(42)).toMatchObject({ + error: { + issues: [ + { + message: 'Expected string, received number', + code: 'invalid_type', + expected: 'string', + received: 'number', + path: [], + }, + ], + }, + success: false, + }); - it('throws on invalid json', () => { - expect(() => - parseJson('{"foo": "bar"', z.object({ foo: z.string() })) - ).toThrow(SyntaxError); - }); + expect(Schema.safeParse('{"foo": "foo"}')).toMatchObject({ + error: { + issues: [ + { + message: 'Invalid literal value, expected "bar"', + code: 'invalid_literal', + expected: 'bar', + received: 'foo', + path: ['foo'], + }, + ], + }, + success: false, + }); - it('throws on invalid schema', () => { - expect(() => - parseJson('{"foo": "bar"}', z.object({ foo: z.number() })) - ).toThrow(z.ZodError); - }); - }); + expect(Schema.safeParse('["foo", "bar"]')).toMatchObject({ + error: { + issues: [ + { + message: 'Expected object, received array', + code: 'invalid_type', + expected: 'object', + received: 'array', + path: [], + }, + ], + }, + success: false, + }); - describe('safeParseJson', () => { - it('parses json', () => { - const res = safeParseJson( - '{"foo": "bar"}', - z.object({ foo: z.string() }) - ); - expect(res).toEqual({ foo: 'bar' }); + expect(Schema.safeParse('{{{}}}')).toMatchObject({ + error: { + issues: [ + { + message: 'Invalid JSON', + code: 'custom', + path: [], + }, + ], + }, + success: false, + }); }); + }); - it('returns null on invalid json', () => { - const res = safeParseJson('{"foo": "bar"', z.object({ foo: z.string() })); - expect(res).toBeNull(); - }); + describe('Json5', () => { + it('parses JSON5', () => { + const Schema = Json5.pipe(z.object({ foo: z.literal('bar') })); + + expect(Schema.parse('{"foo": "bar"}')).toEqual({ foo: 'bar' }); + + expect(Schema.safeParse(42)).toMatchObject({ + error: { + issues: [ + { + message: 'Expected string, received number', + code: 'invalid_type', + expected: 'string', + received: 'number', + path: [], + }, + ], + }, + success: false, + }); - it('returns null on invalid schema', () => { - const res = safeParseJson( - '{"foo": "bar"}', - z.object({ foo: z.number() }) - ); - expect(res).toBeNull(); - }); + expect(Schema.safeParse('{"foo": "foo"}')).toMatchObject({ + error: { + issues: [ + { + message: 'Invalid literal value, expected "bar"', + code: 'invalid_literal', + expected: 'bar', + received: 'foo', + path: ['foo'], + }, + ], + }, + success: false, + }); - it('runs callback on invalid json', () => { - const callback = jest.fn(); - safeParseJson('{"foo": "bar"', z.object({ foo: z.string() }), callback); - expect(callback).toHaveBeenCalledWith(expect.any(SyntaxError)); - }); + expect(Schema.safeParse('["foo", "bar"]')).toMatchObject({ + error: { + issues: [ + { + message: 'Expected object, received array', + code: 'invalid_type', + expected: 'object', + received: 'array', + path: [], + }, + ], + }, + success: false, + }); - it('runs callback on invalid schema', () => { - const callback = jest.fn(); - safeParseJson('{"foo": "bar"}', z.object({ foo: z.number() }), callback); - expect(callback).toHaveBeenCalledWith(expect.any(z.ZodError)); + expect(Schema.safeParse('{{{}}}')).toMatchObject({ + error: { + issues: [ + { + message: 'Invalid JSON5', + code: 'custom', + path: [], + }, + ], + }, + success: false, + }); }); }); }); diff --git a/lib/util/schema-utils.ts b/lib/util/schema-utils.ts index d8996cb2a9e7ff..752ab2effe3454 100644 --- a/lib/util/schema-utils.ts +++ b/lib/util/schema-utils.ts @@ -1,116 +1,146 @@ +import JSON5 from 'json5'; +import type { JsonValue } from 'type-fest'; import { z } from 'zod'; -export function looseArray( - schema: T, - catchCallback?: () => void -): z.ZodEffects< - z.ZodCatch>, 'many'>>, - z.TypeOf[], - unknown -> { - type Elem = z.infer; +interface ErrorContext { + error: z.ZodError; + input: T; +} - const nullableSchema = schema.nullable().catch( - catchCallback - ? () => { - catchCallback(); - return null; +interface LooseOpts { + onError?: (err: ErrorContext) => void; +} + +/** + * Works like `z.array()`, but drops wrong elements instead of invalidating the whole array. + * + * **Important**: non-array inputs are still invalid. + * Use `LooseArray(...).catch([])` to handle it. + * + * @param Elem Schema for array elements + * @param onError Callback for errors + * @returns Schema for array + */ +export function LooseArray( + Elem: Schema, + { onError }: LooseOpts = {} +): z.ZodEffects, z.TypeOf[], any[]> { + if (!onError) { + // Avoid error-related computations inside the loop + return z.array(z.any()).transform((input) => { + const output: z.infer[] = []; + for (const x of input) { + const parsed = Elem.safeParse(x); + if (parsed.success) { + output.push(parsed.data); } - : null - ); + } + return output; + }); + } - const arrayOfNullables = z.array(nullableSchema); + return z.array(z.any()).transform((input) => { + const output: z.infer[] = []; + const issues: z.ZodIssue[] = []; - const arrayWithFallback = catchCallback - ? arrayOfNullables.catch(() => { - catchCallback(); - return []; - }) - : arrayOfNullables.catch([]); + for (let idx = 0; idx < input.length; idx += 1) { + const x = input[idx]; + const parsed = Elem.safeParse(x); - const filteredArray = arrayWithFallback.transform((xs) => - xs.filter((x): x is Elem => x !== null) - ); + if (parsed.success) { + output.push(parsed.data); + continue; + } + + for (const issue of parsed.error.issues) { + issue.path.unshift(idx); + issues.push(issue); + } + } - return filteredArray; + if (issues.length) { + const error = new z.ZodError(issues); + onError({ error, input }); + } + + return output; + }); } -export function looseRecord( - schema: T, - catchCallback?: () => void +/** + * Works like `z.record()`, but drops wrong elements instead of invalidating the whole record. + * + * **Important**: non-record inputs other are still invalid. + * Use `LooseRecord(...).catch({})` to handle it. + * + * @param Elem Schema for record values + * @param onError Callback for errors + * @returns Schema for record + */ +export function LooseRecord( + Elem: Schema, + { onError }: LooseOpts> = {} ): z.ZodEffects< - z.ZodCatch>>>, - Record>, - unknown + z.ZodRecord, + Record>, + Record > { - type Elem = z.infer; - - const nullableSchema = schema.nullable().catch( - catchCallback - ? () => { - catchCallback(); - return null; - } - : null - ); - - const recordOfNullables = z.record(nullableSchema); - - const recordWithFallback = catchCallback - ? recordOfNullables.catch(() => { - catchCallback(); - return {}; - }) - : recordOfNullables.catch({}); - - const filteredRecord = recordWithFallback.transform( - (rec): Record => { - for (const key of Object.keys(rec)) { - if (rec[key] === null) { - delete rec[key]; + if (!onError) { + // Avoid error-related computations inside the loop + return z.record(z.any()).transform((input) => { + const output: Record> = {}; + for (const [key, val] of Object.entries(input)) { + const parsed = Elem.safeParse(val); + if (parsed.success) { + output[key] = parsed.data; } } - return rec; + return output; + }); + } + + return z.record(z.any()).transform((input) => { + const output: Record> = {}; + const issues: z.ZodIssue[] = []; + + for (const [key, val] of Object.entries(input)) { + const parsed = Elem.safeParse(val); + + if (parsed.success) { + output[key] = parsed.data; + continue; + } + + for (const issue of parsed.error.issues) { + issue.path.unshift(key); + issues.push(issue); + } } - ); - return filteredRecord; -} + if (issues.length) { + const error = new z.ZodError(issues); + onError({ error, input }); + } -export function looseValue( - schema: z.ZodType, - catchCallback?: () => void -): z.ZodCatch>> { - const nullableSchema = schema.nullable(); - const schemaWithFallback = catchCallback - ? nullableSchema.catch(() => { - catchCallback(); - return null; - }) - : nullableSchema.catch(null); - return schemaWithFallback; + return output; + }); } -export function parseJson< - T = unknown, - Schema extends z.ZodType = z.ZodType ->(input: string, schema: Schema): z.infer { - const parsed = JSON.parse(input); - return schema.parse(parsed); -} +export const Json = z.string().transform((str, ctx): JsonValue => { + try { + return JSON.parse(str); + } catch (e) { + ctx.addIssue({ code: 'custom', message: 'Invalid JSON' }); + return z.NEVER; + } +}); +type Json = z.infer; -export function safeParseJson< - T = unknown, - Schema extends z.ZodType = z.ZodType ->( - input: string, - schema: Schema, - catchCallback?: (e: SyntaxError | z.ZodError) => void -): z.infer | null { +export const Json5 = z.string().transform((str, ctx): JsonValue => { try { - return parseJson(input, schema); - } catch (err) { - catchCallback?.(err); - return null; + return JSON5.parse(str); + } catch (e) { + ctx.addIssue({ code: 'custom', message: 'Invalid JSON5' }); + return z.NEVER; } -} +}); diff --git a/lib/workers/repository/init/__snapshots__/vulnerability.spec.ts.snap b/lib/workers/repository/init/__snapshots__/vulnerability.spec.ts.snap index 990d099897ce2e..e731e34f30e745 100644 --- a/lib/workers/repository/init/__snapshots__/vulnerability.spec.ts.snap +++ b/lib/workers/repository/init/__snapshots__/vulnerability.spec.ts.snap @@ -21,10 +21,10 @@ exports[`workers/repository/init/vulnerability detectVulnerabilityAlerts() retur "commitMessageSuffix": "[SECURITY]", "dependencyDashboardApproval": false, "groupName": null, + "minimumReleaseAge": null, "prCreation": "immediate", "rangeStrategy": "update-lockfile", "schedule": [], - "stabilityDays": 0, }, "isVulnerabilityAlert": true, "matchCurrentVersion": "= 1.8.2", @@ -51,10 +51,10 @@ go", "commitMessageSuffix": "[SECURITY]", "dependencyDashboardApproval": false, "groupName": null, + "minimumReleaseAge": null, "prCreation": "immediate", "rangeStrategy": "update-lockfile", "schedule": [], - "stabilityDays": 0, }, "isVulnerabilityAlert": true, "matchCurrentVersion": "1.8.2", @@ -81,10 +81,10 @@ actions", "commitMessageSuffix": "[SECURITY]", "dependencyDashboardApproval": false, "groupName": null, + "minimumReleaseAge": null, "prCreation": "immediate", "rangeStrategy": "update-lockfile", "schedule": [], - "stabilityDays": 0, }, "isVulnerabilityAlert": true, "matchCurrentVersion": "== 1.6.7", @@ -126,10 +126,10 @@ Ansible before versions 2.1.4, 2.2.1 is vulnerable to an improper input validati "commitMessageSuffix": "[SECURITY]", "dependencyDashboardApproval": false, "groupName": null, + "minimumReleaseAge": null, "prCreation": "immediate", "rangeStrategy": "update-lockfile", "schedule": [], - "stabilityDays": 0, }, "isVulnerabilityAlert": true, "matchCurrentVersion": "2.4.2", diff --git a/lib/workers/repository/init/vulnerability.spec.ts b/lib/workers/repository/init/vulnerability.spec.ts index 10e1df6b8b6bb8..7b47d5ab7aa06a 100644 --- a/lib/workers/repository/init/vulnerability.spec.ts +++ b/lib/workers/repository/init/vulnerability.spec.ts @@ -47,6 +47,7 @@ describe('workers/repository/init/vulnerability', () => { config.transitiveRemediation = true; // TODO #7154 delete config.vulnerabilityAlerts!.enabled; + delete config.packageRules; // test coverage platform.getVulnerabilityAlerts.mockResolvedValue([ partial(), { diff --git a/lib/workers/repository/init/vulnerability.ts b/lib/workers/repository/init/vulnerability.ts index bba4f091544b20..7cf228988eb556 100644 --- a/lib/workers/repository/init/vulnerability.ts +++ b/lib/workers/repository/init/vulnerability.ts @@ -56,8 +56,8 @@ export async function detectVulnerabilityAlerts( logger.debug('Vulnerability alerts are disabled'); return input; } - const alerts = await platform.getVulnerabilityAlerts(); - if (!alerts.length) { + const alerts = await platform.getVulnerabilityAlerts?.(); + if (!alerts?.length) { logger.debug('No vulnerability alerts found'); if (input.vulnerabilityAlertsOnly) { throw new Error(NO_VULNERABILITY_ALERTS); diff --git a/lib/workers/repository/onboarding/branch/check.spec.ts b/lib/workers/repository/onboarding/branch/check.spec.ts deleted file mode 100644 index 6935cc04c1cf3c..00000000000000 --- a/lib/workers/repository/onboarding/branch/check.spec.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { RenovateConfig, git, mocked, partial } from '../../../../../test/util'; -import { logger } from '../../../../logger'; -import * as _cache from '../../../../util/cache/repository'; -import { isOnboarded } from './check'; - -jest.mock('../../../../util/cache/repository'); -jest.mock('../../../../util/git'); - -const cache = mocked(_cache); - -describe('workers/repository/onboarding/branch/check', () => { - const config = partial({ requireConfig: 'required' }); - - it('skips normal onboarding check if onboardingCache is valid', async () => { - cache.getCache.mockReturnValueOnce({ - onboardingBranchCache: { - onboardingBranch: 'configure/renovate', - defaultBranchSha: 'default-sha', - onboardingBranchSha: 'onboarding-sha', - }, - }); - git.getBranchCommit - .mockReturnValueOnce('default-sha') - .mockReturnValueOnce('onboarding-sha'); - const res = await isOnboarded(config); - expect(res).toBeFalse(); - expect(logger.debug).toHaveBeenCalledWith( - 'Onboarding cache is valid. Repo is not onboarded' - ); - }); - - it('continues with normal logic if onboardingCache is invalid', async () => { - cache.getCache.mockReturnValueOnce({ - onboardingBranchCache: { - onboardingBranch: 'configure/renovate', - defaultBranchSha: 'default-sha', - onboardingBranchSha: 'onboarding-sha', - }, - }); - git.getBranchCommit - .mockReturnValueOnce('default-sha-1') - .mockReturnValueOnce('onboarding-sha'); - git.getFileList.mockResolvedValue([]); - await isOnboarded(config); - expect(logger.debug).not.toHaveBeenCalledWith( - 'Onboarding cache is valid. Repo is not onboarded' - ); - }); -}); diff --git a/lib/workers/repository/onboarding/branch/check.ts b/lib/workers/repository/onboarding/branch/check.ts index 040133d142a540..7f77ded5485d6d 100644 --- a/lib/workers/repository/onboarding/branch/check.ts +++ b/lib/workers/repository/onboarding/branch/check.ts @@ -9,7 +9,7 @@ import { Pr, platform } from '../../../../modules/platform'; import { ensureComment } from '../../../../modules/platform/comment'; import { getCache } from '../../../../util/cache/repository'; import { readLocalFile } from '../../../../util/fs'; -import { getBranchCommit, getFileList } from '../../../../util/git'; +import { getFileList } from '../../../../util/git'; async function findFile(fileName: string): Promise { logger.debug(`findFile(${fileName})`); @@ -61,21 +61,7 @@ export async function isOnboarded(config: RenovateConfig): Promise { logger.debug('Config file will be ignored'); return true; } - const cache = getCache(); - const onboardingBranchCache = cache?.onboardingBranchCache; - // if onboarding cache is present and base branch has not been updated branch is not onboarded - if ( - onboardingBranchCache && - onboardingBranchCache.defaultBranchSha === - getBranchCommit(config.defaultBranch!) && - onboardingBranchCache.onboardingBranchSha === - getBranchCommit(config.onboardingBranch!) - ) { - logger.debug('Onboarding cache is valid. Repo is not onboarded'); - return false; - } - if (cache.configFileName) { logger.debug('Checking cached config file name'); try { diff --git a/lib/workers/repository/onboarding/branch/index.spec.ts b/lib/workers/repository/onboarding/branch/index.spec.ts index 04fc5ed1856d67..1569fab4c451c3 100644 --- a/lib/workers/repository/onboarding/branch/index.spec.ts +++ b/lib/workers/repository/onboarding/branch/index.spec.ts @@ -21,7 +21,6 @@ import * as _cache from '../../../../util/cache/repository'; import type { FileAddition } from '../../../../util/git/types'; import { OnboardingState } from '../common'; import * as _config from './config'; -import * as _onboardingCache from './onboarding-branch-cache'; import * as _rebase from './rebase'; import { checkOnboardingBranch } from '.'; @@ -33,21 +32,12 @@ jest.mock('../../../../util/cache/repository'); jest.mock('../../../../util/fs'); jest.mock('../../../../util/git'); jest.mock('./config'); -jest.mock('./onboarding-branch-cache'); const cache = mocked(_cache); -const onboardingCache = mocked(_onboardingCache); describe('workers/repository/onboarding/branch/index', () => { describe('checkOnboardingBranch', () => { let config: RenovateConfig; - const dummyCache = { - onboardingBranchCache: { - onboardingBranch: 'configure/renovate', - defaultBranchSha: 'default-sha', - onboardingBranchSha: 'onboarding-sha', - }, - }; beforeEach(() => { memCache.init(); @@ -178,11 +168,9 @@ describe('workers/repository/onboarding/branch/index', () => { }); it('detects repo is onboarded via file', async () => { - cache.getCache.mockReturnValue(dummyCache); git.getFileList.mockResolvedValueOnce(['renovate.json']); const res = await checkOnboardingBranch(config); expect(res.repoIsOnboarded).toBeTrue(); - expect(onboardingCache.deleteOnboardingCache).toHaveBeenCalledTimes(1); // removes onboarding cache when repo is onboarded }); it('handles removed cached file name', async () => { @@ -263,7 +251,6 @@ describe('workers/repository/onboarding/branch/index', () => { }); it('updates onboarding branch', async () => { - cache.getCache.mockReturnValue(dummyCache); git.getFileList.mockResolvedValue(['package.json']); platform.findPr.mockResolvedValue(null); platform.getBranchPr.mockResolvedValueOnce(mock()); @@ -272,7 +259,6 @@ describe('workers/repository/onboarding/branch/index', () => { expect(res.repoIsOnboarded).toBeFalse(); expect(res.branchList).toEqual(['renovate/configure']); expect(git.checkoutBranch).toHaveBeenCalledTimes(1); - expect(onboardingCache.setOnboardingCache).toHaveBeenCalledTimes(1); // update onboarding cache expect(scm.commitAndPush).toHaveBeenCalledTimes(0); }); diff --git a/lib/workers/repository/onboarding/branch/index.ts b/lib/workers/repository/onboarding/branch/index.ts index c8f50ecefa8575..2add4def7375e7 100644 --- a/lib/workers/repository/onboarding/branch/index.ts +++ b/lib/workers/repository/onboarding/branch/index.ts @@ -8,21 +8,13 @@ import { } from '../../../../constants/error-messages'; import { logger } from '../../../../logger'; import { Pr, platform } from '../../../../modules/platform'; -import { - checkoutBranch, - getBranchCommit, - setGitAuthor, -} from '../../../../util/git'; +import { checkoutBranch, setGitAuthor } from '../../../../util/git'; import { extractAllDependencies } from '../../extract'; import { mergeRenovateConfig } from '../../init/merge'; import { OnboardingState } from '../common'; import { getOnboardingPr, isOnboarded } from './check'; import { getOnboardingConfig } from './config'; import { createOnboardingBranch } from './create'; -import { - deleteOnboardingCache, - setOnboardingCache, -} from './onboarding-branch-cache'; import { rebaseOnboardingBranch } from './rebase'; export async function checkOnboardingBranch( @@ -34,9 +26,6 @@ export async function checkOnboardingBranch( const repoIsOnboarded = await isOnboarded(config); if (repoIsOnboarded) { logger.debug('Repo is onboarded'); - - // delete onboarding cache - deleteOnboardingCache(); return { ...config, repoIsOnboarded }; } if (config.isFork && config.forkProcessing !== 'enabled') { @@ -58,13 +47,6 @@ export async function checkOnboardingBranch( { branch: config.onboardingBranch, commit, onboarding: true }, 'Branch updated' ); - - // update onboarding cache - setOnboardingCache( - config.onboardingBranch!, - getBranchCommit(config.defaultBranch!)!, - commit - ); } // istanbul ignore if if (platform.refreshPr) { @@ -96,13 +78,6 @@ export async function checkOnboardingBranch( { branch: onboardingBranch, commit, onboarding: true }, 'Branch created' ); - - // set onboarding branch cache - setOnboardingCache( - config.onboardingBranch!, - getBranchCommit(config.defaultBranch!)!, - commit - ); } } if (!GlobalConfig.get('dryRun')) { diff --git a/lib/workers/repository/onboarding/branch/onboarding-branch-cache.spec.ts b/lib/workers/repository/onboarding/branch/onboarding-branch-cache.spec.ts deleted file mode 100644 index 10307e5a3ec374..00000000000000 --- a/lib/workers/repository/onboarding/branch/onboarding-branch-cache.spec.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { mocked } from '../../../../../test/util'; -import * as _cache from '../../../../util/cache/repository'; -import type { RepoCacheData } from '../../../../util/cache/repository/types'; -import { - deleteOnboardingCache, - setOnboardingCache, -} from './onboarding-branch-cache'; - -jest.mock('../../../../util/cache/repository'); -const cache = mocked(_cache); - -describe('workers/repository/onboarding/branch/onboarding-branch-cache', () => { - it('sets new cache', () => { - const dummyCache = {} satisfies RepoCacheData; - cache.getCache.mockReturnValueOnce(dummyCache); - setOnboardingCache('configure/renovate', 'default-sha', 'onboarding-sha'); - expect(dummyCache).toEqual({ - onboardingBranchCache: { - onboardingBranch: 'configure/renovate', - defaultBranchSha: 'default-sha', - onboardingBranchSha: 'onboarding-sha', - }, - }); - }); - - it('updates old cache', () => { - const dummyCache = { - onboardingBranchCache: { - onboardingBranch: 'configure/renovate', - defaultBranchSha: 'default-sha', - onboardingBranchSha: 'onboarding-sha', - }, - } satisfies RepoCacheData; - cache.getCache.mockReturnValueOnce(dummyCache); - setOnboardingCache( - 'configure/renovate', - 'default-sha-1', - 'onboarding-sha-1' - ); - expect(dummyCache).toEqual({ - onboardingBranchCache: { - onboardingBranch: 'configure/renovate', - defaultBranchSha: 'default-sha-1', - onboardingBranchSha: 'onboarding-sha-1', - }, - }); - }); - - it('deletes cache', () => { - const dummyCache = { - onboardingBranchCache: { - onboardingBranch: 'configure/renovate', - defaultBranchSha: 'default-sha', - onboardingBranchSha: 'onboarding-sha', - }, - } satisfies RepoCacheData; - cache.getCache.mockReturnValueOnce(dummyCache); - deleteOnboardingCache(); - expect(dummyCache.onboardingBranchCache).toBeUndefined(); - }); -}); diff --git a/lib/workers/repository/onboarding/branch/onboarding-branch-cache.ts b/lib/workers/repository/onboarding/branch/onboarding-branch-cache.ts deleted file mode 100644 index a6ecfcb29677b2..00000000000000 --- a/lib/workers/repository/onboarding/branch/onboarding-branch-cache.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { logger } from '../../../../logger'; -import { getCache } from '../../../../util/cache/repository'; - -export function setOnboardingCache( - onboardingBranch: string, - defaultBranchSha: string, - onboardingBranchSha: string -): void { - const cache = getCache(); - const onboardingCache = { - onboardingBranch, - defaultBranchSha, - onboardingBranchSha, - }; - if (cache.onboardingBranchCache) { - logger.debug('Update Onboarding Cache'); - } else { - logger.debug('Create Onboarding Cache'); - } - cache.onboardingBranchCache = onboardingCache; -} - -export function deleteOnboardingCache(): void { - const cache = getCache(); - - if (cache?.onboardingBranchCache) { - logger.debug('Delete Onboarding Cache'); - delete cache.onboardingBranchCache; - } -} diff --git a/lib/workers/repository/process/extract-update.spec.ts b/lib/workers/repository/process/extract-update.spec.ts index fd337a189836f7..47b8e67e3a232f 100644 --- a/lib/workers/repository/process/extract-update.spec.ts +++ b/lib/workers/repository/process/extract-update.spec.ts @@ -116,9 +116,9 @@ describe('workers/repository/process/extract-update', () => { suppressNotifications: ['deprecationWarningIssues'], osvVulnerabilityAlerts: true, }; - const fetchVulnerabilitiesMock = jest.fn(); + const appendVulnerabilityPackageRulesMock = jest.fn(); createVulnerabilitiesMock.mockResolvedValueOnce({ - fetchVulnerabilities: fetchVulnerabilitiesMock, + appendVulnerabilityPackageRules: appendVulnerabilityPackageRulesMock, }); repositoryCache.getCache.mockReturnValueOnce({ scan: {} }); git.checkoutBranch.mockResolvedValueOnce('123test'); @@ -127,7 +127,7 @@ describe('workers/repository/process/extract-update', () => { await lookup(config, packageFiles); expect(createVulnerabilitiesMock).toHaveBeenCalledOnce(); - expect(fetchVulnerabilitiesMock).toHaveBeenCalledOnce(); + expect(appendVulnerabilityPackageRulesMock).toHaveBeenCalledOnce(); }); it('handles exception when fetching vulnerabilities', async () => { diff --git a/lib/workers/repository/process/extract-update.ts b/lib/workers/repository/process/extract-update.ts index e8406e46190267..d10df7303bbaee 100644 --- a/lib/workers/repository/process/extract-update.ts +++ b/lib/workers/repository/process/extract-update.ts @@ -175,7 +175,10 @@ async function fetchVulnerabilities( if (config.osvVulnerabilityAlerts) { try { const vulnerabilities = await Vulnerabilities.create(); - await vulnerabilities.fetchVulnerabilities(config, packageFiles); + await vulnerabilities.appendVulnerabilityPackageRules( + config, + packageFiles + ); } catch (err) { logger.warn({ err }, 'Unable to read vulnerability information'); } diff --git a/lib/workers/repository/process/fetch.ts b/lib/workers/repository/process/fetch.ts index badf45d48bff41..92ae3315d113fc 100644 --- a/lib/workers/repository/process/fetch.ts +++ b/lib/workers/repository/process/fetch.ts @@ -21,11 +21,24 @@ import { PackageFiles } from '../package-files'; import { lookupUpdates } from './lookup'; import type { LookupUpdateConfig } from './lookup/types'; +async function withLookupStats( + datasource: string, + callback: () => Promise +): Promise { + const start = Date.now(); + const result = await callback(); + const duration = Date.now() - start; + const lookups = memCache.get('lookup-stats') || []; + lookups.push({ datasource, duration }); + memCache.set('lookup-stats', lookups); + return result; +} + async function fetchDepUpdates( packageFileConfig: RenovateConfig & PackageFile, indep: PackageDependency ): Promise { - let dep = clone(indep); + const dep = clone(indep); dep.updates = []; if (is.string(dep.depName)) { dep.depName = dep.depName.trim(); @@ -58,15 +71,10 @@ async function fetchDepUpdates( } else { if (depConfig.datasource) { try { - const start = Date.now(); - dep = { - ...dep, - ...(await lookupUpdates(depConfig as LookupUpdateConfig)), - }; - const duration = Date.now() - start; - const lookups = memCache.get('lookup-stats') || []; - lookups.push({ datasource: depConfig.datasource, duration }); - memCache.set('lookup-stats', lookups); + const updateResult = await withLookupStats(depConfig.datasource, () => + lookupUpdates(depConfig as LookupUpdateConfig) + ); + Object.assign(dep, updateResult); } catch (err) { if ( packageFileConfig.repoIsOnboarded || diff --git a/lib/workers/repository/process/lookup/__snapshots__/filter-checks.spec.ts.snap b/lib/workers/repository/process/lookup/__snapshots__/filter-checks.spec.ts.snap index 3c5cc28de8b003..5bf232ab929a17 100644 --- a/lib/workers/repository/process/lookup/__snapshots__/filter-checks.spec.ts.snap +++ b/lib/workers/repository/process/lookup/__snapshots__/filter-checks.spec.ts.snap @@ -24,7 +24,7 @@ exports[`workers/repository/process/lookup/filter-checks .filterInternalChecks() } `; -exports[`workers/repository/process/lookup/filter-checks .filterInternalChecks() picks up stabilityDays settings from hostRules 1`] = ` +exports[`workers/repository/process/lookup/filter-checks .filterInternalChecks() picks up minimumReleaseAge settings from hostRules 1`] = ` { "pendingChecks": false, "pendingReleases": [], @@ -35,7 +35,7 @@ exports[`workers/repository/process/lookup/filter-checks .filterInternalChecks() } `; -exports[`workers/repository/process/lookup/filter-checks .filterInternalChecks() picks up stabilityDays settings from updateType 1`] = ` +exports[`workers/repository/process/lookup/filter-checks .filterInternalChecks() picks up minimumReleaseAge settings from updateType 1`] = ` { "pendingChecks": false, "pendingReleases": [ diff --git a/lib/workers/repository/process/lookup/filter-checks.spec.ts b/lib/workers/repository/process/lookup/filter-checks.spec.ts index 5802aced0e1fe6..8c210db87d6526 100644 --- a/lib/workers/repository/process/lookup/filter-checks.spec.ts +++ b/lib/workers/repository/process/lookup/filter-checks.spec.ts @@ -4,6 +4,7 @@ import * as allVersioning from '../../../../modules/versioning'; import { clone } from '../../../../util/clone'; import * as _dateUtil from '../../../../util/date'; import * as _mergeConfidence from '../../../../util/merge-confidence'; +import { toMs } from '../../../../util/pretty-time'; import { filterInternalChecks } from './filter-checks'; import type { LookupUpdateConfig, UpdateResult } from './types'; @@ -44,10 +45,10 @@ describe('workers/repository/process/lookup/filter-checks', () => { config.currentVersion = '1.0.0'; sortedReleases = clone(releases); jest.resetAllMocks(); - dateUtil.getElapsedDays.mockReturnValueOnce(3); - dateUtil.getElapsedDays.mockReturnValueOnce(5); - dateUtil.getElapsedDays.mockReturnValueOnce(7); - dateUtil.getElapsedDays.mockReturnValueOnce(9); + dateUtil.getElapsedMs.mockReturnValueOnce(toMs('3 days') ?? 0); + dateUtil.getElapsedMs.mockReturnValueOnce(toMs('5 days') ?? 0); + dateUtil.getElapsedMs.mockReturnValueOnce(toMs('7 days') ?? 0); + dateUtil.getElapsedMs.mockReturnValueOnce(toMs('9 days') ?? 0); }); describe('.filterInternalChecks()', () => { @@ -67,7 +68,7 @@ describe('workers/repository/process/lookup/filter-checks', () => { it('returns non-pending latest release if internalChecksFilter=flexible and none pass checks', async () => { config.internalChecksFilter = 'flexible'; - config.stabilityDays = 10; + config.minimumReleaseAge = '10 days'; const res = await filterInternalChecks( config, versioning, @@ -82,7 +83,7 @@ describe('workers/repository/process/lookup/filter-checks', () => { it('returns pending latest release if internalChecksFilter=strict and none pass checks', async () => { config.internalChecksFilter = 'strict'; - config.stabilityDays = 10; + config.minimumReleaseAge = '10 days'; const res = await filterInternalChecks( config, versioning, @@ -97,7 +98,7 @@ describe('workers/repository/process/lookup/filter-checks', () => { it('returns non-latest release if internalChecksFilter=strict and some pass checks', async () => { config.internalChecksFilter = 'strict'; - config.stabilityDays = 6; + config.minimumReleaseAge = '6 days'; const res = await filterInternalChecks( config, versioning, @@ -112,7 +113,7 @@ describe('workers/repository/process/lookup/filter-checks', () => { it('returns non-latest release if internalChecksFilter=flexible and some pass checks', async () => { config.internalChecksFilter = 'strict'; - config.stabilityDays = 6; + config.minimumReleaseAge = '6 days'; const res = await filterInternalChecks( config, versioning, @@ -125,10 +126,12 @@ describe('workers/repository/process/lookup/filter-checks', () => { expect(res.release.version).toBe('1.0.2'); }); - it('picks up stabilityDays settings from hostRules', async () => { + it('picks up minimumReleaseAge settings from hostRules', async () => { config.internalChecksFilter = 'strict'; - config.stabilityDays = 6; - config.packageRules = [{ matchUpdateTypes: ['patch'], stabilityDays: 1 }]; + config.minimumReleaseAge = '6 days'; + config.packageRules = [ + { matchUpdateTypes: ['patch'], minimumReleaseAge: '1 day' }, + ]; const res = await filterInternalChecks( config, versioning, @@ -141,9 +144,9 @@ describe('workers/repository/process/lookup/filter-checks', () => { expect(res.release.version).toBe('1.0.4'); }); - it('picks up stabilityDays settings from updateType', async () => { + it('picks up minimumReleaseAge settings from updateType', async () => { config.internalChecksFilter = 'strict'; - config.patch = { stabilityDays: 4 }; + config.patch = { minimumReleaseAge: '4 days' }; const res = await filterInternalChecks( config, versioning, diff --git a/lib/workers/repository/process/lookup/filter-checks.ts b/lib/workers/repository/process/lookup/filter-checks.ts index 4cd6ac70f6150d..83b625cffdf00f 100644 --- a/lib/workers/repository/process/lookup/filter-checks.ts +++ b/lib/workers/repository/process/lookup/filter-checks.ts @@ -3,13 +3,14 @@ import { mergeChildConfig } from '../../../../config'; import { logger } from '../../../../logger'; import type { Release } from '../../../../modules/datasource'; import type { VersioningApi } from '../../../../modules/versioning'; -import { getElapsedDays } from '../../../../util/date'; +import { getElapsedMs } from '../../../../util/date'; import { getMergeConfidenceLevel, isActiveConfidenceLevel, satisfiesConfidenceLevel, } from '../../../../util/merge-confidence'; import { applyPackageRules } from '../../../../util/package-rules'; +import { toMs } from '../../../../util/pretty-time'; import type { LookupUpdateConfig, UpdateResult } from './types'; import { getUpdateType } from './update-type'; @@ -30,7 +31,7 @@ export async function filterInternalChecks( let pendingChecks = false; let pendingReleases: Release[] = []; if (internalChecksFilter === 'none') { - // Don't care if stabilityDays or minimumConfidence are unmet + // Don't care if minimumReleaseAge or minimumConfidence are unmet release = sortedReleases.pop(); } else { // iterate through releases from highest to lowest, looking for the first which will pass checks if present @@ -51,19 +52,19 @@ export async function filterInternalChecks( ); // Apply packageRules in case any apply to updateType releaseConfig = applyPackageRules(releaseConfig); - // Now check for a stabilityDays config + // Now check for a minimumReleaseAge config const { minimumConfidence, - stabilityDays, + minimumReleaseAge, releaseTimestamp, version: newVersion, updateType, } = releaseConfig; - if (is.integer(stabilityDays) && releaseTimestamp) { - if (getElapsedDays(releaseTimestamp) < stabilityDays) { + if (is.nonEmptyString(minimumReleaseAge) && releaseTimestamp) { + if (getElapsedMs(releaseTimestamp) < (toMs(minimumReleaseAge) ?? 0)) { // Skip it if it doesn't pass checks logger.trace( - { depName, check: 'stabilityDays' }, + { depName, check: 'minimumReleaseAge' }, `Release ${candidateRelease.version} is pending status checks` ); pendingReleases.unshift(candidateRelease); diff --git a/lib/workers/repository/process/lookup/index.spec.ts b/lib/workers/repository/process/lookup/index.spec.ts index 10c963df82a8f1..fb91a5467745b3 100644 --- a/lib/workers/repository/process/lookup/index.spec.ts +++ b/lib/workers/repository/process/lookup/index.spec.ts @@ -1002,7 +1002,7 @@ describe('workers/repository/process/lookup/index', () => { config.currentValue = '1.4.4'; config.packageName = 'some/action'; config.datasource = GithubReleasesDatasource.id; - config.stabilityDays = 14; + config.minimumReleaseAge = '14 days'; config.internalChecksFilter = 'strict'; const yesterday = new Date(); yesterday.setDate(yesterday.getDate() - 1); @@ -1025,7 +1025,7 @@ describe('workers/repository/process/lookup/index', () => { config.currentValue = '1.4.4'; config.packageName = 'some/action'; config.datasource = GithubReleasesDatasource.id; - config.stabilityDays = 3; + config.minimumReleaseAge = '3 days'; config.internalChecksFilter = 'strict'; const yesterday = new Date(); yesterday.setDate(yesterday.getDate() - 1); diff --git a/lib/workers/repository/process/types.ts b/lib/workers/repository/process/types.ts new file mode 100644 index 00000000000000..fd739b99a7d1c3 --- /dev/null +++ b/lib/workers/repository/process/types.ts @@ -0,0 +1,19 @@ +import type { Osv } from '@renovatebot/osv-offline'; +import type { RenovateConfig } from '../../../config/types'; +import type { PackageFile } from '../../../modules/manager/types'; +import type { VersioningApi } from '../../../modules/versioning'; + +export interface Vulnerability { + packageFileConfig: RenovateConfig & PackageFile; + packageName: string; + depVersion: string; + fixedVersion: string | null; + datasource: string; + vulnerability: Osv.Vulnerability; + affected: Osv.Affected; +} + +export interface DependencyVulnerabilities { + versioningApi: VersioningApi; + vulnerabilities: Vulnerability[]; +} diff --git a/lib/workers/repository/process/vulnerabilities.spec.ts b/lib/workers/repository/process/vulnerabilities.spec.ts index 895ef3ef03f295..acfb0424435dba 100644 --- a/lib/workers/repository/process/vulnerabilities.spec.ts +++ b/lib/workers/repository/process/vulnerabilities.spec.ts @@ -36,6 +36,89 @@ describe('workers/repository/process/vulnerabilities', () => { describe('fetchVulnerabilities()', () => { let config: RenovateConfig; let vulnerabilities: Vulnerabilities; + + beforeAll(async () => { + createMock.mockResolvedValue({ + getVulnerabilities: getVulnerabilitiesMock, + }); + vulnerabilities = await Vulnerabilities.create(); + }); + + beforeEach(() => { + config = getConfig(); + config.packageRules = []; + }); + + it('return list of Vulnerabilities', async () => { + const packageFiles: Record = { + poetry: [ + { + deps: [ + { depName: 'django', currentValue: '3.2', datasource: 'pypi' }, + ], + packageFile: 'some-file', + }, + ], + }; + getVulnerabilitiesMock.mockResolvedValueOnce([ + { + id: 'GHSA-qrw5-5h28-modded', + modified: '', + affected: [ + { + package: { + name: 'django', + ecosystem: 'PyPI', + purl: 'pkg:pypi/django', + }, + ranges: [ + { + type: 'ECOSYSTEM', + events: [{ introduced: '3.0' }, { fixed: '3.3.8' }], + }, + ], + }, + { + package: { + name: 'django', + ecosystem: 'PyPI', + purl: 'pkg:pypi/django', + }, + ranges: [ + { + type: 'ECOSYSTEM', + events: [{ introduced: '3.2' }, { fixed: '3.2.16' }], + }, + ], + }, + ], + }, + ]); + + const vulnerabilityList = await vulnerabilities.fetchVulnerabilities( + config, + packageFiles + ); + expect(vulnerabilityList).toMatchObject([ + { + packageName: 'django', + depVersion: '3.2', + fixedVersion: '==3.3.8', + datasource: 'pypi', + }, + { + packageName: 'django', + depVersion: '3.2', + fixedVersion: '==3.2.16', + datasource: 'pypi', + }, + ]); + }); + }); + + describe('appendVulnerabilityPackageRules()', () => { + let config: RenovateConfig; + let vulnerabilities: Vulnerabilities; const lodashVulnerability: Osv.Vulnerability = { id: 'GHSA-x5rq-j2xg-h7qm', modified: '', @@ -80,7 +163,10 @@ describe('workers/repository/process/vulnerabilities', () => { ], }; - await vulnerabilities.fetchVulnerabilities(config, packageFiles); + await vulnerabilities.appendVulnerabilityPackageRules( + config, + packageFiles + ); expect(logger.logger.trace).toHaveBeenCalledWith( 'Cannot map datasource docker to OSV ecosystem' ); @@ -97,7 +183,10 @@ describe('workers/repository/process/vulnerabilities', () => { }; getVulnerabilitiesMock.mockResolvedValueOnce([]); - await vulnerabilities.fetchVulnerabilities(config, packageFiles); + await vulnerabilities.appendVulnerabilityPackageRules( + config, + packageFiles + ); expect(logger.logger.trace).toHaveBeenCalledWith( 'No vulnerabilities found in OSV database for lodash' ); @@ -121,7 +210,10 @@ describe('workers/repository/process/vulnerabilities', () => { }, ]); - await vulnerabilities.fetchVulnerabilities(config, packageFiles); + await vulnerabilities.appendVulnerabilityPackageRules( + config, + packageFiles + ); expect(config.packageRules).toHaveLength(0); }); @@ -143,7 +235,10 @@ describe('workers/repository/process/vulnerabilities', () => { }, ]); - await vulnerabilities.fetchVulnerabilities(config, packageFiles); + await vulnerabilities.appendVulnerabilityPackageRules( + config, + packageFiles + ); expect(logger.logger.trace).toHaveBeenCalledWith( 'Skipping withdrawn vulnerability GHSA-x5rq-j2xg-h7qm' ); @@ -167,7 +262,10 @@ describe('workers/repository/process/vulnerabilities', () => { }; getVulnerabilitiesMock.mockResolvedValueOnce([lodashVulnerability]); - await vulnerabilities.fetchVulnerabilities(config, packageFiles); + await vulnerabilities.appendVulnerabilityPackageRules( + config, + packageFiles + ); expect(logger.logger.debug).toHaveBeenCalledWith( 'Skipping vulnerability lookup for package lodash due to unsupported version #4.17.11' ); @@ -191,7 +289,10 @@ describe('workers/repository/process/vulnerabilities', () => { }; getVulnerabilitiesMock.mockRejectedValueOnce(err); - await vulnerabilities.fetchVulnerabilities(config, packageFiles); + await vulnerabilities.appendVulnerabilityPackageRules( + config, + packageFiles + ); expect(logger.logger.warn).toHaveBeenCalledWith( { err }, 'Error fetching vulnerability information for lodash' @@ -236,7 +337,10 @@ describe('workers/repository/process/vulnerabilities', () => { }, ]); - await vulnerabilities.fetchVulnerabilities(config, packageFiles); + await vulnerabilities.appendVulnerabilityPackageRules( + config, + packageFiles + ); expect(logger.logger.debug).toHaveBeenCalledWith( { event }, 'Skipping OSV event with invalid version' @@ -266,7 +370,10 @@ describe('workers/repository/process/vulnerabilities', () => { }, ]); - await vulnerabilities.fetchVulnerabilities(config, packageFiles); + await vulnerabilities.appendVulnerabilityPackageRules( + config, + packageFiles + ); expect(config.packageRules).toHaveLength(0); }); @@ -294,7 +401,10 @@ describe('workers/repository/process/vulnerabilities', () => { }, ]); - await vulnerabilities.fetchVulnerabilities(config, packageFiles); + await vulnerabilities.appendVulnerabilityPackageRules( + config, + packageFiles + ); expect(logger.logger.info).toHaveBeenCalledWith( 'No fixed version available for vulnerability GHSA-xxxx-yyyy-zzzz in fake 4.17.11' ); @@ -333,7 +443,10 @@ describe('workers/repository/process/vulnerabilities', () => { }, ]); - await vulnerabilities.fetchVulnerabilities(config, packageFiles); + await vulnerabilities.appendVulnerabilityPackageRules( + config, + packageFiles + ); expect(logger.logger.info).toHaveBeenCalledWith( 'No fixed version available for vulnerability GHSA-xxxx-yyyy-zzzz in fake 1.5.1' ); @@ -379,7 +492,10 @@ describe('workers/repository/process/vulnerabilities', () => { }, ]); - await vulnerabilities.fetchVulnerabilities(config, packageFiles); + await vulnerabilities.appendVulnerabilityPackageRules( + config, + packageFiles + ); expect(logger.logger.debug).toHaveBeenCalledWith( 'Vulnerability GO-2022-0187 affects stdlib 1.7.5' ); @@ -454,7 +570,10 @@ describe('workers/repository/process/vulnerabilities', () => { }, ]); - await vulnerabilities.fetchVulnerabilities(config, packageFiles); + await vulnerabilities.appendVulnerabilityPackageRules( + config, + packageFiles + ); expect(config.packageRules).toHaveLength(1); expect(config.packageRules).toMatchObject([ { @@ -513,7 +632,10 @@ describe('workers/repository/process/vulnerabilities', () => { }, ]); - await vulnerabilities.fetchVulnerabilities(config, packageFiles); + await vulnerabilities.appendVulnerabilityPackageRules( + config, + packageFiles + ); expect(config.packageRules).toHaveLength(2); expect(config.packageRules).toMatchObject([ { @@ -546,7 +668,10 @@ describe('workers/repository/process/vulnerabilities', () => { }; getVulnerabilitiesMock.mockResolvedValueOnce([lodashVulnerability]); - await vulnerabilities.fetchVulnerabilities(config, packageFiles); + await vulnerabilities.appendVulnerabilityPackageRules( + config, + packageFiles + ); expect(config.packageRules).toHaveLength(0); }); @@ -607,7 +732,10 @@ describe('workers/repository/process/vulnerabilities', () => { }, ]); - await vulnerabilities.fetchVulnerabilities(config, packageFiles); + await vulnerabilities.appendVulnerabilityPackageRules( + config, + packageFiles + ); expect(config.packageRules).toHaveLength(1); expect(config.packageRules).toMatchObject([ @@ -686,7 +814,10 @@ describe('workers/repository/process/vulnerabilities', () => { }, ]); - await vulnerabilities.fetchVulnerabilities(config, packageFiles); + await vulnerabilities.appendVulnerabilityPackageRules( + config, + packageFiles + ); expect(config.packageRules).toHaveLength(2); expect(config.packageRules).toMatchObject([ @@ -740,7 +871,10 @@ describe('workers/repository/process/vulnerabilities', () => { }, ]); - await vulnerabilities.fetchVulnerabilities(config, packageFiles); + await vulnerabilities.appendVulnerabilityPackageRules( + config, + packageFiles + ); expect(logger.logger.debug).not.toHaveBeenCalledWith( 'OSV advisory GHSA-xxxx-yyyy-zzzz lists quokka 1.2.3 as vulnerable' ); @@ -784,7 +918,10 @@ describe('workers/repository/process/vulnerabilities', () => { }, ]); - await vulnerabilities.fetchVulnerabilities(config, packageFiles); + await vulnerabilities.appendVulnerabilityPackageRules( + config, + packageFiles + ); expect(config.packageRules).toHaveLength(1); expect(config.packageRules).toMatchObject([ { @@ -859,7 +996,10 @@ describe('workers/repository/process/vulnerabilities', () => { }, ]); - await vulnerabilities.fetchVulnerabilities(config, packageFiles); + await vulnerabilities.appendVulnerabilityPackageRules( + config, + packageFiles + ); expect(logger.logger.debug).toHaveBeenCalledWith( 'Error processing CVSS vector some-invalid-score' @@ -921,7 +1061,10 @@ describe('workers/repository/process/vulnerabilities', () => { }, ]); - await vulnerabilities.fetchVulnerabilities(config, packageFiles); + await vulnerabilities.appendVulnerabilityPackageRules( + config, + packageFiles + ); expect(config.packageRules).toHaveLength(1); expect(config.packageRules).toMatchObject([ @@ -1003,7 +1146,10 @@ describe('workers/repository/process/vulnerabilities', () => { }, ]); - await vulnerabilities.fetchVulnerabilities(config, packageFiles); + await vulnerabilities.appendVulnerabilityPackageRules( + config, + packageFiles + ); expect(config.packageRules).toHaveLength(1); expect(config.packageRules).toMatchObject([ diff --git a/lib/workers/repository/process/vulnerabilities.ts b/lib/workers/repository/process/vulnerabilities.ts index 39f4f5647b1703..b3745a7692d463 100644 --- a/lib/workers/repository/process/vulnerabilities.ts +++ b/lib/workers/repository/process/vulnerabilities.ts @@ -18,6 +18,7 @@ import { import { sanitizeMarkdown } from '../../../util/markdown'; import * as p from '../../../util/promises'; import { regEx } from '../../../util/regex'; +import type { DependencyVulnerabilities, Vulnerability } from './types'; export class Vulnerabilities { private osvOffline: OsvOffline | undefined; @@ -50,71 +51,108 @@ export class Vulnerabilities { return instance; } - async fetchVulnerabilities( + async appendVulnerabilityPackageRules( config: RenovateConfig, packageFiles: Record ): Promise { + const dependencyVulnerabilities = await this.fetchDependencyVulnerabilities( + config, + packageFiles + ); + + config.packageRules ??= []; + for (const { + vulnerabilities, + versioningApi, + } of dependencyVulnerabilities) { + const groupPackageRules: PackageRule[] = []; + for (const vulnerability of vulnerabilities) { + const rule = this.vulnerabilityToPackageRules(vulnerability); + if (is.nullOrUndefined(rule)) { + continue; + } + groupPackageRules.push(rule); + } + this.sortByFixedVersion(groupPackageRules, versioningApi); + + config.packageRules.push(...groupPackageRules); + } + } + + async fetchVulnerabilities( + config: RenovateConfig, + packageFiles: Record + ): Promise { + const groups = await this.fetchDependencyVulnerabilities( + config, + packageFiles + ); + return groups.flatMap((group) => group.vulnerabilities); + } + + private async fetchDependencyVulnerabilities( + config: RenovateConfig, + packageFiles: Record + ): Promise { const managers = Object.keys(packageFiles); const allManagerJobs = managers.map((manager) => this.fetchManagerVulnerabilities(config, packageFiles, manager) ); - await Promise.all(allManagerJobs); + return (await Promise.all(allManagerJobs)).flat(); } private async fetchManagerVulnerabilities( config: RenovateConfig, packageFiles: Record, manager: string - ): Promise { + ): Promise { const managerConfig = getManagerConfig(config, manager); const queue = packageFiles[manager].map( - (pFile) => (): Promise => - this.fetchManagerPackageFileVulnerabilities( - config, - managerConfig, - pFile - ) + (pFile) => (): Promise => + this.fetchManagerPackageFileVulnerabilities(managerConfig, pFile) ); logger.trace( { manager, queueLength: queue.length }, - 'fetchManagerUpdates starting' + 'fetchManagerVulnerabilities starting' ); - await p.all(queue); - logger.trace({ manager }, 'fetchManagerUpdates finished'); + const result = (await p.all(queue)).flat(); + logger.trace({ manager }, 'fetchManagerVulnerabilities finished'); + return result; } private async fetchManagerPackageFileVulnerabilities( - config: RenovateConfig, managerConfig: RenovateConfig, pFile: PackageFile - ): Promise { + ): Promise { const { packageFile } = pFile; const packageFileConfig = mergeChildConfig(managerConfig, pFile); const { manager } = packageFileConfig; const queue = pFile.deps.map( - (dep) => (): Promise => - this.fetchDependencyVulnerabilities(packageFileConfig, dep) + (dep) => (): Promise => + this.fetchDependencyVulnerability(packageFileConfig, dep) ); logger.trace( { manager, packageFile, queueLength: queue.length }, 'fetchManagerPackageFileVulnerabilities starting with concurrency' ); - config.packageRules?.push(...(await p.all(queue)).flat()); + const result = await p.all(queue); logger.trace( { packageFile }, 'fetchManagerPackageFileVulnerabilities finished' ); + + return result.filter(is.truthy); } - private async fetchDependencyVulnerabilities( + private async fetchDependencyVulnerability( packageFileConfig: RenovateConfig & PackageFile, dep: PackageDependency - ): Promise { + ): Promise { const ecosystem = Vulnerabilities.datasourceEcosystemMap[dep.datasource!]; if (!ecosystem) { logger.trace(`Cannot map datasource ${dep.datasource!} to OSV ecosystem`); - return []; + return null; } let packageName = dep.packageName ?? dep.depName!; @@ -123,20 +161,19 @@ export class Vulnerabilities { packageName = packageName.toLowerCase().replace(regEx(/[_.-]+/g), '-'); } - const packageRules: PackageRule[] = []; try { - const vulnerabilities = await this.osvOffline?.getVulnerabilities( + const osvVulnerabilities = await this.osvOffline?.getVulnerabilities( ecosystem, packageName ); if ( - is.nullOrUndefined(vulnerabilities) || - is.emptyArray(vulnerabilities) + is.nullOrUndefined(osvVulnerabilities) || + is.emptyArray(osvVulnerabilities) ) { logger.trace( `No vulnerabilities found in OSV database for ${packageName}` ); - return []; + return null; } const depVersion = @@ -149,16 +186,19 @@ export class Vulnerabilities { logger.debug( `Skipping vulnerability lookup for package ${packageName} due to unsupported version ${depVersion}` ); - return []; + return null; } - for (const vulnerability of vulnerabilities) { - if (vulnerability.withdrawn) { - logger.trace(`Skipping withdrawn vulnerability ${vulnerability.id}`); + const vulnerabilities: Vulnerability[] = []; + for (const osvVulnerability of osvVulnerabilities) { + if (osvVulnerability.withdrawn) { + logger.trace( + `Skipping withdrawn vulnerability ${osvVulnerability.id}` + ); continue; } - for (const affected of vulnerability.affected ?? []) { + for (const affected of osvVulnerability.affected ?? []) { const isVulnerable = this.isPackageVulnerable( ecosystem, packageName, @@ -171,7 +211,7 @@ export class Vulnerabilities { } logger.debug( - `Vulnerability ${vulnerability.id} affects ${packageName} ${depVersion}` + `Vulnerability ${osvVulnerability.id} affects ${packageName} ${depVersion}` ); const fixedVersion = this.getFixedVersion( ecosystem, @@ -179,39 +219,27 @@ export class Vulnerabilities { affected, versioningApi ); - if (is.nullOrUndefined(fixedVersion)) { - logger.info( - `No fixed version available for vulnerability ${vulnerability.id} in ${packageName} ${depVersion}` - ); - continue; - } - logger.debug( - `Setting allowed version ${fixedVersion} to fix vulnerability ${vulnerability.id} in ${packageName} ${depVersion}` - ); - const rule = this.convertToPackageRule( - packageFileConfig, - dep, + vulnerabilities.push({ packageName, + vulnerability: osvVulnerability, + affected, depVersion, fixedVersion, - vulnerability, - affected - ); - packageRules.push(rule); + datasource: dep.datasource!, + packageFileConfig, + }); } } - this.sortByFixedVersion(packageRules, versioningApi); + return { vulnerabilities, versioningApi }; } catch (err) { logger.warn( { err }, `Error fetching vulnerability information for ${packageName}` ); - return []; + return null; } - - return packageRules; } private sortByFixedVersion( @@ -223,7 +251,6 @@ export class Vulnerabilities { const version = rule.allowedVersions as string; versionsCleaned[version] = version.replace(regEx(/[=> ]+/g), ''); } - packageRules.sort((a, b) => versioningApi.sortVersions( versionsCleaned[a.allowedVersions as string], @@ -407,17 +434,28 @@ export class Vulnerabilities { ); } - private convertToPackageRule( - packageFileConfig: RenovateConfig & PackageFile, - dep: PackageDependency, - packageName: string, - depVersion: string, - fixedVersion: string, - vulnerability: Osv.Vulnerability, - affected: Osv.Affected - ): PackageRule { + private vulnerabilityToPackageRules(vul: Vulnerability): PackageRule | null { + const { + vulnerability, + affected, + packageName, + depVersion, + fixedVersion, + datasource, + packageFileConfig, + } = vul; + if (is.nullOrUndefined(fixedVersion)) { + logger.info( + `No fixed version available for vulnerability ${vulnerability.id} in ${packageName} ${depVersion}` + ); + return null; + } + + logger.debug( + `Setting allowed version ${fixedVersion} to fix vulnerability ${vulnerability.id} in ${packageName} ${depVersion}` + ); return { - matchDatasources: [dep.datasource!], + matchDatasources: [datasource], matchPackageNames: [packageName], matchCurrentVersion: depVersion, allowedVersions: fixedVersion, diff --git a/lib/workers/repository/update/branch/index.spec.ts b/lib/workers/repository/update/branch/index.spec.ts index 146312255a2e52..0288741eab8ae7 100644 --- a/lib/workers/repository/update/branch/index.spec.ts +++ b/lib/workers/repository/update/branch/index.spec.ts @@ -162,17 +162,17 @@ describe('workers/repository/update/branch/index', () => { }); }); - it('skips branch for fresh release with stabilityDays', async () => { + it('skips branch for fresh release with minimumReleaseAge', async () => { schedule.isScheduledNow.mockReturnValueOnce(true); config.prCreation = 'not-pending'; (config.upgrades as Partial[]) = [ { releaseTimestamp: new Date('2019-01-01').getTime().toString(), - stabilityDays: 1, + minimumReleaseAge: '1 day', }, { releaseTimestamp: new Date().toString(), - stabilityDays: 1, + minimumReleaseAge: '1 day', }, ]; @@ -185,13 +185,13 @@ describe('workers/repository/update/branch/index', () => { }); }); - it('skips branch if not stabilityDays not met', async () => { + it('skips branch if minimumReleaseAge not met', async () => { schedule.isScheduledNow.mockReturnValueOnce(true); config.prCreation = 'not-pending'; config.upgrades = partial([ { releaseTimestamp: '2099-12-31', - stabilityDays: 1, + minimumReleaseAge: '1 day', }, ]); const res = await branchWorker.processBranch(config); diff --git a/lib/workers/repository/update/branch/index.ts b/lib/workers/repository/update/branch/index.ts index 188e5f31a1a666..077e15eacb9b9b 100644 --- a/lib/workers/repository/update/branch/index.ts +++ b/lib/workers/repository/update/branch/index.ts @@ -23,7 +23,7 @@ import { } from '../../../../modules/platform/comment'; import { scm } from '../../../../modules/platform/scm'; import { ExternalHostError } from '../../../../types/errors/external-host-error'; -import { getElapsedDays } from '../../../../util/date'; +import { getElapsedMs } from '../../../../util/date'; import { emojify } from '../../../../util/emoji'; import { checkoutBranch } from '../../../../util/git'; import { @@ -31,6 +31,7 @@ import { isActiveConfidenceLevel, satisfiesConfidenceLevel, } from '../../../../util/merge-confidence'; +import { toMs } from '../../../../util/pretty-time'; import * as template from '../../../../util/template'; import { isLimitReached } from '../../../global/limits'; import type { BranchConfig, BranchResult, PrBlockedBy } from '../../../types'; @@ -280,25 +281,29 @@ export async function processBranch( if ( config.upgrades.some( (upgrade) => - (upgrade.stabilityDays && upgrade.releaseTimestamp) || + (is.nonEmptyString(upgrade.minimumReleaseAge) && + upgrade.releaseTimestamp) || isActiveConfidenceLevel(upgrade.minimumConfidence!) ) ) { // Only set a stability status check if one or more of the updates contain - // both a stabilityDays setting and a releaseTimestamp + // both a minimumReleaseAge setting and a releaseTimestamp config.stabilityStatus = 'green'; // Default to 'success' but set 'pending' if any update is pending for (const upgrade of config.upgrades) { - if (is.number(upgrade.stabilityDays) && upgrade.releaseTimestamp) { - const daysElapsed = getElapsedDays(upgrade.releaseTimestamp); - if (daysElapsed < upgrade.stabilityDays) { + if ( + is.nonEmptyString(upgrade.minimumReleaseAge) && + upgrade.releaseTimestamp + ) { + const timeElapsed = getElapsedMs(upgrade.releaseTimestamp); + if (timeElapsed < (toMs(upgrade.minimumReleaseAge) ?? 0)) { logger.debug( { depName: upgrade.depName, - daysElapsed, - stabilityDays: upgrade.stabilityDays, + timeElapsed, + minimumReleaseAge: upgrade.minimumReleaseAge, }, - 'Update has not passed stability days' + 'Update has not passed minimum release age' ); config.stabilityStatus = 'yellow'; continue; diff --git a/lib/workers/repository/update/branch/status-checks.ts b/lib/workers/repository/update/branch/status-checks.ts index a880fc3a9e6e1e..6fe93414f0f6be 100644 --- a/lib/workers/repository/update/branch/status-checks.ts +++ b/lib/workers/repository/update/branch/status-checks.ts @@ -65,8 +65,8 @@ export async function setStability(config: StabilityConfig): Promise { const context = `renovate/stability-days`; const description = config.stabilityStatus === 'green' - ? 'Updates have met stability days requirement' - : 'Updates have not met stability days requirement'; + ? 'Updates have met minimum release age requirement' + : 'Updates have not met minimum release age requirement'; await setStatusCheck( config.branchName, context, diff --git a/lib/workers/repository/update/pr/index.ts b/lib/workers/repository/update/pr/index.ts index 94292fce88f916..bc3c9b2adebccb 100644 --- a/lib/workers/repository/update/pr/index.ts +++ b/lib/workers/repository/update/pr/index.ts @@ -50,7 +50,7 @@ export function getPlatformPrOptions( ); return { - azureAutoApprove: !!config.azureAutoApprove, + autoApprove: !!config.autoApprove, azureWorkItemId: config.azureWorkItemId ?? 0, bbUseDefaultReviewers: !!config.bbUseDefaultReviewers, gitLabIgnoreApprovals: !!config.gitLabIgnoreApprovals, diff --git a/lib/workers/repository/updates/generate.spec.ts b/lib/workers/repository/updates/generate.spec.ts index 040726a9034f8e..c44d2e74ee6cf5 100644 --- a/lib/workers/repository/updates/generate.spec.ts +++ b/lib/workers/repository/updates/generate.spec.ts @@ -357,6 +357,61 @@ describe('workers/repository/updates/generate', () => { expect(res.recreateClosed).toBeTrue(); }); + it('skips appending baseBranch and updateType to prTitle when prTitleStrict is true', () => { + const branch = [ + { + manager: 'some-manager', + depName: 'depB', + groupName: 'some-group', + branchName: 'some-branch', + commitMessage: + '{{{groupName}}} {{{commitMessageExtra}}} {{{commitMessageSuffix}}}', + commitMessageExtra: + 'to {{#if isMajor}}{{prettyNewMajor}}{{else}}{{prettyNewVersion}}{{/if}}', + foo: 1, + newValue: '5.1.2', + newVersion: '5.1.2', + group: { + foo: 2, + }, + releaseTimestamp: '2017-02-07T20:01:41+00:00', + updateType: 'minor', + separateMinorPatch: true, + prTitleStrict: true, + }, + { + manager: 'some-manager', + depName: 'depA', + groupName: 'some-group', + branchName: 'some-branch', + commitMessage: + '{{{groupName}}} {{{commitMessageExtra}}} {{{commitMessageSuffix}}}', + commitMessageExtra: + 'to {{#if isMajor}}{{prettyNewMajor}}{{else}}{{prettyNewVersion}}{{/if}}', + foo: 1, + newValue: '1.1.0', + newVersion: '1.1.0', + group: { + foo: 2, + }, + releaseTimestamp: '2017-02-08T20:01:41+00:00', + updateType: 'minor', + separateMinorPatch: true, + prTitleStrict: true, + }, + ] satisfies BranchUpgradeConfig[]; + const res = generateBranchConfig(branch); + expect(res).toMatchObject({ + foo: 2, + isGroup: true, + recreateClosed: true, + prTitle: 'some-group', + commitMessage: 'some-group', + groupName: 'some-group', + releaseTimestamp: '2017-02-08T20:01:41+00:00', + }); + }); + it('groups multiple upgrades different version', () => { const branch = [ { diff --git a/lib/workers/repository/updates/generate.ts b/lib/workers/repository/updates/generate.ts index 5a3ff3e05be062..3dd6b922615837 100644 --- a/lib/workers/repository/updates/generate.ts +++ b/lib/workers/repository/updates/generate.ts @@ -255,20 +255,22 @@ export function generateBranchConfig( } else { [upgrade.prTitle] = upgrade.commitMessage.split(newlineRegex); } - upgrade.prTitle += upgrade.hasBaseBranches ? ' ({{baseBranch}})' : ''; - if (upgrade.isGroup) { - upgrade.prTitle += - upgrade.updateType === 'major' && upgrade.separateMajorMinor - ? ' (major)' - : ''; - upgrade.prTitle += - upgrade.updateType === 'minor' && upgrade.separateMinorPatch - ? ' (minor)' - : ''; - upgrade.prTitle += - upgrade.updateType === 'patch' && upgrade.separateMinorPatch - ? ' (patch)' - : ''; + if (!upgrade.prTitleStrict) { + upgrade.prTitle += upgrade.hasBaseBranches ? ' ({{baseBranch}})' : ''; + if (upgrade.isGroup) { + upgrade.prTitle += + upgrade.updateType === 'major' && upgrade.separateMajorMinor + ? ' (major)' + : ''; + upgrade.prTitle += + upgrade.updateType === 'minor' && upgrade.separateMinorPatch + ? ' (minor)' + : ''; + upgrade.prTitle += + upgrade.updateType === 'patch' && upgrade.separateMinorPatch + ? ' (patch)' + : ''; + } } // Compile again to allow for nested templates upgrade.prTitle = template.compile(upgrade.prTitle, upgrade); diff --git a/lib/workers/types.ts b/lib/workers/types.ts index 7b53bcddb2747c..8357d49264a75a 100644 --- a/lib/workers/types.ts +++ b/lib/workers/types.ts @@ -56,6 +56,7 @@ export interface BranchUpgradeConfig prBodyTemplate?: string; prPriority?: number; prTitle?: string; + prTitleStrict?: boolean; prettyNewMajor?: string; prettyNewVersion?: string; releases?: ReleaseWithNotes[]; diff --git a/package.json b/package.json index 562fdd77976eff..1a42e710e59fc8 100644 --- a/package.json +++ b/package.json @@ -136,29 +136,29 @@ "node": ">=18.12.0" }, "dependencies": { - "@aws-sdk/client-codecommit": "3.290.0", - "@aws-sdk/client-ec2": "3.291.0", - "@aws-sdk/client-ecr": "3.290.0", - "@aws-sdk/client-iam": "3.291.0", - "@aws-sdk/client-rds": "3.290.0", - "@aws-sdk/client-s3": "3.290.0", + "@aws-sdk/client-codecommit": "3.312.0", + "@aws-sdk/client-ec2": "3.312.0", + "@aws-sdk/client-ecr": "3.312.0", + "@aws-sdk/client-iam": "3.312.0", + "@aws-sdk/client-rds": "3.314.0", + "@aws-sdk/client-s3": "3.312.0", "@breejs/later": "4.1.0", "@cheap-glitch/mi-cron": "1.0.1", "@iarna/toml": "3.0.0", "@opentelemetry/api": "1.4.1", - "@opentelemetry/context-async-hooks": "1.11.0", - "@opentelemetry/exporter-trace-otlp-http": "0.37.0", - "@opentelemetry/instrumentation": "0.37.0", + "@opentelemetry/context-async-hooks": "1.12.0", + "@opentelemetry/exporter-trace-otlp-http": "0.38.0", + "@opentelemetry/instrumentation": "0.38.0", "@opentelemetry/instrumentation-bunyan": "0.31.1", - "@opentelemetry/instrumentation-http": "0.37.0", - "@opentelemetry/resources": "1.11.0", - "@opentelemetry/sdk-trace-base": "1.11.0", - "@opentelemetry/sdk-trace-node": "1.11.0", - "@opentelemetry/semantic-conventions": "1.11.0", + "@opentelemetry/instrumentation-http": "0.38.0", + "@opentelemetry/resources": "1.12.0", + "@opentelemetry/sdk-trace-base": "1.12.0", + "@opentelemetry/sdk-trace-node": "1.12.0", + "@opentelemetry/semantic-conventions": "1.12.0", "@qnighy/marshal": "0.1.3", "@renovatebot/osv-offline": "1.2.4", "@renovatebot/pep440": "2.1.13", - "@renovatebot/ruby-semver": "2.1.10", + "@renovatebot/ruby-semver": "2.1.11", "@sindresorhus/is": "4.6.0", "@types/ms": "0.7.31", "@types/tmp": "0.2.3", @@ -175,7 +175,7 @@ "chalk": "4.1.2", "changelog-filename-regex": "2.0.1", "clean-git-ref": "2.0.1", - "commander": "10.0.0", + "commander": "10.0.1", "conventional-commits-detector": "1.0.3", "crypto-random-string": "3.3.1", "deepmerge": "4.3.1", @@ -214,7 +214,7 @@ "ms": "2.1.3", "nanoid": "3.3.6", "node-html-parser": "6.1.5", - "openpgp": "5.7.0", + "openpgp": "5.8.0", "p-all": "3.0.0", "p-map": "4.0.0", "p-queue": "6.6.2", @@ -226,7 +226,7 @@ "remark": "13.0.0", "remark-github": "10.1.0", "safe-stable-stringify": "2.4.3", - "semver": "7.3.8", + "semver": "7.5.0", "semver-stable": "3.0.0", "semver-utils": "1.1.4", "shlex": "2.1.2", @@ -272,7 +272,7 @@ "@types/js-yaml": "4.0.5", "@types/json-dup-key-validator": "1.0.0", "@types/linkify-markdown": "1.0.1", - "@types/lodash": "4.14.192", + "@types/lodash": "4.14.194", "@types/luxon": "3.3.0", "@types/markdown-it": "12.2.3", "@types/markdown-table": "2.0.0", @@ -284,13 +284,13 @@ "@types/semver": "7.3.13", "@types/semver-stable": "3.0.0", "@types/semver-utils": "1.1.1", - "@types/shelljs": "0.8.11", + "@types/shelljs": "0.8.12", "@types/traverse": "0.6.32", "@types/url-join": "4.0.1", "@types/validate-npm-package-name": "4.0.0", "@types/xmldoc": "1.1.6", - "@typescript-eslint/eslint-plugin": "5.57.1", - "@typescript-eslint/parser": "5.57.1", + "@typescript-eslint/eslint-plugin": "5.59.1", + "@typescript-eslint/parser": "5.59.1", "aws-sdk-client-mock": "2.1.1", "callsite": "1.0.0", "common-tags": "1.8.2", @@ -298,10 +298,10 @@ "cross-env": "7.0.3", "diff": "5.1.0", "emojibase-data": "7.0.1", - "eslint": "8.37.0", + "eslint": "8.39.0", "eslint-config-prettier": "8.8.0", "eslint-formatter-gha": "1.4.2", - "eslint-import-resolver-typescript": "3.5.4", + "eslint-import-resolver-typescript": "3.5.5", "eslint-plugin-import": "2.27.5", "eslint-plugin-jest": "27.2.1", "eslint-plugin-jest-formatting": "3.1.0", @@ -315,22 +315,22 @@ "jest-extended": "3.2.4", "jest-junit": "15.0.0", "jest-mock-extended": "3.0.4", - "lint-staged": "13.2.0", + "lint-staged": "13.2.1", "markdownlint-cli2": "0.6.0", - "memfs": "3.4.13", + "memfs": "3.5.0", "mock-fs": "5.2.0", "mockdate": "3.0.5", "nock": "13.3.0", "npm-run-all": "4.1.5", "rimraf": "4.4.1", - "semantic-release": "20.1.3", + "semantic-release": "21.0.1", "shelljs": "0.8.5", "strip-ansi": "6.0.1", "tmp-promise": "3.0.3", "ts-jest": "29.1.0", "ts-node": "10.9.1", - "type-fest": "3.7.2", - "typescript": "5.0.3", + "type-fest": "3.8.0", + "typescript": "5.0.4", "unified": "9.2.2" }, "resolutions": { diff --git a/yarn.lock b/yarn.lock index 06fa8eef941184..a4245a13fbbea8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -109,1110 +109,1088 @@ "@aws-sdk/util-utf8-browser" "^3.0.0" tslib "^1.11.1" -"@aws-sdk/abort-controller@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/abort-controller/-/abort-controller-3.290.0.tgz#c8279257e4be8cd84144e1a16dca52f3371d31cc" - integrity sha512-Q4AqucQnhcsauH6tDf1bSRuOW/Ejwjs1qHPLlvknwX1IoxZettP3lXz9LLd8KZnEMFQLHPmBTbFIW+Ivpzl+vw== +"@aws-sdk/abort-controller@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/abort-controller/-/abort-controller-3.310.0.tgz#0da2d29b823daa03b7c1f0b43de1f030583b4f51" + integrity sha512-v1zrRQxDLA1MdPim159Vx/CPHqsB4uybSxRi1CnfHO5ZjHryx3a5htW2gdGAykVCul40+yJXvfpufMrELVxH+g== dependencies: - "@aws-sdk/types" "3.290.0" - tslib "^2.3.1" - -"@aws-sdk/chunked-blob-reader-native@3.208.0": - version "3.208.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/chunked-blob-reader-native/-/chunked-blob-reader-native-3.208.0.tgz#cdbd12c89a4f3ddd91bf707da8bb4af311487cc5" - integrity sha512-JeOZ95PW+fJ6bbuqPySYqLqHk1n4+4ueEEraJsiUrPBV0S1ZtyvOGHcnGztKUjr2PYNaiexmpWuvUve9K12HRA== - dependencies: - "@aws-sdk/util-base64" "3.208.0" - tslib "^2.3.1" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/chunked-blob-reader@3.188.0": - version "3.188.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/chunked-blob-reader/-/chunked-blob-reader-3.188.0.tgz#18181b27511ab512e56b9f2cef30d2abbef639dc" - integrity sha512-zkPRFZZPL3eH+kH86LDYYXImiClA1/sW60zYOjse9Pgka+eDJlvBN6hcYxwDEKjcwATYiSRR1aVQHcfCinlGXg== +"@aws-sdk/chunked-blob-reader@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/chunked-blob-reader/-/chunked-blob-reader-3.310.0.tgz#2ada1b024a2745c2fe7e869606fab781325f981e" + integrity sha512-CrJS3exo4mWaLnWxfCH+w88Ou0IcAZSIkk4QbmxiHl/5Dq705OLoxf4385MVyExpqpeVJYOYQ2WaD8i/pQZ2fg== dependencies: - tslib "^2.3.1" + tslib "^2.5.0" -"@aws-sdk/client-codecommit@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-codecommit/-/client-codecommit-3.290.0.tgz#5a87dc72b7c262db132f057907c959683cd5cac4" - integrity sha512-FRsCC5yAtXofxrJUtuKR67Ozd7yHTTKy47eaCCBotuQ3eIA5ATuArPFRFpySMQGRmC0/kOjY/WL3ZChKHZFgKA== +"@aws-sdk/client-codecommit@3.312.0": + version "3.312.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-codecommit/-/client-codecommit-3.312.0.tgz#e29c3d504b2d65aaccb4a4e8d12e736115ad5893" + integrity sha512-DZ8Ci6REIqBKJLeDN1qk+MgRs0KBPnNvfT0Ktw+3dyykbpo20X8xabcUDpV7l1C1qwTYFAg2vC0xbdbx9O2LOg== dependencies: "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sts" "3.290.0" - "@aws-sdk/config-resolver" "3.290.0" - "@aws-sdk/credential-provider-node" "3.290.0" - "@aws-sdk/fetch-http-handler" "3.290.0" - "@aws-sdk/hash-node" "3.290.0" - "@aws-sdk/invalid-dependency" "3.290.0" - "@aws-sdk/middleware-content-length" "3.290.0" - "@aws-sdk/middleware-endpoint" "3.290.0" - "@aws-sdk/middleware-host-header" "3.290.0" - "@aws-sdk/middleware-logger" "3.290.0" - "@aws-sdk/middleware-recursion-detection" "3.290.0" - "@aws-sdk/middleware-retry" "3.290.0" - "@aws-sdk/middleware-serde" "3.290.0" - "@aws-sdk/middleware-signing" "3.290.0" - "@aws-sdk/middleware-stack" "3.290.0" - "@aws-sdk/middleware-user-agent" "3.290.0" - "@aws-sdk/node-config-provider" "3.290.0" - "@aws-sdk/node-http-handler" "3.290.0" - "@aws-sdk/protocol-http" "3.290.0" - "@aws-sdk/smithy-client" "3.290.0" - "@aws-sdk/types" "3.290.0" - "@aws-sdk/url-parser" "3.290.0" - "@aws-sdk/util-base64" "3.208.0" - "@aws-sdk/util-body-length-browser" "3.188.0" - "@aws-sdk/util-body-length-node" "3.208.0" - "@aws-sdk/util-defaults-mode-browser" "3.290.0" - "@aws-sdk/util-defaults-mode-node" "3.290.0" - "@aws-sdk/util-endpoints" "3.290.0" - "@aws-sdk/util-retry" "3.290.0" - "@aws-sdk/util-user-agent-browser" "3.290.0" - "@aws-sdk/util-user-agent-node" "3.290.0" - "@aws-sdk/util-utf8" "3.254.0" - tslib "^2.3.1" + "@aws-sdk/client-sts" "3.312.0" + "@aws-sdk/config-resolver" "3.310.0" + "@aws-sdk/credential-provider-node" "3.310.0" + "@aws-sdk/fetch-http-handler" "3.310.0" + "@aws-sdk/hash-node" "3.310.0" + "@aws-sdk/invalid-dependency" "3.310.0" + "@aws-sdk/middleware-content-length" "3.310.0" + "@aws-sdk/middleware-endpoint" "3.310.0" + "@aws-sdk/middleware-host-header" "3.310.0" + "@aws-sdk/middleware-logger" "3.310.0" + "@aws-sdk/middleware-recursion-detection" "3.310.0" + "@aws-sdk/middleware-retry" "3.310.0" + "@aws-sdk/middleware-serde" "3.310.0" + "@aws-sdk/middleware-signing" "3.310.0" + "@aws-sdk/middleware-stack" "3.310.0" + "@aws-sdk/middleware-user-agent" "3.310.0" + "@aws-sdk/node-config-provider" "3.310.0" + "@aws-sdk/node-http-handler" "3.310.0" + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/smithy-client" "3.310.0" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/url-parser" "3.310.0" + "@aws-sdk/util-base64" "3.310.0" + "@aws-sdk/util-body-length-browser" "3.310.0" + "@aws-sdk/util-body-length-node" "3.310.0" + "@aws-sdk/util-defaults-mode-browser" "3.310.0" + "@aws-sdk/util-defaults-mode-node" "3.310.0" + "@aws-sdk/util-endpoints" "3.310.0" + "@aws-sdk/util-retry" "3.310.0" + "@aws-sdk/util-user-agent-browser" "3.310.0" + "@aws-sdk/util-user-agent-node" "3.310.0" + "@aws-sdk/util-utf8" "3.310.0" + tslib "^2.5.0" uuid "^8.3.2" -"@aws-sdk/client-ec2@3.291.0": - version "3.291.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-ec2/-/client-ec2-3.291.0.tgz#1bedbf384a8eb76a2ed2b9fa56047dd8c0079bff" - integrity sha512-nVw92++iwDB5RzBe7hCK+HiY/4hHFBd/tXBJlSg7rD6TGHyskv3Qn+n2ikpxPVSRYJgnZr/g9JYYQzm3r6RFxQ== +"@aws-sdk/client-ec2@3.312.0": + version "3.312.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-ec2/-/client-ec2-3.312.0.tgz#df61677afcade8069221e13f4e94dd8f85aec246" + integrity sha512-WybuBygd5v9MfZ1gNnzRkS5ArnoG4wclkHhC1gUb4ylNqptzN9gezUgTR1l9Nfr9V6487r/O0yao2VcdUApAZg== dependencies: "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sts" "3.290.0" - "@aws-sdk/config-resolver" "3.290.0" - "@aws-sdk/credential-provider-node" "3.290.0" - "@aws-sdk/fetch-http-handler" "3.290.0" - "@aws-sdk/hash-node" "3.290.0" - "@aws-sdk/invalid-dependency" "3.290.0" - "@aws-sdk/middleware-content-length" "3.290.0" - "@aws-sdk/middleware-endpoint" "3.290.0" - "@aws-sdk/middleware-host-header" "3.290.0" - "@aws-sdk/middleware-logger" "3.290.0" - "@aws-sdk/middleware-recursion-detection" "3.290.0" - "@aws-sdk/middleware-retry" "3.290.0" - "@aws-sdk/middleware-sdk-ec2" "3.291.0" - "@aws-sdk/middleware-serde" "3.290.0" - "@aws-sdk/middleware-signing" "3.290.0" - "@aws-sdk/middleware-stack" "3.290.0" - "@aws-sdk/middleware-user-agent" "3.290.0" - "@aws-sdk/node-config-provider" "3.290.0" - "@aws-sdk/node-http-handler" "3.290.0" - "@aws-sdk/protocol-http" "3.290.0" - "@aws-sdk/smithy-client" "3.290.0" - "@aws-sdk/types" "3.290.0" - "@aws-sdk/url-parser" "3.290.0" - "@aws-sdk/util-base64" "3.208.0" - "@aws-sdk/util-body-length-browser" "3.188.0" - "@aws-sdk/util-body-length-node" "3.208.0" - "@aws-sdk/util-defaults-mode-browser" "3.290.0" - "@aws-sdk/util-defaults-mode-node" "3.290.0" - "@aws-sdk/util-endpoints" "3.290.0" - "@aws-sdk/util-retry" "3.290.0" - "@aws-sdk/util-user-agent-browser" "3.290.0" - "@aws-sdk/util-user-agent-node" "3.290.0" - "@aws-sdk/util-utf8" "3.254.0" - "@aws-sdk/util-waiter" "3.290.0" + "@aws-sdk/client-sts" "3.312.0" + "@aws-sdk/config-resolver" "3.310.0" + "@aws-sdk/credential-provider-node" "3.310.0" + "@aws-sdk/fetch-http-handler" "3.310.0" + "@aws-sdk/hash-node" "3.310.0" + "@aws-sdk/invalid-dependency" "3.310.0" + "@aws-sdk/middleware-content-length" "3.310.0" + "@aws-sdk/middleware-endpoint" "3.310.0" + "@aws-sdk/middleware-host-header" "3.310.0" + "@aws-sdk/middleware-logger" "3.310.0" + "@aws-sdk/middleware-recursion-detection" "3.310.0" + "@aws-sdk/middleware-retry" "3.310.0" + "@aws-sdk/middleware-sdk-ec2" "3.311.0" + "@aws-sdk/middleware-serde" "3.310.0" + "@aws-sdk/middleware-signing" "3.310.0" + "@aws-sdk/middleware-stack" "3.310.0" + "@aws-sdk/middleware-user-agent" "3.310.0" + "@aws-sdk/node-config-provider" "3.310.0" + "@aws-sdk/node-http-handler" "3.310.0" + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/smithy-client" "3.310.0" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/url-parser" "3.310.0" + "@aws-sdk/util-base64" "3.310.0" + "@aws-sdk/util-body-length-browser" "3.310.0" + "@aws-sdk/util-body-length-node" "3.310.0" + "@aws-sdk/util-defaults-mode-browser" "3.310.0" + "@aws-sdk/util-defaults-mode-node" "3.310.0" + "@aws-sdk/util-endpoints" "3.310.0" + "@aws-sdk/util-retry" "3.310.0" + "@aws-sdk/util-user-agent-browser" "3.310.0" + "@aws-sdk/util-user-agent-node" "3.310.0" + "@aws-sdk/util-utf8" "3.310.0" + "@aws-sdk/util-waiter" "3.310.0" fast-xml-parser "4.1.2" - tslib "^2.3.1" + tslib "^2.5.0" uuid "^8.3.2" -"@aws-sdk/client-ecr@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-ecr/-/client-ecr-3.290.0.tgz#7998247388e93305ef7d91e6cb1e2411d3e729a8" - integrity sha512-GQXKV0QGi2KbhrxU9soXBMqfTmjMdsog2/yf19u7LXKR91Xhq5KNyz6WlavZy+lE5nPa1yartczB+2pZMildhQ== +"@aws-sdk/client-ecr@3.312.0": + version "3.312.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-ecr/-/client-ecr-3.312.0.tgz#8425c3305e8e2353f9ec39468bed88e21b44bb15" + integrity sha512-MeVhOOm73m9WPXT+6RIQqrHermOtf6S3QmpdZRHOBj5IVZ+004e+Hxe1sbJZY2TG/r90vDtcU9LwTwQQhbyLKQ== dependencies: "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sts" "3.290.0" - "@aws-sdk/config-resolver" "3.290.0" - "@aws-sdk/credential-provider-node" "3.290.0" - "@aws-sdk/fetch-http-handler" "3.290.0" - "@aws-sdk/hash-node" "3.290.0" - "@aws-sdk/invalid-dependency" "3.290.0" - "@aws-sdk/middleware-content-length" "3.290.0" - "@aws-sdk/middleware-endpoint" "3.290.0" - "@aws-sdk/middleware-host-header" "3.290.0" - "@aws-sdk/middleware-logger" "3.290.0" - "@aws-sdk/middleware-recursion-detection" "3.290.0" - "@aws-sdk/middleware-retry" "3.290.0" - "@aws-sdk/middleware-serde" "3.290.0" - "@aws-sdk/middleware-signing" "3.290.0" - "@aws-sdk/middleware-stack" "3.290.0" - "@aws-sdk/middleware-user-agent" "3.290.0" - "@aws-sdk/node-config-provider" "3.290.0" - "@aws-sdk/node-http-handler" "3.290.0" - "@aws-sdk/protocol-http" "3.290.0" - "@aws-sdk/smithy-client" "3.290.0" - "@aws-sdk/types" "3.290.0" - "@aws-sdk/url-parser" "3.290.0" - "@aws-sdk/util-base64" "3.208.0" - "@aws-sdk/util-body-length-browser" "3.188.0" - "@aws-sdk/util-body-length-node" "3.208.0" - "@aws-sdk/util-defaults-mode-browser" "3.290.0" - "@aws-sdk/util-defaults-mode-node" "3.290.0" - "@aws-sdk/util-endpoints" "3.290.0" - "@aws-sdk/util-retry" "3.290.0" - "@aws-sdk/util-user-agent-browser" "3.290.0" - "@aws-sdk/util-user-agent-node" "3.290.0" - "@aws-sdk/util-utf8" "3.254.0" - "@aws-sdk/util-waiter" "3.290.0" - tslib "^2.3.1" + "@aws-sdk/client-sts" "3.312.0" + "@aws-sdk/config-resolver" "3.310.0" + "@aws-sdk/credential-provider-node" "3.310.0" + "@aws-sdk/fetch-http-handler" "3.310.0" + "@aws-sdk/hash-node" "3.310.0" + "@aws-sdk/invalid-dependency" "3.310.0" + "@aws-sdk/middleware-content-length" "3.310.0" + "@aws-sdk/middleware-endpoint" "3.310.0" + "@aws-sdk/middleware-host-header" "3.310.0" + "@aws-sdk/middleware-logger" "3.310.0" + "@aws-sdk/middleware-recursion-detection" "3.310.0" + "@aws-sdk/middleware-retry" "3.310.0" + "@aws-sdk/middleware-serde" "3.310.0" + "@aws-sdk/middleware-signing" "3.310.0" + "@aws-sdk/middleware-stack" "3.310.0" + "@aws-sdk/middleware-user-agent" "3.310.0" + "@aws-sdk/node-config-provider" "3.310.0" + "@aws-sdk/node-http-handler" "3.310.0" + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/smithy-client" "3.310.0" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/url-parser" "3.310.0" + "@aws-sdk/util-base64" "3.310.0" + "@aws-sdk/util-body-length-browser" "3.310.0" + "@aws-sdk/util-body-length-node" "3.310.0" + "@aws-sdk/util-defaults-mode-browser" "3.310.0" + "@aws-sdk/util-defaults-mode-node" "3.310.0" + "@aws-sdk/util-endpoints" "3.310.0" + "@aws-sdk/util-retry" "3.310.0" + "@aws-sdk/util-user-agent-browser" "3.310.0" + "@aws-sdk/util-user-agent-node" "3.310.0" + "@aws-sdk/util-utf8" "3.310.0" + "@aws-sdk/util-waiter" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/client-iam@3.291.0": - version "3.291.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-iam/-/client-iam-3.291.0.tgz#e3673e2ff9a3ef114bfd561cb3b07b842d590276" - integrity sha512-NbQbigFSQLzdx/8vz0FqMh7QVPH4UnzrGTxHKJxgRlasjPVs6hq2jrBr/ym3vtsYUHEEazbdRzTkXaj/uwOyeA== +"@aws-sdk/client-iam@3.312.0": + version "3.312.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-iam/-/client-iam-3.312.0.tgz#dd66540cd5ecbdf65bb4853c2511159d0bc4a1a7" + integrity sha512-x2jF7teKZ/DbrRreVdLTddJOKDDJ81TVKGklJyB4YJgARAlrwfxxC7jAp9sF+T/HlnZ2HmLkdn1Tan4rVTetEA== dependencies: "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sts" "3.290.0" - "@aws-sdk/config-resolver" "3.290.0" - "@aws-sdk/credential-provider-node" "3.290.0" - "@aws-sdk/fetch-http-handler" "3.290.0" - "@aws-sdk/hash-node" "3.290.0" - "@aws-sdk/invalid-dependency" "3.290.0" - "@aws-sdk/middleware-content-length" "3.290.0" - "@aws-sdk/middleware-endpoint" "3.290.0" - "@aws-sdk/middleware-host-header" "3.290.0" - "@aws-sdk/middleware-logger" "3.290.0" - "@aws-sdk/middleware-recursion-detection" "3.290.0" - "@aws-sdk/middleware-retry" "3.290.0" - "@aws-sdk/middleware-serde" "3.290.0" - "@aws-sdk/middleware-signing" "3.290.0" - "@aws-sdk/middleware-stack" "3.290.0" - "@aws-sdk/middleware-user-agent" "3.290.0" - "@aws-sdk/node-config-provider" "3.290.0" - "@aws-sdk/node-http-handler" "3.290.0" - "@aws-sdk/protocol-http" "3.290.0" - "@aws-sdk/smithy-client" "3.290.0" - "@aws-sdk/types" "3.290.0" - "@aws-sdk/url-parser" "3.290.0" - "@aws-sdk/util-base64" "3.208.0" - "@aws-sdk/util-body-length-browser" "3.188.0" - "@aws-sdk/util-body-length-node" "3.208.0" - "@aws-sdk/util-defaults-mode-browser" "3.290.0" - "@aws-sdk/util-defaults-mode-node" "3.290.0" - "@aws-sdk/util-endpoints" "3.290.0" - "@aws-sdk/util-retry" "3.290.0" - "@aws-sdk/util-user-agent-browser" "3.290.0" - "@aws-sdk/util-user-agent-node" "3.290.0" - "@aws-sdk/util-utf8" "3.254.0" - "@aws-sdk/util-waiter" "3.290.0" + "@aws-sdk/client-sts" "3.312.0" + "@aws-sdk/config-resolver" "3.310.0" + "@aws-sdk/credential-provider-node" "3.310.0" + "@aws-sdk/fetch-http-handler" "3.310.0" + "@aws-sdk/hash-node" "3.310.0" + "@aws-sdk/invalid-dependency" "3.310.0" + "@aws-sdk/middleware-content-length" "3.310.0" + "@aws-sdk/middleware-endpoint" "3.310.0" + "@aws-sdk/middleware-host-header" "3.310.0" + "@aws-sdk/middleware-logger" "3.310.0" + "@aws-sdk/middleware-recursion-detection" "3.310.0" + "@aws-sdk/middleware-retry" "3.310.0" + "@aws-sdk/middleware-serde" "3.310.0" + "@aws-sdk/middleware-signing" "3.310.0" + "@aws-sdk/middleware-stack" "3.310.0" + "@aws-sdk/middleware-user-agent" "3.310.0" + "@aws-sdk/node-config-provider" "3.310.0" + "@aws-sdk/node-http-handler" "3.310.0" + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/smithy-client" "3.310.0" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/url-parser" "3.310.0" + "@aws-sdk/util-base64" "3.310.0" + "@aws-sdk/util-body-length-browser" "3.310.0" + "@aws-sdk/util-body-length-node" "3.310.0" + "@aws-sdk/util-defaults-mode-browser" "3.310.0" + "@aws-sdk/util-defaults-mode-node" "3.310.0" + "@aws-sdk/util-endpoints" "3.310.0" + "@aws-sdk/util-retry" "3.310.0" + "@aws-sdk/util-user-agent-browser" "3.310.0" + "@aws-sdk/util-user-agent-node" "3.310.0" + "@aws-sdk/util-utf8" "3.310.0" + "@aws-sdk/util-waiter" "3.310.0" fast-xml-parser "4.1.2" - tslib "^2.3.1" + tslib "^2.5.0" -"@aws-sdk/client-rds@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-rds/-/client-rds-3.290.0.tgz#9d10c160a366c3e7e762dbd6df3184df89525d72" - integrity sha512-oysKCy3e5b/U4EdohVRbgUEYeHjQggg/KjSauSnuGAHohs5Dz07FxgltkhzpVJEDmaQvjIzrrm+chI4LIgZCGQ== +"@aws-sdk/client-rds@3.314.0": + version "3.314.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-rds/-/client-rds-3.314.0.tgz#8e9cc272a2acfbbc3c976dec1db13f84c4b2fc44" + integrity sha512-+jvimITTzmDkMNwAh2vV4+r22GZWF1TCdCiQqB1+djApmfifUFSEGyDrNRpHOKYeBhDR6mHPVC+qW5hs8XWr6A== dependencies: "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sts" "3.290.0" - "@aws-sdk/config-resolver" "3.290.0" - "@aws-sdk/credential-provider-node" "3.290.0" - "@aws-sdk/fetch-http-handler" "3.290.0" - "@aws-sdk/hash-node" "3.290.0" - "@aws-sdk/invalid-dependency" "3.290.0" - "@aws-sdk/middleware-content-length" "3.290.0" - "@aws-sdk/middleware-endpoint" "3.290.0" - "@aws-sdk/middleware-host-header" "3.290.0" - "@aws-sdk/middleware-logger" "3.290.0" - "@aws-sdk/middleware-recursion-detection" "3.290.0" - "@aws-sdk/middleware-retry" "3.290.0" - "@aws-sdk/middleware-sdk-rds" "3.290.0" - "@aws-sdk/middleware-serde" "3.290.0" - "@aws-sdk/middleware-signing" "3.290.0" - "@aws-sdk/middleware-stack" "3.290.0" - "@aws-sdk/middleware-user-agent" "3.290.0" - "@aws-sdk/node-config-provider" "3.290.0" - "@aws-sdk/node-http-handler" "3.290.0" - "@aws-sdk/protocol-http" "3.290.0" - "@aws-sdk/smithy-client" "3.290.0" - "@aws-sdk/types" "3.290.0" - "@aws-sdk/url-parser" "3.290.0" - "@aws-sdk/util-base64" "3.208.0" - "@aws-sdk/util-body-length-browser" "3.188.0" - "@aws-sdk/util-body-length-node" "3.208.0" - "@aws-sdk/util-defaults-mode-browser" "3.290.0" - "@aws-sdk/util-defaults-mode-node" "3.290.0" - "@aws-sdk/util-endpoints" "3.290.0" - "@aws-sdk/util-retry" "3.290.0" - "@aws-sdk/util-user-agent-browser" "3.290.0" - "@aws-sdk/util-user-agent-node" "3.290.0" - "@aws-sdk/util-utf8" "3.254.0" - "@aws-sdk/util-waiter" "3.290.0" + "@aws-sdk/client-sts" "3.312.0" + "@aws-sdk/config-resolver" "3.310.0" + "@aws-sdk/credential-provider-node" "3.310.0" + "@aws-sdk/fetch-http-handler" "3.310.0" + "@aws-sdk/hash-node" "3.310.0" + "@aws-sdk/invalid-dependency" "3.310.0" + "@aws-sdk/middleware-content-length" "3.310.0" + "@aws-sdk/middleware-endpoint" "3.310.0" + "@aws-sdk/middleware-host-header" "3.310.0" + "@aws-sdk/middleware-logger" "3.310.0" + "@aws-sdk/middleware-recursion-detection" "3.310.0" + "@aws-sdk/middleware-retry" "3.310.0" + "@aws-sdk/middleware-sdk-rds" "3.310.0" + "@aws-sdk/middleware-serde" "3.310.0" + "@aws-sdk/middleware-signing" "3.310.0" + "@aws-sdk/middleware-stack" "3.310.0" + "@aws-sdk/middleware-user-agent" "3.310.0" + "@aws-sdk/node-config-provider" "3.310.0" + "@aws-sdk/node-http-handler" "3.310.0" + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/smithy-client" "3.310.0" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/url-parser" "3.310.0" + "@aws-sdk/util-base64" "3.310.0" + "@aws-sdk/util-body-length-browser" "3.310.0" + "@aws-sdk/util-body-length-node" "3.310.0" + "@aws-sdk/util-defaults-mode-browser" "3.310.0" + "@aws-sdk/util-defaults-mode-node" "3.310.0" + "@aws-sdk/util-endpoints" "3.310.0" + "@aws-sdk/util-retry" "3.310.0" + "@aws-sdk/util-user-agent-browser" "3.310.0" + "@aws-sdk/util-user-agent-node" "3.310.0" + "@aws-sdk/util-utf8" "3.310.0" + "@aws-sdk/util-waiter" "3.310.0" fast-xml-parser "4.1.2" - tslib "^2.3.1" + tslib "^2.5.0" -"@aws-sdk/client-s3@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.290.0.tgz#c887859ae8b275b3e6cef0f1263ef833268e38c8" - integrity sha512-3QVUyE5rvvM1Td9/5DS9iEZMXQsbqOuV1CMskDgD1/6Iav3OeGsBzDswifova5Tn6gRtDRxmNOZG1UH//7QZMw== +"@aws-sdk/client-s3@3.312.0": + version "3.312.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.312.0.tgz#d5f286f38db04612dad46407d0115e7a5755e8a1" + integrity sha512-aqlll2g7eKwV0j+IAK4Ly7c0CRVSI712VTdItAWpLSQPw1VVUP9IKaIsBTiigoOBCJq+fb2+ufFrSTUAPdEzPQ== dependencies: "@aws-crypto/sha1-browser" "3.0.0" "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sts" "3.290.0" - "@aws-sdk/config-resolver" "3.290.0" - "@aws-sdk/credential-provider-node" "3.290.0" - "@aws-sdk/eventstream-serde-browser" "3.290.0" - "@aws-sdk/eventstream-serde-config-resolver" "3.290.0" - "@aws-sdk/eventstream-serde-node" "3.290.0" - "@aws-sdk/fetch-http-handler" "3.290.0" - "@aws-sdk/hash-blob-browser" "3.290.0" - "@aws-sdk/hash-node" "3.290.0" - "@aws-sdk/hash-stream-node" "3.290.0" - "@aws-sdk/invalid-dependency" "3.290.0" - "@aws-sdk/md5-js" "3.290.0" - "@aws-sdk/middleware-bucket-endpoint" "3.290.0" - "@aws-sdk/middleware-content-length" "3.290.0" - "@aws-sdk/middleware-endpoint" "3.290.0" - "@aws-sdk/middleware-expect-continue" "3.290.0" - "@aws-sdk/middleware-flexible-checksums" "3.290.0" - "@aws-sdk/middleware-host-header" "3.290.0" - "@aws-sdk/middleware-location-constraint" "3.290.0" - "@aws-sdk/middleware-logger" "3.290.0" - "@aws-sdk/middleware-recursion-detection" "3.290.0" - "@aws-sdk/middleware-retry" "3.290.0" - "@aws-sdk/middleware-sdk-s3" "3.290.0" - "@aws-sdk/middleware-serde" "3.290.0" - "@aws-sdk/middleware-signing" "3.290.0" - "@aws-sdk/middleware-ssec" "3.290.0" - "@aws-sdk/middleware-stack" "3.290.0" - "@aws-sdk/middleware-user-agent" "3.290.0" - "@aws-sdk/node-config-provider" "3.290.0" - "@aws-sdk/node-http-handler" "3.290.0" - "@aws-sdk/protocol-http" "3.290.0" - "@aws-sdk/signature-v4-multi-region" "3.290.0" - "@aws-sdk/smithy-client" "3.290.0" - "@aws-sdk/types" "3.290.0" - "@aws-sdk/url-parser" "3.290.0" - "@aws-sdk/util-base64" "3.208.0" - "@aws-sdk/util-body-length-browser" "3.188.0" - "@aws-sdk/util-body-length-node" "3.208.0" - "@aws-sdk/util-defaults-mode-browser" "3.290.0" - "@aws-sdk/util-defaults-mode-node" "3.290.0" - "@aws-sdk/util-endpoints" "3.290.0" - "@aws-sdk/util-retry" "3.290.0" - "@aws-sdk/util-stream-browser" "3.290.0" - "@aws-sdk/util-stream-node" "3.290.0" - "@aws-sdk/util-user-agent-browser" "3.290.0" - "@aws-sdk/util-user-agent-node" "3.290.0" - "@aws-sdk/util-utf8" "3.254.0" - "@aws-sdk/util-waiter" "3.290.0" - "@aws-sdk/xml-builder" "3.201.0" + "@aws-sdk/client-sts" "3.312.0" + "@aws-sdk/config-resolver" "3.310.0" + "@aws-sdk/credential-provider-node" "3.310.0" + "@aws-sdk/eventstream-serde-browser" "3.310.0" + "@aws-sdk/eventstream-serde-config-resolver" "3.310.0" + "@aws-sdk/eventstream-serde-node" "3.310.0" + "@aws-sdk/fetch-http-handler" "3.310.0" + "@aws-sdk/hash-blob-browser" "3.310.0" + "@aws-sdk/hash-node" "3.310.0" + "@aws-sdk/hash-stream-node" "3.310.0" + "@aws-sdk/invalid-dependency" "3.310.0" + "@aws-sdk/md5-js" "3.310.0" + "@aws-sdk/middleware-bucket-endpoint" "3.310.0" + "@aws-sdk/middleware-content-length" "3.310.0" + "@aws-sdk/middleware-endpoint" "3.310.0" + "@aws-sdk/middleware-expect-continue" "3.310.0" + "@aws-sdk/middleware-flexible-checksums" "3.310.0" + "@aws-sdk/middleware-host-header" "3.310.0" + "@aws-sdk/middleware-location-constraint" "3.310.0" + "@aws-sdk/middleware-logger" "3.310.0" + "@aws-sdk/middleware-recursion-detection" "3.310.0" + "@aws-sdk/middleware-retry" "3.310.0" + "@aws-sdk/middleware-sdk-s3" "3.310.0" + "@aws-sdk/middleware-serde" "3.310.0" + "@aws-sdk/middleware-signing" "3.310.0" + "@aws-sdk/middleware-ssec" "3.310.0" + "@aws-sdk/middleware-stack" "3.310.0" + "@aws-sdk/middleware-user-agent" "3.310.0" + "@aws-sdk/node-config-provider" "3.310.0" + "@aws-sdk/node-http-handler" "3.310.0" + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/signature-v4-multi-region" "3.310.0" + "@aws-sdk/smithy-client" "3.310.0" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/url-parser" "3.310.0" + "@aws-sdk/util-base64" "3.310.0" + "@aws-sdk/util-body-length-browser" "3.310.0" + "@aws-sdk/util-body-length-node" "3.310.0" + "@aws-sdk/util-defaults-mode-browser" "3.310.0" + "@aws-sdk/util-defaults-mode-node" "3.310.0" + "@aws-sdk/util-endpoints" "3.310.0" + "@aws-sdk/util-retry" "3.310.0" + "@aws-sdk/util-stream-browser" "3.310.0" + "@aws-sdk/util-stream-node" "3.310.0" + "@aws-sdk/util-user-agent-browser" "3.310.0" + "@aws-sdk/util-user-agent-node" "3.310.0" + "@aws-sdk/util-utf8" "3.310.0" + "@aws-sdk/util-waiter" "3.310.0" + "@aws-sdk/xml-builder" "3.310.0" fast-xml-parser "4.1.2" - tslib "^2.3.1" + tslib "^2.5.0" -"@aws-sdk/client-sso-oidc@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.290.0.tgz#99e8fb91d30cea91f11f193c5953c395b42af4eb" - integrity sha512-/+OSYCjyf2TjA57beWLBjG05yPwWlpqK4gO3GwpVqfygaRh6g5jS0CBVQs+z+xc7gmI0weC/nhc+BXR9qcJJAA== +"@aws-sdk/client-sso-oidc@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.310.0.tgz#f71eeb9cc73c13661728cf88d8513b0209b6d265" + integrity sha512-3GKaRSfMD3OiYWGa+qg5KvJw0nLV0Vu7zRiulLuKDvgmWw3SNJKn3frWlmq/bKFUKahLsV8zozbeJItxtKAD6g== dependencies: "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/config-resolver" "3.290.0" - "@aws-sdk/fetch-http-handler" "3.290.0" - "@aws-sdk/hash-node" "3.290.0" - "@aws-sdk/invalid-dependency" "3.290.0" - "@aws-sdk/middleware-content-length" "3.290.0" - "@aws-sdk/middleware-endpoint" "3.290.0" - "@aws-sdk/middleware-host-header" "3.290.0" - "@aws-sdk/middleware-logger" "3.290.0" - "@aws-sdk/middleware-recursion-detection" "3.290.0" - "@aws-sdk/middleware-retry" "3.290.0" - "@aws-sdk/middleware-serde" "3.290.0" - "@aws-sdk/middleware-stack" "3.290.0" - "@aws-sdk/middleware-user-agent" "3.290.0" - "@aws-sdk/node-config-provider" "3.290.0" - "@aws-sdk/node-http-handler" "3.290.0" - "@aws-sdk/protocol-http" "3.290.0" - "@aws-sdk/smithy-client" "3.290.0" - "@aws-sdk/types" "3.290.0" - "@aws-sdk/url-parser" "3.290.0" - "@aws-sdk/util-base64" "3.208.0" - "@aws-sdk/util-body-length-browser" "3.188.0" - "@aws-sdk/util-body-length-node" "3.208.0" - "@aws-sdk/util-defaults-mode-browser" "3.290.0" - "@aws-sdk/util-defaults-mode-node" "3.290.0" - "@aws-sdk/util-endpoints" "3.290.0" - "@aws-sdk/util-retry" "3.290.0" - "@aws-sdk/util-user-agent-browser" "3.290.0" - "@aws-sdk/util-user-agent-node" "3.290.0" - "@aws-sdk/util-utf8" "3.254.0" - tslib "^2.3.1" + "@aws-sdk/config-resolver" "3.310.0" + "@aws-sdk/fetch-http-handler" "3.310.0" + "@aws-sdk/hash-node" "3.310.0" + "@aws-sdk/invalid-dependency" "3.310.0" + "@aws-sdk/middleware-content-length" "3.310.0" + "@aws-sdk/middleware-endpoint" "3.310.0" + "@aws-sdk/middleware-host-header" "3.310.0" + "@aws-sdk/middleware-logger" "3.310.0" + "@aws-sdk/middleware-recursion-detection" "3.310.0" + "@aws-sdk/middleware-retry" "3.310.0" + "@aws-sdk/middleware-serde" "3.310.0" + "@aws-sdk/middleware-stack" "3.310.0" + "@aws-sdk/middleware-user-agent" "3.310.0" + "@aws-sdk/node-config-provider" "3.310.0" + "@aws-sdk/node-http-handler" "3.310.0" + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/smithy-client" "3.310.0" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/url-parser" "3.310.0" + "@aws-sdk/util-base64" "3.310.0" + "@aws-sdk/util-body-length-browser" "3.310.0" + "@aws-sdk/util-body-length-node" "3.310.0" + "@aws-sdk/util-defaults-mode-browser" "3.310.0" + "@aws-sdk/util-defaults-mode-node" "3.310.0" + "@aws-sdk/util-endpoints" "3.310.0" + "@aws-sdk/util-retry" "3.310.0" + "@aws-sdk/util-user-agent-browser" "3.310.0" + "@aws-sdk/util-user-agent-node" "3.310.0" + "@aws-sdk/util-utf8" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/client-sso@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.290.0.tgz#59e4b1cb9644fd98cf0d428dd34b23bb91ca4037" - integrity sha512-FUFAbptuJSRKnzBgFJqXxusSG7PzECSqX0FnMh2vxCVu2PifaAE4stiMW8Myj8ABQAbfIrAWM+17upcrfmudoA== +"@aws-sdk/client-sso@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.310.0.tgz#1ead31442c34ed660479ea9317faab4f1fa47130" + integrity sha512-netFap3Mp9I7bzAjsswHPA5WEbQtNMmXvW9/IVb7tmf85/esXCWindtyI43e/Xerut9ZVyEACPBFn30CLLE2xQ== dependencies: "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/config-resolver" "3.290.0" - "@aws-sdk/fetch-http-handler" "3.290.0" - "@aws-sdk/hash-node" "3.290.0" - "@aws-sdk/invalid-dependency" "3.290.0" - "@aws-sdk/middleware-content-length" "3.290.0" - "@aws-sdk/middleware-endpoint" "3.290.0" - "@aws-sdk/middleware-host-header" "3.290.0" - "@aws-sdk/middleware-logger" "3.290.0" - "@aws-sdk/middleware-recursion-detection" "3.290.0" - "@aws-sdk/middleware-retry" "3.290.0" - "@aws-sdk/middleware-serde" "3.290.0" - "@aws-sdk/middleware-stack" "3.290.0" - "@aws-sdk/middleware-user-agent" "3.290.0" - "@aws-sdk/node-config-provider" "3.290.0" - "@aws-sdk/node-http-handler" "3.290.0" - "@aws-sdk/protocol-http" "3.290.0" - "@aws-sdk/smithy-client" "3.290.0" - "@aws-sdk/types" "3.290.0" - "@aws-sdk/url-parser" "3.290.0" - "@aws-sdk/util-base64" "3.208.0" - "@aws-sdk/util-body-length-browser" "3.188.0" - "@aws-sdk/util-body-length-node" "3.208.0" - "@aws-sdk/util-defaults-mode-browser" "3.290.0" - "@aws-sdk/util-defaults-mode-node" "3.290.0" - "@aws-sdk/util-endpoints" "3.290.0" - "@aws-sdk/util-retry" "3.290.0" - "@aws-sdk/util-user-agent-browser" "3.290.0" - "@aws-sdk/util-user-agent-node" "3.290.0" - "@aws-sdk/util-utf8" "3.254.0" - tslib "^2.3.1" + "@aws-sdk/config-resolver" "3.310.0" + "@aws-sdk/fetch-http-handler" "3.310.0" + "@aws-sdk/hash-node" "3.310.0" + "@aws-sdk/invalid-dependency" "3.310.0" + "@aws-sdk/middleware-content-length" "3.310.0" + "@aws-sdk/middleware-endpoint" "3.310.0" + "@aws-sdk/middleware-host-header" "3.310.0" + "@aws-sdk/middleware-logger" "3.310.0" + "@aws-sdk/middleware-recursion-detection" "3.310.0" + "@aws-sdk/middleware-retry" "3.310.0" + "@aws-sdk/middleware-serde" "3.310.0" + "@aws-sdk/middleware-stack" "3.310.0" + "@aws-sdk/middleware-user-agent" "3.310.0" + "@aws-sdk/node-config-provider" "3.310.0" + "@aws-sdk/node-http-handler" "3.310.0" + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/smithy-client" "3.310.0" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/url-parser" "3.310.0" + "@aws-sdk/util-base64" "3.310.0" + "@aws-sdk/util-body-length-browser" "3.310.0" + "@aws-sdk/util-body-length-node" "3.310.0" + "@aws-sdk/util-defaults-mode-browser" "3.310.0" + "@aws-sdk/util-defaults-mode-node" "3.310.0" + "@aws-sdk/util-endpoints" "3.310.0" + "@aws-sdk/util-retry" "3.310.0" + "@aws-sdk/util-user-agent-browser" "3.310.0" + "@aws-sdk/util-user-agent-node" "3.310.0" + "@aws-sdk/util-utf8" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/client-sts@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.290.0.tgz#ed5f88379e2c3740b095d8e3a9ce13b806a244f7" - integrity sha512-E2X/7tZLziKLgi/owYoUL5gcorGJrbM2tANJdJmaqVUPhPvoY4wU8P91pGPKon9nQj0RQexre5ClZawYD6lTzA== +"@aws-sdk/client-sts@3.312.0": + version "3.312.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.312.0.tgz#7b49a04bab2d12a8ca566ef579fd887b71986498" + integrity sha512-t0U7vRvWaMjrzBUo6tPrHe6HE97Blqx+b4GOjFbcbLtzxLlcRfhnWJik0Lp8hJtVqzNoN5mL4OeYgK7CRpL/Sw== dependencies: "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/config-resolver" "3.290.0" - "@aws-sdk/credential-provider-node" "3.290.0" - "@aws-sdk/fetch-http-handler" "3.290.0" - "@aws-sdk/hash-node" "3.290.0" - "@aws-sdk/invalid-dependency" "3.290.0" - "@aws-sdk/middleware-content-length" "3.290.0" - "@aws-sdk/middleware-endpoint" "3.290.0" - "@aws-sdk/middleware-host-header" "3.290.0" - "@aws-sdk/middleware-logger" "3.290.0" - "@aws-sdk/middleware-recursion-detection" "3.290.0" - "@aws-sdk/middleware-retry" "3.290.0" - "@aws-sdk/middleware-sdk-sts" "3.290.0" - "@aws-sdk/middleware-serde" "3.290.0" - "@aws-sdk/middleware-signing" "3.290.0" - "@aws-sdk/middleware-stack" "3.290.0" - "@aws-sdk/middleware-user-agent" "3.290.0" - "@aws-sdk/node-config-provider" "3.290.0" - "@aws-sdk/node-http-handler" "3.290.0" - "@aws-sdk/protocol-http" "3.290.0" - "@aws-sdk/smithy-client" "3.290.0" - "@aws-sdk/types" "3.290.0" - "@aws-sdk/url-parser" "3.290.0" - "@aws-sdk/util-base64" "3.208.0" - "@aws-sdk/util-body-length-browser" "3.188.0" - "@aws-sdk/util-body-length-node" "3.208.0" - "@aws-sdk/util-defaults-mode-browser" "3.290.0" - "@aws-sdk/util-defaults-mode-node" "3.290.0" - "@aws-sdk/util-endpoints" "3.290.0" - "@aws-sdk/util-retry" "3.290.0" - "@aws-sdk/util-user-agent-browser" "3.290.0" - "@aws-sdk/util-user-agent-node" "3.290.0" - "@aws-sdk/util-utf8" "3.254.0" + "@aws-sdk/config-resolver" "3.310.0" + "@aws-sdk/credential-provider-node" "3.310.0" + "@aws-sdk/fetch-http-handler" "3.310.0" + "@aws-sdk/hash-node" "3.310.0" + "@aws-sdk/invalid-dependency" "3.310.0" + "@aws-sdk/middleware-content-length" "3.310.0" + "@aws-sdk/middleware-endpoint" "3.310.0" + "@aws-sdk/middleware-host-header" "3.310.0" + "@aws-sdk/middleware-logger" "3.310.0" + "@aws-sdk/middleware-recursion-detection" "3.310.0" + "@aws-sdk/middleware-retry" "3.310.0" + "@aws-sdk/middleware-sdk-sts" "3.310.0" + "@aws-sdk/middleware-serde" "3.310.0" + "@aws-sdk/middleware-signing" "3.310.0" + "@aws-sdk/middleware-stack" "3.310.0" + "@aws-sdk/middleware-user-agent" "3.310.0" + "@aws-sdk/node-config-provider" "3.310.0" + "@aws-sdk/node-http-handler" "3.310.0" + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/smithy-client" "3.310.0" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/url-parser" "3.310.0" + "@aws-sdk/util-base64" "3.310.0" + "@aws-sdk/util-body-length-browser" "3.310.0" + "@aws-sdk/util-body-length-node" "3.310.0" + "@aws-sdk/util-defaults-mode-browser" "3.310.0" + "@aws-sdk/util-defaults-mode-node" "3.310.0" + "@aws-sdk/util-endpoints" "3.310.0" + "@aws-sdk/util-retry" "3.310.0" + "@aws-sdk/util-user-agent-browser" "3.310.0" + "@aws-sdk/util-user-agent-node" "3.310.0" + "@aws-sdk/util-utf8" "3.310.0" fast-xml-parser "4.1.2" - tslib "^2.3.1" + tslib "^2.5.0" -"@aws-sdk/config-resolver@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/config-resolver/-/config-resolver-3.290.0.tgz#400155b7d5e0a0215889f58e601ec334615585e1" - integrity sha512-Ovskri6IR4iBK0+3ttgjPSgOUEC+fd5tqRN5JlPCCZ9VwqwF/z26yYC4fAPaMUAJwPVRFeYYzQoszXGoxPyG7g== +"@aws-sdk/config-resolver@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/config-resolver/-/config-resolver-3.310.0.tgz#c02dce96546d5cd25551bc89907b27224e16ca7f" + integrity sha512-8vsT+/50lOqfDxka9m/rRt6oxv1WuGZoP8oPMk0Dt+TxXMbAzf4+rejBgiB96wshI1k3gLokYRjSQZn+dDtT8g== dependencies: - "@aws-sdk/signature-v4" "3.290.0" - "@aws-sdk/types" "3.290.0" - "@aws-sdk/util-config-provider" "3.208.0" - "@aws-sdk/util-middleware" "3.290.0" - tslib "^2.3.1" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/util-config-provider" "3.310.0" + "@aws-sdk/util-middleware" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/credential-provider-env@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.290.0.tgz#da262156d7679f33c0edd75578221b64f3314266" - integrity sha512-gWsllElBm4DWZcc42Zb6sxaw77KBf6cY9iEezbVzVbJioqR9hIr1Pq3Nx30z1Q+1KiHSnt/Wl9cYYHOoNw2DnQ== +"@aws-sdk/credential-provider-env@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.310.0.tgz#c52694fb276341db6ce4e816cf9ca90fa5830dad" + integrity sha512-vvIPQpI16fj95xwS7M3D48F7QhZJBnnCgB5lR+b7So+vsG9ibm1mZRVGzVpdxCvgyOhHFbvrby9aalNJmmIP1A== dependencies: - "@aws-sdk/property-provider" "3.290.0" - "@aws-sdk/types" "3.290.0" - tslib "^2.3.1" + "@aws-sdk/property-provider" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/credential-provider-imds@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.290.0.tgz#3cf65860defad4cd9af266c1a96193a6dce94075" - integrity sha512-PkYEs7zzUVWnhkR9TlU1ORDcCnkD7qoqR1loXXSZc+EIOX9M7f+sXGLtCXVl9wV1Ekx3a5Tjud+aQcOJjjFePA== +"@aws-sdk/credential-provider-imds@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.310.0.tgz#d8fb1223fee7e289a81e28177fe55dedf4d2745e" + integrity sha512-baxK7Zp6dai5AGW01FIW27xS2KAaPUmKLIXv5SvFYsUgXXvNW55im4uG3b+2gA0F7V+hXvVBH08OEqmwW6we5w== dependencies: - "@aws-sdk/node-config-provider" "3.290.0" - "@aws-sdk/property-provider" "3.290.0" - "@aws-sdk/types" "3.290.0" - "@aws-sdk/url-parser" "3.290.0" - tslib "^2.3.1" + "@aws-sdk/node-config-provider" "3.310.0" + "@aws-sdk/property-provider" "3.310.0" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/url-parser" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/credential-provider-ini@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.290.0.tgz#7062a952d57310c721fb09d1468333777f63e375" - integrity sha512-n3OGvkvNgMS6Kb2fuFrmNeCI8CP7DGOsEvcfYPMiXsQWx9hHAh/XIv7ksD3TL5Mn8Dr0NHmB6uY5WgUZDatqfw== - dependencies: - "@aws-sdk/credential-provider-env" "3.290.0" - "@aws-sdk/credential-provider-imds" "3.290.0" - "@aws-sdk/credential-provider-process" "3.290.0" - "@aws-sdk/credential-provider-sso" "3.290.0" - "@aws-sdk/credential-provider-web-identity" "3.290.0" - "@aws-sdk/property-provider" "3.290.0" - "@aws-sdk/shared-ini-file-loader" "3.290.0" - "@aws-sdk/types" "3.290.0" - tslib "^2.3.1" +"@aws-sdk/credential-provider-ini@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.310.0.tgz#c317c803b78d6b322a440de15069b35b88c737e5" + integrity sha512-gtRz7I+4BBpwZ3tc6UIt5lQuiAFnkpOibxHh95x1M6HDxBjm+uqD6RPZYVH+dULZPYXOtOTsHV0IGjrcV0sSRg== + dependencies: + "@aws-sdk/credential-provider-env" "3.310.0" + "@aws-sdk/credential-provider-imds" "3.310.0" + "@aws-sdk/credential-provider-process" "3.310.0" + "@aws-sdk/credential-provider-sso" "3.310.0" + "@aws-sdk/credential-provider-web-identity" "3.310.0" + "@aws-sdk/property-provider" "3.310.0" + "@aws-sdk/shared-ini-file-loader" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/credential-provider-node@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.290.0.tgz#d9444ae189d545b8cac8a52f578e79b2687a2b38" - integrity sha512-snLmeD7yAYq1x7lngCTM1VGmHYCZ4iUW5JRG9XPr7Npl7VWVdnNqaf5XBYEANgaFoWxjN3dNyDPg05+5Ew6QCA== - dependencies: - "@aws-sdk/credential-provider-env" "3.290.0" - "@aws-sdk/credential-provider-imds" "3.290.0" - "@aws-sdk/credential-provider-ini" "3.290.0" - "@aws-sdk/credential-provider-process" "3.290.0" - "@aws-sdk/credential-provider-sso" "3.290.0" - "@aws-sdk/credential-provider-web-identity" "3.290.0" - "@aws-sdk/property-provider" "3.290.0" - "@aws-sdk/shared-ini-file-loader" "3.290.0" - "@aws-sdk/types" "3.290.0" - tslib "^2.3.1" +"@aws-sdk/credential-provider-node@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.310.0.tgz#e4f69cf95e839c626c41e23b1d8b3cd24c667d8e" + integrity sha512-FrOztUcOq2Sp32xGtJvxfvdlmuAeoxIu/AElHzV1bkx6Pzo9DkQBhXrSQ+JFSpI++weOD4ZGFhAvgbgUOT4VAg== + dependencies: + "@aws-sdk/credential-provider-env" "3.310.0" + "@aws-sdk/credential-provider-imds" "3.310.0" + "@aws-sdk/credential-provider-ini" "3.310.0" + "@aws-sdk/credential-provider-process" "3.310.0" + "@aws-sdk/credential-provider-sso" "3.310.0" + "@aws-sdk/credential-provider-web-identity" "3.310.0" + "@aws-sdk/property-provider" "3.310.0" + "@aws-sdk/shared-ini-file-loader" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/credential-provider-process@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.290.0.tgz#aaae9f198810c2b4f586689fb359a2382723d737" - integrity sha512-PNnWDYSaE8dMepH59cyrXs45Ucdmzdnyuhcn/fVwQ0Nc7FzESxw1G7SgJZhYF4tMRDiepu6lbFEN0QXsTIM8Iw== +"@aws-sdk/credential-provider-process@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.310.0.tgz#0b2ee77f0c48262442d2768044d72332a4ad8884" + integrity sha512-h73sg6GPMUWC+3zMCbA1nZ2O03nNJt7G96JdmnantiXBwHpRKWW8nBTLzx5uhXn6hTuTaoQRP/P+oxQJKYdMmA== dependencies: - "@aws-sdk/property-provider" "3.290.0" - "@aws-sdk/shared-ini-file-loader" "3.290.0" - "@aws-sdk/types" "3.290.0" - tslib "^2.3.1" + "@aws-sdk/property-provider" "3.310.0" + "@aws-sdk/shared-ini-file-loader" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/credential-provider-sso@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.290.0.tgz#02d5bdf54f6611169a07656b58a026927f9c33a7" - integrity sha512-tX5Ez3EiMrXDx6Vsn2gMq7ga3y4iyPneenCNToRUlmZrhF61DhMfA22gRwdwuP8hlFKXY4LRg51pBfJeq0ga8w== +"@aws-sdk/credential-provider-sso@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.310.0.tgz#86ab095ede5024a4e16aabaf3b2fa92d61656b8d" + integrity sha512-nXkpT8mrM/wRqSiz/a4p9U2UrOKyfZXhbPHIHyQj8K+uLjsYS+WPuH287J4A5Q57A6uarTrj5RjHmVeZVLaHmg== dependencies: - "@aws-sdk/client-sso" "3.290.0" - "@aws-sdk/property-provider" "3.290.0" - "@aws-sdk/shared-ini-file-loader" "3.290.0" - "@aws-sdk/token-providers" "3.290.0" - "@aws-sdk/types" "3.290.0" - tslib "^2.3.1" + "@aws-sdk/client-sso" "3.310.0" + "@aws-sdk/property-provider" "3.310.0" + "@aws-sdk/shared-ini-file-loader" "3.310.0" + "@aws-sdk/token-providers" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/credential-provider-web-identity@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.290.0.tgz#4aecad2bcc4e4dbc56ad52872b332ec3ce10ae22" - integrity sha512-Apv6AnYtb5LTUreDVsqlXFNgiU0TQAZ8sfPg23pGrBGZvZU3KfDhF9n5j0i9Uca44O+/vB7UvbbvNAZS200vsQ== +"@aws-sdk/credential-provider-web-identity@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.310.0.tgz#c9fa09b0068027e58d31178e3fa06bf4e9ae9d36" + integrity sha512-H4SzuZXILNhK6/IR1uVvsUDZvzc051hem7GLyYghBCu8mU+tq28YhKE8MfSroi6eL2e5Vujloij1OM2EQQkPkw== dependencies: - "@aws-sdk/property-provider" "3.290.0" - "@aws-sdk/types" "3.290.0" - tslib "^2.3.1" + "@aws-sdk/property-provider" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/eventstream-codec@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-codec/-/eventstream-codec-3.290.0.tgz#fb8f337da457a17ba89fafc5850de89199ccb84f" - integrity sha512-rUIEOTJhB/Up7FSUkrjmIExdJcmDP9Y1uMtnuhFcLhVXlELZ+tB0AfYCcbUBt8ZeMvrULlb+OkxWwHPyh8qkAA== +"@aws-sdk/eventstream-codec@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-codec/-/eventstream-codec-3.310.0.tgz#a5def3633f7ccdc3d477fd0b05e2eb31c5598ed9" + integrity sha512-clIeSgWbZbxwtsxZ/yoedNM0/kJFSIjjHPikuDGhxhqc+vP6TN3oYyVMFrYwFaTFhk2+S5wZcWYMw8Op1pWo+A== dependencies: "@aws-crypto/crc32" "3.0.0" - "@aws-sdk/types" "3.290.0" - "@aws-sdk/util-hex-encoding" "3.201.0" - tslib "^2.3.1" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/util-hex-encoding" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/eventstream-serde-browser@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-browser/-/eventstream-serde-browser-3.290.0.tgz#126636883c0ba8a8dacfb2aa424df6926b67e5ad" - integrity sha512-6XOtQh8Zj8AoEiF7oA+4iN4KsrtFFggkKzY+5g+NMNE9Z0vyQlc1Vo7MngicmxlX1l35KUW9Xe1DfAvCVzNUBQ== +"@aws-sdk/eventstream-serde-browser@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-browser/-/eventstream-serde-browser-3.310.0.tgz#02aef0262b5f740a1c8ffbdeb8459542f90c14dd" + integrity sha512-3S6ziuQVALgEyz0TANGtYDVeG8ArK4Y05mcgrs8qUTmsvlDIXX37cR/DvmVbNB76M4IrsZeSAIajL9644CywkA== dependencies: - "@aws-sdk/eventstream-serde-universal" "3.290.0" - "@aws-sdk/types" "3.290.0" - tslib "^2.3.1" + "@aws-sdk/eventstream-serde-universal" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/eventstream-serde-config-resolver@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.290.0.tgz#b9a89d405338fed549a51e26d6debfa374a06d85" - integrity sha512-nmHvgc21x79Q7ATMU2d3POKOjfs5zA2s407JAek6JAK4dpq+XO8B7sX9HcHlZc8+81z4LkWfdfsOC7fcgUaTPA== +"@aws-sdk/eventstream-serde-config-resolver@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.310.0.tgz#e4e2358f36b9eb6d37da0a0f0d3fc32da91ad6b4" + integrity sha512-8s1Qdn9STj+sV75nUp9yt0W6fHS4BZ2jTm4Z/1Pcbvh2Gqs0WjH5n2StS+pDW5Y9J/HSGBl0ogmUr5lC5bXFHg== dependencies: - "@aws-sdk/types" "3.290.0" - tslib "^2.3.1" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/eventstream-serde-node@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-node/-/eventstream-serde-node-3.290.0.tgz#f20457ba5faecb89226c88f3888164bc6d86ca18" - integrity sha512-iD7tkWSf5I9ah6S5iL/Tc93fAC0QYZqyhKd2qKaNjF0o8draNjXWX2Bq16YrWH1H3eJBAAYAQZI7ldEP+mwccw== +"@aws-sdk/eventstream-serde-node@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-node/-/eventstream-serde-node-3.310.0.tgz#6e0fbc400bac677c77b946fd2a5cb00b57503c0e" + integrity sha512-kSnRomCgW43K9TmQYuwN9+AoYPnhyOKroanUMyZEzJk7rpCPMj4OzaUpXfDYOvznFNYn7NLaH6nHLJAr0VPlJA== dependencies: - "@aws-sdk/eventstream-serde-universal" "3.290.0" - "@aws-sdk/types" "3.290.0" - tslib "^2.3.1" + "@aws-sdk/eventstream-serde-universal" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/eventstream-serde-universal@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-universal/-/eventstream-serde-universal-3.290.0.tgz#8f3040ced8d5425f3624eefdac40f7cf6617015a" - integrity sha512-5Rz1Z+Oj9WR/NpazjgQBSapPCGUX63PHXprdv9FPeZdwkRH/ZBF1Bs4lOqixiZOcz9YX8UFtBBgrKCYH9JjtnQ== +"@aws-sdk/eventstream-serde-universal@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-universal/-/eventstream-serde-universal-3.310.0.tgz#d0f95eaafb8fd09d9a21aec8f23b7f3cee2bb19a" + integrity sha512-Qyjt5k/waV5cDukpgT824ISZAz5U0pwzLz5ztR409u85AGNkF/9n7MS+LSyBUBSb0WJ5pUeSD47WBk+nLq9Nhw== dependencies: - "@aws-sdk/eventstream-codec" "3.290.0" - "@aws-sdk/types" "3.290.0" - tslib "^2.3.1" + "@aws-sdk/eventstream-codec" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/fetch-http-handler@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.290.0.tgz#53265b0f463f7e4c0266c1c7ad1233d0df88f5b4" - integrity sha512-hehbIxcqyJeiUBTbbP3C4tmY2p9UIh7bnLTKhocqaUcdEXQwlIRiQlnnA+TrQ5Uyoe+W3fAmv25tq08rB9ddhw== +"@aws-sdk/fetch-http-handler@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.310.0.tgz#f31006b7b3103683d72e177cd27d80354f7a37c4" + integrity sha512-Bi9vIwzdkw1zMcvi/zGzlWS9KfIEnAq4NNhsnCxbQ4OoIRU9wvU+WGZdBBhxg0ZxZmpp1j1aZhU53lLjA07MHw== dependencies: - "@aws-sdk/protocol-http" "3.290.0" - "@aws-sdk/querystring-builder" "3.290.0" - "@aws-sdk/types" "3.290.0" - "@aws-sdk/util-base64" "3.208.0" - tslib "^2.3.1" + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/querystring-builder" "3.310.0" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/util-base64" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/hash-blob-browser@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/hash-blob-browser/-/hash-blob-browser-3.290.0.tgz#20a7db4810201dccaa9aeac4391f3b4320df381d" - integrity sha512-unKp9whdBAomUEHTfAYd/qloNNQG60eEw13RHysWdrN44Megaqu8y4HHRQEkfNxqXss5ERHpMja8uBj9gE7kEA== +"@aws-sdk/hash-blob-browser@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/hash-blob-browser/-/hash-blob-browser-3.310.0.tgz#762a56ae655e3bcd0ba46bbc39e8b370b1067629" + integrity sha512-OoR8p0cbypToysLT0v3o2oyjy6+DKrY7GNCAzHOHJK9xmqXCt+DsjKoPeiY7o1sWX2aN6Plmvubj/zWxMKEn/A== dependencies: - "@aws-sdk/chunked-blob-reader" "3.188.0" - "@aws-sdk/chunked-blob-reader-native" "3.208.0" - "@aws-sdk/types" "3.290.0" - tslib "^2.3.1" + "@aws-sdk/chunked-blob-reader" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/hash-node@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/hash-node/-/hash-node-3.290.0.tgz#bce2a6d79c13a07db7240b3df4f5daebb419a78f" - integrity sha512-ayqJBOPoMa3H3eUhZHPu9ikNjoydu3nxj+R6tp8nMrKfFYDUu0XCdkpB0Wk/EBpMyWA2ZeyyfgXEUtQkqkAWBA== +"@aws-sdk/hash-node@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/hash-node/-/hash-node-3.310.0.tgz#4c1c89b9a2da3bb9783de84f0b762cc055b90d67" + integrity sha512-NvE2fhRc8GRwCXBfDehxVAWCmVwVMILliAKVPAEr4yz2CkYs0tqU51S48x23dtna07H4qHtgpeNqVTthcIQOEQ== dependencies: - "@aws-sdk/types" "3.290.0" - "@aws-sdk/util-buffer-from" "3.208.0" - "@aws-sdk/util-utf8" "3.254.0" - tslib "^2.3.1" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/util-buffer-from" "3.310.0" + "@aws-sdk/util-utf8" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/hash-stream-node@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/hash-stream-node/-/hash-stream-node-3.290.0.tgz#78bb68726f52848c3facf8b9ccabc4362daa202b" - integrity sha512-6IjHrcD9qi3QIPNT8yGWNiMGdqvPru9lJX5tDSuZSe8cNOIRKFRSLkpQIRPdQLBQLbyJSX0MkwZ+apo6K7H09g== +"@aws-sdk/hash-stream-node@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/hash-stream-node/-/hash-stream-node-3.310.0.tgz#3845d813a7de476c56fac492a50ffa8af265f120" + integrity sha512-ZoXdybNgvMz1Hl6k/e32xVL3jmG5p2IEk5mTtLfFEuskTJ74Z+VMYKkkF1whyy7KQfH83H+TQGnsGtlRCchQKw== dependencies: - "@aws-sdk/types" "3.290.0" - "@aws-sdk/util-utf8" "3.254.0" - tslib "^2.3.1" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/util-utf8" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/invalid-dependency@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/invalid-dependency/-/invalid-dependency-3.290.0.tgz#2952ce8322be4cce75d8f82756f70e9b7f409b3d" - integrity sha512-plJpEJ+PPTrpaMfg5KKsAfdXUi6iUZTc/PgP0/CPqCe3kuiWb1xb2GeTxOL5InzfBffVdHWeTanYu9+V0MIxVw== +"@aws-sdk/invalid-dependency@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/invalid-dependency/-/invalid-dependency-3.310.0.tgz#b96da9b9f63b12d1c390f9a06eeb28840fcb5b3c" + integrity sha512-1s5RG5rSPXoa/aZ/Kqr5U/7lqpx+Ry81GprQ2bxWqJvWQIJ0IRUwo5pk8XFxbKVr/2a+4lZT/c3OGoBOM1yRRA== dependencies: - "@aws-sdk/types" "3.290.0" - tslib "^2.3.1" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/is-array-buffer@3.201.0": - version "3.201.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz#06e557adc284fac2f26071c2944ae01f61b95854" - integrity sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg== +"@aws-sdk/is-array-buffer@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/is-array-buffer/-/is-array-buffer-3.310.0.tgz#f87a79f1b858c88744f07e8d8d0a791df204017e" + integrity sha512-urnbcCR+h9NWUnmOtet/s4ghvzsidFmspfhYaHAmSRdy9yDjdjBJMFjjsn85A1ODUktztm+cVncXjQ38WCMjMQ== dependencies: - tslib "^2.3.1" + tslib "^2.5.0" -"@aws-sdk/md5-js@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/md5-js/-/md5-js-3.290.0.tgz#c9cb2898139bd4ef98947666ee0bb534ab2db699" - integrity sha512-5JQfZObsehgX0S81j3nxS/X0wiXESisETQVG75HAUHfDiScojClfjc2WuOXCwChy3S6VZgjLpEbqEQ3CaFQKWg== +"@aws-sdk/md5-js@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/md5-js/-/md5-js-3.310.0.tgz#14e3d570d92808e68ccc0db8d7492ebdb93f15b5" + integrity sha512-x5sRBUrEfLWAS1EhwbbDQ7cXq6uvBxh3qR2XAsnGvFFceTeAadk7cVogWxlk3PC+OCeeym7c3/6Bv2HQ2f1YyQ== dependencies: - "@aws-sdk/types" "3.290.0" - "@aws-sdk/util-utf8" "3.254.0" - tslib "^2.3.1" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/util-utf8" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/middleware-bucket-endpoint@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.290.0.tgz#fe9dd4d6eeef9f0e674689aec6689cdd34f6288d" - integrity sha512-jFHcAdIXfyqcHFzldqDDEZ2qPi9GNsWMDCiKqMumOqWJvwzCzkzsNa0A+6nUnOd/eDLDslvbktrD296Qy8oLKA== +"@aws-sdk/middleware-bucket-endpoint@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.310.0.tgz#5dd9b028498a0492c3e773c0aca10d6ded929fc6" + integrity sha512-uJJfHI7v4AgbJZRLtyI8ap2QRWkBokGc3iyUoQ+dVNT3/CE2ZCu694A6W+H0dRqg79dIE+f9CRNdtLGa/Ehhvg== dependencies: - "@aws-sdk/protocol-http" "3.290.0" - "@aws-sdk/types" "3.290.0" - "@aws-sdk/util-arn-parser" "3.208.0" - "@aws-sdk/util-config-provider" "3.208.0" - tslib "^2.3.1" + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/util-arn-parser" "3.310.0" + "@aws-sdk/util-config-provider" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/middleware-content-length@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-content-length/-/middleware-content-length-3.290.0.tgz#f304325c741e91303f2380c9c5e4000cdb9c3d11" - integrity sha512-9I+vnGSe/S0U98ZRCbOAdQngYfO7kYvXb5gjjX08XUQDfbB+ooIM1VdKngHhzUCTAs48z/43PzpBCjGJvGjB9w== +"@aws-sdk/middleware-content-length@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-content-length/-/middleware-content-length-3.310.0.tgz#cc9b6c25c10736cec41d0219c94b57cfdb4582a3" + integrity sha512-P8tQZxgDt6CAh1wd/W6WPzjc+uWPJwQkm+F7rAwRlM+k9q17HrhnksGDKcpuuLyIhPQYdmOMIkpKVgXGa4avhQ== dependencies: - "@aws-sdk/protocol-http" "3.290.0" - "@aws-sdk/types" "3.290.0" - tslib "^2.3.1" + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/middleware-endpoint@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.290.0.tgz#f1ccfd7dbb1675f749e827512715d3f33a2b7802" - integrity sha512-A7wIujIHHoQaQaqjlRynqoZ3S4S8ExYDReXUBwf4Dzx0wZ5A50owLMY9MKFyd9uukirZs8mDnPPYZuwUI4wR7w== - dependencies: - "@aws-sdk/middleware-serde" "3.290.0" - "@aws-sdk/protocol-http" "3.290.0" - "@aws-sdk/signature-v4" "3.290.0" - "@aws-sdk/types" "3.290.0" - "@aws-sdk/url-parser" "3.290.0" - "@aws-sdk/util-config-provider" "3.208.0" - "@aws-sdk/util-middleware" "3.290.0" - tslib "^2.3.1" +"@aws-sdk/middleware-endpoint@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.310.0.tgz#d4bf8ac3cd4800af789d6bcb469b7e8cfa10badb" + integrity sha512-Z+N2vOL8K354/lstkClxLLsr6hCpVRh+0tCMXrVj66/NtKysCEZ/0b9LmqOwD9pWHNiI2mJqXwY0gxNlKAroUg== + dependencies: + "@aws-sdk/middleware-serde" "3.310.0" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/url-parser" "3.310.0" + "@aws-sdk/util-middleware" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/middleware-expect-continue@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.290.0.tgz#84e36331599220328605b7f76bc977c589aa6677" - integrity sha512-MFRedBoLksB1kPJ/ffL1JD9D07Q7jQKEcEuxyGxj25eDiLbA4lxKuJIZI3Sj8P5XO0Lx6pguoxisnhLhp9EWtQ== +"@aws-sdk/middleware-expect-continue@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.310.0.tgz#0b5421d5fddb2c0ebf8e5c9c6122d01b159dad45" + integrity sha512-l3d1z2gt+gINJDnPSyu84IxfzjzPfCQrqC1sunw2cZGo/sXtEiq698Q3SiTcO2PGP4LBQAy2RHb5wVBJP708CQ== dependencies: - "@aws-sdk/protocol-http" "3.290.0" - "@aws-sdk/types" "3.290.0" - tslib "^2.3.1" + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/middleware-flexible-checksums@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.290.0.tgz#ceb25cafd23860cf59e04ed31cd76a7ccd3095b7" - integrity sha512-E621IkVQ4SMQMnkWeawlF0GqaZEHq0KvzAlprlCufktYD7OVxd1jQc0Epa7Pd3/b+rogSNiAdEihZbp7sfQsZg== +"@aws-sdk/middleware-flexible-checksums@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.310.0.tgz#1bebffe42c4109e255716507b63dc964f84b16a5" + integrity sha512-5ndnLgzgGVpWkmHBAiYkagHqiSuow8q62J4J6E2PzaQ77+fm8W3nfdy7hK5trHokEyouCZdxT/XK/IRhgj/4PA== dependencies: "@aws-crypto/crc32" "3.0.0" "@aws-crypto/crc32c" "3.0.0" - "@aws-sdk/is-array-buffer" "3.201.0" - "@aws-sdk/protocol-http" "3.290.0" - "@aws-sdk/types" "3.290.0" - "@aws-sdk/util-utf8" "3.254.0" - tslib "^2.3.1" + "@aws-sdk/is-array-buffer" "3.310.0" + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/util-utf8" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/middleware-host-header@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.290.0.tgz#82ad8185f00fb1c9583408d7d03c8140873345fd" - integrity sha512-j1ss8pjSJyG0aB+X0VPYgTfoieB8m5c+PrWw85JRM/qgbQeurkyD3d/F00V1hkZI42gygOaPlmYMik3kQnmITw== +"@aws-sdk/middleware-host-header@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.310.0.tgz#bdd4fbffb58b331bda517df8340aa8b44ce55550" + integrity sha512-QWSA+46/hXorXyWa61ic2K7qZzwHTiwfk2e9mRRjeIRepUgI3qxFjsYqrWtrOGBjmFmq0pYIY8Bb/DCJuQqcoA== dependencies: - "@aws-sdk/protocol-http" "3.290.0" - "@aws-sdk/types" "3.290.0" - tslib "^2.3.1" + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/middleware-location-constraint@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.290.0.tgz#4546380e2cb7ffc20463265737a79368884e82d8" - integrity sha512-9DjPlNCPChmXP37vYonsAhBKPLk3HPQPK/aBTGkIwGhL1LE811Vzm1PoVCwN12zaB8JCt01yEVmStH9SWHEOIQ== +"@aws-sdk/middleware-location-constraint@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.310.0.tgz#6a24fa717bff47932d22071861c55421766ecca7" + integrity sha512-LFm0JTQWwTPWL/tZU2wsQTl8J5PpDEkXjEhaXVKamtyH0xhysRqd+0n92n65dc8oztAuQkb9xUbErGn5b6gsew== dependencies: - "@aws-sdk/types" "3.290.0" - tslib "^2.3.1" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/middleware-logger@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.290.0.tgz#a12945c7c125764d930f69c56d6dee70263325a4" - integrity sha512-wJOK31t/Y/Km6B5ULF/k2RmQB/6MXSN/hMuCiYsLMapFT+86mBlY8cXytYXtLS8afRKpuNy29EY+O6ovfjz6Ig== +"@aws-sdk/middleware-logger@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.310.0.tgz#8cc6381f49ef867cae1364b8517f939629e4dd9d" + integrity sha512-Lurm8XofrASBRnAVtiSNuDSRsRqPNg27RIFLLsLp/pqog9nFJ0vz0kgdb9S5Z+zw83Mm+UlqOe6D8NTUNp4fVg== dependencies: - "@aws-sdk/types" "3.290.0" - tslib "^2.3.1" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/middleware-recursion-detection@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.290.0.tgz#76474668ccbe2fbc17535c948430ccec8aaf083d" - integrity sha512-m8Y7SE3NfVTyGubiRhueyHF7uqC5dCbD1bSLgVjvrSjO2yEL0Dv9QR1ad7a+p5ilS+Fq3RnOu1VeujfTHy0qRQ== +"@aws-sdk/middleware-recursion-detection@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.310.0.tgz#020c986ed8da751bd613fd84c8c8a805c89e0952" + integrity sha512-SuB75/xk/gyue24gkriTwO2jFd7YcUGZDClQYuRejgbXSa3CO0lWyawQtfLcSSEBp9izrEVXuFH24K1eAft5nQ== dependencies: - "@aws-sdk/protocol-http" "3.290.0" - "@aws-sdk/types" "3.290.0" - tslib "^2.3.1" + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/middleware-retry@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-retry/-/middleware-retry-3.290.0.tgz#aa644026ecf1c718eeed5f2d6c3acc79844a503d" - integrity sha512-mvXvYd/3L/f5ZcnFI1Q2hwk0OtzKMmkDfWW1BcoVzK0XHf2aeehbs7xgI92ICEi/5Ali0IG5krv5LqfgO154Sw== +"@aws-sdk/middleware-retry@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-retry/-/middleware-retry-3.310.0.tgz#12e95e962875d44af4acbdebe02db337a1ad5c35" + integrity sha512-oTPsRy2W4s+dfxbJPW7Km+hHtv/OMsNsVfThAq8DDYKC13qlr1aAyOqGLD+dpBy2aKe7ss517Sy2HcHtHqm7/g== dependencies: - "@aws-sdk/protocol-http" "3.290.0" - "@aws-sdk/service-error-classification" "3.290.0" - "@aws-sdk/types" "3.290.0" - "@aws-sdk/util-middleware" "3.290.0" - "@aws-sdk/util-retry" "3.290.0" - tslib "^2.3.1" + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/service-error-classification" "3.310.0" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/util-middleware" "3.310.0" + "@aws-sdk/util-retry" "3.310.0" + tslib "^2.5.0" uuid "^8.3.2" -"@aws-sdk/middleware-sdk-ec2@3.291.0": - version "3.291.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-ec2/-/middleware-sdk-ec2-3.291.0.tgz#f5b88149d0680a84b2a35f8fb36fbd8337f32195" - integrity sha512-pWNJFp0hnXsAx0DIZ5Eti93SoVKHLteKQUyRSWWhw+Ebq4frqBL3JM2J6cxl2awXVVuIXQAWdmdGX3rcT3PlVw== - dependencies: - "@aws-sdk/middleware-endpoint" "3.290.0" - "@aws-sdk/protocol-http" "3.290.0" - "@aws-sdk/signature-v4" "3.290.0" - "@aws-sdk/types" "3.290.0" - "@aws-sdk/util-format-url" "3.290.0" - tslib "^2.3.1" +"@aws-sdk/middleware-sdk-ec2@3.311.0": + version "3.311.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-ec2/-/middleware-sdk-ec2-3.311.0.tgz#313f7e4874be5a0dd07e65c7d2fb9df4807ae230" + integrity sha512-q4VjgBxJCBYpJAV7MDFP8JIvvhMcc2k1mm8RmFkl0YQj0iBQIa6i4+sQ+yoJ/jfwiCrPwSzN7TMrGFcq7fmPDw== + dependencies: + "@aws-sdk/middleware-endpoint" "3.310.0" + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/signature-v4" "3.310.0" + "@aws-sdk/smithy-client" "3.310.0" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/util-format-url" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/middleware-sdk-rds@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-rds/-/middleware-sdk-rds-3.290.0.tgz#06776c640d872c5702edd615dc54b47e2a2a092a" - integrity sha512-2y89X3sDG1rd9rORvJn3gbw/D/JrUq04R4ibXcL1IOawmXxmJaxe0cqQrU9Aecsoae42W7wvWIvDHwS+ufmwsQ== +"@aws-sdk/middleware-sdk-rds@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-rds/-/middleware-sdk-rds-3.310.0.tgz#2ecf880063ade9bae8abcfd4fefb386ab29ceb50" + integrity sha512-V1nUsjggGLjy+Hx/z/7tb6bnfzZ1Kx4ikOdYVlTidnSCWZdh+kFE5Em16f5Q3erwG5Sil4Uxk0vpj+MSFP5MKA== dependencies: - "@aws-sdk/middleware-endpoint" "3.290.0" - "@aws-sdk/protocol-http" "3.290.0" - "@aws-sdk/signature-v4" "3.290.0" - "@aws-sdk/types" "3.290.0" - "@aws-sdk/util-format-url" "3.290.0" - tslib "^2.3.1" + "@aws-sdk/middleware-endpoint" "3.310.0" + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/signature-v4" "3.310.0" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/util-format-url" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/middleware-sdk-s3@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.290.0.tgz#c6e61e3f1b88d928b45f8a3f75e63d5a4cf852d2" - integrity sha512-6sks5cu5b2LVHFp2RviPZRsVrgeDyRfVExx9D9E18VCad+eejnXsFwx6yvoYFSV8J7mc2E1mCTSSSwKsaC+KBg== +"@aws-sdk/middleware-sdk-s3@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.310.0.tgz#9f060e961ccc462ea5ca8c24cb0845d655b00d24" + integrity sha512-QK9x9g2ksg0hOjjYgqddeFcn5ctUEGdxJVu4OumPXceulefMcSO2jyH2qTybYSA93nqNQFdFmg5wQfvIRUWFCQ== dependencies: - "@aws-sdk/protocol-http" "3.290.0" - "@aws-sdk/types" "3.290.0" - "@aws-sdk/util-arn-parser" "3.208.0" - tslib "^2.3.1" + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/util-arn-parser" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/middleware-sdk-sts@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.290.0.tgz#850d03682dc9b7f37e958090b84b2311477811fb" - integrity sha512-NaYnDhFtmz/e9jNBNeY10A4AldCvjF46ZfeIWoBUsk/4qDlSP9kaCjTufEjNf/zMTtYzGiP/FUtLS7T6tfXdoQ== +"@aws-sdk/middleware-sdk-sts@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.310.0.tgz#2001b421f317404ca98d4a1cfea408b7a64c35f5" + integrity sha512-+5PFwlYNLvLLIfw0ASAoWV/iIF8Zv6R6QGtyP0CclhRSvNjgbQDVnV0g95MC5qvh+GB/Yjlkt8qAjLSPjHfsrQ== dependencies: - "@aws-sdk/middleware-signing" "3.290.0" - "@aws-sdk/property-provider" "3.290.0" - "@aws-sdk/protocol-http" "3.290.0" - "@aws-sdk/signature-v4" "3.290.0" - "@aws-sdk/types" "3.290.0" - tslib "^2.3.1" + "@aws-sdk/middleware-signing" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/middleware-serde@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-serde/-/middleware-serde-3.290.0.tgz#4f7e616dfeb2820c5eb90a5ff770914d0f03e6e3" - integrity sha512-lZCKlfJzosi3cVx02RKRTVvbAijHTfd16EiSyKRsQOF2rCu7Qt4LzygIlqUonCeHG6eSqOMMf7LAJ22IHafBbw== +"@aws-sdk/middleware-serde@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-serde/-/middleware-serde-3.310.0.tgz#e334031b66a1a155375ec901478b26570fbe1783" + integrity sha512-RNeeTVWSLTaentUeCgQKZhAl+C6hxtwD78cQWS10UymWpQFwbaxztzKUu4UQS5xA2j6PxwPRRUjqa4jcFjfLsg== dependencies: - "@aws-sdk/types" "3.290.0" - tslib "^2.3.1" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/middleware-signing@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-signing/-/middleware-signing-3.290.0.tgz#e7e43e4a1697f135c544c75c5d07a4fcdf42b062" - integrity sha512-mEJZQrbXkOTI+BdFlpAd1CleVJL8B7qayANMNj9nrZqvZ7HzVDLEkNaJqFz9JFizYTfZC2ZjtATPrSiYDvFEfg== +"@aws-sdk/middleware-signing@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-signing/-/middleware-signing-3.310.0.tgz#bd62d5623c80f6318b0d738c44780875500c911a" + integrity sha512-f9mKq+XMdW207Af3hKjdTnpNhdtwqWuvFs/ZyXoOkp/g1MY1O6L23Jy6i52m29LxbT4AuNRG1oKODfXM0vYVjQ== dependencies: - "@aws-sdk/property-provider" "3.290.0" - "@aws-sdk/protocol-http" "3.290.0" - "@aws-sdk/signature-v4" "3.290.0" - "@aws-sdk/types" "3.290.0" - "@aws-sdk/util-middleware" "3.290.0" - tslib "^2.3.1" + "@aws-sdk/property-provider" "3.310.0" + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/signature-v4" "3.310.0" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/util-middleware" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/middleware-ssec@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-ssec/-/middleware-ssec-3.290.0.tgz#be0283275bb12e9f71bd34145ddc1103b601304f" - integrity sha512-HRDYawju2mWMF0RObsskEZu9eaDlABVZn9y4quutVYY0EUOWBTvfXmNBiX0YSn7sfFEElFIVqdzsbCCmxoXXBg== +"@aws-sdk/middleware-ssec@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-ssec/-/middleware-ssec-3.310.0.tgz#6a1da92cbc1734604295149c0d8cfed47f6e0fd3" + integrity sha512-CnEwNKVpd5bXnrCKPaePF8mWTA9ET21OMBb54y9b0fd8K02zoOcdBz4DWfh1SjFD4HkgCdja4egd8l2ivyvqmw== dependencies: - "@aws-sdk/types" "3.290.0" - tslib "^2.3.1" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/middleware-stack@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-stack/-/middleware-stack-3.290.0.tgz#a6b5cecdaa0d75f54d958f15d5f6a71143cc5c6c" - integrity sha512-25iC/7oAokRfxixGkDjBSIAkNwtx2kcO+xMoDczFus9UrlOr2pBY0IXbPn6bB56q2zwsBTHcmMTn0H7FJSIQmw== +"@aws-sdk/middleware-stack@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-stack/-/middleware-stack-3.310.0.tgz#06c83963998fbdc83e99b67a7a138529312a6224" + integrity sha512-010O1PD+UAcZVKRvqEusE1KJqN96wwrf6QsqbRM0ywsKQ21NDweaHvEDlds2VHpgmofxkRLRu/IDrlPkKRQrRg== dependencies: - tslib "^2.3.1" + tslib "^2.5.0" -"@aws-sdk/middleware-user-agent@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.290.0.tgz#bd30eabe626f4a9b282eff075b71de017c48b7ef" - integrity sha512-ZR49PPra3LtqZBmXAtV8YrUSrkVG0hPBICE8cma/wMwbKGHa0G+Xu4pOZP0oQXs5XeGu1cs/Nx3AOJ2fgaMjhQ== +"@aws-sdk/middleware-user-agent@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.310.0.tgz#2aa3982cbc5e9c137024cec47914e86610ab0a09" + integrity sha512-x3IOwSwSbwKidlxRk3CNVHVUb06SRuaELxggCaR++QVI8NU6qD/l4VHXKVRvbTHiC/cYxXE/GaBDgQVpDR7V/g== dependencies: - "@aws-sdk/protocol-http" "3.290.0" - "@aws-sdk/types" "3.290.0" - tslib "^2.3.1" + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/util-endpoints" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/node-config-provider@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/node-config-provider/-/node-config-provider-3.290.0.tgz#0cce75d9692640bd45e5cb37b2db34a84625ca63" - integrity sha512-dQLnyCy5iT7Q5Ot2JOciNH9WkaixWwmEnvW6nBa6febzAYZVy78sfJOOP1EZ7ClG1aIhrsAN7/7wPebpn/Peiw== +"@aws-sdk/node-config-provider@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/node-config-provider/-/node-config-provider-3.310.0.tgz#ba8fb41af2db0316291ba9002267627553ec65ac" + integrity sha512-T/Pp6htc6hq/Cq+MLNDSyiwWCMVF6GqbBbXKVlO5L8rdHx4sq9xPdoPveZhGWrxvkanjA6eCwUp6E0riBOSVng== dependencies: - "@aws-sdk/property-provider" "3.290.0" - "@aws-sdk/shared-ini-file-loader" "3.290.0" - "@aws-sdk/types" "3.290.0" - tslib "^2.3.1" + "@aws-sdk/property-provider" "3.310.0" + "@aws-sdk/shared-ini-file-loader" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/node-http-handler@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/node-http-handler/-/node-http-handler-3.290.0.tgz#90cd7a44fda8506eaa5a62d00e88efd6b09900df" - integrity sha512-HfzuzdpAJpO/ob9DQ3aEB/WmPCS5vZOic9T4TtSCmRd5e3+xdMtK/MQUizp8XkbUGBat7jPmcV13Gy4YmwfAuw== +"@aws-sdk/node-http-handler@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/node-http-handler/-/node-http-handler-3.310.0.tgz#bd8e72c1c7cf4b48c2a21851f638ad5e63001787" + integrity sha512-irv9mbcM9xC2xYjArQF5SYmHBMu4ciMWtGsoHII1nRuFOl9FoT4ffTvEPuLlfC6pznzvKt9zvnm6xXj7gDChKg== dependencies: - "@aws-sdk/abort-controller" "3.290.0" - "@aws-sdk/protocol-http" "3.290.0" - "@aws-sdk/querystring-builder" "3.290.0" - "@aws-sdk/types" "3.290.0" - tslib "^2.3.1" + "@aws-sdk/abort-controller" "3.310.0" + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/querystring-builder" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/property-provider@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/property-provider/-/property-provider-3.290.0.tgz#b6edda6c713e8e7ef53691bdc42a0785c37ad93e" - integrity sha512-2Zrh6/KecmiZ/cKVaeDtHRAfyOnAEfwJsgxfFugs3RxjJtYr0AbYJTF+mYp3f8Xc7DCjdxR055axo9TCTBSrwg== +"@aws-sdk/property-provider@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/property-provider/-/property-provider-3.310.0.tgz#5fae8a4c11bda052afa9747d47b031f1c4f0f246" + integrity sha512-3lxDb0akV6BBzmFe4nLPaoliQbAifyWJhuvuDOu7e8NzouvpQXs0275w9LePhhcgjKAEVXUIse05ZW2DLbxo/g== dependencies: - "@aws-sdk/types" "3.290.0" - tslib "^2.3.1" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/protocol-http@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/protocol-http/-/protocol-http-3.290.0.tgz#50c2a9edaede4178b01805fd5c45d4437a52b869" - integrity sha512-3VHbfmo7vaA/0ugJedjwyK85MT+OKQanz7ktUnAONH5KdG2/gPpa9ZSTyfK9kCVFin93YzC3pznZgr6oNYgGgg== +"@aws-sdk/protocol-http@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/protocol-http/-/protocol-http-3.310.0.tgz#855c3314cba7ff3024a9a9701ca3c641691d997e" + integrity sha512-fgZ1aw/irQtnrsR58pS8ThKOWo57Py3xX6giRvwSgZDEcxHfVzuQjy9yPuV++v04fdmdtgpbGf8WfvAAJ11yXQ== dependencies: - "@aws-sdk/types" "3.290.0" - tslib "^2.3.1" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/querystring-builder@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-builder/-/querystring-builder-3.290.0.tgz#a126788e8f934f9550d9ad79f0da92d597087ada" - integrity sha512-7q8x8ux1RCUxUolqxsXfSbCObyMzvSwfJb9GgZ8rDi2U61l8W760a9ejHzizfQJvdldRSwFqmynkRAqYbvKixg== +"@aws-sdk/querystring-builder@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-builder/-/querystring-builder-3.310.0.tgz#5307ea52c3a4a1ae6818bbb6987cc6fce68b043f" + integrity sha512-ZHH8GV/80+pWGo7DzsvwvXR5xVxUHXUvPJPFAkhr6nCf78igdoF8gR10ScFoEKbtEapoNTaZlKHPXxpD8aPG7A== dependencies: - "@aws-sdk/types" "3.290.0" - "@aws-sdk/util-uri-escape" "3.201.0" - tslib "^2.3.1" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/util-uri-escape" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/querystring-parser@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-parser/-/querystring-parser-3.290.0.tgz#d089c8c83cb19b07557d1f09e36dc5ec37ff8c0d" - integrity sha512-8QPDihJKSFYFphxUl5+FfXMQowhAoHuDeoqd1ce3byL0bm7k8emcGfiYD6QGxuDlpno+F4O1/Mz+e+cwNCdPVA== +"@aws-sdk/querystring-parser@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-parser/-/querystring-parser-3.310.0.tgz#438183927e0b06e7c2ee004a1681b8d37c22e104" + integrity sha512-YkIznoP6lsiIUHinx++/lbb3tlMURGGqMpo0Pnn32zYzGrJXA6eC3D0as2EcMjo55onTfuLcIiX4qzXes2MYOA== dependencies: - "@aws-sdk/types" "3.290.0" - tslib "^2.3.1" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/service-error-classification@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/service-error-classification/-/service-error-classification-3.290.0.tgz#4e9cc43da87b4a87dbad781f303dd92d7deed320" - integrity sha512-QP+QgL5Gm6RKl4KGwTRyG1kw0SxBbcmp/a/yhywVHmRI0/+4VsL+cooTqtjFr3xVmKoCX+/JZZ8P96VGFvRSZA== +"@aws-sdk/service-error-classification@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/service-error-classification/-/service-error-classification-3.310.0.tgz#352c1db426dcf54a44393bc9a0607dde796b2abb" + integrity sha512-PuyC7k3qfIKeH2LCnDwbttMOKq3qAx4buvg0yfnJtQOz6t1AR8gsnAq0CjKXXyfkXwNKWTqCpE6lVNUIkXgsMw== -"@aws-sdk/shared-ini-file-loader@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.290.0.tgz#e7a76ad15560faabd0603adf752f8732da73a00b" - integrity sha512-kvLW5rwr4lwHdwkYnoHYpFVfWwZYwQO44eRnkrDnyvvhZTcCH3rBLApu6uvomnL+Ep4bEJ1anDKt3WywlGg5Qw== +"@aws-sdk/shared-ini-file-loader@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.310.0.tgz#07e9c8e8e8bb0de7ed19b8cea908c920a493c9c9" + integrity sha512-N0q9pG0xSjQwc690YQND5bofm+4nfUviQ/Ppgan2kU6aU0WUq8KwgHJBto/YEEI+VlrME30jZJnxtOvcZJc2XA== dependencies: - "@aws-sdk/types" "3.290.0" - tslib "^2.3.1" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/signature-v4-multi-region@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.290.0.tgz#89fa6c6216916d28a27fb056ea39316fb603c4a9" - integrity sha512-kkFExt8MlQWnYytDuqUNLJvGhiE/stHMK8U0s1AjG+xy+wi3Atq9q3mGXbdsWatDhpuzaMhwBSttrvKOfWLnmw== +"@aws-sdk/signature-v4-multi-region@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.310.0.tgz#36eb96aa9170994ed1c5551952d2ec2d5e40c4c7" + integrity sha512-q8W+RIomTS/q85Ntgks/CoDElwqkC9+4OCicee5YznNHjQ4gtNWhUkYIyIRWRmXa/qx/AUreW9DM8FAecCOdng== dependencies: - "@aws-sdk/protocol-http" "3.290.0" - "@aws-sdk/signature-v4" "3.290.0" - "@aws-sdk/types" "3.290.0" - "@aws-sdk/util-arn-parser" "3.208.0" - tslib "^2.3.1" - -"@aws-sdk/signature-v4@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4/-/signature-v4-3.290.0.tgz#9b73d9de8328d6401e5399cd6021bb5addee3031" - integrity sha512-SUMflc8b8PC0ITV3AdYBSlTcn4oFjumBAPNNXBLKIpifQ1l7ZufFIulDPlqeouXTDwsuCVINAwE0DbItDe/7Qw== - dependencies: - "@aws-sdk/is-array-buffer" "3.201.0" - "@aws-sdk/types" "3.290.0" - "@aws-sdk/util-hex-encoding" "3.201.0" - "@aws-sdk/util-middleware" "3.290.0" - "@aws-sdk/util-uri-escape" "3.201.0" - "@aws-sdk/util-utf8" "3.254.0" - tslib "^2.3.1" + "@aws-sdk/protocol-http" "3.310.0" + "@aws-sdk/signature-v4" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/smithy-client@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/smithy-client/-/smithy-client-3.290.0.tgz#0c05c305dc276b6c5bc9a9e35c2b07b447f62fb1" - integrity sha512-MDa+BJqM1FP2HYugVAscufoLJuapEdUTZPoyERVGfUEznKfKH33QXRoeqW1wzUNyhcxFONHLnXp1aYFBtnLx7g== - dependencies: - "@aws-sdk/middleware-stack" "3.290.0" - "@aws-sdk/types" "3.290.0" - tslib "^2.3.1" +"@aws-sdk/signature-v4@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4/-/signature-v4-3.310.0.tgz#ad26426d3f72fa18e6808a36f827beb72d12bf2d" + integrity sha512-1M60P1ZBNAjCFv9sYW29OF6okktaeibWyW3lMXqzoHF70lHBZh+838iUchznXUA5FLabfn4jBFWMRxlAXJUY2Q== + dependencies: + "@aws-sdk/is-array-buffer" "3.310.0" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/util-hex-encoding" "3.310.0" + "@aws-sdk/util-middleware" "3.310.0" + "@aws-sdk/util-uri-escape" "3.310.0" + "@aws-sdk/util-utf8" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/token-providers@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.290.0.tgz#1728b78987b8c5feb2b05440a415e793d89222b9" - integrity sha512-fc5y8WH7RVwoaUaEdK3cRanxgHShZKAPZ0rCtHjoLURF8IjZIrn3AaZqV8YTgAAmIKNVC+argpj1G+suqXEB/Q== +"@aws-sdk/smithy-client@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/smithy-client/-/smithy-client-3.310.0.tgz#04fca042ffc120c35eeea1335fa055d39f1bd7bd" + integrity sha512-UHMFvhoB2RLzsTb0mQe1ofvBUg/+/JEu1uptavxf/hEpEKZnRAaHH5FNkTG+mbFd/olay/QFjqNcMD6t8LcsNQ== dependencies: - "@aws-sdk/client-sso-oidc" "3.290.0" - "@aws-sdk/property-provider" "3.290.0" - "@aws-sdk/shared-ini-file-loader" "3.290.0" - "@aws-sdk/types" "3.290.0" - tslib "^2.3.1" + "@aws-sdk/middleware-stack" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/types@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.290.0.tgz#06a14cf61c2e93d8d789665d2034260229a4de8f" - integrity sha512-uQLD9tLv8Q87CwrSB/taUoQ8wkGeFb1Gygc+kt5oClfMFP9HYzu944kW/1R7/J5LtBLT1QFYccd4gz6eOUNlsw== +"@aws-sdk/token-providers@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.310.0.tgz#2d0b0d3ef729f6cdc6a0cc859e80bb9efea2d8fa" + integrity sha512-G1JvB+2v8k900VJFkKVQXgLGF50ShOEIPxfK1gSQLkSU85vPwGIAANs1KvnlW08FsNbWp3+sKca4kfYKsooXMw== dependencies: - tslib "^2.3.1" + "@aws-sdk/client-sso-oidc" "3.310.0" + "@aws-sdk/property-provider" "3.310.0" + "@aws-sdk/shared-ini-file-loader" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/types@^3.222.0": - version "3.306.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.306.0.tgz#076aa94a1d711311c14bab10b251752506a21487" - integrity sha512-RnyknWWpQcRmNH7AsNr89sdhOoltCU/4YEwBMw34Eh+/36l7HfA5PdEKbsOkO7MO4+2g5qmmm/AHcnHRvymApg== +"@aws-sdk/types@3.310.0", "@aws-sdk/types@^3.222.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.310.0.tgz#b83a0580feb38b58417abb8b4ed3eae1a0cb7bc1" + integrity sha512-j8eamQJ7YcIhw7fneUfs8LYl3t01k4uHi4ZDmNRgtbmbmTTG3FZc2MotStZnp3nZB6vLiPF1o5aoJxWVvkzS6A== dependencies: tslib "^2.5.0" -"@aws-sdk/url-parser@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/url-parser/-/url-parser-3.290.0.tgz#de41d3e0f8178a01b3424c8163b6868d4210a2aa" - integrity sha512-19EAlyH4LyNMbAROE6KSuhFKhOwl67kciDavPjS8gFiHr6slon3oqXfz10+uzKf/pJKuY6qOpkUb9h7LnF4bFQ== +"@aws-sdk/url-parser@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/url-parser/-/url-parser-3.310.0.tgz#928c9eac2e3d74c3c5db4c6e364a1de00185dcaa" + integrity sha512-mCLnCaSB9rQvAgx33u0DujLvr4d5yEm/W5r789GblwwQnlNXedVu50QRizMLTpltYWyAUoXjJgQnJHmJMaKXhw== dependencies: - "@aws-sdk/querystring-parser" "3.290.0" - "@aws-sdk/types" "3.290.0" - tslib "^2.3.1" + "@aws-sdk/querystring-parser" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/util-arn-parser@3.208.0": - version "3.208.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-arn-parser/-/util-arn-parser-3.208.0.tgz#56b6ae4699c3140bb27dcede5146876fef04e823" - integrity sha512-QV4af+kscova9dv4VuHOgH8wEr/IIYHDGcnyVtkUEqahCejWr1Kuk+SBK0xMwnZY5LSycOtQ8aeqHOn9qOjZtA== +"@aws-sdk/util-arn-parser@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-arn-parser/-/util-arn-parser-3.310.0.tgz#861ff8810851be52a320ec9e4786f15b5fc74fba" + integrity sha512-jL8509owp/xB9+Or0pvn3Fe+b94qfklc2yPowZZIFAkFcCSIdkIglz18cPDWnYAcy9JGewpMS1COXKIUhZkJsA== dependencies: - tslib "^2.3.1" + tslib "^2.5.0" -"@aws-sdk/util-base64@3.208.0": - version "3.208.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-base64/-/util-base64-3.208.0.tgz#36b430e5396251f761590f7c2f0c5c12193f353c" - integrity sha512-PQniZph5A6N7uuEOQi+1hnMz/FSOK/8kMFyFO+4DgA1dZ5pcKcn5wiFwHkcTb/BsgVqQa3Jx0VHNnvhlS8JyTg== +"@aws-sdk/util-base64@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-base64/-/util-base64-3.310.0.tgz#d0fd49aff358c5a6e771d0001c63b1f97acbe34c" + integrity sha512-v3+HBKQvqgdzcbL+pFswlx5HQsd9L6ZTlyPVL2LS9nNXnCcR3XgGz9jRskikRUuUvUXtkSG1J88GAOnJ/apTPg== dependencies: - "@aws-sdk/util-buffer-from" "3.208.0" - tslib "^2.3.1" + "@aws-sdk/util-buffer-from" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/util-body-length-browser@3.188.0": - version "3.188.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz#e1d949318c10a621b38575a9ef01e39f9857ddb0" - integrity sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg== +"@aws-sdk/util-body-length-browser@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.310.0.tgz#3fca9d2f73c058edf1907e4a1d99a392fdd23eca" + integrity sha512-sxsC3lPBGfpHtNTUoGXMQXLwjmR0zVpx0rSvzTPAuoVILVsp5AU/w5FphNPxD5OVIjNbZv9KsKTuvNTiZjDp9g== dependencies: - tslib "^2.3.1" + tslib "^2.5.0" -"@aws-sdk/util-body-length-node@3.208.0": - version "3.208.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-body-length-node/-/util-body-length-node-3.208.0.tgz#baabd1fa1206ff2bd4ce3785122d86eb3258dd20" - integrity sha512-3zj50e5g7t/MQf53SsuuSf0hEELzMtD8RX8C76f12OSRo2Bca4FLLYHe0TZbxcfQHom8/hOaeZEyTyMogMglqg== +"@aws-sdk/util-body-length-node@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-body-length-node/-/util-body-length-node-3.310.0.tgz#4846ae72834ab0636f29f89fc1878520f6543fed" + integrity sha512-2tqGXdyKhyA6w4zz7UPoS8Ip+7sayOg9BwHNidiGm2ikbDxm1YrCfYXvCBdwaJxa4hJfRVz+aL9e+d3GqPI9pQ== dependencies: - tslib "^2.3.1" + tslib "^2.5.0" -"@aws-sdk/util-buffer-from@3.208.0": - version "3.208.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-buffer-from/-/util-buffer-from-3.208.0.tgz#285e86f6dc9030148a4147d65239e75cb254a1b0" - integrity sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw== +"@aws-sdk/util-buffer-from@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-buffer-from/-/util-buffer-from-3.310.0.tgz#7a72cb965984d3c6a7e256ae6cf1621f52e54a57" + integrity sha512-i6LVeXFtGih5Zs8enLrt+ExXY92QV25jtEnTKHsmlFqFAuL3VBeod6boeMXkN2p9lbSVVQ1sAOOYZOHYbYkntw== dependencies: - "@aws-sdk/is-array-buffer" "3.201.0" - tslib "^2.3.1" + "@aws-sdk/is-array-buffer" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/util-config-provider@3.208.0": - version "3.208.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-config-provider/-/util-config-provider-3.208.0.tgz#c485fd83fbac051337e5f6be60ea3f9fa61c0139" - integrity sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg== +"@aws-sdk/util-config-provider@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-config-provider/-/util-config-provider-3.310.0.tgz#ff21f73d4774cfd7bd16ae56f905828600dda95f" + integrity sha512-xIBaYo8dwiojCw8vnUcIL4Z5tyfb1v3yjqyJKJWV/dqKUFOOS0U591plmXbM+M/QkXyML3ypon1f8+BoaDExrg== dependencies: - tslib "^2.3.1" + tslib "^2.5.0" -"@aws-sdk/util-defaults-mode-browser@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.290.0.tgz#2abe74057eaf49c14c9557b2181c806a1d91bfd1" - integrity sha512-8Mt6/OA465uw1wSA/LCCd+6IjeIUTAbg2GiqfSBCBMNJNuqPwPXuWVjg6kBd1eEChyEtAuoLTygMefaBywg4HQ== +"@aws-sdk/util-defaults-mode-browser@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.310.0.tgz#db82bfdf339eea0bc8b1b059dfe9b62e5d3adbf4" + integrity sha512-Mr2AoQsjAYNM5oAS2YJlYJqhiCvkFV/hu48slOZgbY4G7ueW4cM0DPkR16wqjcRCGqZ4JmAZB8Q5R0DMrLjhOQ== dependencies: - "@aws-sdk/property-provider" "3.290.0" - "@aws-sdk/types" "3.290.0" + "@aws-sdk/property-provider" "3.310.0" + "@aws-sdk/types" "3.310.0" bowser "^2.11.0" - tslib "^2.3.1" + tslib "^2.5.0" -"@aws-sdk/util-defaults-mode-node@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.290.0.tgz#0efff7937241f89dd70f1acf6f7697181352400f" - integrity sha512-9c0jS7w1aZxfKkFXlTjp80QaKYKnutMmlsfP+/YXN9+s3yvwFcnsENMTNg5YVvkZa9e+Rhw/ySxVKTEJ7n/SOA== +"@aws-sdk/util-defaults-mode-node@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.310.0.tgz#aee459c2da09e2c6e85c6db0406565312f45ccbb" + integrity sha512-JyBlvhQGR8w8NpFRZZXRVTDesafFKTu/gTWjcoxP7twa+fYHSIgPPFGnlcJ/iHaucjamSaWi5EQ+YQmnSZ8yHA== dependencies: - "@aws-sdk/config-resolver" "3.290.0" - "@aws-sdk/credential-provider-imds" "3.290.0" - "@aws-sdk/node-config-provider" "3.290.0" - "@aws-sdk/property-provider" "3.290.0" - "@aws-sdk/types" "3.290.0" - tslib "^2.3.1" + "@aws-sdk/config-resolver" "3.310.0" + "@aws-sdk/credential-provider-imds" "3.310.0" + "@aws-sdk/node-config-provider" "3.310.0" + "@aws-sdk/property-provider" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/util-endpoints@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.290.0.tgz#ab2c56b2814614c40c045ea2b4098ab03af24c6a" - integrity sha512-nDdSyWdxYEPE84qABQKasIFhm6oWjhiyM92g8zsHTqzrn67a4caA72FTL6cztgJOEd5GWvHn6r1BnRVhkG68Qw== +"@aws-sdk/util-endpoints@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.310.0.tgz#fea8757038b62d49dacd653061ba04a2ea102a36" + integrity sha512-zG+/d/O5KPmAaeOMPd6bW1abifdT0H03f42keLjYEoRZzYtHPC5DuPE0UayiWGckI6BCDgy0sRKXCYS49UNFaQ== dependencies: - "@aws-sdk/types" "3.290.0" - tslib "^2.3.1" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/util-format-url@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-format-url/-/util-format-url-3.290.0.tgz#af9372b91576998d1e93af23caa45177490c0ad2" - integrity sha512-MHeiyc8HIYvjeom0DF0OimBQ8oYvIqsG1wyfwDoFFA5A3gM6r8cl3VUg+t/KOXL+A85Ax4iALuG2ViT6zteKhg== +"@aws-sdk/util-format-url@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-format-url/-/util-format-url-3.310.0.tgz#4f89c18a23ec6515f50100deced5f236512c4e15" + integrity sha512-NBOvmvvVR3ydquHmznfgtakiSgDhq8Ww6fq8TUaEjM+Es6+iqY4AwZo0rZ9xTX3GpCcoZy391HUi6kiXRAFzuA== dependencies: - "@aws-sdk/querystring-builder" "3.290.0" - "@aws-sdk/types" "3.290.0" - tslib "^2.3.1" + "@aws-sdk/querystring-builder" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/util-hex-encoding@3.201.0": - version "3.201.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz#21d7ec319240ee68c33d938e71cb79830bea315d" - integrity sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA== +"@aws-sdk/util-hex-encoding@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.310.0.tgz#19294c78986c90ae33f04491487863dc1d33bd87" + integrity sha512-sVN7mcCCDSJ67pI1ZMtk84SKGqyix6/0A1Ab163YKn+lFBQRMKexleZzpYzNGxYzmQS6VanP/cfU7NiLQOaSfA== dependencies: - tslib "^2.3.1" + tslib "^2.5.0" "@aws-sdk/util-locate-window@^3.0.0": - version "3.295.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-locate-window/-/util-locate-window-3.295.0.tgz#b421047b977ef53a8575b7b72780c7209ff5480e" - integrity sha512-d/s+zhUx5Kh4l/ecMP/TBjzp1GR/g89Q4nWH6+wH5WgdHsK+LG+vmsk6mVNuP/8wsCofYG4NBqp5Ulbztbm9QA== + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-locate-window/-/util-locate-window-3.310.0.tgz#b071baf050301adee89051032bd4139bba32cc40" + integrity sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w== dependencies: tslib "^2.5.0" -"@aws-sdk/util-middleware@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-middleware/-/util-middleware-3.290.0.tgz#3353405daddd38ec98242abee0fc946c76976df1" - integrity sha512-lXGM9YSqwZgCeEPltc++jiGyZ/FLuh62IjrWSIVSL/FvkL6D8KSKNBd7Ab/KDDu5jt4iP5UZ4k3SGVk6monUZg== +"@aws-sdk/util-middleware@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-middleware/-/util-middleware-3.310.0.tgz#713c5bfa296f4cf707150a0a1e911afd50dcf939" + integrity sha512-FTSUKL/eRb9X6uEZClrTe27QFXUNNp7fxYrPndZwk1hlaOP5ix+MIHBcI7pIiiY/JPfOUmPyZOu+HetlFXjWog== dependencies: - tslib "^2.3.1" + tslib "^2.5.0" -"@aws-sdk/util-retry@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-retry/-/util-retry-3.290.0.tgz#ea521ae287b34fdd943f4e2d87d69a9aa7006fc7" - integrity sha512-UjyUEguu2upaBvDJkeSUQPE4ryBTA7JhPyl6M7XA6rFSRtU5+1NI8KknSNw46buviNit0Yu0E6TzxNQyS70hKA== +"@aws-sdk/util-retry@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-retry/-/util-retry-3.310.0.tgz#4cdc35e2dfdacf2d928ab474ba8b67bbadd6be3c" + integrity sha512-FwWGhCBLfoivTMUHu1LIn4NjrN9JLJ/aX5aZmbcPIOhZVFJj638j0qDgZXyfvVqBuBZh7M8kGq0Oahy3dp69OA== dependencies: - "@aws-sdk/service-error-classification" "3.290.0" - tslib "^2.3.1" + "@aws-sdk/service-error-classification" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/util-stream-browser@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-stream-browser/-/util-stream-browser-3.290.0.tgz#33b7098055285dd04a24b4b02429f794dd543989" - integrity sha512-mDfGVSZbostSM+kQPEeiDB57mt2oMywtuOtLmv8+iXRZmCBwaHrHZLWguEV+hy/DSKD0e9yAzPja6PbI0/maNA== +"@aws-sdk/util-stream-browser@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-stream-browser/-/util-stream-browser-3.310.0.tgz#223e60f7711f7a20fdc944e1b72c8dd4c1da28cf" + integrity sha512-bysXZHwFwvbqOTCScCdCnoLk1K3GCo0HRIYEZuL7O7MHrQmfaYRXcaft/p22+GUv9VeFXS/eJJZ5r4u32az94w== dependencies: - "@aws-sdk/fetch-http-handler" "3.290.0" - "@aws-sdk/types" "3.290.0" - "@aws-sdk/util-base64" "3.208.0" - "@aws-sdk/util-hex-encoding" "3.201.0" - "@aws-sdk/util-utf8" "3.254.0" - tslib "^2.3.1" + "@aws-sdk/fetch-http-handler" "3.310.0" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/util-base64" "3.310.0" + "@aws-sdk/util-hex-encoding" "3.310.0" + "@aws-sdk/util-utf8" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/util-stream-node@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-stream-node/-/util-stream-node-3.290.0.tgz#c122a5339aa294ca3b40c91d2fb6dde1504ee95c" - integrity sha512-LUrJAt5knKvkJa3ZjOvAFf5bDKqT3DXM8l+KIYSwj9WM7a4rX+gAACILWQZLNvlzQAy+KEjPfhT7p0LZf6Os2w== +"@aws-sdk/util-stream-node@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-stream-node/-/util-stream-node-3.310.0.tgz#088c59b7f346669f501ce0ad08cda7e88de0ba1f" + integrity sha512-hueAXFK0GVvnfYFgqbF7587xZfMZff5jlIFZOHqx7XVU7bl7qrRUCnphHk8H6yZ7RoQbDPcfmHJgtEoAJg1T1Q== dependencies: - "@aws-sdk/node-http-handler" "3.290.0" - "@aws-sdk/types" "3.290.0" - "@aws-sdk/util-buffer-from" "3.208.0" - tslib "^2.3.1" + "@aws-sdk/node-http-handler" "3.310.0" + "@aws-sdk/types" "3.310.0" + "@aws-sdk/util-buffer-from" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/util-uri-escape@3.201.0": - version "3.201.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz#5e708d4cde001a4558ee616f889ceacfadd2ab03" - integrity sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA== +"@aws-sdk/util-uri-escape@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-uri-escape/-/util-uri-escape-3.310.0.tgz#9f942f09a715d8278875013a416295746b6085ba" + integrity sha512-drzt+aB2qo2LgtDoiy/3sVG8w63cgLkqFIa2NFlGpUgHFWTXkqtbgf4L5QdjRGKWhmZsnqkbtL7vkSWEcYDJ4Q== dependencies: - tslib "^2.3.1" + tslib "^2.5.0" -"@aws-sdk/util-user-agent-browser@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.290.0.tgz#e0b7585808fd5bd9be20057b41d3a4c2a4dd8f75" - integrity sha512-I+B5ooKRYQ9jHcdg7TOf20LlTfcBUlCJQ2AAqI1ukmJqal22OD1CtC1E+/XbplpU5mxRs4s2UQbxNaPA0yIrBA== +"@aws-sdk/util-user-agent-browser@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.310.0.tgz#48d463a93351b78b678df324f3518a9798029c44" + integrity sha512-yU/4QnHHuQ5z3vsUqMQVfYLbZGYwpYblPiuZx4Zo9+x0PBkNjYMqctdDcrpoH9Z2xZiDN16AmQGK1tix117ZKw== dependencies: - "@aws-sdk/types" "3.290.0" + "@aws-sdk/types" "3.310.0" bowser "^2.11.0" - tslib "^2.3.1" + tslib "^2.5.0" -"@aws-sdk/util-user-agent-node@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.290.0.tgz#94dec6201da61f6b56cbb40b2768fa95addd91a3" - integrity sha512-7juKgEMqpa0il6jZmiBKGDJslM4UIKX1bvhlqkSvvPfV3zFdfi0V2xavh68GfelWduBBkYLGRjsLunqzw64f8A== +"@aws-sdk/util-user-agent-node@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.310.0.tgz#ebefbedc5a4759adc958885741628ec0de1ab197" + integrity sha512-Ra3pEl+Gn2BpeE7KiDGpi4zj7WJXZA5GXnGo3mjbi9+Y3zrbuhJAbdZO3mO/o7xDgMC6ph4xCTbaSGzU6b6EDg== dependencies: - "@aws-sdk/node-config-provider" "3.290.0" - "@aws-sdk/types" "3.290.0" - tslib "^2.3.1" + "@aws-sdk/node-config-provider" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" "@aws-sdk/util-utf8-browser@^3.0.0": version "3.259.0" @@ -1221,29 +1199,29 @@ dependencies: tslib "^2.3.1" -"@aws-sdk/util-utf8@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8/-/util-utf8-3.254.0.tgz#909af9c6549833a9a9bf77004b7484bfc96b2c35" - integrity sha512-14Kso/eIt5/qfIBmhEL9L1IfyUqswjSTqO2mY7KOzUZ9SZbwn3rpxmtkhmATkRjD7XIlLKaxBkI7tU9Zjzj8Kw== +"@aws-sdk/util-utf8@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8/-/util-utf8-3.310.0.tgz#4a7b9dcebb88e830d3811aeb21e9a6df4273afb4" + integrity sha512-DnLfFT8uCO22uOJc0pt0DsSNau1GTisngBCDw8jQuWT5CqogMJu4b/uXmwEqfj8B3GX6Xsz8zOd6JpRlPftQoA== dependencies: - "@aws-sdk/util-buffer-from" "3.208.0" - tslib "^2.3.1" + "@aws-sdk/util-buffer-from" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/util-waiter@3.290.0": - version "3.290.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-waiter/-/util-waiter-3.290.0.tgz#48ed39903578ac186f99c7875243090a0ed86300" - integrity sha512-8dD1CN5uKAXvRybwk+U6XHPirmVFkHyqu/n20tKB7M/cSoSEM/S5WmaaAqyW3Y0Kv+RIRGcQJb4goYqm7pfZkA== +"@aws-sdk/util-waiter@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-waiter/-/util-waiter-3.310.0.tgz#a410739cfc637af9ccea21de079d00652e9b8363" + integrity sha512-AV5j3guH/Y4REu+Qh3eXQU9igljHuU4XjX2sADAgf54C0kkhcCCkkiuzk3IsX089nyJCqIcj5idbjdvpnH88Vw== dependencies: - "@aws-sdk/abort-controller" "3.290.0" - "@aws-sdk/types" "3.290.0" - tslib "^2.3.1" + "@aws-sdk/abort-controller" "3.310.0" + "@aws-sdk/types" "3.310.0" + tslib "^2.5.0" -"@aws-sdk/xml-builder@3.201.0": - version "3.201.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.201.0.tgz#acf0869855460528114bec17f290b224fe19a3e2" - integrity sha512-brRdB1wwMgjWEnOQsv7zSUhIQuh7DEicrfslAqHop4S4FtSI3GQAShpQqgOpMTNFYcpaWKmE/Y1MJmNY7xLCnw== +"@aws-sdk/xml-builder@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.310.0.tgz#f0236f2103b438d16117e0939a6305ad69b7ff76" + integrity sha512-TqELu4mOuSIKQCqj63fGVs86Yh+vBx5nHRpWKNUNhB2nPTpfbziTs5c1X358be3peVWA4wPxW7Nt53KIg1tnNw== dependencies: - tslib "^2.3.1" + tslib "^2.5.0" "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.21.4": version "7.21.4" @@ -1601,10 +1579,10 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.37.0": - version "8.37.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.37.0.tgz#cf1b5fa24217fe007f6487a26d765274925efa7d" - integrity sha512-x5vzdtOOGgFVDCUs81QRB2+liax8rFg3+7hqM+QhBG0/G3F1ZsoYl97UrqgHgQ9KKT7G6c4V+aTUCgu/n22v1A== +"@eslint/js@8.39.0": + version "8.39.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.39.0.tgz#58b536bcc843f4cd1e02a7e6171da5c040f4d44b" + integrity sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng== "@gar/promisify@^1.1.3": version "1.1.3" @@ -1948,76 +1926,66 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@npmcli/arborist@^5.6.3": - version "5.6.3" - resolved "https://registry.yarnpkg.com/@npmcli/arborist/-/arborist-5.6.3.tgz#40810080272e097b4a7a4f56108f4a31638a9874" - integrity sha512-/7hbqEM6YuRjwTcQXkK1+xKslEblY5kFQe0tZ7jKyMlIR6x4iOmhLErIkBBGtTKvYxRKdpcxnFXjCobg3UqmsA== +"@npmcli/arborist@^6.2.8": + version "6.2.8" + resolved "https://registry.yarnpkg.com/@npmcli/arborist/-/arborist-6.2.8.tgz#bfc53ab964b157fd220c3c138b88e958c209be8b" + integrity sha512-z8qQIbuZBk476/S5rATAS4zwWb7QHzYbtH0468K9c8gfxcH6VeZF5a6MqUiEcdg41OWwiBHqq0I65jdH2Alidw== dependencies: "@isaacs/string-locale-compare" "^1.1.0" - "@npmcli/installed-package-contents" "^1.0.7" - "@npmcli/map-workspaces" "^2.0.3" - "@npmcli/metavuln-calculator" "^3.0.1" - "@npmcli/move-file" "^2.0.0" - "@npmcli/name-from-folder" "^1.0.1" - "@npmcli/node-gyp" "^2.0.0" - "@npmcli/package-json" "^2.0.0" - "@npmcli/query" "^1.2.0" - "@npmcli/run-script" "^4.1.3" - bin-links "^3.0.3" - cacache "^16.1.3" + "@npmcli/fs" "^3.1.0" + "@npmcli/installed-package-contents" "^2.0.2" + "@npmcli/map-workspaces" "^3.0.2" + "@npmcli/metavuln-calculator" "^5.0.0" + "@npmcli/name-from-folder" "^2.0.0" + "@npmcli/node-gyp" "^3.0.0" + "@npmcli/package-json" "^3.0.0" + "@npmcli/query" "^3.0.0" + "@npmcli/run-script" "^6.0.0" + bin-links "^4.0.1" + cacache "^17.0.4" common-ancestor-path "^1.0.1" - hosted-git-info "^5.2.1" - json-parse-even-better-errors "^2.3.1" + hosted-git-info "^6.1.1" + json-parse-even-better-errors "^3.0.0" json-stringify-nice "^1.1.4" - minimatch "^5.1.0" - mkdirp "^1.0.4" - mkdirp-infer-owner "^2.0.0" - nopt "^6.0.0" - npm-install-checks "^5.0.0" - npm-package-arg "^9.0.0" - npm-pick-manifest "^7.0.2" - npm-registry-fetch "^13.0.0" - npmlog "^6.0.2" - pacote "^13.6.1" - parse-conflict-json "^2.0.1" - proc-log "^2.0.0" + minimatch "^7.4.2" + nopt "^7.0.0" + npm-install-checks "^6.0.0" + npm-package-arg "^10.1.0" + npm-pick-manifest "^8.0.1" + npm-registry-fetch "^14.0.3" + npmlog "^7.0.1" + pacote "^15.0.8" + parse-conflict-json "^3.0.0" + proc-log "^3.0.0" promise-all-reject-late "^1.0.0" - promise-call-limit "^1.0.1" - read-package-json-fast "^2.0.2" - readdir-scoped-modules "^1.1.0" - rimraf "^3.0.2" + promise-call-limit "^1.0.2" + read-package-json-fast "^3.0.2" semver "^7.3.7" - ssri "^9.0.0" - treeverse "^2.0.0" - walk-up-path "^1.0.0" - -"@npmcli/ci-detect@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/ci-detect/-/ci-detect-2.0.0.tgz#e63c91bcd4185ac1e85720a34fc48e164ece5b89" - integrity sha512-8yQtQ9ArHh/TzdUDKQwEvwCgpDuhSWTDAbiKMl3854PcT+Dk4UmWaiawuFTLy9n5twzXOBXVflWe+90/ffXQrA== + ssri "^10.0.1" + treeverse "^3.0.0" + walk-up-path "^3.0.1" -"@npmcli/config@^4.2.1": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@npmcli/config/-/config-4.2.2.tgz#2e3334dda84f48d059309c53d152e66b05ca24b7" - integrity sha512-5GNcLd+0c4bYBnFop53+26CO5GQP0R9YcxlernohpHDWdIgzUg9I0+GEMk3sNHnLntATVU39d283A4OO+W402w== - dependencies: - "@npmcli/map-workspaces" "^2.0.2" - ini "^3.0.0" - mkdirp-infer-owner "^2.0.0" - nopt "^6.0.0" - proc-log "^2.0.0" - read-package-json-fast "^2.0.3" +"@npmcli/config@^6.1.6": + version "6.1.6" + resolved "https://registry.yarnpkg.com/@npmcli/config/-/config-6.1.6.tgz#2a7f3cb63a23242f80063d4625e6754969681440" + integrity sha512-TM5dwgaz3Un2T5rdHQ6lX+Jj3TQxK6aV1U5OLByZiUS5qnA0NgC6U0aSESQVy80emToz8dtX3aniXD24wRnBaw== + dependencies: + "@npmcli/map-workspaces" "^3.0.2" + ini "^4.1.0" + nopt "^7.0.0" + proc-log "^3.0.0" + read-package-json-fast "^3.0.2" semver "^7.3.5" - walk-up-path "^1.0.0" + walk-up-path "^3.0.1" -"@npmcli/disparity-colors@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/disparity-colors/-/disparity-colors-2.0.0.tgz#cb518166ee21573b96241a3613fef70acb2a60ba" - integrity sha512-FFXGrIjhvd2qSZ8iS0yDvbI7nbjdyT2VNO7wotosjYZM2p2r8PN3B7Om3M5NO9KqW/OVzfzLB3L0V5Vo5QXC7A== +"@npmcli/disparity-colors@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/disparity-colors/-/disparity-colors-3.0.0.tgz#60ea8c6eb5ba9de2d1950e15b06205b2c3ab7833" + integrity sha512-5R/z157/f20Fi0Ou4ZttL51V0xz0EdPEOauFtPCEYOLInDBRCj1/TxOJ5aGTrtShxEshN2d+hXb9ZKSi5RLBcg== dependencies: ansi-styles "^4.3.0" -"@npmcli/fs@^2.1.0", "@npmcli/fs@^2.1.1": +"@npmcli/fs@^2.1.0": version "2.1.2" resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-2.1.2.tgz#a9e2541a4a2fec2e69c29b35e6060973da79b865" integrity sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ== @@ -2032,47 +2000,46 @@ dependencies: semver "^7.3.5" -"@npmcli/git@^3.0.0": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-3.0.2.tgz#5c5de6b4d70474cf2d09af149ce42e4e1dacb931" - integrity sha512-CAcd08y3DWBJqJDpfuVL0uijlq5oaXaOJEKHKc4wqrjd00gkvTZB+nFuLn+doOOKddaQS9JfqtNoFCO2LCvA3w== +"@npmcli/git@^4.0.0", "@npmcli/git@^4.0.1": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-4.0.4.tgz#cdf74f21b1d440c0756fb28159d935129d9daa33" + integrity sha512-5yZghx+u5M47LghaybLCkdSyFzV/w4OuH12d96HO389Ik9CDsLaDZJVynSGGVJOLn6gy/k7Dz5XYcplM3uxXRg== dependencies: - "@npmcli/promise-spawn" "^3.0.0" + "@npmcli/promise-spawn" "^6.0.0" lru-cache "^7.4.4" - mkdirp "^1.0.4" - npm-pick-manifest "^7.0.0" - proc-log "^2.0.0" + npm-pick-manifest "^8.0.0" + proc-log "^3.0.0" promise-inflight "^1.0.1" promise-retry "^2.0.1" semver "^7.3.5" - which "^2.0.2" + which "^3.0.0" -"@npmcli/installed-package-contents@^1.0.7": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz#ab7408c6147911b970a8abe261ce512232a3f4fa" - integrity sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw== +"@npmcli/installed-package-contents@^2.0.1", "@npmcli/installed-package-contents@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz#bfd817eccd9e8df200919e73f57f9e3d9e4f9e33" + integrity sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ== dependencies: - npm-bundled "^1.1.1" - npm-normalize-package-bin "^1.0.1" + npm-bundled "^3.0.0" + npm-normalize-package-bin "^3.0.0" -"@npmcli/map-workspaces@^2.0.2", "@npmcli/map-workspaces@^2.0.3": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@npmcli/map-workspaces/-/map-workspaces-2.0.4.tgz#9e5e8ab655215a262aefabf139782b894e0504fc" - integrity sha512-bMo0aAfwhVwqoVM5UzX1DJnlvVvzDCHae821jv48L1EsrYwfOZChlqWYXEtto/+BkBXetPbEWgau++/brh4oVg== +"@npmcli/map-workspaces@^3.0.2", "@npmcli/map-workspaces@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@npmcli/map-workspaces/-/map-workspaces-3.0.3.tgz#476944b63cd1f65bf83c6fdc7f4ca7be56906b1f" + integrity sha512-HlCvFuTzw4UNoKyZdqiNrln+qMF71QJkxy2dsusV8QQdoa89e2TF4dATCzBxbl4zzRzdDoWWyP5ADVrNAH9cRQ== dependencies: - "@npmcli/name-from-folder" "^1.0.1" - glob "^8.0.1" - minimatch "^5.0.1" - read-package-json-fast "^2.0.3" + "@npmcli/name-from-folder" "^2.0.0" + glob "^9.3.1" + minimatch "^7.4.2" + read-package-json-fast "^3.0.0" -"@npmcli/metavuln-calculator@^3.0.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@npmcli/metavuln-calculator/-/metavuln-calculator-3.1.1.tgz#9359bd72b400f8353f6a28a25c8457b562602622" - integrity sha512-n69ygIaqAedecLeVH3KnO39M6ZHiJ2dEv5A7DGvcqCB8q17BGUgW8QaanIkbWUo2aYGZqJaOORTLAlIvKjNDKA== +"@npmcli/metavuln-calculator@^5.0.0": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/metavuln-calculator/-/metavuln-calculator-5.0.1.tgz#426b3e524c2008bcc82dbc2ef390aefedd643d76" + integrity sha512-qb8Q9wIIlEPj3WeA1Lba91R4ZboPL0uspzV0F9uwP+9AYMVB2zOoa7Pbk12g6D2NHAinSbHh6QYmGuRyHZ874Q== dependencies: - cacache "^16.0.0" - json-parse-even-better-errors "^2.3.1" - pacote "^13.0.3" + cacache "^17.0.0" + json-parse-even-better-errors "^3.0.0" + pacote "^15.0.0" semver "^7.3.5" "@npmcli/move-file@^2.0.0": @@ -2083,49 +2050,47 @@ mkdirp "^1.0.4" rimraf "^3.0.2" -"@npmcli/name-from-folder@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@npmcli/name-from-folder/-/name-from-folder-1.0.1.tgz#77ecd0a4fcb772ba6fe927e2e2e155fbec2e6b1a" - integrity sha512-qq3oEfcLFwNfEYOQ8HLimRGKlD8WSeGEdtUa7hmzpR8Sa7haL1KVQrvgO6wqMjhWFFVjgtrh1gIxDz+P8sjUaA== - -"@npmcli/node-gyp@^2.0.0": +"@npmcli/name-from-folder@^2.0.0": version "2.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz#8c20e53e34e9078d18815c1d2dda6f2420d75e35" - integrity sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A== + resolved "https://registry.yarnpkg.com/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz#c44d3a7c6d5c184bb6036f4d5995eee298945815" + integrity sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg== -"@npmcli/package-json@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/package-json/-/package-json-2.0.0.tgz#3bbcf4677e21055adbe673d9f08c9f9cde942e4a" - integrity sha512-42jnZ6yl16GzjWSH7vtrmWyJDGVa/LXPdpN2rcUWolFjc9ON2N3uz0qdBbQACfmhuJZ2lbKYtmK5qx68ZPLHMA== - dependencies: - json-parse-even-better-errors "^2.3.1" +"@npmcli/node-gyp@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz#101b2d0490ef1aa20ed460e4c0813f0db560545a" + integrity sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA== -"@npmcli/promise-spawn@^3.0.0": +"@npmcli/package-json@^3.0.0": version "3.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz#53283b5f18f855c6925f23c24e67c911501ef573" - integrity sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g== + resolved "https://registry.yarnpkg.com/@npmcli/package-json/-/package-json-3.0.0.tgz#c9219a197e1be8dbf43c4ef8767a72277c0533b6" + integrity sha512-NnuPuM97xfiCpbTEJYtEuKz6CFbpUHtaT0+5via5pQeI25omvQDFbp1GcGJ/c4zvL/WX0qbde6YiLgfZbWFgvg== dependencies: - infer-owner "^1.0.4" + json-parse-even-better-errors "^3.0.0" -"@npmcli/query@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@npmcli/query/-/query-1.2.0.tgz#46468d583cf013aa92102970700f9555314aabe4" - integrity sha512-uWglsUM3PjBLgTSmZ3/vygeGdvWEIZ3wTUnzGFbprC/RtvQSaT+GAXu1DXmSFj2bD3oOZdcRm1xdzsV2z1YWdw== +"@npmcli/promise-spawn@^6.0.0", "@npmcli/promise-spawn@^6.0.1": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz#c8bc4fa2bd0f01cb979d8798ba038f314cfa70f2" + integrity sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg== + dependencies: + which "^3.0.0" + +"@npmcli/query@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/query/-/query-3.0.0.tgz#51a0dfb85811e04f244171f164b6bc83b36113a7" + integrity sha512-MFNDSJNgsLZIEBVZ0Q9w9K7o07j5N4o4yjtdz2uEpuCZlXGMuPENiRaFYk0vRqAA64qVuUQwC05g27fRtfUgnA== dependencies: - npm-package-arg "^9.1.0" postcss-selector-parser "^6.0.10" - semver "^7.3.7" -"@npmcli/run-script@^4.1.0", "@npmcli/run-script@^4.1.3", "@npmcli/run-script@^4.2.0", "@npmcli/run-script@^4.2.1": - version "4.2.1" - resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-4.2.1.tgz#c07c5c71bc1c70a5f2a06b0d4da976641609b946" - integrity sha512-7dqywvVudPSrRCW5nTHpHgeWnbBtz8cFkOuKrecm6ih+oO9ciydhWt6OF7HlqupRRmB8Q/gECVdB9LMfToJbRg== +"@npmcli/run-script@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-6.0.0.tgz#f89e322c729e26ae29db6cc8cc76559074aac208" + integrity sha512-ql+AbRur1TeOdl1FY+RAwGW9fcr4ZwiVKabdvm93mujGREVuVLbdkXRJDrkTXSdCjaxYydr1wlA2v67jxWG5BQ== dependencies: - "@npmcli/node-gyp" "^2.0.0" - "@npmcli/promise-spawn" "^3.0.0" + "@npmcli/node-gyp" "^3.0.0" + "@npmcli/promise-spawn" "^6.0.0" node-gyp "^9.0.0" - read-package-json-fast "^2.0.3" - which "^2.0.2" + read-package-json-fast "^3.0.0" + which "^3.0.0" "@octokit/auth-token@^3.0.0": version "3.0.3" @@ -2165,10 +2130,10 @@ "@octokit/types" "^9.0.0" universal-user-agent "^6.0.0" -"@octokit/openapi-types@^16.0.0": - version "16.0.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-16.0.0.tgz#d92838a6cd9fb4639ca875ddb3437f1045cc625e" - integrity sha512-JbFWOqTJVLHZSUUoF4FzAZKYtqdxWu9Z5m2QQnOyEa04fOFljvyh7D3GYKbfuaSWisqehImiVIMG4eyJeP5VEA== +"@octokit/openapi-types@^17.0.0": + version "17.0.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-17.0.0.tgz#7356d287f48b20e9a1f497ef8dfaabdff9cf8622" + integrity sha512-V8BVJGN0ZmMlURF55VFHFd/L92XQQ43KvFjNmY1IYbCN3V/h/uUFV6iQi19WEHM395Nn+1qhUbViCAD/1czzog== "@octokit/plugin-paginate-rest@^6.0.0": version "6.0.0" @@ -2222,11 +2187,11 @@ "@octokit/plugin-rest-endpoint-methods" "^7.0.0" "@octokit/types@^9.0.0": - version "9.0.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-9.0.0.tgz#6050db04ddf4188ec92d60e4da1a2ce0633ff635" - integrity sha512-LUewfj94xCMH2rbD5YJ+6AQ4AVjFYTgpp6rboWM5T7N3IsIF65SBEOVcYMGAEzO/kKNiNaW4LoWtoThOhH06gw== + version "9.1.2" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-9.1.2.tgz#1a8d35b1f4a3d2ad386e223f249dd5f7506979c1" + integrity sha512-LPbJIuu1WNoRHbN4UMysEdlissRFpTCWyoKT7kHPufI8T+XX33/qilfMWJo3mCOjNIKu0+43oSQPf+HJa0+TTQ== dependencies: - "@octokit/openapi-types" "^16.0.0" + "@octokit/openapi-types" "^17.0.0" "@one-ini/wasm@0.1.1": version "0.1.1" @@ -2243,28 +2208,28 @@ resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.4.1.tgz#ff22eb2e5d476fbc2450a196e40dd243cc20c28f" integrity sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA== -"@opentelemetry/context-async-hooks@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/context-async-hooks/-/context-async-hooks-1.11.0.tgz#45bbd5f574a8e6aca0cd1af676e906d0626662a7" - integrity sha512-Ao1z7p+Au7A10SvQ6NCo5h2dAb3cujy+1VUZrd6gZuqMTxADYEWw/yjDbkHM/NAAaBphDGhqNg2MxGYIdgQs8w== +"@opentelemetry/context-async-hooks@1.12.0": + version "1.12.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/context-async-hooks/-/context-async-hooks-1.12.0.tgz#3d683dc80787c10ec3d805000267948e7b24b096" + integrity sha512-PmwAanPNWCyS9JYFzhzVzHgviLhc0UHjOwdth+hp3HgQQ9XZZNE635P8JhAUHZmbghW9/qQFafRWOS4VN9VVnQ== -"@opentelemetry/core@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.11.0.tgz#3141a0e96a9ade6ee2dcdd794fd0b014e1013dde" - integrity sha512-aP1wHSb+YfU0pM63UAkizYPuS4lZxzavHHw5KJfFNN2oWQ79HSm6JR3CzwFKHwKhSzHN8RE9fgP1IdVJ8zmo1w== +"@opentelemetry/core@1.12.0": + version "1.12.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.12.0.tgz#afa32341b794045c54c979d4561de2f8f00d0da9" + integrity sha512-4DWYNb3dLs2mSCGl65jY3aEgbvPWSHVQV/dmDWiYeWUrMakZQFcymqZOSUNZO0uDrEJoxMu8O5tZktX6UKFwag== dependencies: - "@opentelemetry/semantic-conventions" "1.11.0" + "@opentelemetry/semantic-conventions" "1.12.0" -"@opentelemetry/exporter-trace-otlp-http@0.37.0": - version "0.37.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.37.0.tgz#3740a0907a94ec0091e7a05dbf503f027d1d8089" - integrity sha512-+oVV/h6UTLMF4IRtCGkLk2kQImMgC0ARFCfz+XXGNksP+awh/NXsDtJ3mHrn8Gtudrf3+pKVe/FWptBRqicm5Q== +"@opentelemetry/exporter-trace-otlp-http@0.38.0": + version "0.38.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.38.0.tgz#93d012fba5f6f345807993aff59c883821d73fde" + integrity sha512-AWpTCyijC7kt2DbLj8FmdlRquA6/rTXZ+3U4MVl4P2YNI7KLUnx/FEhn2BMTB0+rOy7UxSAocqz2tJ/5Ss/6Ng== dependencies: - "@opentelemetry/core" "1.11.0" - "@opentelemetry/otlp-exporter-base" "0.37.0" - "@opentelemetry/otlp-transformer" "0.37.0" - "@opentelemetry/resources" "1.11.0" - "@opentelemetry/sdk-trace-base" "1.11.0" + "@opentelemetry/core" "1.12.0" + "@opentelemetry/otlp-exporter-base" "0.38.0" + "@opentelemetry/otlp-transformer" "0.38.0" + "@opentelemetry/resources" "1.12.0" + "@opentelemetry/sdk-trace-base" "1.12.0" "@opentelemetry/instrumentation-bunyan@0.31.1": version "0.31.1" @@ -2274,20 +2239,20 @@ "@opentelemetry/instrumentation" "^0.35.1" "@types/bunyan" "1.8.7" -"@opentelemetry/instrumentation-http@0.37.0": - version "0.37.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-http/-/instrumentation-http-0.37.0.tgz#f48adafa0fd49037e43d9c79143867894d83e698" - integrity sha512-sEa/yzMypGw3HzgJW+5TayOB7ti3O3Ge+fSAFJSvIDzA9LQAhXGlgt65Uw2l3pn53/b0Js8+QJigqAohnEWz8w== +"@opentelemetry/instrumentation-http@0.38.0": + version "0.38.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-http/-/instrumentation-http-0.38.0.tgz#0226ff67e9f79063aae771bfdb04389da457c828" + integrity sha512-9kpRVnG6oVvt3/WYCzrHwW+s69BW4ap38NWFJLFB+Mcq1wmAcNSoBYUM7j2AfJB4w4y3A6r6mYgnusnxdmPYYg== dependencies: - "@opentelemetry/core" "1.11.0" - "@opentelemetry/instrumentation" "0.37.0" - "@opentelemetry/semantic-conventions" "1.11.0" + "@opentelemetry/core" "1.12.0" + "@opentelemetry/instrumentation" "0.38.0" + "@opentelemetry/semantic-conventions" "1.12.0" semver "^7.3.5" -"@opentelemetry/instrumentation@0.37.0": - version "0.37.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation/-/instrumentation-0.37.0.tgz#8ae3a9a2dfe94e78a6511b665f0e19f25fd52d8a" - integrity sha512-QAHIYTeVHcvP5NcI8r0WbvF5KCojZSzQLO9G73/OpiXLy/t8hIUXHq0nuuSB5zP5dKQ8h9sORi/3suGBNHnsjw== +"@opentelemetry/instrumentation@0.38.0": + version "0.38.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation/-/instrumentation-0.38.0.tgz#e97c6d4ea699006ec2541fd83b26a10f0edaada4" + integrity sha512-wr1WkIbzHGV+oz6SCme88D2c+zNG23COkCjcida8b3jIzX2lJafOpEHPDcbBF38F8ChkRSj/tVnx1wnYAXZvbA== dependencies: require-in-the-middle "^6.0.0" semver "^7.3.2" @@ -2302,79 +2267,79 @@ semver "^7.3.2" shimmer "^1.2.1" -"@opentelemetry/otlp-exporter-base@0.37.0": - version "0.37.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.37.0.tgz#5c544ca92b3d77c67059b9184f7d573b7dac25c2" - integrity sha512-dLbv7nr7d14xrHzd+S1eW+RpXh7IC0onktc23pwzETh6J7Ytzf0+QwLV5iRatoNtwPU2hX1VGOipwEnC/BjXxg== +"@opentelemetry/otlp-exporter-base@0.38.0": + version "0.38.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.38.0.tgz#803d0e29825023721963384a9c64c5db254d4cf1" + integrity sha512-VWQo7vUDyW/7/FT8RErAtM/29i/fllCc9xMtnK7kDuheAjJU68zrZ88bQOsLamHvOCU3KVpozjfTZVxZKQRYXw== dependencies: - "@opentelemetry/core" "1.11.0" + "@opentelemetry/core" "1.12.0" -"@opentelemetry/otlp-transformer@0.37.0": - version "0.37.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-transformer/-/otlp-transformer-0.37.0.tgz#5de4bf39da9a14841ca0ebd7ac220801d616de64" - integrity sha512-cIzV9x2DhJ5gN0mld8OqN+XM95sDiuAJJvXsRjVuz9vu8TSNbbao/QCKNfJLOXqe8l3Ge05nKzQ6Q2gDDEN36w== +"@opentelemetry/otlp-transformer@0.38.0": + version "0.38.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-transformer/-/otlp-transformer-0.38.0.tgz#0e759cf494b9c1cb7ee272ac6e936f9a2abf6514" + integrity sha512-ykQEipby0NVSi2ih5E8J2GNJ6y9zYDPSef0nD8j33XPKxfyVG5184rUrCsh6TIk1d/GlYl8gB9Wy4TdRvwl6kA== dependencies: - "@opentelemetry/core" "1.11.0" - "@opentelemetry/resources" "1.11.0" - "@opentelemetry/sdk-metrics" "1.11.0" - "@opentelemetry/sdk-trace-base" "1.11.0" + "@opentelemetry/core" "1.12.0" + "@opentelemetry/resources" "1.12.0" + "@opentelemetry/sdk-metrics" "1.12.0" + "@opentelemetry/sdk-trace-base" "1.12.0" -"@opentelemetry/propagator-b3@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/propagator-b3/-/propagator-b3-1.11.0.tgz#72c97263b0420178dc4eb9b9351f5bf8adbc3cb1" - integrity sha512-Nnlu2PUSMqB8Lc3OzjznqpwuUdej1LrYYNjHItk9g7jJ9SAjiLdkB1cDALO+xhISTON8VrELh1rh0XIMUts2og== +"@opentelemetry/propagator-b3@1.12.0": + version "1.12.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/propagator-b3/-/propagator-b3-1.12.0.tgz#74d3e4b4889b1ae67a5aab0ca08afbce0a867f4d" + integrity sha512-WFcn98075QPc2zE1obhKydJHUehI5/HuLoelPEVwATj+487hjCwjHj9r2fgmQkWpvuNSB7CJaA0ys6qqq1N6lg== dependencies: - "@opentelemetry/core" "1.11.0" + "@opentelemetry/core" "1.12.0" -"@opentelemetry/propagator-jaeger@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.11.0.tgz#9a763db967967d2241ae6ed4e2e50722715648d1" - integrity sha512-/9XDcBnB6Y2INMWACs0UniY+aV7LReMRzPN6Q0SI7SlXZLZPTUnaZt51Tb/TyixjzAkHsj86K27XSCv3ctB2UQ== +"@opentelemetry/propagator-jaeger@1.12.0": + version "1.12.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.12.0.tgz#e477e8a63007734d18db6a764a440b37e9f0dd2d" + integrity sha512-ugtWF7GC6X5RIJ0+iMwW2iVAGNs206CAeq8XQ8OkJRg+v0lp4H0/i+gJ4hubTT8NIL5a3IxtIrAENPLIGdLucQ== dependencies: - "@opentelemetry/core" "1.11.0" + "@opentelemetry/core" "1.12.0" -"@opentelemetry/resources@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-1.11.0.tgz#68e3ca399e63246a6b87bc495f819c5bd9f2c112" - integrity sha512-y0z2YJTqk0ag+hGT4EXbxH/qPhDe8PfwltYb4tXIEsozgEFfut/bqW7H7pDvylmCjBRMG4NjtLp57V1Ev++brA== +"@opentelemetry/resources@1.12.0": + version "1.12.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-1.12.0.tgz#895394c727dc3e7e51d1d2cc50907ec07a626dca" + integrity sha512-gunMKXG0hJrR0LXrqh7BVbziA/+iJBL3ZbXCXO64uY+SrExkwoyJkpiq9l5ismkGF/A20mDEV7tGwh+KyPw00Q== dependencies: - "@opentelemetry/core" "1.11.0" - "@opentelemetry/semantic-conventions" "1.11.0" + "@opentelemetry/core" "1.12.0" + "@opentelemetry/semantic-conventions" "1.12.0" -"@opentelemetry/sdk-metrics@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-metrics/-/sdk-metrics-1.11.0.tgz#0fe347fb39a802ec270315cba0eba2e3ce64c4a2" - integrity sha512-knuq3pwU0+46FEMdw9Ses+alXL9cbcLUUTdYBBBsaKkqKwoVMHfhBufW7u6YCu4i+47Wg6ZZTN/eGc4LbTbK5Q== +"@opentelemetry/sdk-metrics@1.12.0": + version "1.12.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-metrics/-/sdk-metrics-1.12.0.tgz#52c135b8ca6af677a3e93b6721bc866a74c98b4b" + integrity sha512-zOy88Jfk88eTxqu+9ypHLs184dGydJocSWtvWMY10QKVVaxhC3SLKa0uxI/zBtD9S+x0LP65wxrTSfSoUNtCOA== dependencies: - "@opentelemetry/core" "1.11.0" - "@opentelemetry/resources" "1.11.0" + "@opentelemetry/core" "1.12.0" + "@opentelemetry/resources" "1.12.0" lodash.merge "4.6.2" -"@opentelemetry/sdk-trace-base@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.11.0.tgz#a962dbe74ae28442501ce804d4a270892e70d862" - integrity sha512-DV8e5/Qo42V8FMBlQ0Y0Liv6Hl/Pp5bAZ73s7r1euX8w4bpRes1B7ACiA4yujADbWMJxBgSo4fGbi4yjmTMG2A== +"@opentelemetry/sdk-trace-base@1.12.0": + version "1.12.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.12.0.tgz#62b895dbb5900048a85e4899c38fec5585447d4b" + integrity sha512-pfCOB3tNDlYVoWuz4D7Ji+Jmy9MHnATWHVpkERdCEiwUGEZ+4IvNPXUcPc37wJVmMpjGLeaWgPPrie0KIpWf1A== dependencies: - "@opentelemetry/core" "1.11.0" - "@opentelemetry/resources" "1.11.0" - "@opentelemetry/semantic-conventions" "1.11.0" + "@opentelemetry/core" "1.12.0" + "@opentelemetry/resources" "1.12.0" + "@opentelemetry/semantic-conventions" "1.12.0" -"@opentelemetry/sdk-trace-node@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.11.0.tgz#5a1621fff5e9427b5e7557a3b8651ee4c572da35" - integrity sha512-BzcrLl6m10Gc9Za5hNCRAClgpetGd5di5bG4RDChhVfqrecl98ok+BKunWxWxrZUMpXpJqfXteHo0su3SEXvXQ== - dependencies: - "@opentelemetry/context-async-hooks" "1.11.0" - "@opentelemetry/core" "1.11.0" - "@opentelemetry/propagator-b3" "1.11.0" - "@opentelemetry/propagator-jaeger" "1.11.0" - "@opentelemetry/sdk-trace-base" "1.11.0" +"@opentelemetry/sdk-trace-node@1.12.0": + version "1.12.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.12.0.tgz#f9f35a44bf662884d49c63473ce8fb34acf7d413" + integrity sha512-PxpDemnNZLLeFNLAu95/K3QubjlaScXVjVQPlwPui65VRxIvxGVysnN7DFfsref+qoh1hI6nlrYSij43vxdm2w== + dependencies: + "@opentelemetry/context-async-hooks" "1.12.0" + "@opentelemetry/core" "1.12.0" + "@opentelemetry/propagator-b3" "1.12.0" + "@opentelemetry/propagator-jaeger" "1.12.0" + "@opentelemetry/sdk-trace-base" "1.12.0" semver "^7.3.5" -"@opentelemetry/semantic-conventions@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.11.0.tgz#b7ed9a601acb6e0aef67564b37e4f9abad449170" - integrity sha512-fG4D0AktoHyHwGhFGv+PzKrZjxbKJfckJauTJdq2A+ej5cTazmNYjJVAODXXkYyrsI10muMl+B1iO2q1R6Lp+w== +"@opentelemetry/semantic-conventions@1.12.0": + version "1.12.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.12.0.tgz#19c959bdb900986e74939d4227e757aa16936b91" + integrity sha512-hO+bdeGOlJwqowUBoZF5LyP3ORUFOP1G0GRv8N45W/cztXbT2ZEXaAzfokRS9Xc9FWmYrDj32mF6SzH6wuoIyA== "@pkgr/utils@^2.3.1": version "2.3.1" @@ -2544,10 +2509,10 @@ resolved "https://registry.yarnpkg.com/@renovatebot/pep440/-/pep440-2.1.13.tgz#d630989b6abf9dd001edc526cf3e821450e6e45d" integrity sha512-PFnG9X7on77Gp9FPdossWfvDL6QTg1MafZP3hdKafo3n6SP89wiyZmjFVaQwlRlE5cEmZQwh11dE8Oos9H2paw== -"@renovatebot/ruby-semver@2.1.10": - version "2.1.10" - resolved "https://registry.yarnpkg.com/@renovatebot/ruby-semver/-/ruby-semver-2.1.10.tgz#3465e3818239e21a980e9b8acd90ffc323d417a3" - integrity sha512-k9GE1cYAYWH5zJpePf4m6GEOZaT/5dh6ETTnV4TQthqufaKpIg9m6ZoxzKhKfuwPo5PlprWh8gyYXjYpN2TkhA== +"@renovatebot/ruby-semver@2.1.11": + version "2.1.11" + resolved "https://registry.yarnpkg.com/@renovatebot/ruby-semver/-/ruby-semver-2.1.11.tgz#5a63bda21da4bc1553ed9b6acf1e6a07b0df2797" + integrity sha512-4UCu1qpkfpa9sIuo8q0+oEwW76XT21OtEuwT+xecaK4QSdqvNfROFNSzq/PA4or/v9uPvLkRWHF36DNd5t/A4w== dependencies: tslib "^2.5.0" @@ -2617,24 +2582,24 @@ p-retry "^4.0.0" url-join "^4.0.0" -"@semantic-release/npm@^9.0.0": - version "9.0.2" - resolved "https://registry.yarnpkg.com/@semantic-release/npm/-/npm-9.0.2.tgz#0f0903b4df6e93ef237372146bc376087fed4e1d" - integrity sha512-zgsynF6McdzxPnFet+a4iO9HpAlARXOM5adz7VGVCvj0ne8wtL2ZOQoDV2wZPDmdEotDIbVeJjafhelZjs9j6g== +"@semantic-release/npm@^10.0.2": + version "10.0.3" + resolved "https://registry.yarnpkg.com/@semantic-release/npm/-/npm-10.0.3.tgz#11c5a1927f2e942d4067732d930cb44718b9b7ac" + integrity sha512-Chbv3kX4o+y+r1X6hsqBVB8NFbSVfiNlYOqMG6o9Wc8r5Y4cjxfbaMCuJ++XAtw3YXYX/NVD05cPzBi4Orjusg== dependencies: "@semantic-release/error" "^3.0.0" - aggregate-error "^3.0.0" - execa "^5.0.0" + aggregate-error "^4.0.1" + execa "^7.0.0" fs-extra "^11.0.0" - lodash "^4.17.15" + lodash-es "^4.17.21" nerf-dart "^1.0.0" - normalize-url "^6.0.0" - npm "^8.3.0" + normalize-url "^8.0.0" + npm "^9.5.0" rc "^1.2.8" - read-pkg "^5.0.0" + read-pkg "^8.0.0" registry-auth-token "^5.0.0" semver "^7.1.2" - tempy "^1.0.0" + tempy "^3.0.0" "@semantic-release/release-notes-generator@^10.0.0": version "10.0.3" @@ -2652,6 +2617,11 @@ lodash "^4.17.4" read-pkg-up "^7.0.0" +"@sigstore/protobuf-specs@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.1.0.tgz#957cb64ea2f5ce527cc9cf02a096baeb0d2b99b4" + integrity sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ== + "@sinclair/typebox@^0.25.16": version "0.25.24" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" @@ -2786,6 +2756,19 @@ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== +"@tufjs/canonical-json@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz#eade9fd1f537993bc1f0949f3aea276ecc4fab31" + integrity sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ== + +"@tufjs/models@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tufjs/models/-/models-1.0.3.tgz#e6cb8a86834da7459a7c836cd892dee56b4bab44" + integrity sha512-mkFEqqRisi13DmR5pX4x+Zk97EiU8djTtpNW1GeuX410y/raAsq/T3ZCjwoRIZ8/cIBfW0olK/sywlAiWevDVw== + dependencies: + "@tufjs/canonical-json" "1.0.0" + minimatch "^7.4.6" + "@types/auth-header@1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@types/auth-header/-/auth-header-1.0.2.tgz#45879542c5c754debbb753b1491bbf690888b4ef" @@ -2906,9 +2889,9 @@ "@types/json-schema" "*" "@types/estree@*": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" - integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" + integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== "@types/fs-extra@11.0.1": version "11.0.1" @@ -2928,12 +2911,12 @@ resolved "https://registry.yarnpkg.com/@types/github-url-from-git/-/github-url-from-git-1.5.1.tgz#73b1b6fa0490b903f50e7d7d9897d91769a15d8d" integrity sha512-B/SvVZMrLRUI9mOoguNNz58gV8A5PDtcGIaUe5PYmzAUTsIJ+ZAn/ujwBIuGIU3mRHY5SfV9dyWfnhOWtOVh6A== -"@types/glob@*": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-8.1.0.tgz#b63e70155391b0584dce44e7ea25190bbc38f2fc" - integrity sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w== +"@types/glob@~7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" + integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== dependencies: - "@types/minimatch" "^5.1.2" + "@types/minimatch" "*" "@types/node" "*" "@types/global-agent@2.1.1": @@ -3021,10 +3004,10 @@ resolved "https://registry.yarnpkg.com/@types/linkify-markdown/-/linkify-markdown-1.0.1.tgz#0b750a592107dd46ecf2b5be0eeb7656b1fc814d" integrity sha512-RYDOtCol7/sHGhSJvWVnl0AmOdQQWgUYys6cwn5Lt3RiYhyhTLMLv7B9wdixMgCfnNt0MQj/YSGi3qN0IQqLeQ== -"@types/lodash@4.14.192": - version "4.14.192" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.192.tgz#5790406361a2852d332d41635d927f1600811285" - integrity sha512-km+Vyn3BYm5ytMO13k9KTp27O75rbQ0NFw+U//g+PX7VZyjCioXaRFisqSIJRECljcTv73G3i6BpglNGHgUQ5A== +"@types/lodash@4.14.194": + version "4.14.194" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.194.tgz#b71eb6f7a0ff11bff59fc987134a093029258a76" + integrity sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g== "@types/luxon@3.3.0": version "3.3.0" @@ -3063,7 +3046,7 @@ resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-1.0.2.tgz#e2ce9d83a613bacf284c7be7d491945e39e1f8e9" integrity sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA== -"@types/minimatch@^5.1.2": +"@types/minimatch@*": version "5.1.2" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== @@ -3090,7 +3073,12 @@ dependencies: "@types/node" "*" -"@types/node@*", "@types/node@18.15.11": +"@types/node@*": + version "18.16.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.0.tgz#4668bc392bb6938637b47e98b1f2ed5426f33316" + integrity sha512-BsAaKhB+7X+H4GnSjGhJG9Qi8Tw+inU9nJDwmD5CgOmBLEI6ArdhikpLX7DjbjDRDTbqZzU2LSQNZg8WGPiSZQ== + +"@types/node@18.15.11": version "18.15.11" resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.11.tgz#b3b790f09cb1696cffcec605de025b088fa4225f" integrity sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q== @@ -3142,18 +3130,18 @@ resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== -"@types/shelljs@0.8.11": - version "0.8.11" - resolved "https://registry.yarnpkg.com/@types/shelljs/-/shelljs-0.8.11.tgz#17a5696c825974e96828e96e89585d685646fcb8" - integrity sha512-x9yaMvEh5BEaZKeVQC4vp3l+QoFj3BXcd4aYfuKSzIIyihjdVARAadYy3SMNIz0WCCdS2vB9JL/U6GQk5PaxQw== +"@types/shelljs@0.8.12": + version "0.8.12" + resolved "https://registry.yarnpkg.com/@types/shelljs/-/shelljs-0.8.12.tgz#79dc9632af7d5ca1b5afb65a6bfc1422d79b5fa0" + integrity sha512-ZA8U81/gldY+rR5zl/7HSHrG2KDfEb3lzG6uCUDhW1DTQE9yC/VBQ45fXnXq8f3CgInfhZmjtdu/WOUlrXRQUg== dependencies: - "@types/glob" "*" + "@types/glob" "~7.2.0" "@types/node" "*" "@types/sinon@^10.0.10": - version "10.0.13" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.13.tgz#60a7a87a70d9372d0b7b38cc03e825f46981fb83" - integrity sha512-UVjDqJblVNQYvVNUsj0PuYYw0ELRmgt1Nt5Vk0pT5f16ROGfcKJY8o1HVuMOJOpD727RrGB9EGvoaTQE5tgxZQ== + version "10.0.14" + resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.14.tgz#6bd18b088ea5ef1e5153fa37d0b68e91eff09e22" + integrity sha512-mn72up6cjaMyMuaPaa/AwKf6WtsSRysQC7wxFkCm1XcOKXPM1z+5Y4H5wjIVBz4gdAkjvZxVVfjA6ba1nHr5WQ== dependencies: "@types/sinonjs__fake-timers" "*" @@ -3221,15 +3209,15 @@ dependencies: "@types/node" "*" -"@typescript-eslint/eslint-plugin@5.57.1": - version "5.57.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.57.1.tgz#d1ab162a3cd2671b8a1c9ddf6e2db73b14439735" - integrity sha512-1MeobQkQ9tztuleT3v72XmY0XuKXVXusAhryoLuU5YZ+mXoYKZP9SQ7Flulh1NX4DTjpGTc2b/eMu4u7M7dhnQ== +"@typescript-eslint/eslint-plugin@5.59.1": + version "5.59.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.1.tgz#9b09ee1541bff1d2cebdcb87e7ce4a4003acde08" + integrity sha512-AVi0uazY5quFB9hlp2Xv+ogpfpk77xzsgsIEWyVS7uK/c7MZ5tw7ZPbapa0SbfkqE0fsAMkz5UwtgMLVk2BQAg== dependencies: "@eslint-community/regexpp" "^4.4.0" - "@typescript-eslint/scope-manager" "5.57.1" - "@typescript-eslint/type-utils" "5.57.1" - "@typescript-eslint/utils" "5.57.1" + "@typescript-eslint/scope-manager" "5.59.1" + "@typescript-eslint/type-utils" "5.59.1" + "@typescript-eslint/utils" "5.59.1" debug "^4.3.4" grapheme-splitter "^1.0.4" ignore "^5.2.0" @@ -3238,78 +3226,126 @@ tsutils "^3.21.0" "@typescript-eslint/experimental-utils@^5.3.0": - version "5.57.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.57.1.tgz#da521391f16379b396896b120919c63f24fa78c2" - integrity sha512-5F5s8mpM1Y0RQ5iWzKQPQm5cmhARgcMfUwyHX1ZZFL8Tm0PyzyQ+9jgYSMaW74XXvpDg9/KdmMICLlwNwKtO7w== + version "5.59.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.59.0.tgz#ef5c78ba1f33853add4f4d7ac5a215e90c9e1409" + integrity sha512-evvdzcPrUv9+Hj+KX6fa3WMrtTZ7onnGHL3NfT/zN9q2FQhb2yvNJDa+w/ND0TpdRCbulwag0dxwMUt2MJB2Vg== dependencies: - "@typescript-eslint/utils" "5.57.1" + "@typescript-eslint/utils" "5.59.0" -"@typescript-eslint/parser@5.57.1": - version "5.57.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.57.1.tgz#af911234bd4401d09668c5faf708a0570a17a748" - integrity sha512-hlA0BLeVSA/wBPKdPGxoVr9Pp6GutGoY380FEhbVi0Ph4WNe8kLvqIRx76RSQt1lynZKfrXKs0/XeEk4zZycuA== +"@typescript-eslint/parser@5.59.1": + version "5.59.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.59.1.tgz#73c2c12127c5c1182d2e5b71a8fa2a85d215cbb4" + integrity sha512-nzjFAN8WEu6yPRDizIFyzAfgK7nybPodMNFGNH0M9tei2gYnYszRDqVA0xlnRjkl7Hkx2vYrEdb6fP2a21cG1g== dependencies: - "@typescript-eslint/scope-manager" "5.57.1" - "@typescript-eslint/types" "5.57.1" - "@typescript-eslint/typescript-estree" "5.57.1" + "@typescript-eslint/scope-manager" "5.59.1" + "@typescript-eslint/types" "5.59.1" + "@typescript-eslint/typescript-estree" "5.59.1" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.57.1": - version "5.57.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.57.1.tgz#5d28799c0fc8b501a29ba1749d827800ef22d710" - integrity sha512-N/RrBwEUKMIYxSKl0oDK5sFVHd6VI7p9K5MyUlVYAY6dyNb/wHUqndkTd3XhpGlXgnQsBkRZuu4f9kAHghvgPw== +"@typescript-eslint/scope-manager@5.59.0": + version "5.59.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.59.0.tgz#86501d7a17885710b6716a23be2e93fc54a4fe8c" + integrity sha512-tsoldKaMh7izN6BvkK6zRMINj4Z2d6gGhO2UsI8zGZY3XhLq1DndP3Ycjhi1JwdwPRwtLMW4EFPgpuKhbCGOvQ== dependencies: - "@typescript-eslint/types" "5.57.1" - "@typescript-eslint/visitor-keys" "5.57.1" + "@typescript-eslint/types" "5.59.0" + "@typescript-eslint/visitor-keys" "5.59.0" -"@typescript-eslint/type-utils@5.57.1": - version "5.57.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.57.1.tgz#235daba621d3f882b8488040597b33777c74bbe9" - integrity sha512-/RIPQyx60Pt6ga86hKXesXkJ2WOS4UemFrmmq/7eOyiYjYv/MUSHPlkhU6k9T9W1ytnTJueqASW+wOmW4KrViw== +"@typescript-eslint/scope-manager@5.59.1": + version "5.59.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.59.1.tgz#8a20222719cebc5198618a5d44113705b51fd7fe" + integrity sha512-mau0waO5frJctPuAzcxiNWqJR5Z8V0190FTSqRw1Q4Euop6+zTwHAf8YIXNwDOT29tyUDrQ65jSg9aTU/H0omA== dependencies: - "@typescript-eslint/typescript-estree" "5.57.1" - "@typescript-eslint/utils" "5.57.1" + "@typescript-eslint/types" "5.59.1" + "@typescript-eslint/visitor-keys" "5.59.1" + +"@typescript-eslint/type-utils@5.59.1": + version "5.59.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.59.1.tgz#63981d61684fd24eda2f9f08c0a47ecb000a2111" + integrity sha512-ZMWQ+Oh82jWqWzvM3xU+9y5U7MEMVv6GLioM3R5NJk6uvP47kZ7YvlgSHJ7ERD6bOY7Q4uxWm25c76HKEwIjZw== + dependencies: + "@typescript-eslint/typescript-estree" "5.59.1" + "@typescript-eslint/utils" "5.59.1" debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.57.1": - version "5.57.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.57.1.tgz#d9989c7a9025897ea6f0550b7036027f69e8a603" - integrity sha512-bSs4LOgyV3bJ08F5RDqO2KXqg3WAdwHCu06zOqcQ6vqbTJizyBhuh1o1ImC69X4bV2g1OJxbH71PJqiO7Y1RuA== +"@typescript-eslint/types@5.59.0": + version "5.59.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.59.0.tgz#3fcdac7dbf923ec5251545acdd9f1d42d7c4fe32" + integrity sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA== + +"@typescript-eslint/types@5.59.1": + version "5.59.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.59.1.tgz#03f3fedd1c044cb336ebc34cc7855f121991f41d" + integrity sha512-dg0ICB+RZwHlysIy/Dh1SP+gnXNzwd/KS0JprD3Lmgmdq+dJAJnUPe1gNG34p0U19HvRlGX733d/KqscrGC1Pg== + +"@typescript-eslint/typescript-estree@5.59.0": + version "5.59.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.0.tgz#8869156ee1dcfc5a95be3ed0e2809969ea28e965" + integrity sha512-sUNnktjmI8DyGzPdZ8dRwW741zopGxltGs/SAPgGL/AAgDpiLsCFLcMNSpbfXfmnNeHmK9h3wGmCkGRGAoUZAg== + dependencies: + "@typescript-eslint/types" "5.59.0" + "@typescript-eslint/visitor-keys" "5.59.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" -"@typescript-eslint/typescript-estree@5.57.1": - version "5.57.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.57.1.tgz#10d9643e503afc1ca4f5553d9bbe672ea4050b71" - integrity sha512-A2MZqD8gNT0qHKbk2wRspg7cHbCDCk2tcqt6ScCFLr5Ru8cn+TCfM786DjPhqwseiS+PrYwcXht5ztpEQ6TFTw== +"@typescript-eslint/typescript-estree@5.59.1": + version "5.59.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.1.tgz#4aa546d27fd0d477c618f0ca00b483f0ec84c43c" + integrity sha512-lYLBBOCsFltFy7XVqzX0Ju+Lh3WPIAWxYpmH/Q7ZoqzbscLiCW00LeYCdsUnnfnj29/s1WovXKh2gwCoinHNGA== dependencies: - "@typescript-eslint/types" "5.57.1" - "@typescript-eslint/visitor-keys" "5.57.1" + "@typescript-eslint/types" "5.59.1" + "@typescript-eslint/visitor-keys" "5.59.1" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.57.1", "@typescript-eslint/utils@^5.10.0": - version "5.57.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.57.1.tgz#0f97b0bbd88c2d5e2036869f26466be5f4c69475" - integrity sha512-kN6vzzf9NkEtawECqze6v99LtmDiUJCVpvieTFA1uL7/jDghiJGubGZ5csicYHU1Xoqb3oH/R5cN5df6W41Nfg== +"@typescript-eslint/utils@5.59.0", "@typescript-eslint/utils@^5.10.0": + version "5.59.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.59.0.tgz#063d066b3bc4850c18872649ed0da9ee72d833d5" + integrity sha512-GGLFd+86drlHSvPgN/el6dRQNYYGOvRSDVydsUaQluwIW3HvbXuxyuD5JETvBt/9qGYe+lOrDk6gRrWOHb/FvA== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@types/json-schema" "^7.0.9" "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.57.1" - "@typescript-eslint/types" "5.57.1" - "@typescript-eslint/typescript-estree" "5.57.1" + "@typescript-eslint/scope-manager" "5.59.0" + "@typescript-eslint/types" "5.59.0" + "@typescript-eslint/typescript-estree" "5.59.0" eslint-scope "^5.1.1" semver "^7.3.7" -"@typescript-eslint/visitor-keys@5.57.1": - version "5.57.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.1.tgz#585e5fa42a9bbcd9065f334fd7c8a4ddfa7d905e" - integrity sha512-RjQrAniDU0CEk5r7iphkm731zKlFiUjvcBS2yHAg8WWqFMCaCrD0rKEVOMUyMMcbGPZ0bPp56srkGWrgfZqLRA== +"@typescript-eslint/utils@5.59.1": + version "5.59.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.59.1.tgz#d89fc758ad23d2157cfae53f0b429bdf15db9473" + integrity sha512-MkTe7FE+K1/GxZkP5gRj3rCztg45bEhsd8HYjczBuYm+qFHP5vtZmjx3B0yUCDotceQ4sHgTyz60Ycl225njmA== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.59.1" + "@typescript-eslint/types" "5.59.1" + "@typescript-eslint/typescript-estree" "5.59.1" + eslint-scope "^5.1.1" + semver "^7.3.7" + +"@typescript-eslint/visitor-keys@5.59.0": + version "5.59.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz#a59913f2bf0baeb61b5cfcb6135d3926c3854365" + integrity sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA== + dependencies: + "@typescript-eslint/types" "5.59.0" + eslint-visitor-keys "^3.3.0" + +"@typescript-eslint/visitor-keys@5.59.1": + version "5.59.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.1.tgz#0d96c36efb6560d7fb8eb85de10442c10d8f6058" + integrity sha512-6waEYwBTCWryx0VJmP7JaM4FpipLsFl9CvYf2foAE8Qh/Y0s+bxWysciwOs0LTBED4JCaNxTZ5rGadB14M6dwA== dependencies: - "@typescript-eslint/types" "5.57.1" + "@typescript-eslint/types" "5.59.1" eslint-visitor-keys "^3.3.0" "@yarnpkg/core@3.4.0": @@ -3413,11 +3449,23 @@ JSONStream@^1.0.4: jsonparse "^1.2.0" through ">=2.2.7 <3" -abbrev@^1.0.0, abbrev@~1.1.1: +abbrev@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== +abbrev@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-2.0.0.tgz#cf59829b8b4f03f89dda2771cb7f3653828c89bf" + integrity sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ== + +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" @@ -3564,6 +3612,14 @@ are-we-there-yet@^3.0.0: delegates "^1.0.0" readable-stream "^3.6.0" +are-we-there-yet@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-4.0.0.tgz#3ff397dc14f08b52dd8b2a64d3cee154ab8760d2" + integrity sha512-nSXlV+u3vtVjRgihdTzbfWYzxPWGo424zPgQbHD0ZqIla3jqYAewDcvee0Ua2hjS5IfTAmjGlx1Jf0PKwjZDEw== + dependencies: + delegates "^1.0.0" + readable-stream "^4.1.0" + arg@^4.1.0: version "4.1.3" resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" @@ -3640,7 +3696,7 @@ arrify@^1.0.0, arrify@^1.0.1: resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== -asap@^2.0.0, asap@~2.0.3: +asap@~2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== @@ -3767,22 +3823,25 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + before-after-hook@^2.2.0: version "2.2.3" resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== -bin-links@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-3.0.3.tgz#3842711ef3db2cd9f16a5f404a996a12db355a6e" - integrity sha512-zKdnMPWEdh4F5INR07/eBrodC7QrF5JKvqskjz/ZZRXg5YSAZIbn8zGhbhUrElzHBZ2fvEQdOU59RHcTG3GiwA== +bin-links@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-4.0.1.tgz#afeb0549e642f61ff889b58ea2f8dca78fb9d8d3" + integrity sha512-bmFEM39CyX336ZGGRsGPlc6jZHriIoHacOQcTt72MktIjpPhZoP4te2jOyUXF3BLILmJ8aNLncoPVeIIFlrDeA== dependencies: - cmd-shim "^5.0.0" - mkdirp-infer-owner "^2.0.0" - npm-normalize-package-bin "^2.0.0" - read-cmd-shim "^3.0.0" - rimraf "^3.0.0" - write-file-atomic "^4.0.0" + cmd-shim "^6.0.0" + npm-normalize-package-bin "^3.0.0" + read-cmd-shim "^4.0.0" + write-file-atomic "^5.0.0" binary-extensions@^2.2.0: version "2.2.0" @@ -3870,6 +3929,14 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + builtins@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9" @@ -3887,7 +3954,7 @@ bunyan@1.8.15: mv "~2" safe-json-stringify "~1" -cacache@17.0.5: +cacache@17.0.5, cacache@^17.0.0, cacache@^17.0.4, cacache@^17.0.5: version "17.0.5" resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.0.5.tgz#6dbec26c11f1f6a2b558bc11ed3316577c339ebc" integrity sha512-Y/PRQevNSsjAPWykl9aeGz8Pr+OI6BYM9fYDNMvOkuUiG9IhG4LEmaYrZZZvioMUEQ+cBCxT0v8wrnCURccyKA== @@ -3906,7 +3973,7 @@ cacache@17.0.5: tar "^6.1.11" unique-filename "^3.0.0" -cacache@^16.0.0, cacache@^16.1.0, cacache@^16.1.3: +cacache@^16.1.0: version "16.1.3" resolved "https://registry.yarnpkg.com/cacache/-/cacache-16.1.3.tgz#a02b9f34ecfaf9a78c9f4bc16fceb94d5d67a38e" integrity sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ== @@ -3986,9 +4053,9 @@ camelcase@^6.2.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001449: - version "1.0.30001477" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001477.tgz#a2ffb2276258233034bbb869d4558b02658a511e" - integrity sha512-lZim4iUHhGcy5p+Ri/G7m84hJwncj+Kz7S5aD4hoQfslKZJgt0tHc/hafVbqHC5bbhHb+mrW2JOUHkI5KH7toQ== + version "1.0.30001481" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001481.tgz#f58a717afe92f9e69d0e35ff64df596bfad93912" + integrity sha512-KCqHwRnaa1InZBtqXzP98LPg0ajCVujMKjqKDhZEthIpAsJl/YEIa3YvXjGXPVqzZVguccuu7ga9KOE1J9rKPQ== cardinal@^2.1.1: version "2.1.1" @@ -4067,7 +4134,7 @@ chownr@^2.0.0: resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== -ci-info@^3.2.0: +ci-info@^3.2.0, ci-info@^3.6.1, ci-info@^3.7.1, ci-info@^3.8.0: version "3.8.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== @@ -4116,7 +4183,7 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" -cli-table3@^0.6.1, cli-table3@^0.6.2: +cli-table3@^0.6.1, cli-table3@^0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== @@ -4174,12 +4241,10 @@ cluster-key-slot@1.1.2: resolved "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz#88ddaa46906e303b5de30d3153b7d9fe0a0c19ac" integrity sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA== -cmd-shim@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-5.0.0.tgz#8d0aaa1a6b0708630694c4dbde070ed94c707724" - integrity sha512-qkCtZ59BidfEwHltnJwkyVZn+XQojdAySM1D1gSeh11Z4pW1Kpolkyo53L5noc0nrxmIvyFwTmJRo4xs7FFLPw== - dependencies: - mkdirp-infer-owner "^2.0.0" +cmd-shim@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-6.0.1.tgz#a65878080548e1dca760b3aea1e21ed05194da9d" + integrity sha512-S9iI9y0nKR4hwEQsVWpyxld/6kRfGepGfzff83FcaiEBpmvlbA2nnGe7Cylgrx2f/p1P5S5wpRm9oL8z1PbS3Q== co@^4.6.0: version "4.6.0" @@ -4221,9 +4286,9 @@ color-support@^1.1.3: integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== colorette@^2.0.19: - version "2.0.19" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" - integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== columnify@^1.6.0: version "1.6.0" @@ -4233,10 +4298,10 @@ columnify@^1.6.0: strip-ansi "^6.0.1" wcwidth "^1.0.0" -commander@10.0.0, commander@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.0.tgz#71797971162cd3cf65f0b9d24eb28f8d303acdf1" - integrity sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA== +commander@10.0.1, commander@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== common-ancestor-path@^1.0.1: version "1.0.1" @@ -4347,9 +4412,9 @@ convert-source-map@^2.0.0: integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== core-js-pure@^3.25.1: - version "3.30.0" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.30.0.tgz#41b6c42e5f363bd53d79999bd35093b17e42e1bf" - integrity sha512-+2KbMFGeBU0ln/csoPqTe0i/yfHbrd2EUhNMObsGtXMKS/RTtlkYyi+/3twLcevbgNR0yM/r0Psa3TEoQRpFMQ== + version "3.30.1" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.30.1.tgz#7d93dc89e7d47b8ef05d7e79f507b0e99ea77eec" + integrity sha512-nXBEVpmUnNRhz83cHd9JRQC52cTMcuXAmR56+9dSMpRdpeA4I1PX6yjmhd71Eyc/wXNsdBdUDIj1QTIeZpU5Tg== core-util-is@~1.0.0: version "1.0.3" @@ -4405,10 +4470,12 @@ crypto-random-string@3.3.1: dependencies: type-fest "^0.8.1" -crypto-random-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" - integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== +crypto-random-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-4.0.0.tgz#5a3cc53d7dd86183df5da0312816ceeeb5bb1fc2" + integrity sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA== + dependencies: + type-fest "^1.0.1" css-select@^5.1.0: version "5.1.0" @@ -4455,11 +4522,6 @@ debug@^3.2.7: dependencies: ms "^2.1.1" -debuglog@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" - integrity sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw== - decamelize-keys@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" @@ -4517,27 +4579,13 @@ define-lazy-prop@^2.0.0: resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== -define-properties@^1.1.3, define-properties@^1.1.4: +define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" - integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== - dependencies: - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -del@^6.0.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/del/-/del-6.1.1.tgz#3b70314f1ec0aa325c6b14eb36b95786671edb7a" - integrity sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg== - dependencies: - globby "^11.0.1" - graceful-fs "^4.2.4" - is-glob "^4.0.1" - is-path-cwd "^2.2.0" - is-path-inside "^3.0.2" - p-map "^4.0.0" - rimraf "^3.0.2" - slash "^3.0.0" + integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" delay@5.0.0: version "5.0.0" @@ -4579,14 +4627,6 @@ detect-node@^2.0.4: resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== -dezalgo@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.4.tgz#751235260469084c132157dfa857f386d4c33d81" - integrity sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig== - dependencies: - asap "^2.0.0" - wrappy "1" - diff-sequences@^29.4.3: version "29.4.3" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" @@ -4690,9 +4730,9 @@ editorconfig@1.0.2: semver "^7.3.8" electron-to-chromium@^1.4.284: - version "1.4.356" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.356.tgz#b75a8a8c31d571f6024310cc980a08cd6c15a8c5" - integrity sha512-nEftV1dRX3omlxAj42FwqRZT0i4xd2dIg39sog/CnCJeCcL1TRd2Uh0i9Oebgv8Ou0vzTPw++xc+Z20jzS2B6A== + version "1.4.369" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.369.tgz#a98d838cdd79be4471cd04e9b4dffe891d037874" + integrity sha512-LfxbHXdA/S+qyoTEA4EbhxGjrxx7WK2h6yb5K2v0UCOufUKX+VZaHbl3svlzZfv9sGseym/g3Ne4DpsgRULmqg== email-addresses@5.0.0: version "5.0.0" @@ -4756,29 +4796,29 @@ end-of-stream@~1.1.0: once "~1.3.0" enhanced-resolve@^5.12.0: - version "5.12.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634" - integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ== + version "5.13.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.13.0.tgz#26d1ecc448c02de997133217b5c1053f34a0a275" + integrity sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" entities@^4.2.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" - integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== entities@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4" integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q== -env-ci@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/env-ci/-/env-ci-8.0.0.tgz#97a6605c6639b2a74c74b1557500bc152c1c6e7e" - integrity sha512-W+3BqGZozFua9MPeXpmTm5eYEBtGgL76jGu/pwMVp/L8PdECSCEWaIp7d4Mw7kuUrbUldK0oV0bNd6ZZjLiMiA== +env-ci@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/env-ci/-/env-ci-9.0.0.tgz#53df706b4b841f5f05413402ef82049eba8e4af3" + integrity sha512-Q3cjr1tX9xwigprw4G8M3o7PIOO/1LYji6TyGsbD1WfMmD23etZvhgmPXJqkP788yH4dgSSK7oaIMuaayUJIfg== dependencies: - execa "^6.1.0" + execa "^7.0.0" java-properties "^1.0.2" env-paths@^2.2.0: @@ -4791,7 +4831,7 @@ err-code@^2.0.2: resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== -error-ex@^1.3.1: +error-ex@^1.3.1, error-ex@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== @@ -4930,13 +4970,14 @@ eslint-import-resolver-node@^0.3.7: is-core-module "^2.11.0" resolve "^1.22.1" -eslint-import-resolver-typescript@3.5.4: - version "3.5.4" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.4.tgz#7370c326c3c08f0c1839c592d79d20b704de15d4" - integrity sha512-9xUpnedEmSfG57sN1UvWPiEhfJ8bPt0Wg2XysA7Mlc79iFGhmJtRUg9LxtkK81FhMUui0YuR2E8iUsVhePkh4A== +eslint-import-resolver-typescript@3.5.5: + version "3.5.5" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.5.tgz#0a9034ae7ed94b254a360fbea89187b60ea7456d" + integrity sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw== dependencies: debug "^4.3.4" enhanced-resolve "^5.12.0" + eslint-module-utils "^2.7.4" get-tsconfig "^4.5.0" globby "^13.1.3" is-core-module "^2.11.0" @@ -4944,9 +4985,9 @@ eslint-import-resolver-typescript@3.5.4: synckit "^0.8.5" eslint-module-utils@^2.7.4: - version "2.7.4" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974" - integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== + version "2.8.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" + integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== dependencies: debug "^3.2.7" @@ -5003,10 +5044,10 @@ eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-scope@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" - integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== +eslint-scope@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.0.tgz#f21ebdafda02352f103634b96dd47d9f81ca117b" + integrity sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" @@ -5016,15 +5057,15 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz#c7f0f956124ce677047ddbc192a68f999454dedc" integrity sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ== -eslint@8.37.0: - version "8.37.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.37.0.tgz#1f660ef2ce49a0bfdec0b0d698e0b8b627287412" - integrity sha512-NU3Ps9nI05GUoVMxcZx1J8CNR6xOvUT4jAUMH5+z8lpp3aEdPVCImKw6PWG4PY+Vfkpr+jvMpxs/qoE7wq0sPw== +eslint@8.39.0: + version "8.39.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.39.0.tgz#7fd20a295ef92d43809e914b70c39fd5a23cf3f1" + integrity sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.4.0" "@eslint/eslintrc" "^2.0.2" - "@eslint/js" "8.37.0" + "@eslint/js" "8.39.0" "@humanwhocodes/config-array" "^0.11.8" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" @@ -5034,7 +5075,7 @@ eslint@8.37.0: debug "^4.3.2" doctrine "^3.0.0" escape-string-regexp "^4.0.0" - eslint-scope "^7.1.1" + eslint-scope "^7.2.0" eslint-visitor-keys "^3.4.0" espree "^9.5.1" esquery "^1.4.2" @@ -5105,11 +5146,21 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + eventemitter3@^4.0.4: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== +events@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + execa@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" @@ -5125,21 +5176,6 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" -execa@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-6.1.0.tgz#cea16dee211ff011246556388effa0818394fb20" - integrity sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.1" - human-signals "^3.0.1" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^3.0.7" - strip-final-newline "^3.0.0" - execa@^7.0.0: version "7.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-7.1.1.tgz#3eb3c83d239488e7b409d48e8813b76bb55c9c43" @@ -5234,7 +5270,7 @@ fast-xml-parser@4.1.2: dependencies: strnum "^1.0.5" -fastest-levenshtein@^1.0.12: +fastest-levenshtein@^1.0.16: version "1.0.16" resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== @@ -5382,7 +5418,7 @@ fs-minipass@^2.0.0, fs-minipass@^2.1.0: dependencies: minipass "^3.0.0" -fs-minipass@^3.0.0: +fs-minipass@^3.0.0, fs-minipass@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-3.0.1.tgz#853809af15b6d03e27638d1ab6432e6b378b085d" integrity sha512-MhaJDcFRTuLidHrIttu0RDGyyXs/IYHVmlcxfLAEFIWjc1vdLAkdwT7Ace2u7DbitWC0toKMl5eJZRYNVreIMw== @@ -5419,7 +5455,7 @@ function.prototype.name@^1.1.5: es-abstract "^1.19.0" functions-have-names "^1.2.2" -functions-have-names@^1.2.2: +functions-have-names@^1.2.2, functions-have-names@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== @@ -5438,6 +5474,20 @@ gauge@^4.0.3: strip-ansi "^6.0.1" wide-align "^1.1.5" +gauge@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-5.0.0.tgz#e270ca9d97dae84abf64e5277ef1ebddc7dd1e2f" + integrity sha512-0s5T5eciEG7Q3ugkxAkFtaDhrrhXsCRivA5y8C9WMHWuI8UlMOJg7+Iwf7Mccii+Dfs3H5jHepU0joPVyQU0Lw== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.3" + console-control-strings "^1.1.0" + has-unicode "^2.0.1" + signal-exit "^3.0.7" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.5" + generic-pool@3.9.0: version "3.9.0" resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-3.9.0.tgz#36f4a678e963f4fdb8707eab050823abc4e8f5e4" @@ -5583,7 +5633,7 @@ glob@^7.0.0, glob@^7.1.3, glob@^7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^9.2.0, glob@^9.3.1: +glob@^9.2.0, glob@^9.3.0, glob@^9.3.1, glob@^9.3.2: version "9.3.5" resolved "https://registry.yarnpkg.com/glob/-/glob-9.3.5.tgz#ca2ed8ca452781a3009685607fdf025a899dfe21" integrity sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q== @@ -5629,7 +5679,7 @@ globalyzer@0.1.0: resolved "https://registry.yarnpkg.com/globalyzer/-/globalyzer-0.1.0.tgz#cb76da79555669a1519d5a8edf093afaa0bf1465" integrity sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q== -globby@13.1.3, globby@^13.1.3: +globby@13.1.3: version "13.1.3" resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.3.tgz#f62baf5720bcb2c1330c8d4ef222ee12318563ff" integrity sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw== @@ -5652,6 +5702,17 @@ globby@^11.0.0, globby@^11.0.1, globby@^11.1.0: merge2 "^1.4.1" slash "^3.0.0" +globby@^13.1.3: + version "13.1.4" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.4.tgz#2f91c116066bcec152465ba36e5caa4a13c01317" + integrity sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g== + dependencies: + dir-glob "^3.0.1" + fast-glob "^3.2.11" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^4.0.0" + globrex@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" @@ -5696,7 +5757,7 @@ graceful-fs@4.2.10: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.10, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -5819,14 +5880,7 @@ hosted-git-info@^4.0.1: dependencies: lru-cache "^6.0.0" -hosted-git-info@^5.0.0, hosted-git-info@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-5.2.1.tgz#0ba1c97178ef91f3ab30842ae63d6a272341156f" - integrity sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw== - dependencies: - lru-cache "^7.5.1" - -hosted-git-info@^6.0.0: +hosted-git-info@^6.0.0, hosted-git-info@^6.1.1: version "6.1.1" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-6.1.1.tgz#629442c7889a69c05de604d52996b74fe6f26d58" integrity sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w== @@ -5838,7 +5892,7 @@ html-escaper@^2.0.0: resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== -http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0: +http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0, http-cache-semantics@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== @@ -5873,11 +5927,6 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -human-signals@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-3.0.1.tgz#c740920859dafa50e5a3222da9d3bf4bb0e5eef5" - integrity sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ== - human-signals@^4.3.0: version "4.3.1" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" @@ -5902,12 +5951,17 @@ iconv-lite@^0.6.2: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" -ignore-walk@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-5.0.1.tgz#5f199e23e1288f518d90358d461387788a154776" - integrity sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw== +ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore-walk@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-6.0.2.tgz#c48f48397cf8ef6174fcc28aa5f8c1de6203d389" + integrity sha512-ezmQ1Dg2b3jVZh2Dh+ar6Eu2MqNSTkyb32HU2MAQQQX9tKM3q/UQ/9lf03lQ5hW+fOeoMnwxwkleZ0xcNp0/qg== dependencies: - minimatch "^5.0.1" + minimatch "^7.4.2" ignore@5.2.4, ignore@^5.2.0: version "5.2.4" @@ -5973,7 +6027,7 @@ inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -ini@3.0.1, ini@^3.0.0, ini@^3.0.1: +ini@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/ini/-/ini-3.0.1.tgz#c76ec81007875bc44d544ff7a11a55d12294102d" integrity sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ== @@ -5983,18 +6037,23 @@ ini@^1.3.4, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -init-package-json@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-3.0.2.tgz#f5bc9bac93f2bdc005778bc2271be642fecfcd69" - integrity sha512-YhlQPEjNFqlGdzrBfDNRLhvoSgX7iQRgSxgsNknRQ9ITXFT7UMfVMWhBTOh2Y+25lRnGrv5Xz8yZwQ3ACR6T3A== +ini@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.0.tgz#3bca65a0ae224f07f8f8b3392d8c94a7f1bb007b" + integrity sha512-HLR38RSF2iulAzc3I/sma4CoYxQP844rPYCNfzGDOHqa/YqVlwuuZgBx6M50/X8dKgzk0cm1qRg3+47mK2N+cQ== + +init-package-json@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-5.0.0.tgz#030cf0ea9c84cfc1b0dc2e898b45d171393e4b40" + integrity sha512-kBhlSheBfYmq3e0L1ii+VKe3zBTLL5lDCDWR+f9dLmEGSB3MqLlMlsolubSsyI88Bg6EA+BIMlomAnQ1SwgQBw== dependencies: - npm-package-arg "^9.0.1" - promzard "^0.3.0" - read "^1.0.7" - read-package-json "^5.0.0" + npm-package-arg "^10.0.0" + promzard "^1.0.0" + read "^2.0.0" + read-package-json "^6.0.0" semver "^7.3.5" validate-npm-package-license "^3.0.4" - validate-npm-package-name "^4.0.0" + validate-npm-package-name "^5.0.0" install-artifact-from-github@^1.3.1: version "1.3.2" @@ -6101,9 +6160,9 @@ is-cidr@^4.0.2: cidr-regex "^3.1.1" is-core-module@^2.11.0, is-core-module@^2.5.0, is-core-module@^2.8.1: - version "2.11.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" - integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== + version "2.12.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.0.tgz#36ad62f6f73c8253fd6472517a12483cf03e7ec4" + integrity sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ== dependencies: has "^1.0.3" @@ -6190,12 +6249,7 @@ is-obj@^2.0.0: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== -is-path-cwd@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" - integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== - -is-path-inside@^3.0.2, is-path-inside@^3.0.3: +is-path-inside@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== @@ -6840,11 +6894,16 @@ json-parse-better-errors@^1.0.1: resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== -json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: +json-parse-even-better-errors@^2.3.0: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== +json-parse-even-better-errors@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz#2cb2ee33069a78870a0c7e3da560026b89669cf7" + integrity sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -6901,10 +6960,10 @@ just-diff-apply@^5.2.0: resolved "https://registry.yarnpkg.com/just-diff-apply/-/just-diff-apply-5.5.0.tgz#771c2ca9fa69f3d2b54e7c3f5c1dfcbcc47f9f0f" integrity sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw== -just-diff@^5.0.1: - version "5.2.0" - resolved "https://registry.yarnpkg.com/just-diff/-/just-diff-5.2.0.tgz#60dca55891cf24cd4a094e33504660692348a241" - integrity sha512-6ufhP9SHjb7jibNFrNxyFZ6od3g+An6Ai9mhGRvcYe8UJlH0prseN64M+6ZBBUoKYHZsitDP42gAJ8+eVWr3lw== +just-diff@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/just-diff/-/just-diff-6.0.2.tgz#03b65908543ac0521caf6d8eb85035f7d27ea285" + integrity sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA== just-extend@^4.0.2: version "4.2.1" @@ -6946,117 +7005,118 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -libnpmaccess@^6.0.4: - version "6.0.4" - resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-6.0.4.tgz#2dd158bd8a071817e2207d3b201d37cf1ad6ae6b" - integrity sha512-qZ3wcfIyUoW0+qSFkMBovcTrSGJ3ZeyvpR7d5N9pEYv/kXs8sHP2wiqEIXBKLFrZlmM0kR0RJD7mtfLngtlLag== +libnpmaccess@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-7.0.2.tgz#7f056c8c933dd9c8ba771fa6493556b53c5aac52" + integrity sha512-vHBVMw1JFMTgEk15zRsJuSAg7QtGGHpUSEfnbcRL1/gTBag9iEfJbyjpDmdJmwMhvpoLoNBtdAUCdGnaP32hhw== dependencies: - aproba "^2.0.0" - minipass "^3.1.1" - npm-package-arg "^9.0.1" - npm-registry-fetch "^13.0.0" + npm-package-arg "^10.1.0" + npm-registry-fetch "^14.0.3" -libnpmdiff@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/libnpmdiff/-/libnpmdiff-4.0.5.tgz#ffaf93fa9440ea759444b8830fdb5c661b09a7c0" - integrity sha512-9fICQIzmH892UwHHPmb+Seup50UIBWcMIK2FdxvlXm9b4kc1nSH0b/BuY1mORJQtB6ydPMnn+BLzOTmd/SKJmw== +libnpmdiff@^5.0.16: + version "5.0.16" + resolved "https://registry.yarnpkg.com/libnpmdiff/-/libnpmdiff-5.0.16.tgz#5d53d23b19dda6de4bfef80c60d793fa6c6bab68" + integrity sha512-Hu6Jhernk9MP8poIZh6JffJFZNgG+GCWXBP+tO+xQ0/Nc8W38TcAyEHp13pyVB3iXva8aUzcY/UO3gnoeOki7w== dependencies: - "@npmcli/disparity-colors" "^2.0.0" - "@npmcli/installed-package-contents" "^1.0.7" + "@npmcli/arborist" "^6.2.8" + "@npmcli/disparity-colors" "^3.0.0" + "@npmcli/installed-package-contents" "^2.0.2" binary-extensions "^2.2.0" diff "^5.1.0" - minimatch "^5.0.1" - npm-package-arg "^9.0.1" - pacote "^13.6.1" - tar "^6.1.0" - -libnpmexec@^4.0.14: - version "4.0.14" - resolved "https://registry.yarnpkg.com/libnpmexec/-/libnpmexec-4.0.14.tgz#9ad44232434b374e477eb2c2e4548baaf698f773" - integrity sha512-dwmzv2K29SdoAHBOa7QR6CfQbFG/PiZDRF6HZrlI6C4DLt2hNgOHTFaUGOpqE2C+YGu0ZwYTDywxRe0eOnf0ZA== - dependencies: - "@npmcli/arborist" "^5.6.3" - "@npmcli/ci-detect" "^2.0.0" - "@npmcli/fs" "^2.1.1" - "@npmcli/run-script" "^4.2.0" + minimatch "^7.4.2" + npm-package-arg "^10.1.0" + pacote "^15.0.8" + tar "^6.1.13" + +libnpmexec@^5.0.16: + version "5.0.16" + resolved "https://registry.yarnpkg.com/libnpmexec/-/libnpmexec-5.0.16.tgz#d85e13d1a53cade1e4b9febefa243dfa06b0faf4" + integrity sha512-HpGl1Oi7G7iPiCfECbe/l51bsUM7H7FxEgeFkLNXldE8Px+3SAlaWG5mJf5i+BmxMLCbigNWa/jlvErcu1eVKA== + dependencies: + "@npmcli/arborist" "^6.2.8" + "@npmcli/run-script" "^6.0.0" chalk "^4.1.0" - mkdirp-infer-owner "^2.0.0" - npm-package-arg "^9.0.1" - npmlog "^6.0.2" - pacote "^13.6.1" - proc-log "^2.0.0" - read "^1.0.7" - read-package-json-fast "^2.0.2" + ci-info "^3.7.1" + npm-package-arg "^10.1.0" + npmlog "^7.0.1" + pacote "^15.0.8" + proc-log "^3.0.0" + read "^2.0.0" + read-package-json-fast "^3.0.2" semver "^7.3.7" - walk-up-path "^1.0.0" + walk-up-path "^3.0.1" -libnpmfund@^3.0.5: - version "3.0.5" - resolved "https://registry.yarnpkg.com/libnpmfund/-/libnpmfund-3.0.5.tgz#817f9e2120889beb483d9ba8eda142bb84293e4e" - integrity sha512-KdeRoG/dem8H3PcEU2/0SKi3ip7AWwczgS72y/3PE+PBrz/s/G52FNIA9jeLnBirkLC0sOyQHfeM3b7e24ZM+g== +libnpmfund@^4.0.16: + version "4.0.16" + resolved "https://registry.yarnpkg.com/libnpmfund/-/libnpmfund-4.0.16.tgz#13203679403c5cff75f926cf1831089057c01b16" + integrity sha512-IYRsfuK1WRgpdvmaXyKzpBQZGIxkvclKiYC4RYE56BiZWf3gwwcSdZU4a+ZuanF3Ovy6aOfNGa9jxLfYc8fMpg== dependencies: - "@npmcli/arborist" "^5.6.3" + "@npmcli/arborist" "^6.2.8" -libnpmhook@^8.0.4: - version "8.0.4" - resolved "https://registry.yarnpkg.com/libnpmhook/-/libnpmhook-8.0.4.tgz#6c58e5fe763ff5d600ae9c20457ea9a69d1f7d87" - integrity sha512-nuD6e+Nx0OprjEi0wOeqASMl6QIH235th/Du2/8upK3evByFhzIgdfOeP1OhstavW4xtsl0hk5Vw4fAWWuSUgA== +libnpmhook@^9.0.3: + version "9.0.3" + resolved "https://registry.yarnpkg.com/libnpmhook/-/libnpmhook-9.0.3.tgz#5dbd6a146feb7e11993d36a26f750ae2347bb1d9" + integrity sha512-wMZe58sI7KLhg0+nUWZW5KdMfjNNcOIIbkoP19BDHYoUF9El7eeUWkGNxUGzpHkPKiGoQ1z/v6CYin4deebeuw== dependencies: aproba "^2.0.0" - npm-registry-fetch "^13.0.0" + npm-registry-fetch "^14.0.3" -libnpmorg@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/libnpmorg/-/libnpmorg-4.0.4.tgz#2a01d49372cf0df90d79a61e69bddaf2ed704311" - integrity sha512-1bTpD7iub1rDCsgiBguhJhiDufLQuc8DEti20euqsXz9O0ncXVpCYqf2SMmHR4GEdmAvAj2r7FMiyA9zGdaTpA== +libnpmorg@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/libnpmorg/-/libnpmorg-5.0.3.tgz#bd0a11d7a84b5f5c14689fb1e244fbb540700d63" + integrity sha512-QCLLB2oKCCwdiedQRcsj5eHAyYXM7vICM5f0gB9aRQzyVzx57S3anBIzhEUOhJxq6cWKtXRfkR5GsCxHEJ0CxA== dependencies: aproba "^2.0.0" - npm-registry-fetch "^13.0.0" - -libnpmpack@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/libnpmpack/-/libnpmpack-4.1.3.tgz#025cfe39829acd8260662bf259e3a9331fc1e4b2" - integrity sha512-rYP4X++ME3ZiFO+2iN3YnXJ4LB4Gsd0z5cgszWJZxaEpDN4lRIXirSyynGNsN/hn4taqnlxD+3DPlFDShvRM8w== - dependencies: - "@npmcli/run-script" "^4.1.3" - npm-package-arg "^9.0.1" - pacote "^13.6.1" - -libnpmpublish@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-6.0.5.tgz#5a894f3de2e267d62f86be2a508e362599b5a4b1" - integrity sha512-LUR08JKSviZiqrYTDfywvtnsnxr+tOvBU0BF8H+9frt7HMvc6Qn6F8Ubm72g5hDTHbq8qupKfDvDAln2TVPvFg== - dependencies: - normalize-package-data "^4.0.0" - npm-package-arg "^9.0.1" - npm-registry-fetch "^13.0.0" + npm-registry-fetch "^14.0.3" + +libnpmpack@^5.0.16: + version "5.0.16" + resolved "https://registry.yarnpkg.com/libnpmpack/-/libnpmpack-5.0.16.tgz#15d170bdadcba044ffad271cda1ac3d86c3d6131" + integrity sha512-gbxL4Amc4eEWoRZaC/XZQdQMHB9e42vrdcLAklbaLmj7gGz94tP9e3/fH3HAegATOgSXUNipGxadXs00HAl4BA== + dependencies: + "@npmcli/arborist" "^6.2.8" + "@npmcli/run-script" "^6.0.0" + npm-package-arg "^10.1.0" + pacote "^15.0.8" + +libnpmpublish@^7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-7.1.3.tgz#98e1b0a41cc8addfb7a8aee241e57e0034b877c4" + integrity sha512-Ek/pCn90CphbpeQ3Jrd/TtQNsvBjwHnB1gtxrWiZQNCed7hTMlSSQzYhnZeipAXvxxQkH3Ebf34/60Hw2JyV+g== + dependencies: + ci-info "^3.6.1" + normalize-package-data "^5.0.0" + npm-package-arg "^10.1.0" + npm-registry-fetch "^14.0.3" + proc-log "^3.0.0" semver "^7.3.7" - ssri "^9.0.0" + sigstore "^1.0.0" + ssri "^10.0.1" -libnpmsearch@^5.0.4: - version "5.0.4" - resolved "https://registry.yarnpkg.com/libnpmsearch/-/libnpmsearch-5.0.4.tgz#b32aa2b23051c00cdcc0912274d0d416e6655d81" - integrity sha512-XHDmsvpN5+pufvGnfLRqpy218gcGGbbbXR6wPrDJyd1em6agKdYByzU5ccskDHH9iVm2UeLydpDsW1ksYuU0cg== +libnpmsearch@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/libnpmsearch/-/libnpmsearch-6.0.2.tgz#b6a531a312855dd3bf84dd273b1033dd09b4cbec" + integrity sha512-p+5BF19AvnVg8mcIQhy6yWhI6jHQRVMYaIaKeITEfYAffWsqbottA/WZdMtHL76hViC6SFM1WdclM1w5eAIa1g== dependencies: - npm-registry-fetch "^13.0.0" + npm-registry-fetch "^14.0.3" -libnpmteam@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/libnpmteam/-/libnpmteam-4.0.4.tgz#ac26068808d93b1051d926457db14e4b3ff669ef" - integrity sha512-rzKSwi6MLzwwevbM/vl+BBQTErgn24tCfgPUdzBlszrw3j5necOu7WnTzgvZMDv6maGUwec6Ut1rxszOgH0l+Q== +libnpmteam@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/libnpmteam/-/libnpmteam-5.0.3.tgz#196657e9d87c0cc914c44fee588ad2b838074a3c" + integrity sha512-7XOGhi45s+ml6TyrhJUTyrErcoDMKGKfEtiTEco4ofU7BGGAUOalVztKMVLLJgJOOXdIAIlzCHqkTXEuSiyCiA== dependencies: aproba "^2.0.0" - npm-registry-fetch "^13.0.0" + npm-registry-fetch "^14.0.3" -libnpmversion@^3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/libnpmversion/-/libnpmversion-3.0.7.tgz#e4c6c07ee28cf351ce1e2293a5ac9922b09ea94d" - integrity sha512-O0L4eNMUIMQ+effi1HsZPKp2N6wecwqGqB8PvkvmLPWN7EsdabdzAVG48nv0p/OjlbIai5KQg/L+qMMfCA4ZjA== +libnpmversion@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/libnpmversion/-/libnpmversion-4.0.2.tgz#cad9cd1b287fcf9576a64edfe71491b49a65d06f" + integrity sha512-n1X70mFHv8Piy4yos+MFWUARSkTbyV5cdsHScaIkuwYvRAF/s2VtYScDzWB4Oe8uNEuGNdjiRR1E/Dh1tMvv6g== dependencies: - "@npmcli/git" "^3.0.0" - "@npmcli/run-script" "^4.1.3" - json-parse-even-better-errors "^2.3.1" - proc-log "^2.0.0" + "@npmcli/git" "^4.0.1" + "@npmcli/run-script" "^6.0.0" + json-parse-even-better-errors "^3.0.0" + proc-log "^3.0.0" semver "^7.3.7" lie@3.1.1: @@ -7076,6 +7136,11 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== +lines-and-columns@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-2.0.3.tgz#b2f0badedb556b747020ab8ea7f0373e22efac1b" + integrity sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w== + linkify-it@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-4.0.1.tgz#01f1d5e508190d06669982ba31a7d9f56a5751ec" @@ -7083,10 +7148,10 @@ linkify-it@^4.0.1: dependencies: uc.micro "^1.0.1" -lint-staged@13.2.0: - version "13.2.0" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-13.2.0.tgz#b7abaf79c91cd36d824f17b23a4ce5209206126a" - integrity sha512-GbyK5iWinax5Dfw5obm2g2ccUiZXNGtAS4mCbJ0Lv4rq6iEtfBSjOYdcbOtAIFtM114t0vdpViDDetjVTSd8Vw== +lint-staged@13.2.1: + version "13.2.1" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-13.2.1.tgz#9d30a14e3e42897ef417bc98556fb757f75cae87" + integrity sha512-8gfzinVXoPfga5Dz/ZOn8I2GOhf81Wvs+KwbEXQn/oWZAvCVS2PivrXfVbFJc93zD16uC0neS47RXHIjXKYZQw== dependencies: chalk "5.2.0" cli-truncate "^3.1.0" @@ -7257,9 +7322,9 @@ lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== lru-cache@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-9.0.0.tgz#daece36a9fc332e93f8e75f3fcfd17900253567c" - integrity sha512-9AEKXzvOZc4BMacFnYiTOlDH/197LNnQIK9wZ6iMB5NXPzuv4bWR/Msv7iUMplkiMQ1qQL+KSv/JF1mZAB5Lrg== + version "9.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-9.1.1.tgz#c58a93de58630b688de39ad04ef02ef26f1902f1" + integrity sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A== luxon@3.3.0, luxon@^3.3.0: version "3.3.0" @@ -7278,7 +7343,7 @@ make-error@1.x, make-error@^1.1.1: resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== -make-fetch-happen@^10.0.3, make-fetch-happen@^10.0.6, make-fetch-happen@^10.2.0: +make-fetch-happen@^10.0.3: version "10.2.1" resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz#f5e3835c5e9817b617f2770870d9492d28678164" integrity sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w== @@ -7300,6 +7365,27 @@ make-fetch-happen@^10.0.3, make-fetch-happen@^10.0.6, make-fetch-happen@^10.2.0: socks-proxy-agent "^7.0.0" ssri "^9.0.0" +make-fetch-happen@^11.0.0, make-fetch-happen@^11.0.1, make-fetch-happen@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-11.1.0.tgz#f26b05e89317e960b75fd5e080e40d40f8d7b2a5" + integrity sha512-7ChuOzCb1LzdQZrTy0ky6RsCoMYeM+Fh4cY0+4zsJVhNcH5Q3OJojLY1mGkD0xAhWB29lskECVb6ZopofwjldA== + dependencies: + agentkeepalive "^4.2.1" + cacache "^17.0.0" + http-cache-semantics "^4.1.1" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^7.7.1" + minipass "^4.0.0" + minipass-fetch "^3.0.0" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.3" + promise-retry "^2.0.1" + socks-proxy-agent "^7.0.0" + ssri "^10.0.0" + makeerror@1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" @@ -7430,10 +7516,10 @@ mdurl@^1.0.1: resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== -memfs@3.4.13: - version "3.4.13" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.13.tgz#248a8bd239b3c240175cd5ec548de5227fc4f345" - integrity sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg== +memfs@3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.5.0.tgz#9da86405fca0a539addafd37dbd452344fd1c0bd" + integrity sha512-yK6o8xVJlQerz57kvPROwTMgx5WtGwC2ZxDtOUsnGl49rHjYkfQoPNZPCKH73VdLE1BwBu/+Fx/NL8NYMUw2aA== dependencies: fs-monkey "^1.0.3" @@ -7544,7 +7630,7 @@ minimalistic-assert@^1.0.0: dependencies: brace-expansion "^1.1.7" -minimatch@5.1.6, minimatch@^5.0.1, minimatch@^5.1.0: +minimatch@5.1.6, minimatch@^5.0.1: version "5.1.6" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== @@ -7558,6 +7644,13 @@ minimatch@6.1.6: dependencies: brace-expansion "^2.0.1" +minimatch@^7.4.2, minimatch@^7.4.6: + version "7.4.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-7.4.6.tgz#845d6f254d8f4a5e4fd6baf44d5f10c8448365fb" + integrity sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw== + dependencies: + brace-expansion "^2.0.1" + minimatch@^8.0.2: version "8.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-8.0.4.tgz#847c1b25c014d4e9a7f68aaf63dedd668a626229" @@ -7597,6 +7690,17 @@ minipass-fetch@^2.0.3: optionalDependencies: encoding "^0.1.13" +minipass-fetch@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.2.tgz#2f7275ae13f2fb0f2a469cee4f78250c25c80ab3" + integrity sha512-/ZpF1CQaWYqjbhfFgKNt3azxztEpc/JUPuMkqOgrnMQqcU8CbE409AUdJYTIWryl3PP5CBaTJZT71N49MXP/YA== + dependencies: + minipass "^4.0.0" + minipass-sized "^1.0.3" + minizlib "^2.1.2" + optionalDependencies: + encoding "^0.1.13" + minipass-flush@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" @@ -7633,10 +7737,10 @@ minipass@^3.0.0, minipass@^3.1.1, minipass@^3.1.6: dependencies: yallist "^4.0.0" -minipass@^4.0.0, minipass@^4.2.4: - version "4.2.7" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.7.tgz#14c6fc0dcab54d9c4dd64b2b7032fef04efec218" - integrity sha512-ScVIgqHcXRMyfflqHmEW0bm8z8rb5McHyOY3ewX9JBgZaR77G7nxq9L/mtV96/QbAAwtbCAHVVLzD1kkyfFQEw== +minipass@^4.0.0, minipass@^4.2.4, minipass@^4.2.8: + version "4.2.8" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.8.tgz#f0010f64393ecfc1d1ccb5f582bcaf45f48e1a3a" + integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== minipass@^5.0.0: version "5.0.0" @@ -7651,15 +7755,6 @@ minizlib@^2.1.1, minizlib@^2.1.2: minipass "^3.0.0" yallist "^4.0.0" -mkdirp-infer-owner@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz#55d3b368e7d89065c38f32fd38e638f0ab61d316" - integrity sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw== - dependencies: - chownr "^2.0.0" - infer-owner "^1.0.4" - mkdirp "^1.0.3" - mkdirp@^0.5.1, mkdirp@~0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" @@ -7712,10 +7807,10 @@ ms@2.1.3, ms@^2.0.0, ms@^2.1.1, ms@^2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -mute-stream@~0.0.4: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== +mute-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e" + integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== mv@~2: version "2.1.1" @@ -7806,7 +7901,7 @@ node-fetch@^2.6.7, node-fetch@^2.6.9: dependencies: whatwg-url "^5.0.0" -node-gyp@^9.0.0, node-gyp@^9.1.0, node-gyp@^9.3.0: +node-gyp@^9.0.0, node-gyp@^9.3.0, node-gyp@^9.3.1: version "9.3.1" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.3.1.tgz#1e19f5f290afcc9c46973d68700cbd21a96192e4" integrity sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg== @@ -7855,6 +7950,13 @@ nopt@^6.0.0: dependencies: abbrev "^1.0.0" +nopt@^7.0.0, nopt@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-7.1.0.tgz#91f6a3366182176e72ecab93a09c19b63b485f28" + integrity sha512-ZFPLe9Iu0tnx7oWhFxAo4s7QTn8+NNDDxYNaKLjE7Dp0tbakQ3M1QhQzsnzXHQBTUO3K9BmwaxnyO8Ayn2I95Q== + dependencies: + abbrev "^2.0.0" + normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -7875,12 +7977,12 @@ normalize-package-data@^3.0.0, normalize-package-data@^3.0.2: semver "^7.3.4" validate-npm-package-license "^3.0.1" -normalize-package-data@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-4.0.1.tgz#b46b24e0616d06cadf9d5718b29b6d445a82a62c" - integrity sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg== +normalize-package-data@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-5.0.0.tgz#abcb8d7e724c40d88462b84982f7cbf6859b4588" + integrity sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q== dependencies: - hosted-git-info "^5.0.0" + hosted-git-info "^6.0.0" is-core-module "^2.8.1" semver "^7.3.5" validate-npm-package-license "^3.0.4" @@ -7890,99 +7992,89 @@ normalize-path@^3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -normalize-url@^6.0.0, normalize-url@^6.0.1: +normalize-url@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== -npm-audit-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/npm-audit-report/-/npm-audit-report-3.0.0.tgz#1bf3e531208b5f77347c8d00c3d9badf5be30cd6" - integrity sha512-tWQzfbwz1sc4244Bx2BVELw0EmZlCsCF0X93RDcmmwhonCsPMoEviYsi+32R+mdRvOWXolPce9zo64n2xgPESw== - dependencies: - chalk "^4.0.0" +normalize-url@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-8.0.0.tgz#593dbd284f743e8dcf6a5ddf8fadff149c82701a" + integrity sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw== -npm-bundled@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1" - integrity sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ== +npm-audit-report@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/npm-audit-report/-/npm-audit-report-4.0.0.tgz#dfffdb6464a7799d3d30e067ae1943982cf45f69" + integrity sha512-k2o5476sLrp94b6Gl819YzlS7LAdb8lgE6yQCysBEji5E3WoUdRve6tiVMLKAPPdLfItU4kOSUycWS5HFTrbug== dependencies: - npm-normalize-package-bin "^1.0.1" + chalk "^4.0.0" -npm-bundled@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-2.0.1.tgz#94113f7eb342cd7a67de1e789f896b04d2c600f4" - integrity sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw== +npm-bundled@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-3.0.0.tgz#7e8e2f8bb26b794265028491be60321a25a39db7" + integrity sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ== dependencies: - npm-normalize-package-bin "^2.0.0" + npm-normalize-package-bin "^3.0.0" -npm-install-checks@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-5.0.0.tgz#5ff27d209a4e3542b8ac6b0c1db6063506248234" - integrity sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA== +npm-install-checks@^6.0.0, npm-install-checks@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-6.1.1.tgz#b459b621634d06546664207fde16810815808db1" + integrity sha512-dH3GmQL4vsPtld59cOn8uY0iOqRmqKvV+DLGwNXV/Q7MDgD2QfOADWd/mFXcIE5LVhYYGjA3baz6W9JneqnuCw== dependencies: semver "^7.1.1" -npm-normalize-package-bin@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" - integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== - -npm-normalize-package-bin@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz#9447a1adaaf89d8ad0abe24c6c84ad614a675fff" - integrity sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ== +npm-normalize-package-bin@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.0.tgz#6097436adb4ef09e2628b59a7882576fe53ce485" + integrity sha512-g+DPQSkusnk7HYXr75NtzkIP4+N81i3RPsGFidF3DzHd9MT9wWngmqoeg/fnHFz5MNdtG4w03s+QnhewSLTT2Q== -npm-package-arg@^9.0.0, npm-package-arg@^9.0.1, npm-package-arg@^9.1.0: - version "9.1.2" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-9.1.2.tgz#fc8acecb00235f42270dda446f36926ddd9ac2bc" - integrity sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg== +npm-package-arg@^10.0.0, npm-package-arg@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-10.1.0.tgz#827d1260a683806685d17193073cc152d3c7e9b1" + integrity sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA== dependencies: - hosted-git-info "^5.0.0" - proc-log "^2.0.1" + hosted-git-info "^6.0.0" + proc-log "^3.0.0" semver "^7.3.5" - validate-npm-package-name "^4.0.0" + validate-npm-package-name "^5.0.0" -npm-packlist@^5.1.0: - version "5.1.3" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-5.1.3.tgz#69d253e6fd664b9058b85005905012e00e69274b" - integrity sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg== +npm-packlist@^7.0.0: + version "7.0.4" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-7.0.4.tgz#033bf74110eb74daf2910dc75144411999c5ff32" + integrity sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q== dependencies: - glob "^8.0.1" - ignore-walk "^5.0.1" - npm-bundled "^2.0.0" - npm-normalize-package-bin "^2.0.0" + ignore-walk "^6.0.0" -npm-pick-manifest@^7.0.0, npm-pick-manifest@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-7.0.2.tgz#1d372b4e7ea7c6712316c0e99388a73ed3496e84" - integrity sha512-gk37SyRmlIjvTfcYl6RzDbSmS9Y4TOBXfsPnoYqTHARNgWbyDiCSMLUpmALDj4jjcTZpURiEfsSHJj9k7EV4Rw== +npm-pick-manifest@^8.0.0, npm-pick-manifest@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz#c6acd97d1ad4c5dbb80eac7b386b03ffeb289e5f" + integrity sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA== dependencies: - npm-install-checks "^5.0.0" - npm-normalize-package-bin "^2.0.0" - npm-package-arg "^9.0.0" + npm-install-checks "^6.0.0" + npm-normalize-package-bin "^3.0.0" + npm-package-arg "^10.0.0" semver "^7.3.5" -npm-profile@^6.2.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/npm-profile/-/npm-profile-6.2.1.tgz#975c31ec75a6ae029ab5b8820ffdcbae3a1e3d5e" - integrity sha512-Tlu13duByHyDd4Xy0PgroxzxnBYWbGGL5aZifNp8cx2DxUrHSoETXtPKg38aRPsBWMRfDtvcvVfJNasj7oImQQ== +npm-profile@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/npm-profile/-/npm-profile-7.0.1.tgz#a37dae08b22e662ece2c6e08946f9fcd9fdef663" + integrity sha512-VReArOY/fCx5dWL66cbJ2OMogTQAVVQA//8jjmjkarboki3V7UJ0XbGFW+khRwiAJFQjuH0Bqr/yF7Y5RZdkMQ== dependencies: - npm-registry-fetch "^13.0.1" - proc-log "^2.0.0" + npm-registry-fetch "^14.0.0" + proc-log "^3.0.0" -npm-registry-fetch@^13.0.0, npm-registry-fetch@^13.0.1, npm-registry-fetch@^13.3.1: - version "13.3.1" - resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-13.3.1.tgz#bb078b5fa6c52774116ae501ba1af2a33166af7e" - integrity sha512-eukJPi++DKRTjSBRcDZSDDsGqRK3ehbxfFUcgaRd0Yp6kRwOwh2WVn0r+8rMB4nnuzvAk6rQVzl6K5CkYOmnvw== +npm-registry-fetch@^14.0.0, npm-registry-fetch@^14.0.3, npm-registry-fetch@^14.0.4: + version "14.0.4" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-14.0.4.tgz#43dfa55ce7c0d0c545d625c7a916bab5b95f7038" + integrity sha512-pMS2DRkwg+M44ct65zrN/Cr9IHK1+n6weuefAo6Er4lc+/8YBCU0Czq04H3ZiSigluh7pb2rMM5JpgcytctB+Q== dependencies: - make-fetch-happen "^10.0.6" - minipass "^3.1.6" - minipass-fetch "^2.0.3" + make-fetch-happen "^11.0.0" + minipass "^4.0.0" + minipass-fetch "^3.0.0" minipass-json-stream "^1.0.1" minizlib "^2.1.2" - npm-package-arg "^9.0.1" - proc-log "^2.0.0" + npm-package-arg "^10.0.0" + proc-log "^3.0.0" npm-run-all@4.1.5: version "4.1.5" @@ -8013,91 +8105,84 @@ npm-run-path@^5.1.0: dependencies: path-key "^4.0.0" -npm-user-validate@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-1.0.1.tgz#31428fc5475fe8416023f178c0ab47935ad8c561" - integrity sha512-uQwcd/tY+h1jnEaze6cdX/LrhWhoBxfSknxentoqmIuStxUExxjWd3ULMLFPiFUrZKbOVMowH6Jq2FRWfmhcEw== +npm-user-validate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-2.0.0.tgz#7b69bbbff6f7992a1d9a8968d52fd6b6db5431b6" + integrity sha512-sSWeqAYJ2dUPStJB+AEj0DyLRltr/f6YNcvCA7phkB8/RMLMnVsQ41GMwHo/ERZLYNDsyB2wPm7pZo1mqPOl7Q== -npm@^8.3.0: - version "8.19.4" - resolved "https://registry.yarnpkg.com/npm/-/npm-8.19.4.tgz#65ad6a2dfdd157a4ef4467fb86e8dcd35a43493f" - integrity sha512-3HANl8i9DKnUA89P4KEgVNN28EjSeDCmvEqbzOAuxCFDzdBZzjUl99zgnGpOUumvW5lvJo2HKcjrsc+tfyv1Hw== +npm@^9.5.0: + version "9.6.5" + resolved "https://registry.yarnpkg.com/npm/-/npm-9.6.5.tgz#272c06687abfcb80d37b47955cb33b9292949dc2" + integrity sha512-0SYs9lz1ND7V3+Lz6EbsnUdZ4OxjQOHbaIKdWd8OgsbZ2hCC2ZeiXMEaBEPEVBaILW+huFA0pJ1YME+52iZI5g== dependencies: "@isaacs/string-locale-compare" "^1.1.0" - "@npmcli/arborist" "^5.6.3" - "@npmcli/ci-detect" "^2.0.0" - "@npmcli/config" "^4.2.1" - "@npmcli/fs" "^2.1.0" - "@npmcli/map-workspaces" "^2.0.3" - "@npmcli/package-json" "^2.0.0" - "@npmcli/run-script" "^4.2.1" - abbrev "~1.1.1" + "@npmcli/arborist" "^6.2.8" + "@npmcli/config" "^6.1.6" + "@npmcli/map-workspaces" "^3.0.3" + "@npmcli/package-json" "^3.0.0" + "@npmcli/run-script" "^6.0.0" + abbrev "^2.0.0" archy "~1.0.0" - cacache "^16.1.3" + cacache "^17.0.5" chalk "^4.1.2" - chownr "^2.0.0" + ci-info "^3.8.0" cli-columns "^4.0.0" - cli-table3 "^0.6.2" + cli-table3 "^0.6.3" columnify "^1.6.0" - fastest-levenshtein "^1.0.12" - fs-minipass "^2.1.0" - glob "^8.0.1" - graceful-fs "^4.2.10" - hosted-git-info "^5.2.1" - ini "^3.0.1" - init-package-json "^3.0.2" + fastest-levenshtein "^1.0.16" + fs-minipass "^3.0.1" + glob "^9.3.2" + graceful-fs "^4.2.11" + hosted-git-info "^6.1.1" + ini "^4.1.0" + init-package-json "^5.0.0" is-cidr "^4.0.2" - json-parse-even-better-errors "^2.3.1" - libnpmaccess "^6.0.4" - libnpmdiff "^4.0.5" - libnpmexec "^4.0.14" - libnpmfund "^3.0.5" - libnpmhook "^8.0.4" - libnpmorg "^4.0.4" - libnpmpack "^4.1.3" - libnpmpublish "^6.0.5" - libnpmsearch "^5.0.4" - libnpmteam "^4.0.4" - libnpmversion "^3.0.7" - make-fetch-happen "^10.2.0" - minimatch "^5.1.0" - minipass "^3.1.6" + json-parse-even-better-errors "^3.0.0" + libnpmaccess "^7.0.2" + libnpmdiff "^5.0.16" + libnpmexec "^5.0.16" + libnpmfund "^4.0.16" + libnpmhook "^9.0.3" + libnpmorg "^5.0.3" + libnpmpack "^5.0.16" + libnpmpublish "^7.1.3" + libnpmsearch "^6.0.2" + libnpmteam "^5.0.3" + libnpmversion "^4.0.2" + make-fetch-happen "^11.1.0" + minimatch "^7.4.6" + minipass "^4.2.8" minipass-pipeline "^1.2.4" - mkdirp "^1.0.4" - mkdirp-infer-owner "^2.0.0" ms "^2.1.2" - node-gyp "^9.1.0" - nopt "^6.0.0" - npm-audit-report "^3.0.0" - npm-install-checks "^5.0.0" - npm-package-arg "^9.1.0" - npm-pick-manifest "^7.0.2" - npm-profile "^6.2.0" - npm-registry-fetch "^13.3.1" - npm-user-validate "^1.0.1" - npmlog "^6.0.2" - opener "^1.5.2" + node-gyp "^9.3.1" + nopt "^7.1.0" + npm-audit-report "^4.0.0" + npm-install-checks "^6.1.1" + npm-package-arg "^10.1.0" + npm-pick-manifest "^8.0.1" + npm-profile "^7.0.1" + npm-registry-fetch "^14.0.4" + npm-user-validate "^2.0.0" + npmlog "^7.0.1" p-map "^4.0.0" - pacote "^13.6.2" - parse-conflict-json "^2.0.2" - proc-log "^2.0.1" + pacote "^15.1.1" + parse-conflict-json "^3.0.1" + proc-log "^3.0.0" qrcode-terminal "^0.12.0" - read "~1.0.7" - read-package-json "^5.0.2" - read-package-json-fast "^2.0.3" - readdir-scoped-modules "^1.1.0" - rimraf "^3.0.2" - semver "^7.3.7" - ssri "^9.0.1" - tar "^6.1.11" + read "^2.1.0" + read-package-json "^6.0.1" + read-package-json-fast "^3.0.2" + semver "^7.5.0" + ssri "^10.0.3" + tar "^6.1.13" text-table "~0.2.0" tiny-relative-date "^1.3.0" - treeverse "^2.0.0" - validate-npm-package-name "^4.0.0" - which "^2.0.2" - write-file-atomic "^4.0.1" + treeverse "^3.0.0" + validate-npm-package-name "^5.0.0" + which "^3.0.0" + write-file-atomic "^5.0.0" -npmlog@^6.0.0, npmlog@^6.0.2: +npmlog@^6.0.0: version "6.0.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== @@ -8107,6 +8192,16 @@ npmlog@^6.0.0, npmlog@^6.0.2: gauge "^4.0.3" set-blocking "^2.0.0" +npmlog@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-7.0.1.tgz#7372151a01ccb095c47d8bf1d0771a4ff1f53ac8" + integrity sha512-uJ0YFk/mCQpLBt+bxN88AKd+gyqZvZDbtiNxk6Waqcj2aPRyfVx8ITawkyQynxUagInjdYT1+qj4NfA5KJJUxg== + dependencies: + are-we-there-yet "^4.0.0" + console-control-strings "^1.1.0" + gauge "^5.0.0" + set-blocking "^2.0.0" + nth-check@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" @@ -8180,15 +8275,10 @@ open@^8.4.0: is-docker "^2.1.1" is-wsl "^2.2.0" -opener@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" - integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== - -openpgp@5.7.0: - version "5.7.0" - resolved "https://registry.yarnpkg.com/openpgp/-/openpgp-5.7.0.tgz#fe0a346f26171ffb726636ae7ccb24a504281dbc" - integrity sha512-wchYJQfFbSaocUvUIYqNrWD+lRSmFSG1d3Ak2CHeXFocDSEsf7Uc1zUzHjSdlZPTvGeeXPQ+MJrwVtalL4QCBg== +openpgp@5.8.0: + version "5.8.0" + resolved "https://registry.yarnpkg.com/openpgp/-/openpgp-5.8.0.tgz#5e3033e8df59d1626ce65aa01b3cf5abee7ff26b" + integrity sha512-hq4+4s/vpjuwGgZSjplGp4j5FzSz+KwiFRiqMx+ZXr7VCK3CvTkktYilMTZMrf2vHsFH8aQ0596Lmn07HeKRmQ== dependencies: asn1.js "^5.0.0" @@ -8349,31 +8439,28 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -pacote@^13.0.3, pacote@^13.6.1, pacote@^13.6.2: - version "13.6.2" - resolved "https://registry.yarnpkg.com/pacote/-/pacote-13.6.2.tgz#0d444ba3618ab3e5cd330b451c22967bbd0ca48a" - integrity sha512-Gu8fU3GsvOPkak2CkbojR7vjs3k3P9cA6uazKTHdsdV0gpCEQq2opelnEv30KRQWgVzP5Vd/5umjcedma3MKtg== +pacote@^15.0.0, pacote@^15.0.8, pacote@^15.1.1: + version "15.1.2" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-15.1.2.tgz#78b4c1403231fab368c752943f1969c6d8f026bb" + integrity sha512-EAGJrMiIjBTBB6tWGrx9hFJTOo14B3HSAoa/W9SawFEBhUqjxN7qqaFlGVF9jfY/mIri8Mb2xafmkRgWxYXxIQ== dependencies: - "@npmcli/git" "^3.0.0" - "@npmcli/installed-package-contents" "^1.0.7" - "@npmcli/promise-spawn" "^3.0.0" - "@npmcli/run-script" "^4.1.0" - cacache "^16.0.0" - chownr "^2.0.0" - fs-minipass "^2.1.0" - infer-owner "^1.0.4" - minipass "^3.1.6" - mkdirp "^1.0.4" - npm-package-arg "^9.0.0" - npm-packlist "^5.1.0" - npm-pick-manifest "^7.0.0" - npm-registry-fetch "^13.0.1" - proc-log "^2.0.0" + "@npmcli/git" "^4.0.0" + "@npmcli/installed-package-contents" "^2.0.1" + "@npmcli/promise-spawn" "^6.0.1" + "@npmcli/run-script" "^6.0.0" + cacache "^17.0.0" + fs-minipass "^3.0.0" + minipass "^4.0.0" + npm-package-arg "^10.0.0" + npm-packlist "^7.0.0" + npm-pick-manifest "^8.0.0" + npm-registry-fetch "^14.0.0" + proc-log "^3.0.0" promise-retry "^2.0.1" - read-package-json "^5.0.0" - read-package-json-fast "^2.0.3" - rimraf "^3.0.2" - ssri "^9.0.0" + read-package-json "^6.0.0" + read-package-json-fast "^3.0.0" + sigstore "^1.3.0" + ssri "^10.0.0" tar "^6.1.11" parent-module@^1.0.0: @@ -8383,13 +8470,13 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-conflict-json@^2.0.1, parse-conflict-json@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/parse-conflict-json/-/parse-conflict-json-2.0.2.tgz#3d05bc8ffe07d39600dc6436c6aefe382033d323" - integrity sha512-jDbRGb00TAPFsKWCpZZOT93SxVP9nONOSgES3AevqRq/CHvavEBvKAjxX9p5Y5F0RZLxH9Ufd9+RwtCsa+lFDA== +parse-conflict-json@^3.0.0, parse-conflict-json@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/parse-conflict-json/-/parse-conflict-json-3.0.1.tgz#67dc55312781e62aa2ddb91452c7606d1969960c" + integrity sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw== dependencies: - json-parse-even-better-errors "^2.3.1" - just-diff "^5.0.1" + json-parse-even-better-errors "^3.0.0" + just-diff "^6.0.0" just-diff-apply "^5.2.0" parse-entities@^2.0.0: @@ -8422,6 +8509,17 @@ parse-json@^5.0.0, parse-json@^5.2.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" +parse-json@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-7.0.0.tgz#51c0713f233b804eb5adee3ef1e75d3243e0ff06" + integrity sha512-kP+TQYAzAiVnzOlWOe0diD6L35s9bJh0SCn95PIbZFKrOYuIRQsQkeWEYxzVDuHTt9V9YqvYCJ2Qo4z9wdfZPw== + dependencies: + "@babel/code-frame" "^7.21.4" + error-ex "^1.3.2" + json-parse-even-better-errors "^3.0.0" + lines-and-columns "^2.0.3" + type-fest "^3.8.0" + parse-link-header@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/parse-link-header/-/parse-link-header-2.0.0.tgz#949353e284f8aa01f2ac857a98f692b57733f6b7" @@ -8484,9 +8582,9 @@ path-parse@^1.0.7: integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-scurry@^1.6.1: - version "1.6.4" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.6.4.tgz#020a9449e5382a4acb684f9c7e1283bc5695de66" - integrity sha512-Qp/9IHkdNiXJ3/Kon++At2nVpnhRiPq/aSvQN+H3U1WZbvNRK0RIQK/o4HMqPoXjpuGJUEWpHSs6Mnjxqh3TQg== + version "1.7.0" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.7.0.tgz#99c741a2cfbce782294a39994d63748b5a24f6db" + integrity sha512-UkZUeDjczjYRE495+9thsgcVgsaCPkaw80slmfVFgllxY+IO8ubTsOpFVjDPROBqJdHfVPUFRHPBV/WciOVfWg== dependencies: lru-cache "^9.0.0" minipass "^5.0.0" @@ -8597,22 +8695,27 @@ pretty-format@^29.4.1, pretty-format@^29.5.0: ansi-styles "^5.0.0" react-is "^18.0.0" -proc-log@^2.0.0, proc-log@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-2.0.1.tgz#8f3f69a1f608de27878f91f5c688b225391cb685" - integrity sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw== +proc-log@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-3.0.0.tgz#fb05ef83ccd64fd7b20bbe9c8c1070fc08338dd8" + integrity sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A== process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + promise-all-reject-late@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz#f8ebf13483e5ca91ad809ccc2fcf25f26f8643c2" integrity sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw== -promise-call-limit@^1.0.1: +promise-call-limit@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/promise-call-limit/-/promise-call-limit-1.0.2.tgz#f64b8dd9ef7693c9c7613e7dfe8d6d24de3031ea" integrity sha512-1vTUnfI2hzui8AEIixbdAJlFY4LFDXqQswy/2eOlThAscXCY4It8FdVuI0fMJGAB2aWGbdQf/gv0skKYXmdrHA== @@ -8660,12 +8763,12 @@ prompts@^2.0.1: kleur "^3.0.3" sisteransi "^1.0.5" -promzard@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee" - integrity sha512-JZeYqd7UAcHCwI+sTOeUDYkvEU+1bQ7iE0UT1MgB/tERkAPkesW46MrpIySzODi+owTjZtiF8Ay5j9m60KmMBw== +promzard@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/promzard/-/promzard-1.0.0.tgz#3246f8e6c9895a77c0549cefb65828ac0f6c006b" + integrity sha512-KQVDEubSUHGSt5xLakaToDFrSoZhStB8dXLzk2xvwR67gJktrHFvpR63oZgHyK19WKbHFLXJqCPXdVR3aBP8Ig== dependencies: - read "1" + read "^2.0.0" propagate@^2.0.0: version "2.0.1" @@ -8756,28 +8859,28 @@ react-is@^18.0.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== -read-cmd-shim@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-3.0.1.tgz#868c235ec59d1de2db69e11aec885bc095aea087" - integrity sha512-kEmDUoYf/CDy8yZbLTmhB1X9kkjf9Q80PCNsDMb7ufrGd6zZSQA1+UyjrO+pZm5K/S4OXCWJeiIt1JA8kAsa6g== +read-cmd-shim@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz#640a08b473a49043e394ae0c7a34dd822c73b9bb" + integrity sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q== -read-package-json-fast@^2.0.2, read-package-json-fast@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz#323ca529630da82cb34b36cc0b996693c98c2b83" - integrity sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ== +read-package-json-fast@^3.0.0, read-package-json-fast@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz#394908a9725dc7a5f14e70c8e7556dff1d2b1049" + integrity sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw== dependencies: - json-parse-even-better-errors "^2.3.0" - npm-normalize-package-bin "^1.0.1" + json-parse-even-better-errors "^3.0.0" + npm-normalize-package-bin "^3.0.0" -read-package-json@^5.0.0, read-package-json@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-5.0.2.tgz#b8779ccfd169f523b67208a89cc912e3f663f3fa" - integrity sha512-BSzugrt4kQ/Z0krro8zhTwV1Kd79ue25IhNN/VtHFy1mG/6Tluyi+msc0UpwaoQzxSHa28mntAjIZY6kEgfR9Q== +read-package-json@^6.0.0, read-package-json@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-6.0.1.tgz#566cb06bc05dbddefba4607e9096d5a9efbcd836" + integrity sha512-AaHqXxfAVa+fNL07x8iAghfKOds/XXsu7zoouIVsbm7PEbQ3nMWXlvjcbrNLjElnUHWQtAo4QEa0RXuvD4XlpA== dependencies: - glob "^8.0.1" - json-parse-even-better-errors "^2.3.1" - normalize-package-data "^4.0.0" - npm-normalize-package-bin "^2.0.0" + glob "^9.3.0" + json-parse-even-better-errors "^3.0.0" + normalize-package-data "^5.0.0" + npm-normalize-package-bin "^3.0.0" read-pkg-up@^7.0.0, read-pkg-up@^7.0.1: version "7.0.1" @@ -8806,7 +8909,7 @@ read-pkg@^3.0.0: normalize-package-data "^2.3.2" path-type "^3.0.0" -read-pkg@^5.0.0, read-pkg@^5.2.0: +read-pkg@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== @@ -8826,6 +8929,16 @@ read-pkg@^7.1.0: parse-json "^5.2.0" type-fest "^2.0.0" +read-pkg@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-8.0.0.tgz#78b93774c15a3f151b56d5790d5127a5cb9fc507" + integrity sha512-Ajb9oSjxXBw0YyOiwtQ2dKbAA/vMnUPnY63XcCk+mXo0BwIdQEMgZLZiMWGttQHcUhUgbK0mH85ethMPKXxziw== + dependencies: + "@types/normalize-package-data" "^2.4.1" + normalize-package-data "^5.0.0" + parse-json "^7.0.0" + type-fest "^3.8.0" + read-yaml-file@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/read-yaml-file/-/read-yaml-file-2.1.0.tgz#c5866712db9ef5343b4d02c2413bada53c41c4a9" @@ -8834,12 +8947,12 @@ read-yaml-file@^2.1.0: js-yaml "^4.0.0" strip-bom "^4.0.0" -read@1, read@^1.0.7, read@~1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" - integrity sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ== +read@^2.0.0, read@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/read/-/read-2.1.0.tgz#69409372c54fe3381092bc363a00650b6ac37218" + integrity sha512-bvxi1QLJHcaywCAEsAk4DG3nVoqiY2Csps3qzWalhj5hFqRn1d/OixkFXtLO1PrgHUcAP0FNaSY/5GYNfENFFQ== dependencies: - mute-stream "~0.0.4" + mute-stream "~1.0.0" readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.6.0: version "3.6.2" @@ -8863,15 +8976,15 @@ readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@~2.3.6: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readdir-scoped-modules@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz#8d45407b4f870a0dcaebc0e28670d18e74514309" - integrity sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw== +readable-stream@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.3.0.tgz#0914d0c72db03b316c9733bb3461d64a3cc50cba" + integrity sha512-MuEnA0lbSi7JS8XM+WNJlWZkHAAdm7gETHdFK//Q/mChGyj2akEFtdLZh32jSdkWGbRwCW9pn6g3LWDdDeZnBQ== dependencies: - debuglog "^1.0.1" - dezalgo "^1.0.0" - graceful-fs "^4.1.2" - once "^1.3.0" + abort-controller "^3.0.0" + buffer "^6.0.3" + events "^3.3.0" + process "^0.11.10" rechoir@^0.6.2: version "0.6.2" @@ -8918,13 +9031,13 @@ regexp-to-ast@0.5.0: integrity sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw== regexp.prototype.flags@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" - integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== + version "1.5.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" + integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" + define-properties "^1.2.0" + functions-have-names "^1.2.3" registry-auth-token@^5.0.0: version "5.0.2" @@ -9150,20 +9263,20 @@ sax@^1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -semantic-release@20.1.3: - version "20.1.3" - resolved "https://registry.yarnpkg.com/semantic-release/-/semantic-release-20.1.3.tgz#fb2e58aa2c9d4d3bee93d1bcb4563c3ffbba6f66" - integrity sha512-sMIK9IaOdLP9hxzTxdTVHxINsazlDgv2gjZ1yeyRZXpIT3xAnuQUDEez8k+AC+lFUtGnfzA2Ct3V5lDyiMestw== +semantic-release@21.0.1: + version "21.0.1" + resolved "https://registry.yarnpkg.com/semantic-release/-/semantic-release-21.0.1.tgz#f2cb0eb1d0b1883efdac2883ec40342ac5c6ff30" + integrity sha512-UhGxTUXHJQCBFgEQRZszLOHDpMduDSHGq3Q+30Bu+g0GbXh/EW508+kuFHezP5m0mN8xINW8hooiR3dzSV5ZLA== dependencies: "@semantic-release/commit-analyzer" "^9.0.2" "@semantic-release/error" "^3.0.0" "@semantic-release/github" "^8.0.0" - "@semantic-release/npm" "^9.0.0" + "@semantic-release/npm" "^10.0.2" "@semantic-release/release-notes-generator" "^10.0.0" aggregate-error "^4.0.1" cosmiconfig "^8.0.0" debug "^4.0.0" - env-ci "^8.0.0" + env-ci "^9.0.0" execa "^7.0.0" figures "^5.0.0" find-versions "^5.1.0" @@ -9218,10 +9331,10 @@ semver-utils@1.1.4: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@7.3.8, semver@7.x, semver@^7.0.0, semver@^7.1.1, semver@^7.1.2, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== +semver@7.5.0, semver@7.x, semver@^7.0.0, semver@^7.1.1, semver@^7.1.2, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.0: + version "7.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.0.tgz#ed8c5dc8efb6c629c88b23d41dc9bf40c1d96cd0" + integrity sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA== dependencies: lru-cache "^6.0.0" @@ -9313,6 +9426,15 @@ signale@^1.2.1: figures "^2.0.0" pkg-conf "^2.1.0" +sigstore@^1.0.0, sigstore@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/sigstore/-/sigstore-1.3.2.tgz#2f70ec3e1192911484d9d148ecd9c98345cd172d" + integrity sha512-0KT1DjpVB11FK15ep7BIsZQV6j1jBm4SnXIInbBCRvql6II39IKONOMO+j036sGsArU/+2xqa1NDJwJkic0neA== + dependencies: + "@sigstore/protobuf-specs" "^0.1.0" + make-fetch-happen "^11.0.1" + tuf-js "^1.1.3" + simple-git@3.17.0: version "3.17.0" resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-3.17.0.tgz#1a961fa43f697b4e2391cf34c8a0554ef84fed8e" @@ -9492,14 +9614,14 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -ssri@^10.0.0: - version "10.0.2" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.2.tgz#3791753e5e119274a83e5af7cac2f615528db3d6" - integrity sha512-LWMXUSh7fEfCXNBq4UnRzC4Qc5Y1PPg5ogmb+6HX837i2cKzjB133aYmQ4lgO0shVTcTQHquKp3v5bn898q3Sw== +ssri@^10.0.0, ssri@^10.0.1, ssri@^10.0.3: + version "10.0.3" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.3.tgz#7f83da39058ca1d599d174e9eee4237659710bf4" + integrity sha512-lJtX/BFPI/VEtxZmLfeh7pzisIs6micwZ3eruD3+ds9aPsXKlYpwDS2Q7omD6WC42WO9+bnUSzlMmfv8uK8meg== dependencies: minipass "^4.0.0" -ssri@^9.0.0, ssri@^9.0.1: +ssri@^9.0.0: version "9.0.1" resolved "https://registry.yarnpkg.com/ssri/-/ssri-9.0.1.tgz#544d4c357a8d7b71a19700074b6883fcb4eae057" integrity sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q== @@ -9736,7 +9858,7 @@ tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== -tar@^6.0.5, tar@^6.1.0, tar@^6.1.11, tar@^6.1.2: +tar@^6.0.5, tar@^6.1.11, tar@^6.1.13, tar@^6.1.2: version "6.1.13" resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.13.tgz#46e22529000f612180601a6fe0680e7da508847b" integrity sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw== @@ -9753,16 +9875,15 @@ temp-dir@^2.0.0: resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e" integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== -tempy@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tempy/-/tempy-1.0.1.tgz#30fe901fd869cfb36ee2bd999805aa72fbb035de" - integrity sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w== +tempy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/tempy/-/tempy-3.0.0.tgz#a6c0a15f5534a820e92c3e1369f1c1e87ebd6b68" + integrity sha512-B2I9X7+o2wOaW4r/CWMkpOO9mdiTRCxXNgob6iGvPmfPWgH/KyUD6Uy5crtWBxIBe3YrNZKR2lSzv1JJKWD4vA== dependencies: - del "^6.0.0" - is-stream "^2.0.0" + is-stream "^3.0.0" temp-dir "^2.0.0" - type-fest "^0.16.0" - unique-string "^2.0.0" + type-fest "^2.12.2" + unique-string "^3.0.0" test-exclude@^6.0.0: version "6.0.0" @@ -9876,10 +9997,10 @@ treeify@^1.1.0: resolved "https://registry.yarnpkg.com/treeify/-/treeify-1.1.0.tgz#4e31c6a463accd0943879f30667c4fdaff411bb8" integrity sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A== -treeverse@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/treeverse/-/treeverse-2.0.0.tgz#036dcef04bc3fd79a9b79a68d4da03e882d8a9ca" - integrity sha512-N5gJCkLu1aXccpOTtqV6ddSEi6ZmGkh3hjmbu1IjcavJK4qyOVQmi0myQKM7z5jVGmD68SJoliaVrMmVObhj6A== +treeverse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/treeverse/-/treeverse-3.0.0.tgz#dd82de9eb602115c6ebd77a574aae67003cb48c8" + integrity sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ== trim-newlines@^3.0.0: version "3.0.1" @@ -9956,6 +10077,14 @@ tsutils@^3.21.0: dependencies: tslib "^1.8.1" +tuf-js@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/tuf-js/-/tuf-js-1.1.4.tgz#e85a936b16859c7fae23e5f040bc0f7b559b3192" + integrity sha512-Lw2JRM3HTYhEtQJM2Th3aNCPbnXirtWMl065BawwmM2pX6XStH/ZO9e8T2hh0zk/HUa+1i6j+Lv6eDitKTau6A== + dependencies: + "@tufjs/models" "1.0.3" + make-fetch-happen "^11.0.1" + tunnel@0.0.6, tunnel@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" @@ -9978,21 +10107,16 @@ type-detect@4.0.8, type-detect@^4.0.8: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== -type-fest@3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-3.7.2.tgz#08f83ee3229b63077e95c9035034d32905969457" - integrity sha512-f9BHrLjRJ4MYkfOsnC/53PNDzZJcVo14MqLp2+hXE39p5bgwqohxR5hDZztwxlbxmIVuvC2EFAKrAkokq23PLA== +type-fest@3.8.0, type-fest@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-3.8.0.tgz#ce80d1ca7c7d11c5540560999cbd410cb5b3a385" + integrity sha512-FVNSzGQz9Th+/9R6Lvv7WIAkstylfHN2/JYxkyhhmKFYh9At2DST8t6L6Lref9eYO8PXFTfG9Sg1Agg0K3vq3Q== type-fest@^0.13.1: version "0.13.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== -type-fest@^0.16.0: - version "0.16.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.16.0.tgz#3240b891a78b0deae910dbeb86553e552a148860" - integrity sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg== - type-fest@^0.18.0: version "0.18.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" @@ -10018,12 +10142,12 @@ type-fest@^0.8.0, type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -type-fest@^1.0.2: +type-fest@^1.0.1, type-fest@^1.0.2: version "1.4.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== -type-fest@^2.0.0, type-fest@^2.5.0: +type-fest@^2.0.0, type-fest@^2.12.2, type-fest@^2.5.0: version "2.19.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== @@ -10053,10 +10177,10 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typescript@5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.3.tgz#fe976f0c826a88d0a382007681cbb2da44afdedf" - integrity sha512-xv8mOEDnigb/tN9PSMTwSEqAnUvkoXMQlicOb0IUVDBSQCgBSaAAROUZYy2IcUy5qU6XajK5jjjO7TMWqBTKZA== +typescript@5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.4.tgz#b217fd20119bd61a94d4011274e0ab369058da3b" + integrity sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw== uc.micro@^1.0.1, uc.micro@^1.0.5: version "1.0.6" @@ -10123,12 +10247,12 @@ unique-slug@^4.0.0: dependencies: imurmurhash "^0.1.4" -unique-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" - integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== +unique-string@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-3.0.0.tgz#84a1c377aff5fd7a8bc6b55d8244b2bd90d75b9a" + integrity sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ== dependencies: - crypto-random-string "^2.0.0" + crypto-random-string "^4.0.0" unist-util-is@^4.0.0: version "4.1.0" @@ -10175,9 +10299,9 @@ upath@2.0.1: integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== update-browserslist-db@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" - integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + version "1.0.11" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== dependencies: escalade "^3.1.1" picocolors "^1.0.0" @@ -10237,20 +10361,13 @@ validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -validate-npm-package-name@5.0.0: +validate-npm-package-name@5.0.0, validate-npm-package-name@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz#f16afd48318e6f90a1ec101377fa0384cfc8c713" integrity sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ== dependencies: builtins "^5.0.0" -validate-npm-package-name@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz#fe8f1c50ac20afdb86f177da85b3600f0ac0d747" - integrity sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q== - dependencies: - builtins "^5.0.0" - vfile-message@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" @@ -10274,10 +10391,10 @@ vuln-vects@1.1.0: resolved "https://registry.yarnpkg.com/vuln-vects/-/vuln-vects-1.1.0.tgz#537d403615610446c1d687934584ea9dfb2a63ed" integrity sha512-LGDwn9nRz94YoeqOn2TZqQXzyonBc5FJppSgH34S/1U+3bgPONq/vvfiCbCQ4MeBll58xx+kDmhS73ac+EHBBw== -walk-up-path@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/walk-up-path/-/walk-up-path-1.0.0.tgz#d4745e893dd5fd0dbb58dd0a4c6a33d9c9fec53e" - integrity sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg== +walk-up-path@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/walk-up-path/-/walk-up-path-3.0.1.tgz#c8d78d5375b4966c717eb17ada73dbd41490e886" + integrity sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA== walker@^1.0.8: version "1.0.8" @@ -10343,6 +10460,13 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" +which@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/which/-/which-3.0.0.tgz#a9efd016db59728758a390d23f1687b6e8f59f8e" + integrity sha512-nla//68K9NU6yRiwDY/Q8aU6siKlSs64aEC7+IV56QoAuyQT2ovsJcgGYGyqMOmI/CGN1BOR6mM5EN0FBO+zyQ== + dependencies: + isexe "^2.0.0" + wide-align@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" @@ -10393,7 +10517,7 @@ write-file-atomic@^3.0.3: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -write-file-atomic@^4.0.0, write-file-atomic@^4.0.1, write-file-atomic@^4.0.2: +write-file-atomic@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==